Initial revision
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
2fa0b342
DHW
1%{
2/* Copyright (C) 1991 Free Software Foundation, Inc.
3
4This file is part of GLD, the Gnu Linker.
5
6GLD is free software; you can redistribute it and/or modify
7it under the terms of the GNU General Public License as published by
8the Free Software Foundation; either version 1, or (at your option)
9any later version.
10
11GLD is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16You should have received a copy of the GNU General Public License
17along with GLD; see the file COPYING. If not, write to
18the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20/*
21 * $Id$
22 *
23 * $Log$
24 * Revision 1.1 1991/03/21 21:28:50 gumby
25 * Initial revision
26 *
27 * Revision 1.3 1991/03/16 22:27:24 rich
28 * fish
29 *
30 * Revision 1.2 1991/03/15 18:45:55 rich
31 * foo
32 *
33 * Revision 1.1 1991/03/13 00:48:27 chrisb
34 * Initial revision
35 *
36 * Revision 1.6 1991/03/10 09:31:32 rich
37 * Modified Files:
38 * Makefile config.h ld-emul.c ld-emul.h ld-gld.c ld-gld960.c
39 * ld-lnk960.c ld.h lddigest.c ldexp.c ldexp.h ldfile.c ldfile.h
40 * ldgram.y ldinfo.h ldlang.c ldlang.h ldlex.h ldlex.l ldmain.c
41 * ldmain.h ldmisc.c ldmisc.h ldsym.c ldsym.h ldversion.c
42 * ldversion.h ldwarn.h ldwrite.c ldwrite.h y.tab.h
43 *
44 * As of this round of changes, ld now builds on all hosts of (Intel960)
45 * interest and copy passes my copy test on big endian hosts again.
46 *
47 * Revision 1.5 1991/03/09 03:25:49 sac
48 * Can now parse the -Ur flag
49 *
50 * Revision 1.4 1991/03/06 02:26:04 sac
51 * Added support for constructor sections.
52 * Remove parsing ambiguity.
53 * Lint
54 *
55 * Revision 1.3 1991/02/22 17:15:14 sac
56 * Added RCS keywords and copyrights
57 *
58*/
59
60
61
62/*SUPPRESS 529*/
63/*SUPPRESS 26*/
64/*SUPPRESS 29*/
65#define LEXDEBUG
66#include "sysdep.h"
67#include "bfd.h"
68
69#include <ctype.h>
70#include "ldlex.h"
71
72#include "ld.h"
73#include "ldexp.h"
74#include "ldgram.tab.h"
75#include "ldmisc.h"
76
77#undef input
78#undef unput
79#define input lex_input
80#define unput lex_unput
81int debug;
82extern boolean ldgram_want_filename;
83extern boolean ldgram_mustbe_filename;
84extern boolean ldgram_mustbe_symbolname;
85static char *command_line;
86
87extern int fgetc();
88extern int yyparse();
89
90typedef struct {
91 char *name;
92int value;
93} keyword_type;
94#define RTOKEN(x) { yylval.token = x; return x; }
95keyword_type keywords[] =
96{
97"MEMORY",MEMORY,
98"ORIGIN",ORIGIN,
99"BLOCK",BLOCK,
100"LENGTH",LENGTH,
101"ALIGN",ALIGN_K,
102"SUBSECTION_ALIGN",SUBSECTION_ALIGN,
103"ADDR",ADDR,
104"ENTRY",ENTRY,
105"NEXT",NEXT,
106"MAP",MAP,
107"SIZEOF",SIZEOF,
108"TARGET",TARGET_K,
109"SEARCH_DIR",SEARCH_DIR,
110"OUTPUT",OUTPUT,
111"INPUT",INPUT,
112"DEFINED",DEFINED,
113"CREATE_OBJECT_SYMBOLS",CREATE_OBJECT_SYMBOLS,
114"SECTIONS",SECTIONS,
115"FILL",FILL,
116"STARTUP",STARTUP,
117"HLL",HLL,
118"SYSLIB",SYSLIB,
119"FLOAT",FLOAT,
120"LONG", LONG,
121"SHORT", SHORT,
122"BYTE", BYTE,
123"NOFLOAT",NOFLOAT,
124"o",ORIGIN,
125"org",ORIGIN,
126"l", LENGTH,
127"len", LENGTH,
1280,0};
129unsigned int lineno;
130extern boolean hex_mode;
131FILE *ldlex_input_stack;
132static unsigned int have_pushback;
133#define NPUSHBACK 10
134int pushback[NPUSHBACK];
135int thischar;
136extern char *ldfile_input_filename;
137
138int
139lex_input()
140{
141 /*
142 When we know that the next token must be a filename we force the
143 input routine to return a '#' character, which will cause the special
144 filname regexp to match the following chars even if they don't look
145 much like a filename to any sane person.
146 */
147 if (ldgram_mustbe_filename) {
148 ldgram_mustbe_filename = false;
149 return '#';
150 }
151
152 if (have_pushback > 0)
153 {
154 have_pushback --;
155 return thischar = pushback[have_pushback];
156 }
157 if (ldlex_input_stack) {
158 thischar = fgetc(ldlex_input_stack);
159
160 if (thischar == EOF) {
161 fclose(ldlex_input_stack);
162 ldlex_input_stack = (FILE *)NULL;
163 ldfile_input_filename = (char *)NULL;
164 thischar = lex_input();
165
166 }
167 }
168 else if (command_line && *command_line) {
169 thischar = *(command_line++);
170 }
171 else thischar = 0;
172 if(thischar == '\t') thischar = ' ';
173 return thischar ;
174}
175
176void
177lex_unput(c)
178int c;
179{
180 if (have_pushback > NPUSHBACK) {
181 info("%F%P Too many pushbacks\n");
182 }
183
184 pushback[have_pushback] = c;
185 have_pushback ++;
186}
187
188
189 int
190yywrap()
191 { return 1; }
192/*VARARGS*/
193
194void
195allprint(x)
196int x;
197{
198fprintf(yyout,"%d",x);
199}
200
201void
202sprint(x)
203char *x;
204{
205fprintf(yyout,"%s",x);
206}
207
208int thischar;
209
210void parse_line(arg)
211char *arg;
212{
213 command_line = arg;
214 have_pushback = 0;
215 yyparse();
216}
217
218
219
220void
221parse_args(ac, av)
222int ac;
223char **av;
224{
225 char *p;
226 int i;
227 size_t size = 0;
228 char *dst;
229 debug = 1;
230 for (i= 1; i < ac; i++) {
231 size += strlen(av[i]) + 2;
232 }
233 dst = p = (char *)ldmalloc(size + 2);
234/* Put a space arount each option */
235
236
237 for (i =1; i < ac; i++) {
238
239 unsigned int s = strlen(av[i]);
240 *dst++ = ' ';
241 memcpy(dst, av[i], s);
242 dst[s] = ' ';
243 dst += s + 1;
244 }
245 *dst = 0;
246 parse_line(p);
247
248 free(p);
249
250
251}
252
253long number(text, base)
254char *text;
255int base;
256{
257unsigned long l = 0;
258 char *p;
259 for (p = text; *p != 0; p++) {
260 if (*p == 'K') {
261 l =l * 1024;
262 }
263 else if(*p== 'M') {
264 l =l * 1024 * 1024;
265 }
266 else {
267 l =l * base;
268 if (isdigit(*p)) {
269 l += *p - '0';
270 }
271 else if (islower(*p)) {
272 l += *p - 'a' + 10;
273 }
274 else {
275 l += *p - 'A' + 10;
276 }
277 }
278 }
279 return l;
280}
281%}
282
283%a 4000
284%o 5000
285FILENAMECHAR [a-zA-Z0-9\/\.\-\_\+]
286FILENAME {FILENAMECHAR}+
287
288
289WHITE [ \t]+
290
291%%
292"\n" { lineno++; }
293
294
295"\ -defsym" { return OPTION_defsym; }
296"\ -noinhibit_exec" { return OPTION_noinhibit_exec; }
297"\ -format" { return OPTION_format; }
298"\ -n" { return OPTION_n; }
299"\ -r" { return OPTION_r; }
300"\ -Ur" { return OPTION_Ur; }
301"\ -o" { return OPTION_o; }
302"\ -g" { return OPTION_g; }
303"\ -e" { return OPTION_e; }
304"\ -b" { return OPTION_b; }
305"\ -dc" { return OPTION_dc; }
306"\ -dp" { return OPTION_dp; }
307"\ -d" { return OPTION_d; }
308"\ -v" { return OPTION_v; }
309"\ -M" { return OPTION_M; }
310"\ -t" { return OPTION_t; }
311"\ -X" { return OPTION_X; }
312"\ -x" { return OPTION_x; }
313"\ -c" { return OPTION_c; }
314"\ -s" { return OPTION_s; }
315"\ -S" { return OPTION_S; }
316"\ -l"{FILENAME} {
317 yylval.name = buystring(yytext+3);
318 return OPTION_l;
319 }
320
321"\ -L"{FILENAME} {
322 yylval.name = buystring(yytext+3);
323 return OPTION_L;
324 }
325"\ -Ttext" {
326 yylval.name = ".text";
327 return OPTION_Texp;
328 }
329"\ -Tdata" {
330 yylval.name = ".data";
331 return OPTION_Texp;
332 }
333"\ -Tbss" {
334 yylval.name = ".bss";
335 return OPTION_Texp;
336 }
337
338"\ -T"{FILENAME} {
339 yylval.name = buystring(yytext+3);
340 return OPTION_Tfile;
341 }
342"\ -T" {
343 return OPTION_T;
344 }
345
346"\ -A"{FILENAME} {
347 yylval.name = buystring(yytext+3);
348 return OPTION_Aarch;
349 }
350" " { }
351"<<=" { RTOKEN(LSHIFTEQ);}
352">>=" { RTOKEN(RSHIFTEQ);}
353"||" { RTOKEN(OROR);}
354"==" { RTOKEN(EQ);}
355"!=" { RTOKEN(NE);}
356">=" { RTOKEN(GE);}
357"<=" { RTOKEN(LE);}
358"<<" { RTOKEN(LSHIFT);}
359">>" { RTOKEN(RSHIFT);}
360"+=" { RTOKEN(PLUSEQ);}
361"-=" { RTOKEN(MINUSEQ);}
362"*=" { RTOKEN(MULTEQ);}
363"/=" { RTOKEN(DIVEQ);}
364"&=" { RTOKEN(ANDEQ);}
365"|=" { RTOKEN(OREQ);}
366
367"&&" { RTOKEN(ANDAND);}
368">" { RTOKEN('>');}
369"," { RTOKEN(',');}
370"&" { RTOKEN('&');}
371"|" { RTOKEN('|');}
372"~" { RTOKEN('~');}
373"!" { RTOKEN('!');}
374"?" { RTOKEN('?');}
375"*" { RTOKEN('*');}
376"%" { RTOKEN('%');}
377"<" { RTOKEN('<');}
378"+" { RTOKEN('+');}
379">" { RTOKEN('>');}
380"}" { RTOKEN('}') ; }
381"{" { RTOKEN('{'); }
382")" { RTOKEN(')');}
383"(" { RTOKEN('(');}
384"]" { RTOKEN(']');}
385"[" { RTOKEN('[');}
386":" { RTOKEN(':'); }
387";" { RTOKEN(';');}
388"-" { RTOKEN('-');}
389"=" { RTOKEN('=');}
390
391
392"/*" {
393 while (1) {
394 int ch;
395 ch = input();
396 while (ch != '*') {
397 if (ch == '\n') {lineno++; }
398 ch = input();
399 }
400
401
402
403 if (input() == '/') {
404 break;
405 }
406 unput(yytext[yyleng-1]);
407 }
408}
409
410"\""[^\"]*"\"" {
411
412 yylval.name = buystring(yytext+1);
413 yylval.name[yyleng-2] = 0; /* Fry final quote */
414 return NAME;
415}
416[0][0-7KM]* {
417
418 yylval.integer = number(yytext+1, 8);
419 return INT;
420}
421
422[0-9]+[KM]? {
423 if (hex_mode == true) {
424 yylval.integer = number(yytext, 16);
425 }
426 else {
427 yylval.integer = number(yytext, 10);
428 }
429 return INT;
430}
431
4320[Xx][0-9a-fA-FKM]+ {
433
434 yylval.integer = number(yytext+2,16);
435 return INT;
436}
437
438"\#"{WHITE}*{FILENAMECHAR}+ {
439 char *p = yytext+1;
440 while(*p ==' ' || *p == '\t') p++;
441 yylval.name = buystring(p);
442 return NAME;
443}
444
445
446{FILENAMECHAR} {
447
448int ch;
449 keyword_type *k;
450 if (yytext[0] == '/' && ldgram_mustbe_symbolname)
451 { RTOKEN('/');}
452 ch = input();
453 while (true) {
454 if (isalpha(ch) || isdigit(ch) || ch == '.' || ch == '_') {
455 yytext[yyleng++] = ch;
456 }
457 else if (ch == '-' && ldgram_want_filename == true) {
458 yytext[yyleng++] = ch;
459 }
460 else if (ch == '+' && ldgram_want_filename == true) {
461 yytext[yyleng++] = ch;
462 }
463
464 else if (ch == '/' && ldgram_want_filename == true) {
465 yytext[yyleng++] = ch;
466 }
467
468 else break;
469 ch = input();
470 }
471
472 yytext[yyleng] = 0;
473 unput(ch);
474
475 for(k = keywords; k ->name != (char *)NULL; k++) {
476
477 if (strcmp(k->name, yytext)==0) {
478 yylval.token = k->value;
479 return k->value;
480 }
481 }
482 yylval.name = buystring(yytext);
483 return NAME;
484}
485
486
487
488
489
490%%
This page took 0.038342 seconds and 4 git commands to generate.