175fd0b74Schristos %{ 2ede78133Schristos /* arparse.y - Strange script language parser */ 375fd0b74Schristos 4*e992f068Schristos /* Copyright (C) 1992-2022 Free Software Foundation, Inc. 575fd0b74Schristos 675fd0b74Schristos This file is part of GNU Binutils. 775fd0b74Schristos 875fd0b74Schristos This program is free software; you can redistribute it and/or modify 975fd0b74Schristos it under the terms of the GNU General Public License as published by 1075fd0b74Schristos the Free Software Foundation; either version 3 of the License, or 1175fd0b74Schristos (at your option) any later version. 1275fd0b74Schristos 1375fd0b74Schristos This program is distributed in the hope that it will be useful, 1475fd0b74Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 1575fd0b74Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1675fd0b74Schristos GNU General Public License for more details. 1775fd0b74Schristos 1875fd0b74Schristos You should have received a copy of the GNU General Public License 1975fd0b74Schristos along with this program; if not, write to the Free Software 2075fd0b74Schristos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 2175fd0b74Schristos MA 02110-1301, USA. */ 2275fd0b74Schristos 2375fd0b74Schristos 2475fd0b74Schristos /* Contributed by Steve Chamberlain 2575fd0b74Schristos sac@cygnus.com 2675fd0b74Schristos 2775fd0b74Schristos */ 2875fd0b74Schristos #define DONTDECLARE_MALLOC 2975fd0b74Schristos #include "sysdep.h" 3075fd0b74Schristos #include "bfd.h" 3175fd0b74Schristos #include "arsup.h" 3275fd0b74Schristos extern int verbose; 3375fd0b74Schristos extern int yylex (void); 34*e992f068Schristos static void yyerror (const char *); 3575fd0b74Schristos %} 3675fd0b74Schristos 3775fd0b74Schristos %union { 3875fd0b74Schristos char *name; 3975fd0b74Schristos struct list *list ; 4075fd0b74Schristos 4175fd0b74Schristos }; 4275fd0b74Schristos 4375fd0b74Schristos %token NEWLINE 4475fd0b74Schristos %token VERBOSE 4575fd0b74Schristos %token <name> FILENAME 4675fd0b74Schristos %token ADDLIB 4775fd0b74Schristos %token LIST 4875fd0b74Schristos %token ADDMOD 4975fd0b74Schristos %token CLEAR 5075fd0b74Schristos %token CREATE 5175fd0b74Schristos %token DELETE 5275fd0b74Schristos %token DIRECTORY 5375fd0b74Schristos %token END 5475fd0b74Schristos %token EXTRACT 5575fd0b74Schristos %token FULLDIR 5675fd0b74Schristos %token HELP 5775fd0b74Schristos %token QUIT 5875fd0b74Schristos %token REPLACE 5975fd0b74Schristos %token SAVE 6075fd0b74Schristos %token OPEN 6175fd0b74Schristos 6275fd0b74Schristos %type <list> modulelist 6375fd0b74Schristos %type <list> modulename 6475fd0b74Schristos %type <name> optional_filename 6575fd0b74Schristos %% 6675fd0b74Schristos 6775fd0b74Schristos start: 6875fd0b74Schristos { prompt(); } session 6975fd0b74Schristos ; 7075fd0b74Schristos 7175fd0b74Schristos session: 7275fd0b74Schristos session command_line 7375fd0b74Schristos | 7475fd0b74Schristos ; 7575fd0b74Schristos 7675fd0b74Schristos command_line: 7775fd0b74Schristos command NEWLINE { prompt(); } 7875fd0b74Schristos ; 7975fd0b74Schristos 8075fd0b74Schristos command: 8175fd0b74Schristos open_command 8275fd0b74Schristos | create_command 8375fd0b74Schristos | verbose_command 8475fd0b74Schristos | directory_command 8575fd0b74Schristos | addlib_command 8675fd0b74Schristos | clear_command 8775fd0b74Schristos | addmod_command 8875fd0b74Schristos | save_command 8975fd0b74Schristos | extract_command 9075fd0b74Schristos | replace_command 9175fd0b74Schristos | delete_command 9275fd0b74Schristos | list_command 9375fd0b74Schristos | END { ar_end(); return 0; } 9475fd0b74Schristos | error 9575fd0b74Schristos | FILENAME { yyerror("foo"); } 9675fd0b74Schristos | 9775fd0b74Schristos ; 9875fd0b74Schristos 9975fd0b74Schristos 10075fd0b74Schristos extract_command: 10175fd0b74Schristos EXTRACT modulename 10275fd0b74Schristos { ar_extract($2); } 10375fd0b74Schristos ; 10475fd0b74Schristos 10575fd0b74Schristos replace_command: 10675fd0b74Schristos REPLACE modulename 10775fd0b74Schristos { ar_replace($2); } 10875fd0b74Schristos ; 10975fd0b74Schristos 11075fd0b74Schristos clear_command: 11175fd0b74Schristos CLEAR 11275fd0b74Schristos { ar_clear(); } 11375fd0b74Schristos ; 11475fd0b74Schristos 11575fd0b74Schristos delete_command: 11675fd0b74Schristos DELETE modulename 11775fd0b74Schristos { ar_delete($2); } 11875fd0b74Schristos ; 11975fd0b74Schristos addmod_command: 12075fd0b74Schristos ADDMOD modulename 12175fd0b74Schristos { ar_addmod($2); } 12275fd0b74Schristos ; 12375fd0b74Schristos 12475fd0b74Schristos list_command: 12575fd0b74Schristos LIST 12675fd0b74Schristos { ar_list(); } 12775fd0b74Schristos ; 12875fd0b74Schristos 12975fd0b74Schristos save_command: 13075fd0b74Schristos SAVE 13175fd0b74Schristos { ar_save(); } 13275fd0b74Schristos ; 13375fd0b74Schristos 13475fd0b74Schristos 13575fd0b74Schristos 13675fd0b74Schristos open_command: 13775fd0b74Schristos OPEN FILENAME 13875fd0b74Schristos { ar_open($2,0); } 13975fd0b74Schristos ; 14075fd0b74Schristos 14175fd0b74Schristos create_command: 14275fd0b74Schristos CREATE FILENAME 14375fd0b74Schristos { ar_open($2,1); } 14475fd0b74Schristos ; 14575fd0b74Schristos 14675fd0b74Schristos 14775fd0b74Schristos addlib_command: 14875fd0b74Schristos ADDLIB FILENAME modulelist 14975fd0b74Schristos { ar_addlib($2,$3); } 15075fd0b74Schristos ; 15175fd0b74Schristos directory_command: 15275fd0b74Schristos DIRECTORY FILENAME modulelist optional_filename 15375fd0b74Schristos { ar_directory($2, $3, $4); } 15475fd0b74Schristos ; 15575fd0b74Schristos 15675fd0b74Schristos 15775fd0b74Schristos 15875fd0b74Schristos optional_filename: 15975fd0b74Schristos FILENAME 16075fd0b74Schristos { $$ = $1; } 16175fd0b74Schristos | { $$ = 0; } 16275fd0b74Schristos ; 16375fd0b74Schristos 16475fd0b74Schristos modulelist: 16575fd0b74Schristos '(' modulename ')' 16675fd0b74Schristos { $$ = $2; } 16775fd0b74Schristos | 16875fd0b74Schristos { $$ = 0; } 16975fd0b74Schristos ; 17075fd0b74Schristos 17175fd0b74Schristos modulename: 17275fd0b74Schristos modulename optcomma FILENAME 17375fd0b74Schristos { struct list *n = (struct list *) malloc(sizeof(struct list)); 17475fd0b74Schristos n->next = $1; 17575fd0b74Schristos n->name = $3; 17675fd0b74Schristos $$ = n; 17775fd0b74Schristos } 17875fd0b74Schristos | { $$ = 0; } 17975fd0b74Schristos ; 18075fd0b74Schristos 18175fd0b74Schristos 18275fd0b74Schristos optcomma: 18375fd0b74Schristos ',' 18475fd0b74Schristos | 18575fd0b74Schristos ; 18675fd0b74Schristos 18775fd0b74Schristos 18875fd0b74Schristos verbose_command: 18975fd0b74Schristos VERBOSE 19075fd0b74Schristos { verbose = !verbose; } 19175fd0b74Schristos ; 19275fd0b74Schristos 19375fd0b74Schristos 19475fd0b74Schristos %% 19575fd0b74Schristos 196*e992f068Schristos static void 19775fd0b74Schristos yyerror (const char *x ATTRIBUTE_UNUSED) 19875fd0b74Schristos { 19975fd0b74Schristos extern int linenumber; 20075fd0b74Schristos 20175fd0b74Schristos printf (_("Syntax error in archive script, line %d\n"), linenumber + 1); 20275fd0b74Schristos } 203