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