aboutsummaryrefslogtreecommitdiff
path: root/src/backend/regex/regexec.c
diff options
context:
space:
mode:
authorMarc G. Fournier <scrappy@hub.org>1998-03-15 07:39:04 +0000
committerMarc G. Fournier <scrappy@hub.org>1998-03-15 07:39:04 +0000
commit661ecf3c48e16a9add216287eb969d7615e47968 (patch)
tree91b54d5905aa2e22bd0ae9ea8c6b0f3cab75d3f4 /src/backend/regex/regexec.c
parent31a925c4d07675bc098a742ee9ca642ec79a40ee (diff)
downloadpostgresql-661ecf3c48e16a9add216287eb969d7615e47968.tar.gz
postgresql-661ecf3c48e16a9add216287eb969d7615e47968.zip
From: t-ishii@sra.co.jp
Included are patches intended for allowing PostgreSQL to handle multi-byte charachter sets such as EUC(Extende Unix Code), Unicode and Mule internal code. With the MB patch you can use multi-byte character sets in regexp and LIKE. The encoding system chosen is determined at the compile time. To enable the MB extension, you need to define a variable "MB" in Makefile.global or in Makefile.custom. For further information please take a look at README.mb under doc directory. (Note that unlike "jp patch" I do not use modified GNU regexp any more. I changed Henry Spencer's regexp coming with PostgreSQL.)
Diffstat (limited to 'src/backend/regex/regexec.c')
-rw-r--r--src/backend/regex/regexec.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/backend/regex/regexec.c b/src/backend/regex/regexec.c
index e3ac5cd0644..8a51810a203 100644
--- a/src/backend/regex/regexec.c
+++ b/src/backend/regex/regexec.c
@@ -164,6 +164,11 @@ int eflags;
{
struct re_guts *g = preg->re_g;
+#ifdef MB
+ pg_wchar *str;
+ int sts;
+#endif
+
#ifdef REDEBUG
#define GOODFLAGS(f) (f)
#else
@@ -177,8 +182,24 @@ int eflags;
return (REG_BADPAT);
eflags = GOODFLAGS(eflags);
+#ifdef MB
+ str = (pg_wchar *)malloc((strlen(string)+1) * sizeof(pg_wchar));
+ if (!str) {
+ return(REG_ESPACE);
+ }
+ (void)pg_mb2wchar((unsigned char *)string,str);
if (g->nstates <= CHAR_BIT * sizeof(states1) && !(eflags & REG_LARGE))
- return (smatcher(g, (char *) string, nmatch, pmatch, eflags));
+ sts = smatcher(g, str, nmatch, pmatch, eflags);
else
- return (lmatcher(g, (char *) string, nmatch, pmatch, eflags));
+ sts = lmatcher(g, str, nmatch, pmatch, eflags);
+ free((char *)str);
+ return(sts);
+
+# else
+
+ if (g->nstates <= CHAR_BIT * sizeof(states1) && !(eflags & REG_LARGE))
+ return (smatcher(g, (pg_wchar *) string, nmatch, pmatch, eflags));
+ else
+ return (lmatcher(g, (pg_wchar *) string, nmatch, pmatch, eflags));
+#endif
}