1441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%{
2cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2008 Red Hat, Inc.
3cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   This file is part of Red Hat elfutils.
4441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   Written by Ulrich Drepper <drepper@redhat.com>, 2001.
5441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
6cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is free software; you can redistribute it and/or modify
7cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   it under the terms of the GNU General Public License as published by the
8cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Free Software Foundation; version 2 of the License.
9441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
10cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is distributed in the hope that it will be useful, but
11cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
12cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   General Public License for more details.
14cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
15cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   You should have received a copy of the GNU General Public License along
16cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   with Red Hat elfutils; if not, write to the Free Software Foundation,
17cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA.
18cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
19cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Red Hat elfutils is an included package of the Open Invention Network.
20cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   An included package of the Open Invention Network is a package for which
21cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Open Invention Network licensees cross-license their patents.  No patent
22cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   license is granted, either expressly or impliedly, by designation as an
23cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   included package.  Should you wish to participate in the Open Invention
24cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   Network licensing program, please visit www.openinventionnetwork.com
25cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   <http://www.openinventionnetwork.com>.  */
26441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
27441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#ifdef HAVE_CONFIG_H
28441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project# include <config.h>
29441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#endif
30441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
31441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <assert.h>
32441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <ctype.h>
33441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <elf.h>
34441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <error.h>
35441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <inttypes.h>
36441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <libintl.h>
37441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdbool.h>
38441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <stdio.h>
39441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <string.h>
40441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
41441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <system.h>
42441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include <ld.h>
43441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#include "ldscript.h"
44441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
45441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* We sure use no threads to read the stream, so use the _unlocked
46441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project   variants of the functions.  */
47441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#undef getc
48441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define getc(s) getc_unlocked (s)
49441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#undef ferror
50441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define ferror(s) ferror_unlocked (s)
51441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#undef fread
52441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define fread(b, m, n, s) fread_unlocked (b, m, n, s)
53441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#undef fwrite
54441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define fwrite(b, m, n, s) fwrite_unlocked (b, m, n, s)
55441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
56cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng/* ECHO must be redefined since the default implementation ignores
57cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng   the return value of fwrite_unlocked.  */
58cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng#define ECHO do { size_t n__ __attribute__ ((unused)) \
59cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng			   = fwrite (yytext, yyleng, 1, yyout); } while (0)
60cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben Cheng
61441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project/* Defined in ld.c.  */
62441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectextern int ld_scan_version_script;
63441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
64441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project#define MAX_PREPDEPTH 20
65441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic enum prepstate
66441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
67441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  prep_normal,
68441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  skip_if,
69441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  skip_to_endif
70441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project} prepstate[MAX_PREPDEPTH];
71441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int prepdepth;
72441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
73441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void eat_comment (void);
74441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void eat_to_eol (bool empty);
75441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int attrib_convert (int c);
76441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void push_state (enum prepstate);
77441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int pop_state (void);
78441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int handle_ifdef (void);
79441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void invalid_char (int ch);
80441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%}
81441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
82cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengID		[a-zA-Z0-9_.*?][a-zA-Z0-9_.*?-]*
83441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectFILENAMECHAR1	[a-zA-Z0-9_/.\\~]
84441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectFILENAMECHAR	[^][{}[:space:]():;]+
85441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectHEX		0[xX][0-9a-fA-F]+[kKmM]?
86441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectOCT		0[0-7]*[kKmM]?
87441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectDEC		[0-9]+[kKmM]?
88441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectWHITE		[[:space:]]+
89441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
90441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%option yylineno
91441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%option never-interactive
92441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%option noyywrap
93441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
94441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%x IGNORE
95441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
96441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%%
97441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				if (unlikely (ld_scan_version_script))
98441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  {
99441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    ld_scan_version_script = -1;
100441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    return kVERSION_SCRIPT;
101441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  }
102441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
103441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project^"#"ifdef/[[:space:]]		{ BEGIN (handle_ifdef ()); }
104441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project^"#"else/[[:space:]\n]		{ eat_to_eol (true);
105441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  push_state (skip_to_endif);
106441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  BEGIN (IGNORE); }
107441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project^"#"elifdef/[[:space:]]		{ eat_to_eol (false);
108441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  push_state (skip_to_endif);
109441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  BEGIN (IGNORE); }
110441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project^"#"endif/[[:space:]\n]		{ eat_to_eol (true) ; }
111441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
112441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project<IGNORE>^"#"ifdef/[[:space:]\n] { eat_to_eol (false);
113441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  push_state (skip_to_endif); }
114441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project<IGNORE>^"#"else/[[:space:]\n]	{ eat_to_eol (true);
115441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  assert (prepdepth > 0);
116441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  if (prepstate[prepdepth - 1] == skip_if)
117441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    {
118441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      /* Back to normal processing.  */
119441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      assert (prepdepth == 1);
120441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      BEGIN (pop_state ());
121441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    }
122441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				}
123441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project<IGNORE>^"#"elifdef/[[:space:]]	{ assert (prepdepth > 0);
124441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  if (prepstate[prepdepth - 1] == skip_if)
125441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    {
126441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      /* Maybe this symbol is defined.  */
127441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      pop_state ();
128441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      BEGIN (handle_ifdef ());
129441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    }
130441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				}
131441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project<IGNORE>^"#"endif/[[:space:]\n] { eat_to_eol (true);
132441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  BEGIN (pop_state ()); }
133441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project<IGNORE>.|\n			{ /* nothing */ }
134441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
135441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
136441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"/*"				{ eat_comment (); }
137441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
138441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectALIGN				{ return kALIGN; }
139cc6695e2684ce93cdf8bd2da63d55d2cf49ff076Ben ChengAS_NEEDED			{ return kAS_NEEDED; }
140441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectENTRY				{ return kENTRY; }
141441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectEXCLUDE_FILE			{ return kEXCLUDE_FILE; }
142441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"global:"			{ return kGLOBAL; }
143441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectGROUP				{ return kGROUP; }
144441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectINPUT				{ return kINPUT; }
145441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectINTERP				{ return kINTERP; }
146441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectKEEP				{ return kKEEP; }
147441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"local:"			{ return kLOCAL; }
148441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectOUTPUT_FORMAT			{ return kOUTPUT_FORMAT; }
149441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectPAGESIZE			{ return kPAGESIZE; }
150441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectPROVIDE				{ return kPROVIDE; }
151441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectSEARCH_DIR			{ return kSEARCH_DIR; }
152441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectSEGMENT				{ return kSEGMENT; }
153441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectSIZEOF_HEADERS			{ return kSIZEOF_HEADERS; }
154441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectSORT				{ return kSORT; }
155441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source ProjectVERSION				{ return kVERSION; }
156441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
157441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"["([RWX]){0,3}"]"		{ int cnt = 1 ;
158441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  ldlval.num = 0;
159441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  while (cnt < yyleng - 1)
160441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    ldlval.num |= attrib_convert (yytext[cnt++]);
161441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  return kMODE; }
162441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
163441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"{"				{ return '{'; }
164441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"}"				{ return '}'; }
165441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"("				{ return '('; }
166441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project")"				{ return ')'; }
167441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project":"				{ return ':'; }
168441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project";"				{ return ';'; }
169441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"="				{ return '='; }
170441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"+"				{ ldlval.op = exp_plus; return kADD_OP; }
171441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"-"				{ ldlval.op = exp_minus; return kADD_OP; }
172441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"*"				{ return '*'; }
173441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"/"				{ ldlval.op = exp_div; return kMUL_OP; }
174441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"%"				{ ldlval.op = exp_mod; return kMUL_OP; }
175441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"&"				{ return '&'; }
176441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project"|"				{ return '|'; }
177441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
178441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project","				{ return ','; }
179441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
180441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{HEX}|{OCT}|{DEC}		{ char *endp;
181441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  ldlval.num = strtoumax (yytext, &endp, 0);
182441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  if (*endp != '\0')
183441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    {
184441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      if (tolower (*endp) == 'k')
185441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					ldlval.num *= 1024;
186441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				      else
187441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					{
188441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  assert (tolower (*endp) == 'm');
189441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					  ldlval.num *= 1024 * 1024;
190441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project					}
191441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				    }
192441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  return kNUM; }
193441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
194441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{ID}				{ ldlval.str = obstack_strndup (&ld_state.smem,
195441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project								yytext, yyleng);
196441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  return kID; }
197441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
198441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{FILENAMECHAR1}{FILENAMECHAR}	{ ldlval.str = obstack_strndup (&ld_state.smem,
199441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project								yytext, yyleng);
200441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project				  return kFILENAME; }
201441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
202441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{WHITE}				{ /* IGNORE */ }
203441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
204441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project.				{ invalid_char (*yytext); }
205441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
206441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project%%
207441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
208441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
209441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecteat_comment (void)
210441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
211441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (1)
212441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
213441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int c = input ();
214441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
215441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      while (c != '*' && c != EOF)
216441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	c = input ();
217441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
218441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (c == '*')
219441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
220441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  c = input ();
221441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  while (c == '*')
222441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    c = input ();
223441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  if (c == '/')
224441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	    break;
225441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
226441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
227441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (c == EOF)
228441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
229441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  /* XXX Use the setjmp buffer and signal EOF in comment */
230441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  error (0, 0, gettext ("EOF in comment"));
231441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  break;
232441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
233441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
234441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
235441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
236441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
237441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
238441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecteat_to_eol (bool empty)
239441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
240441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool warned = false;
241441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
242441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (1)
243441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
244441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int c = input ();
245441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
246441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (c == EOF)
247441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	break;
248441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (c == '\n')
249441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
250441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  ++yylineno;
251441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  break;
252441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
253441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
254441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (empty && ! isspace (c) && ! warned)
255441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
256441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  error (0, 0, gettext ("%d: garbage at end of line"), yylineno);
257441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  warned = true;
258441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
259441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
260441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
261441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
262441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
263441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int
264441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectattrib_convert (int c)
265441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
266441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (c == 'X')
267441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    return PF_X;
268441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (c == 'W')
269441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    return PF_W;
270441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  assert (c == 'R');
271441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return PF_R;
272441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
273441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
274441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
275441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
276441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectpush_state (enum prepstate state)
277441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
278441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (prepdepth >= MAX_PREPDEPTH)
279441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    error (EXIT_FAILURE, 0, gettext ("%d: conditionals nested too deep"),
280441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	   yylineno);
281441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
282441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  prepstate[prepdepth++] = state;
283441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
284441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
285441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
286441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int
287441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectpop_state (void)
288441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
289441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (prepdepth == 0)
290441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    error (0, 0, gettext ("%d: unexpected #endif"), yylineno);
291441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
292441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    --prepdepth;
293441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
294441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return prepdepth == 0 ? INITIAL : IGNORE;
295441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
296441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
297441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
298441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic int
299441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projecthandle_ifdef (void)
300441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
301441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char idbuf[50];
302441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  char *id = idbuf;
303441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t idlen = 0;
304441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  size_t idmax = sizeof (idbuf);
305441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool ignore_ws = true;
306441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  bool defined = false;
307441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  int result;
308441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
309441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  while (1)
310441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
311441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      int c = input ();
312441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
313441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (isspace (c) && ignore_ws)
314441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	continue;
315441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
316441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (c != '_' && (c < 'a' || c > 'z') && (c < 'A' || c > 'Z')
317441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  && (idlen == 0 || c < '0' || c > '9'))
318441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
319441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  unput (c);
320441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  break;
321441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
322441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
323441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      if (idlen == idmax)
324441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	{
325441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  char *newp = (char *) alloca (idmax *= 2);
326441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	  id = memcpy (newp, id, idlen);
327441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	}
328441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
329441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      id[idlen++] = c;
330441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      ignore_ws = false;
331441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
332441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
333441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  /* XXX Compare in a better way.  */
334441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (idlen == 6 && strncmp (id, "SHARED", 6) == 0)
335441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    defined = ld_state.file_type == dso_file_type;
336441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
337441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  if (defined)
338441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    result = INITIAL;
339441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  else
340441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    {
341441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      push_state (skip_if);
342441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project      result = IGNORE;
343441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project    }
344441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
345441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  return result;
346441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
347441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
348441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
349441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectstatic void
350441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Projectinvalid_char (int ch)
351441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project{
352441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project  error (0, 0, (isascii (ch)
353441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		? gettext ("invalid character '%c' at line %d; ignored")
354441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project		: gettext ("invalid character '\\%o' at line %d; ignored")),
355441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project	 ch, yylineno);
356441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project}
357441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
358441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project
359441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project// Local Variables:
360441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project// mode: C
361441f72d43a9b550baa779fc82f70816da5f74f0eThe Android Open Source Project// End:
362