diff options
author | Yuri Pankov <yuri.pankov@nexenta.com> | 2017-06-07 00:36:24 +0300 |
---|---|---|
committer | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2017-06-12 12:53:59 +0200 |
commit | 490fea6b98d609ce9ae1306209c80bb255b84c95 (patch) | |
tree | 01803ff49e90602b84920ab1e3a228afda34d0b9 /usr/src/lib/libc | |
parent | 7641c5eab2e15e87eafc318a09f2bd5c6f968607 (diff) | |
download | illumos-joyent-490fea6b98d609ce9ae1306209c80bb255b84c95.tar.gz |
8355 need libc regex tests
Reviewed by: Robert Mustacchi <rm@joyent.com>
Approved by: Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
Diffstat (limited to 'usr/src/lib/libc')
-rw-r--r-- | usr/src/lib/libc/port/regex/engine.c | 3 | ||||
-rw-r--r-- | usr/src/lib/libc/port/regex/regerror.c | 49 | ||||
-rw-r--r-- | usr/src/lib/libc/port/regex/regexec.c | 4 |
3 files changed, 44 insertions, 12 deletions
diff --git a/usr/src/lib/libc/port/regex/engine.c b/usr/src/lib/libc/port/regex/engine.c index 7481545864..68cf24a5da 100644 --- a/usr/src/lib/libc/port/regex/engine.c +++ b/usr/src/lib/libc/port/regex/engine.c @@ -289,8 +289,7 @@ matcher(struct re_guts *g, const char *string, size_t nmatch, } for (i = 1; i <= m->g->nsub; i++) m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; - /* NB: FreeBSD has REG_BACKR, we do not */ - if (!g->backrefs /* && !(m->eflags®_BACKR) */) { + if (!g->backrefs && !(m->eflags®_BACKR)) { NOTE("dissecting"); dp = dissect(m, m->coldp, endp, gf, gl); } else { diff --git a/usr/src/lib/libc/port/regex/regerror.c b/usr/src/lib/libc/port/regex/regerror.c index 3915c4429b..92179feea6 100644 --- a/usr/src/lib/libc/port/regex/regerror.c +++ b/usr/src/lib/libc/port/regex/regerror.c @@ -44,6 +44,8 @@ #include "utils.h" #include "../gen/_libc_gettext.h" +static const char *regatoi(const regex_t *preg, char *localbuf); + #define RERR(x, msg) { x, #x, msg } static struct rerr { @@ -90,19 +92,35 @@ regerror(int errcode, const regex_t *_RESTRICT_KYWD preg, { struct rerr *r; size_t len; + int target = errcode &~ REG_ITOA; const char *s; + char convbuf[50]; - for (r = rerrs; r->code != 0; r++) - if (r->code == errcode) - break; + if (errcode == REG_ATOI) { + s = regatoi(preg, convbuf); + } else { + for (r = rerrs; r->code != 0; r++) { + if (r->code == target) + break; + } - s = _libc_gettext(r->explain); + if (errcode®_ITOA) { + if (r->code != 0) + (void) strcpy(convbuf, r->name); + else + (void) sprintf(convbuf, "REG_0x%x", target); + assert(strlen(convbuf) < sizeof (convbuf)); + s = convbuf; + } else { + s = _libc_gettext(r->explain); + } + } len = strlen(s) + 1; if (errbuf_size > 0) { - if (errbuf_size > len) + if (errbuf_size > len) { (void) strcpy(errbuf, s); - else { + } else { (void) strncpy(errbuf, s, errbuf_size-1); errbuf[errbuf_size-1] = '\0'; } @@ -110,3 +128,22 @@ regerror(int errcode, const regex_t *_RESTRICT_KYWD preg, return (len); } + +/* + * regatoi - internal routine to implement REG_ATOI + */ +static const char * +regatoi(const regex_t *preg, char *localbuf) +{ + 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) sprintf(localbuf, "%d", r->code); + return (localbuf); +} diff --git a/usr/src/lib/libc/port/regex/regexec.c b/usr/src/lib/libc/port/regex/regexec.c index c1bc7b436a..188e9f08ed 100644 --- a/usr/src/lib/libc/port/regex/regexec.c +++ b/usr/src/lib/libc/port/regex/regexec.c @@ -218,11 +218,7 @@ regexec(const regex_t *_RESTRICT_KYWD preg, const char *_RESTRICT_KYWD string, if (MB_CUR_MAX > 1) return (mmatcher(g, string, nmatch, pmatch, eflags)); -#ifdef REG_LARGE else if (g->nstates <= CHAR_BIT*sizeof (states1) && !(eflags®_LARGE)) -#else - else if (g->nstates <= CHAR_BIT*sizeof (states1)) -#endif return (smatcher(g, string, nmatch, pmatch, eflags)); else return (lmatcher(g, string, nmatch, pmatch, eflags)); |