📄 mconf.c
字号:
sym_arr = sym_re_search(input_buf); res = get_relations_str(sym_arr); free(sym_arr); show_textbox(_("Search Results"), str_get(&res), 0, 0); str_free(&res);}static void build_conf(struct menu *menu){ struct symbol *sym; struct property *prop; struct menu *child; int type, tmp, doint = 2; tristate val; char ch; if (!menu_is_visible(menu)) return; sym = menu->sym; prop = menu->prompt; if (!sym) { if (prop && menu != current_menu) { const char *prompt = menu_get_prompt(menu); switch (prop->type) { case P_MENU: child_count++; cprint("m%p", menu); if (single_menu_mode) { cprint1("%s%*c%s", menu->data ? "-->" : "++>", indent + 1, ' ', prompt); } else cprint1(" %*c%s --->", indent + 1, ' ', prompt); cprint_done(); if (single_menu_mode && menu->data) goto conf_childs; return; default: if (prompt) { child_count++; cprint(":%p", menu); cprint("---%*c%s", indent + 1, ' ', prompt); } } } 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)) { cprint("t%p", menu); switch (type) { case S_BOOLEAN: cprint1("[%c]", val == no ? ' ' : '*'); break; case S_TRISTATE: switch (val) { case yes: ch = '*'; break; case mod: ch = 'M'; break; default: ch = ' '; break; } cprint1("<%c>", ch); break; } } else { cprint("%c%p", def_menu ? 't' : ':', menu); cprint1(" "); } cprint1("%*c%s", indent + 1, ' ', menu_get_prompt(menu)); if (val == yes) { if (def_menu) { cprint1(" (%s)", menu_get_prompt(def_menu)); cprint1(" --->"); cprint_done(); 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 < 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_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, "CONFIG_%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){ do { cprint_init(); if (title) { cprint("--title"); cprint("%s", title); } cprint("--textbox"); cprint("%s", filename); cprint("%d", r ? r : rows); cprint("%d", c ? c : cols); } 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; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); conf_parse(av[1]); conf_read(NULL); sym = sym_lookup("KERNELVERSION", 0); sym_calc_value(sym); sprintf(menu_backtitle, _("BusyBox %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 busybox 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 busybox configuration.\n" "Your busybox configuration changes were NOT saved." "\n\n")); return 1; } printf(_("\n\n" "*** End of busybox configuration.\n" "*** Execute 'make' to build busybox or try 'make help'." "\n\n")); } else { fprintf(stderr, _("\n\n" "Your busybox configuration changes were NOT saved." "\n\n")); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -