aboutsummaryrefslogtreecommitdiff
path: root/regcomp.c
diff options
context:
space:
mode:
Diffstat (limited to 'regcomp.c')
-rw-r--r--regcomp.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/regcomp.c b/regcomp.c
index 25b1a85..f082a8b 100644
--- a/regcomp.c
+++ b/regcomp.c
@@ -181,6 +181,7 @@ static struct cvec *cclass(struct vars *, const chr *, const chr *, int);
static struct cvec *allcases(struct vars *, pchr);
static int cmp(const chr *, const chr *, size_t);
static int casecmp(const chr *, const chr *, size_t);
+static int casecmp_raw(const chr *, const chr *, size_t);
/* automatically gathered by fwd; do not hand-edit */
/* =====^!^===== end forwards =====^!^===== */
@@ -231,11 +232,15 @@ struct vars {
#define NOTE(b) (v->re->re_info |= (b)) /* note visible condition */
#define EMPTYARC(x, y) newarc(v->nfa, EMPTY, 0, x, y)
-#ifdef REGEX_UTF8
-#define DECODECHR(buf, c) wctomb((char *)buf, c)
-#else
-#define DECODECHR(buf, c) ((buf)[0] = (c), 1)
-#endif
+static inline size_t
+decodechr(struct vars *v, chr *buf, pchr c)
+{
+ if (v->cflags & REG_RAW) {
+ buf[0] = c;
+ return 1;
+ }
+ return wctomb((char *)buf, c);
+}
/* token type codes, some also used as NFA arc types */
#define EMPTY 'n' /* no token present */
@@ -445,7 +450,11 @@ compile(
g->tree = v->tree;
v->tree = NULL;
g->ntree = v->ntree;
- g->compare = (v->cflags&REG_ICASE) ? casecmp : cmp;
+ if (!(v->cflags & REG_ICASE)) {
+ g->compare = cmp;
+ } else {
+ g->compare = (v->cflags & REG_RAW) ? casecmp_raw : casecmp;
+ }
g->lacons = v->lacons;
v->lacons = NULL;
g->nlacons = v->nlacons;
@@ -1491,7 +1500,7 @@ brackpart(
onechr(v, c, lp, rp);
return;
}
- buf_len = DECODECHR(buf, c);
+ buf_len = decodechr(v, buf, c);
startc = element(v, buf, buf+buf_len);
NOERR();
break;
@@ -1536,7 +1545,7 @@ brackpart(
switch (v->nexttype) {
case PLAIN:
case RANGE:
- buf_len = DECODECHR(buf, v->nextvalue);
+ buf_len = decodechr(v, buf, v->nextvalue);
NEXT();
endc = element(v, buf, buf+buf_len);
NOERR();