summaryrefslogtreecommitdiff
path: root/regex/regcomp.c
diff options
context:
space:
mode:
authorSascha Schumann <sas@php.net>1999-11-12 20:27:52 +0000
committerSascha Schumann <sas@php.net>1999-11-12 20:27:52 +0000
commit6f572248907b8489b360ed2f030c10a2f5bb2e67 (patch)
treee5ff355bae61dce747aa699b24bdaabc025e8c45 /regex/regcomp.c
parente20e9786b3a1de2f209df560c43e36eb74af046a (diff)
downloadphp-git-6f572248907b8489b360ed2f030c10a2f5bb2e67.tar.gz
upgrade regex library to alpha3.8
@- Upgraded regex library to alpha3.8 (Sascha)
Diffstat (limited to 'regex/regcomp.c')
-rw-r--r--regex/regcomp.c85
1 files changed, 71 insertions, 14 deletions
diff --git a/regex/regcomp.c b/regex/regcomp.c
index b481be0f55..e3f0c1be4e 100644
--- a/regex/regcomp.c
+++ b/regex/regcomp.c
@@ -46,14 +46,14 @@ static char nuls[10]; /* place to point scanner in event of error */
#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)) ? (NEXT1(), 1) : 0)
+#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0)
#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0)
-#define NEXT1() (p->next++)
+#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) ((void)((co) || SETERROR(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))
@@ -326,7 +326,7 @@ register struct parse *p;
if (!( c == '*' || c == '+' || c == '?' ||
(c == '{' && MORE2() && isdigit(PEEK2())) ))
return; /* no repetition, we're done */
- NEXT1();
+ NEXT();
REQUIRE(!wascaret, REG_BADRPT);
switch (c) {
@@ -363,7 +363,7 @@ register struct parse *p;
repeat(p, pos, count, count2);
if (!EAT('}')) { /* error heuristics */
while (MORE() && PEEK() != '}')
- NEXT1();
+ NEXT();
REQUIRE(MORE(), REG_EBRACE);
SETERROR(REG_BADBR);
}
@@ -518,7 +518,7 @@ int starordinary; /* is a leading * an ordinary character? */
REQUIRE(starordinary, REG_BADRPT);
/* FALLTHROUGH */
default:
- ordinary(p, c &~ BACKSL);
+ ordinary(p, (char)c); /* takes off BACKSL, if any */
break;
}
@@ -541,7 +541,7 @@ int starordinary; /* is a leading * an ordinary character? */
repeat(p, pos, count, count2);
if (!EATTWO('\\', '}')) { /* error heuristics */
while (MORE() && !SEETWO('\\', '}'))
- NEXT1();
+ NEXT();
REQUIRE(MORE(), REG_EBRACE);
SETERROR(REG_BADBR);
}
@@ -699,7 +699,7 @@ register cset *cs;
start = p_b_symbol(p);
if (SEE('-') && MORE2() && PEEK2() != ']') {
/* range */
- NEXT1();
+ NEXT();
if (EAT('-'))
finish = '-';
else
@@ -730,7 +730,7 @@ register cset *cs;
register char c;
while (MORE() && isalpha(PEEK()))
- NEXT1();
+ NEXT();
len = p->next - sp;
for (cp = cclasses; cp->name != NULL; cp++)
if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
@@ -799,7 +799,7 @@ int endc; /* name ended by endc,']' */
register int len;
while (MORE() && !SEETWO(endc, ']'))
- NEXT1();
+ NEXT();
if (!MORE()) {
SETERROR(REG_EBRACK);
return(0);
@@ -1056,7 +1056,7 @@ freeset(p, cs)
register struct parse *p;
register cset *cs;
{
- register unsigned int i;
+ register int i;
register cset *top = &p->g->sets[p->g->ncsets];
register size_t css = (size_t)p->g->csetsize;
@@ -1082,7 +1082,7 @@ register struct parse *p;
register cset *cs;
{
register uch h = cs->hash;
- register unsigned int i;
+ register int i;
register cset *top = &p->g->sets[p->g->ncsets];
register cset *cs2;
register size_t css = (size_t)p->g->csetsize;
@@ -1115,7 +1115,7 @@ firstch(p, cs)
register struct parse *p;
register cset *cs;
{
- register unsigned int i;
+ register int i;
register size_t css = (size_t)p->g->csetsize;
for (i = 0; i < css; i++)
@@ -1134,7 +1134,7 @@ nch(p, cs)
register struct parse *p;
register cset *cs;
{
- register unsigned int i;
+ register int i;
register size_t css = (size_t)p->g->csetsize;
register int n = 0;
@@ -1171,6 +1171,63 @@ register char *cp;
cs->multis[cs->smultis - 1] = '\0';
}
+/*
+ - mcsub - subtract a collating element from a cset
+ == static void mcsub(register cset *cs, register char *cp);
+ */
+static void
+mcsub(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ register char *fp = mcfind(cs, cp);
+ register size_t len = strlen(fp);
+
+ assert(fp != NULL);
+ (void) memmove(fp, fp + len + 1,
+ cs->smultis - (fp + len + 1 - cs->multis));
+ cs->smultis -= len;
+
+ if (cs->smultis == 0) {
+ free(cs->multis);
+ cs->multis = NULL;
+ return;
+ }
+
+ cs->multis = realloc(cs->multis, cs->smultis);
+ assert(cs->multis != NULL);
+}
+
+/*
+ - mcin - is a collating element in a cset?
+ == static int mcin(register cset *cs, register char *cp);
+ */
+static int
+mcin(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ return(mcfind(cs, cp) != NULL);
+}
+
+/*
+ - mcfind - find a collating element in a cset
+ == static char *mcfind(register cset *cs, register char *cp);
+ */
+static char *
+mcfind(cs, cp)
+register cset *cs;
+register char *cp;
+{
+ register char *p;
+
+ if (cs->multis == NULL)
+ return(NULL);
+ for (p = cs->multis; *p != '\0'; p += strlen(p) + 1)
+ if (strcmp(cp, p) == 0)
+ return(p);
+ return(NULL);
+}
/*
- mcinvert - invert the list of collating elements in a cset