aboutsummaryrefslogtreecommitdiffstats
path: root/epan/ftypes/ftype-pcre.c
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2009-12-18 01:15:08 +0000
committerGerald Combs <gerald@wireshark.org>2009-12-18 01:15:08 +0000
commit7c0dc5d7e7a479d497f0e991158a60ae89a35f74 (patch)
tree1d7a312d77cd21c4d65f74e46f8214079c3f610b /epan/ftypes/ftype-pcre.c
parent7524c0b96314b87ca6a2c8f4dbf14770277ef31a (diff)
If we don't have PCRE and we do have GLib >= 2.14, use GRegexes for the
"matches" operator. svn path=/trunk/; revision=31302
Diffstat (limited to 'epan/ftypes/ftype-pcre.c')
-rw-r--r--epan/ftypes/ftype-pcre.c151
1 files changed, 150 insertions, 1 deletions
diff --git a/epan/ftypes/ftype-pcre.c b/epan/ftypes/ftype-pcre.c
index 2edd34b8bf..4201dc75c4 100644
--- a/epan/ftypes/ftype-pcre.c
+++ b/epan/ftypes/ftype-pcre.c
@@ -216,7 +216,142 @@ ftype_register_pcre(void)
ftype_register(FT_PCRE, &pcre_type);
}
-#else /* HAVE_LIBPCRE */
+#elif GLIB_CHECK_VERSION(2,14,0) /* No HAVE_LIBPCRE. Try falling back to GRegex. */
+
+
+#include <glib.h>
+#include <string.h>
+
+static void
+gregex_fvalue_new(fvalue_t *fv)
+{
+ fv->value.re = NULL;
+}
+
+static void
+gregex_fvalue_free(fvalue_t *fv)
+{
+ if (fv->value.re) {
+ g_regex_unref(fv->value.re);
+ fv->value.re = NULL;
+ }
+}
+
+/* Generate a FT_PCRE from a parsed string pattern.
+ * Uses the specified logfunc() to report errors. */
+static gboolean
+val_from_string(fvalue_t *fv, char *pattern, LogFunc logfunc)
+{
+ GError *regex_error = NULL;
+ /* Free up the old value, if we have one */
+ gregex_fvalue_free(fv);
+
+ fv->value.re = g_regex_new(
+ pattern, /* pattern */
+ G_REGEX_OPTIMIZE, /* Compile options (G_REGEX_OPTIMIZE = pcre_study) */
+ 0, /* Match options */
+ &regex_error /* Compile / study errors */
+ );
+
+ if (regex_error) {
+ if (logfunc) {
+ logfunc(regex_error->message);
+ }
+ g_error_free(regex_error);
+ if (fv->value.re) {
+ g_regex_unref(fv->value.re);
+ }
+ return FALSE;
+ }
+ return TRUE;
+}
+
+/* Generate a FT_PCRE from an unparsed string pattern.
+ * Uses the specified logfunc() to report errors. */
+static gboolean
+val_from_unparsed(fvalue_t *fv, char *pattern, gboolean allow_partial_value _U_, LogFunc logfunc)
+{
+ g_assert(! allow_partial_value);
+
+ return val_from_string(fv, pattern, logfunc);
+}
+
+static int
+gregex_repr_len(fvalue_t *fv, ftrepr_t rtype)
+{
+ g_assert(rtype == FTREPR_DFILTER);
+ return (int)strlen(g_regex_get_pattern(fv->value.re));
+}
+
+static void
+gregex_to_repr(fvalue_t *fv, ftrepr_t rtype, char *buf)
+{
+ g_assert(rtype == FTREPR_DFILTER);
+ strcpy(buf, g_regex_get_pattern(fv->value.re));
+}
+
+/* BEHOLD - value contains the string representation of the regular expression,
+ * and we want to store the compiled PCRE RE object into the value. */
+static void
+gregex_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied)
+{
+ g_assert(value != NULL);
+ /* Free up the old value, if we have one */
+ gregex_fvalue_free(fv);
+ g_assert(! already_copied);
+ val_from_unparsed(fv, value, FALSE, NULL);
+}
+
+static gpointer
+gregex_fvalue_get(fvalue_t *fv)
+{
+ return fv->value.re;
+}
+
+void
+ftype_register_pcre(void)
+{
+ static ftype_t pcre_type = {
+ FT_PCRE, /* ftype */
+ "FT_PCRE", /* name */
+ "Compiled Perl-Compatible Regular Expression (GRegex) object", /* pretty_name */
+ 0, /* wire_size */
+ gregex_fvalue_new, /* new_value */
+ gregex_fvalue_free, /* free_value */
+ val_from_unparsed, /* val_from_unparsed */
+ val_from_string, /* val_from_string */
+ gregex_to_repr, /* val_to_string_repr */
+ gregex_repr_len, /* len_string_repr */
+
+ gregex_fvalue_set, /* set_value */
+ NULL, /* set_value_uinteger */
+ NULL, /* set_value_sinteger */
+ NULL, /* set_value_integer64 */
+ NULL, /* set_value_floating */
+
+ gregex_fvalue_get, /* get_value */
+ NULL, /* get_value_uinteger */
+ NULL, /* get_value_sinteger */
+ NULL, /* get_value_integer64 */
+ NULL, /* get_value_floating */
+
+ NULL, /* cmp_eq */
+ NULL, /* cmp_ne */
+ NULL, /* cmp_gt */
+ NULL, /* cmp_ge */
+ NULL, /* cmp_lt */
+ NULL, /* cmp_le */
+ NULL, /* cmp_bitwise_and */
+ NULL, /* cmp_contains */
+ NULL, /* cmp_matches */
+
+ NULL, /* len */
+ NULL, /* slice */
+ };
+ ftype_register(FT_PCRE, &pcre_type);
+}
+
+#else /* No HAVE_LIBPCRE or GRegex */
void
ftype_register_pcre(void)
@@ -262,3 +397,17 @@ ftype_register_pcre(void)
}
#endif /* HAVE_LIBPCRE */
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=4 noexpandtab
+ * :indentSize=4:tabSize=4:noTabs=false:
+ */
+