1 /* radare2 - LGPL - Copyright 2009-2020 - nibble, pancake, maijin */
2
3 #include <stdio.h>
4
5 #include <r_types.h>
6 #include <r_parse.h>
7 #include <config.h>
8
9 R_LIB_VERSION (r_parse);
10
11 static RParsePlugin *parse_static_plugins[] =
12 { R_PARSE_STATIC_PLUGINS };
13
r_parse_new(void)14 R_API RParse *r_parse_new(void) {
15 int i;
16 RParse *p = R_NEW0 (RParse);
17 if (!p) {
18 return NULL;
19 }
20 p->parsers = r_list_newf (NULL); // memleak
21 if (!p->parsers) {
22 r_parse_free (p);
23 return NULL;
24 }
25 p->notin_flagspace = NULL;
26 p->flagspace = NULL;
27 p->pseudo = false;
28 p->subrel = false;
29 p->subtail = false;
30 p->minval = 0x100;
31 p->localvar_only = false;
32 for (i = 0; parse_static_plugins[i]; i++) {
33 r_parse_add (p, parse_static_plugins[i]);
34 }
35 return p;
36 }
37
r_parse_free(RParse * p)38 R_API void r_parse_free(RParse *p) {
39 r_list_free (p->parsers);
40 free (p);
41 }
42
r_parse_add(RParse * p,RParsePlugin * foo)43 R_API bool r_parse_add(RParse *p, RParsePlugin *foo) {
44 bool itsFine = true;
45 if (foo->init) {
46 itsFine = foo->init (p, p->user);
47 }
48 if (itsFine) {
49 r_list_append (p->parsers, foo);
50 }
51 return true;
52 }
53
r_parse_use(RParse * p,const char * name)54 R_API bool r_parse_use(RParse *p, const char *name) {
55 RListIter *iter;
56 RParsePlugin *h;
57 r_return_val_if_fail (p && name, false);
58 r_list_foreach (p->parsers, iter, h) {
59 if (!strcmp (h->name, name)) {
60 p->cur = h;
61 return true;
62 }
63 }
64 return false;
65 }
66
67 // this function is a bit confussing, assembles C code into wat?, whehres theh input and wheres the output
68 // and its unused. so imho it sshould be DEPRECATED this conflicts with rasm.assemble imhoh
r_parse_assemble(RParse * p,char * data,char * str)69 R_API bool r_parse_assemble(RParse *p, char *data, char *str) {
70 char *in = strdup (str);
71 bool ret = false;
72 char *s, *o;
73
74 data[0]='\0';
75 if (p->cur && p->cur->assemble) {
76 o = data + strlen (data);
77 do {
78 s = strchr (str, ';');
79 if (s) {
80 *s = '\0';
81 }
82 ret = p->cur->assemble (p, o, str);
83 if (!ret) {
84 break;
85 }
86 if (s) {
87 str = s + 1;
88 o += strlen (data);
89 o[0] = '\n';
90 o[1] = '\0';
91 o++;
92 }
93 } while (s);
94 }
95 free (in);
96 return ret;
97 }
98
99 // data is input disasm, str is output pseudo
100 // TODO: refactooring, this should return char * instead
r_parse_parse(RParse * p,const char * data,char * str)101 R_API bool r_parse_parse(RParse *p, const char *data, char *str) {
102 r_return_val_if_fail (p && data && str, false);
103 return (p && data && *data && p->cur && p->cur->parse)
104 ? p->cur->parse (p, data, str) : false;
105 }
106
r_parse_immtrim(char * opstr)107 R_API char *r_parse_immtrim(char *opstr) {
108 if (R_STR_ISEMPTY (opstr)) {
109 return NULL;
110 }
111 char *n = strstr (opstr, "0x");
112 if (n) {
113 char *p = n + 2;
114 while (IS_HEXCHAR (*p)) {
115 p++;
116 }
117 memmove (n, p, strlen (p) + 1);
118 }
119 if (strstr (opstr, " - ]")) {
120 opstr = r_str_replace (opstr, " - ]", "]", 1);
121 }
122 if (strstr (opstr, " + ]")) {
123 opstr = r_str_replace (opstr, " + ]", "]", 1);
124 }
125 if (strstr (opstr, ", ]")) {
126 opstr = r_str_replace (opstr, ", ]", "]", 1);
127 }
128 if (strstr (opstr, " - ")) {
129 opstr = r_str_replace (opstr, " - ", "-", 1);
130 }
131 if (strstr (opstr, " + ")) {
132 opstr = r_str_replace (opstr, " + ", "+", 1);
133 }
134 return opstr;
135 }
136
r_parse_subvar(RParse * p,RAnalFunction * f,ut64 addr,int oplen,char * data,char * str,int len)137 R_API bool r_parse_subvar(RParse *p, RAnalFunction *f, ut64 addr, int oplen, char *data, char *str, int len) {
138 if (p->cur && p->cur->subvar) {
139 return p->cur->subvar (p, f, addr, oplen, data, str, len);
140 }
141 return false;
142 }
143
144 /* setters */
r_parse_set_user_ptr(RParse * p,void * user)145 R_API void r_parse_set_user_ptr(RParse *p, void *user) {
146 p->user = user;
147 }
148