Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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"