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