summaryrefslogtreecommitdiff
path: root/glib/gregex.c
diff options
context:
space:
mode:
authorMarco Barisione <marco@barisione.org>2007-09-10 16:20:51 +0000
committerMarco Barisione <mbari@src.gnome.org>2007-09-10 16:20:51 +0000
commit4356f18a3d1d777019a6019470914f7aaa16e119 (patch)
tree90b29b8e168c1d3b3d57689cc61342b5768339e3 /glib/gregex.c
parentd5e5904c7c09e18140691bac62e95e85bbeb057b (diff)
downloadglib-4356f18a3d1d777019a6019470914f7aaa16e119.tar.gz
use pcre_get_stringnumber() in get_matched_substring_number() if
2007-09-10 Marco Barisione <marco@barisione.org> * glib/gregex.c: use pcre_get_stringnumber() in get_matched_substring_number() if G_REGEX_DUPNAMES was not set. (#444765, Yevgen Muntyan) svn path=/trunk/; revision=5745
Diffstat (limited to 'glib/gregex.c')
-rw-r--r--glib/gregex.c29
1 files changed, 15 insertions, 14 deletions
diff --git a/glib/gregex.c b/glib/gregex.c
index a1ec7bef3..1f9b7a068 100644
--- a/glib/gregex.c
+++ b/glib/gregex.c
@@ -630,20 +630,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 (!(match_info->regex->compile_opts & G_REGEX_DUPNAMES))
return pcre_get_stringnumber (match_info->regex->pcre_re, name);
-#endif
/* This code is copied from pcre_get.c: get_first_set() */
entrysize = pcre_get_stringtable_entries (match_info->regex->pcre_re,
@@ -870,7 +858,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);
@@ -946,6 +934,19 @@ g_regex_new (const gchar *pattern,
return NULL;
}
+ /* For options set at the beginning of the pattern, pcre puts them into
+ * compile options, e.g. "(?i)foo" will make the pcre structure store
+ * PCRE_CASELESS even though it wasn't explicitly given for compilation. */
+ pcre_fullinfo (re, NULL, PCRE_INFO_OPTIONS, &compile_options);
+
+ if (!(compile_options & G_REGEX_DUPNAMES))
+ {
+ gboolean jchanged = FALSE;
+ pcre_fullinfo (re, NULL, PCRE_INFO_JCHANGED, &jchanged);
+ if (jchanged)
+ compile_options |= G_REGEX_DUPNAMES;
+ }
+
regex = g_new0 (GRegex, 1);
regex->ref_count = 1;
regex->pattern = g_strdup (pattern);