From 6df53f8bb12cff092846cf8052c9da597e45d409 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 6 Sep 2016 04:29:42 +0200 Subject: [PATCH] Fixes for enum types in t and pf --- libr/anal/types.c | 31 +++++++++++++++++++++++++------ libr/core/cmd_type.c | 2 +- libr/core/core.c | 4 ++-- libr/util/p_format.c | 26 +++++++++++++++++--------- 4 files changed, 45 insertions(+), 18 deletions(-) diff --git a/libr/anal/types.c b/libr/anal/types.c index 3c29a88793..84ac8915e4 100644 --- a/libr/anal/types.c +++ b/libr/anal/types.c @@ -223,12 +223,14 @@ R_API char *r_anal_type_format(RAnal *anal, const char *t) { fmt = r_str_concat (fmt, tfmt); vars = r_str_concat (vars, q); vars = r_str_concat (vars, " "); - } else eprintf ("Cannot resolve type '%s'\n", var3); + } else eprintf ("Cannot resolve3 type '%s'\n", var3); } else eprintf ("Cannot resolve type '%s'\n", var2); free (type2); free (q); } } else { + bool isStruct = false; + bool isEnum = false; elements = sdb_array_get_num (DB, var2, 2, NULL); // special case for char[]. Use char* format type without * if (!strncmp (type, "char", 5) && elements > 0) { @@ -236,7 +238,12 @@ R_API char *r_anal_type_format(RAnal *anal, const char *t) { if (tfmt && *tfmt == '*') tfmt++; } else { - snprintf (var3, sizeof (var3), "type.%s", type); + if (!strncmp (type, "enum ", 5)) { + snprintf (var3, sizeof (var3), "%s", type + 5); + isEnum = true; + } else { + snprintf (var3, sizeof (var3), "type.%s", type); + } tfmt = sdb_const_get (DB, var3, NULL); } if (tfmt) { @@ -244,10 +251,22 @@ R_API char *r_anal_type_format(RAnal *anal, const char *t) { if (elements > 0) { fmt = r_str_concatf (fmt, "[%d]", elements); } - fmt = r_str_concat (fmt, tfmt); - vars = r_str_concat (vars, p); - vars = r_str_concat (vars, " "); - } else eprintf ("Cannot resolve type '%s'\n", var3); + if (isStruct) { + fmt = r_str_concat (fmt, "?"); + vars = r_str_concatf (vars, "(%s)%s", p, p); + vars = r_str_concat (vars, " "); + } else if (isEnum) { + fmt = r_str_concat (fmt, "E"); + vars = r_str_concatf (vars, "(%s)%s", type + 5, p); + vars = r_str_concat (vars, " "); + } else { + fmt = r_str_concat (fmt, tfmt); + vars = r_str_concat (vars, p); + vars = r_str_concat (vars, " "); + } + } else { + eprintf ("Cannot resolve type '%s'\n", var3); + } } } free (type); diff --git a/libr/core/cmd_type.c b/libr/core/cmd_type.c index fb737e89b1..24d8303fa0 100644 --- a/libr/core/cmd_type.c +++ b/libr/core/cmd_type.c @@ -251,7 +251,7 @@ static int cmd_type(void *data, const char *input) { if (p) { *p++ = 0; isenum = sdb_const_get (core->anal->sdb_types, s, 0); - if (isenum && !strcmp (isenum, "enum")) { + if (isenum && !strncmp (isenum, "enum", 4)) { const char *q = sdb_fmt (0, "%s.0x%x", s, (ut32)r_num_math (core->num, p)); const char *res = sdb_const_get (core->anal->sdb_types, q, 0); if (res) diff --git a/libr/core/core.c b/libr/core/core.c index 724adb9920..c37bbefb22 100644 --- a/libr/core/core.c +++ b/libr/core/core.c @@ -1015,11 +1015,11 @@ static char *getenumname(void *_core, const char *name, ut64 val) { RCore *core = (RCore*)_core; isenum = sdb_const_get (core->anal->sdb_types, name, 0); - if (isenum && !strcmp (isenum, "enum")) { + if (isenum && !strncmp (isenum, "enum", 4)) { const char *q = sdb_fmt (0, "%s.0x%x", name, val); return sdb_get (core->anal->sdb_types, q, 0); } else { - eprintf ("This is not an enum\n"); + eprintf ("This is not an enum (%s)\n", name); } return NULL; } diff --git a/libr/util/p_format.c b/libr/util/p_format.c index 22b160e61f..ca050cd7d7 100644 --- a/libr/util/p_format.c +++ b/libr/util/p_format.c @@ -968,20 +968,28 @@ static void r_print_format_enum (const RPrint* p, ut64 seeki, char* fmtname, case 2: addr &= UT16_MAX; break; case 4: addr &= UT32_MAX; break; } - if (MUSTSEE) - if (!SEEVALUE) p->cb_printf ("0x%08"PFMT64x" = ", seeki); - if (p->get_enumname) + if (MUSTSEE && !SEEVALUE) { + p->cb_printf ("0x%08"PFMT64x" = ", seeki); + } + if (p->get_enumname) { enumvalue = p->get_enumname (p->user, fmtname, addr); + } if (enumvalue && *enumvalue) { if (mode & R_PRINT_DOT) { p->cb_printf ("%s.%s", fmtname, enumvalue); - } else if (MUSTSEEJSON) p->cb_printf ("\"%s\"}", fmtname); - else if (MUSTSEE) p->cb_printf (" %s (enum) = 0x%"PFMT64x" ; %s\n", - fieldname, addr, enumvalue); + } else if (MUSTSEEJSON) { + p->cb_printf ("\"%s\"}", fmtname); + } else if (MUSTSEE) { + p->cb_printf ("%s (enum %s) = 0x%"PFMT64x" ; %s\n", + fieldname, fmtname, addr, enumvalue); + } } else { - if (MUSTSEEJSON) p->cb_printf ("\"`te %s 0x%x`\"}", fmtname, addr); - else if (MUSTSEE) p->cb_printf (" %s (enum) = %s\n",//`te %s 0x%x`\n", - fieldname, enumvalue); //fmtname, addr); + if (MUSTSEEJSON) { + p->cb_printf ("\"`te %s 0x%x`\"}", fmtname, addr); + } else if (MUSTSEE) { + p->cb_printf ("%s (enum %s) = 0x%x\n",//`te %s 0x%x`\n", + fieldname, fmtname, addr); //enumvalue); //fmtname, addr); + } } free (enumvalue); }