tshark: Add underline to dfilter errors

$ tshark -Y 'frame.number == 123foobar and ip' -r /dev/null
tshark: "123foobar" is not a valid number.
    frame.number == 123foobar and ip
                    ^~~~~~~~~
This commit is contained in:
João Valverde 2022-04-10 18:19:45 +01:00 committed by A Wireshark GitLab Utility
parent fb3bdffaba
commit 24443fa33a
4 changed files with 36 additions and 3 deletions

View File

@ -67,6 +67,9 @@ dfilter_compile_real(const gchar *text, dfilter_t **dfp,
#define dfilter_compile(text, dfp, err_msg) \
dfilter_compile_real(text, dfp, err_msg, NULL, __func__, FALSE, TRUE)
#define dfilter_compile2(text, dfp, err_msg, loc_ptr) \
dfilter_compile_real(text, dfp, err_msg, loc_ptr, __func__, FALSE, TRUE)
/* Frees all memory used by dfilter, and frees
* the dfilter itself. */
WS_DLL_PUBLIC

View File

@ -722,7 +722,7 @@ must_do_dissection(dfilter_t *rfcode, dfilter_t *dfcode,
int
main(int argc, char *argv[])
{
char *err_msg;
char *err_msg, *err_msg_cont;
static const struct report_message_routines tshark_report_routines = {
failure_message,
failure_message,
@ -777,6 +777,7 @@ main(int argc, char *argv[])
gchar *volatile dfilter = NULL;
dfilter_t *rfcode = NULL;
dfilter_t *dfcode = NULL;
dfilter_loc_t df_loc;
e_prefs *prefs_p;
gchar *output_only = NULL;
gchar *volatile pdu_export_arg = NULL;
@ -2013,9 +2014,12 @@ main(int argc, char *argv[])
if (rfilter != NULL) {
ws_debug("Compiling read filter: '%s'", rfilter);
if (!dfilter_compile(rfilter, &rfcode, &err_msg)) {
if (!dfilter_compile2(rfilter, &rfcode, &err_msg, &df_loc)) {
cmdarg_err("%s", err_msg);
err_msg_cont = ws_strdup_error_offset(NULL, df_loc.col_start, df_loc.col_len);
cmdarg_err_cont(" %s\n %s\n", rfilter, err_msg_cont);
g_free(err_msg);
g_free(err_msg_cont);
epan_cleanup();
extcap_cleanup();
@ -2040,9 +2044,12 @@ main(int argc, char *argv[])
if (dfilter != NULL) {
ws_debug("Compiling display filter: '%s'", dfilter);
if (!dfilter_compile(dfilter, &dfcode, &err_msg)) {
if (!dfilter_compile2(dfilter, &dfcode, &err_msg, &df_loc)) {
cmdarg_err("%s", err_msg);
err_msg_cont = ws_strdup_error_offset(NULL, df_loc.col_start, df_loc.col_len);
cmdarg_err_cont(" %s\n %s\n", dfilter, err_msg_cont);
g_free(err_msg);
g_free(err_msg_cont);
epan_cleanup();
extcap_cleanup();

View File

@ -548,6 +548,26 @@ ws_strerrorname_r(int errnum, char *buf, size_t buf_size)
return buf;
}
char *
ws_strdup_error_offset(wmem_allocator_t *allocator, int offset, size_t len)
{
if (offset < 0)
return NULL;
wmem_strbuf_t *buf = wmem_strbuf_sized_new(allocator, offset + len, 0);
for (int i = 0; i < offset; i++) {
wmem_strbuf_append_c(buf, ' ');
}
wmem_strbuf_append_c(buf, '^');
for (size_t l = len; l > 1; l--) {
wmem_strbuf_append_c(buf, '~');
}
return wmem_strbuf_finalize(buf);
}
/*
* Editor modelines - https://www.wireshark.org/tools/modelines.html
*

View File

@ -218,6 +218,9 @@ gchar printable_char_or_period(gchar c);
WS_DLL_PUBLIC WS_RETNONNULL
const char *ws_strerrorname_r(int errnum, char *buf, size_t buf_size);
WS_DLL_PUBLIC
char *ws_strdup_error_offset(wmem_allocator_t *allocator, int offset, size_t len);
/* To pass one of two strings, singular or plural */
#define plurality(d,s,p) ((d) == 1 ? (s) : (p))