forked from osmocom/wireshark
dftest: Add --types option
This commit is contained in:
parent
70e006fc42
commit
313fed6db0
11
dftest.c
11
dftest.c
|
@ -50,6 +50,7 @@ static int opt_lemon = 0;
|
|||
static int opt_syntax_tree = 0;
|
||||
static int opt_timer = 0;
|
||||
static long opt_optimize = 1;
|
||||
static int opt_show_types = 0;
|
||||
|
||||
static gdouble elapsed_expand = 0;
|
||||
static gdouble elapsed_compile = 0;
|
||||
|
@ -103,6 +104,7 @@ print_usage(int status)
|
|||
fprintf(fp, " -s, --syntax print syntax tree\n");
|
||||
fprintf(fp, " -t, --timer print elapsed compilation time\n");
|
||||
fprintf(fp, " -0, --optimize=0 do not optimize (check syntax)\n");
|
||||
fprintf(fp, " --types show field value types\n");
|
||||
fprintf(fp, " -h, --help display this help and exit\n");
|
||||
fprintf(fp, " -v, --version print version\n");
|
||||
fprintf(fp, "\n");
|
||||
|
@ -243,6 +245,7 @@ main(int argc, char **argv)
|
|||
{ "timer", ws_no_argument, 0, 't' },
|
||||
{ "verbose", ws_no_argument, 0, 'V' },
|
||||
{ "optimize", ws_required_argument, 0, 1000 },
|
||||
{ "types", ws_no_argument, 0, 2000 },
|
||||
{ NULL, 0, 0, 0 }
|
||||
};
|
||||
int opt;
|
||||
|
@ -286,6 +289,9 @@ main(int argc, char **argv)
|
|||
print_usage(EXIT_FAILURE);
|
||||
}
|
||||
break;
|
||||
case 2000:
|
||||
opt_show_types = 1;
|
||||
break;
|
||||
case 'v':
|
||||
show_help_header(NULL);
|
||||
exit(EXIT_SUCCESS);
|
||||
|
@ -419,7 +425,10 @@ main(int argc, char **argv)
|
|||
if (opt_syntax_tree)
|
||||
print_syntax_tree(df);
|
||||
|
||||
dfilter_dump(stdout, df);
|
||||
uint16_t dump_flags = 0;
|
||||
if (opt_show_types)
|
||||
dump_flags |= DF_DUMP_SHOW_FTYPE;
|
||||
dfilter_dump(stdout, df, dump_flags);
|
||||
|
||||
print_warnings(df);
|
||||
|
||||
|
|
|
@ -628,9 +628,9 @@ dfilter_get_warnings(dfilter_t *df)
|
|||
}
|
||||
|
||||
void
|
||||
dfilter_dump(FILE *fp, dfilter_t *df)
|
||||
dfilter_dump(FILE *fp, dfilter_t *df, uint16_t flags)
|
||||
{
|
||||
dfvm_dump(fp, df);
|
||||
dfvm_dump(fp, df, flags);
|
||||
}
|
||||
|
||||
const char *
|
||||
|
|
|
@ -125,10 +125,13 @@ WS_DLL_PUBLIC
|
|||
GSList *
|
||||
dfilter_get_warnings(dfilter_t *df);
|
||||
|
||||
#define DF_DUMP_REFERENCES (1U << 0)
|
||||
#define DF_DUMP_SHOW_FTYPE (1U << 1)
|
||||
|
||||
/* Print bytecode of dfilter to fp */
|
||||
WS_DLL_PUBLIC
|
||||
void
|
||||
dfilter_dump(FILE *fp, dfilter_t *df);
|
||||
dfilter_dump(FILE *fp, dfilter_t *df, uint16_t flags);
|
||||
|
||||
/* Text after macro expansion. */
|
||||
WS_DLL_PUBLIC
|
||||
|
|
|
@ -246,6 +246,29 @@ dfvm_value_tostr(dfvm_value_t *v)
|
|||
return s;
|
||||
}
|
||||
|
||||
static char *
|
||||
value_type_tostr(dfvm_value_t *v, gboolean show_ftype)
|
||||
{
|
||||
const char *s;
|
||||
|
||||
if (!v || !show_ftype)
|
||||
return ws_strdup("");
|
||||
|
||||
switch (v->type) {
|
||||
case HFINFO:
|
||||
case RAW_HFINFO:
|
||||
s = ftype_name(v->value.hfinfo->type);
|
||||
break;
|
||||
case FVALUE:
|
||||
s = fvalue_type_name(v->value.fvalue);
|
||||
break;
|
||||
default:
|
||||
return ws_strdup("");
|
||||
break;
|
||||
}
|
||||
return ws_strdup_printf(" <%s>", s);
|
||||
}
|
||||
|
||||
static GSList *
|
||||
dump_str_stack_push(GSList *stack, const char *str)
|
||||
{
|
||||
|
@ -303,10 +326,12 @@ append_to_register(wmem_strbuf_t *buf, const char *reg)
|
|||
}
|
||||
|
||||
static void
|
||||
append_op_args(wmem_strbuf_t *buf, dfvm_insn_t *insn, GSList **stack_print)
|
||||
append_op_args(wmem_strbuf_t *buf, dfvm_insn_t *insn, GSList **stack_print,
|
||||
uint16_t flags)
|
||||
{
|
||||
dfvm_value_t *arg1, *arg2, *arg3;
|
||||
char *arg1_str, *arg2_str, *arg3_str;
|
||||
char *arg1_str_type, *arg2_str_type, *arg3_str_type;
|
||||
size_t col_start;
|
||||
|
||||
arg1 = insn->arg1;
|
||||
|
@ -315,44 +340,54 @@ append_op_args(wmem_strbuf_t *buf, dfvm_insn_t *insn, GSList **stack_print)
|
|||
arg1_str = dfvm_value_tostr(arg1);
|
||||
arg2_str = dfvm_value_tostr(arg2);
|
||||
arg3_str = dfvm_value_tostr(arg3);
|
||||
arg1_str_type = value_type_tostr(arg1, flags & DF_DUMP_SHOW_FTYPE);
|
||||
arg2_str_type = value_type_tostr(arg2, flags & DF_DUMP_SHOW_FTYPE);
|
||||
arg3_str_type = value_type_tostr(arg3, flags & DF_DUMP_SHOW_FTYPE);
|
||||
|
||||
col_start = buf->len;
|
||||
|
||||
switch (insn->op) {
|
||||
case DFVM_CHECK_EXISTS:
|
||||
wmem_strbuf_append_printf(buf, "%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_CHECK_EXISTS_R:
|
||||
wmem_strbuf_append_printf(buf, "%s#[%s]", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s#[%s]%s",
|
||||
arg1_str, arg2_str, arg1_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_READ_TREE:
|
||||
wmem_strbuf_append_printf(buf, "%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_READ_TREE_R:
|
||||
wmem_strbuf_append_printf(buf, "%s#[%s]", arg1_str, arg3_str);
|
||||
wmem_strbuf_append_printf(buf, "%s#[%s]%s",
|
||||
arg1_str, arg3_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_READ_REFERENCE:
|
||||
wmem_strbuf_append_printf(buf, "${%s}", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "${%s}%s",
|
||||
arg1_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_READ_REFERENCE_R:
|
||||
wmem_strbuf_append_printf(buf, "${%s#[%s]}", arg1_str, arg3_str);
|
||||
wmem_strbuf_append_printf(buf, "${%s#[%s]}%s",
|
||||
arg1_str, arg3_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_PUT_FVALUE:
|
||||
wmem_strbuf_append_printf(buf, "%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
@ -374,110 +409,131 @@ append_op_args(wmem_strbuf_t *buf, dfvm_insn_t *insn, GSList **stack_print)
|
|||
break;
|
||||
|
||||
case DFVM_SLICE:
|
||||
wmem_strbuf_append_printf(buf, "%s[%s]", arg1_str, arg3_str);
|
||||
wmem_strbuf_append_printf(buf, "%s[%s]%s",
|
||||
arg1_str, arg3_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_LENGTH:
|
||||
wmem_strbuf_append_printf(buf, "%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_EQ:
|
||||
wmem_strbuf_append_printf(buf, "%s === %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s === %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ANY_EQ:
|
||||
wmem_strbuf_append_printf(buf, "%s == %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s == %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_NE:
|
||||
wmem_strbuf_append_printf(buf, "%s != %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s != %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ANY_NE:
|
||||
wmem_strbuf_append_printf(buf, "%s !== %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s !== %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_GT:
|
||||
case DFVM_ANY_GT:
|
||||
wmem_strbuf_append_printf(buf, "%s > %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s > %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_GE:
|
||||
case DFVM_ANY_GE:
|
||||
wmem_strbuf_append_printf(buf, "%s >= %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s >= %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_LT:
|
||||
case DFVM_ANY_LT:
|
||||
wmem_strbuf_append_printf(buf, "%s < %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s < %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_LE:
|
||||
case DFVM_ANY_LE:
|
||||
wmem_strbuf_append_printf(buf, "%s <= %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s <= %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_NOT_ALL_ZERO:
|
||||
wmem_strbuf_append_printf(buf, "%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_CONTAINS:
|
||||
case DFVM_ANY_CONTAINS:
|
||||
wmem_strbuf_append_printf(buf, "%s contains %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s contains %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_MATCHES:
|
||||
case DFVM_ANY_MATCHES:
|
||||
wmem_strbuf_append_printf(buf, "%s matches %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s matches %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_ALL_IN_RANGE:
|
||||
case DFVM_ANY_IN_RANGE:
|
||||
wmem_strbuf_append_printf(buf, "%s in { %s .. %s }", arg1_str, arg2_str, arg3_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s in { %s%s .. %s%s }",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type, arg3_str, arg3_str_type);
|
||||
break;
|
||||
|
||||
case DFVM_BITWISE_AND:
|
||||
wmem_strbuf_append_printf(buf, "%s & %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s & %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
||||
case DFVM_UNARY_MINUS:
|
||||
wmem_strbuf_append_printf(buf, "-%s", arg1_str);
|
||||
wmem_strbuf_append_printf(buf, "-%s%s",
|
||||
arg1_str, arg1_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg2_str);
|
||||
break;
|
||||
|
||||
case DFVM_ADD:
|
||||
wmem_strbuf_append_printf(buf, "%s + %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s + %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
||||
case DFVM_SUBTRACT:
|
||||
wmem_strbuf_append_printf(buf, "%s - %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s - %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
||||
case DFVM_MULTIPLY:
|
||||
wmem_strbuf_append_printf(buf, "%s * %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s * %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
||||
case DFVM_DIVIDE:
|
||||
wmem_strbuf_append_printf(buf, "%s / %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s / %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
||||
case DFVM_MODULO:
|
||||
wmem_strbuf_append_printf(buf, "%s %% %s", arg1_str, arg2_str);
|
||||
wmem_strbuf_append_printf(buf, "%s%s %% %s%s",
|
||||
arg1_str, arg1_str_type, arg2_str, arg2_str_type);
|
||||
indent2(buf, col_start);
|
||||
append_to_register(buf, arg3_str);
|
||||
break;
|
||||
|
@ -495,6 +551,9 @@ append_op_args(wmem_strbuf_t *buf, dfvm_insn_t *insn, GSList **stack_print)
|
|||
g_free(arg1_str);
|
||||
g_free(arg2_str);
|
||||
g_free(arg3_str);
|
||||
g_free(arg1_str_type);
|
||||
g_free(arg2_str_type);
|
||||
g_free(arg3_str_type);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -529,7 +588,7 @@ append_references(wmem_strbuf_t *buf, GHashTable *references, gboolean raw)
|
|||
}
|
||||
|
||||
char *
|
||||
dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, gboolean print_references)
|
||||
dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, uint16_t flags)
|
||||
{
|
||||
int id, length;
|
||||
dfvm_insn_t *insn;
|
||||
|
@ -539,13 +598,13 @@ dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, gboolean print_references)
|
|||
|
||||
buf = wmem_strbuf_new(alloc, NULL);
|
||||
|
||||
if (print_references && g_hash_table_size(df->references) > 0) {
|
||||
if ((flags & DF_DUMP_REFERENCES) && g_hash_table_size(df->references) > 0) {
|
||||
wmem_strbuf_append(buf, "References:\n");
|
||||
append_references(buf, df->references, FALSE);
|
||||
wmem_strbuf_append_c(buf, '\n');
|
||||
}
|
||||
|
||||
if (print_references && g_hash_table_size(df->raw_references) > 0) {
|
||||
if ((flags & DF_DUMP_REFERENCES) && g_hash_table_size(df->raw_references) > 0) {
|
||||
wmem_strbuf_append(buf, "Raw references:\n");
|
||||
append_references(buf, df->raw_references, TRUE);
|
||||
wmem_strbuf_append_c(buf, '\n');
|
||||
|
@ -566,7 +625,7 @@ dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, gboolean print_references)
|
|||
break;
|
||||
default:
|
||||
indent1(buf, col_start);
|
||||
append_op_args(buf, insn, &stack_print);
|
||||
append_op_args(buf, insn, &stack_print, flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -575,9 +634,9 @@ dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, gboolean print_references)
|
|||
}
|
||||
|
||||
void
|
||||
dfvm_dump(FILE *f, dfilter_t *df)
|
||||
dfvm_dump(FILE *f, dfilter_t *df, uint16_t flags)
|
||||
{
|
||||
char *str = dfvm_dump_str(NULL, df, FALSE);
|
||||
char *str = dfvm_dump_str(NULL, df, flags);
|
||||
fputs(str, f);
|
||||
fputc('\n', f);
|
||||
wmem_free(NULL, str);
|
||||
|
|
|
@ -140,10 +140,10 @@ dfvm_value_t*
|
|||
dfvm_value_new_guint(guint num);
|
||||
|
||||
void
|
||||
dfvm_dump(FILE *f, dfilter_t *df);
|
||||
dfvm_dump(FILE *f, dfilter_t *df, uint16_t flags);
|
||||
|
||||
char *
|
||||
dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, gboolean print_references);
|
||||
dfvm_dump_str(wmem_allocator_t *alloc, dfilter_t *df, uint16_t flags);
|
||||
|
||||
gboolean
|
||||
dfvm_apply(dfilter_t *df, proto_tree *tree);
|
||||
|
|
Loading…
Reference in New Issue