Add support for quiet and json listing of rasm2 -L and e asm.arch=?

This commit is contained in:
pancake 2016-05-19 00:38:33 +02:00
parent b3093c516c
commit c967514443
3 changed files with 67 additions and 21 deletions

View File

@ -15,6 +15,7 @@ static RAsm *a = NULL;
static RAnal *anal = NULL;
static int coutput = false;
static bool json = false;
static bool quiet = false;
static int showanal(RAnal *lanal, RAnalOp *op, ut64 offset, ut8 *buf, int len, bool json);
@ -68,6 +69,9 @@ static void rasm2_list(RAsm *la, const char *arch) {
const char *feat2, *feat;
RAsmPlugin *h;
RListIter *iter;
if (json) {
printf ("{");
}
r_list_foreach (a->plugins, iter, h) {
if (arch) {
if (h->cpus && !strcmp (arch, h->name)) {
@ -89,11 +93,23 @@ static void rasm2_list(RAsm *la, const char *arch) {
if (h->assemble && !h->disassemble) feat = "a_";
if (!h->assemble && h->disassemble) feat = "_d";
feat2 = has_esil (anal, h->name);
printf ("%s%s %-9s %-11s %-7s %s\n",
feat, feat2, bits, h->name,
h->license? h->license: "unknown", h->desc);
if (quiet) {
printf ("%s\n", h->name);
} else if (json) {
const char *str_bits = "32, 64";
const char *license = "GPL";
printf ("\"%s\":{\"bits\":[%s],\"license\":\"%s\",\"description\":\"%s\",\"features\":\"%s\"}%s",
h->name, str_bits, license, h->desc, feat, iter->n? ",": "");
} else {
printf ("%s%s %-9s %-11s %-7s %s\n",
feat, feat2, bits, h->name,
h->license? h->license: "unknown", h->desc);
}
}
}
if (json) {
printf ("}\n");
}
}
// TODO: move into libr/anal/stack.c ?
@ -184,6 +200,7 @@ static int rasm_show_help(int v) {
" -B Binary input/output (-l is mandatory for binary input)\n"
" -v Show version information\n"
" -w What's this instruction for? describe opcode\n"
" -q quiet mode\n"
" If '-l' value is greater than output length, output is padded with nops\n"
" If the last argument is '-' reads from stdin\n");
printf ("Environment:\n"
@ -379,7 +396,7 @@ int main (int argc, char *argv[]) {
r_anal_set_bits (anal, sysbits);
}
while ((c = getopt (argc, argv, "Ai:k:DCc:eEva:b:s:do:Bl:hjLf:F:wO:")) != -1) {
while ((c = getopt (argc, argv, "Ai:k:DCc:eEva:b:s:do:Bl:hjLf:F:wqO:")) != -1) {
switch (c) {
case 'a':
arch = optarg;
@ -423,7 +440,12 @@ int main (int argc, char *argv[]) {
case 'i':
skip = r_num_math (NULL, optarg);
break;
case 'j': json = true; break;
case 'j':
json = true;
break;
case 'q':
quiet = true;
break;
case 'k':
kernel = optarg;
break;
@ -447,7 +469,11 @@ int main (int argc, char *argv[]) {
else r_asm_set_syntax (a, R_ASM_SYNTAX_INTEL);
break;
case 'v':
ret = blob_version ("rasm2");
if (quiet) {
printf ("%s\n", R2_VERSION);
} else {
ret = blob_version ("rasm2");
}
goto beach;
case 'w':
whatsop = true;

View File

@ -22,13 +22,16 @@ static const char *has_esil(RCore *core, const char *name) {
}
// copypasta from binr/rasm2/rasm2.c
static void rasm2_list(RCore *core, const char *arch) {
static void rasm2_list(RCore *core, const char *arch, int fmt) {
int i;
const char *feat2, *feat;
RAsm *a = core->assembler;
char bits[32];
RAsmPlugin *h;
RListIter *iter;
if (fmt == 'j') {
r_cons_printf ("{");
}
r_list_foreach (a->plugins, iter, h) {
if (arch && *arch) {
if (h->cpus && !strcmp (arch, h->name)) {
@ -54,11 +57,23 @@ static void rasm2_list(RCore *core, const char *arch) {
if (h->assemble && !h->disassemble) feat = "a_";
if (!h->assemble && h->disassemble) feat = "_d";
feat2 = has_esil (core, h->name);
r_cons_printf ("%s%s %-9s %-11s %-7s %s\n",
feat, feat2, bits, h->name,
h->license?h->license:"unknown", h->desc);
if (fmt == 'q') {
r_cons_printf ("%s\n", h->name);
} else if (fmt == 'j') {
const char *str_bits = "32, 64";
const char *license = "GPL";
r_cons_printf ("\"%s\":{\"bits\":[%s],\"license\":\"%s\",\"description\":\"%s\",\"features\":\"%s\"}%s",
h->name, str_bits, license, h->desc, feat, iter->n? ",": "");
} else {
r_cons_printf ("%s%s %-9s %-11s %-7s %s\n",
feat, feat2, bits, h->name,
h->license?h->license:"unknown", h->desc);
}
}
}
if (fmt == 'j') {
r_cons_printf ("}\n");
}
}
static inline void __setsegoff(RConfig *cfg, const char *asmarch, int asmbits) {
@ -166,21 +181,24 @@ static int cb_asmarch(void *user, void *data) {
bits = core->anal->bits;
}
if (*node->value=='?') {
rasm2_list (core, NULL);
if (*node->value == '?') {
rasm2_list (core, NULL, node->value[1]);
return false;
}
r_egg_setup (core->egg, node->value, bits, 0, R_SYS_OS);
if (*node->value) {
if (!r_asm_use (core->assembler, node->value)) {
eprintf ("asm.arch: cannot find (%s)\n", node->value);
return false;
}
} else return false;
if (!*node->value) {
return false;
}
if (!r_asm_use (core->assembler, node->value)) {
eprintf ("asm.arch: cannot find (%s)\n", node->value);
return false;
}
if (core->assembler && core->assembler->cur) {
bits = core->assembler->cur->bits;
if (8&bits) bits = 8;
if (8 & bits) bits = 8;
else if (16 & bits) bits = 16;
else if (32 & bits) bits = 32;
else bits = 64;
@ -347,7 +365,7 @@ static int cb_asmcpu(void *user, void *data) {
RCore *core = (RCore *) user;
RConfigNode *node = (RConfigNode *) data;
if (*node->value=='?') {
rasm2_list (core, r_config_get (core->config, "asm.arch"));
rasm2_list (core, r_config_get (core->config, "asm.arch"), node->value[1]);
return 0;
}
r_asm_set_cpu (core->assembler, node->value);

View File

@ -5,7 +5,7 @@
.Nd radare2 assembler and disassembler tool
.Sh SYNOPSIS
.Nm rasm2
.Op Fl ABdDeEfCLvw
.Op Fl ABdDeEfCLvwq
.Op Fl a Ar arch
.Op Fl b Ar bits
.Op Fl c Ar cpu
@ -60,6 +60,8 @@ output to file, for example 'rasm2 \-BF a a.asm'
Select syntax output (intel, att)
.It Fl w
Describe opcode (whats op)
.It Fl q
Quiet output (handy for -L, -v, ...)
.El
.Sh different than filename
.Pp