mconf.c

来自「Linux Kernel 2.6.9 for OMAP1710」· C语言 代码 · 共 943 行 · 第 1/2 页

C
943
字号
				if (def_menu->list) {					indent += 2;					build_conf(def_menu);					indent -= 2;				}			} else				cprint_done();			return;		}		cprint_done();	} else {		if (menu == current_menu) {			cprint(":%p", menu);			cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));			goto conf_childs;		}		child_count++;		val = sym_get_tristate_value(sym);		if (sym_is_choice_value(sym) && val == yes) {			cprint(":%p", menu);			cprint1("   ");		} else {			switch (type) {			case S_BOOLEAN:				cprint("t%p", menu);				if (sym_is_changable(sym))					cprint1("[%c]", val == no ? ' ' : '*');				else					cprint1("---");				break;			case S_TRISTATE:				cprint("t%p", menu);				switch (val) {				case yes: ch = '*'; break;				case mod: ch = 'M'; break;				default:  ch = ' '; break;				}				if (sym_is_changable(sym))					cprint1("<%c>", ch);				else					cprint1("---");				break;			default:				cprint("s%p", menu);				tmp = cprint1("(%s)", sym_get_string_value(sym));				tmp = indent - tmp + 4;				if (tmp < 0)					tmp = 0;				cprint1("%*c%s%s", tmp, ' ', menu_get_prompt(menu),					(sym_has_value(sym) || !sym_is_changable(sym)) ?					"" : " (NEW)");				cprint_done();				goto conf_childs;			}		}		cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),			(sym_has_value(sym) || !sym_is_changable(sym)) ?			"" : " (NEW)");		if (menu->prompt->type == P_MENU) {			cprint1("  --->");			cprint_done();			return;		}		cprint_done();	}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;	char active_entry[40];	int stat, type, i;	unlink("lxdialog.scrltmp");	active_entry[0] = 0;	while (1) {		cprint_init();		cprint("--title");		cprint("%s", prompt ? prompt : "Main Menu");		cprint("--menu");		cprint(menu_instructions);		cprint("%d", rows);		cprint("%d", cols);		cprint("%d", rows - 10);		cprint("%s", active_entry);		current_menu = menu;		build_conf(menu);		if (!child_count)			break;		if (menu == &rootmenu) {			cprint(":");			cprint("--- ");			cprint("L");			cprint("    Load an Alternate Configuration File");			cprint("S");			cprint("    Save Configuration to an Alternate File");		}		stat = exec_conf();		if (stat == 26) {			char *pattern;			if (!strlen(input_buf))				continue;			pattern = malloc(sizeof(char)*sizeof(input_buf));			if (pattern == NULL) {				perror("malloc");				continue;			}			for (i = 0; input_buf[i]; i++)				pattern[i] = toupper(input_buf[i]);			pattern[i] = '\0';			search_conf(pattern);			free(pattern);			continue;		}		if (stat < 0)			continue;		if (stat == 1 || stat == 255)			break;		type = input_buf[0];		if (!type)			continue;		for (i = 0; input_buf[i] && !isspace(input_buf[i]); i++)			;		if (i >= sizeof(active_entry))			i = sizeof(active_entry) - 1;		input_buf[i] = 0;		strcpy(active_entry, input_buf);		sym = NULL;		submenu = NULL;		if (sscanf(input_buf + 1, "%p", &submenu) == 1)			sym = submenu->sym;		switch (stat) {		case 0:			switch (type) {			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_readme();			break;		case 3:			if (type == '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 (type == 't')				sym_set_tristate_value(sym, no);			break;		case 5:			if (type == 't')				sym_set_tristate_value(sym, mod);			break;		case 6:			if (type == 't')				sym_toggle_tristate_value(sym);			else if (type == 'm')				conf(submenu);			break;		}	}}static void show_textbox(const char *title, const char *text, int r, int c){	int fd;	fd = creat(".help.tmp", 0777);	write(fd, text, strlen(text));	close(fd);	show_file(".help.tmp", title, r, c);	unlink(".help.tmp");}static void show_helptext(const char *title, const char *text){	show_textbox(title, text, rows, cols);}static void show_help(struct menu *menu){	const char *help;	char *helptext;	struct symbol *sym = menu->sym;	help = sym->help;	if (!help)		help = nohelp_text;	if (sym->name) {		helptext = malloc(strlen(sym->name) + strlen(help) + 16);		sprintf(helptext, "CONFIG_%s:\n\n%s", sym->name, help);		show_helptext(menu_get_prompt(menu), helptext);		free(helptext);	} else		show_helptext(menu_get_prompt(menu), help);}static void show_readme(void){	show_file("scripts/README.Menuconfig", NULL, rows, cols);}static void show_file(const char *filename, const char *title, int r, int c){	do {		cprint_init();		if (title) {			cprint("--title");			cprint("%s", title);		}		cprint("--textbox");		cprint("%s", filename);		cprint("%d", r);		cprint("%d", c);	} while (exec_conf() < 0);}static void conf_choice(struct menu *menu){	const char *prompt = menu_get_prompt(menu);	struct menu *child;	struct symbol *active;	int stat;	active = sym_get_choice_value(menu->sym);	while (1) {		cprint_init();		cprint("--title");		cprint("%s", prompt ? prompt : "Main Menu");		cprint("--radiolist");		cprint(radiolist_instructions);		cprint("15");		cprint("70");		cprint("6");		current_menu = menu;		for (child = menu->list; child; child = child->next) {			if (!menu_is_visible(child))				continue;			cprint("%p", child);			cprint("%s", menu_get_prompt(child));			if (child->sym == sym_get_choice_value(menu->sym))				cprint("ON");			else if (child->sym == active)				cprint("SELECTED");			else				cprint("OFF");		}		stat = exec_conf();		switch (stat) {		case 0:			if (sscanf(input_buf, "%p", &child) != 1)				break;			sym_set_tristate_value(child->sym, yes);			return;		case 1:			if (sscanf(input_buf, "%p", &child) == 1) {				show_help(child);				active = child->sym;			} else				show_help(menu);			break;		case 255:			return;		}	}}static void conf_string(struct menu *menu){	const char *prompt = menu_get_prompt(menu);	int stat;	while (1) {		cprint_init();		cprint("--title");		cprint("%s", prompt ? prompt : "Main Menu");		cprint("--inputbox");		switch (sym_get_type(menu->sym)) {		case S_INT:			cprint(inputbox_instructions_int);			break;		case S_HEX:			cprint(inputbox_instructions_hex);			break;		case S_STRING:			cprint(inputbox_instructions_string);			break;		default:			/* panic? */;		}		cprint("10");		cprint("75");		cprint("%s", sym_get_string_value(menu->sym));		stat = exec_conf();		switch (stat) {		case 0:			if (sym_set_string_value(menu->sym, input_buf))				return;			show_textbox(NULL, "You have made an invalid entry.", 5, 43);			break;		case 1:			show_help(menu);			break;		case 255:			return;		}	}}static void conf_load(void){	int stat;	while (1) {		cprint_init();		cprint("--inputbox");		cprint(load_config_text);		cprint("11");		cprint("55");		cprint("%s", filename);		stat = exec_conf();		switch(stat) {		case 0:			if (!input_buf[0])				return;			if (!conf_read(input_buf))				return;			show_textbox(NULL, "File does not exist!", 5, 38);			break;		case 1:			show_helptext("Load Alternate Configuration", load_config_help);			break;		case 255:			return;		}	}}static void conf_save(void){	int stat;	while (1) {		cprint_init();		cprint("--inputbox");		cprint(save_config_text);		cprint("11");		cprint("55");		cprint("%s", filename);		stat = exec_conf();		switch(stat) {		case 0:			if (!input_buf[0])				return;			if (!conf_write(input_buf))				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 255:			return;		}	}}static void conf_cleanup(void){	tcsetattr(1, TCSAFLUSH, &ios_org);	unlink(".help.tmp");	unlink("lxdialog.scrltmp");}int main(int ac, char **av){	struct symbol *sym;	char *mode;	int stat;	conf_parse(av[1]);	conf_read(NULL);	sym = sym_lookup("KERNELRELEASE", 0);	sym_calc_value(sym);	sprintf(menu_backtitle, "Linux Kernel v%s Configuration",		sym_get_string_value(sym));	mode = getenv("MENUCONFIG_MODE");	if (mode) {		if (!strcasecmp(mode, "single_menu"))			single_menu_mode = 1;	}	tcgetattr(1, &ios_org);	atexit(conf_cleanup);	init_wsize();	conf(&rootmenu);	do {		cprint_init();		cprint("--yesno");		cprint("Do you wish to save your new kernel configuration?");		cprint("5");		cprint("60");		stat = exec_conf();	} while (stat < 0);	if (stat == 0) {		if (conf_write(NULL)) {			fprintf(stderr, "\n\n"				"Error during writing of the kernel configuration.\n"				"Your kernel configuration changes were NOT saved."				"\n\n");			return 1;		}		printf("\n\n"			"*** End of Linux kernel configuration.\n"			"*** Execute 'make' to build the kernel or try 'make help'."			"\n\n");	} else {		fprintf(stderr, "\n\n"			"Your kernel configuration changes were NOT saved."			"\n\n");	}	return 0;}

⌨️ 快捷键说明

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