Loading...
regex/FreeBSD/regcomp.c.patch Libc-391 Libc-763.12
--- Libc/Libc-391/regex/FreeBSD/regcomp.c.patch
+++ Libc/Libc-763.12/regex/FreeBSD/regcomp.c.patch
@@ -1,15 +1,15 @@
---- regcomp.c.orig	2004-11-25 11:38:32.000000000 -0800
-+++ regcomp.c	2005-02-24 13:46:56.000000000 -0800
-@@ -43,6 +43,8 @@
+--- regcomp.c.orig	2010-06-21 14:05:04.000000000 -0700
++++ regcomp.c	2010-06-21 14:23:51.000000000 -0700
+@@ -39,6 +39,8 @@ static char sccsid[] = "@(#)regcomp.c	8.
  #include <sys/cdefs.h>
- __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.34 2004/10/03 15:42:59 stefanf Exp $");
+ __FBSDID("$FreeBSD: src/lib/libc/regex/regcomp.c,v 1.36 2007/06/11 03:05:54 delphij Exp $");
  
 +#include "xlocale_private.h"
 +
  #include <sys/types.h>
  #include <stdio.h>
  #include <string.h>
-@@ -73,6 +75,9 @@
+@@ -69,6 +71,9 @@ struct parse {
  	sopno ssize;		/* malloced strip size (allocated) */
  	sopno slen;		/* malloced strip length (used) */
  	int ncsalloc;		/* number of csets allocated */
@@ -19,7 +19,7 @@
  	struct re_guts *g;
  #	define	NPAREN	10	/* we need to remember () 1-9 for back refs */
  	sopno pbegin[NPAREN];	/* -> ( ([0] unused) */
-@@ -97,7 +102,7 @@
+@@ -93,7 +98,7 @@ static void p_b_cclass(struct parse *p, 
  static void p_b_eclass(struct parse *p, cset *cs);
  static wint_t p_b_symbol(struct parse *p);
  static wint_t p_b_coll_elem(struct parse *p, wint_t endc);
@@ -28,7 +28,7 @@
  static void bothcases(struct parse *p, wint_t ch);
  static void ordinary(struct parse *p, wint_t ch);
  static void nonnewline(struct parse *p);
-@@ -108,7 +113,7 @@
+@@ -104,7 +109,7 @@ static void freeset(struct parse *p, cse
  static void CHadd(struct parse *p, cset *cs, wint_t ch);
  static void CHaddrange(struct parse *p, cset *cs, wint_t min, wint_t max);
  static void CHaddtype(struct parse *p, cset *cs, wctype_t wct);
@@ -37,7 +37,7 @@
  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);
-@@ -227,10 +232,14 @@
+@@ -222,10 +227,14 @@ regcomp(regex_t * __restrict preg,
  	p->end = p->next + len;
  	p->error = 0;
  	p->ncsalloc = 0;
@@ -52,7 +52,7 @@
  	g->sets = NULL;
  	g->ncsets = 0;
  	g->cflags = cflags;
-@@ -308,8 +317,12 @@
+@@ -302,8 +311,12 @@ p_ere(struct parse *p,
  		conc = HERE();
  		while (MORE() && (c = PEEK()) != '|' && c != stop)
  			p_ere_exp(p);
@@ -66,7 +66,7 @@
  		if (!EAT('|'))
  			break;		/* NOTE BREAK OUT */
  
-@@ -417,7 +430,7 @@
+@@ -410,7 +423,7 @@ p_ere_exp(struct parse *p)
  		ordinary(p, wc);
  		break;
  	case '{':		/* okay as ordinary except if digit follows */
@@ -75,7 +75,7 @@
  		/* FALLTHROUGH */
  	default:
  		p->next--;
-@@ -431,7 +444,7 @@
+@@ -424,7 +437,7 @@ p_ere_exp(struct parse *p)
  	c = PEEK();
  	/* we call { a repetition if followed by a digit */
  	if (!( c == '*' || c == '+' || c == '?' ||
@@ -84,7 +84,7 @@
  		return;		/* no repetition, we're done */
  	NEXT();
  
-@@ -460,7 +473,7 @@
+@@ -453,7 +466,7 @@ p_ere_exp(struct parse *p)
  	case '{':
  		count = p_count(p);
  		if (EAT(',')) {
@@ -93,7 +93,7 @@
  				count2 = p_count(p);
  				(void)REQUIRE(count <= count2, REG_BADBR);
  			} else		/* single number with comma */
-@@ -481,7 +494,7 @@
+@@ -474,7 +487,7 @@ p_ere_exp(struct parse *p)
  		return;
  	c = PEEK();
  	if (!( c == '*' || c == '+' || c == '?' ||
@@ -102,9 +102,9 @@
  		return;
  	SETERROR(REG_BADRPT);
  }
-@@ -494,7 +507,12 @@
- p_str(p)
- struct parse *p;
+@@ -486,7 +499,12 @@ p_ere_exp(struct parse *p)
+ static void
+ p_str(struct parse *p)
  {
 +#if __DARWIN_UNIX03
 + 	if (!p->zerorepeats) REQUIRE(MORE(), REG_EMPTY);
@@ -115,7 +115,7 @@
  	while (MORE())
  		ordinary(p, WGETNEXT());
  }
-@@ -534,8 +552,12 @@
+@@ -525,8 +543,12 @@ p_bre(struct parse *p,
  		p->g->iflags |= USEEOL;
  		p->g->neol++;
  	}
@@ -129,8 +129,34 @@
  }
  
  /*
-@@ -639,7 +661,7 @@
+@@ -599,12 +621,22 @@ p_simp_re(struct parse *p,
+ 		i = (c&~BACKSL) - '0';
+ 		assert(i < NPAREN);
+ 		if (p->pend[i] != 0) {
++#if __DARWIN_UNIX03
++			int skip = 1;
++#endif /* __DARWIN_UNIX03 */
+ 			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);
++#if __DARWIN_UNIX03
++			if (OP(p->strip[p->pbegin[i]+skip]) == OBOL) {
++				skip++;		/* don't dup anchor in subexp */
++			}
++			(void) dupl(p, p->pbegin[i]+skip, p->pend[i]);
++#else  /* !__DARWIN_UNIX03 */
+ 			(void) dupl(p, p->pbegin[i]+1, p->pend[i]);
++#endif /* __DARWIN_UNIX03 */
+ 			EMIT(O_BACK, i);
+ 		} else
+ 			SETERROR(REG_ESUBREG);
+@@ -627,9 +659,10 @@ p_simp_re(struct parse *p,
+ 		INSERT(OQUEST_, pos);
+ 		ASTERN(O_QUEST, pos);
  	} else if (EATTWO('\\', '{')) {
++		(void)REQUIRE(MORE(), REG_EBRACE);
  		count = p_count(p);
  		if (EAT(',')) {
 -			if (MORE() && isdigit((uch)PEEK())) {
@@ -138,7 +164,7 @@
  				count2 = p_count(p);
  				(void)REQUIRE(count <= count2, REG_BADBR);
  			} else		/* single number with comma */
-@@ -670,7 +692,7 @@
+@@ -659,7 +692,7 @@ p_count(struct parse *p)
  	int count = 0;
  	int ndigits = 0;
  
@@ -147,29 +173,30 @@
  		count = count*10 + (GETNEXT() - '0');
  		ndigits++;
  	}
-@@ -709,10 +731,21 @@
+@@ -697,10 +730,22 @@ p_bracket(struct parse *p)
  		cs->icase = 1;
  	if (EAT('^'))
  		cs->invert = 1;
 +#if __DARWIN_UNIX03
-+	if (PEEK2() != '-') {	/* Don't eat '-' or ']' if they're part of ranges */
-+		if (EAT(']'))
-+			CHadd(p, cs, ']');
-+		else if (EAT('-'))
-+			CHadd(p, cs, '-');
++	if (PEEK2() != '-' && PEEK2() != ']') {	/* Don't eat '-' or ']' if they're part of ranges
++						 * but do process [^-] */
+ 	if (EAT(']'))
+ 		CHadd(p, cs, ']');
+ 	else if (EAT('-'))
+ 		CHadd(p, cs, '-');
 +	}
 +	if (MORE() && !SEETWO('-',']')) /* Parse RE []-'] */
 +		p_b_term(p, cs);
 +#else /* !__DARWIN_UNIX03 */
- 	if (EAT(']'))
- 		CHadd(p, cs, ']');
- 	else if (EAT('-'))
- 		CHadd(p, cs, '-');
++	if (EAT(']'))
++		CHadd(p, cs, ']');
++	else if (EAT('-'))
++		CHadd(p, cs, '-');
 +#endif /* __DARWIN_UNIX03 */
  	while (MORE() && PEEK() != ']' && !SEETWO('-', ']'))
  		p_b_term(p, cs);
  	if (EAT('-'))
-@@ -725,7 +758,7 @@
+@@ -713,7 +758,7 @@ p_bracket(struct parse *p)
  	if (cs->invert && p->g->cflags&REG_NEWLINE)
  		cs->bmp['\n' >> 3] |= 1 << ('\n' & 7);
  
@@ -178,14 +205,14 @@
  		ordinary(p, ch);
  		freeset(p, cs);
  	} else
-@@ -751,8 +784,16 @@
+@@ -737,8 +782,16 @@ p_b_term(struct parse *p, cset *cs)
  		c = (MORE2()) ? PEEK2() : '\0';
  		break;
  	case '-':
 +#if __DARWIN_UNIX03
 + 		if (PEEK2() != '-') { /* Allow [---] */
-+			SETERROR(REG_ERANGE);
-+			return;			/* NOTE RETURN */
++		SETERROR(REG_ERANGE);
++		return;			/* NOTE RETURN */
 +		} else
 +			c = '-';
 +#else  /* !__DARWIN_UNIX03 */
@@ -195,7 +222,7 @@
  		break;
  	default:
  		c = '\0';
-@@ -773,7 +814,11 @@
+@@ -759,7 +812,11 @@ p_b_term(struct parse *p, cset *cs)
  		NEXT2();
  		(void)REQUIRE(MORE(), REG_EBRACK);
  		c = PEEK();
@@ -207,7 +234,7 @@
  		p_b_eclass(p, cs);
  		(void)REQUIRE(MORE(), REG_EBRACK);
  		(void)REQUIRE(EATTWO('=', ']'), REG_ECOLLATE);
-@@ -792,14 +837,14 @@
+@@ -778,14 +835,14 @@ p_b_term(struct parse *p, cset *cs)
  		if (start == finish)
  			CHadd(p, cs, start);
  		else {
@@ -226,7 +253,7 @@
  					   )
  						CHadd(p, cs, i);
  				}
-@@ -823,7 +868,7 @@
+@@ -807,7 +864,7 @@ p_b_cclass(struct parse *p, cset *cs)
  	wctype_t wct;
  	char clname[16];
  
@@ -235,7 +262,7 @@
  		NEXT();
  	len = p->next - sp;
  	if (len >= sizeof(clname) - 1) {
-@@ -832,7 +877,7 @@
+@@ -816,7 +873,7 @@ p_b_cclass(struct parse *p, cset *cs)
  	}
  	memcpy(clname, sp, len);
  	clname[len] = '\0';
@@ -244,27 +271,86 @@
  		SETERROR(REG_ECTYPE);
  		return;
  	}
-@@ -903,7 +948,7 @@
+@@ -826,14 +883,38 @@ p_b_cclass(struct parse *p, cset *cs)
+ /*
+  - p_b_eclass - parse an equivalence-class name and deal with it
+  == static void p_b_eclass(struct parse *p, cset *cs);
+- *
+- * This implementation is incomplete. xxx
+  */
+ static void
+ p_b_eclass(struct parse *p, cset *cs)
+ {
+-	wint_t c;
+-
++	char *sp = p->next;
++	int len, ec;
++	mbstate_t mbs;
++	int *newequiv_classes;
++ 	wint_t c;
++ 
++	while (MORE() && !SEETWO('=', ']'))
++		NEXT();
++	if (!MORE()) {
++		SETERROR(REG_EBRACK);
++		return;
++	}
++	len = p->next - sp;
++	memset(&mbs, 0, sizeof(mbs));
++	ec = __collate_equiv_class(sp, len, &mbs, p->g->loc);
++	if (ec > 0) {
++		newequiv_classes = realloc(cs->equiv_classes,
++		    (cs->nequiv_classes + 1) * sizeof(*cs->equiv_classes));
++		if (newequiv_classes == NULL) {
++			SETERROR(REG_ESPACE);
++			return;
++		}
++		cs->equiv_classes = newequiv_classes;
++		cs->equiv_classes[cs->nequiv_classes++] = ec;
++		return;
++	}
++	/* not an equivalence class, so fallback to a collating element */
++	p->next = sp;
+ 	c = p_b_coll_elem(p, '=');
+ 	CHadd(p, cs, c);
+ }
+@@ -866,10 +947,10 @@ p_b_coll_elem(struct parse *p,
+ 	wint_t endc)		/* name ended by endc,']' */
+ {
+ 	char *sp = p->next;
+-	struct cname *cp;
++	const struct cname *cp;
+ 	int len;
+ 	mbstate_t mbs;
+-	wchar_t wc;
++	wchar_t wbuf[16];
+ 	size_t clen;
+ 
+ 	while (MORE() && !SEETWO(endc, ']'))
+@@ -883,9 +964,10 @@ p_b_coll_elem(struct parse *p,
  		if (strncmp(cp->name, sp, len) == 0 && cp->name[len] == '\0')
  			return(cp->code);	/* known name */
  	memset(&mbs, 0, sizeof(mbs));
 -	if ((clen = mbrtowc(&wc, sp, len, &mbs)) == len)
-+	if ((clen = mbrtowc_l(&wc, sp, len, &mbs, p->g->loc)) == len)
- 		return (wc);			/* single character */
- 	else if (clen == (size_t)-1 || clen == (size_t)-2)
+-		return (wc);			/* single character */
+-	else if (clen == (size_t)-1 || clen == (size_t)-2)
++	clen = __collate_collating_symbol(wbuf, 16, sp, len, &mbs, p->g->loc);
++	if (clen == 1)
++		return (*wbuf);			/* single character */
++	else if (clen == (size_t)-1)
  		SETERROR(REG_ILLSEQ);
-@@ -914,17 +959,18 @@
+ 	else
+ 		SETERROR(REG_ECOLLATE);		/* neither */
+@@ -894,16 +976,16 @@ p_b_coll_elem(struct parse *p,
  
  /*
   - othercase - return the case counterpart of an alphabetic
 - == static char othercase(int ch);
-+ == static char othercase(int ch, locale_t loc);
++ == static char othercase(wint_t ch, locale_t loc);
   */
  static wint_t			/* if no counterpart, return ch */
--othercase(ch)
-+othercase(ch, loc)
- wint_t ch;
-+locale_t loc;
+-othercase(wint_t ch)
++othercase(wint_t ch, locale_t loc)
  {
 -	assert(iswalpha(ch));
 -	if (iswupper(ch))
@@ -279,7 +365,7 @@
  	else			/* peculiar, but could happen */
  		return(ch);
  }
-@@ -946,10 +992,10 @@
+@@ -923,10 +1005,10 @@ bothcases(struct parse *p, wint_t ch)
  	size_t n;
  	mbstate_t mbs;
  
@@ -292,7 +378,7 @@
  	assert(n != (size_t)-1);
  	bracket[n] = ']';
  	bracket[n + 1] = '\0';
-@@ -971,7 +1017,7 @@
+@@ -946,7 +1028,7 @@ ordinary(struct parse *p, wint_t ch)
  {
  	cset *cs;
  
@@ -301,7 +387,7 @@
  		bothcases(p, ch);
  	else if ((ch & OPDMASK) == ch)
  		EMIT(OCHAR, ch);
-@@ -1039,6 +1085,9 @@
+@@ -1012,10 +1094,22 @@ repeat(struct parse *p,
  	switch (REP(MAP(from), MAP(to))) {
  	case REP(0, 0):			/* must be user doing this */
  		DROP(finish-start);	/* drop the operand */
@@ -309,9 +395,42 @@
 +		p->zerorepeats++;
 +#endif /* __DARWIN_UNIX03 */
  		break;
++	case REP(0, INF):		/* as x{1,}? */
++#if __DARWIN_UNIX03
++		/* this case does not require the (y|) trick, noKLUDGE */
++		/* Just like * =+?  */
++		INSERT(OPLUS_, start);
++		ASTERN(O_PLUS, start);
++		INSERT(OQUEST_, start);
++		ASTERN(O_QUEST, start);
++		break;
++#endif /* __DARWIN_UNIX03 */
  	case REP(0, 1):			/* as x{1,1}? */
  	case REP(0, N):			/* as x{1,n}? */
-@@ -1099,7 +1148,7 @@
+-	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);
+@@ -1029,6 +1123,10 @@ repeat(struct parse *p,
+ 		/* done */
+ 		break;
+ 	case REP(1, N):			/* as x?x{1,n-1} */
++#if __DARWIN_UNIX03
++		INSERT(OQUEST_, start);
++		ASTERN(O_QUEST, start);
++#else /* !__DARWIN_UNIX03 */
+ 		/* KLUDGE: emit y? as (y|) until subtle bug gets fixed */
+ 		INSERT(OCH_, start);
+ 		ASTERN(OOR1, start);
+@@ -1036,6 +1134,7 @@ repeat(struct parse *p,
+ 		EMIT(OOR2, 0);			/* offset very wrong... */
+ 		AHEAD(THERE());			/* ...so fix it */
+ 		ASTERN(O_CH, THERETHERE());
++#endif /* __DARWIN_UNIX03 */
+ 		copy = dupl(p, start+1, finish+1);
+ 		assert(copy == finish+4);
+ 		repeat(p, copy, 1, to-1);
+@@ -1071,7 +1170,7 @@ wgetnext(struct parse *p)
  	size_t n;
  
  	memset(&mbs, 0, sizeof(mbs));
@@ -320,14 +439,12 @@
  	if (n == (size_t)-1 || n == (size_t)-2) {
  		SETERROR(REG_ILLSEQ);
  		return (0);
-@@ -1172,13 +1221,14 @@
+@@ -1139,12 +1238,12 @@ freeset(struct parse *p, cset *cs)
   - returning it if so, otherwise returning OUT.
   */
  static wint_t
--singleton(cs)
-+singleton(cs, loc)
- cset *cs;
-+locale_t loc;
+-singleton(cset *cs)
++singleton(cset *cs, locale_t loc)
  {
  	wint_t i, s, n;
  
@@ -337,7 +454,7 @@
  			n++;
  			s = i;
  		}
-@@ -1215,9 +1265,9 @@
+@@ -1178,9 +1277,9 @@ CHadd(struct parse *p, cset *cs, wint_t 
  		cs->wides[cs->nwides++] = ch;
  	}
  	if (cs->icase) {
@@ -349,7 +466,7 @@
  			cs->bmp[nch >> 3] |= 1 << (nch & 7);
  	}
  }
-@@ -1262,7 +1312,7 @@
+@@ -1219,7 +1318,7 @@ CHaddtype(struct parse *p, cset *cs, wct
  	wctype_t *newtypes;
  
  	for (i = 0; i < NC; i++)
@@ -358,7 +475,7 @@
  			CHadd(p, cs, i);
  	newtypes = realloc(cs->types, (cs->ntypes + 1) *
  	    sizeof(*cs->types));
-@@ -1451,6 +1501,7 @@
+@@ -1391,6 +1490,7 @@ findmust(struct parse *p, struct re_guts
  	char buf[MB_LEN_MAX];
  	size_t clen;
  	mbstate_t mbs;
@@ -366,7 +483,7 @@
  
  	/* avoid making error situations worse */
  	if (p->error != 0)
-@@ -1461,8 +1512,8 @@
+@@ -1401,8 +1501,8 @@ findmust(struct parse *p, struct re_guts
  	 * multibyte character strings, but it's safe for at least
  	 * UTF-8 (see RFC 3629).
  	 */
@@ -377,7 +494,7 @@
  		return;
  
  	/* find the longest OCHAR sequence in strip */
-@@ -1478,7 +1529,7 @@
+@@ -1418,7 +1518,7 @@ findmust(struct parse *p, struct re_guts
  				memset(&mbs, 0, sizeof(mbs));
  				newstart = scan - 1;
  			}
@@ -386,7 +503,7 @@
  			if (clen == (size_t)-1)
  				goto toohard;
  			newlen += clen;
-@@ -1597,7 +1648,7 @@
+@@ -1537,7 +1637,7 @@ findmust(struct parse *p, struct re_guts
  	while (cp < g->must + g->mlen) {
  		while (OP(s = *scan++) != OCHAR)
  			continue;