mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-22 13:18:27 +00:00
865267fc86
Integrate SPP into rasm2 to parse asm files
140 lines
3.1 KiB
C
140 lines
3.1 KiB
C
/* MIT (C) pancake (at) nopcode (dot) org */
|
|
|
|
#include "spp.h"
|
|
|
|
extern struct Proc *procs[];
|
|
extern struct Proc *proc;
|
|
extern struct Arg *args;
|
|
|
|
static void spp_help(char *argv0) {
|
|
int i;
|
|
char supported[128] = "";
|
|
for( i = 0; procs[i]; ++i ) {
|
|
if (i) strcat (supported, ",");
|
|
strcat (supported, procs[i]->name);
|
|
}
|
|
printf("Usage: %s [-othesv] [file] [...]\n", argv0);
|
|
printf( " -o [file] set output file (stdout)\n"
|
|
" -t [type] define processor type (%s)\n"
|
|
" -e [str] evaluate this string with the selected proc\n"
|
|
" -s [str] show this string before anything\n"
|
|
" -l list all built-in preprocessors\n"
|
|
" -L list keywords registered by the processor\n"
|
|
" -n do not read from stdin\n"
|
|
" -v show version information\n", supported);
|
|
if (proc) {
|
|
printf ("%s specific flags:\n", proc->name);
|
|
for(i = 0; args[i].flag; i++) {
|
|
printf (" %s %s\n", args[i].flag, args[i].desc);
|
|
}
|
|
}
|
|
exit(0);
|
|
}
|
|
|
|
int main(int argc, char **argv) {
|
|
int dostdin = 1;
|
|
int i, j;
|
|
Output out;
|
|
out.fout = stdout;
|
|
char *arg;
|
|
|
|
spp_proc_set (proc, argv[0], 0);
|
|
|
|
if (argc < 2)
|
|
spp_io (stdin, &out);
|
|
else {
|
|
for(i = 1; i < argc; i++) {
|
|
/* check preprocessor args */
|
|
if (args)
|
|
for(j = 0; args[j].flag; j++) {
|
|
if (!memcmp (argv[i], args[j].flag, 2)) {
|
|
if (args[j].has_arg) {
|
|
GET_ARG (arg, argv, i);
|
|
args[j].callback (arg);
|
|
} else {
|
|
args[j].callback (NULL);
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
|
|
/* TODO: Add these flags in Arg[] */
|
|
if (!memcmp (argv[i], "-o", 2)) {
|
|
GET_ARG (arg, argv, i);
|
|
if (arg != NULL) {
|
|
if (!strcmp (arg, "buff")) {
|
|
out.fout = NULL;
|
|
out.cout = r_strbuf_new ("");
|
|
r_strbuf_init (out.cout);
|
|
} else {
|
|
out.cout = NULL;
|
|
out.fout = fopen (arg, "w");
|
|
}
|
|
}
|
|
if (!out.cout && (arg == NULL || out.fout == NULL)) {
|
|
fprintf (stderr, "Cannot open output file\n");
|
|
exit (1);
|
|
}
|
|
} else
|
|
if (!memcmp (argv[i],"-t", 2)) {
|
|
GET_ARG (arg, argv, i);
|
|
spp_proc_set (proc, arg, 1);
|
|
} else
|
|
if (!strcmp (argv[i],"-v")) {
|
|
printf ("spp-%s\n", VERSION);
|
|
exit (1);
|
|
} else
|
|
if (!strcmp (argv[i],"-h")) {
|
|
/* show help */
|
|
spp_help (argv[0]);
|
|
} else
|
|
if (!strcmp (argv[i],"-n")) {
|
|
dostdin = 0;
|
|
} else
|
|
if (!strcmp (argv[i],"-l")) {
|
|
spp_proc_list ();
|
|
exit (0);
|
|
} else
|
|
if (!strcmp (argv[i],"-L")) {
|
|
spp_proc_list_kw ();
|
|
exit (0);
|
|
} else
|
|
if (!strcmp (argv[i],"-s")) {
|
|
GET_ARG (arg, argv, i);
|
|
if (arg == NULL) arg = "";
|
|
fprintf (out.fout, "%s\n", arg);
|
|
} else
|
|
if (!strcmp (argv[i],"-e")) {
|
|
GET_ARG (arg, argv, i);
|
|
if (arg == NULL) {
|
|
arg = "";
|
|
}
|
|
spp_eval (arg, &out);
|
|
} else {
|
|
if (i == argc) {
|
|
fprintf (stderr, "No file specified.\n");
|
|
} else {
|
|
spp_file (argv[i], &out);
|
|
dostdin = 0;
|
|
|
|
if (!out.fout) {
|
|
D printf ("%s\n", r_strbuf_get (out.cout));
|
|
r_strbuf_free (out.cout);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (dostdin) {
|
|
spp_io (stdin, &out);
|
|
}
|
|
}
|
|
|
|
if (proc->eof)
|
|
proc->eof ("", &out);
|
|
if (out.fout) {
|
|
fclose (out.fout);
|
|
}
|
|
|
|
return 0;
|
|
}
|