diff --git a/src/lib/libast/regex/regcoll.c b/src/lib/libast/regex/regcoll.c index 38ae26074..e08bb6792 100644 --- a/src/lib/libast/regex/regcoll.c +++ b/src/lib/libast/regex/regcoll.c @@ -56,7 +56,6 @@ regcollate(register const char* s, char** e, char* buf, size_t size, wchar_t* wc if (size < 2 || (term = *s) != '.' && term != '=' || !*++s || *s == term && *(s + 1) == ']') goto nope; t = s; - mbinit(); w = mbchar(s); if ((r = (s - t)) > 1) { diff --git a/src/lib/libast/regex/regcomp.c b/src/lib/libast/regex/regcomp.c index 31049d3f2..d01655804 100644 --- a/src/lib/libast/regex/regcomp.c +++ b/src/lib/libast/regex/regcomp.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1985-2013 AT&T Intellectual Property * +* Copyright (c) 1985-2012 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * @@ -1083,7 +1083,6 @@ col(Celt_t* ce, int ic, unsigned char* bp, int bw, int bc, unsigned char* ep, in if (cc > 0) { cc = -1; - mbinit(); k += mbconv((char*)k, c); } else @@ -1094,7 +1093,6 @@ col(Celt_t* ce, int ic, unsigned char* bp, int bw, int bc, unsigned char* ep, in if (ep) { k = key; - mbinit(); c = mbchar(k); if (iswupper(c)) bt = COLL_range_uc; @@ -1126,7 +1124,6 @@ col(Celt_t* ce, int ic, unsigned char* bp, int bw, int bc, unsigned char* ep, in s = (char*)ep; if (ic) { - mbinit(); c = mbchar(s); if (iswupper(c)) { @@ -1142,7 +1139,6 @@ col(Celt_t* ce, int ic, unsigned char* bp, int bw, int bc, unsigned char* ep, in if (cc > 0) { cc = -1; - mbinit(); k += mbconv((char*)k, c); } else @@ -1151,7 +1147,6 @@ col(Celt_t* ce, int ic, unsigned char* bp, int bw, int bc, unsigned char* ep, in *k = 0; mbxfrm(ce->end, key, COLL_KEY_MAX); k = key; - mbinit(); c = mbchar(k); if (iswupper(c)) et = COLL_range_uc; @@ -1521,7 +1516,6 @@ bra(Cenv_t* env) if (env->token.len > 1 || w >= 0 && w < T_META) { c = w; - mbinit(); w = mbconv(mbc, c); pp = (unsigned char*)mbc; env->cursor += env->token.len; @@ -1620,7 +1614,6 @@ bra(Cenv_t* env) if (iswupper(wc)) { wc = towlower(wc); - mbinit(); rw = mbconv((char*)pp, wc); c = 'u'; } @@ -1674,7 +1667,6 @@ bra(Cenv_t* env) wc = towupper(wc); c = 'U'; } - mbinit(); rw = mbconv((char*)pp, wc); i = 0; } @@ -2106,7 +2098,7 @@ grp(Cenv_t* env, int parno) switch (c) { case ')': - if (!(env->flags & (REG_LITERAL|REG_SHELL))) + if (!(env->flags & REG_LITERAL)) { env->error = REG_BADRPT; return 0; @@ -2539,7 +2531,7 @@ grp(Cenv_t* env, int parno) } c = token(env); env->parnest--; - if (c != T_CLOSE && (c != ')' || !(env->flags & (REG_LITERAL|REG_SHELL)))) + if (c != T_CLOSE && (!(env->flags & REG_LITERAL) || c != ')')) { env->error = REG_EPAREN; goto nope; @@ -2625,7 +2617,6 @@ seq(Cenv_t* env) c = towupper(c); if ((&buf[sizeof(buf)] - s) < MB_CUR_MAX) break; - mbinit(); if ((n = mbconv((char*)s, c)) < 0) *s++ = c; else if (n) @@ -3401,7 +3392,7 @@ regcomp(regex_t* p, const char* pattern, regflags_t flags) p->re_nsub /= 2; if (env.flags & REG_DELIMITED) { - p->re_npat = env.cursor - (unsigned char*)pattern + 1; + p->re_npat = env.cursor - env.pattern + 1; if (*env.cursor == env.delimiter) p->re_npat++; else if (env.flags & REG_MUSTDELIM) diff --git a/src/lib/libast/regex/regdecomp.c b/src/lib/libast/regex/regdecomp.c index b965b2bac..084b4387b 100644 --- a/src/lib/libast/regex/regdecomp.c +++ b/src/lib/libast/regex/regdecomp.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1985-2013 AT&T Intellectual Property * +* Copyright (c) 1985-2011 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * @@ -70,7 +70,7 @@ detrie(Trie_node_t* x, Sfio_t* sp, char* b, char* p, char* e, int delimiter) } static int -decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, regflags_t flags) +decomp(register Rex_t* e, Sfio_t* sp, int type, int delimiter, regflags_t flags) { Rex_t* q; unsigned char* s; @@ -92,10 +92,10 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re switch (e->type) { case REX_ALT: - if (decomp(e->re.group.expr.binary.left, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags)) return 1; sfputc(sp, '|'); - if (e->re.group.expr.binary.right && decomp(e->re.group.expr.binary.right, e, sp, type, delimiter, flags)) + if (e->re.group.expr.binary.right && decomp(e->re.group.expr.binary.right, sp, type, delimiter, flags)) return 1; break; case REX_BACK: @@ -141,13 +141,11 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re sfputc(sp, '?'); else c = 0; - if (e->re.group.expr.rex && e->re.group.expr.rex->type == REX_GROUP) - c = 0; } switch (e->type) { case REX_REP: - if (decomp(e->re.group.expr.rex, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags)) return 1; break; case REX_CLASS: @@ -324,7 +322,7 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re case REX_NEG: if (type >= SRE) sfprintf(sp, "!("); - if (decomp(e->re.group.expr.rex, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags)) return 1; if (type >= SRE) sfputc(sp, ')'); @@ -332,17 +330,17 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re sfputc(sp, '!'); break; case REX_CONJ: - if (decomp(e->re.group.expr.binary.left, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags)) return 1; sfputc(sp, '&'); - if (decomp(e->re.group.expr.binary.right, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.binary.right, sp, type, delimiter, flags)) return 1; break; case REX_GROUP: - if (type >= SRE && parent->type != REX_REP) + if (type >= SRE) sfputc(sp, '@'); meta(sp, '(', type, 1, delimiter); - if (decomp(e->re.group.expr.rex, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags)) return 1; meta(sp, ')', type, 1, delimiter); break; @@ -352,22 +350,22 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re case REX_GROUP_BEHIND_NOT: meta(sp, '(', type, 1, delimiter); sfputc(sp, '?'); - if (decomp(e->re.group.expr.rex, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags)) return 1; meta(sp, ')', type, 1, delimiter); break; case REX_GROUP_COND: meta(sp, '(', type, 1, delimiter); sfputc(sp, '?'); - if (e->re.group.expr.binary.left && decomp(e->re.group.expr.binary.left, e, sp, type, delimiter, flags)) + if (e->re.group.expr.binary.left && decomp(e->re.group.expr.binary.left, sp, type, delimiter, flags)) return 1; if (q = e->re.group.expr.binary.right) { sfputc(sp, ':'); - if (q->re.group.expr.binary.left && decomp(q->re.group.expr.binary.left, q, sp, type, delimiter, flags)) + if (q->re.group.expr.binary.left && decomp(q->re.group.expr.binary.left, sp, type, delimiter, flags)) return 1; sfputc(sp, ':'); - if (q->re.group.expr.binary.right && decomp(q->re.group.expr.binary.right, q, sp, type, delimiter, flags)) + if (q->re.group.expr.binary.right && decomp(q->re.group.expr.binary.right, sp, type, delimiter, flags)) return 1; } meta(sp, ')', type, 1, delimiter); @@ -375,7 +373,7 @@ decomp(register Rex_t* e, Rex_t* parent, Sfio_t* sp, int type, int delimiter, re case REX_GROUP_CUT: meta(sp, '(', type, 1, delimiter); sfputc(sp, '?'); - if (decomp(e->re.group.expr.rex, e, sp, type, delimiter, flags)) + if (decomp(e->re.group.expr.rex, sp, type, delimiter, flags)) return 1; meta(sp, ')', type, 1, delimiter); break; @@ -432,7 +430,7 @@ regdecomp(regex_t* p, regflags_t flags, char* buf, size_t n) } else delimiter = -1; - if (decomp(p->env->rex, p->env->rex, sp, type, delimiter, flags)) + if (decomp(p->env->rex, sp, type, delimiter, flags)) r = 0; else { diff --git a/src/lib/libast/regex/regerror.c b/src/lib/libast/regex/regerror.c index 5edfd3ac1..59bb2db8b 100644 --- a/src/lib/libast/regex/regerror.c +++ b/src/lib/libast/regex/regerror.c @@ -26,7 +26,7 @@ * POSIX regex error message handler */ -static const char id[] = "\n@(#)$Id: regex (AT&T Research) 2012-09-27 $\0\n"; +static const char id[] = "\n@(#)$Id: regex (AT&T Research) 2012-05-31 $\0\n"; #include "reglib.h" diff --git a/src/lib/libast/regex/regexec.c b/src/lib/libast/regex/regexec.c index 925eb8797..a51c13134 100644 --- a/src/lib/libast/regex/regexec.c +++ b/src/lib/libast/regex/regexec.c @@ -34,7 +34,7 @@ */ int -regexec_20120528(const regex_t* p, const char* s, size_t nmatch, regmatch_t* match, regflags_t flags) +regexec(const regex_t* p, const char* s, size_t nmatch, regmatch_t* match, regflags_t flags) { if (flags & REG_STARTEND) { diff --git a/src/lib/libast/regex/reglib.h b/src/lib/libast/regex/reglib.h index 7d8c8e548..c30832117 100644 --- a/src/lib/libast/regex/reglib.h +++ b/src/lib/libast/regex/reglib.h @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1985-2013 AT&T Intellectual Property * +* Copyright (c) 1985-2012 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * @@ -173,9 +173,9 @@ typedef struct regsubop_s #define HIT SSIZE_MAX -#define bitclr(p,c) ((p)[(c)>>3]&=(~(1<<((c)&07)))) -#define bitset(p,c) ((p)[(c)>>3]|=(1<<((c)&07))) -#define bittst(p,c) ((p)[(c)>>3]&(1<<((c)&07))) +#define bitclr(p,c) ((p)[((c)>>3)&037]&=(~(1<<((c)&07)))) +#define bitset(p,c) ((p)[((c)>>3)&037]|=(1<<((c)&07))) +#define bittst(p,c) ((p)[((c)>>3)&037]&(1<<((c)&07))) #define setadd(p,c) bitset((p)->bits,c) #define setclr(p,c) bitclr((p)->bits,c) diff --git a/src/lib/libast/regex/regnexec.c b/src/lib/libast/regex/regnexec.c index 4234503fc..e93486d14 100644 --- a/src/lib/libast/regex/regnexec.c +++ b/src/lib/libast/regex/regnexec.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1985-2013 AT&T Intellectual Property * +* Copyright (c) 1985-2012 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * @@ -628,7 +628,6 @@ collic(register Celt_t* ce, char* key, register char* nxt, int c, int x) c = towlower(c); else return 0; - mbinit(); x = mbconv(key, c); key[x] = 0; return collelt(ce, key, c, 0); @@ -881,7 +880,6 @@ DEBUG_TEST(0x0008,(sfprintf(sfstdout, "AHA#%04d 0x%04x parse %s `%-.*s'\n", __LI } else { - mbinit(); while (s < e) { c = mbchar(s); @@ -1532,7 +1530,6 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ for (i = 0; s < e && i < n; i++, s = t) { t = s; - mbinit(); if (mbchar(t) != c) break; b[i] = t - s; @@ -1543,7 +1540,6 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ for (i = 0; s < e && i < n; i++, s = t) { t = s; - mbinit(); if (towupper(mbchar(t)) != c) break; b[i] = t - s; @@ -1626,7 +1622,6 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ for (i = 0; i < m && s < e; i++, s = t) { t = s; - mbinit(); if (mbchar(t) != c) return r; } @@ -1642,10 +1637,7 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ case GOOD: return BEST; } - if (s >= e) - break; - mbinit(); - if (mbchar(s) != c) + if (s >= e || mbchar(s) != c) break; } } @@ -1654,7 +1646,6 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ for (i = 0; i < m && s < e; i++, s = t) { t = s; - mbinit(); if (towupper(mbchar(t)) != c) return r; } @@ -1670,10 +1661,7 @@ DEBUG_TEST(0x0200,(sfprintf(sfstdout,"AHA#%04d 0x%04x parse %s=>%s `%-.*s'\n", _ case GOOD: return BEST; } - if (s >= e) - break; - mbinit(); - if (towupper(mbchar(s)) != c) + if (s >= e || towupper(mbchar(s)) != c) break; } } @@ -1856,7 +1844,7 @@ list(Env_t* env, Rex_t* rex) */ int -regnexec_20120528(const regex_t* p, const char* s, size_t len, size_t nmatch, regmatch_t* match, regflags_t flags) +regnexec(const regex_t* p, const char* s, size_t len, size_t nmatch, regmatch_t* match, regflags_t flags) { register ssize_t n; register int i; @@ -1928,8 +1916,7 @@ regnexec_20120528(const regex_t* p, const char* s, size_t len, size_t nmatch, re DEBUG_TEST(0x0080,(sfprintf(sfstdout, "AHA#%04d REX_BM len=%d right=%d left=%d size=%d %d %d\n", __LINE__, len, e->re.bm.right, e->re.bm.left, e->re.bm.size, index, mid)),(0)); for (;;) { - while (index < mid) - index += skip[buf[index]]; + while ((index += skip[buf[index]]) < mid); if (index < HIT) { DEBUG_TEST(0x0080,(sfprintf(sfstdout, "AHA#%04d REG_NOMATCH %d %d\n", __LINE__, index, HIT)),(0)); diff --git a/src/lib/libast/regex/regrexec.c b/src/lib/libast/regex/regrexec.c index 89ff100fc..49aa32852 100644 --- a/src/lib/libast/regex/regrexec.c +++ b/src/lib/libast/regex/regrexec.c @@ -1,7 +1,7 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1985-2013 AT&T Intellectual Property * +* Copyright (c) 1985-2012 AT&T Intellectual Property * * Copyright (c) 2020-2021 Contributors to ksh 93u+m * * and is licensed under the * * Eclipse Public License, Version 1.0 * @@ -34,9 +34,9 @@ */ int -regrexec_20120528(const regex_t* p, const char* s, size_t len, size_t nmatch, regmatch_t* match, regflags_t flags, int sep, void* handle, regrecord_t record) +regrexec(const regex_t* p, const char* s, size_t len, size_t nmatch, regmatch_t* match, regflags_t flags, int sep, void* handle, regrecord_t record) { - register unsigned char* buf; + register unsigned char* buf = (unsigned char*)s; register unsigned char* beg; register unsigned char* l; register unsigned char* r; @@ -73,8 +73,7 @@ regrexec_20120528(const regex_t* p, const char* s, size_t len, size_t nmatch, re index = leftlen++; for (;;) { - while (index < mid) - index += skip[buf[index]]; + while ((index += skip[buf[index]]) < mid); if (index < HIT) goto impossible; index -= HIT;