[Olsr-dev] [PATCH v1 1/1] android: remove regex code and update API level
Hans of Guardian
(spam-protected)
Mon Oct 15 16:53:43 CEST 2012
NAK. android-7 is still useful to us. Older devices and Android releases support adhoc mode better than newer ones, unfortunately.
.hc
On Oct 15, 2012, at 5:25 AM, Ferry Huberts wrote:
> From: Ferry Huberts <(spam-protected)>
>
> Minimum API level now is 8 (Froyo)
>
> Signed-off-by: Ferry Huberts <(spam-protected)>
> ---
> Makefile | 6 +-
> android/README | 5 +-
> android/regex.h | 105 ----
> android/regex/COPYRIGHT | 54 --
> android/regex/NOTICE | 382 ------------
> android/regex/WHATSNEW | 95 ---
> android/regex/cclass.h | 68 ---
> android/regex/cname.h | 139 -----
> android/regex/engine.c | 1021 -------------------------------
> android/regex/regcomp.c | 1517 ----------------------------------------------
> android/regex/regerror.c | 130 ----
> android/regex/regex2.h | 157 -----
> android/regex/regexec.c | 160 -----
> android/regex/regfree.c | 71 ---
> android/regex/utils.h | 55 --
> make/Makefile.android | 25 +-
> 16 files changed, 4 insertions(+), 3986 deletions(-)
> delete mode 100644 android/regex.h
> delete mode 100644 android/regex/COPYRIGHT
> delete mode 100644 android/regex/NOTICE
> delete mode 100644 android/regex/WHATSNEW
> delete mode 100644 android/regex/cclass.h
> delete mode 100644 android/regex/cname.h
> delete mode 100644 android/regex/engine.c
> delete mode 100644 android/regex/regcomp.c
> delete mode 100644 android/regex/regerror.c
> delete mode 100644 android/regex/regex2.h
> delete mode 100644 android/regex/regexec.c
> delete mode 100644 android/regex/regfree.c
> delete mode 100644 android/regex/utils.h
>
> diff --git a/Makefile b/Makefile
> index a5cb10c..ecb8764 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -188,7 +188,6 @@ libs:
>
> libs_clean clean_libs:
> -for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) clean;rm -f lib/$$dir/*.so lib/$$dir/*.dll;done
> - -rm -f $(REGEX_OBJS)
>
> libs_install install_libs:
> @set -e;for dir in $(SUBDIRS);do $(MAKECMD) -C lib/$$dir LIBDIR=$(LIBDIR) install;done
> @@ -301,10 +300,7 @@ mdns_uninstall:
> # no targets for mini: it's an example plugin
> #
>
> -# nameserver uses regex, which was only recently added to Android. On
> -# Android, $(REGEX_OBJS) will have all of the files needed, on all
> -# other platforms, it'll be empty and therefore ignored.
> -nameservice: $(REGEX_OBJS)
> +nameservice:
> @$(MAKECMD) -C lib/nameservice clean
> @$(MAKECMD) -C lib/nameservice
>
> diff --git a/android/README b/android/README
> index 9f36257..10c26be 100644
> --- a/android/README
> +++ b/android/README
> @@ -1,8 +1,5 @@
> -
> This directory contains some Android specific code. (Mostly dealing
> -with providing missing filesfrom Android NDK.)
> -
> - * regex support was not added until NDK platform android-8 (v2.2)
> +with providing missing files from Android NDK.)
>
>
> Building olsrd for Android
> diff --git a/android/regex.h b/android/regex.h
> deleted file mode 100644
> index aec38e3..0000000
> --- a/android/regex.h
> +++ /dev/null
> @@ -1,105 +0,0 @@
> -/* $OpenBSD: regex.h,v 1.6 2003/06/02 19:34:12 millert Exp $ */
> -/* $NetBSD: regex.h,v 1.4.6.1 1996/06/10 18:57:07 explorer Exp $ */
> -
> -/*-
> - * Copyright (c) 1992 Henry Spencer.
> - * Copyright (c) 1992, 1993
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer of the University of Toronto.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regex.h 8.1 (Berkeley) 6/2/93
> - */
> -
> -#ifndef _REGEX_H_
> -#define _REGEX_H_
> -
> -#include <sys/cdefs.h>
> -#include <sys/types.h>
> -
> -/* types */
> -typedef off_t regoff_t;
> -
> -typedef struct {
> - int re_magic;
> - size_t re_nsub; /* number of parenthesized subexpressions */
> - const char *re_endp; /* end pointer for REG_PEND */
> - struct re_guts *re_g; /* none of your business :-) */
> -} regex_t;
> -
> -typedef struct {
> - regoff_t rm_so; /* start of match */
> - regoff_t rm_eo; /* end of match */
> -} regmatch_t;
> -
> -/* regcomp() flags */
> -#define REG_BASIC 0000
> -#define REG_EXTENDED 0001
> -#define REG_ICASE 0002
> -#define REG_NOSUB 0004
> -#define REG_NEWLINE 0010
> -#define REG_NOSPEC 0020
> -#define REG_PEND 0040
> -#define REG_DUMP 0200
> -
> -/* regerror() flags */
> -#define REG_NOMATCH 1
> -#define REG_BADPAT 2
> -#define REG_ECOLLATE 3
> -#define REG_ECTYPE 4
> -#define REG_EESCAPE 5
> -#define REG_ESUBREG 6
> -#define REG_EBRACK 7
> -#define REG_EPAREN 8
> -#define REG_EBRACE 9
> -#define REG_BADBR 10
> -#define REG_ERANGE 11
> -#define REG_ESPACE 12
> -#define REG_BADRPT 13
> -#define REG_EMPTY 14
> -#define REG_ASSERT 15
> -#define REG_INVARG 16
> -#define REG_ATOI 255 /* convert name to number (!) */
> -#define REG_ITOA 0400 /* convert number to name (!) */
> -
> -/* regexec() flags */
> -#define REG_NOTBOL 00001
> -#define REG_NOTEOL 00002
> -#define REG_STARTEND 00004
> -#define REG_TRACE 00400 /* tracing of execution */
> -#define REG_LARGE 01000 /* force large representation */
> -#define REG_BACKR 02000 /* force use of backref code */
> -
> -__BEGIN_DECLS
> -int regcomp(regex_t *, const char *, int);
> -size_t regerror(int, const regex_t *, char *, size_t);
> -int regexec(const regex_t *, const char *, size_t, regmatch_t [], int);
> -void regfree(regex_t *);
> -__END_DECLS
> -
> -#endif /* !_REGEX_H_ */
> diff --git a/android/regex/COPYRIGHT b/android/regex/COPYRIGHT
> deleted file mode 100644
> index a6392fd..0000000
> --- a/android/regex/COPYRIGHT
> +++ /dev/null
> @@ -1,54 +0,0 @@
> -$OpenBSD: COPYRIGHT,v 1.3 2003/06/02 20:18:36 millert Exp $
> -
> -Copyright 1992, 1993, 1994 Henry Spencer. All rights reserved.
> -This software is not subject to any license of the American Telephone
> -and Telegraph Company or of the Regents of the University of California.
> -
> -Permission is granted to anyone to use this software for any purpose on
> -any computer system, and to alter it and redistribute it, subject
> -to the following restrictions:
> -
> -1. The author is not responsible for the consequences of use of this
> - software, no matter how awful, even if they arise from flaws in it.
> -
> -2. The origin of this software must not be misrepresented, either by
> - explicit claim or by omission. Since few users ever read sources,
> - credits must appear in the documentation.
> -
> -3. Altered versions must be plainly marked as such, and must not be
> - misrepresented as being the original software. Since few users
> - ever read sources, credits must appear in the documentation.
> -
> -4. This notice may not be removed or altered.
> -
> -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
> -/*-
> - * Copyright (c) 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)COPYRIGHT 8.1 (Berkeley) 3/16/94
> - */
> diff --git a/android/regex/NOTICE b/android/regex/NOTICE
> deleted file mode 100644
> index d9e6818..0000000
> --- a/android/regex/NOTICE
> +++ /dev/null
> @@ -1,382 +0,0 @@
> -
> -Copyright (c) 2005-2010, The Android Open Source Project
> -All rights reserved.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> - * Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> - * Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in
> - the documentation and/or other materials provided with the
> - distribution.
> - * Neither the name of The Android Open Source Project nor the names
> - of its contributors may be used to endorse or promote products
> - derived from this software without specific prior written
> - permission.
> -
> -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
> -OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
> -AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
> -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
> -OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -
> -Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
> -Copyright (c) 1995,1996,1999 by Internet Software Consortium.
> -
> -Permission to use, copy, modify, and distribute this software for any
> -purpose with or without fee is hereby granted, provided that the above
> -copyright notice and this permission notice appear in all copies.
> -
> -THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
> -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
> -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
> -OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> -
> -
> -Portions Copyright (c) 1995 by International Business Machines, Inc.
> -
> -International Business Machines, Inc. (hereinafter called IBM) grants
> -permission under its copyrights to use, copy, modify, and distribute this
> -Software with or without fee, provided that the above copyright notice and
> -all paragraphs of this notice appear in all copies, and that the name of IBM
> -not be used in connection with the marketing of any product incorporating
> -the Software or modifications thereof, without specific, written prior
> -permission.
> -
> -To the extent it has a right to do so, IBM grants an immunity from suit
> -under its patents, if any, for the use, sale or manufacture of products to
> -the extent that such products are used for performing Domain Name System
> -dynamic updates in TCP/IP networks by means of the Software. No immunity is
> -granted for any product per se or for any other function of any product.
> -
> -THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
> -INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
> -PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
> -DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
> -OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
> -IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
> -
> -Copyright (c) 1997, 1998, 1999, 2004 The NetBSD Foundation, Inc.
> -All rights reserved.
> -
> -This code is derived from software contributed to The NetBSD Foundation
> -by Luke Mewburn; and by Jason R. Thorpe.
> -This code is derived from software contributed to The NetBSD Foundation
> -by Christos Zoulas.
> -
> -Copyright (c) 1993 Christopher G. Demetriou
> -Copyright (c) 1983, 1985, 1993 The Regents of the University of California. All rights reserved.
> -Copyright (c) 2000 Ben Harris.
> -Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
> -All rights reserved.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -3. Neither the name of the project nor the names of its contributors
> - may be used to endorse or promote products derived from this software
> - without specific prior written permission.
> -
> -THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
> -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
> -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -Copyright (c) 2003 Networks Associates Technology, Inc.
> -All rights reserved.
> -
> -Portions of this software were developed for the FreeBSD Project by
> -Jacques A. Vidrine, Safeport Network Services, and Network
> -Associates Laboratories, the Security Research Division of Network
> -Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
> -("CBOSS"), as part of the DARPA CHATS research program.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -
> -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -Portions Copyright (c) 1993 by Digital Equipment Corporation.
> -
> -Permission to use, copy, modify, and distribute this software for any
> -purpose with or without fee is hereby granted, provided that the above
> -copyright notice and this permission notice appear in all copies, and that
> -the name of Digital Equipment Corporation not be used in advertising or
> -publicity pertaining to distribution of the document or software without
> -specific, written prior permission.
> -
> -THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
> -WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
> -OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
> -CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
> -DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
> -PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
> -ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
> -SOFTWARE.
> -
> -
> -Copyright (c) 1997 Mark Brinicombe
> -All rights reserved.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -3. All advertising materials mentioning features or use of this software
> - must display the following acknowledgement:
> - This product includes software developed by Mark Brinicombe
> -4. Neither the name of the University nor the names of its contributors
> - may be used to endorse or promote products derived from this software
> - without specific prior written permission.
> -
> -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -
> -Copyright (c) 1993 Martin Birgmeier
> -All rights reserved.
> -
> -You may redistribute unmodified or modified versions of this source
> -code provided that the above copyright notice and this and the
> -following conditions are retained.
> -
> -This software is provided ``as is'', and comes with no warranties
> -of any kind. I shall in no event be liable for anything that happens
> -to anyone/anything when using this software.
> -
> -
> -Arc4 random number generator for OpenBSD.
> -Copyright 1996 David Mazieres <(spam-protected)>.
> -
> -Modification and redistribution in source and binary forms is
> -permitted provided that due credit is given to the author and the
> -OpenBSD project by leaving this copyright notice intact.
> -
> -
> -Copyright (c) 1999 Kungliga Tekniska Högskolan
> -(Royal Institute of Technology, Stockholm, Sweden).
> -All rights reserved.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -
> -3. Neither the name of KTH nor the names of its contributors may be
> - used to endorse or promote products derived from this software without
> - specific prior written permission.
> -
> -THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
> -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
> -PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
> -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
> -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
> -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
> -BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
> -WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
> -OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
> -ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
> -
> -
> -====================================================
> -Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
> -
> -Developed at SunPro, a Sun Microsystems, Inc. business.
> -Permission to use, copy, modify, and distribute this
> -software is freely granted, provided that this notice
> -is preserved.
> -====================================================
> -
> -
> -Copyright (c) 1997, 2005 Todd C. Miller <(spam-protected)>
> -
> -Permission to use, copy, modify, and distribute this software for any
> -purpose with or without fee is hereby granted, provided that the above
> -copyright notice and this permission notice appear in all copies.
> -
> -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> -
> -
> -Copyright (c) 1989, 1993
> - The Regents of the University of California. All rights reserved.
> -(c) UNIX System Laboratories, Inc.
> -All or some portions of this file are derived from material licensed
> -to the University of California by American Telephone and Telegraph
> -Co. or Unix System Laboratories, Inc. and are reproduced herein with
> -the permission of UNIX System Laboratories, Inc.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -3. Neither the name of the University nor the names of its contributors
> - may be used to endorse or promote products derived from this software
> - without specific prior written permission.
> -
> -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -
> -Copyright (c) 1995, 1996 Carnegie-Mellon University.
> -All rights reserved.
> -
> -Author: Chris G. Demetriou
> -
> -Permission to use, copy, modify and distribute this software and
> -its documentation is hereby granted, provided that both the copyright
> -notice and this permission notice appear in all copies of the
> -software, derivative works or modified versions, and any portions
> -thereof, and that both notices appear in supporting documentation.
> -
> -CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
> -CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
> -FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
> -
> -Carnegie Mellon requests users of this software to return to
> -
> - Software Distribution Coordinator or (spam-protected)
> - School of Computer Science
> - Carnegie Mellon University
> - Pittsburgh PA 15213-3890
> -
> -any improvements or extensions that they make and grant Carnegie the
> -rights to redistribute these changes.
> -
> -
> -Copyright (c) 1995, 1996 Carnegie-Mellon University.
> -All rights reserved.
> -
> -Author: Chris G. Demetriou
> -
> -Permission to use, copy, modify and distribute this software and
> -its documentation is hereby granted, provided that both the copyright
> -notice and this permission notice appear in all copies of the
> -software, derivative works or modified versions, and any portions
> -thereof, and that both notices appear in supporting documentation.
> -
> -CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
> -CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
> -FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
> -
> -Carnegie Mellon requests users of this software to return to
> -
> - Software Distribution Coordinator or (spam-protected)
> - School of Computer Science
> - Carnegie Mellon University
> - Pittsburgh PA 15213-3890
> -
> -any improvements or extensions that they make and grant Carnegie the
> -rights to redistribute these changes.
> -
> -
> -Copyright (c) 2003 Networks Associates Technology, Inc.
> -All rights reserved.
> -
> -Portions of this software were developed for the FreeBSD Project by
> -Jacques A. Vidrine, Safeport Network Services, and Network
> -Associates Laboratories, the Security Research Division of Network
> -Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035
> -("CBOSS"), as part of the DARPA CHATS research program.
> -
> -Redistribution and use in source and binary forms, with or without
> -modification, are permitted provided that the following conditions
> -are met:
> -1. Redistributions of source code must retain the above copyright
> - notice, this list of conditions and the following disclaimer.
> -2. Redistributions in binary form must reproduce the above copyright
> - notice, this list of conditions and the following disclaimer in the
> - documentation and/or other materials provided with the distribution.
> -
> -THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
> -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> -ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
> -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> -OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> -HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> -OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> -SUCH DAMAGE.
> -
> -
> diff --git a/android/regex/WHATSNEW b/android/regex/WHATSNEW
> deleted file mode 100644
> index 95a80ed..0000000
> --- a/android/regex/WHATSNEW
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -# $OpenBSD: WHATSNEW,v 1.3 1997/04/28 20:44:56 millert Exp $
> -# @(#)WHATSNEW 8.3 (Berkeley) 3/18/94
> -
> -New in alpha3.4: The complex bug alluded to below has been fixed (in a
> -slightly kludgey temporary way that may hurt efficiency a bit; this is
> -another "get it out the door for 4.4" release). The tests at the end of
> -the tests file have accordingly been uncommented. The primary sign of
> -the bug was that something like a?b matching ab matched b rather than ab.
> -(The bug was essentially specific to this exact situation, else it would
> -have shown up earlier.)
> -
> -New in alpha3.3: The definition of word boundaries has been altered
> -slightly, to more closely match the usual programming notion that "_"
> -is an alphabetic. Stuff used for pre-ANSI systems is now in a subdir,
> -and the makefile no longer alludes to it in mysterious ways. The
> -makefile has generally been cleaned up some. Fixes have been made
> -(again!) so that the regression test will run without -DREDEBUG, at
> -the cost of weaker checking. A workaround for a bug in some folks'
> -<assert.h> has been added. And some more things have been added to
> -tests, including a couple right at the end which are commented out
> -because the code currently flunks them (complex bug; fix coming).
> -Plus the usual minor cleanup.
> -
> -New in alpha3.2: Assorted bits of cleanup and portability improvement
> -(the development base is now a BSDI system using GCC instead of an ancient
> -Sun system, and the newer compiler exposed some glitches). Fix for a
> -serious bug that affected REs using many [] (including REG_ICASE REs
> -because of the way they are implemented), *sometimes*, depending on
> -memory-allocation patterns. The header-file prototypes no longer name
> -the parameters, avoiding possible name conflicts. The possibility that
> -some clot has defined CHAR_MIN as (say) `-128' instead of `(-128)' is
> -now handled gracefully. "uchar" is no longer used as an internal type
> -name (too many people have the same idea). Still the same old lousy
> -performance, alas.
> -
> -New in alpha3.1: Basically nothing, this release is just a bookkeeping
> -convenience. Stay tuned.
> -
> -New in alpha3.0: Performance is no better, alas, but some fixes have been
> -made and some functionality has been added. (This is basically the "get
> -it out the door in time for 4.4" release.) One bug fix: regfree() didn't
> -free the main internal structure (how embarrassing). It is now possible
> -to put NULs in either the RE or the target string, using (resp.) a new
> -REG_PEND flag and the old REG_STARTEND flag. The REG_NOSPEC flag to
> -regcomp() makes all characters ordinary, so you can match a literal
> -string easily (this will become more useful when performance improves!).
> -There are now primitives to match beginnings and ends of words, although
> -the syntax is disgusting and so is the implementation. The REG_ATOI
> -debugging interface has changed a bit. And there has been considerable
> -internal cleanup of various kinds.
> -
> -New in alpha2.3: Split change list out of README, and moved flags notes
> -into Makefile. Macro-ized the name of regex(7) in regex(3), since it has
> -to change for 4.4BSD. Cleanup work in engine.c, and some new regression
> -tests to catch tricky cases thereof.
> -
> -New in alpha2.2: Out-of-date manpages updated. Regerror() acquires two
> -small extensions -- REG_ITOA and REG_ATOI -- which avoid debugging kludges
> -in my own test program and might be useful to others for similar purposes.
> -The regression test will now compile (and run) without REDEBUG. The
> -BRE \$ bug is fixed. Most uses of "uchar" are gone; it's all chars now.
> -Char/uchar parameters are now written int/unsigned, to avoid possible
> -portability problems with unpromoted parameters. Some unsigned casts have
> -been introduced to minimize portability problems with shifting into sign
> -bits.
> -
> -New in alpha2.1: Lots of little stuff, cleanup and fixes. The one big
> -thing is that regex.h is now generated, using mkh, rather than being
> -supplied in the distribution; due to circularities in dependencies,
> -you have to build regex.h explicitly by "make h". The two known bugs
> -have been fixed (and the regression test now checks for them), as has a
> -problem with assertions not being suppressed in the absence of REDEBUG.
> -No performance work yet.
> -
> -New in alpha2: Backslash-anything is an ordinary character, not an
> -error (except, of course, for the handful of backslashed metacharacters
> -in BREs), which should reduce script breakage. The regression test
> -checks *where* null strings are supposed to match, and has generally
> -been tightened up somewhat. Small bug fixes in parameter passing (not
> -harmful, but technically errors) and some other areas. Debugging
> -invoked by defining REDEBUG rather than not defining NDEBUG.
> -
> -New in alpha+3: full prototyping for internal routines, using a little
> -helper program, mkh, which extracts prototypes given in stylized comments.
> -More minor cleanup. Buglet fix: it's CHAR_BIT, not CHAR_BITS. Simple
> -pre-screening of input when a literal string is known to be part of the
> -RE; this does wonders for performance.
> -
> -New in alpha+2: minor bits of cleanup. Notably, the number "32" for the
> -word width isn't hardwired into regexec.c any more, the public header
> -file prototypes the functions if __STDC__ is defined, and some small typos
> -in the manpages have been fixed.
> -
> -New in alpha+1: improvements to the manual pages, and an important
> -extension, the REG_STARTEND option to regexec().
> diff --git a/android/regex/cclass.h b/android/regex/cclass.h
> deleted file mode 100644
> index d105491..0000000
> --- a/android/regex/cclass.h
> +++ /dev/null
> @@ -1,68 +0,0 @@
> -/* $OpenBSD: cclass.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */
> -
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)cclass.h 8.3 (Berkeley) 3/20/94
> - */
> -
> -/* character-class table */
> -static const struct cclass {
> - char *name;
> - char *chars;
> - char *multis;
> -} cclasses[] = {
> - { "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
> -0123456789", ""} ,
> - { "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
> - ""} ,
> - { "blank", " \t", ""} ,
> - { "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\
> -\25\26\27\30\31\32\33\34\35\36\37\177", ""} ,
> - { "digit", "0123456789", ""} ,
> - { "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
> -0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
> - ""} ,
> - { "lower", "abcdefghijklmnopqrstuvwxyz",
> - ""} ,
> - { "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
> -0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ",
> - ""} ,
> - { "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~",
> - ""} ,
> - { "space", "\t\n\v\f\r ", ""} ,
> - { "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
> - ""} ,
> - { "xdigit", "0123456789ABCDEFabcdef",
> - ""} ,
> - { NULL, 0, "" }
> -};
> diff --git a/android/regex/cname.h b/android/regex/cname.h
> deleted file mode 100644
> index b674b68..0000000
> --- a/android/regex/cname.h
> +++ /dev/null
> @@ -1,139 +0,0 @@
> -/* $OpenBSD: cname.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */
> -
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)cname.h 8.3 (Berkeley) 3/20/94
> - */
> -
> -/* character-name table */
> -static const struct cname {
> - char *name;
> - char code;
> -} cnames[] = {
> - { "NUL", '\0' },
> - { "SOH", '\001' },
> - { "STX", '\002' },
> - { "ETX", '\003' },
> - { "EOT", '\004' },
> - { "ENQ", '\005' },
> - { "ACK", '\006' },
> - { "BEL", '\007' },
> - { "alert", '\007' },
> - { "BS", '\010' },
> - { "backspace", '\b' },
> - { "HT", '\011' },
> - { "tab", '\t' },
> - { "LF", '\012' },
> - { "newline", '\n' },
> - { "VT", '\013' },
> - { "vertical-tab", '\v' },
> - { "FF", '\014' },
> - { "form-feed", '\f' },
> - { "CR", '\015' },
> - { "carriage-return", '\r' },
> - { "SO", '\016' },
> - { "SI", '\017' },
> - { "DLE", '\020' },
> - { "DC1", '\021' },
> - { "DC2", '\022' },
> - { "DC3", '\023' },
> - { "DC4", '\024' },
> - { "NAK", '\025' },
> - { "SYN", '\026' },
> - { "ETB", '\027' },
> - { "CAN", '\030' },
> - { "EM", '\031' },
> - { "SUB", '\032' },
> - { "ESC", '\033' },
> - { "IS4", '\034' },
> - { "FS", '\034' },
> - { "IS3", '\035' },
> - { "GS", '\035' },
> - { "IS2", '\036' },
> - { "RS", '\036' },
> - { "IS1", '\037' },
> - { "US", '\037' },
> - { "space", ' ' },
> - { "exclamation-mark", '!' },
> - { "quotation-mark", '"' },
> - { "number-sign", '#' },
> - { "dollar-sign", '$' },
> - { "percent-sign", '%' },
> - { "ampersand", '&' },
> - { "apostrophe", '\'' },
> - { "left-parenthesis", '(' },
> - { "right-parenthesis", ')' },
> - { "asterisk", '*' },
> - { "plus-sign", '+' },
> - { "comma", ',' },
> - { "hyphen", '-' },
> - { "hyphen-minus", '-' },
> - { "period", '.' },
> - { "full-stop", '.' },
> - { "slash", '/' },
> - { "solidus", '/' },
> - { "zero", '0' },
> - { "one", '1' },
> - { "two", '2' },
> - { "three", '3' },
> - { "four", '4' },
> - { "five", '5' },
> - { "six", '6' },
> - { "seven", '7' },
> - { "eight", '8' },
> - { "nine", '9' },
> - { "colon", ':' },
> - { "semicolon", ';' },
> - { "less-than-sign", '<' },
> - { "equals-sign", '=' },
> - { "greater-than-sign", '>' },
> - { "question-mark", '?' },
> - { "commercial-at", '@' },
> - { "left-square-bracket", '[' },
> - { "backslash", '\\' },
> - { "reverse-solidus", '\\' },
> - { "right-square-bracket", ']' },
> - { "circumflex", '^' },
> - { "circumflex-accent", '^' },
> - { "underscore", '_' },
> - { "low-line", '_' },
> - { "grave-accent", '`' },
> - { "left-brace", '{' },
> - { "left-curly-bracket", '{' },
> - { "vertical-line", '|' },
> - { "right-brace", '}' },
> - { "right-curly-bracket", '}' },
> - { "tilde", '~' },
> - { "DEL", '\177' },
> - { NULL, 0 }
> -};
> diff --git a/android/regex/engine.c b/android/regex/engine.c
> deleted file mode 100644
> index eae6ff2..0000000
> --- a/android/regex/engine.c
> +++ /dev/null
> @@ -1,1021 +0,0 @@
> -/* $OpenBSD: engine.c,v 1.15 2005/08/05 13:03:00 espie Exp $ */
> -
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)engine.c 8.5 (Berkeley) 3/20/94
> - */
> -
> -/*
> - * The matching engine and friends. This file is #included by regexec.c
> - * after suitable #defines of a variety of macros used herein, so that
> - * different state representations can be used without duplicating masses
> - * of code.
> - */
> -
> -#ifdef SNAMES
> -#define matcher smatcher
> -#define fast sfast
> -#define slow sslow
> -#define dissect sdissect
> -#define backref sbackref
> -#define step sstep
> -#define print sprint
> -#define at sat
> -#define match smat
> -#define nope snope
> -#endif
> -#ifdef LNAMES
> -#define matcher lmatcher
> -#define fast lfast
> -#define slow lslow
> -#define dissect ldissect
> -#define backref lbackref
> -#define step lstep
> -#define print lprint
> -#define at lat
> -#define match lmat
> -#define nope lnope
> -#endif
> -
> -/* another structure passed up and down to avoid zillions of parameters */
> -struct match {
> - struct re_guts *g;
> - int eflags;
> - regmatch_t *pmatch; /* [nsub+1] (0 element unused) */
> - char *offp; /* offsets work from here */
> - char *beginp; /* start of string -- virtual NUL precedes */
> - char *endp; /* end of string -- virtual NUL here */
> - char *coldp; /* can be no match starting before here */
> - char **lastpos; /* [nplus+1] */
> - STATEVARS;
> - states st; /* current states */
> - states fresh; /* states for a fresh start */
> - states tmp; /* temporary */
> - states empty; /* empty set of states */
> -};
> -
> -static int matcher(struct re_guts *, char *, size_t, regmatch_t[], int);
> -static char *dissect(struct match *, char *, char *, sopno, sopno);
> -static char *backref(struct match *, char *, char *, sopno, sopno, sopno, int);
> -static char *fast(struct match *, char *, char *, sopno, sopno);
> -static char *slow(struct match *, char *, char *, sopno, sopno);
> -static states step(struct re_guts *, sopno, sopno, states, int, states);
> -#define MAX_RECURSION 100
> -#define BOL (OUT+1)
> -#define EOL (BOL+1)
> -#define BOLEOL (BOL+2)
> -#define NOTHING (BOL+3)
> -#define BOW (BOL+4)
> -#define EOW (BOL+5)
> -#define CODEMAX (BOL+5) /* highest code used */
> -#define NONCHAR(c) ((c) > CHAR_MAX)
> -#define NNONCHAR (CODEMAX-CHAR_MAX)
> -#ifdef REDEBUG
> -static void print(struct match *, char *, states, int, FILE *);
> -#endif
> -#ifdef REDEBUG
> -static void at(struct match *, char *, char *, char *, sopno, sopno);
> -#endif
> -#ifdef REDEBUG
> -static char *pchar(int);
> -#endif
> -
> -#ifdef REDEBUG
> -#define SP(t, s, c) print(m, t, s, c, stdout)
> -#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2)
> -#define NOTE(str) { if (m->eflags®_TRACE) (void)printf("=%s\n", (str)); }
> -static int nope = 0;
> -#else
> -#define SP(t, s, c) /* nothing */
> -#define AT(t, p1, p2, s1, s2) /* nothing */
> -#define NOTE(s) /* nothing */
> -#endif
> -
> -/*
> - - matcher - the actual matching engine
> - */
> -static int /* 0 success, REG_NOMATCH failure */
> -matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
> - int eflags)
> -{
> - char *endp;
> - int i;
> - struct match mv;
> - struct match *m = &mv;
> - char *dp;
> - const sopno gf = g->firststate+1; /* +1 for OEND */
> - const sopno gl = g->laststate;
> - char *start;
> - char *stop;
> -
> - /* simplify the situation where possible */
> - if (g->cflags®_NOSUB)
> - nmatch = 0;
> - if (eflags®_STARTEND) {
> - start = string + pmatch[0].rm_so;
> - stop = string + pmatch[0].rm_eo;
> - } else {
> - start = string;
> - stop = start + strlen(start);
> - }
> - if (stop < start)
> - return(REG_INVARG);
> -
> - /* prescreening; this does wonders for this rather slow code */
> - if (g->must != NULL) {
> - for (dp = start; dp < stop; dp++)
> - if (*dp == g->must[0] && stop - dp >= g->mlen &&
> - memcmp(dp, g->must, (size_t)g->mlen) == 0)
> - break;
> - if (dp == stop) /* we didn't find g->must */
> - return(REG_NOMATCH);
> - }
> -
> - /* match struct setup */
> - m->g = g;
> - m->eflags = eflags;
> - m->pmatch = NULL;
> - m->lastpos = NULL;
> - m->offp = string;
> - m->beginp = start;
> - m->endp = stop;
> - STATESETUP(m, 4);
> - SETUP(m->st);
> - SETUP(m->fresh);
> - SETUP(m->tmp);
> - SETUP(m->empty);
> - CLEAR(m->empty);
> -
> - /* this loop does only one repetition except for backrefs */
> - for (;;) {
> - endp = fast(m, start, stop, gf, gl);
> - if (endp == NULL) { /* a miss */
> - free(m->pmatch);
> - free(m->lastpos);
> - STATETEARDOWN(m);
> - return(REG_NOMATCH);
> - }
> - if (nmatch == 0 && !g->backrefs)
> - break; /* no further info needed */
> -
> - /* where? */
> - assert(m->coldp != NULL);
> - for (;;) {
> - NOTE("finding start");
> - endp = slow(m, m->coldp, stop, gf, gl);
> - if (endp != NULL)
> - break;
> - assert(m->coldp < m->endp);
> - m->coldp++;
> - }
> - if (nmatch == 1 && !g->backrefs)
> - break; /* no further info needed */
> -
> - /* oh my, he wants the subexpressions... */
> - if (m->pmatch == NULL)
> - m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
> - sizeof(regmatch_t));
> - if (m->pmatch == NULL) {
> - STATETEARDOWN(m);
> - return(REG_ESPACE);
> - }
> - for (i = 1; i <= (int)m->g->nsub; i++)
> - m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
> - if (!g->backrefs && !(m->eflags®_BACKR)) {
> - NOTE("dissecting");
> - dp = dissect(m, m->coldp, endp, gf, gl);
> - } else {
> - if (g->nplus > 0 && m->lastpos == NULL)
> - m->lastpos = (char **)malloc((g->nplus+1) *
> - sizeof(char *));
> - if (g->nplus > 0 && m->lastpos == NULL) {
> - free(m->pmatch);
> - STATETEARDOWN(m);
> - return(REG_ESPACE);
> - }
> - NOTE("backref dissect");
> - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
> - }
> - if (dp != NULL)
> - break;
> -
> - /* uh-oh... we couldn't find a subexpression-level match */
> - assert(g->backrefs); /* must be back references doing it */
> - assert(g->nplus == 0 || m->lastpos != NULL);
> - for (;;) {
> - if (dp != NULL || endp <= m->coldp)
> - break; /* defeat */
> - NOTE("backoff");
> - endp = slow(m, m->coldp, endp-1, gf, gl);
> - if (endp == NULL)
> - break; /* defeat */
> - /* try it on a shorter possibility */
> -#ifndef NDEBUG
> - for (i = 1; i <= m->g->nsub; i++) {
> - assert(m->pmatch[i].rm_so == -1);
> - assert(m->pmatch[i].rm_eo == -1);
> - }
> -#endif
> - NOTE("backoff dissect");
> - dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
> - }
> - assert(dp == NULL || dp == endp);
> - if (dp != NULL) /* found a shorter one */
> - break;
> -
> - /* despite initial appearances, there is no match here */
> - NOTE("false alarm");
> - if (m->coldp == stop)
> - break;
> - start = m->coldp + 1; /* recycle starting later */
> - }
> -
> - /* fill in the details if requested */
> - if (nmatch > 0) {
> - pmatch[0].rm_so = m->coldp - m->offp;
> - pmatch[0].rm_eo = endp - m->offp;
> - }
> - if (nmatch > 1) {
> - assert(m->pmatch != NULL);
> - for (i = 1; i < (ssize_t)nmatch; i++)
> - if (i <= (int)m->g->nsub)
> - pmatch[i] = m->pmatch[i];
> - else {
> - pmatch[i].rm_so = -1;
> - pmatch[i].rm_eo = -1;
> - }
> - }
> -
> - if (m->pmatch != NULL)
> - free((char *)m->pmatch);
> - if (m->lastpos != NULL)
> - free((char *)m->lastpos);
> - STATETEARDOWN(m);
> - return(0);
> -}
> -
> -/*
> - - dissect - figure out what matched what, no back references
> - */
> -static char * /* == stop (success) always */
> -dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
> -{
> - int i;
> - sopno ss; /* start sop of current subRE */
> - sopno es; /* end sop of current subRE */
> - char *sp; /* start of string matched by it */
> - char *stp; /* string matched by it cannot pass here */
> - char *rest; /* start of rest of string */
> - char *tail; /* string unmatched by rest of RE */
> - sopno ssub; /* start sop of subsubRE */
> - sopno esub; /* end sop of subsubRE */
> - char *ssp; /* start of string matched by subsubRE */
> - char *sep; /* end of string matched by subsubRE */
> - char *oldssp; /* previous ssp */
> - char *dp;
> -
> - AT("diss", start, stop, startst, stopst);
> - sp = start;
> - for (ss = startst; ss < stopst; ss = es) {
> - /* identify end of subRE */
> - es = ss;
> - switch (OP(m->g->strip[es])) {
> - case OPLUS_:
> - case OQUEST_:
> - es += OPND(m->g->strip[es]);
> - break;
> - case OCH_:
> - while (OP(m->g->strip[es]) != O_CH)
> - es += OPND(m->g->strip[es]);
> - break;
> - }
> - es++;
> -
> - /* figure out what it matched */
> - switch (OP(m->g->strip[ss])) {
> - case OEND:
> - assert(nope);
> - break;
> - case OCHAR:
> - sp++;
> - break;
> - case OBOL:
> - case OEOL:
> - case OBOW:
> - case OEOW:
> - break;
> - case OANY:
> - case OANYOF:
> - sp++;
> - break;
> - case OBACK_:
> - case O_BACK:
> - assert(nope);
> - break;
> - /* cases where length of match is hard to find */
> - case OQUEST_:
> - stp = stop;
> - for (;;) {
> - /* how long could this one be? */
> - rest = slow(m, sp, stp, ss, es);
> - assert(rest != NULL); /* it did match */
> - /* could the rest match the rest? */
> - tail = slow(m, rest, stop, es, stopst);
> - if (tail == stop)
> - break; /* yes! */
> - /* no -- try a shorter match for this one */
> - stp = rest - 1;
> - assert(stp >= sp); /* it did work */
> - }
> - ssub = ss + 1;
> - esub = es - 1;
> - /* did innards match? */
> - if (slow(m, sp, rest, ssub, esub) != NULL) {
> - dp = dissect(m, sp, rest, ssub, esub);
> - assert(dp == rest);
> - } else /* no */
> - assert(sp == rest);
> - sp = rest;
> - break;
> - case OPLUS_:
> - stp = stop;
> - for (;;) {
> - /* how long could this one be? */
> - rest = slow(m, sp, stp, ss, es);
> - assert(rest != NULL); /* it did match */
> - /* could the rest match the rest? */
> - tail = slow(m, rest, stop, es, stopst);
> - if (tail == stop)
> - break; /* yes! */
> - /* no -- try a shorter match for this one */
> - stp = rest - 1;
> - assert(stp >= sp); /* it did work */
> - }
> - ssub = ss + 1;
> - esub = es - 1;
> - ssp = sp;
> - oldssp = ssp;
> - for (;;) { /* find last match of innards */
> - sep = slow(m, ssp, rest, ssub, esub);
> - if (sep == NULL || sep == ssp)
> - break; /* failed or matched null */
> - oldssp = ssp; /* on to next try */
> - ssp = sep;
> - }
> - if (sep == NULL) {
> - /* last successful match */
> - sep = ssp;
> - ssp = oldssp;
> - }
> - assert(sep == rest); /* must exhaust substring */
> - assert(slow(m, ssp, sep, ssub, esub) == rest);
> - dp = dissect(m, ssp, sep, ssub, esub);
> - assert(dp == sep);
> - sp = rest;
> - break;
> - case OCH_:
> - stp = stop;
> - for (;;) {
> - /* how long could this one be? */
> - rest = slow(m, sp, stp, ss, es);
> - assert(rest != NULL); /* it did match */
> - /* could the rest match the rest? */
> - tail = slow(m, rest, stop, es, stopst);
> - if (tail == stop)
> - break; /* yes! */
> - /* no -- try a shorter match for this one */
> - stp = rest - 1;
> - assert(stp >= sp); /* it did work */
> - }
> - ssub = ss + 1;
> - esub = ss + OPND(m->g->strip[ss]) - 1;
> - assert(OP(m->g->strip[esub]) == OOR1);
> - for (;;) { /* find first matching branch */
> - if (slow(m, sp, rest, ssub, esub) == rest)
> - break; /* it matched all of it */
> - /* that one missed, try next one */
> - assert(OP(m->g->strip[esub]) == OOR1);
> - esub++;
> - assert(OP(m->g->strip[esub]) == OOR2);
> - ssub = esub + 1;
> - esub += OPND(m->g->strip[esub]);
> - if (OP(m->g->strip[esub]) == OOR2)
> - esub--;
> - else
> - assert(OP(m->g->strip[esub]) == O_CH);
> - }
> - dp = dissect(m, sp, rest, ssub, esub);
> - assert(dp == rest);
> - sp = rest;
> - break;
> - case O_PLUS:
> - case O_QUEST:
> - case OOR1:
> - case OOR2:
> - case O_CH:
> - assert(nope);
> - break;
> - case OLPAREN:
> - i = OPND(m->g->strip[ss]);
> - assert(0 < i && i <= m->g->nsub);
> - m->pmatch[i].rm_so = sp - m->offp;
> - break;
> - case ORPAREN:
> - i = OPND(m->g->strip[ss]);
> - assert(0 < i && i <= m->g->nsub);
> - m->pmatch[i].rm_eo = sp - m->offp;
> - break;
> - default: /* uh oh */
> - assert(nope);
> - break;
> - }
> - }
> -
> - assert(sp == stop);
> - return(sp);
> -}
> -
> -/*
> - - backref - figure out what matched what, figuring in back references
> - */
> -static char * /* == stop (success) or NULL (failure) */
> -backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,
> - sopno lev, int rec) /* PLUS nesting level */
> -{
> - int i;
> - sopno ss; /* start sop of current subRE */
> - char *sp; /* start of string matched by it */
> - sopno ssub; /* start sop of subsubRE */
> - sopno esub; /* end sop of subsubRE */
> - char *ssp; /* start of string matched by subsubRE */
> - char *dp;
> - size_t len;
> - int hard;
> - sop s;
> - regoff_t offsave;
> - cset *cs;
> -
> - AT("back", start, stop, startst, stopst);
> - sp = start;
> -
> - /* get as far as we can with easy stuff */
> - hard = 0;
> - for (ss = startst; !hard && ss < stopst; ss++)
> - switch (OP(s = m->g->strip[ss])) {
> - case OCHAR:
> - if (sp == stop || *sp++ != (char)OPND(s))
> - return(NULL);
> - break;
> - case OANY:
> - if (sp == stop)
> - return(NULL);
> - sp++;
> - break;
> - case OANYOF:
> - cs = &m->g->sets[OPND(s)];
> - if (sp == stop || !CHIN(cs, *sp++))
> - return(NULL);
> - break;
> - case OBOL:
> - if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) ||
> - (sp < m->endp && *(sp-1) == '\n' &&
> - (m->g->cflags®_NEWLINE)) )
> - { /* yes */ }
> - else
> - return(NULL);
> - break;
> - case OEOL:
> - if ( (sp == m->endp && !(m->eflags®_NOTEOL)) ||
> - (sp < m->endp && *sp == '\n' &&
> - (m->g->cflags®_NEWLINE)) )
> - { /* yes */ }
> - else
> - return(NULL);
> - break;
> - case OBOW:
> - if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) ||
> - (sp < m->endp && *(sp-1) == '\n' &&
> - (m->g->cflags®_NEWLINE)) ||
> - (sp > m->beginp &&
> - !ISWORD(*(sp-1))) ) &&
> - (sp < m->endp && ISWORD(*sp)) )
> - { /* yes */ }
> - else
> - return(NULL);
> - break;
> - case OEOW:
> - if (( (sp == m->endp && !(m->eflags®_NOTEOL)) ||
> - (sp < m->endp && *sp == '\n' &&
> - (m->g->cflags®_NEWLINE)) ||
> - (sp < m->endp && !ISWORD(*sp)) ) &&
> - (sp > m->beginp && ISWORD(*(sp-1))) )
> - { /* yes */ }
> - else
> - return(NULL);
> - break;
> - case O_QUEST:
> - break;
> - case OOR1: /* matches null but needs to skip */
> - ss++;
> - s = m->g->strip[ss];
> - do {
> - assert(OP(s) == OOR2);
> - ss += OPND(s);
> - } while (OP(s = m->g->strip[ss]) != O_CH);
> - /* note that the ss++ gets us past the O_CH */
> - break;
> - default: /* have to make a choice */
> - hard = 1;
> - break;
> - }
> - if (!hard) { /* that was it! */
> - if (sp != stop)
> - return(NULL);
> - return(sp);
> - }
> - ss--; /* adjust for the for's final increment */
> -
> - /* the hard stuff */
> - AT("hard", sp, stop, ss, stopst);
> - s = m->g->strip[ss];
> - switch (OP(s)) {
> - case OBACK_: /* the vilest depths */
> - i = OPND(s);
> - assert(0 < i && i <= m->g->nsub);
> - if (m->pmatch[i].rm_eo == -1)
> - return(NULL);
> - assert(m->pmatch[i].rm_so != -1);
> - len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so;
> - if (len == 0 && rec++ > MAX_RECURSION)
> - return(NULL);
> - assert(stop - m->beginp >= len);
> - if (sp > stop - len)
> - return(NULL); /* not enough left to match */
> - ssp = m->offp + m->pmatch[i].rm_so;
> - if (memcmp(sp, ssp, len) != 0)
> - return(NULL);
> - while (m->g->strip[ss] != SOP(O_BACK, i))
> - ss++;
> - return(backref(m, sp+len, stop, ss+1, stopst, lev, rec));
> - break;
> - case OQUEST_: /* to null or not */
> - dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
> - if (dp != NULL)
> - return(dp); /* not */
> - return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev, rec));
> - break;
> - case OPLUS_:
> - assert(m->lastpos != NULL);
> - assert(lev+1 <= m->g->nplus);
> - m->lastpos[lev+1] = sp;
> - return(backref(m, sp, stop, ss+1, stopst, lev+1, rec));
> - break;
> - case O_PLUS:
> - if (sp == m->lastpos[lev]) /* last pass matched null */
> - return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
> - /* try another pass */
> - m->lastpos[lev] = sp;
> - dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev, rec);
> - if (dp == NULL)
> - return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
> - else
> - return(dp);
> - break;
> - case OCH_: /* find the right one, if any */
> - ssub = ss + 1;
> - esub = ss + OPND(s) - 1;
> - assert(OP(m->g->strip[esub]) == OOR1);
> - for (;;) { /* find first matching branch */
> - dp = backref(m, sp, stop, ssub, esub, lev, rec);
> - if (dp != NULL)
> - return(dp);
> - /* that one missed, try next one */
> - if (OP(m->g->strip[esub]) == O_CH)
> - return(NULL); /* there is none */
> - esub++;
> - assert(OP(m->g->strip[esub]) == OOR2);
> - ssub = esub + 1;
> - esub += OPND(m->g->strip[esub]);
> - if (OP(m->g->strip[esub]) == OOR2)
> - esub--;
> - else
> - assert(OP(m->g->strip[esub]) == O_CH);
> - }
> - break;
> - case OLPAREN: /* must undo assignment if rest fails */
> - i = OPND(s);
> - assert(0 < i && i <= m->g->nsub);
> - offsave = m->pmatch[i].rm_so;
> - m->pmatch[i].rm_so = sp - m->offp;
> - dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
> - if (dp != NULL)
> - return(dp);
> - m->pmatch[i].rm_so = offsave;
> - return(NULL);
> - break;
> - case ORPAREN: /* must undo assignment if rest fails */
> - i = OPND(s);
> - assert(0 < i && i <= m->g->nsub);
> - offsave = m->pmatch[i].rm_eo;
> - m->pmatch[i].rm_eo = sp - m->offp;
> - dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
> - if (dp != NULL)
> - return(dp);
> - m->pmatch[i].rm_eo = offsave;
> - return(NULL);
> - break;
> - default: /* uh oh */
> - assert(nope);
> - break;
> - }
> -
> - /* "can't happen" */
> - assert(nope);
> - /* NOTREACHED */
> - return 0;
> -}
> -
> -/*
> - - fast - step through the string at top speed
> - */
> -static char * /* where tentative match ended, or NULL */
> -fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
> -{
> - states st = m->st;
> - states fresh = m->fresh;
> - states tmp = m->tmp;
> - char *p = start;
> - int c = (start == m->beginp) ? OUT : *(start-1);
> - int lastc; /* previous c */
> - int flagch;
> - int i;
> - char *coldp; /* last p after which no match was underway */
> -
> - CLEAR(st);
> - SET1(st, startst);
> - st = step(m->g, startst, stopst, st, NOTHING, st);
> - ASSIGN(fresh, st);
> - SP("start", st, *p);
> - coldp = NULL;
> - for (;;) {
> - /* next character */
> - lastc = c;
> - c = (p == m->endp) ? OUT : *p;
> - if (EQ(st, fresh))
> - coldp = p;
> -
> - /* is there an EOL and/or BOL between lastc and c? */
> - flagch = '\0';
> - i = 0;
> - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) ||
> - (lastc == OUT && !(m->eflags®_NOTBOL)) ) {
> - flagch = BOL;
> - i = m->g->nbol;
> - }
> - if ( (c == '\n' && m->g->cflags®_NEWLINE) ||
> - (c == OUT && !(m->eflags®_NOTEOL)) ) {
> - flagch = (flagch == BOL) ? BOLEOL : EOL;
> - i += m->g->neol;
> - }
> - if (i != 0) {
> - for (; i > 0; i--)
> - st = step(m->g, startst, stopst, st, flagch, st);
> - SP("boleol", st, c);
> - }
> -
> - /* how about a word boundary? */
> - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
> - (c != OUT && ISWORD(c)) ) {
> - flagch = BOW;
> - }
> - if ( (lastc != OUT && ISWORD(lastc)) &&
> - (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
> - flagch = EOW;
> - }
> - if (flagch == BOW || flagch == EOW) {
> - st = step(m->g, startst, stopst, st, flagch, st);
> - SP("boweow", st, c);
> - }
> -
> - /* are we done? */
> - if (ISSET(st, stopst) || p == stop)
> - break; /* NOTE BREAK OUT */
> -
> - /* no, we must deal with this character */
> - ASSIGN(tmp, st);
> - ASSIGN(st, fresh);
> - assert(c != OUT);
> - st = step(m->g, startst, stopst, tmp, c, st);
> - SP("aft", st, c);
> - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
> - p++;
> - }
> -
> - assert(coldp != NULL);
> - m->coldp = coldp;
> - if (ISSET(st, stopst))
> - return(p+1);
> - else
> - return(NULL);
> -}
> -
> -/*
> - - slow - step through the string more deliberately
> - */
> -static char * /* where it ended */
> -slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
> -{
> - states st = m->st;
> - states empty = m->empty;
> - states tmp = m->tmp;
> - char *p = start;
> - int c = (start == m->beginp) ? OUT : *(start-1);
> - int lastc; /* previous c */
> - int flagch;
> - int i;
> - char *matchp; /* last p at which a match ended */
> -
> - AT("slow", start, stop, startst, stopst);
> - CLEAR(st);
> - SET1(st, startst);
> - SP("sstart", st, *p);
> - st = step(m->g, startst, stopst, st, NOTHING, st);
> - matchp = NULL;
> - for (;;) {
> - /* next character */
> - lastc = c;
> - c = (p == m->endp) ? OUT : *p;
> -
> - /* is there an EOL and/or BOL between lastc and c? */
> - flagch = '\0';
> - i = 0;
> - if ( (lastc == '\n' && m->g->cflags®_NEWLINE) ||
> - (lastc == OUT && !(m->eflags®_NOTBOL)) ) {
> - flagch = BOL;
> - i = m->g->nbol;
> - }
> - if ( (c == '\n' && m->g->cflags®_NEWLINE) ||
> - (c == OUT && !(m->eflags®_NOTEOL)) ) {
> - flagch = (flagch == BOL) ? BOLEOL : EOL;
> - i += m->g->neol;
> - }
> - if (i != 0) {
> - for (; i > 0; i--)
> - st = step(m->g, startst, stopst, st, flagch, st);
> - SP("sboleol", st, c);
> - }
> -
> - /* how about a word boundary? */
> - if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) &&
> - (c != OUT && ISWORD(c)) ) {
> - flagch = BOW;
> - }
> - if ( (lastc != OUT && ISWORD(lastc)) &&
> - (flagch == EOL || (c != OUT && !ISWORD(c))) ) {
> - flagch = EOW;
> - }
> - if (flagch == BOW || flagch == EOW) {
> - st = step(m->g, startst, stopst, st, flagch, st);
> - SP("sboweow", st, c);
> - }
> -
> - /* are we done? */
> - if (ISSET(st, stopst))
> - matchp = p;
> - if (EQ(st, empty) || p == stop)
> - break; /* NOTE BREAK OUT */
> -
> - /* no, we must deal with this character */
> - ASSIGN(tmp, st);
> - ASSIGN(st, empty);
> - assert(c != OUT);
> - st = step(m->g, startst, stopst, tmp, c, st);
> - SP("saft", st, c);
> - assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st));
> - p++;
> - }
> -
> - return(matchp);
> -}
> -
> -
> -/*
> - - step - map set of states reachable before char to set reachable after
> - */
> -static states
> -step(struct re_guts *g,
> - sopno start, /* start state within strip */
> - sopno stop, /* state after stop state within strip */
> - states bef, /* states reachable before */
> - int ch, /* character or NONCHAR code */
> - states aft) /* states already known reachable after */
> -{
> - cset *cs;
> - sop s;
> - sopno pc;
> - onestate here; /* note, macros know this name */
> - sopno look;
> - int i;
> -
> - for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
> - s = g->strip[pc];
> - switch (OP(s)) {
> - case OEND:
> - assert(pc == stop-1);
> - break;
> - case OCHAR:
> - /* only characters can match */
> - assert(!NONCHAR(ch) || ch != (char)OPND(s));
> - if (ch == (char)OPND(s))
> - FWD(aft, bef, 1);
> - break;
> - case OBOL:
> - if (ch == BOL || ch == BOLEOL)
> - FWD(aft, bef, 1);
> - break;
> - case OEOL:
> - if (ch == EOL || ch == BOLEOL)
> - FWD(aft, bef, 1);
> - break;
> - case OBOW:
> - if (ch == BOW)
> - FWD(aft, bef, 1);
> - break;
> - case OEOW:
> - if (ch == EOW)
> - FWD(aft, bef, 1);
> - break;
> - case OANY:
> - if (!NONCHAR(ch))
> - FWD(aft, bef, 1);
> - break;
> - case OANYOF:
> - cs = &g->sets[OPND(s)];
> - if (!NONCHAR(ch) && CHIN(cs, ch))
> - FWD(aft, bef, 1);
> - break;
> - case OBACK_: /* ignored here */
> - case O_BACK:
> - FWD(aft, aft, 1);
> - break;
> - case OPLUS_: /* forward, this is just an empty */
> - FWD(aft, aft, 1);
> - break;
> - case O_PLUS: /* both forward and back */
> - FWD(aft, aft, 1);
> - i = ISSETBACK(aft, OPND(s));
> - BACK(aft, aft, OPND(s));
> - if (!i && ISSETBACK(aft, OPND(s))) {
> - /* oho, must reconsider loop body */
> - pc -= OPND(s) + 1;
> - INIT(here, pc);
> - }
> - break;
> - case OQUEST_: /* two branches, both forward */
> - FWD(aft, aft, 1);
> - FWD(aft, aft, OPND(s));
> - break;
> - case O_QUEST: /* just an empty */
> - FWD(aft, aft, 1);
> - break;
> - case OLPAREN: /* not significant here */
> - case ORPAREN:
> - FWD(aft, aft, 1);
> - break;
> - case OCH_: /* mark the first two branches */
> - FWD(aft, aft, 1);
> - assert(OP(g->strip[pc+OPND(s)]) == OOR2);
> - FWD(aft, aft, OPND(s));
> - break;
> - case OOR1: /* done a branch, find the O_CH */
> - if (ISSTATEIN(aft, here)) {
> - for (look = 1;
> - OP(s = g->strip[pc+look]) != O_CH;
> - look += OPND(s))
> - assert(OP(s) == OOR2);
> - FWD(aft, aft, look);
> - }
> - break;
> - case OOR2: /* propagate OCH_'s marking */
> - FWD(aft, aft, 1);
> - if (OP(g->strip[pc+OPND(s)]) != O_CH) {
> - assert(OP(g->strip[pc+OPND(s)]) == OOR2);
> - FWD(aft, aft, OPND(s));
> - }
> - break;
> - case O_CH: /* just empty */
> - FWD(aft, aft, 1);
> - break;
> - default: /* ooooops... */
> - assert(nope);
> - break;
> - }
> - }
> -
> - return(aft);
> -}
> -
> -#ifdef REDEBUG
> -/*
> - - print - print a set of states
> - */
> -static void
> -print(struct match *m, char *caption, states st, int ch, FILE *d)
> -{
> - struct re_guts *g = m->g;
> - int i;
> - int first = 1;
> -
> - if (!(m->eflags®_TRACE))
> - return;
> -
> - (void)fprintf(d, "%s", caption);
> - if (ch != '\0')
> - (void)fprintf(d, " %s", pchar(ch));
> - for (i = 0; i < g->nstates; i++)
> - if (ISSET(st, i)) {
> - (void)fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
> - first = 0;
> - }
> - (void)fprintf(d, "\n");
> -}
> -
> -/*
> - - at - print current situation
> - */
> -static void
> -at(struct match *m, char *title, char *start, char *stop, sopno startst,
> - sopno stopst)
> -{
> - if (!(m->eflags®_TRACE))
> - return;
> -
> - (void)printf("%s %s-", title, pchar(*start));
> - (void)printf("%s ", pchar(*stop));
> - (void)printf("%ld-%ld\n", (long)startst, (long)stopst);
> -}
> -
> -#ifndef PCHARDONE
> -#define PCHARDONE /* never again */
> -/*
> - - pchar - make a character printable
> - *
> - * Is this identical to regchar() over in debug.c? Well, yes. But a
> - * duplicate here avoids having a debugging-capable regexec.o tied to
> - * a matching debug.o, and this is convenient. It all disappears in
> - * the non-debug compilation anyway, so it doesn't matter much.
> - */
> -static char * /* -> representation */
> -pchar(int ch)
> -{
> - static char pbuf[10];
> -
> - if (isprint(ch) || ch == ' ')
> - (void)snprintf(pbuf, sizeof pbuf, "%c", ch);
> - else
> - (void)snprintf(pbuf, sizeof pbuf, "\\%o", ch);
> - return(pbuf);
> -}
> -#endif
> -#endif
> -
> -#undef matcher
> -#undef fast
> -#undef slow
> -#undef dissect
> -#undef backref
> -#undef step
> -#undef print
> -#undef at
> -#undef match
> -#undef nope
> diff --git a/android/regex/regcomp.c b/android/regex/regcomp.c
> deleted file mode 100644
> index 19f4790..0000000
> --- a/android/regex/regcomp.c
> +++ /dev/null
> @@ -1,1517 +0,0 @@
> -/* $OpenBSD: regcomp.c,v 1.19 2008/02/23 08:13:07 otto Exp $ */
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regcomp.c 8.5 (Berkeley) 3/20/94
> - */
> -
> -#include <sys/types.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <ctype.h>
> -#include <limits.h>
> -#include <stdlib.h>
> -#include <regex.h>
> -
> -#include "utils.h"
> -#include "regex2.h"
> -
> -#include "cclass.h"
> -#include "cname.h"
> -
> -/*
> - * parse structure, passed up and down to avoid global variables and
> - * other clumsinesses
> - */
> -struct parse {
> - char *next; /* next character in RE */
> - char *end; /* end of string (-> NUL normally) */
> - int error; /* has an error been seen? */
> - sop *strip; /* malloced strip */
> - sopno ssize; /* malloced strip size (allocated) */
> - sopno slen; /* malloced strip length (used) */
> - int ncsalloc; /* number of csets allocated */
> - struct re_guts *g;
> -# define NPAREN 10 /* we need to remember () 1-9 for back refs */
> - sopno pbegin[NPAREN]; /* -> ( ([0] unused) */
> - sopno pend[NPAREN]; /* -> ) ([0] unused) */
> -};
> -
> -static void p_ere(struct parse *, int);
> -static void p_ere_exp(struct parse *);
> -static void p_str(struct parse *);
> -static void p_bre(struct parse *, int, int);
> -static int p_simp_re(struct parse *, int);
> -static int p_count(struct parse *);
> -static void p_bracket(struct parse *);
> -static void p_b_term(struct parse *, cset *);
> -static void p_b_cclass(struct parse *, cset *);
> -static void p_b_eclass(struct parse *, cset *);
> -static char p_b_symbol(struct parse *);
> -static char p_b_coll_elem(struct parse *, int);
> -static char othercase(int);
> -static void bothcases(struct parse *, int);
> -static void ordinary(struct parse *, int);
> -static void nonnewline(struct parse *);
> -static void repeat(struct parse *, sopno, int, int);
> -static int seterr(struct parse *, int);
> -static cset *allocset(struct parse *);
> -static void freeset(struct parse *, cset *);
> -static int freezeset(struct parse *, cset *);
> -static int firstch(struct parse *, cset *);
> -static int nch(struct parse *, cset *);
> -static void mcadd(struct parse *, cset *, char *);
> -static void mcinvert(struct parse *, cset *);
> -static void mccase(struct parse *, cset *);
> -static int isinsets(struct re_guts *, int);
> -static int samesets(struct re_guts *, int, int);
> -static void categorize(struct parse *, struct re_guts *);
> -static sopno dupl(struct parse *, sopno, sopno);
> -static void doemit(struct parse *, sop, size_t);
> -static void doinsert(struct parse *, sop, size_t, sopno);
> -static void dofwd(struct parse *, sopno, sop);
> -static void enlarge(struct parse *, sopno);
> -static void stripsnug(struct parse *, struct re_guts *);
> -static void findmust(struct parse *, struct re_guts *);
> -static sopno pluscount(struct parse *, struct re_guts *);
> -
> -static char nuls[10]; /* place to point scanner in event of error */
> -
> -/*
> - * macros for use with parse structure
> - * BEWARE: these know that the parse structure is named `p' !!!
> - */
> -#define PEEK() (*p->next)
> -#define PEEK2() (*(p->next+1))
> -#define MORE() (p->next < p->end)
> -#define MORE2() (p->next+1 < p->end)
> -#define SEE(c) (MORE() && PEEK() == (c))
> -#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b))
> -#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
> -#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
> -#define NEXT() (p->next++)
> -#define NEXT2() (p->next += 2)
> -#define NEXTn(n) (p->next += (n))
> -#define GETNEXT() (*p->next++)
> -#define SETERROR(e) seterr(p, (e))
> -#define REQUIRE(co, e) ((co) || SETERROR(e))
> -#define MUSTSEE(c, e) (REQUIRE(MORE() && PEEK() == (c), e))
> -#define MUSTEAT(c, e) (REQUIRE(MORE() && GETNEXT() == (c), e))
> -#define MUSTNOTSEE(c, e) (REQUIRE(!MORE() || PEEK() != (c), e))
> -#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd))
> -#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos)
> -#define AHEAD(pos) dofwd(p, pos, HERE()-(pos))
> -#define ASTERN(sop, pos) EMIT(sop, HERE()-pos)
> -#define HERE() (p->slen)
> -#define THERE() (p->slen - 1)
> -#define THERETHERE() (p->slen - 2)
> -#define DROP(n) (p->slen -= (n))
> -
> -#ifndef NDEBUG
> -static int never = 0; /* for use in asserts; shuts lint up */
> -#else
> -#define never 0 /* some <assert.h>s have bugs too */
> -#endif
> -
> -/*
> - - regcomp - interface for parser and compilation
> - */
> -int /* 0 success, otherwise REG_something */
> -regcomp(regex_t *preg, const char *pattern, int cflags)
> -{
> - struct parse pa;
> - struct re_guts *g;
> - struct parse *p = &pa;
> - int i;
> - size_t len;
> -#ifdef REDEBUG
> -# define GOODFLAGS(f) (f)
> -#else
> -# define GOODFLAGS(f) ((f)&~REG_DUMP)
> -#endif
> -
> - cflags = GOODFLAGS(cflags);
> - if ((cflags®_EXTENDED) && (cflags®_NOSPEC))
> - return(REG_INVARG);
> -
> - if (cflags®_PEND) {
> - if (preg->re_endp < pattern)
> - return(REG_INVARG);
> - len = preg->re_endp - pattern;
> - } else
> - len = strlen((char *)pattern);
> -
> - /* do the mallocs early so failure handling is easy */
> - g = (struct re_guts *)malloc(sizeof(struct re_guts) +
> - (NC-1)*sizeof(cat_t));
> - if (g == NULL)
> - return(REG_ESPACE);
> - p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */
> - p->strip = (sop *)calloc(p->ssize, sizeof(sop));
> - p->slen = 0;
> - if (p->strip == NULL) {
> - free((char *)g);
> - return(REG_ESPACE);
> - }
> -
> - /* set things up */
> - p->g = g;
> - p->next = (char *)pattern; /* convenience; we do not modify it */
> - p->end = p->next + len;
> - p->error = 0;
> - p->ncsalloc = 0;
> - for (i = 0; i < NPAREN; i++) {
> - p->pbegin[i] = 0;
> - p->pend[i] = 0;
> - }
> - g->csetsize = NC;
> - g->sets = NULL;
> - g->setbits = NULL;
> - g->ncsets = 0;
> - g->cflags = cflags;
> - g->iflags = 0;
> - g->nbol = 0;
> - g->neol = 0;
> - g->must = NULL;
> - g->mlen = 0;
> - g->nsub = 0;
> - g->ncategories = 1; /* category 0 is "everything else" */
> - g->categories = &g->catspace[-(CHAR_MIN)];
> - (void) memset((char *)g->catspace, 0, NC*sizeof(cat_t));
> - g->backrefs = 0;
> -
> - /* do it */
> - EMIT(OEND, 0);
> - g->firststate = THERE();
> - if (cflags®_EXTENDED)
> - p_ere(p, OUT);
> - else if (cflags®_NOSPEC)
> - p_str(p);
> - else
> - p_bre(p, OUT, OUT);
> - EMIT(OEND, 0);
> - g->laststate = THERE();
> -
> - /* tidy up loose ends and fill things in */
> - categorize(p, g);
> - stripsnug(p, g);
> - findmust(p, g);
> - g->nplus = pluscount(p, g);
> - g->magic = MAGIC2;
> - preg->re_nsub = g->nsub;
> - preg->re_g = g;
> - preg->re_magic = MAGIC1;
> -#ifndef REDEBUG
> - /* not debugging, so can't rely on the assert() in regexec() */
> - if (g->iflags&BAD)
> - SETERROR(REG_ASSERT);
> -#endif
> -
> - /* win or lose, we're done */
> - if (p->error != 0) /* lose */
> - regfree(preg);
> - return(p->error);
> -}
> -
> -/*
> - - p_ere - ERE parser top level, concatenation and alternation
> - */
> -static void
> -p_ere(struct parse *p, int stop) /* character this ERE should end at */
> -{
> - char c;
> - sopno prevback = 0;
> - sopno prevfwd = 0;
> - sopno conc;
> - int first = 1; /* is this the first alternative? */
> -
> - for (;;) {
> - /* do a bunch of concatenated expressions */
> - conc = HERE();
> - while (MORE() && (c = PEEK()) != '|' && c != stop)
> - p_ere_exp(p);
> - REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */
> -
> - if (!EAT('|'))
> - break; /* NOTE BREAK OUT */
> -
> - if (first) {
> - INSERT(OCH_, conc); /* offset is wrong */
> - prevfwd = conc;
> - prevback = conc;
> - first = 0;
> - }
> - ASTERN(OOR1, prevback);
> - prevback = THERE();
> - AHEAD(prevfwd); /* fix previous offset */
> - prevfwd = HERE();
> - EMIT(OOR2, 0); /* offset is very wrong */
> - }
> -
> - if (!first) { /* tail-end fixups */
> - AHEAD(prevfwd);
> - ASTERN(O_CH, prevback);
> - }
> -
> - assert(!MORE() || SEE(stop));
> -}
> -
> -/*
> - - p_ere_exp - parse one subERE, an atom possibly followed by a repetition op
> - */
> -static void
> -p_ere_exp(struct parse *p)
> -{
> - char c;
> - sopno pos;
> - int count;
> - int count2;
> - sopno subno;
> - int wascaret = 0;
> -
> - assert(MORE()); /* caller should have ensured this */
> - c = GETNEXT();
> -
> - pos = HERE();
> - switch (c) {
> - case '(':
> - REQUIRE(MORE(), REG_EPAREN);
> - p->g->nsub++;
> - subno = p->g->nsub;
> - if (subno < NPAREN)
> - p->pbegin[subno] = HERE();
> - EMIT(OLPAREN, subno);
> - if (!SEE(')'))
> - p_ere(p, ')');
> - if (subno < NPAREN) {
> - p->pend[subno] = HERE();
> - assert(p->pend[subno] != 0);
> - }
> - EMIT(ORPAREN, subno);
> - MUSTEAT(')', REG_EPAREN);
> - break;
> -#ifndef POSIX_MISTAKE
> - case ')': /* happens only if no current unmatched ( */
> - /*
> - * You may ask, why the ifndef? Because I didn't notice
> - * this until slightly too late for 1003.2, and none of the
> - * other 1003.2 regular-expression reviewers noticed it at
> - * all. So an unmatched ) is legal POSIX, at least until
> - * we can get it fixed.
> - */
> - SETERROR(REG_EPAREN);
> - break;
> -#endif
> - case '^':
> - EMIT(OBOL, 0);
> - p->g->iflags |= USEBOL;
> - p->g->nbol++;
> - wascaret = 1;
> - break;
> - case '$':
> - EMIT(OEOL, 0);
> - p->g->iflags |= USEEOL;
> - p->g->neol++;
> - break;
> - case '|':
> - SETERROR(REG_EMPTY);
> - break;
> - case '*':
> - case '+':
> - case '?':
> - SETERROR(REG_BADRPT);
> - break;
> - case '.':
> - if (p->g->cflags®_NEWLINE)
> - nonnewline(p);
> - else
> - EMIT(OANY, 0);
> - break;
> - case '[':
> - p_bracket(p);
> - break;
> - case '\\':
> - REQUIRE(MORE(), REG_EESCAPE);
> - c = GETNEXT();
> - ordinary(p, c);
> - break;
> - case '{': /* okay as ordinary except if digit follows */
> - REQUIRE(!MORE() || !isdigit((uch)PEEK()), REG_BADRPT);
> - /* FALLTHROUGH */
> - default:
> - ordinary(p, c);
> - break;
> - }
> -
> - if (!MORE())
> - return;
> - c = PEEK();
> - /* we call { a repetition if followed by a digit */
> - if (!( c == '*' || c == '+' || c == '?' ||
> - (c == '{' && MORE2() && isdigit((uch)PEEK2())) ))
> - return; /* no repetition, we're done */
> - NEXT();
> -
> - REQUIRE(!wascaret, REG_BADRPT);
> - switch (c) {
> - case '*': /* implemented as +? */
> - /* this case does not require the (y|) trick, noKLUDGE */
> - INSERT(OPLUS_, pos);
> - ASTERN(O_PLUS, pos);
> - INSERT(OQUEST_, pos);
> - ASTERN(O_QUEST, pos);
> - break;
> - case '+':
> - INSERT(OPLUS_, pos);
> - ASTERN(O_PLUS, pos);
> - break;
> - case '?':
> - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
> - INSERT(OCH_, pos); /* offset slightly wrong */
> - ASTERN(OOR1, pos); /* this one's right */
> - AHEAD(pos); /* fix the OCH_ */
> - EMIT(OOR2, 0); /* offset very wrong... */
> - AHEAD(THERE()); /* ...so fix it */
> - ASTERN(O_CH, THERETHERE());
> - break;
> - case '{':
> - count = p_count(p);
> - if (EAT(',')) {
> - if (isdigit((uch)PEEK())) {
> - count2 = p_count(p);
> - REQUIRE(count <= count2, REG_BADBR);
> - } else /* single number with comma */
> - count2 = INFINITY;
> - } else /* just a single number */
> - count2 = count;
> - repeat(p, pos, count, count2);
> - if (!EAT('}')) { /* error heuristics */
> - while (MORE() && PEEK() != '}')
> - NEXT();
> - REQUIRE(MORE(), REG_EBRACE);
> - SETERROR(REG_BADBR);
> - }
> - break;
> - }
> -
> - if (!MORE())
> - return;
> - c = PEEK();
> - if (!( c == '*' || c == '+' || c == '?' ||
> - (c == '{' && MORE2() && isdigit((uch)PEEK2())) ) )
> - return;
> - SETERROR(REG_BADRPT);
> -}
> -
> -/*
> - - p_str - string (no metacharacters) "parser"
> - */
> -static void
> -p_str(struct parse *p)
> -{
> - REQUIRE(MORE(), REG_EMPTY);
> - while (MORE())
> - ordinary(p, GETNEXT());
> -}
> -
> -/*
> - - p_bre - BRE parser top level, anchoring and concatenation
> - * Giving end1 as OUT essentially eliminates the end1/end2 check.
> - *
> - * This implementation is a bit of a kludge, in that a trailing $ is first
> - * taken as an ordinary character and then revised to be an anchor. The
> - * only undesirable side effect is that '$' gets included as a character
> - * category in such cases. This is fairly harmless; not worth fixing.
> - * The amount of lookahead needed to avoid this kludge is excessive.
> - */
> -static void
> -p_bre(struct parse *p,
> - int end1, /* first terminating character */
> - int end2) /* second terminating character */
> -{
> - sopno start = HERE();
> - int first = 1; /* first subexpression? */
> - int wasdollar = 0;
> -
> - if (EAT('^')) {
> - EMIT(OBOL, 0);
> - p->g->iflags |= USEBOL;
> - p->g->nbol++;
> - }
> - while (MORE() && !SEETWO(end1, end2)) {
> - wasdollar = p_simp_re(p, first);
> - first = 0;
> - }
> - if (wasdollar) { /* oops, that was a trailing anchor */
> - DROP(1);
> - EMIT(OEOL, 0);
> - p->g->iflags |= USEEOL;
> - p->g->neol++;
> - }
> -
> - REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */
> -}
> -
> -/*
> - - p_simp_re - parse a simple RE, an atom possibly followed by a repetition
> - */
> -static int /* was the simple RE an unbackslashed $? */
> -p_simp_re(struct parse *p,
> - int starordinary) /* is a leading * an ordinary character? */
> -{
> - int c;
> - int count;
> - int count2;
> - sopno pos;
> - int i;
> - sopno subno;
> -# define BACKSL (1<<CHAR_BIT)
> -
> - pos = HERE(); /* repetion op, if any, covers from here */
> -
> - assert(MORE()); /* caller should have ensured this */
> - c = GETNEXT();
> - if (c == '\\') {
> - REQUIRE(MORE(), REG_EESCAPE);
> - c = BACKSL | GETNEXT();
> - }
> - switch (c) {
> - case '.':
> - if (p->g->cflags®_NEWLINE)
> - nonnewline(p);
> - else
> - EMIT(OANY, 0);
> - break;
> - case '[':
> - p_bracket(p);
> - break;
> - case BACKSL|'{':
> - SETERROR(REG_BADRPT);
> - break;
> - case BACKSL|'(':
> - p->g->nsub++;
> - subno = p->g->nsub;
> - if (subno < NPAREN)
> - p->pbegin[subno] = HERE();
> - EMIT(OLPAREN, subno);
> - /* the MORE here is an error heuristic */
> - if (MORE() && !SEETWO('\\', ')'))
> - p_bre(p, '\\', ')');
> - if (subno < NPAREN) {
> - p->pend[subno] = HERE();
> - assert(p->pend[subno] != 0);
> - }
> - EMIT(ORPAREN, subno);
> - REQUIRE(EATTWO('\\', ')'), REG_EPAREN);
> - break;
> - case BACKSL|')': /* should not get here -- must be user */
> - case BACKSL|'}':
> - SETERROR(REG_EPAREN);
> - break;
> - case BACKSL|'1':
> - case BACKSL|'2':
> - case BACKSL|'3':
> - case BACKSL|'4':
> - case BACKSL|'5':
> - case BACKSL|'6':
> - case BACKSL|'7':
> - case BACKSL|'8':
> - case BACKSL|'9':
> - i = (c&~BACKSL) - '0';
> - assert(i < NPAREN);
> - if (p->pend[i] != 0) {
> - assert(i <= p->g->nsub);
> - EMIT(OBACK_, i);
> - assert(p->pbegin[i] != 0);
> - assert(OP(p->strip[p->pbegin[i]]) == OLPAREN);
> - assert(OP(p->strip[p->pend[i]]) == ORPAREN);
> - (void) dupl(p, p->pbegin[i]+1, p->pend[i]);
> - EMIT(O_BACK, i);
> - } else
> - SETERROR(REG_ESUBREG);
> - p->g->backrefs = 1;
> - break;
> - case '*':
> - REQUIRE(starordinary, REG_BADRPT);
> - /* FALLTHROUGH */
> - default:
> - ordinary(p, (char)c);
> - break;
> - }
> -
> - if (EAT('*')) { /* implemented as +? */
> - /* this case does not require the (y|) trick, noKLUDGE */
> - INSERT(OPLUS_, pos);
> - ASTERN(O_PLUS, pos);
> - INSERT(OQUEST_, pos);
> - ASTERN(O_QUEST, pos);
> - } else if (EATTWO('\\', '{')) {
> - count = p_count(p);
> - if (EAT(',')) {
> - if (MORE() && isdigit((uch)PEEK())) {
> - count2 = p_count(p);
> - REQUIRE(count <= count2, REG_BADBR);
> - } else /* single number with comma */
> - count2 = INFINITY;
> - } else /* just a single number */
> - count2 = count;
> - repeat(p, pos, count, count2);
> - if (!EATTWO('\\', '}')) { /* error heuristics */
> - while (MORE() && !SEETWO('\\', '}'))
> - NEXT();
> - REQUIRE(MORE(), REG_EBRACE);
> - SETERROR(REG_BADBR);
> - }
> - } else if (c == '$') /* $ (but not \$) ends it */
> - return(1);
> -
> - return(0);
> -}
> -
> -/*
> - - p_count - parse a repetition count
> - */
> -static int /* the value */
> -p_count(struct parse *p)
> -{
> - int count = 0;
> - int ndigits = 0;
> -
> - while (MORE() && isdigit((uch)PEEK()) && count <= DUPMAX) {
> - count = count*10 + (GETNEXT() - '0');
> - ndigits++;
> - }
> -
> - REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR);
> - return(count);
> -}
> -
> -/*
> - - p_bracket - parse a bracketed character list
> - *
> - * Note a significant property of this code: if the allocset() did SETERROR,
> - * no set operations are done.
> - */
> -static void
> -p_bracket(struct parse *p)
> -{
> - cset *cs;
> - int invert = 0;
> -
> - /* Dept of Truly Sickening Special-Case Kludges */
> - if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) {
> - EMIT(OBOW, 0);
> - NEXTn(6);
> - return;
> - }
> - if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) {
> - EMIT(OEOW, 0);
> - NEXTn(6);
> - return;
> - }
> -
> - if ((cs = allocset(p)) == NULL) {
> - /* allocset did set error status in p */
> - return;
> - }
> -
> - if (EAT('^'))
> - invert++; /* make note to invert set at end */
> - if (EAT(']'))
> - CHadd(cs, ']');
> - else if (EAT('-'))
> - CHadd(cs, '-');
> - while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
> - p_b_term(p, cs);
> - if (EAT('-'))
> - CHadd(cs, '-');
> - MUSTEAT(']', REG_EBRACK);
> -
> - if (p->error != 0) { /* don't mess things up further */
> - freeset(p, cs);
> - return;
> - }
> -
> - if (p->g->cflags®_ICASE) {
> - int i;
> - int ci;
> -
> - for (i = p->g->csetsize - 1; i >= 0; i--)
> - if (CHIN(cs, i) && isalpha(i)) {
> - ci = othercase(i);
> - if (ci != i)
> - CHadd(cs, ci);
> - }
> - if (cs->multis != NULL)
> - mccase(p, cs);
> - }
> - if (invert) {
> - int i;
> -
> - for (i = p->g->csetsize - 1; i >= 0; i--)
> - if (CHIN(cs, i))
> - CHsub(cs, i);
> - else
> - CHadd(cs, i);
> - if (p->g->cflags®_NEWLINE)
> - CHsub(cs, '\n');
> - if (cs->multis != NULL)
> - mcinvert(p, cs);
> - }
> -
> - assert(cs->multis == NULL); /* xxx */
> -
> - if (nch(p, cs) == 1) { /* optimize singleton sets */
> - ordinary(p, firstch(p, cs));
> - freeset(p, cs);
> - } else
> - EMIT(OANYOF, freezeset(p, cs));
> -}
> -
> -/*
> - - p_b_term - parse one term of a bracketed character list
> - */
> -static void
> -p_b_term(struct parse *p, cset *cs)
> -{
> - char c;
> - char start, finish;
> - int i;
> -
> - /* classify what we've got */
> - switch ((MORE()) ? PEEK() : '\0') {
> - case '[':
> - c = (MORE2()) ? PEEK2() : '\0';
> - break;
> - case '-':
> - SETERROR(REG_ERANGE);
> - return; /* NOTE RETURN */
> - break;
> - default:
> - c = '\0';
> - break;
> - }
> -
> - switch (c) {
> - case ':': /* character class */
> - NEXT2();
> - REQUIRE(MORE(), REG_EBRACK);
> - c = PEEK();
> - REQUIRE(c != '-' && c != ']', REG_ECTYPE);
> - p_b_cclass(p, cs);
> - REQUIRE(MORE(), REG_EBRACK);
> - REQUIRE(EATTWO(':', ']'), REG_ECTYPE);
> - break;
> - case '=': /* equivalence class */
> - NEXT2();
> - REQUIRE(MORE(), REG_EBRACK);
> - c = PEEK();
> - REQUIRE(c != '-' && c != ']', REG_ECOLLATE);
> - p_b_eclass(p, cs);
> - REQUIRE(MORE(), REG_EBRACK);
> - REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
> - break;
> - default: /* symbol, ordinary character, or range */
> -/* xxx revision needed for multichar stuff */
> - start = p_b_symbol(p);
> - if (SEE('-') && MORE2() && PEEK2() != ']') {
> - /* range */
> - NEXT();
> - if (EAT('-'))
> - finish = '-';
> - else
> - finish = p_b_symbol(p);
> - } else
> - finish = start;
> -/* xxx what about signed chars here... */
> - REQUIRE(start <= finish, REG_ERANGE);
> - for (i = start; i <= finish; i++)
> - CHadd(cs, i);
> - break;
> - }
> -}
> -
> -/*
> - - p_b_cclass - parse a character-class name and deal with it
> - */
> -static void
> -p_b_cclass(struct parse *p, cset *cs)
> -{
> - char *sp = p->next;
> - const struct cclass *cp;
> - size_t len;
> - char *u;
> - char c;
> -
> - while (MORE() && isalpha(PEEK()))
> - NEXT();
> - len = p->next - sp;
> - for (cp = cclasses; cp->name != NULL; cp++)
> - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
> - break;
> - if (cp->name == NULL) {
> - /* oops, didn't find it */
> - SETERROR(REG_ECTYPE);
> - return;
> - }
> -
> - u = cp->chars;
> - while ((c = *u++) != '\0')
> - CHadd(cs, c);
> - for (u = cp->multis; *u != '\0'; u += strlen(u) + 1)
> - MCadd(p, cs, u);
> -}
> -
> -/*
> - - p_b_eclass - parse an equivalence-class name and deal with it
> - *
> - * This implementation is incomplete. xxx
> - */
> -static void
> -p_b_eclass(struct parse *p, cset *cs)
> -{
> - char c;
> -
> - c = p_b_coll_elem(p, '=');
> - CHadd(cs, c);
> -}
> -
> -/*
> - - p_b_symbol - parse a character or [..]ed multicharacter collating symbol
> - */
> -static char /* value of symbol */
> -p_b_symbol(struct parse *p)
> -{
> - char value;
> -
> - REQUIRE(MORE(), REG_EBRACK);
> - if (!EATTWO('[', '.'))
> - return(GETNEXT());
> -
> - /* collating symbol */
> - value = p_b_coll_elem(p, '.');
> - REQUIRE(EATTWO('.', ']'), REG_ECOLLATE);
> - return(value);
> -}
> -
> -/*
> - - p_b_coll_elem - parse a collating-element name and look it up
> - */
> -static char /* value of collating element */
> -p_b_coll_elem(struct parse *p,
> - int endc) /* name ended by endc,']' */
> -{
> - char *sp = p->next;
> - const struct cname *cp;
> - int len;
> -
> - while (MORE() && !SEETWO(endc, ']'))
> - NEXT();
> - if (!MORE()) {
> - SETERROR(REG_EBRACK);
> - return(0);
> - }
> - len = p->next - sp;
> - for (cp = cnames; cp->name != NULL; cp++)
> - if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
> - return(cp->code); /* known name */
> - if (len == 1)
> - return(*sp); /* single character */
> - SETERROR(REG_ECOLLATE); /* neither */
> - return(0);
> -}
> -
> -/*
> - - othercase - return the case counterpart of an alphabetic
> - */
> -static char /* if no counterpart, return ch */
> -othercase(int ch)
> -{
> - ch = (uch)ch;
> - assert(isalpha(ch));
> - if (isupper(ch))
> - return ((uch)tolower(ch));
> - else if (islower(ch))
> - return ((uch)toupper(ch));
> - else /* peculiar, but could happen */
> - return(ch);
> -}
> -
> -/*
> - - bothcases - emit a dualcase version of a two-case character
> - *
> - * Boy, is this implementation ever a kludge...
> - */
> -static void
> -bothcases(struct parse *p, int ch)
> -{
> - char *oldnext = p->next;
> - char *oldend = p->end;
> - char bracket[3];
> -
> - ch = (uch)ch;
> - assert(othercase(ch) != ch); /* p_bracket() would recurse */
> - p->next = bracket;
> - p->end = bracket+2;
> - bracket[0] = ch;
> - bracket[1] = ']';
> - bracket[2] = '\0';
> - p_bracket(p);
> - assert(p->next == bracket+2);
> - p->next = oldnext;
> - p->end = oldend;
> -}
> -
> -/*
> - - ordinary - emit an ordinary character
> - */
> -static void
> -ordinary(struct parse *p, int ch)
> -{
> - cat_t *cap = p->g->categories;
> -
> - if ((p->g->cflags®_ICASE) && isalpha((uch)ch) && othercase(ch) != ch)
> - bothcases(p, ch);
> - else {
> - EMIT(OCHAR, (uch)ch);
> - if (cap[ch] == 0)
> - cap[ch] = p->g->ncategories++;
> - }
> -}
> -
> -/*
> - - nonnewline - emit REG_NEWLINE version of OANY
> - *
> - * Boy, is this implementation ever a kludge...
> - */
> -static void
> -nonnewline(struct parse *p)
> -{
> - char *oldnext = p->next;
> - char *oldend = p->end;
> - char bracket[4];
> -
> - p->next = bracket;
> - p->end = bracket+3;
> - bracket[0] = '^';
> - bracket[1] = '\n';
> - bracket[2] = ']';
> - bracket[3] = '\0';
> - p_bracket(p);
> - assert(p->next == bracket+3);
> - p->next = oldnext;
> - p->end = oldend;
> -}
> -
> -/*
> - - repeat - generate code for a bounded repetition, recursively if needed
> - */
> -static void
> -repeat(struct parse *p,
> - sopno start, /* operand from here to end of strip */
> - int from, /* repeated from this number */
> - int to) /* to this number of times (maybe INFINITY) */
> -{
> - sopno finish = HERE();
> -# define N 2
> -# define INF 3
> -# define REP(f, t) ((f)*8 + (t))
> -# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N)
> - sopno copy;
> -
> - if (p->error != 0) /* head off possible runaway recursion */
> - return;
> -
> - assert(from <= to);
> -
> - switch (REP(MAP(from), MAP(to))) {
> - case REP(0, 0): /* must be user doing this */
> - DROP(finish-start); /* drop the operand */
> - break;
> - case REP(0, 1): /* as x{1,1}? */
> - case REP(0, N): /* as x{1,n}? */
> - case REP(0, INF): /* as x{1,}? */
> - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
> - INSERT(OCH_, start); /* offset is wrong... */
> - repeat(p, start+1, 1, to);
> - ASTERN(OOR1, start);
> - AHEAD(start); /* ... fix it */
> - EMIT(OOR2, 0);
> - AHEAD(THERE());
> - ASTERN(O_CH, THERETHERE());
> - break;
> - case REP(1, 1): /* trivial case */
> - /* done */
> - break;
> - case REP(1, N): /* as x?x{1,n-1} */
> - /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
> - INSERT(OCH_, start);
> - ASTERN(OOR1, start);
> - AHEAD(start);
> - EMIT(OOR2, 0); /* offset very wrong... */
> - AHEAD(THERE()); /* ...so fix it */
> - ASTERN(O_CH, THERETHERE());
> - copy = dupl(p, start+1, finish+1);
> - assert(copy == finish+4);
> - repeat(p, copy, 1, to-1);
> - break;
> - case REP(1, INF): /* as x+ */
> - INSERT(OPLUS_, start);
> - ASTERN(O_PLUS, start);
> - break;
> - case REP(N, N): /* as xx{m-1,n-1} */
> - copy = dupl(p, start, finish);
> - repeat(p, copy, from-1, to-1);
> - break;
> - case REP(N, INF): /* as xx{n-1,INF} */
> - copy = dupl(p, start, finish);
> - repeat(p, copy, from-1, to);
> - break;
> - default: /* "can't happen" */
> - SETERROR(REG_ASSERT); /* just in case */
> - break;
> - }
> -}
> -
> -/*
> - - seterr - set an error condition
> - */
> -static int /* useless but makes type checking happy */
> -seterr(struct parse *p, int e)
> -{
> - if (p->error == 0) /* keep earliest error condition */
> - p->error = e;
> - p->next = nuls; /* try to bring things to a halt */
> - p->end = nuls;
> - return(0); /* make the return value well-defined */
> -}
> -
> -/*
> - - allocset - allocate a set of characters for []
> - */
> -static cset *
> -allocset(struct parse *p)
> -{
> - int no = p->g->ncsets++;
> - size_t nc;
> - size_t nbytes;
> - cset *cs;
> - size_t css = (size_t)p->g->csetsize;
> - int i;
> -
> - if (no >= p->ncsalloc) { /* need another column of space */
> - void *ptr;
> -
> - p->ncsalloc += CHAR_BIT;
> - nc = p->ncsalloc;
> - assert(nc % CHAR_BIT == 0);
> - nbytes = nc / CHAR_BIT * css;
> -
> - ptr = (cset *)realloc((char *)p->g->sets, nc * sizeof(cset));
> - if (ptr == NULL)
> - goto nomem;
> - p->g->sets = ptr;
> -
> - ptr = (uch *)realloc((char *)p->g->setbits, nbytes);
> - if (ptr == NULL)
> - goto nomem;
> - p->g->setbits = ptr;
> -
> - for (i = 0; i < no; i++)
> - p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT);
> -
> - (void) memset((char *)p->g->setbits + (nbytes - css), 0, css);
> - }
> - /* XXX should not happen */
> - if (p->g->sets == NULL || p->g->setbits == NULL)
> - goto nomem;
> -
> - cs = &p->g->sets[no];
> - cs->ptr = p->g->setbits + css*((no)/CHAR_BIT);
> - cs->mask = 1 << ((no) % CHAR_BIT);
> - cs->hash = 0;
> - cs->smultis = 0;
> - cs->multis = NULL;
> -
> - return(cs);
> -nomem:
> - free(p->g->sets);
> - p->g->sets = NULL;
> - free(p->g->setbits);
> - p->g->setbits = NULL;
> -
> - SETERROR(REG_ESPACE);
> - /* caller's responsibility not to do set ops */
> - return(NULL);
> -}
> -
> -/*
> - - freeset - free a now-unused set
> - */
> -static void
> -freeset(struct parse *p, cset *cs)
> -{
> - int i;
> - cset *top = &p->g->sets[p->g->ncsets];
> - size_t css = (size_t)p->g->csetsize;
> -
> - for (i = 0; i < (ssize_t)css; i++)
> - CHsub(cs, i);
> - if (cs == top-1) /* recover only the easy case */
> - p->g->ncsets--;
> -}
> -
> -/*
> - - freezeset - final processing on a set of characters
> - *
> - * The main task here is merging identical sets. This is usually a waste
> - * of time (although the hash code minimizes the overhead), but can win
> - * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash
> - * is done using addition rather than xor -- all ASCII [aA] sets xor to
> - * the same value!
> - */
> -static int /* set number */
> -freezeset(struct parse *p, cset *cs)
> -{
> - uch h = cs->hash;
> - int i;
> - cset *top = &p->g->sets[p->g->ncsets];
> - cset *cs2;
> - size_t css = (size_t)p->g->csetsize;
> -
> - /* look for an earlier one which is the same */
> - for (cs2 = &p->g->sets[0]; cs2 < top; cs2++)
> - if (cs2->hash == h && cs2 != cs) {
> - /* maybe */
> - for (i = 0; i < (ssize_t)css; i++)
> - if (!!CHIN(cs2, i) != !!CHIN(cs, i))
> - break; /* no */
> - if (i == (ssize_t)css)
> - break; /* yes */
> - }
> -
> - if (cs2 < top) { /* found one */
> - freeset(p, cs);
> - cs = cs2;
> - }
> -
> - return((int)(cs - p->g->sets));
> -}
> -
> -/*
> - - firstch - return first character in a set (which must have at least one)
> - */
> -static int /* character; there is no "none" value */
> -firstch(struct parse *p, cset *cs)
> -{
> - int i;
> - size_t css = (size_t)p->g->csetsize;
> -
> - for (i = 0; i < (ssize_t)css; i++)
> - if (CHIN(cs, i))
> - return((char)i);
> - assert(never);
> - return(0); /* arbitrary */
> -}
> -
> -/*
> - - nch - number of characters in a set
> - */
> -static int
> -nch(struct parse *p, cset *cs)
> -{
> - int i;
> - size_t css = (size_t)p->g->csetsize;
> - int n = 0;
> -
> - for (i = 0; i < (ssize_t)css; i++)
> - if (CHIN(cs, i))
> - n++;
> - return(n);
> -}
> -
> -/*
> - - mcadd - add a collating element to a cset
> - */
> -static void
> -mcadd( struct parse *p, cset *cs, char *cp)
> -{
> - size_t oldend = cs->smultis;
> - void *np;
> -
> - cs->smultis += strlen(cp) + 1;
> - np = realloc(cs->multis, cs->smultis);
> - if (np == NULL) {
> - if (cs->multis)
> - free(cs->multis);
> - cs->multis = NULL;
> - SETERROR(REG_ESPACE);
> - return;
> - }
> - cs->multis = np;
> -
> - strlcpy(cs->multis + oldend - 1, cp, cs->smultis - oldend + 1);
> -}
> -
> -/*
> - - mcinvert - invert the list of collating elements in a cset
> - *
> - * This would have to know the set of possibilities. Implementation
> - * is deferred.
> - */
> -/* ARGSUSED */
> -static void
> -mcinvert(struct parse *p, cset *cs)
> -{
> - assert(cs->multis == NULL); /* xxx */
> -}
> -
> -/*
> - - mccase - add case counterparts of the list of collating elements in a cset
> - *
> - * This would have to know the set of possibilities. Implementation
> - * is deferred.
> - */
> -/* ARGSUSED */
> -static void
> -mccase(struct parse *p, cset *cs)
> -{
> - assert(cs->multis == NULL); /* xxx */
> -}
> -
> -/*
> - - isinsets - is this character in any sets?
> - */
> -static int /* predicate */
> -isinsets(struct re_guts *g, int c)
> -{
> - uch *col;
> - int i;
> - int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
> - unsigned uc = (uch)c;
> -
> - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
> - if (col[uc] != 0)
> - return(1);
> - return(0);
> -}
> -
> -/*
> - - samesets - are these two characters in exactly the same sets?
> - */
> -static int /* predicate */
> -samesets(struct re_guts *g, int c1, int c2)
> -{
> - uch *col;
> - int i;
> - int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT;
> - unsigned uc1 = (uch)c1;
> - unsigned uc2 = (uch)c2;
> -
> - for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize)
> - if (col[uc1] != col[uc2])
> - return(0);
> - return(1);
> -}
> -
> -/*
> - - categorize - sort out character categories
> - */
> -static void
> -categorize(struct parse *p, struct re_guts *g)
> -{
> - cat_t *cats = g->categories;
> - int c;
> - int c2;
> - cat_t cat;
> -
> - /* avoid making error situations worse */
> - if (p->error != 0)
> - return;
> -
> - for (c = CHAR_MIN; c <= CHAR_MAX; c++)
> - if (cats[c] == 0 && isinsets(g, c)) {
> - cat = g->ncategories++;
> - cats[c] = cat;
> - for (c2 = c+1; c2 <= CHAR_MAX; c2++)
> - if (cats[c2] == 0 && samesets(g, c, c2))
> - cats[c2] = cat;
> - }
> -}
> -
> -/*
> - - dupl - emit a duplicate of a bunch of sops
> - */
> -static sopno /* start of duplicate */
> -dupl(struct parse *p,
> - sopno start, /* from here */
> - sopno finish) /* to this less one */
> -{
> - sopno ret = HERE();
> - sopno len = finish - start;
> -
> - assert(finish >= start);
> - if (len == 0)
> - return(ret);
> - enlarge(p, p->ssize + len); /* this many unexpected additions */
> - assert(p->ssize >= p->slen + len);
> - (void) memcpy((char *)(p->strip + p->slen),
> - (char *)(p->strip + start), (size_t)len*sizeof(sop));
> - p->slen += len;
> - return(ret);
> -}
> -
> -/*
> - - doemit - emit a strip operator
> - *
> - * It might seem better to implement this as a macro with a function as
> - * hard-case backup, but it's just too big and messy unless there are
> - * some changes to the data structures. Maybe later.
> - */
> -static void
> -doemit(struct parse *p, sop op, size_t opnd)
> -{
> - /* avoid making error situations worse */
> - if (p->error != 0)
> - return;
> -
> - /* deal with oversize operands ("can't happen", more or less) */
> - assert(opnd < 1<<OPSHIFT);
> -
> - /* deal with undersized strip */
> - if (p->slen >= p->ssize)
> - enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */
> - assert(p->slen < p->ssize);
> -
> - /* finally, it's all reduced to the easy case */
> - p->strip[p->slen++] = SOP(op, opnd);
> -}
> -
> -/*
> - - doinsert - insert a sop into the strip
> - */
> -static void
> -doinsert(struct parse *p, sop op, size_t opnd, sopno pos)
> -{
> - sopno sn;
> - sop s;
> - int i;
> -
> - /* avoid making error situations worse */
> - if (p->error != 0)
> - return;
> -
> - sn = HERE();
> - EMIT(op, opnd); /* do checks, ensure space */
> - assert(HERE() == sn+1);
> - s = p->strip[sn];
> -
> - /* adjust paren pointers */
> - assert(pos > 0);
> - for (i = 1; i < NPAREN; i++) {
> - if (p->pbegin[i] >= pos) {
> - p->pbegin[i]++;
> - }
> - if (p->pend[i] >= pos) {
> - p->pend[i]++;
> - }
> - }
> -
> - memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos],
> - (HERE()-pos-1)*sizeof(sop));
> - p->strip[pos] = s;
> -}
> -
> -/*
> - - dofwd - complete a forward reference
> - */
> -static void
> -dofwd(struct parse *p, sopno pos, sop value)
> -{
> - /* avoid making error situations worse */
> - if (p->error != 0)
> - return;
> -
> - assert(value < 1<<OPSHIFT);
> - p->strip[pos] = OP(p->strip[pos]) | value;
> -}
> -
> -/*
> - - enlarge - enlarge the strip
> - */
> -static void
> -enlarge(struct parse *p, sopno size)
> -{
> - sop *sp;
> -
> - if (p->ssize >= size)
> - return;
> -
> - sp = (sop *)realloc(p->strip, size*sizeof(sop));
> - if (sp == NULL) {
> - SETERROR(REG_ESPACE);
> - return;
> - }
> - p->strip = sp;
> - p->ssize = size;
> -}
> -
> -/*
> - - stripsnug - compact the strip
> - */
> -static void
> -stripsnug(struct parse *p, struct re_guts *g)
> -{
> - g->nstates = p->slen;
> - g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop));
> - if (g->strip == NULL) {
> - SETERROR(REG_ESPACE);
> - g->strip = p->strip;
> - }
> -}
> -
> -/*
> - - findmust - fill in must and mlen with longest mandatory literal string
> - *
> - * This algorithm could do fancy things like analyzing the operands of |
> - * for common subsequences. Someday. This code is simple and finds most
> - * of the interesting cases.
> - *
> - * Note that must and mlen got initialized during setup.
> - */
> -static void
> -findmust(struct parse *p, struct re_guts *g)
> -{
> - sop *scan;
> - sop *start = NULL; /* start initialized in the default case, after that */
> - sop *newstart; /* newstart was initialized in the OCHAR case */
> - sopno newlen;
> - sop s;
> - char *cp;
> - sopno i;
> -
> - /* avoid making error situations worse */
> - if (p->error != 0)
> - return;
> -
> - /* find the longest OCHAR sequence in strip */
> - newlen = 0;
> - scan = g->strip + 1;
> - do {
> - s = *scan++;
> - switch (OP(s)) {
> - case OCHAR: /* sequence member */
> - if (newlen == 0) /* new sequence */
> - newstart = scan - 1;
> - newlen++;
> - break;
> - case OPLUS_: /* things that don't break one */
> - case OLPAREN:
> - case ORPAREN:
> - break;
> - case OQUEST_: /* things that must be skipped */
> - case OCH_:
> - scan--;
> - do {
> - scan += OPND(s);
> - s = *scan;
> - /* assert() interferes w debug printouts */
> - if (OP(s) != O_QUEST && OP(s) != O_CH &&
> - OP(s) != OOR2) {
> - g->iflags |= BAD;
> - return;
> - }
> - } while (OP(s) != O_QUEST && OP(s) != O_CH);
> - /* fallthrough */
> - default: /* things that break a sequence */
> - if (newlen > g->mlen) { /* ends one */
> - start = newstart;
> - g->mlen = newlen;
> - }
> - newlen = 0;
> - break;
> - }
> - } while (OP(s) != OEND);
> -
> - if (g->mlen == 0) /* there isn't one */
> - return;
> -
> - /* turn it into a character string */
> - g->must = malloc((size_t)g->mlen + 1);
> - if (g->must == NULL) { /* argh; just forget it */
> - g->mlen = 0;
> - return;
> - }
> - cp = g->must;
> - scan = start;
> - for (i = g->mlen; i > 0; i--) {
> - while (OP(s = *scan++) != OCHAR)
> - continue;
> - assert(cp < g->must + g->mlen);
> - *cp++ = (char)OPND(s);
> - }
> - assert(cp == g->must + g->mlen);
> - *cp++ = '\0'; /* just on general principles */
> -}
> -
> -/*
> - - pluscount - count + nesting
> - */
> -static sopno /* nesting depth */
> -pluscount(struct parse *p, struct re_guts *g)
> -{
> - sop *scan;
> - sop s;
> - sopno plusnest = 0;
> - sopno maxnest = 0;
> -
> - if (p->error != 0)
> - return(0); /* there may not be an OEND */
> -
> - scan = g->strip + 1;
> - do {
> - s = *scan++;
> - switch (OP(s)) {
> - case OPLUS_:
> - plusnest++;
> - break;
> - case O_PLUS:
> - if (plusnest > maxnest)
> - maxnest = plusnest;
> - plusnest--;
> - break;
> - }
> - } while (OP(s) != OEND);
> - if (plusnest != 0)
> - g->iflags |= BAD;
> - return(maxnest);
> -}
> diff --git a/android/regex/regerror.c b/android/regex/regerror.c
> deleted file mode 100644
> index 838ec8f..0000000
> --- a/android/regex/regerror.c
> +++ /dev/null
> @@ -1,130 +0,0 @@
> -/* $OpenBSD: regerror.c,v 1.13 2005/08/05 13:03:00 espie Exp $ */
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regerror.c 8.4 (Berkeley) 3/20/94
> - */
> -
> -#include <sys/types.h>
> -#include <stdio.h>
> -#include <string.h>
> -#include <ctype.h>
> -#include <limits.h>
> -#include <stdlib.h>
> -#include <regex.h>
> -
> -#include "utils.h"
> -
> -static char *regatoi(const regex_t *, char *, int);
> -
> -static const struct rerr {
> - int code;
> - char *name;
> - char *explain;
> -} rerrs[] = {
> - { REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match" },
> - { REG_BADPAT, "REG_BADPAT", "invalid regular expression" },
> - { REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" },
> - { REG_ECTYPE, "REG_ECTYPE", "invalid character class" },
> - { REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)" },
> - { REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" },
> - { REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced" },
> - { REG_EPAREN, "REG_EPAREN", "parentheses not balanced" },
> - { REG_EBRACE, "REG_EBRACE", "braces not balanced" },
> - { REG_BADBR, "REG_BADBR", "invalid repetition count(s)" },
> - { REG_ERANGE, "REG_ERANGE", "invalid character range" },
> - { REG_ESPACE, "REG_ESPACE", "out of memory" },
> - { REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid" },
> - { REG_EMPTY, "REG_EMPTY", "empty (sub)expression" },
> - { REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" },
> - { REG_INVARG, "REG_INVARG", "invalid argument to regex routine" },
> - { 0, "", "*** unknown regexp error code ***" }
> -};
> -
> -/*
> - - regerror - the interface to error numbers
> - = extern size_t regerror(int, const regex_t *, char *, size_t);
> - */
> -/* ARGSUSED */
> -size_t
> -regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size)
> -{
> - const struct rerr *r;
> - size_t len;
> - int target = errcode &~ REG_ITOA;
> - char *s;
> - char convbuf[50];
> -
> - if (errcode == REG_ATOI)
> - s = regatoi(preg, convbuf, sizeof convbuf);
> - else {
> - for (r = rerrs; r->code != 0; r++)
> - if (r->code == target)
> - break;
> -
> - if (errcode®_ITOA) {
> - if (r->code != 0) {
> - assert(strlen(r->name) < sizeof(convbuf));
> - (void) strlcpy(convbuf, r->name, sizeof convbuf);
> - } else
> - (void)snprintf(convbuf, sizeof convbuf,
> - "REG_0x%x", target);
> - s = convbuf;
> - } else
> - s = r->explain;
> - }
> -
> - len = strlen(s) + 1;
> - if (errbuf_size > 0) {
> - strlcpy(errbuf, s, errbuf_size);
> - }
> -
> - return(len);
> -}
> -
> -/*
> - - regatoi - internal routine to implement REG_ATOI
> - */
> -static char *
> -regatoi(const regex_t *preg, char *localbuf, int localbufsize)
> -{
> - const struct rerr *r;
> -
> - for (r = rerrs; r->code != 0; r++)
> - if (strcmp(r->name, preg->re_endp) == 0)
> - break;
> - if (r->code == 0)
> - return("0");
> -
> - (void)snprintf(localbuf, localbufsize, "%d", r->code);
> - return(localbuf);
> -}
> diff --git a/android/regex/regex2.h b/android/regex/regex2.h
> deleted file mode 100644
> index 15e15bc..0000000
> --- a/android/regex/regex2.h
> +++ /dev/null
> @@ -1,157 +0,0 @@
> -/* $OpenBSD: regex2.h,v 1.7 2004/11/30 17:04:23 otto Exp $ */
> -
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regex2.h 8.4 (Berkeley) 3/20/94
> - */
> -
> -/*
> - * internals of regex_t
> - */
> -#define MAGIC1 ((('r'^0200)<<8) | 'e')
> -
> -/*
> - * The internal representation is a *strip*, a sequence of
> - * operators ending with an endmarker. (Some terminology etc. is a
> - * historical relic of earlier versions which used multiple strips.)
> - * Certain oddities in the representation are there to permit running
> - * the machinery backwards; in particular, any deviation from sequential
> - * flow must be marked at both its source and its destination. Some
> - * fine points:
> - *
> - * - OPLUS_ and O_PLUS are *inside* the loop they create.
> - * - OQUEST_ and O_QUEST are *outside* the bypass they create.
> - * - OCH_ and O_CH are *outside* the multi-way branch they create, while
> - * OOR1 and OOR2 are respectively the end and the beginning of one of
> - * the branches. Note that there is an implicit OOR2 following OCH_
> - * and an implicit OOR1 preceding O_CH.
> - *
> - * In state representations, an operator's bit is on to signify a state
> - * immediately *preceding* "execution" of that operator.
> - */
> -typedef unsigned long sop; /* strip operator */
> -typedef long sopno;
> -#define OPRMASK 0xf8000000LU
> -#define OPDMASK 0x07ffffffLU
> -#define OPSHIFT ((unsigned)27)
> -#define OP(n) ((n)&OPRMASK)
> -#define OPND(n) ((n)&OPDMASK)
> -#define SOP(op, opnd) ((op)|(opnd))
> -/* operators meaning operand */
> -/* (back, fwd are offsets) */
> -#define OEND (1LU<<OPSHIFT) /* endmarker - */
> -#define OCHAR (2LU<<OPSHIFT) /* character unsigned char */
> -#define OBOL (3LU<<OPSHIFT) /* left anchor - */
> -#define OEOL (4LU<<OPSHIFT) /* right anchor - */
> -#define OANY (5LU<<OPSHIFT) /* . - */
> -#define OANYOF (6LU<<OPSHIFT) /* [...] set number */
> -#define OBACK_ (7LU<<OPSHIFT) /* begin \d paren number */
> -#define O_BACK (8LU<<OPSHIFT) /* end \d paren number */
> -#define OPLUS_ (9LU<<OPSHIFT) /* + prefix fwd to suffix */
> -#define O_PLUS (10LU<<OPSHIFT) /* + suffix back to prefix */
> -#define OQUEST_ (11LU<<OPSHIFT) /* ? prefix fwd to suffix */
> -#define O_QUEST (12LU<<OPSHIFT) /* ? suffix back to prefix */
> -#define OLPAREN (13LU<<OPSHIFT) /* ( fwd to ) */
> -#define ORPAREN (14LU<<OPSHIFT) /* ) back to ( */
> -#define OCH_ (15LU<<OPSHIFT) /* begin choice fwd to OOR2 */
> -#define OOR1 (16LU<<OPSHIFT) /* | pt. 1 back to OOR1 or OCH_ */
> -#define OOR2 (17LU<<OPSHIFT) /* | pt. 2 fwd to OOR2 or O_CH */
> -#define O_CH (18LU<<OPSHIFT) /* end choice back to OOR1 */
> -#define OBOW (19LU<<OPSHIFT) /* begin word - */
> -#define OEOW (20LU<<OPSHIFT) /* end word - */
> -
> -/*
> - * Structure for [] character-set representation. Character sets are
> - * done as bit vectors, grouped 8 to a byte vector for compactness.
> - * The individual set therefore has both a pointer to the byte vector
> - * and a mask to pick out the relevant bit of each byte. A hash code
> - * simplifies testing whether two sets could be identical.
> - *
> - * This will get trickier for multicharacter collating elements. As
> - * preliminary hooks for dealing with such things, we also carry along
> - * a string of multi-character elements, and decide the size of the
> - * vectors at run time.
> - */
> -typedef struct {
> - uch *ptr; /* -> uch [csetsize] */
> - uch mask; /* bit within array */
> - uch hash; /* hash code */
> - size_t smultis;
> - char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */
> -} cset;
> -/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */
> -#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c))
> -#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c))
> -#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask)
> -#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */
> -#define MCsub(p, cs, cp) mcsub(p, cs, cp)
> -#define MCin(p, cs, cp) mcin(p, cs, cp)
> -
> -/* stuff for character categories */
> -typedef unsigned char cat_t;
> -
> -/*
> - * main compiled-expression structure
> - */
> -struct re_guts {
> - int magic;
> -# define MAGIC2 ((('R'^0200)<<8)|'E')
> - sop *strip; /* malloced area for strip */
> - int csetsize; /* number of bits in a cset vector */
> - int ncsets; /* number of csets in use */
> - cset *sets; /* -> cset [ncsets] */
> - uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
> - int cflags; /* copy of regcomp() cflags argument */
> - sopno nstates; /* = number of sops */
> - sopno firststate; /* the initial OEND (normally 0) */
> - sopno laststate; /* the final OEND */
> - int iflags; /* internal flags */
> -# define USEBOL 01 /* used ^ */
> -# define USEEOL 02 /* used $ */
> -# define BAD 04 /* something wrong */
> - int nbol; /* number of ^ used */
> - int neol; /* number of $ used */
> - int ncategories; /* how many character categories */
> - cat_t *categories; /* ->catspace[-CHAR_MIN] */
> - char *must; /* match must contain this string */
> - int mlen; /* length of must */
> - size_t nsub; /* copy of re_nsub */
> - int backrefs; /* does it use back references? */
> - sopno nplus; /* how deep does it nest +s? */
> - /* catspace must be last */
> - cat_t catspace[1]; /* actually [NC] */
> -};
> -
> -/* misc utilities */
> -#define OUT (CHAR_MAX+1) /* a non-character value */
> -#define ISWORD(c) (isalnum(c) || (c) == '_')
> diff --git a/android/regex/regexec.c b/android/regex/regexec.c
> deleted file mode 100644
> index 6feed3b..0000000
> --- a/android/regex/regexec.c
> +++ /dev/null
> @@ -1,160 +0,0 @@
> -/* $OpenBSD: regexec.c,v 1.11 2005/08/05 13:03:00 espie Exp $ */
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regexec.c 8.3 (Berkeley) 3/20/94
> - */
> -
> -/*
> - * the outer shell of regexec()
> - *
> - * This file includes engine.c *twice*, after muchos fiddling with the
> - * macros that code uses. This lets the same code operate on two different
> - * representations for state sets.
> - */
> -#include <sys/types.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <limits.h>
> -#include <ctype.h>
> -#include <regex.h>
> -
> -#include "utils.h"
> -#include "regex2.h"
> -
> -/* macros for manipulating states, small version */
> -#define states long
> -#define states1 states /* for later use in regexec() decision */
> -#define CLEAR(v) ((v) = 0)
> -#define SET0(v, n) ((v) &= ~((unsigned long)1 << (n)))
> -#define SET1(v, n) ((v) |= (unsigned long)1 << (n))
> -#define ISSET(v, n) (((v) & ((unsigned long)1 << (n))) != 0)
> -#define ASSIGN(d, s) ((d) = (s))
> -#define EQ(a, b) ((a) == (b))
> -#define STATEVARS long dummy /* dummy version */
> -#define STATESETUP(m, n) /* nothing */
> -#define STATETEARDOWN(m) /* nothing */
> -#define SETUP(v) ((v) = 0)
> -#define onestate long
> -#define INIT(o, n) ((o) = (unsigned long)1 << (n))
> -#define INC(o) ((o) <<= 1)
> -#define ISSTATEIN(v, o) (((v) & (o)) != 0)
> -/* some abbreviations; note that some of these know variable names! */
> -/* do "if I'm here, I can also be there" etc without branches */
> -#define FWD(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) << (n))
> -#define BACK(dst, src, n) ((dst) |= ((unsigned long)(src)&(here)) >> (n))
> -#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0)
> -/* function names */
> -#define SNAMES /* engine.c looks after details */
> -
> -#include "engine.c"
> -
> -/* now undo things */
> -#undef states
> -#undef CLEAR
> -#undef SET0
> -#undef SET1
> -#undef ISSET
> -#undef ASSIGN
> -#undef EQ
> -#undef STATEVARS
> -#undef STATESETUP
> -#undef STATETEARDOWN
> -#undef SETUP
> -#undef onestate
> -#undef INIT
> -#undef INC
> -#undef ISSTATEIN
> -#undef FWD
> -#undef BACK
> -#undef ISSETBACK
> -#undef SNAMES
> -
> -/* macros for manipulating states, large version */
> -#define states char *
> -#define CLEAR(v) memset(v, 0, m->g->nstates)
> -#define SET0(v, n) ((v)[n] = 0)
> -#define SET1(v, n) ((v)[n] = 1)
> -#define ISSET(v, n) ((v)[n])
> -#define ASSIGN(d, s) memcpy(d, s, m->g->nstates)
> -#define EQ(a, b) (memcmp(a, b, m->g->nstates) == 0)
> -#define STATEVARS long vn; char *space
> -#define STATESETUP(m, nv) { (m)->space = malloc((nv)*(m)->g->nstates); \
> - if ((m)->space == NULL) return(REG_ESPACE); \
> - (m)->vn = 0; }
> -#define STATETEARDOWN(m) { free((m)->space); }
> -#define SETUP(v) ((v) = &m->space[m->vn++ * m->g->nstates])
> -#define onestate long
> -#define INIT(o, n) ((o) = (n))
> -#define INC(o) ((o)++)
> -#define ISSTATEIN(v, o) ((v)[o])
> -/* some abbreviations; note that some of these know variable names! */
> -/* do "if I'm here, I can also be there" etc without branches */
> -#define FWD(dst, src, n) ((dst)[here+(n)] |= (src)[here])
> -#define BACK(dst, src, n) ((dst)[here-(n)] |= (src)[here])
> -#define ISSETBACK(v, n) ((v)[here - (n)])
> -/* function names */
> -#define LNAMES /* flag */
> -
> -#include "engine.c"
> -
> -/*
> - - regexec - interface for matching
> - *
> - * We put this here so we can exploit knowledge of the state representation
> - * when choosing which matcher to call. Also, by this point the matchers
> - * have been prototyped.
> - */
> -int /* 0 success, REG_NOMATCH failure */
> -regexec(const regex_t *preg, const char *string, size_t nmatch,
> - regmatch_t pmatch[], int eflags)
> -{
> - struct re_guts *g = preg->re_g;
> -#ifdef REDEBUG
> -# define GOODFLAGS(f) (f)
> -#else
> -# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
> -#endif
> -
> - if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
> - return(REG_BADPAT);
> - assert(!(g->iflags&BAD));
> - if (g->iflags&BAD) /* backstop for no-debug case */
> - return(REG_BADPAT);
> - eflags = GOODFLAGS(eflags);
> -
> - if (g->nstates <= (int)(CHAR_BIT*sizeof(states1)) && !(eflags®_LARGE))
> - return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
> - else
> - return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
> -}
> diff --git a/android/regex/regfree.c b/android/regex/regfree.c
> deleted file mode 100644
> index a57eba3..0000000
> --- a/android/regex/regfree.c
> +++ /dev/null
> @@ -1,71 +0,0 @@
> -/* $OpenBSD: regfree.c,v 1.7 2005/08/05 13:03:00 espie Exp $ */
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)regfree.c 8.3 (Berkeley) 3/20/94
> - */
> -
> -#include <sys/types.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <regex.h>
> -
> -#include "utils.h"
> -#include "regex2.h"
> -
> -/*
> - - regfree - free everything
> - */
> -void
> -regfree(regex_t *preg)
> -{
> - struct re_guts *g;
> -
> - if (preg->re_magic != MAGIC1) /* oops */
> - return; /* nice to complain, but hard */
> -
> - g = preg->re_g;
> - if (g == NULL || g->magic != MAGIC2) /* oops again */
> - return;
> - preg->re_magic = 0; /* mark it invalid */
> - g->magic = 0; /* mark it invalid */
> -
> - if (g->strip != NULL)
> - free((char *)g->strip);
> - if (g->sets != NULL)
> - free((char *)g->sets);
> - if (g->setbits != NULL)
> - free((char *)g->setbits);
> - if (g->must != NULL)
> - free(g->must);
> - free((char *)g);
> -}
> diff --git a/android/regex/utils.h b/android/regex/utils.h
> deleted file mode 100644
> index 3e184fc..0000000
> --- a/android/regex/utils.h
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -/* $OpenBSD: utils.h,v 1.4 2003/06/02 20:18:36 millert Exp $ */
> -
> -/*-
> - * Copyright (c) 1992, 1993, 1994 Henry Spencer.
> - * Copyright (c) 1992, 1993, 1994
> - * The Regents of the University of California. All rights reserved.
> - *
> - * This code is derived from software contributed to Berkeley by
> - * Henry Spencer.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - * notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - * notice, this list of conditions and the following disclaimer in the
> - * documentation and/or other materials provided with the distribution.
> - * 3. Neither the name of the University nor the names of its contributors
> - * may be used to endorse or promote products derived from this software
> - * without specific prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
> - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
> - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
> - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
> - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
> - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
> - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - *
> - * @(#)utils.h 8.3 (Berkeley) 3/20/94
> - */
> -
> -/* utility definitions */
> -#define DUPMAX 255
> -#define INFINITY (DUPMAX + 1)
> -#define NC (CHAR_MAX - CHAR_MIN + 1)
> -typedef unsigned char uch;
> -
> -/* switch off assertions (if not already off) if no REDEBUG */
> -#ifndef REDEBUG
> -#ifndef NDEBUG
> -#define NDEBUG /* no assertions please */
> -#endif
> -#endif
> -#include <assert.h>
> -
> -/* for old systems with bcopy() but no memmove() */
> -#ifdef USEBCOPY
> -#define memmove(d, s, c) bcopy(s, d, c)
> -#endif
> diff --git a/make/Makefile.android b/make/Makefile.android
> index dc56b84..ed0c9e9 100644
> --- a/make/Makefile.android
> +++ b/make/Makefile.android
> @@ -44,20 +44,12 @@ SHAREDIR = $(DESTDIR)$(datarootdir)
> SRCS += $(wildcard src/unix/*.c src/linux/*.c)
> HDRS += $(wildcard src/unix/*.h src/linux/*.h)
>
> -# Android didn't add regex until android-8 so include this one
> -REGEX_SRCS = \
> - android/regex/regcomp.c \
> - android/regex/regerror.c \
> - android/regex/regexec.c \
> - android/regex/regfree.c
> -REGEX_OBJS = $(REGEX_SRCS:.c=.o)
> -
> CPPFLAGS += -DOLSRD_GLOBAL_CONF_FILE=\"$(CFGFILE)\"
> # bionic libc: missing declarations
> CPPFLAGS += -DINET_ADDRSTRLEN=16
> CPPFLAGS += -D'IPTOS_PREC(tos)=((tos)&0xe0)'
> CPPFLAGS += -D'IPTOS_TOS(tos)=((tos)&0x1e)'
> -# Android NDK is missing some Linux headers and regex, we have them here:
> +# Android NDK is missing some Linux headers: we have them here
> CPPFLAGS += -I$(TOPDIR)/android
>
> # Compilation flags from build/toolchains/arm-eabi-4.2.1/setup.mk
> @@ -105,7 +97,7 @@ NDK_BASE = /opt/android-ndk
> CURRENT_SYSTEM := $(shell uname -s | tr A-Z a-z)
> NDK_TOOLCHAIN_BASE = $(NDK_BASE)/toolchains/arm-linux-androideabi-4.4.3/prebuilt/$(CURRENT_SYSTEM)-x86
>
> -NDK_PLATFORM_VERSION = 4
> +NDK_PLATFORM_VERSION = 8
> NDK_SYSROOT = $(NDK_BASE)/platforms/android-$(NDK_PLATFORM_VERSION)/arch-arm
> CROSS_COMPILE = $(NDK_TOOLCHAIN_BASE)/bin/$(HOST)-
>
> @@ -116,19 +108,6 @@ ifeq ($(DEBUG),0)
> STRIP = $(CROSS_COMPILE)strip
> endif
>
> -
> -# The Android NDK didn't add proper regex support until android-8
> -# (2.2), so we include the Android files here, and build with
> -# -DPOSIX_MISTAKE like Android does.
> -$(REGEX_OBJS): $(REGEX_SRCS)
> - @echo "[CC] $<"
> - @$(CC) $(CFLAGS) $(CPPFLAGS) -DPOSIX_MISTAKE -c -o $@ $<
> -
> -regex: $(REGEX_OBJS)
> -
> -regex_clean:
> - rm -f $(REGEX_OBJS)
> -
> # Local Variables:
> # mode: makefile
> # End:
> --
> 1.7.11.7
>
More information about the Olsr-dev
mailing list