Mercurial > hg > index.cgi
comparison lwasm/lwasm.c @ 142:697bc543368c
Implement distinction between . and * for OS9 modules
author | lost@l-w.ca |
---|---|
date | Fri, 19 Aug 2011 23:55:40 -0600 |
parents | 7e621e00b887 |
children | 8dead67ba607 |
comparison
equal
deleted
inserted
replaced
141:11ebce0183a5 | 142:697bc543368c |
---|---|
102 asmstate_t *as = priv; | 102 asmstate_t *as = priv; |
103 if (as -> exportcheck && ptr == as -> csect) | 103 if (as -> exportcheck && ptr == as -> csect) |
104 return lw_expr_build(lw_expr_type_int, 0); | 104 return lw_expr_build(lw_expr_type_int, 0); |
105 return NULL; | 105 return NULL; |
106 } | 106 } |
107 | 107 |
108 case lwasm_expr_linedlen: | |
109 { | |
110 line_t *cl = ptr; | |
111 if (cl -> dlen == -1) | |
112 return NULL; | |
113 return lw_expr_build(lw_expr_type_int, cl -> dlen); | |
114 } | |
115 break; | |
116 | |
108 case lwasm_expr_linelen: | 117 case lwasm_expr_linelen: |
109 { | 118 { |
110 line_t *cl = ptr; | 119 line_t *cl = ptr; |
111 if (cl -> len == -1) | 120 if (cl -> len == -1) |
112 return NULL; | 121 return NULL; |
113 return lw_expr_build(lw_expr_type_int, cl -> len); | 122 return lw_expr_build(lw_expr_type_int, cl -> len); |
114 } | 123 } |
115 break; | 124 break; |
116 | 125 |
126 case lwasm_expr_linedaddr: | |
127 { | |
128 line_t *cl = ptr; | |
129 return lw_expr_copy(cl -> daddr); | |
130 } | |
131 | |
117 case lwasm_expr_lineaddr: | 132 case lwasm_expr_lineaddr: |
118 { | 133 { |
119 line_t *cl = ptr; | 134 line_t *cl = ptr; |
120 if (cl -> addr) | 135 if (cl -> addr) |
121 return lw_expr_copy(cl -> addr); | 136 return lw_expr_copy(cl -> addr); |
282 int val; | 297 int val; |
283 | 298 |
284 if (!**p) | 299 if (!**p) |
285 return NULL; | 300 return NULL; |
286 | 301 |
287 if (**p == '*' || ( | 302 if (**p == '.' |
288 **p == '.' | |
289 && !((*p)[1] >= 'A' && (*p)[1] <= 'Z') | 303 && !((*p)[1] >= 'A' && (*p)[1] <= 'Z') |
290 && !((*p)[1] >= 'a' && (*p)[1] <= 'z') | 304 && !((*p)[1] >= 'a' && (*p)[1] <= 'z') |
291 && !((*p)[1] >= '0' && (*p)[1] <= '9') | 305 && !((*p)[1] >= '0' && (*p)[1] <= '9') |
292 )) | 306 ) |
293 { | 307 { |
294 // special "symbol" for current line addr (*, .) | 308 (*p)++; |
309 return lw_expr_build(lw_expr_type_special, lwasm_expr_linedaddr, as -> cl); | |
310 } | |
311 | |
312 if (**p == '*') | |
313 { | |
314 // special "symbol" for current line addr (*) | |
295 (*p)++; | 315 (*p)++; |
296 return lw_expr_build(lw_expr_type_special, lwasm_expr_lineaddr, as -> cl); | 316 return lw_expr_build(lw_expr_type_special, lwasm_expr_lineaddr, as -> cl); |
297 } | 317 } |
298 | 318 |
299 // branch points | 319 // branch points |