* configure.in: Check for windows.h, not Windows.h.
[deliverable/binutils-gdb.git] / ld / ldlex.l
CommitLineData
cfdf38f2
BE
1%option nounput
2
252b5132
RH
3%{
4
729c05fc
AM
5/* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
6 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
3db64b00 7 Free Software Foundation, Inc.
f96b4a7b 8 Written by Steve Chamberlain of Cygnus Support.
252b5132 9
f96b4a7b 10 This file is part of the GNU Binutils.
252b5132 11
f96b4a7b 12 This program is free software; you can redistribute it and/or modify
3ec57632 13 it under the terms of the GNU General Public License as published by
f96b4a7b
NC
14 the Free Software Foundation; either version 3 of the License, or
15 (at your option) any later version.
252b5132 16
f96b4a7b 17 This program is distributed in the hope that it will be useful,
3ec57632
NC
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
252b5132 21
3ec57632 22 You should have received a copy of the GNU General Public License
f96b4a7b
NC
23 along with this program; if not, write to the Free Software
24 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
25 MA 02110-1301, USA. */
252b5132 26
3db64b00 27#include "bfd.h"
3882b010 28#include "safe-ctype.h"
e3e942e9 29#include "bfdlink.h"
252b5132 30#include "ld.h"
252b5132
RH
31#include "ldmisc.h"
32#include "ldexp.h"
33#include "ldlang.h"
df2a7313 34#include <ldgram.h>
252b5132
RH
35#include "ldfile.h"
36#include "ldlex.h"
37#include "ldmain.h"
d1b2b2dc 38#include "libiberty.h"
252b5132
RH
39
40/* The type of top-level parser input.
41 yylex and yyparse (indirectly) both check this. */
42input_type parser_input;
43
44/* Line number in the current input file.
45 (FIXME Actually, it doesn't appear to get reset for each file?) */
46unsigned int lineno = 1;
47
48/* The string we are currently lexing, or NULL if we are reading a
49 file. */
50const char *lex_string = NULL;
51
52/* Support for flex reading from more than one input file (stream).
53 `include_stack' is flex's input state for each open file;
54 `file_name_stack' is the file names. `lineno_stack' is the current
55 line numbers.
56
57 If `include_stack_ptr' is 0, we haven't started reading anything yet.
58 Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
59
60#undef YY_INPUT
d05c651b 61#define YY_INPUT(buf,result,max_size) result = yy_input (buf, max_size)
252b5132 62
297ba367
NC
63#define YY_NO_UNPUT
64
252b5132
RH
65#define MAX_INCLUDE_DEPTH 10
66static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
67static const char *file_name_stack[MAX_INCLUDE_DEPTH];
68static unsigned int lineno_stack[MAX_INCLUDE_DEPTH];
69static unsigned int include_stack_ptr = 0;
70static int vers_node_nesting = 0;
71
d05c651b 72static int yy_input (char *, int);
1579bae1
AM
73static void comment (void);
74static void lex_warn_invalid (char *where, char *what);
252b5132 75
1579bae1 76/* STATES
252b5132
RH
77 EXPRESSION definitely in an expression
78 SCRIPT definitely in a script
79 BOTH either EXPRESSION or SCRIPT
80 DEFSYMEXP in an argument to -defsym
81 MRI in an MRI script
82 VERS_START starting a Sun style mapfile
83 VERS_SCRIPT a Sun style mapfile
84 VERS_NODE a node within a Sun style mapfile
85*/
86#define RTOKEN(x) { yylval.token = x; return x; }
87
88/* Some versions of flex want this. */
89#ifndef yywrap
1579bae1 90int yywrap (void) { return 1; }
252b5132
RH
91#endif
92%}
93
94%a 4000
95%o 5000
96
97CMDFILENAMECHAR [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\-\~]
98CMDFILENAMECHAR1 [_a-zA-Z0-9\/\.\\_\+\$\:\[\]\\\,\=\&\!\<\>\~]
99FILENAMECHAR1 [_a-zA-Z\/\.\\\$\_\~]
100SYMBOLCHARN [_a-zA-Z\/\.\\\$\_\~0-9]
101FILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~]
107c6e11 102WILDCHAR [_a-zA-Z0-9\/\.\-\_\+\=\$\:\[\]\\\,\~\?\*\^\!]
1579bae1 103WHITE [ \t\n\r]+
252b5132
RH
104
105NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
106
107V_TAG [.$_a-zA-Z][._a-zA-Z0-9]*
5e35cbc2 108V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)*
252b5132
RH
109
110%s SCRIPT
111%s EXPRESSION
112%s BOTH
113%s DEFSYMEXP
114%s MRI
115%s VERS_START
116%s VERS_SCRIPT
117%s VERS_NODE
118%%
119
120 if (parser_input != input_selected)
121 {
122 /* The first token of the input determines the initial parser state. */
123 input_type t = parser_input;
124 parser_input = input_selected;
125 switch (t)
126 {
127 case input_script: return INPUT_SCRIPT; break;
128 case input_mri_script: return INPUT_MRI_SCRIPT; break;
129 case input_version_script: return INPUT_VERSION_SCRIPT; break;
55255dae 130 case input_dynamic_list: return INPUT_DYNAMIC_LIST; break;
252b5132
RH
131 case input_defsym: return INPUT_DEFSYM; break;
132 default: abort ();
133 }
134 }
135
1579bae1 136<BOTH,SCRIPT,EXPRESSION,VERS_START,VERS_NODE,VERS_SCRIPT>"/*" { comment (); }
252b5132
RH
137
138
139<DEFSYMEXP>"-" { RTOKEN('-');}
140<DEFSYMEXP>"+" { RTOKEN('+');}
1579bae1 141<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = xstrdup (yytext); return NAME; }
252b5132
RH
142<DEFSYMEXP>"=" { RTOKEN('='); }
143
144<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
1579bae1
AM
145 yylval.integer = bfd_scan_vma (yytext + 1, 0, 16);
146 yylval.bigint.str = NULL;
252b5132
RH
147 return INT;
148 }
149
150<MRI,EXPRESSION>([0-9A-Fa-f])+(H|h|X|x|B|b|O|o|D|d) {
151 int ibase ;
1579bae1
AM
152 switch (yytext[yyleng - 1]) {
153 case 'X':
252b5132
RH
154 case 'x':
155 case 'H':
156 case 'h':
157 ibase = 16;
158 break;
159 case 'O':
160 case 'o':
161 ibase = 8;
162 break;
163 case 'B':
164 case 'b':
165 ibase = 2;
166 break;
167 default:
168 ibase = 10;
169 }
170 yylval.integer = bfd_scan_vma (yytext, 0,
171 ibase);
1579bae1 172 yylval.bigint.str = NULL;
252b5132
RH
173 return INT;
174 }
2c382fb6 175<SCRIPT,DEFSYMEXP,MRI,BOTH,EXPRESSION>((("$"|0[xX])([0-9A-Fa-f])+)|(([0-9])+))(M|K|m|k)? {
252b5132 176 char *s = yytext;
2c382fb6 177 int ibase = 0;
252b5132
RH
178
179 if (*s == '$')
2c382fb6
AM
180 {
181 ++s;
182 ibase = 16;
183 }
184 yylval.integer = bfd_scan_vma (s, 0, ibase);
1579bae1
AM
185 yylval.bigint.str = NULL;
186 if (yytext[yyleng - 1] == 'M'
187 || yytext[yyleng - 1] == 'm')
2c382fb6
AM
188 {
189 yylval.integer *= 1024 * 1024;
190 }
1579bae1
AM
191 else if (yytext[yyleng - 1] == 'K'
192 || yytext[yyleng - 1]=='k')
2c382fb6
AM
193 {
194 yylval.integer *= 1024;
195 }
196 else if (yytext[0] == '0'
197 && (yytext[1] == 'x'
198 || yytext[1] == 'X'))
199 {
200 yylval.bigint.str = xstrdup (yytext + 2);
201 }
252b5132
RH
202 return INT;
203 }
204<BOTH,SCRIPT,EXPRESSION,MRI>"]" { RTOKEN(']');}
205<BOTH,SCRIPT,EXPRESSION,MRI>"[" { RTOKEN('[');}
206<BOTH,SCRIPT,EXPRESSION,MRI>"<<=" { RTOKEN(LSHIFTEQ);}
207<BOTH,SCRIPT,EXPRESSION,MRI>">>=" { RTOKEN(RSHIFTEQ);}
208<BOTH,SCRIPT,EXPRESSION,MRI>"||" { RTOKEN(OROR);}
209<BOTH,SCRIPT,EXPRESSION,MRI>"==" { RTOKEN(EQ);}
210<BOTH,SCRIPT,EXPRESSION,MRI>"!=" { RTOKEN(NE);}
211<BOTH,SCRIPT,EXPRESSION,MRI>">=" { RTOKEN(GE);}
212<BOTH,SCRIPT,EXPRESSION,MRI>"<=" { RTOKEN(LE);}
213<BOTH,SCRIPT,EXPRESSION,MRI>"<<" { RTOKEN(LSHIFT);}
214<BOTH,SCRIPT,EXPRESSION,MRI>">>" { RTOKEN(RSHIFT);}
215<BOTH,SCRIPT,EXPRESSION,MRI>"+=" { RTOKEN(PLUSEQ);}
216<BOTH,SCRIPT,EXPRESSION,MRI>"-=" { RTOKEN(MINUSEQ);}
217<BOTH,SCRIPT,EXPRESSION,MRI>"*=" { RTOKEN(MULTEQ);}
218<BOTH,SCRIPT,EXPRESSION,MRI>"/=" { RTOKEN(DIVEQ);}
219<BOTH,SCRIPT,EXPRESSION,MRI>"&=" { RTOKEN(ANDEQ);}
220<BOTH,SCRIPT,EXPRESSION,MRI>"|=" { RTOKEN(OREQ);}
221<BOTH,SCRIPT,EXPRESSION,MRI>"&&" { RTOKEN(ANDAND);}
222<BOTH,SCRIPT,EXPRESSION,MRI>">" { RTOKEN('>');}
223<BOTH,SCRIPT,EXPRESSION,MRI>"," { RTOKEN(',');}
224<BOTH,SCRIPT,EXPRESSION,MRI>"&" { RTOKEN('&');}
225<BOTH,SCRIPT,EXPRESSION,MRI>"|" { RTOKEN('|');}
226<BOTH,SCRIPT,EXPRESSION,MRI>"~" { RTOKEN('~');}
227<BOTH,SCRIPT,EXPRESSION,MRI>"!" { RTOKEN('!');}
228<BOTH,SCRIPT,EXPRESSION,MRI>"?" { RTOKEN('?');}
229<BOTH,SCRIPT,EXPRESSION,MRI>"*" { RTOKEN('*');}
230<BOTH,SCRIPT,EXPRESSION,MRI>"+" { RTOKEN('+');}
231<BOTH,SCRIPT,EXPRESSION,MRI>"-" { RTOKEN('-');}
232<BOTH,SCRIPT,EXPRESSION,MRI>"/" { RTOKEN('/');}
233<BOTH,SCRIPT,EXPRESSION,MRI>"%" { RTOKEN('%');}
234<BOTH,SCRIPT,EXPRESSION,MRI>"<" { RTOKEN('<');}
3ec57632
NC
235<BOTH,SCRIPT,EXPRESSION,MRI>"=" { RTOKEN('=');}
236<BOTH,SCRIPT,EXPRESSION,MRI>"}" { RTOKEN('}') ; }
237<BOTH,SCRIPT,EXPRESSION,MRI>"{" { RTOKEN('{'); }
238<BOTH,SCRIPT,EXPRESSION,MRI>")" { RTOKEN(')');}
239<BOTH,SCRIPT,EXPRESSION,MRI>"(" { RTOKEN('(');}
252b5132
RH
240<BOTH,SCRIPT,EXPRESSION,MRI>":" { RTOKEN(':'); }
241<BOTH,SCRIPT,EXPRESSION,MRI>";" { RTOKEN(';');}
3ec57632 242<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
4a93e180 243<BOTH,SCRIPT>"REGION_ALIAS" { RTOKEN(REGION_ALIAS);}
01554a74 244<BOTH,SCRIPT>"LD_FEATURE" { RTOKEN(LD_FEATURE);}
3ec57632
NC
245<BOTH,SCRIPT,EXPRESSION>"ORIGIN" { RTOKEN(ORIGIN);}
246<BOTH,SCRIPT>"VERSION" { RTOKEN(VERSIONK);}
252b5132
RH
247<EXPRESSION,BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
248<EXPRESSION,BOTH,SCRIPT>"BIND" { RTOKEN(BIND);}
3ec57632
NC
249<BOTH,SCRIPT,EXPRESSION>"LENGTH" { RTOKEN(LENGTH);}
250<EXPRESSION,BOTH,SCRIPT>"ALIGN" { RTOKEN(ALIGN_K);}
2d20f7bf 251<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_ALIGN" { RTOKEN(DATA_SEGMENT_ALIGN);}
8c37241b 252<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_RELRO_END" { RTOKEN(DATA_SEGMENT_RELRO_END);}
2d20f7bf 253<EXPRESSION,BOTH,SCRIPT>"DATA_SEGMENT_END" { RTOKEN(DATA_SEGMENT_END);}
3ec57632
NC
254<EXPRESSION,BOTH,SCRIPT>"ADDR" { RTOKEN(ADDR);}
255<EXPRESSION,BOTH,SCRIPT>"LOADADDR" { RTOKEN(LOADADDR);}
362c1d1a 256<EXPRESSION,BOTH,SCRIPT>"ALIGNOF" { RTOKEN(ALIGNOF); }
252b5132
RH
257<EXPRESSION,BOTH>"MAX" { RTOKEN(MAX_K); }
258<EXPRESSION,BOTH>"MIN" { RTOKEN(MIN_K); }
8545d1a9 259<EXPRESSION,BOTH,SCRIPT>"ASSERT" { RTOKEN(ASSERT_K); }
252b5132
RH
260<BOTH,SCRIPT>"ENTRY" { RTOKEN(ENTRY);}
261<BOTH,SCRIPT,MRI>"EXTERN" { RTOKEN(EXTERN);}
3ec57632 262<EXPRESSION,BOTH,SCRIPT>"NEXT" { RTOKEN(NEXT);}
252b5132
RH
263<EXPRESSION,BOTH,SCRIPT>"sizeof_headers" { RTOKEN(SIZEOF_HEADERS);}
264<EXPRESSION,BOTH,SCRIPT>"SIZEOF_HEADERS" { RTOKEN(SIZEOF_HEADERS);}
ba916c8a 265<EXPRESSION,BOTH,SCRIPT>"SEGMENT_START" { RTOKEN(SEGMENT_START);}
252b5132 266<BOTH,SCRIPT>"MAP" { RTOKEN(MAP);}
3ec57632
NC
267<EXPRESSION,BOTH,SCRIPT>"SIZEOF" { RTOKEN(SIZEOF);}
268<BOTH,SCRIPT>"TARGET" { RTOKEN(TARGET_K);}
252b5132 269<BOTH,SCRIPT>"SEARCH_DIR" { RTOKEN(SEARCH_DIR);}
3ec57632 270<BOTH,SCRIPT>"OUTPUT" { RTOKEN(OUTPUT);}
252b5132
RH
271<BOTH,SCRIPT>"INPUT" { RTOKEN(INPUT);}
272<EXPRESSION,BOTH,SCRIPT>"GROUP" { RTOKEN(GROUP);}
b717d30e 273<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED" { RTOKEN(AS_NEEDED);}
3ec57632 274<EXPRESSION,BOTH,SCRIPT>"DEFINED" { RTOKEN(DEFINED);}
252b5132
RH
275<BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);}
276<BOTH,SCRIPT>"CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);}
3ec57632 277<BOTH,SCRIPT>"FORCE_COMMON_ALLOCATION" { RTOKEN(FORCE_COMMON_ALLOCATION);}
4818e05f 278<BOTH,SCRIPT>"INHIBIT_COMMON_ALLOCATION" { RTOKEN(INHIBIT_COMMON_ALLOCATION);}
3ec57632 279<BOTH,SCRIPT>"SECTIONS" { RTOKEN(SECTIONS);}
53d25da6
AM
280<BOTH,SCRIPT>"INSERT" { RTOKEN(INSERT_K);}
281<BOTH,SCRIPT>"AFTER" { RTOKEN(AFTER);}
282<BOTH,SCRIPT>"BEFORE" { RTOKEN(BEFORE);}
252b5132 283<BOTH,SCRIPT>"FILL" { RTOKEN(FILL);}
3ec57632 284<BOTH,SCRIPT>"STARTUP" { RTOKEN(STARTUP);}
252b5132
RH
285<BOTH,SCRIPT>"OUTPUT_FORMAT" { RTOKEN(OUTPUT_FORMAT);}
286<BOTH,SCRIPT>"OUTPUT_ARCH" { RTOKEN( OUTPUT_ARCH);}
287<BOTH,SCRIPT>"HLL" { RTOKEN(HLL);}
3ec57632 288<BOTH,SCRIPT>"SYSLIB" { RTOKEN(SYSLIB);}
252b5132
RH
289<BOTH,SCRIPT>"FLOAT" { RTOKEN(FLOAT);}
290<BOTH,SCRIPT>"QUAD" { RTOKEN( QUAD);}
291<BOTH,SCRIPT>"SQUAD" { RTOKEN( SQUAD);}
292<BOTH,SCRIPT>"LONG" { RTOKEN( LONG);}
293<BOTH,SCRIPT>"SHORT" { RTOKEN( SHORT);}
294<BOTH,SCRIPT>"BYTE" { RTOKEN( BYTE);}
3ec57632 295<BOTH,SCRIPT>"NOFLOAT" { RTOKEN(NOFLOAT);}
252b5132
RH
296<EXPRESSION,BOTH,SCRIPT>"NOCROSSREFS" { RTOKEN(NOCROSSREFS);}
297<BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY); }
bcaa7b3e
L
298<BOTH,SCRIPT>"SORT_BY_NAME" { RTOKEN(SORT_BY_NAME); }
299<BOTH,SCRIPT>"SORT_BY_ALIGNMENT" { RTOKEN(SORT_BY_ALIGNMENT); }
300<BOTH,SCRIPT>"SORT" { RTOKEN(SORT_BY_NAME); }
02ecc8e9 301<BOTH,SCRIPT>"SORT_BY_INIT_PRIORITY" { RTOKEN(SORT_BY_INIT_PRIORITY); }
252b5132
RH
302<EXPRESSION,BOTH,SCRIPT>"NOLOAD" { RTOKEN(NOLOAD);}
303<EXPRESSION,BOTH,SCRIPT>"DSECT" { RTOKEN(DSECT);}
304<EXPRESSION,BOTH,SCRIPT>"COPY" { RTOKEN(COPY);}
305<EXPRESSION,BOTH,SCRIPT>"INFO" { RTOKEN(INFO);}
306<EXPRESSION,BOTH,SCRIPT>"OVERLAY" { RTOKEN(OVERLAY);}
0841712e
JJ
307<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RO" { RTOKEN(ONLY_IF_RO); }
308<EXPRESSION,BOTH,SCRIPT>"ONLY_IF_RW" { RTOKEN(ONLY_IF_RW); }
0cf7d72c 309<EXPRESSION,BOTH,SCRIPT>"SPECIAL" { RTOKEN(SPECIAL); }
252b5132
RH
310<BOTH,SCRIPT>"o" { RTOKEN(ORIGIN);}
311<BOTH,SCRIPT>"org" { RTOKEN(ORIGIN);}
312<BOTH,SCRIPT>"l" { RTOKEN( LENGTH);}
313<BOTH,SCRIPT>"len" { RTOKEN( LENGTH);}
4006703d 314<EXPRESSION,BOTH,SCRIPT>"INCLUDE" { RTOKEN(INCLUDE);}
252b5132 315<BOTH,SCRIPT>"PHDRS" { RTOKEN (PHDRS); }
3ec57632
NC
316<EXPRESSION,BOTH,SCRIPT>"AT" { RTOKEN(AT);}
317<EXPRESSION,BOTH,SCRIPT>"SUBALIGN" { RTOKEN(SUBALIGN);}
318<EXPRESSION,BOTH,SCRIPT>"PROVIDE" { RTOKEN(PROVIDE); }
7af8e998 319<EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
252b5132 320<EXPRESSION,BOTH,SCRIPT>"KEEP" { RTOKEN(KEEP); }
3ec57632 321<EXPRESSION,BOTH,SCRIPT>"EXCLUDE_FILE" { RTOKEN(EXCLUDE_FILE); }
24718e3b 322<EXPRESSION,BOTH,SCRIPT>"CONSTANT" { RTOKEN(CONSTANT);}
252b5132
RH
323<MRI>"#".*\n? { ++ lineno; }
324<MRI>"\n" { ++ lineno; RTOKEN(NEWLINE); }
325<MRI>"*".* { /* Mri comment line */ }
326<MRI>";".* { /* Mri comment line */ }
327<MRI>"END" { RTOKEN(ENDWORD); }
3ec57632
NC
328<MRI>"ALIGNMOD" { RTOKEN(ALIGNMOD);}
329<MRI>"ALIGN" { RTOKEN(ALIGN_K);}
252b5132
RH
330<MRI>"CHIP" { RTOKEN(CHIP); }
331<MRI>"BASE" { RTOKEN(BASE); }
3ec57632
NC
332<MRI>"ALIAS" { RTOKEN(ALIAS); }
333<MRI>"TRUNCATE" { RTOKEN(TRUNCATE); }
252b5132
RH
334<MRI>"LOAD" { RTOKEN(LOAD); }
335<MRI>"PUBLIC" { RTOKEN(PUBLIC); }
336<MRI>"ORDER" { RTOKEN(ORDER); }
337<MRI>"NAME" { RTOKEN(NAMEWORD); }
338<MRI>"FORMAT" { RTOKEN(FORMAT); }
339<MRI>"CASE" { RTOKEN(CASE); }
340<MRI>"START" { RTOKEN(START); }
341<MRI>"LIST".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
342<MRI>"SECT" { RTOKEN(SECT); }
343<EXPRESSION,BOTH,SCRIPT,MRI>"ABSOLUTE" { RTOKEN(ABSOLUTE); }
344<MRI>"end" { RTOKEN(ENDWORD); }
3ec57632
NC
345<MRI>"alignmod" { RTOKEN(ALIGNMOD);}
346<MRI>"align" { RTOKEN(ALIGN_K);}
252b5132
RH
347<MRI>"chip" { RTOKEN(CHIP); }
348<MRI>"base" { RTOKEN(BASE); }
3ec57632
NC
349<MRI>"alias" { RTOKEN(ALIAS); }
350<MRI>"truncate" { RTOKEN(TRUNCATE); }
252b5132
RH
351<MRI>"load" { RTOKEN(LOAD); }
352<MRI>"public" { RTOKEN(PUBLIC); }
353<MRI>"order" { RTOKEN(ORDER); }
354<MRI>"name" { RTOKEN(NAMEWORD); }
355<MRI>"format" { RTOKEN(FORMAT); }
356<MRI>"case" { RTOKEN(CASE); }
357<MRI>"extern" { RTOKEN(EXTERN); }
358<MRI>"start" { RTOKEN(START); }
359<MRI>"list".* { RTOKEN(LIST); /* LIST and ignore to end of line */ }
360<MRI>"sect" { RTOKEN(SECT); }
361<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
362
363<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
364/* Filename without commas, needed to parse mri stuff */
1579bae1 365 yylval.name = xstrdup (yytext);
252b5132
RH
366 return NAME;
367 }
368
369
8545d1a9 370<BOTH>{FILENAMECHAR1}{FILENAMECHAR}* {
1579bae1 371 yylval.name = xstrdup (yytext);
252b5132
RH
372 return NAME;
373 }
8545d1a9
NS
374<BOTH>"-l"{FILENAMECHAR}+ {
375 yylval.name = xstrdup (yytext + 2);
376 return LNAME;
377 }
378<EXPRESSION>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
379 yylval.name = xstrdup (yytext);
380 return NAME;
381 }
382<EXPRESSION>"-l"{NOCFILENAMECHAR}+ {
d1b2b2dc 383 yylval.name = xstrdup (yytext + 2);
252b5132
RH
384 return LNAME;
385 }
386<SCRIPT>{WILDCHAR}* {
387 /* Annoyingly, this pattern can match comments, and we have
388 longest match issues to consider. So if the first two
389 characters are a comment opening, put the input back and
390 try again. */
391 if (yytext[0] == '/' && yytext[1] == '*')
392 {
1579bae1 393 yyless (2);
252b5132
RH
394 comment ();
395 }
396 else
397 {
1579bae1 398 yylval.name = xstrdup (yytext);
252b5132
RH
399 return NAME;
400 }
401 }
402
403<EXPRESSION,BOTH,SCRIPT,VERS_NODE>"\""[^\"]*"\"" {
404 /* No matter the state, quotes
405 give what's inside */
1579bae1
AM
406 yylval.name = xstrdup (yytext + 1);
407 yylval.name[yyleng - 2] = 0;
252b5132
RH
408 return NAME;
409 }
410<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
411<MRI,BOTH,SCRIPT,EXPRESSION>[ \t\r]+ { }
412
413<VERS_NODE,VERS_SCRIPT>[:,;] { return *yytext; }
414
415<VERS_NODE>global { RTOKEN(GLOBAL); }
416
417<VERS_NODE>local { RTOKEN(LOCAL); }
418
419<VERS_NODE>extern { RTOKEN(EXTERN); }
420
d1b2b2dc 421<VERS_NODE>{V_IDENTIFIER} { yylval.name = xstrdup (yytext);
252b5132
RH
422 return VERS_IDENTIFIER; }
423
d1b2b2dc 424<VERS_SCRIPT>{V_TAG} { yylval.name = xstrdup (yytext);
252b5132
RH
425 return VERS_TAG; }
426
427<VERS_START>"{" { BEGIN(VERS_SCRIPT); return *yytext; }
428
1579bae1 429<VERS_SCRIPT>"{" { BEGIN(VERS_NODE);
252b5132
RH
430 vers_node_nesting = 0;
431 return *yytext;
432 }
433<VERS_SCRIPT>"}" { return *yytext; }
434<VERS_NODE>"{" { vers_node_nesting++; return *yytext; }
435<VERS_NODE>"}" { if (--vers_node_nesting < 0)
436 BEGIN(VERS_SCRIPT);
437 return *yytext;
438 }
439
440<VERS_START,VERS_NODE,VERS_SCRIPT>[\n] { lineno++; }
441
442<VERS_START,VERS_NODE,VERS_SCRIPT>#.* { /* Eat up comments */ }
443
444<VERS_START,VERS_NODE,VERS_SCRIPT>[ \t\r]+ { /* Eat up whitespace */ }
445
446<<EOF>> {
447 include_stack_ptr--;
1579bae1
AM
448
449 if (include_stack_ptr == 0)
252b5132 450 {
1579bae1 451 yyterminate ();
252b5132 452 }
1579bae1 453 else
252b5132 454 {
1579bae1 455 yy_switch_to_buffer (include_stack[include_stack_ptr]);
252b5132 456 }
b47c4208 457
252b5132 458 ldfile_input_filename = file_name_stack[include_stack_ptr - 1];
b47c4208 459 lineno = lineno_stack[include_stack_ptr];
252b5132
RH
460
461 return END;
462}
463
1579bae1
AM
464<SCRIPT,MRI,VERS_START,VERS_SCRIPT,VERS_NODE>. lex_warn_invalid (" in script", yytext);
465<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid (" in expression", yytext);
466
252b5132
RH
467%%
468\f
469
470/* Switch flex to reading script file NAME, open on FILE,
471 saving the current input info on the include stack. */
472
473void
1579bae1 474lex_push_file (FILE *file, const char *name)
252b5132 475{
1579bae1 476 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132 477 {
1579bae1 478 einfo ("%F:includes nested too deeply\n");
252b5132
RH
479 }
480 file_name_stack[include_stack_ptr] = name;
b47c4208 481 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
482 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
483
484 include_stack_ptr++;
b47c4208 485 lineno = 1;
252b5132 486 yyin = file;
1579bae1 487 yy_switch_to_buffer (yy_create_buffer (yyin, YY_BUF_SIZE));
252b5132
RH
488}
489
490/* Return a newly created flex input buffer containing STRING,
491 which is SIZE bytes long. */
492
1579bae1
AM
493static YY_BUFFER_STATE
494yy_create_string_buffer (const char *string, size_t size)
252b5132
RH
495{
496 YY_BUFFER_STATE b;
497
498 /* Calls to m-alloc get turned by sed into xm-alloc. */
1579bae1 499 b = malloc (sizeof (struct yy_buffer_state));
252b5132
RH
500 b->yy_input_file = 0;
501 b->yy_buf_size = size;
502
503 /* yy_ch_buf has to be 2 characters longer than the size given because
504 we need to put in 2 end-of-buffer characters. */
1579bae1 505 b->yy_ch_buf = malloc ((unsigned) (b->yy_buf_size + 3));
252b5132
RH
506
507 b->yy_ch_buf[0] = '\n';
508 strcpy (b->yy_ch_buf+1, string);
509 b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
510 b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
511 b->yy_n_chars = size+1;
512 b->yy_buf_pos = &b->yy_ch_buf[1];
513
dca7760f
AM
514 b->yy_is_our_buffer = 1;
515 b->yy_is_interactive = 0;
516 b->yy_at_bol = 1;
517 b->yy_fill_buffer = 0;
518
252b5132
RH
519 /* flex 2.4.7 changed the interface. FIXME: We should not be using
520 a flex internal interface in the first place! */
521#ifdef YY_BUFFER_NEW
522 b->yy_buffer_status = YY_BUFFER_NEW;
523#else
524 b->yy_eof_status = EOF_NOT_SEEN;
525#endif
526
527 return b;
528}
529
530/* Switch flex to reading from STRING, saving the current input info
531 on the include stack. */
532
533void
1579bae1 534lex_redirect (const char *string)
252b5132
RH
535{
536 YY_BUFFER_STATE tmp;
537
538 yy_init = 0;
1579bae1 539 if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
252b5132
RH
540 {
541 einfo("%F: macros nested too deeply\n");
542 }
543 file_name_stack[include_stack_ptr] = "redirect";
b47c4208 544 lineno_stack[include_stack_ptr] = lineno;
252b5132
RH
545 include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
546 include_stack_ptr++;
b47c4208 547 lineno = 1;
252b5132
RH
548 tmp = yy_create_string_buffer (string, strlen (string));
549 yy_switch_to_buffer (tmp);
252b5132
RH
550}
551\f
552/* Functions to switch to a different flex start condition,
553 saving the current start condition on `state_stack'. */
554
555static int state_stack[MAX_INCLUDE_DEPTH * 2];
556static int *state_stack_p = state_stack;
557
558void
1579bae1 559ldlex_script (void)
252b5132
RH
560{
561 *(state_stack_p)++ = yy_start;
562 BEGIN (SCRIPT);
563}
564
565void
1579bae1 566ldlex_mri_script (void)
252b5132
RH
567{
568 *(state_stack_p)++ = yy_start;
569 BEGIN (MRI);
570}
571
572void
1579bae1 573ldlex_version_script (void)
252b5132
RH
574{
575 *(state_stack_p)++ = yy_start;
576 BEGIN (VERS_START);
577}
578
579void
1579bae1 580ldlex_version_file (void)
252b5132
RH
581{
582 *(state_stack_p)++ = yy_start;
583 BEGIN (VERS_SCRIPT);
584}
585
586void
1579bae1 587ldlex_defsym (void)
252b5132
RH
588{
589 *(state_stack_p)++ = yy_start;
590 BEGIN (DEFSYMEXP);
591}
1579bae1 592
252b5132 593void
1579bae1 594ldlex_expression (void)
252b5132
RH
595{
596 *(state_stack_p)++ = yy_start;
597 BEGIN (EXPRESSION);
598}
599
600void
1579bae1 601ldlex_both (void)
252b5132
RH
602{
603 *(state_stack_p)++ = yy_start;
604 BEGIN (BOTH);
605}
606
607void
1579bae1 608ldlex_popstate (void)
252b5132
RH
609{
610 yy_start = *(--state_stack_p);
611}
612\f
613
d05c651b 614/* Place up to MAX_SIZE characters in BUF and return
252b5132
RH
615 either the number of characters read, or 0 to indicate EOF. */
616
d05c651b
AS
617static int
618yy_input (char *buf, int max_size)
252b5132 619{
d05c651b 620 int result = 0;
731e28d8 621 if (YY_CURRENT_BUFFER->yy_input_file)
252b5132
RH
622 {
623 if (yyin)
624 {
d05c651b
AS
625 result = fread (buf, 1, max_size, yyin);
626 if (result < max_size && ferror (yyin))
252b5132
RH
627 einfo ("%F%P: read in flex scanner failed\n");
628 }
629 }
d05c651b 630 return result;
252b5132
RH
631}
632
633/* Eat the rest of a C-style comment. */
634
635static void
1579bae1 636comment (void)
252b5132
RH
637{
638 int c;
639
640 while (1)
641 {
642 c = input();
1579bae1 643 while (c != '*' && c != EOF)
252b5132
RH
644 {
645 if (c == '\n')
646 lineno++;
647 c = input();
648 }
649
650 if (c == '*')
651 {
652 c = input();
653 while (c == '*')
654 c = input();
655 if (c == '/')
656 break; /* found the end */
657 }
658
659 if (c == '\n')
660 lineno++;
661
662 if (c == EOF)
663 {
664 einfo( "%F%P: EOF in comment\n");
665 break;
666 }
667 }
668}
669
670/* Warn the user about a garbage character WHAT in the input
671 in context WHERE. */
672
673static void
1579bae1 674lex_warn_invalid (char *where, char *what)
252b5132
RH
675{
676 char buf[5];
677
678 /* If we have found an input file whose format we do not recognize,
679 and we are therefore treating it as a linker script, and we find
680 an invalid character, then most likely this is a real object file
681 of some different format. Treat it as such. */
682 if (ldfile_assumed_script)
683 {
684 bfd_set_error (bfd_error_file_not_recognized);
685 einfo ("%F%s: file not recognized: %E\n", ldfile_input_filename);
686 }
687
3882b010 688 if (! ISPRINT (*what))
252b5132
RH
689 {
690 sprintf (buf, "\\%03o", (unsigned int) *what);
691 what = buf;
692 }
693
694 einfo ("%P:%S: ignoring invalid character `%s'%s\n", what, where);
695}
This page took 0.500435 seconds and 4 git commands to generate.