1*0a9064fbSMasahiro Yamada %{ 2*0a9064fbSMasahiro Yamada /* 3*0a9064fbSMasahiro Yamada * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 4*0a9064fbSMasahiro Yamada * Released under the terms of the GNU GPL v2.0. 5*0a9064fbSMasahiro Yamada */ 6*0a9064fbSMasahiro Yamada 7*0a9064fbSMasahiro Yamada #include <ctype.h> 8*0a9064fbSMasahiro Yamada #include <stdarg.h> 9*0a9064fbSMasahiro Yamada #include <stdio.h> 10*0a9064fbSMasahiro Yamada #include <stdlib.h> 11*0a9064fbSMasahiro Yamada #include <string.h> 12*0a9064fbSMasahiro Yamada #include <stdbool.h> 13*0a9064fbSMasahiro Yamada 14*0a9064fbSMasahiro Yamada #include "lkc.h" 15*0a9064fbSMasahiro Yamada 16*0a9064fbSMasahiro Yamada #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt) 17*0a9064fbSMasahiro Yamada 18*0a9064fbSMasahiro Yamada #define PRINTD 0x0001 19*0a9064fbSMasahiro Yamada #define DEBUG_PARSE 0x0002 20*0a9064fbSMasahiro Yamada 21*0a9064fbSMasahiro Yamada int cdebug = PRINTD; 22*0a9064fbSMasahiro Yamada 23*0a9064fbSMasahiro Yamada extern int zconflex(void); 24*0a9064fbSMasahiro Yamada static void zconfprint(const char *err, ...); 25*0a9064fbSMasahiro Yamada static void zconf_error(const char *err, ...); 26*0a9064fbSMasahiro Yamada static void zconferror(const char *err); 27*0a9064fbSMasahiro Yamada static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken); 28*0a9064fbSMasahiro Yamada 29*0a9064fbSMasahiro Yamada struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 30*0a9064fbSMasahiro Yamada 31*0a9064fbSMasahiro Yamada static struct menu *current_menu, *current_entry; 32*0a9064fbSMasahiro Yamada 33*0a9064fbSMasahiro Yamada %} 34*0a9064fbSMasahiro Yamada %expect 30 35*0a9064fbSMasahiro Yamada 36*0a9064fbSMasahiro Yamada %union 37*0a9064fbSMasahiro Yamada { 38*0a9064fbSMasahiro Yamada char *string; 39*0a9064fbSMasahiro Yamada struct file *file; 40*0a9064fbSMasahiro Yamada struct symbol *symbol; 41*0a9064fbSMasahiro Yamada struct expr *expr; 42*0a9064fbSMasahiro Yamada struct menu *menu; 43*0a9064fbSMasahiro Yamada const struct kconf_id *id; 44*0a9064fbSMasahiro Yamada } 45*0a9064fbSMasahiro Yamada 46*0a9064fbSMasahiro Yamada %token <id>T_MAINMENU 47*0a9064fbSMasahiro Yamada %token <id>T_MENU 48*0a9064fbSMasahiro Yamada %token <id>T_ENDMENU 49*0a9064fbSMasahiro Yamada %token <id>T_SOURCE 50*0a9064fbSMasahiro Yamada %token <id>T_CHOICE 51*0a9064fbSMasahiro Yamada %token <id>T_ENDCHOICE 52*0a9064fbSMasahiro Yamada %token <id>T_COMMENT 53*0a9064fbSMasahiro Yamada %token <id>T_CONFIG 54*0a9064fbSMasahiro Yamada %token <id>T_MENUCONFIG 55*0a9064fbSMasahiro Yamada %token <id>T_HELP 56*0a9064fbSMasahiro Yamada %token <string> T_HELPTEXT 57*0a9064fbSMasahiro Yamada %token <id>T_IF 58*0a9064fbSMasahiro Yamada %token <id>T_ENDIF 59*0a9064fbSMasahiro Yamada %token <id>T_DEPENDS 60*0a9064fbSMasahiro Yamada %token <id>T_OPTIONAL 61*0a9064fbSMasahiro Yamada %token <id>T_PROMPT 62*0a9064fbSMasahiro Yamada %token <id>T_TYPE 63*0a9064fbSMasahiro Yamada %token <id>T_DEFAULT 64*0a9064fbSMasahiro Yamada %token <id>T_SELECT 65*0a9064fbSMasahiro Yamada %token <id>T_RANGE 66*0a9064fbSMasahiro Yamada %token <id>T_VISIBLE 67*0a9064fbSMasahiro Yamada %token <id>T_OPTION 68*0a9064fbSMasahiro Yamada %token <id>T_ON 69*0a9064fbSMasahiro Yamada %token <string> T_WORD 70*0a9064fbSMasahiro Yamada %token <string> T_WORD_QUOTE 71*0a9064fbSMasahiro Yamada %token T_UNEQUAL 72*0a9064fbSMasahiro Yamada %token T_CLOSE_PAREN 73*0a9064fbSMasahiro Yamada %token T_OPEN_PAREN 74*0a9064fbSMasahiro Yamada %token T_EOL 75*0a9064fbSMasahiro Yamada 76*0a9064fbSMasahiro Yamada %left T_OR 77*0a9064fbSMasahiro Yamada %left T_AND 78*0a9064fbSMasahiro Yamada %left T_EQUAL T_UNEQUAL 79*0a9064fbSMasahiro Yamada %nonassoc T_NOT 80*0a9064fbSMasahiro Yamada 81*0a9064fbSMasahiro Yamada %type <string> prompt 82*0a9064fbSMasahiro Yamada %type <symbol> symbol 83*0a9064fbSMasahiro Yamada %type <expr> expr 84*0a9064fbSMasahiro Yamada %type <expr> if_expr 85*0a9064fbSMasahiro Yamada %type <id> end 86*0a9064fbSMasahiro Yamada %type <id> option_name 87*0a9064fbSMasahiro Yamada %type <menu> if_entry menu_entry choice_entry 88*0a9064fbSMasahiro Yamada %type <string> symbol_option_arg word_opt 89*0a9064fbSMasahiro Yamada 90*0a9064fbSMasahiro Yamada %destructor { 91*0a9064fbSMasahiro Yamada fprintf(stderr, "%s:%d: missing end statement for this entry\n", 92*0a9064fbSMasahiro Yamada $$->file->name, $$->lineno); 93*0a9064fbSMasahiro Yamada if (current_menu == $$) 94*0a9064fbSMasahiro Yamada menu_end_menu(); 95*0a9064fbSMasahiro Yamada } if_entry menu_entry choice_entry 96*0a9064fbSMasahiro Yamada 97*0a9064fbSMasahiro Yamada %{ 98*0a9064fbSMasahiro Yamada /* Include zconf.hash.c here so it can see the token constants. */ 99*0a9064fbSMasahiro Yamada #include "zconf.hash.c" 100*0a9064fbSMasahiro Yamada %} 101*0a9064fbSMasahiro Yamada 102*0a9064fbSMasahiro Yamada %% 103*0a9064fbSMasahiro Yamada input: nl start | start; 104*0a9064fbSMasahiro Yamada 105*0a9064fbSMasahiro Yamada start: mainmenu_stmt stmt_list | stmt_list; 106*0a9064fbSMasahiro Yamada 107*0a9064fbSMasahiro Yamada stmt_list: 108*0a9064fbSMasahiro Yamada /* empty */ 109*0a9064fbSMasahiro Yamada | stmt_list common_stmt 110*0a9064fbSMasahiro Yamada | stmt_list choice_stmt 111*0a9064fbSMasahiro Yamada | stmt_list menu_stmt 112*0a9064fbSMasahiro Yamada | stmt_list end { zconf_error("unexpected end statement"); } 113*0a9064fbSMasahiro Yamada | stmt_list T_WORD error T_EOL { zconf_error("unknown statement \"%s\"", $2); } 114*0a9064fbSMasahiro Yamada | stmt_list option_name error T_EOL 115*0a9064fbSMasahiro Yamada { 116*0a9064fbSMasahiro Yamada zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name); 117*0a9064fbSMasahiro Yamada } 118*0a9064fbSMasahiro Yamada | stmt_list error T_EOL { zconf_error("invalid statement"); } 119*0a9064fbSMasahiro Yamada ; 120*0a9064fbSMasahiro Yamada 121*0a9064fbSMasahiro Yamada option_name: 122*0a9064fbSMasahiro Yamada T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE 123*0a9064fbSMasahiro Yamada ; 124*0a9064fbSMasahiro Yamada 125*0a9064fbSMasahiro Yamada common_stmt: 126*0a9064fbSMasahiro Yamada T_EOL 127*0a9064fbSMasahiro Yamada | if_stmt 128*0a9064fbSMasahiro Yamada | comment_stmt 129*0a9064fbSMasahiro Yamada | config_stmt 130*0a9064fbSMasahiro Yamada | menuconfig_stmt 131*0a9064fbSMasahiro Yamada | source_stmt 132*0a9064fbSMasahiro Yamada ; 133*0a9064fbSMasahiro Yamada 134*0a9064fbSMasahiro Yamada option_error: 135*0a9064fbSMasahiro Yamada T_WORD error T_EOL { zconf_error("unknown option \"%s\"", $1); } 136*0a9064fbSMasahiro Yamada | error T_EOL { zconf_error("invalid option"); } 137*0a9064fbSMasahiro Yamada ; 138*0a9064fbSMasahiro Yamada 139*0a9064fbSMasahiro Yamada 140*0a9064fbSMasahiro Yamada /* config/menuconfig entry */ 141*0a9064fbSMasahiro Yamada 142*0a9064fbSMasahiro Yamada config_entry_start: T_CONFIG T_WORD T_EOL 143*0a9064fbSMasahiro Yamada { 144*0a9064fbSMasahiro Yamada struct symbol *sym = sym_lookup($2, 0); 145*0a9064fbSMasahiro Yamada sym->flags |= SYMBOL_OPTIONAL; 146*0a9064fbSMasahiro Yamada menu_add_entry(sym); 147*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2); 148*0a9064fbSMasahiro Yamada }; 149*0a9064fbSMasahiro Yamada 150*0a9064fbSMasahiro Yamada config_stmt: config_entry_start config_option_list 151*0a9064fbSMasahiro Yamada { 152*0a9064fbSMasahiro Yamada menu_end_entry(); 153*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); 154*0a9064fbSMasahiro Yamada }; 155*0a9064fbSMasahiro Yamada 156*0a9064fbSMasahiro Yamada menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL 157*0a9064fbSMasahiro Yamada { 158*0a9064fbSMasahiro Yamada struct symbol *sym = sym_lookup($2, 0); 159*0a9064fbSMasahiro Yamada sym->flags |= SYMBOL_OPTIONAL; 160*0a9064fbSMasahiro Yamada menu_add_entry(sym); 161*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2); 162*0a9064fbSMasahiro Yamada }; 163*0a9064fbSMasahiro Yamada 164*0a9064fbSMasahiro Yamada menuconfig_stmt: menuconfig_entry_start config_option_list 165*0a9064fbSMasahiro Yamada { 166*0a9064fbSMasahiro Yamada if (current_entry->prompt) 167*0a9064fbSMasahiro Yamada current_entry->prompt->type = P_MENU; 168*0a9064fbSMasahiro Yamada else 169*0a9064fbSMasahiro Yamada zconfprint("warning: menuconfig statement without prompt"); 170*0a9064fbSMasahiro Yamada menu_end_entry(); 171*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno()); 172*0a9064fbSMasahiro Yamada }; 173*0a9064fbSMasahiro Yamada 174*0a9064fbSMasahiro Yamada config_option_list: 175*0a9064fbSMasahiro Yamada /* empty */ 176*0a9064fbSMasahiro Yamada | config_option_list config_option 177*0a9064fbSMasahiro Yamada | config_option_list symbol_option 178*0a9064fbSMasahiro Yamada | config_option_list depends 179*0a9064fbSMasahiro Yamada | config_option_list help 180*0a9064fbSMasahiro Yamada | config_option_list option_error 181*0a9064fbSMasahiro Yamada | config_option_list T_EOL 182*0a9064fbSMasahiro Yamada ; 183*0a9064fbSMasahiro Yamada 184*0a9064fbSMasahiro Yamada config_option: T_TYPE prompt_stmt_opt T_EOL 185*0a9064fbSMasahiro Yamada { 186*0a9064fbSMasahiro Yamada menu_set_type($1->stype); 187*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:type(%u)\n", 188*0a9064fbSMasahiro Yamada zconf_curname(), zconf_lineno(), 189*0a9064fbSMasahiro Yamada $1->stype); 190*0a9064fbSMasahiro Yamada }; 191*0a9064fbSMasahiro Yamada 192*0a9064fbSMasahiro Yamada config_option: T_PROMPT prompt if_expr T_EOL 193*0a9064fbSMasahiro Yamada { 194*0a9064fbSMasahiro Yamada menu_add_prompt(P_PROMPT, $2, $3); 195*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); 196*0a9064fbSMasahiro Yamada }; 197*0a9064fbSMasahiro Yamada 198*0a9064fbSMasahiro Yamada config_option: T_DEFAULT expr if_expr T_EOL 199*0a9064fbSMasahiro Yamada { 200*0a9064fbSMasahiro Yamada menu_add_expr(P_DEFAULT, $2, $3); 201*0a9064fbSMasahiro Yamada if ($1->stype != S_UNKNOWN) 202*0a9064fbSMasahiro Yamada menu_set_type($1->stype); 203*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:default(%u)\n", 204*0a9064fbSMasahiro Yamada zconf_curname(), zconf_lineno(), 205*0a9064fbSMasahiro Yamada $1->stype); 206*0a9064fbSMasahiro Yamada }; 207*0a9064fbSMasahiro Yamada 208*0a9064fbSMasahiro Yamada config_option: T_SELECT T_WORD if_expr T_EOL 209*0a9064fbSMasahiro Yamada { 210*0a9064fbSMasahiro Yamada menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3); 211*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno()); 212*0a9064fbSMasahiro Yamada }; 213*0a9064fbSMasahiro Yamada 214*0a9064fbSMasahiro Yamada config_option: T_RANGE symbol symbol if_expr T_EOL 215*0a9064fbSMasahiro Yamada { 216*0a9064fbSMasahiro Yamada menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4); 217*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno()); 218*0a9064fbSMasahiro Yamada }; 219*0a9064fbSMasahiro Yamada 220*0a9064fbSMasahiro Yamada symbol_option: T_OPTION symbol_option_list T_EOL 221*0a9064fbSMasahiro Yamada ; 222*0a9064fbSMasahiro Yamada 223*0a9064fbSMasahiro Yamada symbol_option_list: 224*0a9064fbSMasahiro Yamada /* empty */ 225*0a9064fbSMasahiro Yamada | symbol_option_list T_WORD symbol_option_arg 226*0a9064fbSMasahiro Yamada { 227*0a9064fbSMasahiro Yamada const struct kconf_id *id = kconf_id_lookup($2, strlen($2)); 228*0a9064fbSMasahiro Yamada if (id && id->flags & TF_OPTION) 229*0a9064fbSMasahiro Yamada menu_add_option(id->token, $3); 230*0a9064fbSMasahiro Yamada else 231*0a9064fbSMasahiro Yamada zconfprint("warning: ignoring unknown option %s", $2); 232*0a9064fbSMasahiro Yamada free($2); 233*0a9064fbSMasahiro Yamada }; 234*0a9064fbSMasahiro Yamada 235*0a9064fbSMasahiro Yamada symbol_option_arg: 236*0a9064fbSMasahiro Yamada /* empty */ { $$ = NULL; } 237*0a9064fbSMasahiro Yamada | T_EQUAL prompt { $$ = $2; } 238*0a9064fbSMasahiro Yamada ; 239*0a9064fbSMasahiro Yamada 240*0a9064fbSMasahiro Yamada /* choice entry */ 241*0a9064fbSMasahiro Yamada 242*0a9064fbSMasahiro Yamada choice: T_CHOICE word_opt T_EOL 243*0a9064fbSMasahiro Yamada { 244*0a9064fbSMasahiro Yamada struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE); 245*0a9064fbSMasahiro Yamada sym->flags |= SYMBOL_AUTO; 246*0a9064fbSMasahiro Yamada menu_add_entry(sym); 247*0a9064fbSMasahiro Yamada menu_add_expr(P_CHOICE, NULL, NULL); 248*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno()); 249*0a9064fbSMasahiro Yamada }; 250*0a9064fbSMasahiro Yamada 251*0a9064fbSMasahiro Yamada choice_entry: choice choice_option_list 252*0a9064fbSMasahiro Yamada { 253*0a9064fbSMasahiro Yamada $$ = menu_add_menu(); 254*0a9064fbSMasahiro Yamada }; 255*0a9064fbSMasahiro Yamada 256*0a9064fbSMasahiro Yamada choice_end: end 257*0a9064fbSMasahiro Yamada { 258*0a9064fbSMasahiro Yamada if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) { 259*0a9064fbSMasahiro Yamada menu_end_menu(); 260*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno()); 261*0a9064fbSMasahiro Yamada } 262*0a9064fbSMasahiro Yamada }; 263*0a9064fbSMasahiro Yamada 264*0a9064fbSMasahiro Yamada choice_stmt: choice_entry choice_block choice_end 265*0a9064fbSMasahiro Yamada ; 266*0a9064fbSMasahiro Yamada 267*0a9064fbSMasahiro Yamada choice_option_list: 268*0a9064fbSMasahiro Yamada /* empty */ 269*0a9064fbSMasahiro Yamada | choice_option_list choice_option 270*0a9064fbSMasahiro Yamada | choice_option_list depends 271*0a9064fbSMasahiro Yamada | choice_option_list help 272*0a9064fbSMasahiro Yamada | choice_option_list T_EOL 273*0a9064fbSMasahiro Yamada | choice_option_list option_error 274*0a9064fbSMasahiro Yamada ; 275*0a9064fbSMasahiro Yamada 276*0a9064fbSMasahiro Yamada choice_option: T_PROMPT prompt if_expr T_EOL 277*0a9064fbSMasahiro Yamada { 278*0a9064fbSMasahiro Yamada menu_add_prompt(P_PROMPT, $2, $3); 279*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno()); 280*0a9064fbSMasahiro Yamada }; 281*0a9064fbSMasahiro Yamada 282*0a9064fbSMasahiro Yamada choice_option: T_TYPE prompt_stmt_opt T_EOL 283*0a9064fbSMasahiro Yamada { 284*0a9064fbSMasahiro Yamada if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) { 285*0a9064fbSMasahiro Yamada menu_set_type($1->stype); 286*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:type(%u)\n", 287*0a9064fbSMasahiro Yamada zconf_curname(), zconf_lineno(), 288*0a9064fbSMasahiro Yamada $1->stype); 289*0a9064fbSMasahiro Yamada } else 290*0a9064fbSMasahiro Yamada YYERROR; 291*0a9064fbSMasahiro Yamada }; 292*0a9064fbSMasahiro Yamada 293*0a9064fbSMasahiro Yamada choice_option: T_OPTIONAL T_EOL 294*0a9064fbSMasahiro Yamada { 295*0a9064fbSMasahiro Yamada current_entry->sym->flags |= SYMBOL_OPTIONAL; 296*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno()); 297*0a9064fbSMasahiro Yamada }; 298*0a9064fbSMasahiro Yamada 299*0a9064fbSMasahiro Yamada choice_option: T_DEFAULT T_WORD if_expr T_EOL 300*0a9064fbSMasahiro Yamada { 301*0a9064fbSMasahiro Yamada if ($1->stype == S_UNKNOWN) { 302*0a9064fbSMasahiro Yamada menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3); 303*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:default\n", 304*0a9064fbSMasahiro Yamada zconf_curname(), zconf_lineno()); 305*0a9064fbSMasahiro Yamada } else 306*0a9064fbSMasahiro Yamada YYERROR; 307*0a9064fbSMasahiro Yamada }; 308*0a9064fbSMasahiro Yamada 309*0a9064fbSMasahiro Yamada choice_block: 310*0a9064fbSMasahiro Yamada /* empty */ 311*0a9064fbSMasahiro Yamada | choice_block common_stmt 312*0a9064fbSMasahiro Yamada ; 313*0a9064fbSMasahiro Yamada 314*0a9064fbSMasahiro Yamada /* if entry */ 315*0a9064fbSMasahiro Yamada 316*0a9064fbSMasahiro Yamada if_entry: T_IF expr nl 317*0a9064fbSMasahiro Yamada { 318*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno()); 319*0a9064fbSMasahiro Yamada menu_add_entry(NULL); 320*0a9064fbSMasahiro Yamada menu_add_dep($2); 321*0a9064fbSMasahiro Yamada $$ = menu_add_menu(); 322*0a9064fbSMasahiro Yamada }; 323*0a9064fbSMasahiro Yamada 324*0a9064fbSMasahiro Yamada if_end: end 325*0a9064fbSMasahiro Yamada { 326*0a9064fbSMasahiro Yamada if (zconf_endtoken($1, T_IF, T_ENDIF)) { 327*0a9064fbSMasahiro Yamada menu_end_menu(); 328*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno()); 329*0a9064fbSMasahiro Yamada } 330*0a9064fbSMasahiro Yamada }; 331*0a9064fbSMasahiro Yamada 332*0a9064fbSMasahiro Yamada if_stmt: if_entry if_block if_end 333*0a9064fbSMasahiro Yamada ; 334*0a9064fbSMasahiro Yamada 335*0a9064fbSMasahiro Yamada if_block: 336*0a9064fbSMasahiro Yamada /* empty */ 337*0a9064fbSMasahiro Yamada | if_block common_stmt 338*0a9064fbSMasahiro Yamada | if_block menu_stmt 339*0a9064fbSMasahiro Yamada | if_block choice_stmt 340*0a9064fbSMasahiro Yamada ; 341*0a9064fbSMasahiro Yamada 342*0a9064fbSMasahiro Yamada /* mainmenu entry */ 343*0a9064fbSMasahiro Yamada 344*0a9064fbSMasahiro Yamada mainmenu_stmt: T_MAINMENU prompt nl 345*0a9064fbSMasahiro Yamada { 346*0a9064fbSMasahiro Yamada menu_add_prompt(P_MENU, $2, NULL); 347*0a9064fbSMasahiro Yamada }; 348*0a9064fbSMasahiro Yamada 349*0a9064fbSMasahiro Yamada /* menu entry */ 350*0a9064fbSMasahiro Yamada 351*0a9064fbSMasahiro Yamada menu: T_MENU prompt T_EOL 352*0a9064fbSMasahiro Yamada { 353*0a9064fbSMasahiro Yamada menu_add_entry(NULL); 354*0a9064fbSMasahiro Yamada menu_add_prompt(P_MENU, $2, NULL); 355*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno()); 356*0a9064fbSMasahiro Yamada }; 357*0a9064fbSMasahiro Yamada 358*0a9064fbSMasahiro Yamada menu_entry: menu visibility_list depends_list 359*0a9064fbSMasahiro Yamada { 360*0a9064fbSMasahiro Yamada $$ = menu_add_menu(); 361*0a9064fbSMasahiro Yamada }; 362*0a9064fbSMasahiro Yamada 363*0a9064fbSMasahiro Yamada menu_end: end 364*0a9064fbSMasahiro Yamada { 365*0a9064fbSMasahiro Yamada if (zconf_endtoken($1, T_MENU, T_ENDMENU)) { 366*0a9064fbSMasahiro Yamada menu_end_menu(); 367*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno()); 368*0a9064fbSMasahiro Yamada } 369*0a9064fbSMasahiro Yamada }; 370*0a9064fbSMasahiro Yamada 371*0a9064fbSMasahiro Yamada menu_stmt: menu_entry menu_block menu_end 372*0a9064fbSMasahiro Yamada ; 373*0a9064fbSMasahiro Yamada 374*0a9064fbSMasahiro Yamada menu_block: 375*0a9064fbSMasahiro Yamada /* empty */ 376*0a9064fbSMasahiro Yamada | menu_block common_stmt 377*0a9064fbSMasahiro Yamada | menu_block menu_stmt 378*0a9064fbSMasahiro Yamada | menu_block choice_stmt 379*0a9064fbSMasahiro Yamada ; 380*0a9064fbSMasahiro Yamada 381*0a9064fbSMasahiro Yamada source_stmt: T_SOURCE prompt T_EOL 382*0a9064fbSMasahiro Yamada { 383*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2); 384*0a9064fbSMasahiro Yamada zconf_nextfile($2); 385*0a9064fbSMasahiro Yamada }; 386*0a9064fbSMasahiro Yamada 387*0a9064fbSMasahiro Yamada /* comment entry */ 388*0a9064fbSMasahiro Yamada 389*0a9064fbSMasahiro Yamada comment: T_COMMENT prompt T_EOL 390*0a9064fbSMasahiro Yamada { 391*0a9064fbSMasahiro Yamada menu_add_entry(NULL); 392*0a9064fbSMasahiro Yamada menu_add_prompt(P_COMMENT, $2, NULL); 393*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno()); 394*0a9064fbSMasahiro Yamada }; 395*0a9064fbSMasahiro Yamada 396*0a9064fbSMasahiro Yamada comment_stmt: comment depends_list 397*0a9064fbSMasahiro Yamada { 398*0a9064fbSMasahiro Yamada menu_end_entry(); 399*0a9064fbSMasahiro Yamada }; 400*0a9064fbSMasahiro Yamada 401*0a9064fbSMasahiro Yamada /* help option */ 402*0a9064fbSMasahiro Yamada 403*0a9064fbSMasahiro Yamada help_start: T_HELP T_EOL 404*0a9064fbSMasahiro Yamada { 405*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno()); 406*0a9064fbSMasahiro Yamada zconf_starthelp(); 407*0a9064fbSMasahiro Yamada }; 408*0a9064fbSMasahiro Yamada 409*0a9064fbSMasahiro Yamada help: help_start T_HELPTEXT 410*0a9064fbSMasahiro Yamada { 411*0a9064fbSMasahiro Yamada current_entry->help = $2; 412*0a9064fbSMasahiro Yamada }; 413*0a9064fbSMasahiro Yamada 414*0a9064fbSMasahiro Yamada /* depends option */ 415*0a9064fbSMasahiro Yamada 416*0a9064fbSMasahiro Yamada depends_list: 417*0a9064fbSMasahiro Yamada /* empty */ 418*0a9064fbSMasahiro Yamada | depends_list depends 419*0a9064fbSMasahiro Yamada | depends_list T_EOL 420*0a9064fbSMasahiro Yamada | depends_list option_error 421*0a9064fbSMasahiro Yamada ; 422*0a9064fbSMasahiro Yamada 423*0a9064fbSMasahiro Yamada depends: T_DEPENDS T_ON expr T_EOL 424*0a9064fbSMasahiro Yamada { 425*0a9064fbSMasahiro Yamada menu_add_dep($3); 426*0a9064fbSMasahiro Yamada printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno()); 427*0a9064fbSMasahiro Yamada }; 428*0a9064fbSMasahiro Yamada 429*0a9064fbSMasahiro Yamada /* visibility option */ 430*0a9064fbSMasahiro Yamada 431*0a9064fbSMasahiro Yamada visibility_list: 432*0a9064fbSMasahiro Yamada /* empty */ 433*0a9064fbSMasahiro Yamada | visibility_list visible 434*0a9064fbSMasahiro Yamada | visibility_list T_EOL 435*0a9064fbSMasahiro Yamada ; 436*0a9064fbSMasahiro Yamada 437*0a9064fbSMasahiro Yamada visible: T_VISIBLE if_expr 438*0a9064fbSMasahiro Yamada { 439*0a9064fbSMasahiro Yamada menu_add_visibility($2); 440*0a9064fbSMasahiro Yamada }; 441*0a9064fbSMasahiro Yamada 442*0a9064fbSMasahiro Yamada /* prompt statement */ 443*0a9064fbSMasahiro Yamada 444*0a9064fbSMasahiro Yamada prompt_stmt_opt: 445*0a9064fbSMasahiro Yamada /* empty */ 446*0a9064fbSMasahiro Yamada | prompt if_expr 447*0a9064fbSMasahiro Yamada { 448*0a9064fbSMasahiro Yamada menu_add_prompt(P_PROMPT, $1, $2); 449*0a9064fbSMasahiro Yamada }; 450*0a9064fbSMasahiro Yamada 451*0a9064fbSMasahiro Yamada prompt: T_WORD 452*0a9064fbSMasahiro Yamada | T_WORD_QUOTE 453*0a9064fbSMasahiro Yamada ; 454*0a9064fbSMasahiro Yamada 455*0a9064fbSMasahiro Yamada end: T_ENDMENU T_EOL { $$ = $1; } 456*0a9064fbSMasahiro Yamada | T_ENDCHOICE T_EOL { $$ = $1; } 457*0a9064fbSMasahiro Yamada | T_ENDIF T_EOL { $$ = $1; } 458*0a9064fbSMasahiro Yamada ; 459*0a9064fbSMasahiro Yamada 460*0a9064fbSMasahiro Yamada nl: 461*0a9064fbSMasahiro Yamada T_EOL 462*0a9064fbSMasahiro Yamada | nl T_EOL 463*0a9064fbSMasahiro Yamada ; 464*0a9064fbSMasahiro Yamada 465*0a9064fbSMasahiro Yamada if_expr: /* empty */ { $$ = NULL; } 466*0a9064fbSMasahiro Yamada | T_IF expr { $$ = $2; } 467*0a9064fbSMasahiro Yamada ; 468*0a9064fbSMasahiro Yamada 469*0a9064fbSMasahiro Yamada expr: symbol { $$ = expr_alloc_symbol($1); } 470*0a9064fbSMasahiro Yamada | symbol T_EQUAL symbol { $$ = expr_alloc_comp(E_EQUAL, $1, $3); } 471*0a9064fbSMasahiro Yamada | symbol T_UNEQUAL symbol { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); } 472*0a9064fbSMasahiro Yamada | T_OPEN_PAREN expr T_CLOSE_PAREN { $$ = $2; } 473*0a9064fbSMasahiro Yamada | T_NOT expr { $$ = expr_alloc_one(E_NOT, $2); } 474*0a9064fbSMasahiro Yamada | expr T_OR expr { $$ = expr_alloc_two(E_OR, $1, $3); } 475*0a9064fbSMasahiro Yamada | expr T_AND expr { $$ = expr_alloc_two(E_AND, $1, $3); } 476*0a9064fbSMasahiro Yamada ; 477*0a9064fbSMasahiro Yamada 478*0a9064fbSMasahiro Yamada symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); } 479*0a9064fbSMasahiro Yamada | T_WORD_QUOTE { $$ = sym_lookup($1, SYMBOL_CONST); free($1); } 480*0a9064fbSMasahiro Yamada ; 481*0a9064fbSMasahiro Yamada 482*0a9064fbSMasahiro Yamada word_opt: /* empty */ { $$ = NULL; } 483*0a9064fbSMasahiro Yamada | T_WORD 484*0a9064fbSMasahiro Yamada 485*0a9064fbSMasahiro Yamada %% 486*0a9064fbSMasahiro Yamada 487*0a9064fbSMasahiro Yamada void conf_parse(const char *name) 488*0a9064fbSMasahiro Yamada { 489*0a9064fbSMasahiro Yamada struct symbol *sym; 490*0a9064fbSMasahiro Yamada int i; 491*0a9064fbSMasahiro Yamada 492*0a9064fbSMasahiro Yamada zconf_initscan(name); 493*0a9064fbSMasahiro Yamada 494*0a9064fbSMasahiro Yamada sym_init(); 495*0a9064fbSMasahiro Yamada _menu_init(); 496*0a9064fbSMasahiro Yamada rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL); 497*0a9064fbSMasahiro Yamada 498*0a9064fbSMasahiro Yamada if (getenv("ZCONF_DEBUG")) 499*0a9064fbSMasahiro Yamada zconfdebug = 1; 500*0a9064fbSMasahiro Yamada zconfparse(); 501*0a9064fbSMasahiro Yamada if (zconfnerrs) 502*0a9064fbSMasahiro Yamada exit(1); 503*0a9064fbSMasahiro Yamada if (!modules_sym) 504*0a9064fbSMasahiro Yamada modules_sym = sym_find( "n" ); 505*0a9064fbSMasahiro Yamada 506*0a9064fbSMasahiro Yamada rootmenu.prompt->text = _(rootmenu.prompt->text); 507*0a9064fbSMasahiro Yamada rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text); 508*0a9064fbSMasahiro Yamada 509*0a9064fbSMasahiro Yamada menu_finalize(&rootmenu); 510*0a9064fbSMasahiro Yamada for_all_symbols(i, sym) { 511*0a9064fbSMasahiro Yamada if (sym_check_deps(sym)) 512*0a9064fbSMasahiro Yamada zconfnerrs++; 513*0a9064fbSMasahiro Yamada } 514*0a9064fbSMasahiro Yamada if (zconfnerrs) 515*0a9064fbSMasahiro Yamada exit(1); 516*0a9064fbSMasahiro Yamada sym_set_change_count(1); 517*0a9064fbSMasahiro Yamada } 518*0a9064fbSMasahiro Yamada 519*0a9064fbSMasahiro Yamada static const char *zconf_tokenname(int token) 520*0a9064fbSMasahiro Yamada { 521*0a9064fbSMasahiro Yamada switch (token) { 522*0a9064fbSMasahiro Yamada case T_MENU: return "menu"; 523*0a9064fbSMasahiro Yamada case T_ENDMENU: return "endmenu"; 524*0a9064fbSMasahiro Yamada case T_CHOICE: return "choice"; 525*0a9064fbSMasahiro Yamada case T_ENDCHOICE: return "endchoice"; 526*0a9064fbSMasahiro Yamada case T_IF: return "if"; 527*0a9064fbSMasahiro Yamada case T_ENDIF: return "endif"; 528*0a9064fbSMasahiro Yamada case T_DEPENDS: return "depends"; 529*0a9064fbSMasahiro Yamada case T_VISIBLE: return "visible"; 530*0a9064fbSMasahiro Yamada } 531*0a9064fbSMasahiro Yamada return "<token>"; 532*0a9064fbSMasahiro Yamada } 533*0a9064fbSMasahiro Yamada 534*0a9064fbSMasahiro Yamada static bool zconf_endtoken(const struct kconf_id *id, int starttoken, int endtoken) 535*0a9064fbSMasahiro Yamada { 536*0a9064fbSMasahiro Yamada if (id->token != endtoken) { 537*0a9064fbSMasahiro Yamada zconf_error("unexpected '%s' within %s block", 538*0a9064fbSMasahiro Yamada kconf_id_strings + id->name, zconf_tokenname(starttoken)); 539*0a9064fbSMasahiro Yamada zconfnerrs++; 540*0a9064fbSMasahiro Yamada return false; 541*0a9064fbSMasahiro Yamada } 542*0a9064fbSMasahiro Yamada if (current_menu->file != current_file) { 543*0a9064fbSMasahiro Yamada zconf_error("'%s' in different file than '%s'", 544*0a9064fbSMasahiro Yamada kconf_id_strings + id->name, zconf_tokenname(starttoken)); 545*0a9064fbSMasahiro Yamada fprintf(stderr, "%s:%d: location of the '%s'\n", 546*0a9064fbSMasahiro Yamada current_menu->file->name, current_menu->lineno, 547*0a9064fbSMasahiro Yamada zconf_tokenname(starttoken)); 548*0a9064fbSMasahiro Yamada zconfnerrs++; 549*0a9064fbSMasahiro Yamada return false; 550*0a9064fbSMasahiro Yamada } 551*0a9064fbSMasahiro Yamada return true; 552*0a9064fbSMasahiro Yamada } 553*0a9064fbSMasahiro Yamada 554*0a9064fbSMasahiro Yamada static void zconfprint(const char *err, ...) 555*0a9064fbSMasahiro Yamada { 556*0a9064fbSMasahiro Yamada va_list ap; 557*0a9064fbSMasahiro Yamada 558*0a9064fbSMasahiro Yamada fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); 559*0a9064fbSMasahiro Yamada va_start(ap, err); 560*0a9064fbSMasahiro Yamada vfprintf(stderr, err, ap); 561*0a9064fbSMasahiro Yamada va_end(ap); 562*0a9064fbSMasahiro Yamada fprintf(stderr, "\n"); 563*0a9064fbSMasahiro Yamada } 564*0a9064fbSMasahiro Yamada 565*0a9064fbSMasahiro Yamada static void zconf_error(const char *err, ...) 566*0a9064fbSMasahiro Yamada { 567*0a9064fbSMasahiro Yamada va_list ap; 568*0a9064fbSMasahiro Yamada 569*0a9064fbSMasahiro Yamada zconfnerrs++; 570*0a9064fbSMasahiro Yamada fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno()); 571*0a9064fbSMasahiro Yamada va_start(ap, err); 572*0a9064fbSMasahiro Yamada vfprintf(stderr, err, ap); 573*0a9064fbSMasahiro Yamada va_end(ap); 574*0a9064fbSMasahiro Yamada fprintf(stderr, "\n"); 575*0a9064fbSMasahiro Yamada } 576*0a9064fbSMasahiro Yamada 577*0a9064fbSMasahiro Yamada static void zconferror(const char *err) 578*0a9064fbSMasahiro Yamada { 579*0a9064fbSMasahiro Yamada fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err); 580*0a9064fbSMasahiro Yamada } 581*0a9064fbSMasahiro Yamada 582*0a9064fbSMasahiro Yamada static void print_quoted_string(FILE *out, const char *str) 583*0a9064fbSMasahiro Yamada { 584*0a9064fbSMasahiro Yamada const char *p; 585*0a9064fbSMasahiro Yamada int len; 586*0a9064fbSMasahiro Yamada 587*0a9064fbSMasahiro Yamada putc('"', out); 588*0a9064fbSMasahiro Yamada while ((p = strchr(str, '"'))) { 589*0a9064fbSMasahiro Yamada len = p - str; 590*0a9064fbSMasahiro Yamada if (len) 591*0a9064fbSMasahiro Yamada fprintf(out, "%.*s", len, str); 592*0a9064fbSMasahiro Yamada fputs("\\\"", out); 593*0a9064fbSMasahiro Yamada str = p + 1; 594*0a9064fbSMasahiro Yamada } 595*0a9064fbSMasahiro Yamada fputs(str, out); 596*0a9064fbSMasahiro Yamada putc('"', out); 597*0a9064fbSMasahiro Yamada } 598*0a9064fbSMasahiro Yamada 599*0a9064fbSMasahiro Yamada static void print_symbol(FILE *out, struct menu *menu) 600*0a9064fbSMasahiro Yamada { 601*0a9064fbSMasahiro Yamada struct symbol *sym = menu->sym; 602*0a9064fbSMasahiro Yamada struct property *prop; 603*0a9064fbSMasahiro Yamada 604*0a9064fbSMasahiro Yamada if (sym_is_choice(sym)) 605*0a9064fbSMasahiro Yamada fprintf(out, "\nchoice\n"); 606*0a9064fbSMasahiro Yamada else 607*0a9064fbSMasahiro Yamada fprintf(out, "\nconfig %s\n", sym->name); 608*0a9064fbSMasahiro Yamada switch (sym->type) { 609*0a9064fbSMasahiro Yamada case S_BOOLEAN: 610*0a9064fbSMasahiro Yamada fputs(" boolean\n", out); 611*0a9064fbSMasahiro Yamada break; 612*0a9064fbSMasahiro Yamada case S_TRISTATE: 613*0a9064fbSMasahiro Yamada fputs(" tristate\n", out); 614*0a9064fbSMasahiro Yamada break; 615*0a9064fbSMasahiro Yamada case S_STRING: 616*0a9064fbSMasahiro Yamada fputs(" string\n", out); 617*0a9064fbSMasahiro Yamada break; 618*0a9064fbSMasahiro Yamada case S_INT: 619*0a9064fbSMasahiro Yamada fputs(" integer\n", out); 620*0a9064fbSMasahiro Yamada break; 621*0a9064fbSMasahiro Yamada case S_HEX: 622*0a9064fbSMasahiro Yamada fputs(" hex\n", out); 623*0a9064fbSMasahiro Yamada break; 624*0a9064fbSMasahiro Yamada default: 625*0a9064fbSMasahiro Yamada fputs(" ???\n", out); 626*0a9064fbSMasahiro Yamada break; 627*0a9064fbSMasahiro Yamada } 628*0a9064fbSMasahiro Yamada for (prop = sym->prop; prop; prop = prop->next) { 629*0a9064fbSMasahiro Yamada if (prop->menu != menu) 630*0a9064fbSMasahiro Yamada continue; 631*0a9064fbSMasahiro Yamada switch (prop->type) { 632*0a9064fbSMasahiro Yamada case P_PROMPT: 633*0a9064fbSMasahiro Yamada fputs(" prompt ", out); 634*0a9064fbSMasahiro Yamada print_quoted_string(out, prop->text); 635*0a9064fbSMasahiro Yamada if (!expr_is_yes(prop->visible.expr)) { 636*0a9064fbSMasahiro Yamada fputs(" if ", out); 637*0a9064fbSMasahiro Yamada expr_fprint(prop->visible.expr, out); 638*0a9064fbSMasahiro Yamada } 639*0a9064fbSMasahiro Yamada fputc('\n', out); 640*0a9064fbSMasahiro Yamada break; 641*0a9064fbSMasahiro Yamada case P_DEFAULT: 642*0a9064fbSMasahiro Yamada fputs( " default ", out); 643*0a9064fbSMasahiro Yamada expr_fprint(prop->expr, out); 644*0a9064fbSMasahiro Yamada if (!expr_is_yes(prop->visible.expr)) { 645*0a9064fbSMasahiro Yamada fputs(" if ", out); 646*0a9064fbSMasahiro Yamada expr_fprint(prop->visible.expr, out); 647*0a9064fbSMasahiro Yamada } 648*0a9064fbSMasahiro Yamada fputc('\n', out); 649*0a9064fbSMasahiro Yamada break; 650*0a9064fbSMasahiro Yamada case P_CHOICE: 651*0a9064fbSMasahiro Yamada fputs(" #choice value\n", out); 652*0a9064fbSMasahiro Yamada break; 653*0a9064fbSMasahiro Yamada case P_SELECT: 654*0a9064fbSMasahiro Yamada fputs( " select ", out); 655*0a9064fbSMasahiro Yamada expr_fprint(prop->expr, out); 656*0a9064fbSMasahiro Yamada fputc('\n', out); 657*0a9064fbSMasahiro Yamada break; 658*0a9064fbSMasahiro Yamada case P_RANGE: 659*0a9064fbSMasahiro Yamada fputs( " range ", out); 660*0a9064fbSMasahiro Yamada expr_fprint(prop->expr, out); 661*0a9064fbSMasahiro Yamada fputc('\n', out); 662*0a9064fbSMasahiro Yamada break; 663*0a9064fbSMasahiro Yamada case P_MENU: 664*0a9064fbSMasahiro Yamada fputs( " menu ", out); 665*0a9064fbSMasahiro Yamada print_quoted_string(out, prop->text); 666*0a9064fbSMasahiro Yamada fputc('\n', out); 667*0a9064fbSMasahiro Yamada break; 668*0a9064fbSMasahiro Yamada default: 669*0a9064fbSMasahiro Yamada fprintf(out, " unknown prop %d!\n", prop->type); 670*0a9064fbSMasahiro Yamada break; 671*0a9064fbSMasahiro Yamada } 672*0a9064fbSMasahiro Yamada } 673*0a9064fbSMasahiro Yamada if (menu->help) { 674*0a9064fbSMasahiro Yamada int len = strlen(menu->help); 675*0a9064fbSMasahiro Yamada while (menu->help[--len] == '\n') 676*0a9064fbSMasahiro Yamada menu->help[len] = 0; 677*0a9064fbSMasahiro Yamada fprintf(out, " help\n%s\n", menu->help); 678*0a9064fbSMasahiro Yamada } 679*0a9064fbSMasahiro Yamada } 680*0a9064fbSMasahiro Yamada 681*0a9064fbSMasahiro Yamada void zconfdump(FILE *out) 682*0a9064fbSMasahiro Yamada { 683*0a9064fbSMasahiro Yamada struct property *prop; 684*0a9064fbSMasahiro Yamada struct symbol *sym; 685*0a9064fbSMasahiro Yamada struct menu *menu; 686*0a9064fbSMasahiro Yamada 687*0a9064fbSMasahiro Yamada menu = rootmenu.list; 688*0a9064fbSMasahiro Yamada while (menu) { 689*0a9064fbSMasahiro Yamada if ((sym = menu->sym)) 690*0a9064fbSMasahiro Yamada print_symbol(out, menu); 691*0a9064fbSMasahiro Yamada else if ((prop = menu->prompt)) { 692*0a9064fbSMasahiro Yamada switch (prop->type) { 693*0a9064fbSMasahiro Yamada case P_COMMENT: 694*0a9064fbSMasahiro Yamada fputs("\ncomment ", out); 695*0a9064fbSMasahiro Yamada print_quoted_string(out, prop->text); 696*0a9064fbSMasahiro Yamada fputs("\n", out); 697*0a9064fbSMasahiro Yamada break; 698*0a9064fbSMasahiro Yamada case P_MENU: 699*0a9064fbSMasahiro Yamada fputs("\nmenu ", out); 700*0a9064fbSMasahiro Yamada print_quoted_string(out, prop->text); 701*0a9064fbSMasahiro Yamada fputs("\n", out); 702*0a9064fbSMasahiro Yamada break; 703*0a9064fbSMasahiro Yamada default: 704*0a9064fbSMasahiro Yamada ; 705*0a9064fbSMasahiro Yamada } 706*0a9064fbSMasahiro Yamada if (!expr_is_yes(prop->visible.expr)) { 707*0a9064fbSMasahiro Yamada fputs(" depends ", out); 708*0a9064fbSMasahiro Yamada expr_fprint(prop->visible.expr, out); 709*0a9064fbSMasahiro Yamada fputc('\n', out); 710*0a9064fbSMasahiro Yamada } 711*0a9064fbSMasahiro Yamada } 712*0a9064fbSMasahiro Yamada 713*0a9064fbSMasahiro Yamada if (menu->list) 714*0a9064fbSMasahiro Yamada menu = menu->list; 715*0a9064fbSMasahiro Yamada else if (menu->next) 716*0a9064fbSMasahiro Yamada menu = menu->next; 717*0a9064fbSMasahiro Yamada else while ((menu = menu->parent)) { 718*0a9064fbSMasahiro Yamada if (menu->prompt && menu->prompt->type == P_MENU) 719*0a9064fbSMasahiro Yamada fputs("\nendmenu\n", out); 720*0a9064fbSMasahiro Yamada if (menu->next) { 721*0a9064fbSMasahiro Yamada menu = menu->next; 722*0a9064fbSMasahiro Yamada break; 723*0a9064fbSMasahiro Yamada } 724*0a9064fbSMasahiro Yamada } 725*0a9064fbSMasahiro Yamada } 726*0a9064fbSMasahiro Yamada } 727*0a9064fbSMasahiro Yamada 728*0a9064fbSMasahiro Yamada #include "zconf.lex.c" 729*0a9064fbSMasahiro Yamada #include "util.c" 730*0a9064fbSMasahiro Yamada #include "confdata.c" 731*0a9064fbSMasahiro Yamada #include "expr.c" 732*0a9064fbSMasahiro Yamada #include "symbol.c" 733*0a9064fbSMasahiro Yamada #include "menu.c" 734