From 6b82192bf760248d2dd4d285ee7ec5eb90525e76 Mon Sep 17 00:00:00 2001 From: Andrey Hristov Date: Tue, 20 Jul 1999 20:57:04 +0000 Subject: [PATCH] Added locale support. --- ext/pcre/php_pcre.c | 30 ++++++++++++++++++++++++++---- ext/pcre/php_pcre.h | 7 +++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 0e4c0e8f618..001fe3e0c07 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -77,6 +77,9 @@ static int _php_free_pcre_cache(void *data) { pcre_cache_entry *pce = (pcre_cache_entry *) data; pefree(pce->re, 1); +#if HAVE_SETLOCALE + pefree((void*)pce->tables, 1); +#endif return 1; } @@ -163,6 +166,10 @@ static pcre* _pcre_get_compiled_regex(char *regex, pcre_extra *extra, int *preg_ int regex_len; int do_study = 0; int poptions = 0; + unsigned const char *tables = NULL; +#if HAVE_SETLOCALE + char *locale = setlocale(LC_CTYPE, NULL); +#endif pcre_cache_entry *pce; pcre_cache_entry new_entry; PCRE_LS_FETCH(); @@ -171,9 +178,15 @@ static pcre* _pcre_get_compiled_regex(char *regex, pcre_extra *extra, int *preg_ back the compiled pattern, otherwise go on and compile it. */ regex_len = strlen(regex); if (zend_hash_find(&PCRE_G(pcre_cache), regex, regex_len+1, (void **)&pce) == SUCCESS) { - extra = pce->extra; - *preg_options = pce->preg_options; - return pce->re; +#if HAVE_SETLOCALE + if (!strcmp(pce->locale, locale)) { +#endif + extra = pce->extra; + *preg_options = pce->preg_options; + return pce->re; +#if HAVE_SETLOCALE + } +#endif } p = regex; @@ -247,13 +260,18 @@ static pcre* _pcre_get_compiled_regex(char *regex, pcre_extra *extra, int *preg_ return NULL; } } + +#if HAVE_SETLOCALE + if (strcmp(locale, "C")) + tables = pcre_maketables(); +#endif /* Compile pattern and display a warning if compilation failed. */ re = pcre_compile(pattern, coptions, &error, &erroffset, - NULL); + tables); if (re == NULL) { zend_error(E_WARNING, "Compilation failed: %s at offset %d\n", error, erroffset); @@ -278,6 +296,10 @@ static pcre* _pcre_get_compiled_regex(char *regex, pcre_extra *extra, int *preg_ new_entry.re = re; new_entry.extra = extra; new_entry.preg_options = poptions; +#if HAVE_SETLOCALE + new_entry.locale = locale; + new_entry.tables = tables; +#endif zend_hash_update(&PCRE_G(pcre_cache), regex, regex_len+1, (void *)&new_entry, sizeof(pcre_cache_entry), NULL); diff --git a/ext/pcre/php_pcre.h b/ext/pcre/php_pcre.h index a367da3bd43..c7f9043b05c 100644 --- a/ext/pcre/php_pcre.h +++ b/ext/pcre/php_pcre.h @@ -35,6 +35,9 @@ #if HAVE_PCRE #include "pcrelib/pcre.h" +#if HAVE_LOCALE_H +#include +#endif extern void php_info_pcre(ZEND_MODULE_INFO_FUNC_ARGS); extern int php_minit_pcre(INIT_FUNC_ARGS); @@ -55,6 +58,10 @@ typedef struct { pcre *re; pcre_extra *extra; int preg_options; +#if HAVE_SETLOCALE + char *locale; + unsigned const char *tables; +#endif } pcre_cache_entry; typedef struct {