diff options
Diffstat (limited to 'src/backend/regex/regcomp.c')
-rw-r--r-- | src/backend/regex/regcomp.c | 1114 |
1 files changed, 601 insertions, 513 deletions
diff --git a/src/backend/regex/regcomp.c b/src/backend/regex/regcomp.c index 364573e2b5b..dcb95173c06 100644 --- a/src/backend/regex/regcomp.c +++ b/src/backend/regex/regcomp.c @@ -1,7 +1,7 @@ /*- * Copyright (c) 1992, 1993, 1994 Henry Spencer. * Copyright (c) 1992, 1993, 1994 - * The Regents of the University of California. All rights reserved. + * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Henry Spencer. @@ -10,22 +10,22 @@ * 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. + * 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. + * 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. + * 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. + * 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 + * 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) @@ -34,12 +34,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)regcomp.c 8.5 (Berkeley) 3/20/94 + * @(#)regcomp.c 8.5 (Berkeley) 3/20/94 */ #if defined(LIBC_SCCS) && !defined(lint) -static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; -#endif /* LIBC_SCCS and not lint */ +static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; + +#endif /* LIBC_SCCS and not lint */ #include <sys/types.h> #include <stdio.h> @@ -49,7 +50,7 @@ static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; #include <stdlib.h> #include <assert.h> -#include <regex/regex.h> +#include <regex/regex.h> #include <regex/utils.h> #include <regex/regex2.h> #include <regex/cclass.h> @@ -59,167 +60,179 @@ static char sccsid[] = "@(#)regcomp.c 8.5 (Berkeley) 3/20/94"; * parse structure, passed up and down to avoid global variables and * other clumsinesses */ -struct parse { - char *next; /* next character in RE */ - char *end; /* end of string (-> NUL normally) */ - int error; /* has an error been seen? */ - sop *strip; /* malloced strip */ - sopno ssize; /* malloced strip size (allocated) */ - sopno slen; /* malloced strip length (used) */ - int ncsalloc; /* number of csets allocated */ +struct parse +{ + char *next; /* next character in RE */ + char *end; /* end of string (-> NUL normally) */ + int error; /* has an error been seen? */ + sop *strip; /* malloced strip */ + sopno ssize; /* malloced strip size (allocated) */ + sopno slen; /* malloced strip length (used) */ + int ncsalloc; /* number of csets allocated */ struct re_guts *g; -# define NPAREN 10 /* we need to remember () 1-9 for back refs */ - sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ - sopno pend[NPAREN]; /* -> ) ([0] unused) */ +#define NPAREN 10 /* we need to remember () 1-9 for back + * refs */ + sopno pbegin[NPAREN]; /* -> ( ([0] unused) */ + sopno pend[NPAREN]; /* -> ) ([0] unused) */ }; /* ========= begin header generated by ./mkh ========= */ #ifdef __cplusplus -extern "C" { +extern "C" +{ #endif /* === regcomp.c === */ -static void p_ere(struct parse *p, int stop); -static void p_ere_exp(struct parse *p); -static void p_str(struct parse *p); -static void p_bre(struct parse *p, int end1, int end2); -static int p_simp_re(struct parse *p, int starordinary); -static int p_count(struct parse *p); -static void p_bracket(struct parse *p); -static void p_b_term(struct parse *p, cset *cs); -static void p_b_cclass(struct parse *p, cset *cs); -static void p_b_eclass(struct parse *p, cset *cs); -static char p_b_symbol(struct parse *p); -static char p_b_coll_elem(struct parse *p, int endc); -static char othercase(int ch); -static void bothcases(struct parse *p, int ch); -static void ordinary(struct parse *p, int ch); -static void nonnewline(struct parse *p); -static void repeat(struct parse *p, sopno start, int from, int to); -static int seterr(struct parse *p, int e); -static cset *allocset(struct parse *p); -static void freeset(struct parse *p, cset *cs); -static int freezeset(struct parse *p, cset *cs); -static int firstch(struct parse *p, cset *cs); -static int nch(struct parse *p, cset *cs); -static void mcadd(struct parse *p, cset *cs, char *cp); -static void mcinvert(struct parse *p, cset *cs); -static void mccase(struct parse *p, cset *cs); -static int isinsets(struct re_guts *g, int c); -static int samesets(struct re_guts *g, int c1, int c2); -static void categorize(struct parse *p, struct re_guts *g); -static sopno dupl(struct parse *p, sopno start, sopno finish); -static void doemit(struct parse *p, sop op, size_t opnd); -static void doinsert(struct parse *p, sop op, size_t opnd, sopno pos); -static void dofwd(struct parse *p, sopno pos, sop value); -static void enlarge(struct parse *p, sopno size); -static void stripsnug(struct parse *p, struct re_guts *g); -static void findmust(struct parse *p, struct re_guts *g); -static sopno pluscount(struct parse *p, struct re_guts *g); + static void p_ere(struct parse * p, int stop); + static void p_ere_exp(struct parse * p); + static void p_str(struct parse * p); + static void p_bre(struct parse * p, int end1, int end2); + static int p_simp_re(struct parse * p, int starordinary); + static int p_count(struct parse * p); + static void p_bracket(struct parse * p); + static void p_b_term(struct parse * p, cset * cs); + static void p_b_cclass(struct parse * p, cset * cs); + static void p_b_eclass(struct parse * p, cset * cs); + static char p_b_symbol(struct parse * p); + static char p_b_coll_elem(struct parse * p, int endc); + static char othercase(int ch); + static void bothcases(struct parse * p, int ch); + static void ordinary(struct parse * p, int ch); + static void nonnewline(struct parse * p); + static void repeat(struct parse * p, sopno start, int from, int to); + static int seterr(struct parse * p, int e); + static cset *allocset(struct parse * p); + static void freeset(struct parse * p, cset * cs); + static int freezeset(struct parse * p, cset * cs); + static int firstch(struct parse * p, cset * cs); + static int nch(struct parse * p, cset * cs); + static void mcadd(struct parse * p, cset * cs, char *cp); + static void mcinvert(struct parse * p, cset * cs); + static void mccase(struct parse * p, cset * cs); + static int isinsets(struct re_guts * g, int c); + static int samesets(struct re_guts * g, int c1, int c2); + static void categorize(struct parse * p, struct re_guts * g); + static sopno dupl(struct parse * p, sopno start, sopno finish); + static void doemit(struct parse * p, sop op, size_t opnd); + static void doinsert(struct parse * p, sop op, size_t opnd, sopno pos); + static void dofwd(struct parse * p, sopno pos, sop value); + static void enlarge(struct parse * p, sopno size); + static void stripsnug(struct parse * p, struct re_guts * g); + static void findmust(struct parse * p, struct re_guts * g); + static sopno pluscount(struct parse * p, struct re_guts * g); #ifdef __cplusplus } + #endif /* ========= end header generated by ./mkh ========= */ -static char nuls[10]; /* place to point scanner in event of error */ +static char nuls[10]; /* place to point scanner in event of + * error */ /* * macros for use with parse structure - * BEWARE: these know that the parse structure is named `p' !!! + * BEWARE: these know that the parse structure is named `p' !!! */ -#define PEEK() (*p->next) -#define PEEK2() (*(p->next+1)) -#define MORE() (p->next < p->end) -#define MORE2() (p->next+1 < p->end) -#define SEE(c) (MORE() && PEEK() == (c)) -#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) -#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) -#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) -#define NEXT() (p->next++) -#define NEXT2() (p->next += 2) -#define NEXTn(n) (p->next += (n)) -#define GETNEXT() (*p->next++) -#define SETERROR(e) seterr(p, (e)) -#define REQUIRE(co, e) if (!(co)) SETERROR(e) -#define MUSTSEE(c, e) REQUIRE(MORE() && PEEK() == (c), e) -#define MUSTEAT(c, e) REQUIRE(MORE() && GETNEXT() == (c), e) -#define MUSTNOTSEE(c, e) REQUIRE(!MORE() || PEEK() != (c), e) -#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) -#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) -#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) -#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) -#define HERE() (p->slen) -#define THERE() (p->slen - 1) -#define THERETHERE() (p->slen - 2) -#define DROP(n) (p->slen -= (n)) +#define PEEK() (*p->next) +#define PEEK2() (*(p->next+1)) +#define MORE() (p->next < p->end) +#define MORE2() (p->next+1 < p->end) +#define SEE(c) (MORE() && PEEK() == (c)) +#define SEETWO(a, b) (MORE() && MORE2() && PEEK() == (a) && PEEK2() == (b)) +#define EAT(c) ((SEE(c)) ? (NEXT(), 1) : 0) +#define EATTWO(a, b) ((SEETWO(a, b)) ? (NEXT2(), 1) : 0) +#define NEXT() (p->next++) +#define NEXT2() (p->next += 2) +#define NEXTn(n) (p->next += (n)) +#define GETNEXT() (*p->next++) +#define SETERROR(e) seterr(p, (e)) +#define REQUIRE(co, e) if (!(co)) SETERROR(e) +#define MUSTSEE(c, e) REQUIRE(MORE() && PEEK() == (c), e) +#define MUSTEAT(c, e) REQUIRE(MORE() && GETNEXT() == (c), e) +#define MUSTNOTSEE(c, e) REQUIRE(!MORE() || PEEK() != (c), e) +#define EMIT(op, sopnd) doemit(p, (sop)(op), (size_t)(sopnd)) +#define INSERT(op, pos) doinsert(p, (sop)(op), HERE()-(pos)+1, pos) +#define AHEAD(pos) dofwd(p, pos, HERE()-(pos)) +#define ASTERN(sop, pos) EMIT(sop, HERE()-pos) +#define HERE() (p->slen) +#define THERE() (p->slen - 1) +#define THERETHERE() (p->slen - 2) +#define DROP(n) (p->slen -= (n)) #ifndef NDEBUG -static int never = 0; /* for use in asserts; shuts lint up */ +static int never = 0; /* for use in asserts; shuts lint up */ + #else -#define never 0 /* some <assert.h>s have bugs too */ +#define never 0 /* some <assert.h>s have bugs too */ #endif /* - regcomp - interface for parser and compilation = extern int regcomp(regex_t *, const char *, int); - = #define REG_BASIC 0000 - = #define REG_EXTENDED 0001 - = #define REG_ICASE 0002 - = #define REG_NOSUB 0004 - = #define REG_NEWLINE 0010 - = #define REG_NOSPEC 0020 - = #define REG_PEND 0040 - = #define REG_DUMP 0200 + = #define REG_BASIC 0000 + = #define REG_EXTENDED 0001 + = #define REG_ICASE 0002 + = #define REG_NOSUB 0004 + = #define REG_NEWLINE 0010 + = #define REG_NOSPEC 0020 + = #define REG_PEND 0040 + = #define REG_DUMP 0200 */ -int /* 0 success, otherwise REG_something */ +int /* 0 success, otherwise REG_something */ pg95_regcomp(preg, pattern, cflags) -regex_t *preg; -const char *pattern; -int cflags; +regex_t *preg; +const char *pattern; +int cflags; { - struct parse pa; + struct parse pa; register struct re_guts *g; register struct parse *p = &pa; - register int i; + register int i; register size_t len; + #ifdef REDEBUG -# define GOODFLAGS(f) (f) +#define GOODFLAGS(f) (f) #else -# define GOODFLAGS(f) ((f)&~REG_DUMP) +#define GOODFLAGS(f) ((f)&~REG_DUMP) #endif cflags = GOODFLAGS(cflags); - if ((cflags®_EXTENDED) && (cflags®_NOSPEC)) - return(REG_INVARG); + if ((cflags & REG_EXTENDED) && (cflags & REG_NOSPEC)) + return (REG_INVARG); - if (cflags®_PEND) { + if (cflags & REG_PEND) + { if (preg->re_endp < pattern) - return(REG_INVARG); + return (REG_INVARG); len = preg->re_endp - pattern; - } else - len = strlen((char *)pattern); + } + else + len = strlen((char *) pattern); /* do the mallocs early so failure handling is easy */ - g = (struct re_guts *)malloc(sizeof(struct re_guts) + - (NC-1)*sizeof(cat_t)); + g = (struct re_guts *) malloc(sizeof(struct re_guts) + + (NC - 1) * sizeof(cat_t)); if (g == NULL) - return(REG_ESPACE); - p->ssize = len/(size_t)2*(size_t)3 + (size_t)1; /* ugh */ - p->strip = (sop *)malloc(p->ssize * sizeof(sop)); + return (REG_ESPACE); + p->ssize = len / (size_t) 2 *(size_t) 3 + (size_t) 1; /* ugh */ + + p->strip = (sop *) malloc(p->ssize * sizeof(sop)); p->slen = 0; - if (p->strip == NULL) { - free((char *)g); - return(REG_ESPACE); + if (p->strip == NULL) + { + free((char *) g); + return (REG_ESPACE); } /* set things up */ p->g = g; - p->next = (char *)pattern; /* convenience; we do not modify it */ + p->next = (char *) pattern; /* convenience; we do not modify it */ p->end = p->next + len; p->error = 0; p->ncsalloc = 0; - for (i = 0; i < NPAREN; i++) { + for (i = 0; i < NPAREN; i++) + { p->pbegin[i] = 0; p->pend[i] = 0; } @@ -234,17 +247,17 @@ int cflags; g->must = NULL; g->mlen = 0; g->nsub = 0; - g->ncategories = 1; /* category 0 is "everything else" */ + g->ncategories = 1; /* category 0 is "everything else" */ g->categories = &g->catspace[-(CHAR_MIN)]; - memset((char *)g->catspace, 0, NC*sizeof(cat_t)); + memset((char *) g->catspace, 0, NC * sizeof(cat_t)); g->backrefs = 0; /* do it */ EMIT(OEND, 0); g->firststate = THERE(); - if (cflags®_EXTENDED) + if (cflags & REG_EXTENDED) p_ere(p, OUT); - else if (cflags®_NOSPEC) + else if (cflags & REG_NOSPEC) p_str(p); else p_bre(p, OUT, OUT); @@ -262,14 +275,14 @@ int cflags; preg->re_magic = MAGIC1; #ifndef REDEBUG /* not debugging, so can't rely on the assert() in regexec() */ - if (g->iflags&BAD) + if (g->iflags & BAD) SETERROR(REG_ASSERT); #endif /* win or lose, we're done */ - if (p->error != 0) /* lose */ + if (p->error != 0) /* lose */ pg95_regfree(preg); - return(p->error); + return (p->error); } /* @@ -279,26 +292,28 @@ int cflags; static void p_ere(p, stop) register struct parse *p; -int stop; /* character this ERE should end at */ +int stop; /* character this ERE should end at */ { - register char c; - register sopno prevback = 0; - register sopno prevfwd = 0; - register sopno conc; - register int first = 1; /* is this the first alternative? */ - - for (;;) { + register char c; + register sopno prevback = 0; + register sopno prevfwd = 0; + register sopno conc; + register int first = 1; /* is this the first alternative? */ + + for (;;) + { /* do a bunch of concatenated expressions */ conc = HERE(); while (MORE() && (c = PEEK()) != '|' && c != stop) p_ere_exp(p); - REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ + REQUIRE(HERE() != conc, REG_EMPTY); /* require nonempty */ if (!EAT('|')) - break; /* NOTE BREAK OUT */ + break; /* NOTE BREAK OUT */ - if (first) { - INSERT(OCH_, conc); /* offset is wrong */ + if (first) + { + INSERT(OCH_, conc); /* offset is wrong */ prevfwd = conc; prevback = conc; first = 0; @@ -310,7 +325,8 @@ int stop; /* character this ERE should end at */ EMIT(OOR2, 0); /* offset is very wrong */ } - if (!first) { /* tail-end fixups */ + if (!first) + { /* tail-end fixups */ AHEAD(prevfwd); ASTERN(O_CH, prevback); } @@ -326,18 +342,19 @@ static void p_ere_exp(p) register struct parse *p; { - register char c; - register sopno pos; - register int count; - register int count2; - register sopno subno; - int wascaret = 0; - - assert(MORE()); /* caller should have ensured this */ + register char c; + register sopno pos; + register int count; + register int count2; + register sopno subno; + int wascaret = 0; + + assert(MORE()); /* caller should have ensured this */ c = GETNEXT(); pos = HERE(); - switch (c) { + switch (c) + { case '(': REQUIRE(MORE(), REG_EPAREN); p->g->nsub++; @@ -347,7 +364,8 @@ register struct parse *p; EMIT(OLPAREN, subno); if (!SEE(')')) p_ere(p, ')'); - if (subno < NPAREN) { + if (subno < NPAREN) + { p->pend[subno] = HERE(); assert(p->pend[subno] != 0); } @@ -355,13 +373,13 @@ register struct parse *p; MUSTEAT(')', REG_EPAREN); break; #ifndef POSIX_MISTAKE - case ')': /* happens only if no current unmatched ( */ + case ')': /* happens only if no current unmatched ( */ + /* - * You may ask, why the ifndef? Because I didn't notice - * this until slightly too late for 1003.2, and none of the - * other 1003.2 regular-expression reviewers noticed it at - * all. So an unmatched ) is legal POSIX, at least until - * we can get it fixed. + * You may ask, why the ifndef? Because I didn't notice this + * until slightly too late for 1003.2, and none of the other + * 1003.2 regular-expression reviewers noticed it at all. So an + * unmatched ) is legal POSIX, at least until we can get it fixed. */ SETERROR(REG_EPAREN); break; @@ -386,7 +404,7 @@ register struct parse *p; SETERROR(REG_BADRPT); break; case '.': - if (p->g->cflags®_NEWLINE) + if (p->g->cflags & REG_NEWLINE) nonnewline(p); else EMIT(OANY, 0); @@ -399,7 +417,8 @@ register struct parse *p; c = GETNEXT(); ordinary(p, c); break; - case '{': /* okay as ordinary except if digit follows */ + case '{': /* okay as ordinary except if digit + * follows */ REQUIRE(!MORE() || !isdigit(PEEK()), REG_BADRPT); /* FALLTHROUGH */ default: @@ -411,14 +430,15 @@ register struct parse *p; return; c = PEEK(); /* we call { a repetition if followed by a digit */ - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) )) - return; /* no repetition, we're done */ + if (!(c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit(PEEK2())))) + return; /* no repetition, we're done */ NEXT(); REQUIRE(!wascaret, REG_BADRPT); - switch (c) { - case '*': /* implemented as +? */ + switch (c) + { + case '*': /* implemented as +? */ /* this case does not require the (y|) trick, noKLUDGE */ INSERT(OPLUS_, pos); ASTERN(O_PLUS, pos); @@ -433,23 +453,30 @@ register struct parse *p; /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ INSERT(OCH_, pos); /* offset slightly wrong */ ASTERN(OOR1, pos); /* this one's right */ - AHEAD(pos); /* fix the OCH_ */ + AHEAD(pos); /* fix the OCH_ */ EMIT(OOR2, 0); /* offset very wrong... */ AHEAD(THERE()); /* ...so fix it */ ASTERN(O_CH, THERETHERE()); break; case '{': count = p_count(p); - if (EAT(',')) { - if (isdigit(PEEK())) { + if (EAT(',')) + { + if (isdigit(PEEK())) + { count2 = p_count(p); REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ + } + else +/* single number with comma */ count2 = INFINITY; - } else /* just a single number */ + } + else +/* just a single number */ count2 = count; repeat(p, pos, count, count2); - if (!EAT('}')) { /* error heuristics */ + if (!EAT('}')) + { /* error heuristics */ while (MORE() && PEEK() != '}') NEXT(); REQUIRE(MORE(), REG_EBRACE); @@ -461,8 +488,8 @@ register struct parse *p; if (!MORE()) return; c = PEEK(); - if (!( c == '*' || c == '+' || c == '?' || - (c == '{' && MORE2() && isdigit(PEEK2())) ) ) + if (!(c == '*' || c == '+' || c == '?' || + (c == '{' && MORE2() && isdigit(PEEK2())))) return; SETERROR(REG_BADRPT); } @@ -483,72 +510,78 @@ register struct parse *p; /* - p_bre - BRE parser top level, anchoring and concatenation == static void p_bre(register struct parse *p, register int end1, \ - == register int end2); + == register int end2); * Giving end1 as OUT essentially eliminates the end1/end2 check. * * This implementation is a bit of a kludge, in that a trailing $ is first * taken as an ordinary character and then revised to be an anchor. The * only undesirable side effect is that '$' gets included as a character - * category in such cases. This is fairly harmless; not worth fixing. + * category in such cases. This is fairly harmless; not worth fixing. * The amount of lookahead needed to avoid this kludge is excessive. */ static void p_bre(p, end1, end2) register struct parse *p; -register int end1; /* first terminating character */ -register int end2; /* second terminating character */ +register int end1; /* first terminating character */ +register int end2; /* second terminating character */ { - register sopno start = HERE(); - register int first = 1; /* first subexpression? */ - register int wasdollar = 0; + register sopno start = HERE(); + register int first = 1; /* first subexpression? */ + register int wasdollar = 0; - if (EAT('^')) { + if (EAT('^')) + { EMIT(OBOL, 0); p->g->iflags |= USEBOL; p->g->nbol++; } - while (MORE() && !SEETWO(end1, end2)) { + while (MORE() && !SEETWO(end1, end2)) + { wasdollar = p_simp_re(p, first); first = 0; } - if (wasdollar) { /* oops, that was a trailing anchor */ + if (wasdollar) + { /* oops, that was a trailing anchor */ DROP(1); EMIT(OEOL, 0); p->g->iflags |= USEEOL; p->g->neol++; } - REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ + REQUIRE(HERE() != start, REG_EMPTY); /* require nonempty */ } /* - p_simp_re - parse a simple RE, an atom possibly followed by a repetition == static int p_simp_re(register struct parse *p, int starordinary); */ -static int /* was the simple RE an unbackslashed $? */ +static int /* was the simple RE an unbackslashed $? */ p_simp_re(p, starordinary) register struct parse *p; -int starordinary; /* is a leading * an ordinary character? */ +int starordinary; /* is a leading * an ordinary character? */ { - register int c; - register int count; - register int count2; - register sopno pos; - register int i; - register sopno subno; -# define BACKSL (1<<CHAR_BIT) + register int c; + register int count; + register int count2; + register sopno pos; + register int i; + register sopno subno; - pos = HERE(); /* repetion op, if any, covers from here */ +#define BACKSL (1<<CHAR_BIT) - assert(MORE()); /* caller should have ensured this */ + pos = HERE(); /* repetion op, if any, covers from here */ + + assert(MORE()); /* caller should have ensured this */ c = GETNEXT(); - if (c == '\\') { + if (c == '\\') + { REQUIRE(MORE(), REG_EESCAPE); - c = BACKSL | (unsigned char)GETNEXT(); + c = BACKSL | (unsigned char) GETNEXT(); } - switch (c) { + switch (c) + { case '.': - if (p->g->cflags®_NEWLINE) + if (p->g->cflags & REG_NEWLINE) nonnewline(p); else EMIT(OANY, 0); @@ -556,10 +589,10 @@ int starordinary; /* is a leading * an ordinary character? */ case '[': p_bracket(p); break; - case BACKSL|'{': + case BACKSL | '{': SETERROR(REG_BADRPT); break; - case BACKSL|'(': + case BACKSL | '(': p->g->nsub++; subno = p->g->nsub; if (subno < NPAREN) @@ -568,37 +601,40 @@ int starordinary; /* is a leading * an ordinary character? */ /* the MORE here is an error heuristic */ if (MORE() && !SEETWO('\\', ')')) p_bre(p, '\\', ')'); - if (subno < NPAREN) { + if (subno < NPAREN) + { p->pend[subno] = HERE(); assert(p->pend[subno] != 0); } EMIT(ORPAREN, subno); REQUIRE(EATTWO('\\', ')'), REG_EPAREN); break; - case BACKSL|')': /* should not get here -- must be user */ - case BACKSL|'}': + case BACKSL | ')': /* should not get here -- must be user */ + case BACKSL | '}': SETERROR(REG_EPAREN); break; - case BACKSL|'1': - case BACKSL|'2': - case BACKSL|'3': - case BACKSL|'4': - case BACKSL|'5': - case BACKSL|'6': - case BACKSL|'7': - case BACKSL|'8': - case BACKSL|'9': - i = (c&~BACKSL) - '0'; + case BACKSL | '1': + case BACKSL | '2': + case BACKSL | '3': + case BACKSL | '4': + case BACKSL | '5': + case BACKSL | '6': + case BACKSL | '7': + case BACKSL | '8': + case BACKSL | '9': + i = (c & ~BACKSL) - '0'; assert(i < NPAREN); - if (p->pend[i] != 0) { + if (p->pend[i] != 0) + { assert(i <= p->g->nsub); EMIT(OBACK_, i); assert(p->pbegin[i] != 0); assert(OP(p->strip[p->pbegin[i]]) == OLPAREN); assert(OP(p->strip[p->pend[i]]) == ORPAREN); - dupl(p, p->pbegin[i]+1, p->pend[i]); + dupl(p, p->pbegin[i] + 1, p->pend[i]); EMIT(O_BACK, i); - } else + } + else SETERROR(REG_ESUBREG); p->g->backrefs = 1; break; @@ -606,57 +642,69 @@ int starordinary; /* is a leading * an ordinary character? */ REQUIRE(starordinary, REG_BADRPT); /* FALLTHROUGH */ default: - ordinary(p, c &~ BACKSL); + ordinary(p, c & ~BACKSL); break; } - if (EAT('*')) { /* implemented as +? */ + if (EAT('*')) + { /* implemented as +? */ /* this case does not require the (y|) trick, noKLUDGE */ INSERT(OPLUS_, pos); ASTERN(O_PLUS, pos); INSERT(OQUEST_, pos); ASTERN(O_QUEST, pos); - } else if (EATTWO('\\', '{')) { + } + else if (EATTWO('\\', '{')) + { count = p_count(p); - if (EAT(',')) { - if (MORE() && isdigit(PEEK())) { + if (EAT(',')) + { + if (MORE() && isdigit(PEEK())) + { count2 = p_count(p); REQUIRE(count <= count2, REG_BADBR); - } else /* single number with comma */ + } + else +/* single number with comma */ count2 = INFINITY; - } else /* just a single number */ + } + else +/* just a single number */ count2 = count; repeat(p, pos, count, count2); - if (!EATTWO('\\', '}')) { /* error heuristics */ + if (!EATTWO('\\', '}')) + { /* error heuristics */ while (MORE() && !SEETWO('\\', '}')) NEXT(); REQUIRE(MORE(), REG_EBRACE); SETERROR(REG_BADBR); } - } else if (c == (unsigned char)'$') /* $ (but not \$) ends it */ - return(1); + } + else if (c == (unsigned char) '$') /* $ (but not \$) ends it */ + return (1); - return(0); + return (0); } /* - p_count - parse a repetition count == static int p_count(register struct parse *p); */ -static int /* the value */ +static int /* the value */ p_count(p) register struct parse *p; { - register int count = 0; - register int ndigits = 0; + register int count = 0; + register int ndigits = 0; - while (MORE() && isdigit(PEEK()) && count <= DUPMAX) { - count = count*10 + (GETNEXT() - '0'); + while (MORE() && isdigit(PEEK()) && count <= DUPMAX) + { + count = count * 10 + (GETNEXT() - '0'); ndigits++; } REQUIRE(ndigits > 0 && count <= DUPMAX, REG_BADBR); - return(count); + return (count); } /* @@ -670,23 +718,25 @@ static void p_bracket(p) register struct parse *p; { - register cset *cs = allocset(p); - register int invert = 0; + register cset *cs = allocset(p); + register int invert = 0; /* Dept of Truly Sickening Special-Case Kludges */ - if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) { + if (p->next + 5 < p->end && strncmp(p->next, "[:<:]]", 6) == 0) + { EMIT(OBOW, 0); NEXTn(6); return; } - if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) { + if (p->next + 5 < p->end && strncmp(p->next, "[:>:]]", 6) == 0) + { EMIT(OEOW, 0); NEXTn(6); return; } if (EAT('^')) - invert++; /* make note to invert set at end */ + invert++; /* make note to invert set at end */ if (EAT(']')) CHadd(cs, ']'); else if (EAT('-')) @@ -697,15 +747,17 @@ register struct parse *p; CHadd(cs, '-'); MUSTEAT(']', REG_EBRACK); - if (p->error != 0) /* don't mess things up further */ + if (p->error != 0) /* don't mess things up further */ return; - if (p->g->cflags®_ICASE) { - register int i; - register int ci; + if (p->g->cflags & REG_ICASE) + { + register int i; + register int ci; for (i = p->g->csetsize - 1; i >= 0; i--) - if (CHIN(cs, i) && isalpha(i)) { + if (CHIN(cs, i) && isalpha(i)) + { ci = othercase(i); if (ci != i) CHadd(cs, ci); @@ -713,26 +765,29 @@ register struct parse *p; if (cs->multis != NULL) mccase(p, cs); } - if (invert) { - register int i; + if (invert) + { + register int i; for (i = p->g->csetsize - 1; i >= 0; i--) if (CHIN(cs, i)) CHsub(cs, i); else CHadd(cs, i); - if (p->g->cflags®_NEWLINE) + if (p->g->cflags & REG_NEWLINE) CHsub(cs, '\n'); if (cs->multis != NULL) mcinvert(p, cs); } - assert(cs->multis == NULL); /* xxx */ + assert(cs->multis == NULL); /* xxx */ - if (nch(p, cs) == 1) { /* optimize singleton sets */ + if (nch(p, cs) == 1) + { /* optimize singleton sets */ ordinary(p, firstch(p, cs)); freeset(p, cs); - } else + } + else EMIT(OANYOF, freezeset(p, cs)); } @@ -743,28 +798,31 @@ register struct parse *p; static void p_b_term(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register char c; - register char start, finish; - register int i; + register char c; + register char start, + finish; + register int i; /* classify what we've got */ - switch ((MORE()) ? PEEK() : '\0') { + switch ((MORE()) ? PEEK() : '\0') + { case '[': c = (MORE2()) ? PEEK2() : '\0'; break; case '-': SETERROR(REG_ERANGE); - return; /* NOTE RETURN */ + return; /* NOTE RETURN */ break; default: c = '\0'; break; } - switch (c) { - case ':': /* character class */ + switch (c) + { + case ':': /* character class */ NEXT2(); REQUIRE(MORE(), REG_EBRACK); c = PEEK(); @@ -773,7 +831,7 @@ register cset *cs; REQUIRE(MORE(), REG_EBRACK); REQUIRE(EATTWO(':', ']'), REG_ECTYPE); break; - case '=': /* equivalence class */ + case '=': /* equivalence class */ NEXT2(); REQUIRE(MORE(), REG_EBRACK); c = PEEK(); @@ -782,17 +840,19 @@ register cset *cs; REQUIRE(MORE(), REG_EBRACK); REQUIRE(EATTWO('=', ']'), REG_ECOLLATE); break; - default: /* symbol, ordinary character, or range */ + default: /* symbol, ordinary character, or range */ /* xxx revision needed for multichar stuff */ start = p_b_symbol(p); - if (SEE('-') && MORE2() && PEEK2() != ']') { + if (SEE('-') && MORE2() && PEEK2() != ']') + { /* range */ NEXT(); if (EAT('-')) finish = '-'; else finish = p_b_symbol(p); - } else + } + else finish = start; /* xxx what about signed chars here... */ REQUIRE(start <= finish, REG_ERANGE); @@ -809,13 +869,13 @@ register cset *cs; static void p_b_cclass(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register char *sp = p->next; + register char *sp = p->next; register struct cclass *cp; register size_t len; - register char *u; - register char c; + register char *u; + register char c; while (MORE() && isalpha(PEEK())) NEXT(); @@ -823,7 +883,8 @@ register cset *cs; for (cp = cclasses; cp->name != NULL; cp++) if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') break; - if (cp->name == NULL) { + if (cp->name == NULL) + { /* oops, didn't find it */ SETERROR(REG_ECTYPE); return; @@ -845,9 +906,9 @@ register cset *cs; static void p_b_eclass(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register char c; + register char c; c = p_b_coll_elem(p, '='); CHadd(cs, c); @@ -857,66 +918,68 @@ register cset *cs; - p_b_symbol - parse a character or [..]ed multicharacter collating symbol == static char p_b_symbol(register struct parse *p); */ -static char /* value of symbol */ +static char /* value of symbol */ p_b_symbol(p) register struct parse *p; { - register char value; + register char value; REQUIRE(MORE(), REG_EBRACK); if (!EATTWO('[', '.')) - return(GETNEXT()); + return (GETNEXT()); /* collating symbol */ value = p_b_coll_elem(p, '.'); REQUIRE(EATTWO('.', ']'), REG_ECOLLATE); - return(value); + return (value); } /* - p_b_coll_elem - parse a collating-element name and look it up == static char p_b_coll_elem(register struct parse *p, int endc); */ -static char /* value of collating element */ +static char /* value of collating element */ p_b_coll_elem(p, endc) register struct parse *p; -int endc; /* name ended by endc,']' */ +int endc; /* name ended by endc,']' */ { - register char *sp = p->next; + register char *sp = p->next; register struct cname *cp; - register int len; + register int len; while (MORE() && !SEETWO(endc, ']')) NEXT(); - if (!MORE()) { + if (!MORE()) + { SETERROR(REG_EBRACK); - return(0); + return (0); } len = p->next - sp; for (cp = cnames; cp->name != NULL; cp++) if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0') - return(cp->code); /* known name */ + return (cp->code); /* known name */ if (len == 1) - return(*sp); /* single character */ - SETERROR(REG_ECOLLATE); /* neither */ - return(0); + return (*sp); /* single character */ + SETERROR(REG_ECOLLATE); /* neither */ + return (0); } /* - othercase - return the case counterpart of an alphabetic == static char othercase(int ch); */ -static char /* if no counterpart, return ch */ +static char /* if no counterpart, return ch */ othercase(ch) -int ch; +int ch; { assert(isalpha(ch)); if (isupper(ch)) - return(tolower(ch)); + return (tolower(ch)); else if (islower(ch)) - return(toupper(ch)); - else /* peculiar, but could happen */ - return(ch); + return (toupper(ch)); + else +/* peculiar, but could happen */ + return (ch); } /* @@ -928,20 +991,20 @@ int ch; static void bothcases(p, ch) register struct parse *p; -int ch; +int ch; { - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[3]; + register char *oldnext = p->next; + register char *oldend = p->end; + char bracket[3]; - assert(othercase(ch) != ch); /* p_bracket() would recurse */ + assert(othercase(ch) != ch);/* p_bracket() would recurse */ p->next = bracket; - p->end = bracket+2; + p->end = bracket + 2; bracket[0] = ch; bracket[1] = ']'; bracket[2] = '\0'; p_bracket(p); - assert(p->next == bracket+2); + assert(p->next == bracket + 2); p->next = oldnext; p->end = oldend; } @@ -953,14 +1016,15 @@ int ch; static void ordinary(p, ch) register struct parse *p; -register int ch; +register int ch; { register cat_t *cap = p->g->categories; - if ((p->g->cflags®_ICASE) && isalpha(ch) && othercase(ch) != ch) + if ((p->g->cflags & REG_ICASE) && isalpha(ch) && othercase(ch) != ch) bothcases(p, ch); - else { - EMIT(OCHAR, (unsigned char)ch); + else + { + EMIT(OCHAR, (unsigned char) ch); if (cap[ch] == 0) cap[ch] = p->g->ncategories++; } @@ -976,18 +1040,18 @@ static void nonnewline(p) register struct parse *p; { - register char *oldnext = p->next; - register char *oldend = p->end; - char bracket[4]; + register char *oldnext = p->next; + register char *oldend = p->end; + char bracket[4]; p->next = bracket; - p->end = bracket+3; + p->end = bracket + 3; bracket[0] = '^'; bracket[1] = '\n'; bracket[2] = ']'; bracket[3] = '\0'; p_bracket(p); - assert(p->next == bracket+3); + assert(p->next == bracket + 3); p->next = oldnext; p->end = oldend; } @@ -999,42 +1063,45 @@ register struct parse *p; static void repeat(p, start, from, to) register struct parse *p; -sopno start; /* operand from here to end of strip */ -int from; /* repeated from this number */ -int to; /* to this number of times (maybe INFINITY) */ +sopno start; /* operand from here to end of strip */ +int from; /* repeated from this number */ +int to; /* to this number of times (maybe + * INFINITY) */ { - register sopno finish = HERE(); -# define N 2 -# define INF 3 -# define REP(f, t) ((f)*8 + (t)) -# define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) - register sopno copy; - - if (p->error != 0) /* head off possible runaway recursion */ + register sopno finish = HERE(); + +#define N 2 +#define INF 3 +#define REP(f, t) ((f)*8 + (t)) +#define MAP(n) (((n) <= 1) ? (n) : ((n) == INFINITY) ? INF : N) + register sopno copy; + + if (p->error != 0) /* head off possible runaway recursion */ return; assert(from <= to); - switch (REP(MAP(from), MAP(to))) { - case REP(0, 0): /* must be user doing this */ - DROP(finish-start); /* drop the operand */ + switch (REP(MAP(from), MAP(to))) + { + case REP(0, 0): /* must be user doing this */ + DROP(finish - start); /* drop the operand */ break; - case REP(0, 1): /* as x{1,1}? */ - case REP(0, N): /* as x{1,n}? */ - case REP(0, INF): /* as x{1,}? */ + case REP(0, 1): /* as x{1,1}? */ + case REP(0, N): /* as x{1,n}? */ + case REP(0, INF): /* as x{1,}? */ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ - INSERT(OCH_, start); /* offset is wrong... */ - repeat(p, start+1, 1, to); + INSERT(OCH_, start); /* offset is wrong... */ + repeat(p, start + 1, 1, to); ASTERN(OOR1, start); AHEAD(start); /* ... fix it */ EMIT(OOR2, 0); AHEAD(THERE()); ASTERN(O_CH, THERETHERE()); break; - case REP(1, 1): /* trivial case */ + case REP(1, 1): /* trivial case */ /* done */ break; - case REP(1, N): /* as x?x{1,n-1} */ + case REP(1, N): /* as x?x{1,n-1} */ /* KLUDGE: emit y? as (y|) until subtle bug gets fixed */ INSERT(OCH_, start); ASTERN(OOR1, start); @@ -1042,23 +1109,23 @@ int to; /* to this number of times (maybe INFINITY) */ EMIT(OOR2, 0); /* offset very wrong... */ AHEAD(THERE()); /* ...so fix it */ ASTERN(O_CH, THERETHERE()); - copy = dupl(p, start+1, finish+1); - assert(copy == finish+4); - repeat(p, copy, 1, to-1); + copy = dupl(p, start + 1, finish + 1); + assert(copy == finish + 4); + repeat(p, copy, 1, to - 1); break; - case REP(1, INF): /* as x+ */ + case REP(1, INF): /* as x+ */ INSERT(OPLUS_, start); ASTERN(O_PLUS, start); break; - case REP(N, N): /* as xx{m-1,n-1} */ + case REP(N, N): /* as xx{m-1,n-1} */ copy = dupl(p, start, finish); - repeat(p, copy, from-1, to-1); + repeat(p, copy, from - 1, to - 1); break; - case REP(N, INF): /* as xx{n-1,INF} */ + case REP(N, INF): /* as xx{n-1,INF} */ copy = dupl(p, start, finish); - repeat(p, copy, from-1, to); + repeat(p, copy, from - 1, to); break; - default: /* "can't happen" */ + default: /* "can't happen" */ SETERROR(REG_ASSERT); /* just in case */ break; } @@ -1068,71 +1135,74 @@ int to; /* to this number of times (maybe INFINITY) */ - seterr - set an error condition == static int seterr(register struct parse *p, int e); */ -static int /* useless but makes type checking happy */ +static int /* useless but makes type checking happy */ seterr(p, e) register struct parse *p; -int e; +int e; { - if (p->error == 0) /* keep earliest error condition */ + if (p->error == 0) /* keep earliest error condition */ p->error = e; - p->next = nuls; /* try to bring things to a halt */ + p->next = nuls; /* try to bring things to a halt */ p->end = nuls; - return(0); /* make the return value well-defined */ + return (0); /* make the return value well-defined */ } /* - allocset - allocate a set of characters for [] == static cset *allocset(register struct parse *p); */ -static cset * +static cset * allocset(p) register struct parse *p; { - register int no = p->g->ncsets++; + register int no = p->g->ncsets++; register size_t nc; register size_t nbytes; - register cset *cs; - register size_t css = (size_t)p->g->csetsize; - register int i; + register cset *cs; + register size_t css = (size_t) p->g->csetsize; + register int i; - if (no >= p->ncsalloc) { /* need another column of space */ + if (no >= p->ncsalloc) + { /* need another column of space */ p->ncsalloc += CHAR_BIT; nc = p->ncsalloc; assert(nc % CHAR_BIT == 0); nbytes = nc / CHAR_BIT * css; if (p->g->sets == NULL) - p->g->sets = (cset *)malloc(nc * sizeof(cset)); + p->g->sets = (cset *) malloc(nc * sizeof(cset)); else - p->g->sets = (cset *)realloc((char *)p->g->sets, - nc * sizeof(cset)); + p->g->sets = (cset *) realloc((char *) p->g->sets, + nc * sizeof(cset)); if (p->g->setbits == NULL) - p->g->setbits = (uch *)malloc(nbytes); - else { - p->g->setbits = (uch *)realloc((char *)p->g->setbits, - nbytes); + p->g->setbits = (uch *) malloc(nbytes); + else + { + p->g->setbits = (uch *) realloc((char *) p->g->setbits, + nbytes); /* xxx this isn't right if setbits is now NULL */ for (i = 0; i < no; i++) - p->g->sets[i].ptr = p->g->setbits + css*(i/CHAR_BIT); + p->g->sets[i].ptr = p->g->setbits + css * (i / CHAR_BIT); } if (p->g->sets != NULL && p->g->setbits != NULL) - memset((char *)p->g->setbits + (nbytes - css), - 0, css); - else { + memset((char *) p->g->setbits + (nbytes - css), + 0, css); + else + { no = 0; SETERROR(REG_ESPACE); /* caller's responsibility not to do set ops */ } } - assert(p->g->sets != NULL); /* xxx */ + assert(p->g->sets != NULL); /* xxx */ cs = &p->g->sets[no]; - cs->ptr = p->g->setbits + css*((no)/CHAR_BIT); + cs->ptr = p->g->setbits + css * ((no) / CHAR_BIT); cs->mask = 1 << ((no) % CHAR_BIT); cs->hash = 0; cs->smultis = 0; cs->multis = NULL; - return(cs); + return (cs); } /* @@ -1142,15 +1212,15 @@ register struct parse *p; static void freeset(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register int i; - register cset *top = &p->g->sets[p->g->ncsets]; - register size_t css = (size_t)p->g->csetsize; + register int i; + register cset *top = &p->g->sets[p->g->ncsets]; + register size_t css = (size_t) p->g->csetsize; for (i = 0; i < css; i++) CHsub(cs, i); - if (cs == top-1) /* recover only the easy case */ + if (cs == top - 1) /* recover only the easy case */ p->g->ncsets--; } @@ -1160,24 +1230,25 @@ register cset *cs; * * The main task here is merging identical sets. This is usually a waste * of time (although the hash code minimizes the overhead), but can win - * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash + * big if REG_ICASE is being used. REG_ICASE, by the way, is why the hash * is done using addition rather than xor -- all ASCII [aA] sets xor to * the same value! */ -static int /* set number */ +static int /* set number */ freezeset(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register uch h = cs->hash; - register int i; - register cset *top = &p->g->sets[p->g->ncsets]; - register cset *cs2; - register size_t css = (size_t)p->g->csetsize; + register uch h = cs->hash; + register int i; + register cset *top = &p->g->sets[p->g->ncsets]; + register cset *cs2; + register size_t css = (size_t) p->g->csetsize; /* look for an earlier one which is the same */ for (cs2 = &p->g->sets[0]; cs2 < top; cs2++) - if (cs2->hash == h && cs2 != cs) { + if (cs2->hash == h && cs2 != cs) + { /* maybe */ for (i = 0; i < css; i++) if (!!CHIN(cs2, i) != !!CHIN(cs, i)) @@ -1186,31 +1257,32 @@ register cset *cs; break; /* yes */ } - if (cs2 < top) { /* found one */ + if (cs2 < top) + { /* found one */ freeset(p, cs); cs = cs2; } - return((int)(cs - p->g->sets)); + return ((int) (cs - p->g->sets)); } /* - firstch - return first character in a set (which must have at least one) == static int firstch(register struct parse *p, register cset *cs); */ -static int /* character; there is no "none" value */ +static int /* character; there is no "none" value */ firstch(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register int i; - register size_t css = (size_t)p->g->csetsize; + register int i; + register size_t css = (size_t) p->g->csetsize; for (i = 0; i < css; i++) if (CHIN(cs, i)) - return((char)i); + return ((char) i); assert(never); - return(0); /* arbitrary */ + return (0); /* arbitrary */ } /* @@ -1220,28 +1292,28 @@ register cset *cs; static int nch(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - register int i; - register size_t css = (size_t)p->g->csetsize; - register int n = 0; + register int i; + register size_t css = (size_t) p->g->csetsize; + register int n = 0; for (i = 0; i < css; i++) if (CHIN(cs, i)) n++; - return(n); + return (n); } /* - mcadd - add a collating element to a cset == static void mcadd(register struct parse *p, register cset *cs, \ - == register char *cp); + == register char *cp); */ static void mcadd(p, cs, cp) register struct parse *p; -register cset *cs; -register char *cp; +register cset *cs; +register char *cp; { register size_t oldend = cs->smultis; @@ -1250,7 +1322,8 @@ register char *cp; cs->multis = malloc(cs->smultis); else cs->multis = realloc(cs->multis, cs->smultis); - if (cs->multis == NULL) { + if (cs->multis == NULL) + { SETERROR(REG_ESPACE); return; } @@ -1269,22 +1342,22 @@ mcsub(cs, cp) register cset *cs; register char *cp; { - register char *fp = mcfind(cs, cp); - register size_t len = strlen(fp); - - assert(fp != NULL); - 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; - } + register char *fp = mcfind(cs, cp); + register size_t len = strlen(fp); + + assert(fp != NULL); + 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); + cs->multis = realloc(cs->multis, cs->smultis); + assert(cs->multis != NULL); } */ @@ -1298,7 +1371,7 @@ mcin(cs, cp) register cset *cs; register char *cp; { - return(mcfind(cs, cp) != NULL); + return(mcfind(cs, cp) != NULL); } */ @@ -1312,14 +1385,14 @@ mcfind(cs, cp) register cset *cs; register char *cp; { - register char *p; + register char *p; - if (cs->multis == NULL) + 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); - for (p = cs->multis; *p != '\0'; p += strlen(p) + 1) - if (strcmp(cp, p) == 0) - return(p); - return(NULL); } */ /* @@ -1332,9 +1405,9 @@ register char *cp; static void mcinvert(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - assert(cs->multis == NULL); /* xxx */ + assert(cs->multis == NULL); /* xxx */ } /* @@ -1347,51 +1420,51 @@ register cset *cs; static void mccase(p, cs) register struct parse *p; -register cset *cs; +register cset *cs; { - assert(cs->multis == NULL); /* xxx */ + assert(cs->multis == NULL); /* xxx */ } /* - isinsets - is this character in any sets? == static int isinsets(register struct re_guts *g, int c); */ -static int /* predicate */ +static int /* predicate */ isinsets(g, c) register struct re_guts *g; -int c; +int c; { - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc = (unsigned char)c; + register uch *col; + register int i; + register int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT; + register unsigned uc = (unsigned char) c; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc] != 0) - return(1); - return(0); + return (1); + return (0); } /* - samesets - are these two characters in exactly the same sets? == static int samesets(register struct re_guts *g, int c1, int c2); */ -static int /* predicate */ +static int /* predicate */ samesets(g, c1, c2) register struct re_guts *g; -int c1; -int c2; +int c1; +int c2; { - register uch *col; - register int i; - register int ncols = (g->ncsets+(CHAR_BIT-1)) / CHAR_BIT; - register unsigned uc1 = (unsigned char)c1; - register unsigned uc2 = (unsigned char)c2; + register uch *col; + register int i; + register int ncols = (g->ncsets + (CHAR_BIT - 1)) / CHAR_BIT; + register unsigned uc1 = (unsigned char) c1; + register unsigned uc2 = (unsigned char) c2; for (i = 0, col = g->setbits; i < ncols; i++, col += g->csetsize) if (col[uc1] != col[uc2]) - return(0); - return(1); + return (0); + return (1); } /* @@ -1400,23 +1473,24 @@ int c2; */ static void categorize(p, g) -struct parse *p; +struct parse *p; register struct re_guts *g; { register cat_t *cats = g->categories; - register int c; - register int c2; - register cat_t cat; + register int c; + register int c2; + register cat_t cat; /* avoid making error situations worse */ if (p->error != 0) return; for (c = CHAR_MIN; c <= CHAR_MAX; c++) - if (cats[c] == 0 && isinsets(g, c)) { + if (cats[c] == 0 && isinsets(g, c)) + { cat = g->ncategories++; cats[c] = cat; - for (c2 = c+1; c2 <= CHAR_MAX; c2++) + for (c2 = c + 1; c2 <= CHAR_MAX; c2++) if (cats[c2] == 0 && samesets(g, c, c2)) cats[c2] = cat; } @@ -1426,24 +1500,24 @@ register struct re_guts *g; - dupl - emit a duplicate of a bunch of sops == static sopno dupl(register struct parse *p, sopno start, sopno finish); */ -static sopno /* start of duplicate */ +static sopno /* start of duplicate */ dupl(p, start, finish) register struct parse *p; -sopno start; /* from here */ -sopno finish; /* to this less one */ +sopno start; /* from here */ +sopno finish; /* to this less one */ { - register sopno ret = HERE(); - register sopno len = finish - start; + register sopno ret = HERE(); + register sopno len = finish - start; assert(finish >= start); if (len == 0) - return(ret); - enlarge(p, p->ssize + len); /* this many unexpected additions */ + return (ret); + enlarge(p, p->ssize + len); /* this many unexpected additions */ assert(p->ssize >= p->slen + len); - memcpy((char *)(p->strip + p->slen), - (char *)(p->strip + start), (size_t)len*sizeof(sop)); + memcpy((char *) (p->strip + p->slen), + (char *) (p->strip + start), (size_t) len * sizeof(sop)); p->slen += len; - return(ret); + return (ret); } /* @@ -1457,19 +1531,19 @@ sopno finish; /* to this less one */ static void doemit(p, op, opnd) register struct parse *p; -sop op; -size_t opnd; +sop op; +size_t opnd; { /* avoid making error situations worse */ if (p->error != 0) return; /* deal with oversize operands ("can't happen", more or less) */ - assert(opnd < 1<<OPSHIFT); + assert(opnd < 1 << OPSHIFT); /* deal with undersized strip */ if (p->slen >= p->ssize) - enlarge(p, (p->ssize+1) / 2 * 3); /* +50% */ + enlarge(p, (p->ssize + 1) / 2 * 3); /* +50% */ assert(p->slen < p->ssize); /* finally, it's all reduced to the easy case */ @@ -1483,36 +1557,39 @@ size_t opnd; static void doinsert(p, op, opnd, pos) register struct parse *p; -sop op; -size_t opnd; -sopno pos; +sop op; +size_t opnd; +sopno pos; { - register sopno sn; - register sop s; - register int i; + register sopno sn; + register sop s; + register int i; /* avoid making error situations worse */ if (p->error != 0) return; sn = HERE(); - EMIT(op, opnd); /* do checks, ensure space */ - assert(HERE() == sn+1); + EMIT(op, opnd); /* do checks, ensure space */ + assert(HERE() == sn + 1); s = p->strip[sn]; /* adjust paren pointers */ assert(pos > 0); - for (i = 1; i < NPAREN; i++) { - if (p->pbegin[i] >= pos) { + for (i = 1; i < NPAREN; i++) + { + if (p->pbegin[i] >= pos) + { p->pbegin[i]++; } - if (p->pend[i] >= pos) { + if (p->pend[i] >= pos) + { p->pend[i]++; } } - memmove((char *)&p->strip[pos+1], (char *)&p->strip[pos], - (HERE()-pos-1)*sizeof(sop)); + memmove((char *) &p->strip[pos + 1], (char *) &p->strip[pos], + (HERE() - pos - 1) * sizeof(sop)); p->strip[pos] = s; } @@ -1523,14 +1600,14 @@ sopno pos; static void dofwd(p, pos, value) register struct parse *p; -register sopno pos; -sop value; +register sopno pos; +sop value; { /* avoid making error situations worse */ if (p->error != 0) return; - assert(value < 1<<OPSHIFT); + assert(value < 1 << OPSHIFT); p->strip[pos] = OP(p->strip[pos]) | value; } @@ -1541,15 +1618,16 @@ sop value; static void enlarge(p, size) register struct parse *p; -register sopno size; +register sopno size; { - register sop *sp; + register sop *sp; if (p->ssize >= size) return; - sp = (sop *)realloc(p->strip, size*sizeof(sop)); - if (sp == NULL) { + sp = (sop *) realloc(p->strip, size * sizeof(sop)); + if (sp == NULL) + { SETERROR(REG_ESPACE); return; } @@ -1567,8 +1645,9 @@ register struct parse *p; register struct re_guts *g; { g->nstates = p->slen; - g->strip = (sop *)realloc((char *)p->strip, p->slen * sizeof(sop)); - if (g->strip == NULL) { + g->strip = (sop *) realloc((char *) p->strip, p->slen * sizeof(sop)); + if (g->strip == NULL) + { SETERROR(REG_ESPACE); g->strip = p->strip; } @@ -1586,16 +1665,16 @@ register struct re_guts *g; */ static void findmust(p, g) -struct parse *p; +struct parse *p; register struct re_guts *g; { - register sop *scan; - sop *start = 0; - register sop *newstart = 0; - register sopno newlen; - register sop s; - register char *cp; - register sopno i; + register sop *scan; + sop *start = 0; + register sop *newstart = 0; + register sopno newlen; + register sop s; + register char *cp; + register sopno i; /* avoid making error situations worse */ if (p->error != 0) @@ -1604,34 +1683,39 @@ register struct re_guts *g; /* find the longest OCHAR sequence in strip */ newlen = 0; scan = g->strip + 1; - do { + do + { s = *scan++; - switch (OP(s)) { - case OCHAR: /* sequence member */ - if (newlen == 0) /* new sequence */ + switch (OP(s)) + { + case OCHAR: /* sequence member */ + if (newlen == 0) /* new sequence */ newstart = scan - 1; newlen++; break; - case OPLUS_: /* things that don't break one */ + case OPLUS_: /* things that don't break one */ case OLPAREN: case ORPAREN: break; - case OQUEST_: /* things that must be skipped */ + case OQUEST_: /* things that must be skipped */ case OCH_: scan--; - do { + do + { scan += OPND(s); s = *scan; /* assert() interferes w debug printouts */ if (OP(s) != O_QUEST && OP(s) != O_CH && - OP(s) != OOR2) { + OP(s) != OOR2) + { g->iflags |= BAD; return; } } while (OP(s) != O_QUEST && OP(s) != O_CH); /* fallthrough */ - default: /* things that break a sequence */ - if (newlen > g->mlen) { /* ends one */ + default: /* things that break a sequence */ + if (newlen > g->mlen) + { /* ends one */ start = newstart; g->mlen = newlen; } @@ -1640,48 +1724,52 @@ register struct re_guts *g; } } while (OP(s) != OEND); - if (g->mlen == 0) /* there isn't one */ + if (g->mlen == 0) /* there isn't one */ return; /* turn it into a character string */ - g->must = malloc((size_t)g->mlen + 1); - if (g->must == NULL) { /* argh; just forget it */ + g->must = malloc((size_t) g->mlen + 1); + if (g->must == NULL) + { /* argh; just forget it */ g->mlen = 0; return; } cp = g->must; scan = start; - for (i = g->mlen; i > 0; i--) { + for (i = g->mlen; i > 0; i--) + { while (OP(s = *scan++) != OCHAR) continue; assert(cp < g->must + g->mlen); - *cp++ = (char)OPND(s); + *cp++ = (char) OPND(s); } assert(cp == g->must + g->mlen); - *cp++ = '\0'; /* just on general principles */ + *cp++ = '\0'; /* just on general principles */ } /* - pluscount - count + nesting == static sopno pluscount(register struct parse *p, register struct re_guts *g); */ -static sopno /* nesting depth */ +static sopno /* nesting depth */ pluscount(p, g) -struct parse *p; +struct parse *p; register struct re_guts *g; { - register sop *scan; - register sop s; - register sopno plusnest = 0; - register sopno maxnest = 0; + register sop *scan; + register sop s; + register sopno plusnest = 0; + register sopno maxnest = 0; if (p->error != 0) - return(0); /* there may not be an OEND */ + return (0); /* there may not be an OEND */ scan = g->strip + 1; - do { + do + { s = *scan++; - switch (OP(s)) { + switch (OP(s)) + { case OPLUS_: plusnest++; break; @@ -1694,5 +1782,5 @@ register struct re_guts *g; } while (OP(s) != OEND); if (plusnest != 0) g->iflags |= BAD; - return(maxnest); + return (maxnest); } |