comparison src/macro.c @ 67:d5fe306f1ab1

Fixed numerous bugs in macro handling
author lost
date Mon, 05 Jan 2009 05:40:33 +0000
parents 035b95a3690f
children cef25b0088e6
comparison
equal deleted inserted replaced
66:aa9d9fedfdf4 67:d5fe306f1ab1
144 lwasm_line_t *cl, *nl; 144 lwasm_line_t *cl, *nl;
145 int oldcontext; 145 int oldcontext;
146 macrotab_t *m; 146 macrotab_t *m;
147 147
148 char **args = NULL; // macro arguments 148 char **args = NULL; // macro arguments
149 int nargs; // number of arguments 149 int nargs = 0; // number of arguments
150 150
151 char *p2, *p3; 151 char *p2, *p3;
152 152
153 int bloc, blen; 153 int bloc, blen;
154 char *linebuff; 154 char *linebuff;
181 if (*p2 == '\\') 181 if (*p2 == '\\')
182 { 182 {
183 if (p2[1]) 183 if (p2[1])
184 p2++; 184 p2++;
185 } 185 }
186 p2++;
186 } 187 }
187 188
188 // have arg here 189 // have arg here
189 args = lwasm_realloc(args, nargs + 1); 190 args = lwasm_realloc(args, nargs + 1);
190 args[nargs] = lwasm_alloc(p2 - *p + 1); 191 args[nargs] = lwasm_alloc(p2 - *p + 1);
236 nl -> codelen = 0; 237 nl -> codelen = 0;
237 nl -> codesize = 0; 238 nl -> codesize = 0;
238 nl -> nocodelen = 0; 239 nl -> nocodelen = 0;
239 nl -> addrset = 0; 240 nl -> addrset = 0;
240 nl -> symaddr = -1; 241 nl -> symaddr = -1;
242 nl -> badop = 0;
241 if (as -> linestail) 243 if (as -> linestail)
242 as -> linestail -> next = nl; 244 as -> linestail -> next = nl;
243 as -> linestail = nl; 245 as -> linestail = nl;
244 if (!(as -> lineshead)) 246 if (!(as -> lineshead))
245 as -> lineshead = nl; 247 as -> lineshead = nl;
254 256
255 p2++; 257 p2++;
256 n = *p2 - '0'; 258 n = *p2 - '0';
257 if (n == 0) 259 if (n == 0)
258 { 260 {
259 for (p3 = m -> name; p3; p3++) 261 for (p3 = m -> name; *p3; p3++)
260 macro_add_to_buff(&linebuff, &bloc, &blen, *p3); 262 macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
261 continue; 263 continue;
262 } 264 }
263 if (n < 1 || n > nargs) 265 if (n < 1 || n > nargs)
264 continue; 266 continue;
265 for (p3 = args[n]; p3; p3++) 267 for (p3 = args[n - 1]; *p3; p3++)
266 macro_add_to_buff(&linebuff, &bloc, &blen, *p3); 268 macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
267 continue; 269 continue;
268 } 270 }
269 else if (*p2 == '{') 271 else if (*p2 == '{')
270 { 272 {
281 if (*p2 == '}') 283 if (*p2 == '}')
282 p2++; 284 p2++;
283 285
284 if (n == 0) 286 if (n == 0)
285 { 287 {
286 for (p3 = m -> name; p3; p3++) 288 for (p3 = m -> name; *p3; p3++)
287 macro_add_to_buff(&linebuff, &bloc, &blen, *p3); 289 macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
288 continue; 290 continue;
289 } 291 }
290 if (n < 1 || n > nargs) 292 if (n < 1 || n > nargs)
291 continue; 293 continue;
292 for (p3 = args[n]; p3; p3++) 294 for (p3 = args[n - 1]; *p3; p3++)
293 macro_add_to_buff(&linebuff, &bloc, &blen, *p3); 295 macro_add_to_buff(&linebuff, &bloc, &blen, *p3);
294 continue; 296 continue;
295 } 297 }
296 else 298 else
297 { 299 {
310 312
311 // restore context from before the macro was called 313 // restore context from before the macro was called
312 as -> context = oldcontext; 314 as -> context = oldcontext;
313 315
314 // clean up 316 // clean up
315 while (nargs) 317 if (args)
316 { 318 {
317 lwasm_free(args[--nargs]); 319 while (nargs)
318 } 320 {
319 lwasm_free(args); 321 lwasm_free(args[--nargs]);
322 }
323 lwasm_free(args);
324 }
320 325
321 // indicate a macro was expanded 326 // indicate a macro was expanded
322 return 0; 327 return 0;
323 } 328 }