Merge "Switch to the current NetBSD regex implementation."
This commit is contained in:
commit
fe43c768ec
@ -9,7 +9,6 @@ libc_common_src_files := \
|
||||
unistd/abort.c \
|
||||
unistd/alarm.c \
|
||||
unistd/brk.c \
|
||||
unistd/creat.c \
|
||||
unistd/daemon.c \
|
||||
unistd/eventfd.c \
|
||||
unistd/exec.c \
|
||||
@ -328,13 +327,14 @@ libc_common_src_files := \
|
||||
netbsd/nameser/ns_netint.c \
|
||||
netbsd/nameser/ns_print.c \
|
||||
netbsd/nameser/ns_samedomain.c \
|
||||
regex/regcomp.c \
|
||||
regex/regerror.c \
|
||||
regex/regexec.c \
|
||||
regex/regfree.c \
|
||||
|
||||
libc_upstream_netbsd_src_files := \
|
||||
upstream-netbsd/libc/compat-43/creat.c \
|
||||
upstream-netbsd/libc/gen/nice.c \
|
||||
upstream-netbsd/libc/regex/regcomp.c \
|
||||
upstream-netbsd/libc/regex/regerror.c \
|
||||
upstream-netbsd/libc/regex/regexec.c \
|
||||
upstream-netbsd/libc/regex/regfree.c \
|
||||
upstream-netbsd/libc/stdlib/tdelete.c \
|
||||
upstream-netbsd/libc/stdlib/tfind.c \
|
||||
upstream-netbsd/libc/stdlib/tsearch.c \
|
||||
|
36
libc/NOTICE
36
libc/NOTICE
@ -2211,7 +2211,6 @@ SUCH DAMAGE.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
Copyright (c) 1992, 1993, 1994
|
||||
The Regents of the University of California. All rights reserved.
|
||||
|
||||
@ -2244,6 +2243,41 @@ SUCH DAMAGE.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
|
||||
Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
|
||||
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. All advertising materials mentioning features or use of this software
|
||||
must display the following acknowledgement:
|
||||
This product includes software developed by the University of
|
||||
California, Berkeley and its contributors.
|
||||
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 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) 1993
|
||||
The Regents of the University of California. All rights reserved.
|
||||
|
||||
|
@ -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);
|
||||
}
|
@ -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);
|
||||
}
|
@ -1,34 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2008 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.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int creat(const char* pathname, mode_t mode)
|
||||
{
|
||||
return open(pathname, O_WRONLY|O_TRUNC|O_CREAT, mode);
|
||||
}
|
@ -1,13 +1,9 @@
|
||||
/* $OpenBSD: utils.h,v 1.4 2003/06/02 20:18:36 millert Exp $ */
|
||||
/* $NetBSD: creat.c,v 1.10 2003/08/07 16:42:39 agc Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
/*
|
||||
* Copyright (c) 1989, 1993
|
||||
* 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:
|
||||
@ -31,25 +27,26 @@
|
||||
* 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;
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)creat.c 8.1 (Berkeley) 6/2/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: creat.c,v 1.10 2003/08/07 16:42:39 agc Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/* switch off assertions (if not already off) if no REDEBUG */
|
||||
#ifndef REDEBUG
|
||||
#ifndef NDEBUG
|
||||
#define NDEBUG /* no assertions please */
|
||||
#endif
|
||||
#endif
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
/* for old systems with bcopy() but no memmove() */
|
||||
#ifdef USEBCOPY
|
||||
#define memmove(d, s, c) bcopy(s, d, c)
|
||||
#endif
|
||||
int
|
||||
creat(const char *path, mode_t mode)
|
||||
{
|
||||
|
||||
_DIAGASSERT(path != NULL);
|
||||
|
||||
return(open(path, O_WRONLY|O_CREAT|O_TRUNC, mode));
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
/* $OpenBSD: cclass.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */
|
||||
/* $NetBSD: cclass.h,v 1.7 2003/08/07 16:43:19 agc Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -35,34 +34,71 @@
|
||||
* @(#)cclass.h 8.3 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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;
|
||||
const char *name;
|
||||
const char *chars;
|
||||
const char *multis;
|
||||
} cclasses[] = {
|
||||
{ "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\
|
||||
0123456789", ""} ,
|
||||
0123456789", "" },
|
||||
{ "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",
|
||||
""} ,
|
||||
{ "blank", " \t", ""} ,
|
||||
"" },
|
||||
{ "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", ""} ,
|
||||
\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 ", ""} ,
|
||||
"" },
|
||||
{ "space", "\t\n\v\f\r ", "" },
|
||||
{ "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
|
||||
""} ,
|
||||
"" },
|
||||
{ "xdigit", "0123456789ABCDEFabcdef",
|
||||
""} ,
|
||||
"" },
|
||||
{ NULL, 0, "" }
|
||||
};
|
@ -1,7 +1,6 @@
|
||||
/* $OpenBSD: cname.h,v 1.5 2003/06/02 20:18:36 millert Exp $ */
|
||||
/* $NetBSD: cname.h,v 1.7 2003/08/07 16:43:19 agc Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -35,9 +34,46 @@
|
||||
* @(#)cname.h 8.3 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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;
|
||||
const char *name;
|
||||
char code;
|
||||
} cnames[] = {
|
||||
{ "NUL", '\0' },
|
||||
@ -135,5 +171,5 @@ static const struct cname {
|
||||
{ "right-curly-bracket", '}' },
|
||||
{ "tilde", '~' },
|
||||
{ "DEL", '\177' },
|
||||
{ NULL, 0 }
|
||||
{ NULL, 0 },
|
||||
};
|
@ -1,7 +1,6 @@
|
||||
/* $OpenBSD: engine.c,v 1.15 2005/08/05 13:03:00 espie Exp $ */
|
||||
/* $NetBSD: engine.c,v 1.24 2012/03/13 21:13:42 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -35,6 +34,43 @@
|
||||
* @(#)engine.c 8.5 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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
|
||||
@ -72,11 +108,11 @@ 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] */
|
||||
const char *offp; /* offsets work from here */
|
||||
const char *beginp; /* start of string -- virtual NUL precedes */
|
||||
const char *endp; /* end of string -- virtual NUL here */
|
||||
const char *coldp; /* can be no match starting before here */
|
||||
const char **lastpos; /* [nplus+1] */
|
||||
STATEVARS;
|
||||
states st; /* current states */
|
||||
states fresh; /* states for a fresh start */
|
||||
@ -84,13 +120,18 @@ struct match {
|
||||
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
|
||||
/* ========= begin header generated by ./mkh ========= */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* === engine.c === */
|
||||
static int matcher(struct re_guts *g, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags);
|
||||
static const char *dissect(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
|
||||
static const char *backref(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst, sopno lev);
|
||||
static const char *fast(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
|
||||
static const char *slow(struct match *m, const char *start, const char *stop, sopno startst, sopno stopst);
|
||||
static states step(struct re_guts *g, sopno start, sopno stop, states bef, int ch, states aft);
|
||||
#define BOL (OUT+1)
|
||||
#define EOL (BOL+1)
|
||||
#define BOLEOL (BOL+2)
|
||||
@ -101,19 +142,24 @@ static states step(struct re_guts *, sopno, sopno, states, int, states);
|
||||
#define NONCHAR(c) ((c) > CHAR_MAX)
|
||||
#define NNONCHAR (CODEMAX-CHAR_MAX)
|
||||
#ifdef REDEBUG
|
||||
static void print(struct match *, char *, states, int, FILE *);
|
||||
static void print(struct match *m, char *caption, states st, int ch, FILE *d);
|
||||
#endif
|
||||
#ifdef REDEBUG
|
||||
static void at(struct match *, char *, char *, char *, sopno, sopno);
|
||||
static void at(struct match *m, char *title, char *start, char *stop, sopno startst, sopno stopst);
|
||||
#endif
|
||||
#ifdef REDEBUG
|
||||
static char *pchar(int);
|
||||
static char *pchar(int ch);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
/* ========= end header generated by ./mkh ========= */
|
||||
|
||||
#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)); }
|
||||
#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); }
|
||||
static int nope = 0;
|
||||
#else
|
||||
#define SP(t, s, c) /* nothing */
|
||||
@ -123,27 +169,39 @@ static int nope = 0;
|
||||
|
||||
/*
|
||||
- matcher - the actual matching engine
|
||||
== static int matcher(struct re_guts *g, char *string, \
|
||||
== size_t nmatch, regmatch_t pmatch[], int eflags);
|
||||
*/
|
||||
static int /* 0 success, REG_NOMATCH failure */
|
||||
matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
matcher(
|
||||
struct re_guts *g,
|
||||
const char *string,
|
||||
size_t nmatch,
|
||||
regmatch_t pmatch[],
|
||||
int eflags)
|
||||
{
|
||||
char *endp;
|
||||
int i;
|
||||
const char *endp;
|
||||
size_t i;
|
||||
struct match mv;
|
||||
struct match *m = &mv;
|
||||
char *dp;
|
||||
const char *dp;
|
||||
const sopno gf = g->firststate+1; /* +1 for OEND */
|
||||
const sopno gl = g->laststate;
|
||||
char *start;
|
||||
char *stop;
|
||||
const char *start;
|
||||
const char *stop;
|
||||
int error = 0;
|
||||
|
||||
_DIAGASSERT(g != NULL);
|
||||
_DIAGASSERT(string != NULL);
|
||||
/* pmatch checked below */
|
||||
|
||||
/* 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;
|
||||
_DIAGASSERT(pmatch != NULL);
|
||||
start = string + (size_t)pmatch[0].rm_so;
|
||||
stop = string + (size_t)pmatch[0].rm_eo;
|
||||
} else {
|
||||
start = string;
|
||||
stop = start + strlen(start);
|
||||
@ -154,8 +212,8 @@ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
/* 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)
|
||||
if (*dp == g->must[0] && (size_t)(stop - dp) >= g->mlen &&
|
||||
memcmp(dp, g->must, g->mlen) == 0)
|
||||
break;
|
||||
if (dp == stop) /* we didn't find g->must */
|
||||
return(REG_NOMATCH);
|
||||
@ -180,10 +238,8 @@ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
for (;;) {
|
||||
endp = fast(m, start, stop, gf, gl);
|
||||
if (endp == NULL) { /* a miss */
|
||||
free(m->pmatch);
|
||||
free(m->lastpos);
|
||||
STATETEARDOWN(m);
|
||||
return(REG_NOMATCH);
|
||||
error = REG_NOMATCH;
|
||||
goto done;
|
||||
}
|
||||
if (nmatch == 0 && !g->backrefs)
|
||||
break; /* no further info needed */
|
||||
@ -206,25 +262,24 @@ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) *
|
||||
sizeof(regmatch_t));
|
||||
if (m->pmatch == NULL) {
|
||||
STATETEARDOWN(m);
|
||||
return(REG_ESPACE);
|
||||
error = REG_ESPACE;
|
||||
goto done;
|
||||
}
|
||||
for (i = 1; i <= (int)m->g->nsub; i++)
|
||||
m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1;
|
||||
for (i = 1; i <= m->g->nsub; i++)
|
||||
m->pmatch[i].rm_so = m->pmatch[i].rm_eo = (regoff_t)-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 *));
|
||||
m->lastpos = malloc((g->nplus+1) *
|
||||
sizeof(const char *));
|
||||
if (g->nplus > 0 && m->lastpos == NULL) {
|
||||
free(m->pmatch);
|
||||
STATETEARDOWN(m);
|
||||
return(REG_ESPACE);
|
||||
error = REG_ESPACE;
|
||||
goto done;
|
||||
}
|
||||
NOTE("backref dissect");
|
||||
dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
|
||||
dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
|
||||
}
|
||||
if (dp != NULL)
|
||||
break;
|
||||
@ -242,12 +297,12 @@ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
/* 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);
|
||||
assert(m->pmatch[i].rm_so == (regoff_t)-1);
|
||||
assert(m->pmatch[i].rm_eo == (regoff_t)-1);
|
||||
}
|
||||
#endif
|
||||
NOTE("backoff dissect");
|
||||
dp = backref(m, m->coldp, endp, gf, gl, (sopno)0, 0);
|
||||
dp = backref(m, m->coldp, endp, gf, gl, (sopno)0);
|
||||
}
|
||||
assert(dp == NULL || dp == endp);
|
||||
if (dp != NULL) /* found a shorter one */
|
||||
@ -255,54 +310,72 @@ matcher(struct re_guts *g, char *string, size_t nmatch, regmatch_t pmatch[],
|
||||
|
||||
/* despite initial appearances, there is no match here */
|
||||
NOTE("false alarm");
|
||||
if (m->coldp == stop)
|
||||
break;
|
||||
start = m->coldp + 1; /* recycle starting later */
|
||||
assert(start <= stop);
|
||||
}
|
||||
|
||||
/* fill in the details if requested */
|
||||
if (nmatch > 0) {
|
||||
_DIAGASSERT(pmatch != NULL);
|
||||
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)
|
||||
for (i = 1; i < nmatch; i++)
|
||||
if (i <= m->g->nsub)
|
||||
pmatch[i] = m->pmatch[i];
|
||||
else {
|
||||
pmatch[i].rm_so = -1;
|
||||
pmatch[i].rm_eo = -1;
|
||||
pmatch[i].rm_so = (regoff_t)-1;
|
||||
pmatch[i].rm_eo = (regoff_t)-1;
|
||||
}
|
||||
}
|
||||
|
||||
if (m->pmatch != NULL)
|
||||
free((char *)m->pmatch);
|
||||
if (m->lastpos != NULL)
|
||||
free((char *)m->lastpos);
|
||||
done:
|
||||
if (m->pmatch != NULL) {
|
||||
free(m->pmatch);
|
||||
m->pmatch = NULL;
|
||||
}
|
||||
if (m->lastpos != NULL) {
|
||||
free(m->lastpos);
|
||||
m->lastpos = NULL;
|
||||
}
|
||||
STATETEARDOWN(m);
|
||||
return(0);
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
- dissect - figure out what matched what, no back references
|
||||
== static const char *dissect(struct match *m, const char *start, \
|
||||
== const char *stop, sopno startst, sopno stopst);
|
||||
*/
|
||||
static char * /* == stop (success) always */
|
||||
dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
static const char * /* == stop (success) always */
|
||||
dissect(
|
||||
struct match *m,
|
||||
const char *start,
|
||||
const 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 */
|
||||
const char *sp; /* start of string matched by it */
|
||||
const char *stp; /* string matched by it cannot pass here */
|
||||
const char *rest; /* start of rest of string */
|
||||
const 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;
|
||||
const char *ssp; /* start of string matched by subsubRE */
|
||||
const char *sep; /* end of string matched by subsubRE */
|
||||
const char *oldssp; /* previous ssp */
|
||||
#ifndef NDEBUG
|
||||
const char *dp;
|
||||
#endif
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(start != NULL);
|
||||
_DIAGASSERT(stop != NULL);
|
||||
|
||||
AT("diss", start, stop, startst, stopst);
|
||||
sp = start;
|
||||
@ -361,7 +434,12 @@ dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
esub = es - 1;
|
||||
/* did innards match? */
|
||||
if (slow(m, sp, rest, ssub, esub) != NULL) {
|
||||
dp = dissect(m, sp, rest, ssub, esub);
|
||||
#ifdef NDEBUG
|
||||
(void)
|
||||
#else
|
||||
dp =
|
||||
#endif
|
||||
dissect(m, sp, rest, ssub, esub);
|
||||
assert(dp == rest);
|
||||
} else /* no */
|
||||
assert(sp == rest);
|
||||
@ -399,7 +477,12 @@ dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
}
|
||||
assert(sep == rest); /* must exhaust substring */
|
||||
assert(slow(m, ssp, sep, ssub, esub) == rest);
|
||||
dp = dissect(m, ssp, sep, ssub, esub);
|
||||
#ifdef NDEBUG
|
||||
(void)
|
||||
#else
|
||||
dp =
|
||||
#endif
|
||||
dissect(m, ssp, sep, ssub, esub);
|
||||
assert(dp == sep);
|
||||
sp = rest;
|
||||
break;
|
||||
@ -434,7 +517,12 @@ dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
else
|
||||
assert(OP(m->g->strip[esub]) == O_CH);
|
||||
}
|
||||
dp = dissect(m, sp, rest, ssub, esub);
|
||||
#ifdef NDEBUG
|
||||
(void)
|
||||
#else
|
||||
dp =
|
||||
#endif
|
||||
dissect(m, sp, rest, ssub, esub);
|
||||
assert(dp == rest);
|
||||
sp = rest;
|
||||
break;
|
||||
@ -467,24 +555,35 @@ dissect(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
|
||||
/*
|
||||
- backref - figure out what matched what, figuring in back references
|
||||
== static const char *backref(struct match *m, const char *start, \
|
||||
== const char *stop, sopno startst, sopno stopst, sopno lev);
|
||||
*/
|
||||
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 */
|
||||
static const char * /* == stop (success) or NULL (failure) */
|
||||
backref(
|
||||
struct match *m,
|
||||
const char *start,
|
||||
const char *stop,
|
||||
sopno startst,
|
||||
sopno stopst,
|
||||
sopno lev) /* PLUS nesting level */
|
||||
{
|
||||
int i;
|
||||
sopno ss; /* start sop of current subRE */
|
||||
char *sp; /* start of string matched by it */
|
||||
const 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;
|
||||
const char *ssp; /* start of string matched by subsubRE */
|
||||
const char *dp;
|
||||
size_t len;
|
||||
int hard;
|
||||
sop s;
|
||||
regoff_t offsave;
|
||||
cset *cs;
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(start != NULL);
|
||||
_DIAGASSERT(stop != NULL);
|
||||
|
||||
AT("back", start, stop, startst, stopst);
|
||||
sp = start;
|
||||
|
||||
@ -572,51 +671,50 @@ backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,
|
||||
case OBACK_: /* the vilest depths */
|
||||
i = OPND(s);
|
||||
assert(0 < i && i <= m->g->nsub);
|
||||
if (m->pmatch[i].rm_eo == -1)
|
||||
if (m->pmatch[i].rm_eo == (regoff_t)-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)
|
||||
assert(m->pmatch[i].rm_so != (regoff_t)-1);
|
||||
len = (size_t)(m->pmatch[i].rm_eo - m->pmatch[i].rm_so);
|
||||
if (len == 0)
|
||||
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;
|
||||
ssp = m->offp + (size_t)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;
|
||||
return(backref(m, sp+len, stop, ss+1, stopst, lev));
|
||||
|
||||
case OQUEST_: /* to null or not */
|
||||
dp = backref(m, sp, stop, ss+1, stopst, lev, rec);
|
||||
dp = backref(m, sp, stop, ss+1, stopst, lev);
|
||||
if (dp != NULL)
|
||||
return(dp); /* not */
|
||||
return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev, rec));
|
||||
break;
|
||||
return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev));
|
||||
|
||||
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;
|
||||
return(backref(m, sp, stop, ss+1, stopst, lev+1));
|
||||
|
||||
case O_PLUS:
|
||||
if (sp == m->lastpos[lev]) /* last pass matched null */
|
||||
return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
|
||||
return(backref(m, sp, stop, ss+1, stopst, lev-1));
|
||||
/* try another pass */
|
||||
m->lastpos[lev] = sp;
|
||||
dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev, rec);
|
||||
dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev);
|
||||
if (dp == NULL)
|
||||
return(backref(m, sp, stop, ss+1, stopst, lev-1, rec));
|
||||
else
|
||||
return(dp);
|
||||
break;
|
||||
dp = backref(m, sp, stop, ss+1, stopst, lev-1);
|
||||
return(dp);
|
||||
|
||||
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);
|
||||
dp = backref(m, sp, stop, ssub, esub, lev);
|
||||
if (dp != NULL)
|
||||
return(dp);
|
||||
/* that one missed, try next one */
|
||||
@ -631,29 +729,29 @@ backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,
|
||||
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);
|
||||
dp = backref(m, sp, stop, ss+1, stopst, lev);
|
||||
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);
|
||||
dp = backref(m, sp, stop, ss+1, stopst, lev);
|
||||
if (dp != NULL)
|
||||
return(dp);
|
||||
m->pmatch[i].rm_eo = offsave;
|
||||
return(NULL);
|
||||
break;
|
||||
|
||||
default: /* uh oh */
|
||||
assert(nope);
|
||||
break;
|
||||
@ -662,24 +760,35 @@ backref(struct match *m, char *start, char *stop, sopno startst, sopno stopst,
|
||||
/* "can't happen" */
|
||||
assert(nope);
|
||||
/* NOTREACHED */
|
||||
return 0;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
- fast - step through the string at top speed
|
||||
== static const char *fast(struct match *m, const char *start, \
|
||||
== const char *stop, sopno startst, sopno stopst);
|
||||
*/
|
||||
static char * /* where tentative match ended, or NULL */
|
||||
fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
static const char * /* where tentative match ended, or NULL */
|
||||
fast(
|
||||
struct match *m,
|
||||
const char *start,
|
||||
const char *stop,
|
||||
sopno startst,
|
||||
sopno stopst)
|
||||
{
|
||||
states st = m->st;
|
||||
states fresh = m->fresh;
|
||||
states tmp = m->tmp;
|
||||
char *p = start;
|
||||
const 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 */
|
||||
size_t i;
|
||||
const char *coldp; /* last p after which no match was underway */
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(start != NULL);
|
||||
_DIAGASSERT(stop != NULL);
|
||||
|
||||
CLEAR(st);
|
||||
SET1(st, startst);
|
||||
@ -751,19 +860,30 @@ fast(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
|
||||
/*
|
||||
- slow - step through the string more deliberately
|
||||
== static const char *slow(struct match *m, const char *start, \
|
||||
== const char *stop, sopno startst, sopno stopst);
|
||||
*/
|
||||
static char * /* where it ended */
|
||||
slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
static const char * /* where it ended */
|
||||
slow(
|
||||
struct match *m,
|
||||
const char *start,
|
||||
const char *stop,
|
||||
sopno startst,
|
||||
sopno stopst)
|
||||
{
|
||||
states st = m->st;
|
||||
states empty = m->empty;
|
||||
states tmp = m->tmp;
|
||||
char *p = start;
|
||||
const 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 */
|
||||
size_t i;
|
||||
const char *matchp; /* last p at which a match ended */
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(start != NULL);
|
||||
_DIAGASSERT(stop != NULL);
|
||||
|
||||
AT("slow", start, stop, startst, stopst);
|
||||
CLEAR(st);
|
||||
@ -831,9 +951,21 @@ slow(struct match *m, char *start, char *stop, sopno startst, sopno stopst)
|
||||
|
||||
/*
|
||||
- step - map set of states reachable before char to set reachable after
|
||||
== static states step(struct re_guts *g, sopno start, sopno stop, \
|
||||
== states bef, int ch, states aft);
|
||||
== #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)
|
||||
*/
|
||||
static states
|
||||
step(struct re_guts *g,
|
||||
step(
|
||||
struct re_guts *g,
|
||||
sopno start, /* start state within strip */
|
||||
sopno stop, /* state after stop state within strip */
|
||||
states bef, /* states reachable before */
|
||||
@ -847,6 +979,8 @@ step(struct re_guts *g,
|
||||
sopno look;
|
||||
int i;
|
||||
|
||||
_DIAGASSERT(g != NULL);
|
||||
|
||||
for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) {
|
||||
s = g->strip[pc];
|
||||
switch (OP(s)) {
|
||||
@ -948,47 +1082,79 @@ step(struct re_guts *g,
|
||||
#ifdef REDEBUG
|
||||
/*
|
||||
- print - print a set of states
|
||||
== #ifdef REDEBUG
|
||||
== static void print(struct match *m, char *caption, states st, \
|
||||
== int ch, FILE *d);
|
||||
== #endif
|
||||
*/
|
||||
static void
|
||||
print(struct match *m, char *caption, states st, int ch, FILE *d)
|
||||
print(
|
||||
struct match *m,
|
||||
char *caption,
|
||||
states st,
|
||||
int ch,
|
||||
FILE *d)
|
||||
{
|
||||
struct re_guts *g = m->g;
|
||||
int i;
|
||||
int first = 1;
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(caption != NULL);
|
||||
|
||||
if (!(m->eflags®_TRACE))
|
||||
return;
|
||||
|
||||
(void)fprintf(d, "%s", caption);
|
||||
_DIAGASSERT(d != NULL);
|
||||
|
||||
fprintf(d, "%s", caption);
|
||||
if (ch != '\0')
|
||||
(void)fprintf(d, " %s", pchar(ch));
|
||||
fprintf(d, " %s", pchar(ch));
|
||||
for (i = 0; i < g->nstates; i++)
|
||||
if (ISSET(st, i)) {
|
||||
(void)fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
|
||||
fprintf(d, "%s%d", (first) ? "\t" : ", ", i);
|
||||
first = 0;
|
||||
}
|
||||
(void)fprintf(d, "\n");
|
||||
fprintf(d, "\n");
|
||||
}
|
||||
|
||||
/*
|
||||
- at - print current situation
|
||||
== #ifdef REDEBUG
|
||||
== static void at(struct match *m, char *title, char *start, char *stop, \
|
||||
== sopno startst, sopno stopst);
|
||||
== #endif
|
||||
*/
|
||||
static void
|
||||
at(struct match *m, char *title, char *start, char *stop, sopno startst,
|
||||
at(
|
||||
struct match *m,
|
||||
char *title,
|
||||
char *start,
|
||||
char *stop,
|
||||
sopno startst,
|
||||
sopno stopst)
|
||||
{
|
||||
|
||||
_DIAGASSERT(m != NULL);
|
||||
_DIAGASSERT(title != NULL);
|
||||
_DIAGASSERT(start != NULL);
|
||||
_DIAGASSERT(stop != NULL);
|
||||
|
||||
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);
|
||||
printf("%s %s-", title, pchar(*start));
|
||||
printf("%s ", pchar(*stop));
|
||||
printf("%ld-%ld\n", (long)startst, (long)stopst);
|
||||
}
|
||||
|
||||
#ifndef PCHARDONE
|
||||
#define PCHARDONE /* never again */
|
||||
/*
|
||||
- pchar - make a character printable
|
||||
== #ifdef REDEBUG
|
||||
== static char *pchar(int ch);
|
||||
== #endif
|
||||
*
|
||||
* Is this identical to regchar() over in debug.c? Well, yes. But a
|
||||
* duplicate here avoids having a debugging-capable regexec.o tied to
|
||||
@ -996,7 +1162,8 @@ at(struct match *m, char *title, char *start, char *stop, sopno startst,
|
||||
* the non-debug compilation anyway, so it doesn't matter much.
|
||||
*/
|
||||
static char * /* -> representation */
|
||||
pchar(int ch)
|
||||
pchar(
|
||||
int ch)
|
||||
{
|
||||
static char pbuf[10];
|
||||
|
File diff suppressed because it is too large
Load Diff
223
libc/upstream-netbsd/libc/regex/regerror.c
Normal file
223
libc/upstream-netbsd/libc/regex/regerror.c
Normal file
@ -0,0 +1,223 @@
|
||||
/* $NetBSD: regerror.c,v 1.23 2007/02/09 23:44:18 junyoung Exp $ */
|
||||
|
||||
/*-
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)regerror.c 8.4 (Berkeley) 3/20/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: regerror.c,v 1.23 2007/02/09 23:44:18 junyoung Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <regex.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(regerror,_regerror)
|
||||
#endif
|
||||
|
||||
#include "utils.h"
|
||||
|
||||
/* ========= begin header generated by ./mkh ========= */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* === regerror.c === */
|
||||
static const char *regatoi(const regex_t *preg, char *localbuf, size_t buflen);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
/* ========= end header generated by ./mkh ========= */
|
||||
/*
|
||||
= #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 (!)
|
||||
*/
|
||||
static const struct rerr {
|
||||
int code;
|
||||
const char *name;
|
||||
const 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;
|
||||
const char *s;
|
||||
char convbuf[50];
|
||||
|
||||
_DIAGASSERT(errcode != REG_ATOI || preg != NULL);
|
||||
_DIAGASSERT(errbuf != NULL);
|
||||
|
||||
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 & REG_ITOA) {
|
||||
if (r->code != 0) {
|
||||
(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)
|
||||
(void)strlcpy(errbuf, s, errbuf_size);
|
||||
|
||||
return(len);
|
||||
}
|
||||
|
||||
/*
|
||||
* regatoi - internal routine to implement REG_ATOI
|
||||
* static const char *regatoi(const regex_t *preg, char *localbuf,
|
||||
* size_t buflen);
|
||||
*/
|
||||
static const char *
|
||||
regatoi(
|
||||
const regex_t *preg,
|
||||
char *localbuf,
|
||||
size_t buflen)
|
||||
{
|
||||
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, buflen, "%d", r->code);
|
||||
return localbuf;
|
||||
}
|
@ -1,7 +1,6 @@
|
||||
/* $OpenBSD: regex2.h,v 1.7 2004/11/30 17:04:23 otto Exp $ */
|
||||
/* $NetBSD: regex2.h,v 1.13 2011/10/09 18:23:00 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -35,6 +34,57 @@
|
||||
* @(#)regex2.h 8.4 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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
|
||||
*/
|
||||
|
||||
/*
|
||||
* First, the stuff that ends up in the outside-world include file
|
||||
= 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;
|
||||
*/
|
||||
/*
|
||||
* internals of regex_t
|
||||
*/
|
||||
@ -59,36 +109,38 @@
|
||||
* 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
|
||||
typedef u_int32_t sop; /* strip operator */
|
||||
typedef size_t sopno;
|
||||
#define OPRMASK ((u_int32_t)0xf8000000UL)
|
||||
#define OPDMASK ((u_int32_t)0x07ffffffUL)
|
||||
#define OPSHIFT ((unsigned)27)
|
||||
#define OP(n) ((n)&OPRMASK)
|
||||
#define OPND(n) ((n)&OPDMASK)
|
||||
#define OPND(n) ((int)((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 - */
|
||||
|
||||
#define OPC(n) (((u_int32_t)(n))<<OPSHIFT)
|
||||
/* operators meaning operand */
|
||||
/* (back, fwd are offsets) */
|
||||
#define OEND OPC(1) /* endmarker - */
|
||||
#define OCHAR OPC(2) /* character unsigned char */
|
||||
#define OBOL OPC(3) /* left anchor - */
|
||||
#define OEOL OPC(4) /* right anchor - */
|
||||
#define OANY OPC(5) /* . - */
|
||||
#define OANYOF OPC(6) /* [...] set number */
|
||||
#define OBACK_ OPC(7) /* begin \d paren number */
|
||||
#define O_BACK OPC(8) /* end \d paren number */
|
||||
#define OPLUS_ OPC(9) /* + prefix fwd to suffix */
|
||||
#define O_PLUS OPC(10) /* + suffix back to prefix */
|
||||
#define OQUEST_ OPC(11) /* ? prefix fwd to suffix */
|
||||
#define O_QUEST OPC(12) /* ? suffix back to prefix */
|
||||
#define OLPAREN OPC(13) /* ( fwd to ) */
|
||||
#define ORPAREN OPC(14) /* ) back to ( */
|
||||
#define OCH_ OPC(15) /* begin choice fwd to OOR2 */
|
||||
#define OOR1 OPC(16) /* | pt. 1 back to OOR1 or OCH_ */
|
||||
#define OOR2 OPC(17) /* | pt. 2 fwd to OOR2 or O_CH */
|
||||
#define O_CH OPC(18) /* end choice back to OOR1 */
|
||||
#define OBOW OPC(19) /* begin word - */
|
||||
#define OEOW OPC(20) /* end word - */
|
||||
|
||||
/*
|
||||
* Structure for [] character-set representation. Character sets are
|
||||
@ -127,8 +179,8 @@ 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 */
|
||||
size_t csetsize; /* number of bits in a cset vector */
|
||||
size_t ncsets; /* number of csets in use */
|
||||
cset *sets; /* -> cset [ncsets] */
|
||||
uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */
|
||||
int cflags; /* copy of regcomp() cflags argument */
|
||||
@ -139,12 +191,12 @@ struct re_guts {
|
||||
# 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 */
|
||||
size_t nbol; /* number of ^ used */
|
||||
size_t neol; /* number of $ used */
|
||||
size_t 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 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? */
|
||||
@ -154,4 +206,4 @@ struct re_guts {
|
||||
|
||||
/* misc utilities */
|
||||
#define OUT (CHAR_MAX+1) /* a non-character value */
|
||||
#define ISWORD(c) (isalnum(c) || (c) == '_')
|
||||
#define ISWORD(c) (isalnum((unsigned char)c) || (c) == '_')
|
@ -1,6 +1,6 @@
|
||||
/* $OpenBSD: regexec.c,v 1.11 2005/08/05 13:03:00 espie Exp $ */
|
||||
/* $NetBSD: regexec.c,v 1.22 2012/03/13 21:13:43 christos Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
* Copyright (c) 1992, 1993, 1994
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
@ -34,6 +34,52 @@
|
||||
* @(#)regexec.c 8.3 (Berkeley) 3/20/94
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)regexec.c 8.3 (Berkeley) 3/20/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: regexec.c,v 1.22 2012/03/13 21:13:43 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
/*
|
||||
* the outer shell of regexec()
|
||||
*
|
||||
@ -41,39 +87,46 @@
|
||||
* macros that code uses. This lets the same code operate on two different
|
||||
* representations for state sets.
|
||||
*/
|
||||
#include "namespace.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <limits.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <ctype.h>
|
||||
#include <regex.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(regexec,_regexec)
|
||||
#endif
|
||||
|
||||
#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 states unsigned long
|
||||
#define states1 unsigned long /* 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 STATEVARS int dummy /* dummy version */
|
||||
#define STATESETUP(m, n) /* nothing */
|
||||
#define STATETEARDOWN(m) /* nothing */
|
||||
#define SETUP(v) ((v) = 0)
|
||||
#define onestate long
|
||||
#define onestate unsigned long
|
||||
#define INIT(o, n) ((o) = (unsigned long)1 << (n))
|
||||
#define INC(o) ((o) <<= 1)
|
||||
#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)
|
||||
#define ISSETBACK(v, n) (((v) & ((unsigned long)here >> (n))) != 0)
|
||||
/* function names */
|
||||
#define SNAMES /* engine.c looks after details */
|
||||
|
||||
@ -102,20 +155,23 @@
|
||||
|
||||
/* macros for manipulating states, large version */
|
||||
#define states char *
|
||||
#define CLEAR(v) memset(v, 0, m->g->nstates)
|
||||
#define CLEAR(v) memset(v, 0, (size_t)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 ASSIGN(d, s) memcpy(d, s, (size_t)m->g->nstates)
|
||||
#define EQ(a, b) (memcmp(a, b, (size_t)m->g->nstates) == 0)
|
||||
#define STATEVARS int vn; char *space
|
||||
#define STATESETUP(m, nv) \
|
||||
if (((m)->space = malloc((size_t)((nv)*(m)->g->nstates))) == NULL) \
|
||||
return(REG_ESPACE); \
|
||||
else \
|
||||
(m)->vn = 0
|
||||
|
||||
#define STATETEARDOWN(m) { free((m)->space); m->space = NULL; }
|
||||
#define SETUP(v) ((v) = &m->space[(size_t)(m->vn++ * m->g->nstates)])
|
||||
#define onestate int
|
||||
#define INIT(o, n) ((o) = (int)(n))
|
||||
#define INC(o) ((o)++)
|
||||
#define ISSTATEIN(v, o) ((v)[o])
|
||||
/* some abbreviations; note that some of these know variable names! */
|
||||
@ -130,22 +186,38 @@
|
||||
|
||||
/*
|
||||
- regexec - interface for matching
|
||||
= extern int regexec(const regex_t *, const char *, size_t, \
|
||||
= regmatch_t [], int);
|
||||
= #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
|
||||
*
|
||||
* 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)
|
||||
regexec(
|
||||
const regex_t *preg,
|
||||
const char *string,
|
||||
size_t nmatch,
|
||||
regmatch_t pmatch[],
|
||||
int eflags)
|
||||
{
|
||||
struct re_guts *g = preg->re_g;
|
||||
char *s;
|
||||
#ifdef REDEBUG
|
||||
# define GOODFLAGS(f) (f)
|
||||
#else
|
||||
# define GOODFLAGS(f) ((f)&(REG_NOTBOL|REG_NOTEOL|REG_STARTEND))
|
||||
#endif
|
||||
|
||||
_DIAGASSERT(preg != NULL);
|
||||
_DIAGASSERT(string != NULL);
|
||||
|
||||
if (preg->re_magic != MAGIC1 || g->magic != MAGIC2)
|
||||
return(REG_BADPAT);
|
||||
assert(!(g->iflags&BAD));
|
||||
@ -153,8 +225,10 @@ regexec(const regex_t *preg, const char *string, size_t nmatch,
|
||||
return(REG_BADPAT);
|
||||
eflags = GOODFLAGS(eflags);
|
||||
|
||||
if (g->nstates <= (int)(CHAR_BIT*sizeof(states1)) && !(eflags®_LARGE))
|
||||
return(smatcher(g, (char *)string, nmatch, pmatch, eflags));
|
||||
s = __UNCONST(string);
|
||||
|
||||
if (g->nstates <= (sopno)(CHAR_BIT*sizeof(states1)) && !(eflags®_LARGE))
|
||||
return(smatcher(g, s, nmatch, pmatch, eflags));
|
||||
else
|
||||
return(lmatcher(g, (char *)string, nmatch, pmatch, eflags));
|
||||
return(lmatcher(g, s, nmatch, pmatch, eflags));
|
||||
}
|
129
libc/upstream-netbsd/libc/regex/regfree.c
Normal file
129
libc/upstream-netbsd/libc/regex/regfree.c
Normal file
@ -0,0 +1,129 @@
|
||||
/* $NetBSD: regfree.c,v 1.15 2007/02/09 23:44:18 junyoung Exp $ */
|
||||
|
||||
/*-
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)regfree.c 8.3 (Berkeley) 3/20/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: regfree.c,v 1.15 2007/02/09 23:44:18 junyoung Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include "namespace.h"
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <regex.h>
|
||||
|
||||
#ifdef __weak_alias
|
||||
__weak_alias(regfree,_regfree)
|
||||
#endif
|
||||
|
||||
#include "utils.h"
|
||||
#include "regex2.h"
|
||||
|
||||
/*
|
||||
- regfree - free everything
|
||||
= extern void regfree(regex_t *);
|
||||
*/
|
||||
void
|
||||
regfree(
|
||||
regex_t *preg)
|
||||
{
|
||||
struct re_guts *g;
|
||||
|
||||
_DIAGASSERT(preg != NULL);
|
||||
|
||||
_DIAGASSERT(preg->re_magic == MAGIC1);
|
||||
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(g->strip);
|
||||
if (g->sets != NULL)
|
||||
free(g->sets);
|
||||
if (g->setbits != NULL)
|
||||
free(g->setbits);
|
||||
if (g->must != NULL)
|
||||
free(g->must);
|
||||
free(g);
|
||||
}
|
91
libc/upstream-netbsd/libc/regex/utils.h
Normal file
91
libc/upstream-netbsd/libc/regex/utils.h
Normal file
@ -0,0 +1,91 @@
|
||||
/* $NetBSD: utils.h,v 1.6 2003/08/07 16:43:21 agc Exp $ */
|
||||
|
||||
/*-
|
||||
* 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
|
||||
*/
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1992, 1993, 1994 Henry Spencer.
|
||||
*
|
||||
* 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 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 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 _POSIX2_RE_DUP_MAX /* xxx is this right? */
|
||||
#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
|
@ -21,4 +21,7 @@
|
||||
#include <assert.h>
|
||||
#define _DIAGASSERT(e) ((e) ? (void) 0 : __assert2(__FILE__, __LINE__, __func__, #e))
|
||||
|
||||
// TODO: update our <sys/cdefs.h> to support this properly.
|
||||
#define __type_fit(t, a) (0 == 0)
|
||||
|
||||
#endif
|
||||
|
43
tests/Android.mk
Normal file
43
tests/Android.mk
Normal file
@ -0,0 +1,43 @@
|
||||
#
|
||||
# Copyright (C) 2012 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
# Copyright The Android Open Source Project
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
test_module = bionic-unit-tests
|
||||
test_tags = eng tests
|
||||
|
||||
test_src_files = \
|
||||
regex_test.cpp \
|
||||
|
||||
# Build for the device (with bionic). Run with:
|
||||
# adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := $(test_module)
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
LOCAL_MODULE_TAGS := $(test_tags)
|
||||
LOCAL_SRC_FILES := $(test_src_files)
|
||||
include $(BUILD_NATIVE_TEST)
|
||||
|
||||
# Build for the host (with glibc).
|
||||
# Note that this will build against glibc, so it's not useful for testing
|
||||
# bionic's implementation, but it does let you use glibc as a reference
|
||||
# implementation for testing the tests themselves.
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := $(test_module)-glibc
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
|
||||
LOCAL_MODULE_TAGS := $(test_tags)
|
||||
LOCAL_SRC_FILES := $(test_src_files)
|
||||
include $(BUILD_HOST_NATIVE_TEST)
|
38
tests/regex_test.cpp
Normal file
38
tests/regex_test.cpp
Normal file
@ -0,0 +1,38 @@
|
||||
/*
|
||||
* Copyright (C) 2012 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <regex.h>
|
||||
|
||||
TEST(regex, smoke) {
|
||||
// A quick test of all the regex functions.
|
||||
regex_t re;
|
||||
ASSERT_EQ(0, regcomp(&re, "ab*c", 0));
|
||||
ASSERT_EQ(0, regexec(&re, "abbbc", 0, NULL, 0));
|
||||
ASSERT_EQ(REG_NOMATCH, regexec(&re, "foo", 0, NULL, 0));
|
||||
|
||||
char buf[80];
|
||||
regerror(REG_NOMATCH, &re, buf, sizeof(buf));
|
||||
#if __BIONIC__
|
||||
ASSERT_STREQ("regexec() failed to match", buf);
|
||||
#else
|
||||
ASSERT_STREQ("No match", buf);
|
||||
#endif
|
||||
|
||||
regfree(&re);
|
||||
}
|
Loading…
Reference in New Issue
Block a user