diff options
Diffstat (limited to 'epan/dfilter/dfilter.c')
-rw-r--r-- | epan/dfilter/dfilter.c | 119 |
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; } /* |