From d9ef72e4e92490bb37e57b328b74e6c00b18f560 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 3 Aug 2007 18:07:55 +0000 Subject: [PATCH] Handle J changes in the pattern correctly. (#444765, Yevgen Muntyan) 2007-08-03 Matthias Clasen * glib/gregex.c: Handle J changes in the pattern correctly. (#444765, Yevgen Muntyan) svn path=/trunk/; revision=5669 --- ChangeLog | 5 +++++ glib/gregex.c | 26 +++++++++++++------------- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/ChangeLog b/ChangeLog index 63c6c667..9fd6b61c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-08-03 Matthias Clasen + + * glib/gregex.c: Handle J changes in the pattern + correctly. (#444765, Yevgen Muntyan) + 2007-08-03 Pramod Raghavendra * configure.in: Added kn to ALL_LINGUAS diff --git a/glib/gregex.c b/glib/gregex.c index 0a5a0089..32b8b2d3 100644 --- a/glib/gregex.c +++ b/glib/gregex.c @@ -623,18 +623,8 @@ get_matched_substring_number (const GMatchInfo *match_info, gchar *first, *last; guchar *entry; - /* - * FIXME: (?J) may be used inside the pattern as the equivalent of - * DUPNAMES compile option. In this case we can't know about it, - * and pcre doesn't tell us about it either, it uses private flag - * PCRE_JCHANGED for this. So we have to always search string - * table, unlike pcre which uses pcre_get_stringnumber() shortcut - * when possible. It shouldn't be actually bad since - * pcre_get_stringtable_entries() uses binary search; still would - * be better to fix it, to be not worse than pcre. - */ -#if 0 - if ((match_info->regex->compile_opts & G_REGEX_DUPNAMES) == 0) +#if PCRE_MAJOR > 7 || PCRE_MINOR >= 2 + if (!(match_info->regex->compile_opts & G_REGEX_DUPNAMES)) return pcre_get_stringnumber (match_info->regex->pcre_re, name); #endif @@ -863,7 +853,7 @@ g_regex_new (const gchar *pattern, gint erroffset; gboolean optimize = FALSE; static gboolean initialized = FALSE; - + g_return_val_if_fail (pattern != NULL, NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); g_return_val_if_fail ((compile_options & ~G_REGEX_COMPILE_MASK) == 0, NULL); @@ -939,6 +929,16 @@ g_regex_new (const gchar *pattern, return NULL; } +#if PCRE_MAJOR > 7 || PCRE_MINOR >= 2 + if (!(compile_options & G_REGEX_DUPNAMES)) + { + gboolean jchanged = FALSE; + pcre_fullinfo (re, NULL, PCRE_INFO_JCHANGED, &jchanged); + if (jchanged) + compile_options |= G_REGEX_DUPNAMES; + } +#endif + regex = g_new0 (GRegex, 1); regex->ref_count = 1; regex->pattern = g_strdup (pattern); -- 2.34.1