aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dfilter/dfilter.c
diff options
context:
space:
mode:
Diffstat (limited to 'epan/dfilter/dfilter.c')
-rw-r--r--epan/dfilter/dfilter.c119
1 files changed, 60 insertions, 59 deletions
diff --git a/epan/dfilter/dfilter.c b/epan/dfilter/dfilter.c
index 9c21e66998..a3d2be240c 100644
--- a/epan/dfilter/dfilter.c
+++ b/epan/dfilter/dfilter.c
@@ -44,12 +44,10 @@ dfilter_vfail(dfwork_t *dfw, int code, df_loc_t loc,
dfw->parse_failure = TRUE;
/* If we've already reported one error, don't overwite it */
- if (dfw->error.code < 0 || dfw->error.msg != NULL)
+ if (dfw->error != NULL)
return;
- dfw->error.code = code;
- dfw->error.msg = ws_strdup_vprintf(format, args);
- dfw->error.loc = loc;
+ dfw->error = df_error_new_vprintf(code, &loc, format, args);
}
void
@@ -77,7 +75,8 @@ dfilter_fail_throw(dfwork_t *dfw, int code, df_loc_t loc, const char *format, ..
void
dfw_set_error_location(dfwork_t *dfw, df_loc_t loc)
{
- dfw->error.loc = loc;
+ ws_assert(dfw->error);
+ dfw->error->loc = loc;
}
header_field_info *
@@ -211,9 +210,6 @@ dfwork_new(void)
{
dfwork_t *dfw = g_new0(dfwork_t, 1);
- dfw_error_init(&dfw->error);
- dfw->warnings = NULL;
-
dfw->references =
g_hash_table_new_full(g_direct_hash, g_direct_equal,
NULL, (GDestroyNotify)free_refs_array);
@@ -266,6 +262,9 @@ dfwork_free(dfwork_t *dfw)
g_free(dfw->expanded_text);
+ if (dfw->error)
+ df_error_free(&dfw->error);
+
wmem_destroy_allocator(dfw->dfw_scope);
/*
@@ -349,14 +348,14 @@ add_compile_warning(dfwork_t *dfw, const char *format, ...)
}
char *
-dfilter_expand(const char *expr, char **err_ret)
+dfilter_expand(const char *expr, df_error_t **err_ret)
{
return dfilter_macro_apply(expr, err_ret);
}
gboolean
dfilter_compile_real(const gchar *text, dfilter_t **dfp,
- df_error_t **errpp, unsigned flags,
+ df_error_t **err_ptr, unsigned flags,
const char *caller)
{
int token;
@@ -375,7 +374,8 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
ws_debug("%s() called from %s() with null filter",
__func__, caller);
/* XXX This BUG happens often. Some callers are ignoring these errors. */
- dfw_error_set_msg(errpp, "BUG: NULL text pointer passed to dfilter_compile");
+ if (err_ptr)
+ *err_ptr = df_error_new_msg("BUG: NULL text pointer passed to dfilter_compile");
return FALSE;
}
else if (*text == '\0') {
@@ -392,7 +392,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
dfw->apply_optimization = flags & DF_OPTIMIZE;
if (flags & DF_EXPAND_MACROS) {
- dfw->expanded_text = dfilter_macro_apply(text, &dfw->error.msg);
+ dfw->expanded_text = dfilter_macro_apply(text, &dfw->error);
if (dfw->expanded_text == NULL) {
goto FAILURE;
}
@@ -404,7 +404,7 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
}
if (df_yylex_init(&scanner) != 0) {
- dfw_error_set_msg(errpp, "Can't initialize scanner: %s", g_strerror(errno));
+ dfw->error = df_error_new_printf(DF_ERROR_GENERIC, NULL, "Can't initialize scanner: %s", g_strerror(errno));
goto FAILURE;
}
@@ -551,14 +551,18 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
FAILURE:
ws_assert(dfw);
- if (dfw->error.msg == NULL) {
+ if (dfw->error == NULL || dfw->error->msg == NULL) {
/* We require an error message. */
ws_critical("Unknown error compiling filter: %s", text);
- dfw_error_set_msg(errpp, "Unknown error compiling filter: %s", text);
+ if (err_ptr)
+ *err_ptr = df_error_new_printf(DF_ERROR_GENERIC, NULL, "Unknown error compiling filter: %s", text);
}
else {
- ws_debug("Compiling filter failed with error: %s.", dfw->error.msg);
- dfw_error_take(errpp, &dfw->error);
+ ws_debug("Compiling filter failed with error: %s.", dfw->error->msg);
+ if (err_ptr) {
+ *err_ptr = dfw->error;
+ dfw->error = NULL;
+ }
}
dfwork_free(dfw);
@@ -761,61 +765,58 @@ reference_free(df_reference_t *ref)
g_free(ref);
}
-void
-dfw_error_init(df_error_t *err) {
- err->code = 0;
- err->msg = NULL;
- err->loc.col_start = -1;
- err->loc.col_len = 0;
+df_error_t *
+df_error_new(int code, const char *msg, df_loc_t *loc)
+{
+ df_error_t *err = g_new(df_error_t, 1);
+ err->code = code;
+ err->msg = ws_strdup(msg);
+ if (loc) {
+ err->loc.col_start = loc->col_start;
+ err->loc.col_len = loc->col_len;
+ }
+ else {
+ err->loc.col_start = -1;
+ err->loc.col_len = 0;
+ }
+ return err;
}
-void
-dfw_error_clear(df_error_t *err) {
- g_free(err->msg);
- dfw_error_init(err);
+df_error_t *
+df_error_new_vprintf(int code, df_loc_t *loc, const char *fmt, va_list ap)
+{
+ df_error_t *err = g_new(df_error_t, 1);
+ err->code = code;
+ err->msg = ws_strdup_vprintf(fmt, ap);
+ if (loc) {
+ err->loc.col_start = loc->col_start;
+ err->loc.col_len = loc->col_len;
+ }
+ else {
+ err->loc.col_start = -1;
+ err->loc.col_len = 0;
+ }
+ return err;
}
-void
-dfw_error_set_msg(df_error_t **errpp, const char *fmt, ...)
+df_error_t *
+df_error_new_printf(int code, df_loc_t *loc, const char *fmt, ...)
{
- if (errpp == NULL) {
- return;
- }
va_list ap;
-
- df_error_t *errp = g_new(df_error_t, 1);
- errp->code = DF_ERROR_GENERIC;
va_start(ap, fmt);
- errp->msg = ws_strdup_vprintf(fmt, ap);
+ df_error_t *err = df_error_new_vprintf(code, loc, fmt, ap);
va_end(ap);
- errp->loc.col_start = -1;
- errp->loc.col_len = 0;
- *errpp = errp;
-}
-
-void
-dfw_error_take(df_error_t **errpp, df_error_t *src)
-{
- if (errpp == NULL) {
- g_free(src->msg);
- dfw_error_init(src);
- return;
- }
- df_error_t *errp = g_new(df_error_t, 1);
- errp->code = src->code;
- errp->msg = src->msg;
- errp->loc = src->loc;
- *errpp = errp;
- dfw_error_init(src);
+ return err;
}
void
-dfilter_error_free(df_error_t *errp)
+df_error_free(df_error_t **ep)
{
- if (errp == NULL)
+ if (*ep == NULL)
return;
- g_free(errp->msg);
- g_free(errp);
+ g_free((*ep)->msg);
+ g_free(*ep);
+ *ep = NULL;
}
/*