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

📄 mconf.c

📁 這是一個實時嵌入式作業系統 實作了MCS51 ARM等MCU
💻 C
📖 第 1 页 / 共 2 页
字号:
			switch (prop->type) {			case P_MENU:				child_count++;				cmake();				cprint_tag("m%p", menu);				if (single_menu_mode) {					cprint_name("%s%*c%s",						menu->data ? "-->" : "++>",						indent + 1, ' ', prompt);				} else {					cprint_name("   %*c%s  --->", indent + 1, ' ', prompt);				}				if (single_menu_mode && menu->data)					goto conf_childs;				return;			default:				if (prompt) {					child_count++;					cmake();					cprint_tag(":%p", menu);					cprint_name("---%*c%s", indent + 1, ' ', prompt);				}			}		} else			doint = 0;		goto conf_childs;	}	cmake();	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)) {			cprint_tag("t%p", menu);			switch (type) {			case S_BOOLEAN:				cprint_name("[%c]", val == no ? ' ' : '*');				break;			case S_TRISTATE:				switch (val) {				case yes: ch = '*'; break;				case mod: ch = 'M'; break;				default:  ch = ' '; break;				}				cprint_name("<%c>", ch);				break;			}		} else {			cprint_tag("%c%p", def_menu ? 't' : ':', menu);			cprint_name("   ");		}		cprint_name("%*c%s", indent + 1, ' ', menu_get_prompt(menu));		if (val == yes) {			if (def_menu) {				cprint_name(" (%s)", menu_get_prompt(def_menu));				cprint_name("  --->");				if (def_menu->list) {					indent += 2;					build_conf(def_menu);					indent -= 2;				}			}			return;		}	} else {		if (menu == current_menu) {			cprint_tag(":%p", menu);			cprint_name("---%*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_tag(":%p", menu);			cprint_name("   ");		} else {			switch (type) {			case S_BOOLEAN:				cprint_tag("t%p", menu);				if (sym_is_changable(sym))					cprint_name("[%c]", val == no ? ' ' : '*');				else					cprint_name("---");				break;			case S_TRISTATE:				cprint_tag("t%p", menu);				switch (val) {				case yes: ch = '*'; break;				case mod: ch = 'M'; break;				default:  ch = ' '; break;				}				if (sym_is_changable(sym))					cprint_name("<%c>", ch);				else					cprint_name("---");				break;			default:				cprint_tag("s%p", menu);				tmp = cprint_name("(%s)", sym_get_string_value(sym));				tmp = indent - tmp + 4;				if (tmp < 0)					tmp = 0;				cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),					(sym_has_value(sym) || !sym_is_changable(sym)) ?					"" : " (NEW)");				goto conf_childs;			}		}		cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),			(sym_has_value(sym) || !sym_is_changable(sym)) ?			"" : " (NEW)");		if (menu->prompt->type == P_MENU) {			cprint_name("  --->");			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 dialog_list_item *active_item = NULL;	struct menu *submenu;	const char *prompt = menu_get_prompt(menu);	struct symbol *sym;	char active_entry[40];	int stat, type;	unlink("lxdialog.scrltmp");	active_entry[0] = 0;	while (1) {		indent = 0;		child_count = 0;		current_menu = menu;		cdone(); cinit();		build_conf(menu);		if (!child_count)			break;		if (menu == &rootmenu) {			cmake(); cprint_tag(":"); cprint_name("--- ");			cmake(); cprint_tag("L"); cprint_name("Load an Alternate Configuration File");			cmake(); cprint_tag("S"); cprint_name("Save Configuration to an Alternate File");		}		dialog_clear();		stat = dialog_menu(prompt ? prompt : "Main Menu",				menu_instructions, rows, cols, rows - 10,				active_entry, item_no, items);		if (stat < 0)			return;		if (stat == 1 || stat == 255)			break;		active_item = first_sel_item(item_no, items);		if (!active_item)			continue;		active_item->selected = 0;		strncpy(active_entry, active_item->tag, sizeof(active_entry));		active_entry[sizeof(active_entry)-1] = 0;		type = active_entry[0];		if (!type)			continue;		sym = NULL;		submenu = NULL;		if (sscanf(active_entry + 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_helptext("README", mconf_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;		case 7:			search_conf();			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, 0, 0);}static void show_help(struct menu *menu){	struct gstr help = str_new();	struct symbol *sym = menu->sym;	if (sym->help)	{		if (sym->name) {			str_printf(&help, "%s:\n\n", sym->name);			str_append(&help, sym->help);			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 show_file(const char *filename, const char *title, int r, int c){	while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0)		;}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) {		current_menu = menu;		cdone(); cinit();		for (child = menu->list; child; child = child->next) {			if (!menu_is_visible(child))				continue;			cmake();			cprint_tag("%p", child);			cprint_name("%s", menu_get_prompt(child));			if (child->sym == sym_get_choice_value(menu->sym))				items[item_no - 1]->selected = 1; /* ON */			else if (child->sym == active)				items[item_no - 1]->selected = 2; /* SELECTED */			else				items[item_no - 1]->selected = 0; /* OFF */		}		switch (dialog_checklist(prompt ? prompt : "Main Menu",					radiolist_instructions, 15, 70, 6,					item_no, items, FLAG_RADIO)) {		case 0:			if (sscanf(first_sel_item(item_no, items)->tag, "%p", &child) != 1)				break;			sym_set_tristate_value(child->sym, yes);			return;		case 1:			if (sscanf(first_sel_item(item_no, items)->tag, "%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);	while (1) {		char *heading;		switch (sym_get_type(menu->sym)) {		case S_INT:			heading = (char *) inputbox_instructions_int;			break;		case S_HEX:			heading = (char *) inputbox_instructions_hex;			break;		case S_STRING:			heading = (char *) inputbox_instructions_string;			break;		default:			heading = "Internal mconf error!";			/* panic? */;		}		switch (dialog_inputbox(prompt ? prompt : "Main Menu",					heading, 10, 75,					sym_get_string_value(menu->sym))) {		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 255:			return;		}	}}static void conf_load(void){	while (1) {		switch (dialog_inputbox(NULL, load_config_text, 11, 55,					filename)) {		case 0:			if (!dialog_input_result[0])				return;			if (!conf_read(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 255:			return;		}	}}static void conf_save(void){	while (1) {		switch (dialog_inputbox(NULL, save_config_text, 11, 55,					filename)) {		case 0:			if (!dialog_input_result[0])				return;			if (!conf_write(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 255:			return;		}	}}static void conf_cleanup(void){	tcsetattr(1, TCSAFLUSH, &ios_org);	unlink(".help.tmp");}static void winch_handler(int sig){	struct winsize ws;	if (ioctl(1, TIOCGWINSZ, &ws) == -1) {		rows = 24;		cols = 80;	} else {		rows = ws.ws_row;		cols = ws.ws_col;	}	if (rows < 19 || cols < 80) {		end_dialog();		fprintf(stderr, "Your display is too small to run Menuconfig!\n");		fprintf(stderr, "It must be at least 19 lines by 80 columns.\n");		exit(1);	}	rows -= 4;	cols -= 5;}int main(int ac, char **av){	char *mode;	int stat;	conf_parse(av[1]);	conf_read(NULL);	snprintf(menu_backtitle, 128, "Buildroot Configuration");	mode = getenv("MENUCONFIG_MODE");	if (mode) {		if (!strcasecmp(mode, "single_menu"))			single_menu_mode = 1;	}	tcgetattr(1, &ios_org);	atexit(conf_cleanup);	init_wsize();	init_dialog();	signal(SIGWINCH, winch_handler);	conf(&rootmenu);	end_dialog();	/* Restart dialog to act more like when lxdialog was still separate */	init_dialog();	do {		stat = dialog_yesno(NULL,				    "Do you wish to save your new Buildroot configuration?", 5, 60);	} while (stat < 0);	end_dialog();	if (stat == 0) {		conf_write(NULL);		printf("\n\n"			"*** End of Buildroot configuration.\n"			"*** Check the top-level Makefile for additional configuration options.\n\n");	} else		printf("\n\nYour Buildroot configuration changes were NOT saved.\n\n");	return 0;}

⌨️ 快捷键说明

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