mirror of
https://github.com/php/php-src.git
synced 2024-11-25 10:54:15 +08:00
Added locale support.
This commit is contained in:
parent
72f675be50
commit
6b82192bf7
@ -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);
|
||||
|
||||
|
@ -35,6 +35,9 @@
|
||||
#if HAVE_PCRE
|
||||
|
||||
#include "pcrelib/pcre.h"
|
||||
#if HAVE_LOCALE_H
|
||||
#include <locale.h>
|
||||
#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 {
|
||||
|
Loading…
Reference in New Issue
Block a user