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