xref: /aosp_15_r20/external/dtc/dtc-lexer.l (revision cd60bc56d4bea3af4ec04523e4d71c2b272c8aff)
1*cd60bc56SAndroid Build Coastguard Worker /* SPDX-License-Identifier: GPL-2.0-or-later */
2*cd60bc56SAndroid Build Coastguard Worker /*
3*cd60bc56SAndroid Build Coastguard Worker  * (C) Copyright David Gibson <[email protected]>, IBM Corporation.  2005.
4*cd60bc56SAndroid Build Coastguard Worker  */
5*cd60bc56SAndroid Build Coastguard Worker 
6*cd60bc56SAndroid Build Coastguard Worker %option noyywrap nounput noinput never-interactive
7*cd60bc56SAndroid Build Coastguard Worker 
8*cd60bc56SAndroid Build Coastguard Worker %x BYTESTRING
9*cd60bc56SAndroid Build Coastguard Worker %x PROPNODENAME
10*cd60bc56SAndroid Build Coastguard Worker %s V1
11*cd60bc56SAndroid Build Coastguard Worker 
12*cd60bc56SAndroid Build Coastguard Worker PROPNODECHAR	[a-zA-Z0-9,._+*#?@-]
13*cd60bc56SAndroid Build Coastguard Worker PATHCHAR	({PROPNODECHAR}|[/])
14*cd60bc56SAndroid Build Coastguard Worker LABEL		[a-zA-Z_][a-zA-Z0-9_]*
15*cd60bc56SAndroid Build Coastguard Worker STRING		\"([^\\"]|\\.)*\"
16*cd60bc56SAndroid Build Coastguard Worker CHAR_LITERAL	'([^']|\\')*'
17*cd60bc56SAndroid Build Coastguard Worker WS		[[:space:]]
18*cd60bc56SAndroid Build Coastguard Worker COMMENT		"/*"([^*]|\*+[^*/])*\*+"/"
19*cd60bc56SAndroid Build Coastguard Worker LINECOMMENT	"//".*\n
20*cd60bc56SAndroid Build Coastguard Worker 
21*cd60bc56SAndroid Build Coastguard Worker %{
22*cd60bc56SAndroid Build Coastguard Worker #include "dtc.h"
23*cd60bc56SAndroid Build Coastguard Worker #include "srcpos.h"
24*cd60bc56SAndroid Build Coastguard Worker #include "dtc-parser.h"
25*cd60bc56SAndroid Build Coastguard Worker 
26*cd60bc56SAndroid Build Coastguard Worker extern bool treesource_error;
27*cd60bc56SAndroid Build Coastguard Worker 
28*cd60bc56SAndroid Build Coastguard Worker /* CAUTION: this will stop working if we ever use yyless() or yyunput() */
29*cd60bc56SAndroid Build Coastguard Worker #define	YY_USER_ACTION \
30*cd60bc56SAndroid Build Coastguard Worker 	{ \
31*cd60bc56SAndroid Build Coastguard Worker 		srcpos_update(&yylloc, yytext, yyleng); \
32*cd60bc56SAndroid Build Coastguard Worker 	}
33*cd60bc56SAndroid Build Coastguard Worker 
34*cd60bc56SAndroid Build Coastguard Worker /*#define LEXDEBUG	1*/
35*cd60bc56SAndroid Build Coastguard Worker 
36*cd60bc56SAndroid Build Coastguard Worker #ifdef LEXDEBUG
37*cd60bc56SAndroid Build Coastguard Worker #define DPRINT(fmt, ...)	fprintf(stderr, fmt, ##__VA_ARGS__)
38*cd60bc56SAndroid Build Coastguard Worker #else
39*cd60bc56SAndroid Build Coastguard Worker #define DPRINT(fmt, ...)	do { } while (0)
40*cd60bc56SAndroid Build Coastguard Worker #endif
41*cd60bc56SAndroid Build Coastguard Worker 
42*cd60bc56SAndroid Build Coastguard Worker static int dts_version = 1;
43*cd60bc56SAndroid Build Coastguard Worker 
44*cd60bc56SAndroid Build Coastguard Worker #define BEGIN_DEFAULT()		DPRINT("<V1>\n"); \
45*cd60bc56SAndroid Build Coastguard Worker 				BEGIN(V1); \
46*cd60bc56SAndroid Build Coastguard Worker 
47*cd60bc56SAndroid Build Coastguard Worker static void push_input_file(const char *filename);
48*cd60bc56SAndroid Build Coastguard Worker static bool pop_input_file(void);
49*cd60bc56SAndroid Build Coastguard Worker static void PRINTF(1, 2) lexical_error(const char *fmt, ...);
50*cd60bc56SAndroid Build Coastguard Worker 
51*cd60bc56SAndroid Build Coastguard Worker %}
52*cd60bc56SAndroid Build Coastguard Worker 
53*cd60bc56SAndroid Build Coastguard Worker %%
54*cd60bc56SAndroid Build Coastguard Worker <*>"/include/"{WS}*{STRING} {
55*cd60bc56SAndroid Build Coastguard Worker 			char *name = strchr(yytext, '\"') + 1;
56*cd60bc56SAndroid Build Coastguard Worker 			yytext[yyleng-1] = '\0';
57*cd60bc56SAndroid Build Coastguard Worker 			push_input_file(name);
58*cd60bc56SAndroid Build Coastguard Worker 		}
59*cd60bc56SAndroid Build Coastguard Worker 
60*cd60bc56SAndroid Build Coastguard Worker <*>^"#"(line)?[ \t]+[0-9]+[ \t]+{STRING}([ \t]+[0-9]+)* {
61*cd60bc56SAndroid Build Coastguard Worker 			char *line, *fnstart, *fnend;
62*cd60bc56SAndroid Build Coastguard Worker 			struct data fn;
63*cd60bc56SAndroid Build Coastguard Worker 			/* skip text before line # */
64*cd60bc56SAndroid Build Coastguard Worker 			line = yytext;
65*cd60bc56SAndroid Build Coastguard Worker 			while (!isdigit((unsigned char)*line))
66*cd60bc56SAndroid Build Coastguard Worker 				line++;
67*cd60bc56SAndroid Build Coastguard Worker 
68*cd60bc56SAndroid Build Coastguard Worker 			/* regexp ensures that first and list "
69*cd60bc56SAndroid Build Coastguard Worker 			 * in the whole yytext are those at
70*cd60bc56SAndroid Build Coastguard Worker 			 * beginning and end of the filename string */
71*cd60bc56SAndroid Build Coastguard Worker 			fnstart = memchr(yytext, '"', yyleng);
72*cd60bc56SAndroid Build Coastguard Worker 			for (fnend = yytext + yyleng - 1;
73*cd60bc56SAndroid Build Coastguard Worker 			     *fnend != '"'; fnend--)
74*cd60bc56SAndroid Build Coastguard Worker 				;
75*cd60bc56SAndroid Build Coastguard Worker 			assert(fnstart && fnend && (fnend > fnstart));
76*cd60bc56SAndroid Build Coastguard Worker 
77*cd60bc56SAndroid Build Coastguard Worker 			fn = data_copy_escape_string(fnstart + 1,
78*cd60bc56SAndroid Build Coastguard Worker 						     fnend - fnstart - 1);
79*cd60bc56SAndroid Build Coastguard Worker 
80*cd60bc56SAndroid Build Coastguard Worker 			/* Don't allow nuls in filenames */
81*cd60bc56SAndroid Build Coastguard Worker 			if (memchr(fn.val, '\0', fn.len - 1))
82*cd60bc56SAndroid Build Coastguard Worker 				lexical_error("nul in line number directive");
83*cd60bc56SAndroid Build Coastguard Worker 
84*cd60bc56SAndroid Build Coastguard Worker 			/* -1 since #line is the number of the next line */
85*cd60bc56SAndroid Build Coastguard Worker 			srcpos_set_line(xstrdup(fn.val), atoi(line) - 1);
86*cd60bc56SAndroid Build Coastguard Worker 			data_free(fn);
87*cd60bc56SAndroid Build Coastguard Worker 		}
88*cd60bc56SAndroid Build Coastguard Worker 
89*cd60bc56SAndroid Build Coastguard Worker <*><<EOF>>		{
90*cd60bc56SAndroid Build Coastguard Worker 			if (!pop_input_file()) {
91*cd60bc56SAndroid Build Coastguard Worker 				yyterminate();
92*cd60bc56SAndroid Build Coastguard Worker 			}
93*cd60bc56SAndroid Build Coastguard Worker 		}
94*cd60bc56SAndroid Build Coastguard Worker 
95*cd60bc56SAndroid Build Coastguard Worker <*>{STRING}	{
96*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("String: %s\n", yytext);
97*cd60bc56SAndroid Build Coastguard Worker 			yylval.data = data_copy_escape_string(yytext+1,
98*cd60bc56SAndroid Build Coastguard Worker 					yyleng-2);
99*cd60bc56SAndroid Build Coastguard Worker 			return DT_STRING;
100*cd60bc56SAndroid Build Coastguard Worker 		}
101*cd60bc56SAndroid Build Coastguard Worker 
102*cd60bc56SAndroid Build Coastguard Worker <*>"/dts-v1/"	{
103*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /dts-v1/\n");
104*cd60bc56SAndroid Build Coastguard Worker 			dts_version = 1;
105*cd60bc56SAndroid Build Coastguard Worker 			BEGIN_DEFAULT();
106*cd60bc56SAndroid Build Coastguard Worker 			return DT_V1;
107*cd60bc56SAndroid Build Coastguard Worker 		}
108*cd60bc56SAndroid Build Coastguard Worker 
109*cd60bc56SAndroid Build Coastguard Worker <*>"/plugin/"	{
110*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /plugin/\n");
111*cd60bc56SAndroid Build Coastguard Worker 			return DT_PLUGIN;
112*cd60bc56SAndroid Build Coastguard Worker 		}
113*cd60bc56SAndroid Build Coastguard Worker 
114*cd60bc56SAndroid Build Coastguard Worker <*>"/memreserve/"	{
115*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /memreserve/\n");
116*cd60bc56SAndroid Build Coastguard Worker 			BEGIN_DEFAULT();
117*cd60bc56SAndroid Build Coastguard Worker 			return DT_MEMRESERVE;
118*cd60bc56SAndroid Build Coastguard Worker 		}
119*cd60bc56SAndroid Build Coastguard Worker 
120*cd60bc56SAndroid Build Coastguard Worker <*>"/bits/"	{
121*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /bits/\n");
122*cd60bc56SAndroid Build Coastguard Worker 			BEGIN_DEFAULT();
123*cd60bc56SAndroid Build Coastguard Worker 			return DT_BITS;
124*cd60bc56SAndroid Build Coastguard Worker 		}
125*cd60bc56SAndroid Build Coastguard Worker 
126*cd60bc56SAndroid Build Coastguard Worker <*>"/delete-property/"	{
127*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /delete-property/\n");
128*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("<PROPNODENAME>\n");
129*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(PROPNODENAME);
130*cd60bc56SAndroid Build Coastguard Worker 			return DT_DEL_PROP;
131*cd60bc56SAndroid Build Coastguard Worker 		}
132*cd60bc56SAndroid Build Coastguard Worker 
133*cd60bc56SAndroid Build Coastguard Worker <*>"/delete-node/"	{
134*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /delete-node/\n");
135*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("<PROPNODENAME>\n");
136*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(PROPNODENAME);
137*cd60bc56SAndroid Build Coastguard Worker 			return DT_DEL_NODE;
138*cd60bc56SAndroid Build Coastguard Worker 		}
139*cd60bc56SAndroid Build Coastguard Worker 
140*cd60bc56SAndroid Build Coastguard Worker <*>"/omit-if-no-ref/"	{
141*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Keyword: /omit-if-no-ref/\n");
142*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("<PROPNODENAME>\n");
143*cd60bc56SAndroid Build Coastguard Worker 			BEGIN(PROPNODENAME);
144*cd60bc56SAndroid Build Coastguard Worker 			return DT_OMIT_NO_REF;
145*cd60bc56SAndroid Build Coastguard Worker 		}
146*cd60bc56SAndroid Build Coastguard Worker 
147*cd60bc56SAndroid Build Coastguard Worker <*>{LABEL}:	{
148*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Label: %s\n", yytext);
149*cd60bc56SAndroid Build Coastguard Worker 			yylval.labelref = xstrdup(yytext);
150*cd60bc56SAndroid Build Coastguard Worker 			yylval.labelref[yyleng-1] = '\0';
151*cd60bc56SAndroid Build Coastguard Worker 			return DT_LABEL;
152*cd60bc56SAndroid Build Coastguard Worker 		}
153*cd60bc56SAndroid Build Coastguard Worker 
154*cd60bc56SAndroid Build Coastguard Worker <V1>([0-9]+|0[xX][0-9a-fA-F]+)(U|L|UL|LL|ULL)? {
155*cd60bc56SAndroid Build Coastguard Worker 			char *e;
156*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Integer Literal: '%s'\n", yytext);
157*cd60bc56SAndroid Build Coastguard Worker 
158*cd60bc56SAndroid Build Coastguard Worker 			errno = 0;
159*cd60bc56SAndroid Build Coastguard Worker 			yylval.integer = strtoull(yytext, &e, 0);
160*cd60bc56SAndroid Build Coastguard Worker 
161*cd60bc56SAndroid Build Coastguard Worker 			if (*e && e[strspn(e, "UL")]) {
162*cd60bc56SAndroid Build Coastguard Worker 				lexical_error("Bad integer literal '%s'",
163*cd60bc56SAndroid Build Coastguard Worker 					      yytext);
164*cd60bc56SAndroid Build Coastguard Worker 			}
165*cd60bc56SAndroid Build Coastguard Worker 
166*cd60bc56SAndroid Build Coastguard Worker 			if (errno == ERANGE)
167*cd60bc56SAndroid Build Coastguard Worker 				lexical_error("Integer literal '%s' out of range",
168*cd60bc56SAndroid Build Coastguard Worker 					      yytext);
169*cd60bc56SAndroid Build Coastguard Worker 			else
170*cd60bc56SAndroid Build Coastguard Worker 				/* ERANGE is the only strtoull error triggerable
171*cd60bc56SAndroid Build Coastguard Worker 				 *  by strings matching the pattern */
172*cd60bc56SAndroid Build Coastguard Worker 				assert(errno == 0);
173*cd60bc56SAndroid Build Coastguard Worker 			return DT_LITERAL;
174*cd60bc56SAndroid Build Coastguard Worker 		}
175*cd60bc56SAndroid Build Coastguard Worker 
176*cd60bc56SAndroid Build Coastguard Worker <*>{CHAR_LITERAL}	{
177*cd60bc56SAndroid Build Coastguard Worker 			struct data d;
178*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Character literal: %s\n", yytext);
179*cd60bc56SAndroid Build Coastguard Worker 
180*cd60bc56SAndroid Build Coastguard Worker 			d = data_copy_escape_string(yytext+1, yyleng-2);
181*cd60bc56SAndroid Build Coastguard Worker 			if (d.len == 1) {
182*cd60bc56SAndroid Build Coastguard Worker 				lexical_error("Empty character literal");
183*cd60bc56SAndroid Build Coastguard Worker 				yylval.integer = 0;
184*cd60bc56SAndroid Build Coastguard Worker 			} else {
185*cd60bc56SAndroid Build Coastguard Worker 				yylval.integer = (unsigned char)d.val[0];
186*cd60bc56SAndroid Build Coastguard Worker 
187*cd60bc56SAndroid Build Coastguard Worker 				if (d.len > 2)
188*cd60bc56SAndroid Build Coastguard Worker 					lexical_error("Character literal has %d"
189*cd60bc56SAndroid Build Coastguard Worker 						      " characters instead of 1",
190*cd60bc56SAndroid Build Coastguard Worker 						      d.len - 1);
191*cd60bc56SAndroid Build Coastguard Worker 			}
192*cd60bc56SAndroid Build Coastguard Worker 
193*cd60bc56SAndroid Build Coastguard Worker 			data_free(d);
194*cd60bc56SAndroid Build Coastguard Worker 			return DT_CHAR_LITERAL;
195*cd60bc56SAndroid Build Coastguard Worker 		}
196*cd60bc56SAndroid Build Coastguard Worker 
197*cd60bc56SAndroid Build Coastguard Worker <*>\&{LABEL}	{	/* label reference */
198*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Ref: %s\n", yytext+1);
199*cd60bc56SAndroid Build Coastguard Worker 			yylval.labelref = xstrdup(yytext+1);
200*cd60bc56SAndroid Build Coastguard Worker 			return DT_LABEL_REF;
201*cd60bc56SAndroid Build Coastguard Worker 		}
202*cd60bc56SAndroid Build Coastguard Worker 
203*cd60bc56SAndroid Build Coastguard Worker <*>"&{"{PATHCHAR}*\}	{	/* new-style path reference */
204*cd60bc56SAndroid Build Coastguard Worker 			yytext[yyleng-1] = '\0';
205*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Ref: %s\n", yytext+2);
206*cd60bc56SAndroid Build Coastguard Worker 			yylval.labelref = xstrdup(yytext+2);
207*cd60bc56SAndroid Build Coastguard Worker 			return DT_PATH_REF;
208*cd60bc56SAndroid Build Coastguard Worker 		}
209*cd60bc56SAndroid Build Coastguard Worker 
210*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>[0-9a-fA-F]{2} {
211*cd60bc56SAndroid Build Coastguard Worker 			yylval.byte = strtol(yytext, NULL, 16);
212*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Byte: %02x\n", (int)yylval.byte);
213*cd60bc56SAndroid Build Coastguard Worker 			return DT_BYTE;
214*cd60bc56SAndroid Build Coastguard Worker 		}
215*cd60bc56SAndroid Build Coastguard Worker 
216*cd60bc56SAndroid Build Coastguard Worker <BYTESTRING>"]"	{
217*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("/BYTESTRING\n");
218*cd60bc56SAndroid Build Coastguard Worker 			BEGIN_DEFAULT();
219*cd60bc56SAndroid Build Coastguard Worker 			return ']';
220*cd60bc56SAndroid Build Coastguard Worker 		}
221*cd60bc56SAndroid Build Coastguard Worker 
222*cd60bc56SAndroid Build Coastguard Worker <PROPNODENAME>\\?{PROPNODECHAR}+ {
223*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("PropNodeName: %s\n", yytext);
224*cd60bc56SAndroid Build Coastguard Worker 			yylval.propnodename = xstrdup((yytext[0] == '\\') ?
225*cd60bc56SAndroid Build Coastguard Worker 							yytext + 1 : yytext);
226*cd60bc56SAndroid Build Coastguard Worker 			BEGIN_DEFAULT();
227*cd60bc56SAndroid Build Coastguard Worker 			return DT_PROPNODENAME;
228*cd60bc56SAndroid Build Coastguard Worker 		}
229*cd60bc56SAndroid Build Coastguard Worker 
230*cd60bc56SAndroid Build Coastguard Worker "/incbin/"	{
231*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Binary Include\n");
232*cd60bc56SAndroid Build Coastguard Worker 			return DT_INCBIN;
233*cd60bc56SAndroid Build Coastguard Worker 		}
234*cd60bc56SAndroid Build Coastguard Worker 
235*cd60bc56SAndroid Build Coastguard Worker <*>{WS}+	/* eat whitespace */
236*cd60bc56SAndroid Build Coastguard Worker <*>{COMMENT}+	/* eat C-style comments */
237*cd60bc56SAndroid Build Coastguard Worker <*>{LINECOMMENT}+ /* eat C++-style comments */
238*cd60bc56SAndroid Build Coastguard Worker 
239*cd60bc56SAndroid Build Coastguard Worker <*>"<<"		{ return DT_LSHIFT; };
240*cd60bc56SAndroid Build Coastguard Worker <*>">>"		{ return DT_RSHIFT; };
241*cd60bc56SAndroid Build Coastguard Worker <*>"<="		{ return DT_LE; };
242*cd60bc56SAndroid Build Coastguard Worker <*>">="		{ return DT_GE; };
243*cd60bc56SAndroid Build Coastguard Worker <*>"=="		{ return DT_EQ; };
244*cd60bc56SAndroid Build Coastguard Worker <*>"!="		{ return DT_NE; };
245*cd60bc56SAndroid Build Coastguard Worker <*>"&&"		{ return DT_AND; };
246*cd60bc56SAndroid Build Coastguard Worker <*>"||"		{ return DT_OR; };
247*cd60bc56SAndroid Build Coastguard Worker 
248*cd60bc56SAndroid Build Coastguard Worker <*>.		{
249*cd60bc56SAndroid Build Coastguard Worker 			DPRINT("Char: %c (\\x%02x)\n", yytext[0],
250*cd60bc56SAndroid Build Coastguard Worker 				(unsigned)yytext[0]);
251*cd60bc56SAndroid Build Coastguard Worker 			if (yytext[0] == '[') {
252*cd60bc56SAndroid Build Coastguard Worker 				DPRINT("<BYTESTRING>\n");
253*cd60bc56SAndroid Build Coastguard Worker 				BEGIN(BYTESTRING);
254*cd60bc56SAndroid Build Coastguard Worker 			}
255*cd60bc56SAndroid Build Coastguard Worker 			if ((yytext[0] == '{')
256*cd60bc56SAndroid Build Coastguard Worker 			    || (yytext[0] == ';')) {
257*cd60bc56SAndroid Build Coastguard Worker 				DPRINT("<PROPNODENAME>\n");
258*cd60bc56SAndroid Build Coastguard Worker 				BEGIN(PROPNODENAME);
259*cd60bc56SAndroid Build Coastguard Worker 			}
260*cd60bc56SAndroid Build Coastguard Worker 			return yytext[0];
261*cd60bc56SAndroid Build Coastguard Worker 		}
262*cd60bc56SAndroid Build Coastguard Worker 
263*cd60bc56SAndroid Build Coastguard Worker %%
264*cd60bc56SAndroid Build Coastguard Worker 
265*cd60bc56SAndroid Build Coastguard Worker static void push_input_file(const char *filename)
266*cd60bc56SAndroid Build Coastguard Worker {
267*cd60bc56SAndroid Build Coastguard Worker 	assert(filename);
268*cd60bc56SAndroid Build Coastguard Worker 
269*cd60bc56SAndroid Build Coastguard Worker 	srcfile_push(filename);
270*cd60bc56SAndroid Build Coastguard Worker 
271*cd60bc56SAndroid Build Coastguard Worker 	yyin = current_srcfile->f;
272*cd60bc56SAndroid Build Coastguard Worker 
273*cd60bc56SAndroid Build Coastguard Worker 	yypush_buffer_state(yy_create_buffer(yyin, YY_BUF_SIZE));
274*cd60bc56SAndroid Build Coastguard Worker }
275*cd60bc56SAndroid Build Coastguard Worker 
276*cd60bc56SAndroid Build Coastguard Worker 
277*cd60bc56SAndroid Build Coastguard Worker static bool pop_input_file(void)
278*cd60bc56SAndroid Build Coastguard Worker {
279*cd60bc56SAndroid Build Coastguard Worker 	if (srcfile_pop() == 0)
280*cd60bc56SAndroid Build Coastguard Worker 		return false;
281*cd60bc56SAndroid Build Coastguard Worker 
282*cd60bc56SAndroid Build Coastguard Worker 	yypop_buffer_state();
283*cd60bc56SAndroid Build Coastguard Worker 	yyin = current_srcfile->f;
284*cd60bc56SAndroid Build Coastguard Worker 
285*cd60bc56SAndroid Build Coastguard Worker 	return true;
286*cd60bc56SAndroid Build Coastguard Worker }
287*cd60bc56SAndroid Build Coastguard Worker 
288*cd60bc56SAndroid Build Coastguard Worker static void lexical_error(const char *fmt, ...)
289*cd60bc56SAndroid Build Coastguard Worker {
290*cd60bc56SAndroid Build Coastguard Worker 	va_list ap;
291*cd60bc56SAndroid Build Coastguard Worker 
292*cd60bc56SAndroid Build Coastguard Worker 	va_start(ap, fmt);
293*cd60bc56SAndroid Build Coastguard Worker 	srcpos_verror(&yylloc, "Lexical error", fmt, ap);
294*cd60bc56SAndroid Build Coastguard Worker 	va_end(ap);
295*cd60bc56SAndroid Build Coastguard Worker 
296*cd60bc56SAndroid Build Coastguard Worker 	treesource_error = true;
297*cd60bc56SAndroid Build Coastguard Worker }
298