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