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