Mercurial > hg-old > index.cgi
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 } |