27
27
* POSSIBILITY OF SUCH DAMAGE.
30
RCSID("$Id: nasm-token.re 2065 2008-04-15 02:53:18Z peter $");
30
RCSID("$Id: nasm-token.re 2139 2008-10-08 05:19:47Z peter $");
32
32
#include <libyasm.h>
34
34
#include "modules/parsers/nasm/nasm-parser.h"
35
#include "modules/preprocs/nasm/nasm.h"
37
38
#define YYCURSOR cursor
77
78
/* check for special non-local labels like ..start */
78
79
if (tok[zeropos+1] == '.') {
79
lvalp->str_val = yasm__xstrndup(tok+zeropos, toklen-zeropos);
80
lvalp->str_val = yasm__xstrndup(tok+zeropos+(parser_nasm->tasm?2:0),
81
toklen-zeropos-(parser_nasm->tasm?2:0));
80
82
/* check for special non-local ..@label */
81
83
if (lvalp->str_val[zeropos+2] == '@')
82
84
return NONLOCAL_ID;
87
if (parser_nasm->tasm && (!tasm_locals ||
88
(tok[zeropos] == '.' &&
89
tok[zeropos+1] != '@' && tok[zeropos+2] != '@'))) {
90
/* no locals on Tasm without the 'locals' directive */
91
/* .foo is never local either, but .@@foo may be (local structure
93
lvalp->str_val = yasm__xstrndup(tok + zeropos, toklen - zeropos);
86
96
if (!parser_nasm->locallabel_base) {
87
97
lvalp->str_val = yasm__xstrndup(tok+zeropos, toklen-zeropos);
88
98
yasm_warn_set(YASM_WARN_GENERAL,
242
254
/* pseudo-instructions */
243
'db' { lvalp->int_info = 8; RETURN(DECLARE_DATA); }
257
parser_nasm->state = INSTRUCTION;
258
RETURN(DECLARE_DATA);
245
261
lvalp->int_info = yasm_arch_wordsize(p_object->arch)/2;
262
parser_nasm->state = INSTRUCTION;
246
263
RETURN(DECLARE_DATA);
249
266
lvalp->int_info = yasm_arch_wordsize(p_object->arch);
267
parser_nasm->state = INSTRUCTION;
250
268
RETURN(DECLARE_DATA);
253
271
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*2;
272
parser_nasm->state = INSTRUCTION;
254
273
RETURN(DECLARE_DATA);
257
276
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*4;
258
RETURN(DECLARE_DATA);
260
'dt' { lvalp->int_info = 80; RETURN(DECLARE_DATA); }
277
parser_nasm->state = INSTRUCTION;
278
RETURN(DECLARE_DATA);
281
lvalp->int_info = 80;
282
parser_nasm->state = INSTRUCTION;
283
RETURN(DECLARE_DATA);
262
286
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*8;
287
parser_nasm->state = INSTRUCTION;
263
288
RETURN(DECLARE_DATA);
266
291
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*8;
292
parser_nasm->state = INSTRUCTION;
267
293
RETURN(DECLARE_DATA);
270
296
lvalp->int_info = 256;
297
parser_nasm->state = INSTRUCTION;
271
298
RETURN(DECLARE_DATA);
274
'resb' { lvalp->int_info = 8; RETURN(RESERVE_SPACE); }
303
parser_nasm->state = INSTRUCTION;
304
RETURN(RESERVE_SPACE);
276
307
lvalp->int_info = yasm_arch_wordsize(p_object->arch)/2;
308
parser_nasm->state = INSTRUCTION;
277
309
RETURN(RESERVE_SPACE);
280
312
lvalp->int_info = yasm_arch_wordsize(p_object->arch);
313
parser_nasm->state = INSTRUCTION;
281
314
RETURN(RESERVE_SPACE);
284
317
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*2;
318
parser_nasm->state = INSTRUCTION;
285
319
RETURN(RESERVE_SPACE);
288
322
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*4;
289
RETURN(RESERVE_SPACE);
291
'rest' { lvalp->int_info = 80; RETURN(RESERVE_SPACE); }
323
parser_nasm->state = INSTRUCTION;
324
RETURN(RESERVE_SPACE);
327
lvalp->int_info = 80;
328
parser_nasm->state = INSTRUCTION;
329
RETURN(RESERVE_SPACE);
293
332
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*8;
333
parser_nasm->state = INSTRUCTION;
294
334
RETURN(RESERVE_SPACE);
297
337
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*8;
338
parser_nasm->state = INSTRUCTION;
298
339
RETURN(RESERVE_SPACE);
301
342
lvalp->int_info = 256;
343
parser_nasm->state = INSTRUCTION;
302
344
RETURN(RESERVE_SPACE);
323
365
"//" { RETURN(SIGNDIV); }
324
366
"%%" { RETURN(SIGNMOD); }
325
367
"$$" { RETURN(START_SECTION_ID); }
326
[-+|^*&/%~$():=,\[] { RETURN(s->tok[0]); }
368
[-+|^*&/%~$():=,\[?] { RETURN(s->tok[0]); }
327
369
"]" { RETURN(s->tok[0]); }
329
371
/* local label (.label) */
330
"." [a-zA-Z0-9_$#@~.?]+ {
372
("." | "@@") [a-zA-Z0-9_$#@~.?]+ {
331
373
RETURN(handle_dot_label(lvalp, TOK, TOKLEN, 0, parser_nasm));
334
376
/* forced identifier */
335
377
"$" [a-zA-Z0-9_$#@~.?]+ {
379
(parser_nasm->tasm && TOK[1] == '@' && TOK[2] == '@')) {
337
380
/* handle like .label */
338
381
RETURN(handle_dot_label(lvalp, TOK, TOKLEN, 1, parser_nasm));
374
417
s->tok[TOKLEN] = savech;
375
418
RETURN(TARGETMOD);
377
s->tok[TOKLEN] = savech;
422
if (parser_nasm->tasm) {
423
if (!yasm__strcasecmp(TOK, "shl")) {
424
s->tok[TOKLEN] = savech;
427
if (!yasm__strcasecmp(TOK, "shr")) {
428
s->tok[TOKLEN] = savech;
431
if (!yasm__strcasecmp(TOK, "and")) {
432
s->tok[TOKLEN] = savech;
435
if (!yasm__strcasecmp(TOK, "or")) {
436
s->tok[TOKLEN] = savech;
439
if (!yasm__strcasecmp(TOK, "low")) {
440
s->tok[TOKLEN] = savech;
443
if (!yasm__strcasecmp(TOK, "high")) {
444
s->tok[TOKLEN] = savech;
447
if (!yasm__strcasecmp(TOK, "offset")) {
448
s->tok[TOKLEN] = savech;
451
if (!yasm__strcasecmp(TOK, "fword")) {
452
s->tok[TOKLEN] = savech;
453
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*2;
454
RETURN(SIZE_OVERRIDE);
456
if (!yasm__strcasecmp(TOK, "df")) {
457
s->tok[TOKLEN] = savech;
458
lvalp->int_info = yasm_arch_wordsize(p_object->arch)*3;
459
parser_nasm->state = INSTRUCTION;
460
RETURN(DECLARE_DATA);
462
if (!yasm__strcasecmp(TOK, "label")) {
463
s->tok[TOKLEN] = savech;
466
if (!yasm__strcasecmp(TOK, "dup")) {
467
s->tok[TOKLEN] = savech;
379
471
/* Propagate errors in case we got a warning from the arch */
380
472
yasm_errwarn_propagate(parser_nasm->errwarns, cur_line);
381
473
/* Just an identifier, return as such. */
474
s->tok[TOKLEN] = savech;
382
475
lvalp->str_val = yasm__xstrndup(TOK, TOKLEN);
460
548
/* directive: [name value] */
466
parser_nasm->state = INITIAL;
555
[\]\000] { goto endofinput; }
470
557
[a-zA-Z_][a-zA-Z_0-9]* {
471
558
lvalp->str_val = yasm__xstrndup(TOK, TOKLEN);
508
597
goto section_directive;
512
parser_nasm->state = INITIAL;
517
parser_nasm->state = INITIAL;
600
[\]\000] { goto endofinput; }
522
603
yasm_warn_set(YASM_WARN_UNREC_CHAR,
589
672
[-+|^*&/%~$():=,\[] { RETURN(s->tok[0]); }
591
674
/* handle ] for directives */
593
parser_nasm->state = INITIAL;
675
"]" { goto endofinput; }
597
677
/* forced identifier; within directive, don't strip '$', this is
647
724
stringconst_scan:
727
goto stringconst_error;
652
yasm_error_set(YASM_ERROR_SYNTAX, N_("unterminated string"));
653
strbuf[count] = '\0';
654
lvalp->str.contents = (char *)strbuf;
655
lvalp->str.len = count;
730
[\000] { goto stringconst_error; }
733
if (endch != s->tok[0]) {
734
strbuf[count++] = s->tok[0];
735
if (count >= strbuf_size) {
736
strbuf = yasm_xrealloc(strbuf,
737
strbuf_size + STRBUF_ALLOC_SIZE);
738
strbuf_size += STRBUF_ALLOC_SIZE;
740
} else if (!parser_nasm->tasm) {
742
goto stringconst_end;
744
strbuf[count++] = s->tok[0];
745
if (count >= strbuf_size) {
746
strbuf = yasm_xrealloc(strbuf, strbuf_size + STRBUF_ALLOC_SIZE);
747
strbuf_size += STRBUF_ALLOC_SIZE;
749
goto stringconst_scan;
660
if (s->tok[0] == endch) {
661
strbuf[count] = '\0';
662
lvalp->str.contents = (char *)strbuf;
663
lvalp->str.len = count;
753
if (s->tok[0] == endch)
754
goto stringconst_end;
667
756
strbuf[count++] = s->tok[0];
668
757
if (count >= strbuf_size) {