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 + -
显示快捷键?