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