hbmap: fix iterator truncation when size_t < 32bit
[rofl0r-agsutils.git] / asmlex.l
blob0d5a3c3cc3bf5bb1f5389714d46edc9838fd0998
1 D [0-9]
2 L [a-z]
3 U [A-Z]
4 A [A-Za-z]
5 AN [A-Za-z0-9]
6 AU [A-Za-z_]
7 ANU [A-Za-z0-9_]
9 %{
10 #define YY_SKIP_YYWRAP
11 #define yylex asmlex
13 #define yywrap() (1)
14 void yyerror(char*);
15 //#define YYSTYPE long long int
16 //extern YYSTYPE  yylval;
17 #include "y.tab.h"
18 #include <stdlib.h>
20 #define BISON
21 #include "scmd_tok.c"
22 #include "regname_tok.c"
24 #define USE_STRDUP
25 #ifdef USE_STRDUP
26 #define STRDUP(X) strdup(X)
27 #else
28 #define STRDUP(X) (X)
29 #endif
31 #define IRET(X) do{yylval.i = X; return X;}while(0)
32 #define SRET(X) do{yylval.s = STRDUP(yytext); return X;}while(0)
33 #define NRET(X) do{yylval.i = atoi(yytext); return X;}while(0)
35 /* XXX */
36 YYSTYPE yylval;
37 const char *yyfilename;
38 int yyfatalerrors;
43 \"([^\n"\\]|\\['"?\\abfnrtv]|\\[0-7]{1,3}|\\[Xx][0-9a-fA-F]+)*\"        SRET(STRING);
45 [\t ]+          ;
47 [#;].*\n        { /* ignore comments */ goto newline; }
49 \n              { newline:; ++yylineno; return 10; }
51 "label"{ANU}+   SRET(LABEL);
53 {AU}{ANU}*"$"{D}+       |
54 {AU}{ANU}*"::"{ANU}+"$"{D}+     { SRET(FN_I); }
56 {AU}{ANU}*("::"{ANU}+)?"^"{D}+  |
57 {AU}{ANU}*"::"{ANU}+            { SRET(FN_E); }
59 -?{D}+          { NRET(NUMBER);}
61 {AU}{ANU}*      SRET(ID);
63 [=:@,\.\[\]]    return yytext[0];
65 .               { yyerror("unknown character/token"); }
70 static int section = 0;
71 static int ltok = 0;
72 static int last_mnemonic = 0;
74 #undef yylex
75 int yylex() {
77         int ret = asmlex();
78         if(ret == '\n') {
79                 ltok = 0;
80                 return ret;
81         } else if (ltok==0 && ret == '.') goto set_section;
82         switch(section) {
83         case 0: if(ret != '.') yyerror("expected section start symbol '.'!");
84 set_section:
85                 ret = asmlex();
86                 if(ret != ID) yyerror("expected section name!");
87                 if(!strcmp(yytext, "data")) section = SECTION_DATA;
88                 else if(!strcmp(yytext, "text")) section = SECTION_TEXT;
89                 else if(!strcmp(yytext, "imports")) section = SECTION_IMPORTS;
90                 else if(!strcmp(yytext, "exports")) section = SECTION_EXPORTS;
91                 else if(!strcmp(yytext, "strings")) section = SECTION_STRINGS;
92                 else if(!strcmp(yytext, "sections")) section = SECTION_SECTIONS;
93                 else if(!strcmp(yytext, "fixups")) section = SECTION_FIXUPS;
94                 if(!section) yyerror("unknown section name!");
95                 return section;
96         case SECTION_DATA:
97                 /* FIXME variable names here can't be one of the 4 keywords */
98                 if (ret == ID) {
99                         if(!strcmp(yytext, "export")) IRET(D_EXPORT);
100                         else if(!strcmp(yytext, "int")) IRET(D_INT);
101                         else if(!strcmp(yytext, "short")) IRET(D_SHORT);
102                         else if(!strcmp(yytext, "char")) IRET(D_CHAR);
103                 }
104                 break;
105         case SECTION_TEXT:
106                 if(ret == ',') break;
107                 ++ltok;
108                 if (ret == ID) {
109                         if (ltok == 1) {
110                                 int tmp;
111                                 if((tmp = KW_SCMD_find_keyword(yytext, yyleng)))
112                                 {
113                                         last_mnemonic = tok2scmd(tmp);
114                                         IRET(tmp);
115                                 }
116                         } else {
117                                 const struct opcode_info *i = &opcodes[last_mnemonic];
118                                 if(i->regcount >= ltok-1) {
119                                         int tmp;
120                                         if((tmp = RN_find_keyword(yytext, yyleng)))
121                                                 IRET(tmp);
122                                 }
123                         }
124                         return ID;
125                 } else if (ret == LABEL) {
126                         /* user may haven chosen a variable name matching a label */
127                         if(ltok == 1 || last_mnemonic == SCMD_JMP ||
128                            last_mnemonic == SCMD_JZ || last_mnemonic == SCMD_JNZ)
129                                 return ret;
130                         return ID;
131                 }
132         }
133         return ret;
136 void yyerror(char *s) {
137         printf("%s:%d %s at `%s`\n",
138                 yyfilename==0?"stdin":yyfilename,
139                 yylineno,
140                 s,
141                 yytext[0] == 10 ? "<newline>" : yytext);
142         if(yyfatalerrors) abort();
145 void yylex_reset(FILE *f, const char *fn) {
146         yyfilename = fn;
147         yylineno = 1;
148 #ifdef YY_FLUSH_BUFFER
149         YY_FLUSH_BUFFER;
150 #endif
151         yyin = f;
152         if(yytext) yytext[0] = 0;
153         section = 0;
154         ltok = 0;
155         last_mnemonic = 0;
158 #ifdef LDEBUG
159 int main() {
160         while(1) {
161                 int n = yylex();
162                 if(n == EOF) break;
163                 printf("%d\n", n);
164                 if(feof(yyin)) break;
165         }
167 #endif