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