1*fae548d3Szrj %{ 2*fae548d3Szrj /* arparse.y - Strange script language parser */ 3*fae548d3Szrj 4*fae548d3Szrj /* Copyright (C) 1992-2020 Free Software Foundation, Inc. 5*fae548d3Szrj 6*fae548d3Szrj This file is part of GNU Binutils. 7*fae548d3Szrj 8*fae548d3Szrj This program is free software; you can redistribute it and/or modify 9*fae548d3Szrj it under the terms of the GNU General Public License as published by 10*fae548d3Szrj the Free Software Foundation; either version 3 of the License, or 11*fae548d3Szrj (at your option) any later version. 12*fae548d3Szrj 13*fae548d3Szrj This program is distributed in the hope that it will be useful, 14*fae548d3Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 15*fae548d3Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*fae548d3Szrj GNU General Public License for more details. 17*fae548d3Szrj 18*fae548d3Szrj You should have received a copy of the GNU General Public License 19*fae548d3Szrj along with this program; if not, write to the Free Software 20*fae548d3Szrj Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 21*fae548d3Szrj MA 02110-1301, USA. */ 22*fae548d3Szrj 23*fae548d3Szrj 24*fae548d3Szrj /* Contributed by Steve Chamberlain 25*fae548d3Szrj sac@cygnus.com 26*fae548d3Szrj 27*fae548d3Szrj */ 28*fae548d3Szrj #define DONTDECLARE_MALLOC 29*fae548d3Szrj #include "sysdep.h" 30*fae548d3Szrj #include "bfd.h" 31*fae548d3Szrj #include "arsup.h" 32*fae548d3Szrj extern int verbose; 33*fae548d3Szrj extern int yylex (void); 34*fae548d3Szrj static int yyerror (const char *); 35*fae548d3Szrj %} 36*fae548d3Szrj 37*fae548d3Szrj %union { 38*fae548d3Szrj char *name; 39*fae548d3Szrj struct list *list ; 40*fae548d3Szrj 41*fae548d3Szrj }; 42*fae548d3Szrj 43*fae548d3Szrj %token NEWLINE 44*fae548d3Szrj %token VERBOSE 45*fae548d3Szrj %token <name> FILENAME 46*fae548d3Szrj %token ADDLIB 47*fae548d3Szrj %token LIST 48*fae548d3Szrj %token ADDMOD 49*fae548d3Szrj %token CLEAR 50*fae548d3Szrj %token CREATE 51*fae548d3Szrj %token DELETE 52*fae548d3Szrj %token DIRECTORY 53*fae548d3Szrj %token END 54*fae548d3Szrj %token EXTRACT 55*fae548d3Szrj %token FULLDIR 56*fae548d3Szrj %token HELP 57*fae548d3Szrj %token QUIT 58*fae548d3Szrj %token REPLACE 59*fae548d3Szrj %token SAVE 60*fae548d3Szrj %token OPEN 61*fae548d3Szrj 62*fae548d3Szrj %type <list> modulelist 63*fae548d3Szrj %type <list> modulename 64*fae548d3Szrj %type <name> optional_filename 65*fae548d3Szrj %% 66*fae548d3Szrj 67*fae548d3Szrj start: 68*fae548d3Szrj { prompt(); } session 69*fae548d3Szrj ; 70*fae548d3Szrj 71*fae548d3Szrj session: 72*fae548d3Szrj session command_line 73*fae548d3Szrj | 74*fae548d3Szrj ; 75*fae548d3Szrj 76*fae548d3Szrj command_line: 77*fae548d3Szrj command NEWLINE { prompt(); } 78*fae548d3Szrj ; 79*fae548d3Szrj 80*fae548d3Szrj command: 81*fae548d3Szrj open_command 82*fae548d3Szrj | create_command 83*fae548d3Szrj | verbose_command 84*fae548d3Szrj | directory_command 85*fae548d3Szrj | addlib_command 86*fae548d3Szrj | clear_command 87*fae548d3Szrj | addmod_command 88*fae548d3Szrj | save_command 89*fae548d3Szrj | extract_command 90*fae548d3Szrj | replace_command 91*fae548d3Szrj | delete_command 92*fae548d3Szrj | list_command 93*fae548d3Szrj | END { ar_end(); return 0; } 94*fae548d3Szrj | error 95*fae548d3Szrj | FILENAME { yyerror("foo"); } 96*fae548d3Szrj | 97*fae548d3Szrj ; 98*fae548d3Szrj 99*fae548d3Szrj 100*fae548d3Szrj extract_command: 101*fae548d3Szrj EXTRACT modulename 102*fae548d3Szrj { ar_extract($2); } 103*fae548d3Szrj ; 104*fae548d3Szrj 105*fae548d3Szrj replace_command: 106*fae548d3Szrj REPLACE modulename 107*fae548d3Szrj { ar_replace($2); } 108*fae548d3Szrj ; 109*fae548d3Szrj 110*fae548d3Szrj clear_command: 111*fae548d3Szrj CLEAR 112*fae548d3Szrj { ar_clear(); } 113*fae548d3Szrj ; 114*fae548d3Szrj 115*fae548d3Szrj delete_command: 116*fae548d3Szrj DELETE modulename 117*fae548d3Szrj { ar_delete($2); } 118*fae548d3Szrj ; 119*fae548d3Szrj addmod_command: 120*fae548d3Szrj ADDMOD modulename 121*fae548d3Szrj { ar_addmod($2); } 122*fae548d3Szrj ; 123*fae548d3Szrj 124*fae548d3Szrj list_command: 125*fae548d3Szrj LIST 126*fae548d3Szrj { ar_list(); } 127*fae548d3Szrj ; 128*fae548d3Szrj 129*fae548d3Szrj save_command: 130*fae548d3Szrj SAVE 131*fae548d3Szrj { ar_save(); } 132*fae548d3Szrj ; 133*fae548d3Szrj 134*fae548d3Szrj 135*fae548d3Szrj 136*fae548d3Szrj open_command: 137*fae548d3Szrj OPEN FILENAME 138*fae548d3Szrj { ar_open($2,0); } 139*fae548d3Szrj ; 140*fae548d3Szrj 141*fae548d3Szrj create_command: 142*fae548d3Szrj CREATE FILENAME 143*fae548d3Szrj { ar_open($2,1); } 144*fae548d3Szrj ; 145*fae548d3Szrj 146*fae548d3Szrj 147*fae548d3Szrj addlib_command: 148*fae548d3Szrj ADDLIB FILENAME modulelist 149*fae548d3Szrj { ar_addlib($2,$3); } 150*fae548d3Szrj ; 151*fae548d3Szrj directory_command: 152*fae548d3Szrj DIRECTORY FILENAME modulelist optional_filename 153*fae548d3Szrj { ar_directory($2, $3, $4); } 154*fae548d3Szrj ; 155*fae548d3Szrj 156*fae548d3Szrj 157*fae548d3Szrj 158*fae548d3Szrj optional_filename: 159*fae548d3Szrj FILENAME 160*fae548d3Szrj { $$ = $1; } 161*fae548d3Szrj | { $$ = 0; } 162*fae548d3Szrj ; 163*fae548d3Szrj 164*fae548d3Szrj modulelist: 165*fae548d3Szrj '(' modulename ')' 166*fae548d3Szrj { $$ = $2; } 167*fae548d3Szrj | 168*fae548d3Szrj { $$ = 0; } 169*fae548d3Szrj ; 170*fae548d3Szrj 171*fae548d3Szrj modulename: 172*fae548d3Szrj modulename optcomma FILENAME 173*fae548d3Szrj { struct list *n = (struct list *) malloc(sizeof(struct list)); 174*fae548d3Szrj n->next = $1; 175*fae548d3Szrj n->name = $3; 176*fae548d3Szrj $$ = n; 177*fae548d3Szrj } 178*fae548d3Szrj | { $$ = 0; } 179*fae548d3Szrj ; 180*fae548d3Szrj 181*fae548d3Szrj 182*fae548d3Szrj optcomma: 183*fae548d3Szrj ',' 184*fae548d3Szrj | 185*fae548d3Szrj ; 186*fae548d3Szrj 187*fae548d3Szrj 188*fae548d3Szrj verbose_command: 189*fae548d3Szrj VERBOSE 190*fae548d3Szrj { verbose = !verbose; } 191*fae548d3Szrj ; 192*fae548d3Szrj 193*fae548d3Szrj 194*fae548d3Szrj %% 195*fae548d3Szrj 196*fae548d3Szrj static int 197*fae548d3Szrj yyerror (const char *x ATTRIBUTE_UNUSED) 198*fae548d3Szrj { 199*fae548d3Szrj extern int linenumber; 200*fae548d3Szrj 201*fae548d3Szrj printf (_("Syntax error in archive script, line %d\n"), linenumber + 1); 202*fae548d3Szrj return 0; 203*fae548d3Szrj } 204