summaryrefslogtreecommitdiff
path: root/usr/src/lib/libc
diff options
context:
space:
mode:
authorYuri Pankov <yuri.pankov@nexenta.com>2017-06-07 00:36:24 +0300
committerHans Rosenfeld <hans.rosenfeld@joyent.com>2017-06-12 12:53:59 +0200
commit490fea6b98d609ce9ae1306209c80bb255b84c95 (patch)
tree01803ff49e90602b84920ab1e3a228afda34d0b9 /usr/src/lib/libc
parent7641c5eab2e15e87eafc318a09f2bd5c6f968607 (diff)
downloadillumos-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.c3
-rw-r--r--usr/src/lib/libc/port/regex/regerror.c49
-rw-r--r--usr/src/lib/libc/port/regex/regexec.c4
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&REG_BACKR) */) {
+ if (!g->backrefs && !(m->eflags&REG_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&REG_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&REG_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));