summaryrefslogtreecommitdiff
path: root/regex
diff options
context:
space:
mode:
authorbar@bar.mysql.r18.ru <>2003-09-24 13:57:26 +0500
committerbar@bar.mysql.r18.ru <>2003-09-24 13:57:26 +0500
commit52bb4efcddc9365e380417d654d28aeb7afc1e6c (patch)
tree448ed92b80853b37f5da3790377626724f67208d /regex
parentefd94f5ba972bb10d2d10fe46fc9153536941e92 (diff)
downloadmariadb-git-52bb4efcddc9365e380417d654d28aeb7afc1e6c.tar.gz
regexp worked only with the default character set.
Now it can work with any character set.
Diffstat (limited to 'regex')
-rw-r--r--regex/cclass.h1
-rw-r--r--regex/regcomp.c55
2 files changed, 35 insertions, 21 deletions
diff --git a/regex/cclass.h b/regex/cclass.h
index e0f752f38b8..b877b5dee6b 100644
--- a/regex/cclass.h
+++ b/regex/cclass.h
@@ -18,4 +18,5 @@ extern struct cclass {
const char *name;
const char *chars;
const char *multis;
+ uint mask;
} cclasses[];
diff --git a/regex/regcomp.c b/regex/regcomp.c
index d95a0ddf5d0..6af99456c28 100644
--- a/regex/regcomp.c
+++ b/regex/regcomp.c
@@ -36,19 +36,19 @@ struct parse {
static char nuls[10]; /* place to point scanner in event of error */
struct cclass cclasses[CCLASS_LAST+1]= {
- { "alnum", "","" },
- { "alpha", "","" },
- { "blank", "","" },
- { "cntrl", "","" },
- { "digit", "","" },
- { "graph", "","" },
- { "lower", "","" },
- { "print", "","" },
- { "punct", "","" },
- { "space", "","" },
- { "upper", "","" },
- { "xdigit", "","" },
- { NULL,NULL,NULL }
+ { "alnum", "","", _U | _L | _NMR},
+ { "alpha", "","", _U | _L },
+ { "blank", "","", _B },
+ { "cntrl", "","", _CTR },
+ { "digit", "","", _NMR },
+ { "graph", "","", _PNT | _U | _L | _NMR},
+ { "lower", "","", _L },
+ { "print", "","", _PNT | _U | _L | _NMR | _B },
+ { "punct", "","", _PNT },
+ { "space", "","", _SPC },
+ { "upper", "","", _U },
+ { "xdigit", "","", _X },
+ { NULL,NULL,NULL, 0 }
};
/*
@@ -747,9 +747,7 @@ register cset *cs;
register char *sp = p->next;
register struct cclass *cp;
register size_t len;
- register char *u;
- register char c;
-
+
while (MORE() && my_isalpha(p->charset,PEEK()))
NEXT();
len = p->next - sp;
@@ -762,11 +760,26 @@ register cset *cs;
return;
}
- u = (char*) cp->chars;
- while ((c = *u++) != '\0')
- CHadd(cs, c);
- for (u = (char*) cp->multis; *u != '\0'; u += strlen(u) + 1)
- MCadd(p, cs, u);
+#ifndef USE_ORIG_REGEX_CODE
+ {
+ register size_t i;
+ for (i=1 ; i<256 ; i++)
+ if (p->charset->ctype[i+1] & cp->mask)
+ CHadd(cs, i);
+ }
+#else
+ {
+ register char *u = (char*) cp->chars;
+ register char c;
+
+ while ((c = *u++) != '\0')
+ CHadd(cs, c);
+
+ for (u = (char*) cp->multis; *u != '\0'; u += strlen(u) + 1)
+ MCadd(p, cs, u);
+ }
+#endif
+
}
/*