dftest: Add --types option

This commit is contained in:
João Valverde 2023-01-10 15:42:32 +00:00
parent 70e006fc42
commit 313fed6db0
5 changed files with 112 additions and 41 deletions

View File

@ -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);

View File

@ -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 *

View File

@ -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

View File

@ -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);

View File

@ -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);