⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mconf.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
				if (single_menu_mode && menu->data)					goto conf_childs;				return;			case P_COMMENT:				if (prompt) {					child_count++;					item_make("   %*c*** %s ***", indent + 1, ' ', prompt);					item_set_tag(':');					item_set_data(menu);				}				break;			default:				if (prompt) {					child_count++;					item_make("---%*c%s", indent + 1, ' ', prompt);					item_set_tag(':');					item_set_data(menu);				}			}		} else			doint = 0;		goto conf_childs;	}	type = sym_get_type(sym);	if (sym_is_choice(sym)) {		struct symbol *def_sym = sym_get_choice_value(sym);		struct menu *def_menu = NULL;		child_count++;		for (child = menu->list; child; child = child->next) {			if (menu_is_visible(child) && child->sym == def_sym)				def_menu = child;		}		val = sym_get_tristate_value(sym);		if (sym_is_changable(sym)) {			switch (type) {			case S_BOOLEAN:				item_make("[%c]", val == no ? ' ' : '*');				break;			case S_TRISTATE:				switch (val) {				case yes: ch = '*'; break;				case mod: ch = 'M'; break;				default:  ch = ' '; break;				}				item_make("<%c>", ch);				break;			}			item_set_tag('t');			item_set_data(menu);		} else {			item_make("   ");			item_set_tag(def_menu ? 't' : ':');			item_set_data(menu);		}		item_add_str("%*c%s", indent + 1, ' ', menu_get_prompt(menu));		if (val == yes) {			if (def_menu) {				item_add_str(" (%s)", menu_get_prompt(def_menu));				item_add_str("  --->");				if (def_menu->list) {					indent += 2;					build_conf(def_menu);					indent -= 2;				}			}			return;		}	} else {		if (menu == current_menu) {			item_make("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));			item_set_tag(':');			item_set_data(menu);			goto conf_childs;		}		child_count++;		val = sym_get_tristate_value(sym);		if (sym_is_choice_value(sym) && val == yes) {			item_make("   ");			item_set_tag(':');			item_set_data(menu);		} else {			switch (type) {			case S_BOOLEAN:				if (sym_is_changable(sym))					item_make("[%c]", val == no ? ' ' : '*');				else					item_make("-%c-", val == no ? ' ' : '*');				item_set_tag('t');				item_set_data(menu);				break;			case S_TRISTATE:				switch (val) {				case yes: ch = '*'; break;				case mod: ch = 'M'; break;				default:  ch = ' '; break;				}				if (sym_is_changable(sym)) {					if (sym->rev_dep.tri == mod)						item_make("{%c}", ch);					else						item_make("<%c>", ch);				} else					item_make("-%c-", ch);				item_set_tag('t');				item_set_data(menu);				break;			default:				tmp = 2 + strlen(sym_get_string_value(sym)); /* () = 2 */				item_make("(%s)", sym_get_string_value(sym));				tmp = indent - tmp + 4;				if (tmp < 0)					tmp = 0;				item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),					     (sym_has_value(sym) || !sym_is_changable(sym)) ?					     "" : " (NEW)");				item_set_tag('s');				item_set_data(menu);				goto conf_childs;			}		}		item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),			  (sym_has_value(sym) || !sym_is_changable(sym)) ?			  "" : " (NEW)");		if (menu->prompt->type == P_MENU) {			item_add_str("  --->");			return;		}	}conf_childs:	indent += doint;	for (child = menu->list; child; child = child->next)		build_conf(child);	indent -= doint;}static void conf(struct menu *menu){	struct menu *submenu;	const char *prompt = menu_get_prompt(menu);	struct symbol *sym;	struct menu *active_menu = NULL;	int res;	int s_scroll = 0;	while (1) {		item_reset();		current_menu = menu;		build_conf(menu);		if (!child_count)			break;		if (menu == &rootmenu) {			item_make("--- ");			item_set_tag(':');			item_make(_("    Load an Alternate Configuration File"));			item_set_tag('L');			item_make(_("    Save an Alternate Configuration File"));			item_set_tag('S');		}		dialog_clear();		res = dialog_menu(prompt ? prompt : _("Main Menu"),				  _(menu_instructions),				  active_menu, &s_scroll);		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)			break;		if (!item_activate_selected())			continue;		if (!item_tag())			continue;		submenu = item_data();		active_menu = item_data();		if (submenu)			sym = submenu->sym;		else			sym = NULL;		switch (res) {		case 0:			switch (item_tag()) {			case 'm':				if (single_menu_mode)					submenu->data = (void *) (long) !submenu->data;				else					conf(submenu);				break;			case 't':				if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)					conf_choice(submenu);				else if (submenu->prompt->type == P_MENU)					conf(submenu);				break;			case 's':				conf_string(submenu);				break;			case 'L':				conf_load();				break;			case 'S':				conf_save();				break;			}			break;		case 2:			if (sym)				show_help(submenu);			else				show_helptext("README", _(mconf_readme));			break;		case 3:			if (item_is_tag('t')) {				if (sym_set_tristate_value(sym, yes))					break;				if (sym_set_tristate_value(sym, mod))					show_textbox(NULL, setmod_text, 6, 74);			}			break;		case 4:			if (item_is_tag('t'))				sym_set_tristate_value(sym, no);			break;		case 5:			if (item_is_tag('t'))				sym_set_tristate_value(sym, mod);			break;		case 6:			if (item_is_tag('t'))				sym_toggle_tristate_value(sym);			else if (item_is_tag('m'))				conf(submenu);			break;		case 7:			search_conf();			break;		}	}}static void show_textbox(const char *title, const char *text, int r, int c){	dialog_clear();	dialog_textbox(title, text, r, c);}static void show_helptext(const char *title, const char *text){	show_textbox(title, text, 0, 0);}static void show_help(struct menu *menu){	struct gstr help = str_new();	struct symbol *sym = menu->sym;	if (menu_has_help(menu))	{		if (sym->name) {			str_printf(&help, "CONFIG_%s:\n\n", sym->name);			str_append(&help, _(menu_get_help(menu)));			str_append(&help, "\n");		}	} else {		str_append(&help, nohelp_text);	}	get_symbol_str(&help, sym);	show_helptext(menu_get_prompt(menu), str_get(&help));	str_free(&help);}static void conf_choice(struct menu *menu){	const char *prompt = menu_get_prompt(menu);	struct menu *child;	struct symbol *active;	active = sym_get_choice_value(menu->sym);	while (1) {		int res;		int selected;		item_reset();		current_menu = menu;		for (child = menu->list; child; child = child->next) {			if (!menu_is_visible(child))				continue;			item_make("%s", menu_get_prompt(child));			item_set_data(child);			if (child->sym == active)				item_set_selected(1);			if (child->sym == sym_get_choice_value(menu->sym))				item_set_tag('X');		}		dialog_clear();		res = dialog_checklist(prompt ? prompt : _("Main Menu"),					_(radiolist_instructions),					 15, 70, 6);		selected = item_activate_selected();		switch (res) {		case 0:			if (selected) {				child = item_data();				sym_set_tristate_value(child->sym, yes);			}			return;		case 1:			if (selected) {				child = item_data();				show_help(child);				active = child->sym;			} else				show_help(menu);			break;		case KEY_ESC:			return;		case -ERRDISPLAYTOOSMALL:			return;		}	}}static void conf_string(struct menu *menu){	const char *prompt = menu_get_prompt(menu);	while (1) {		int res;		char *heading;		switch (sym_get_type(menu->sym)) {		case S_INT:			heading = _(inputbox_instructions_int);			break;		case S_HEX:			heading = _(inputbox_instructions_hex);			break;		case S_STRING:			heading = _(inputbox_instructions_string);			break;		default:			heading = "Internal mconf error!";		}		dialog_clear();		res = dialog_inputbox(prompt ? prompt : _("Main Menu"),				      heading, 10, 75,				      sym_get_string_value(menu->sym));		switch (res) {		case 0:			if (sym_set_string_value(menu->sym, dialog_input_result))				return;			show_textbox(NULL, _("You have made an invalid entry."), 5, 43);			break;		case 1:			show_help(menu);			break;		case KEY_ESC:			return;		}	}}static void conf_load(void){	while (1) {		int res;		dialog_clear();		res = dialog_inputbox(NULL, load_config_text,				      11, 55, filename);		switch(res) {		case 0:			if (!dialog_input_result[0])				return;			if (!conf_read(dialog_input_result)) {				set_config_filename(dialog_input_result);				return;			}			show_textbox(NULL, _("File does not exist!"), 5, 38);			break;		case 1:			show_helptext(_("Load Alternate Configuration"), load_config_help);			break;		case KEY_ESC:			return;		}	}}static void conf_save(void){	while (1) {		int res;		dialog_clear();		res = dialog_inputbox(NULL, save_config_text,				      11, 55, filename);		switch(res) {		case 0:			if (!dialog_input_result[0])				return;			if (!conf_write(dialog_input_result)) {				set_config_filename(dialog_input_result);				return;			}			show_textbox(NULL, _("Can't create file!  Probably a nonexistent directory."), 5, 60);			break;		case 1:			show_helptext(_("Save Alternate Configuration"), save_config_help);			break;		case KEY_ESC:			return;		}	}}static void conf_cleanup(void){	tcsetattr(1, TCSAFLUSH, &ios_org);}int main(int ac, char **av){	char *mode;	int res;	setlocale(LC_ALL, "");	bindtextdomain(PACKAGE, LOCALEDIR);	textdomain(PACKAGE);	conf_parse(av[1]);	conf_read(NULL);	mode = getenv("MENUCONFIG_MODE");	if (mode) {		if (!strcasecmp(mode, "single_menu"))			single_menu_mode = 1;	}	tcgetattr(1, &ios_org);	atexit(conf_cleanup);	init_wsize();	reset_dialog();	init_dialog(NULL);	set_config_filename(conf_get_configname());	do {		conf(&rootmenu);		dialog_clear();		if (conf_get_changed())			res = dialog_yesno(NULL,					   _("Do you wish to save your "					     "new kernel configuration?\n"					     "<ESC><ESC> to continue."),					   6, 60);		else			res = -1;	} while (res == KEY_ESC);	end_dialog();	switch (res) {	case 0:		if (conf_write(filename)) {			fprintf(stderr, _("\n\n"				"Error during writing of the kernel configuration.\n"				"Your kernel configuration changes were NOT saved."				"\n\n"));			return 1;		}	case -1:		printf(_("\n\n"			"*** End of Linux kernel configuration.\n"			"*** Execute 'make' to build the kernel or try 'make help'."			"\n\n"));		break;	default:		fprintf(stderr, _("\n\n"			"Your kernel configuration changes were NOT saved."			"\n\n"));	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -