X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fkconfig%2Fmconf.c;h=730d316fe7fe8949788966015143ca0d2dcfdcca;hb=6a77f38946aaee1cd85eeec6cf4229b204c15071;hp=91789cc9d2af30da47c74df935fd90df920e48b9;hpb=87fc8d1bb10cd459024a742c6a10961fefcef18f;p=linux-2.6.git diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 91789cc9d..730d316fe 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -18,13 +18,146 @@ #include #include #include -#include #define LKC_DIRECT_LINK #include "lkc.h" static char menu_backtitle[128]; -static const char menu_instructions[] = +static const char mconf_readme[] = +"Overview\n" +"--------\n" +"Some kernel features may be built directly into the kernel.\n" +"Some may be made into loadable runtime modules. Some features\n" +"may be completely removed altogether. There are also certain\n" +"kernel parameters which are not really features, but must be\n" +"entered in as decimal or hexadecimal numbers or possibly text.\n" +"\n" +"Menu items beginning with [*], or [ ] represent features\n" +"configured to be built in, modularized or removed respectively.\n" +"Pointed brackets <> represent module capable features.\n" +"\n" +"To change any of these features, highlight it with the cursor\n" +"keys and press to build it in, to make it a module or\n" +" to removed it. You may also press the to cycle\n" +"through the available options (ie. Y->N->M->Y).\n" +"\n" +"Some additional keyboard hints:\n" +"\n" +"Menus\n" +"----------\n" +"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n" +" you wish to change or submenu wish to select and press .\n" +" Submenus are designated by \"--->\".\n" +"\n" +" Shortcut: Press the option's highlighted letter (hotkey).\n" +" Pressing a hotkey more than once will sequence\n" +" through all visible items which use that hotkey.\n" +"\n" +" You may also use the and keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the button\n" +" and press .\n" +"\n" +" Shortcut: Press or or if there is no hotkey\n" +" using those letters. You may press a single , but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the and cursor keys will cycle between and\n" +" \n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press \n" +" If you are entering hexadecimal values, it is not necessary to\n" +" add the '0x' prefix to the entry.\n" +"\n" +"o For help, use the or cursor keys to highlight the help option\n" +" and press . You can try as well.\n" +"\n" +"\n" +"Text Box (Help Window)\n" +"--------\n" +"o Use the cursor keys to scroll up/down/left/right. The VI editor\n" +" keys h,j,k,l function here as do and for those\n" +" who are familiar with less and lynx.\n" +"\n" +"o Press , , or to exit.\n" +"\n" +"\n" +"Alternate Configuration Files\n" +"-----------------------------\n" +"Menuconfig supports the use of alternate configuration files for\n" +"those who, for various reasons, find it necessary to switch\n" +"between different kernel configurations.\n" +"\n" +"At the end of the main menu you will find two options. One is\n" +"for saving the current configuration to a file of your choosing.\n" +"The other option is for loading a previously saved alternate\n" +"configuration.\n" +"\n" +"Even if you don't use alternate configuration files, but you\n" +"find during a Menuconfig session that you have completely messed\n" +"up your settings, you may use the \"Load Alternate...\" option to\n" +"restore your previously saved settings from \".config\" without\n" +"restarting Menuconfig.\n" +"\n" +"Other information\n" +"-----------------\n" +"If you use Menuconfig in an XTERM window make sure you have your\n" +"$TERM variable set to point to a xterm definition which supports color.\n" +"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n" +"display correctly in a RXVT window because rxvt displays only one\n" +"intensity of color, bright.\n" +"\n" +"Menuconfig will display larger menus on screens or xterms which are\n" +"set to display more than the standard 25 row by 80 column geometry.\n" +"In order for this to work, the \"stty size\" command must be able to\n" +"display the screen's current row and column geometry. I STRONGLY\n" +"RECOMMEND that you make sure you do NOT have the shell variables\n" +"LINES and COLUMNS exported into your environment. Some distributions\n" +"export those variables via /etc/profile. Some ncurses programs can\n" +"become confused when those variables (LINES & COLUMNS) don't reflect\n" +"the true screen size.\n" +"\n" +"Optional personality available\n" +"------------------------------\n" +"If you prefer to have all of the kernel options listed in a single\n" +"menu, rather than the default multimenu hierarchy, run the menuconfig\n" +"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n" +"\n" +"make MENUCONFIG_MODE=single_menu menuconfig\n" +"\n" +" will then unroll the appropriate category, or enfold it if it\n" +"is already unrolled.\n" +"\n" +"Note that this mode can eventually be a little more CPU expensive\n" +"(especially with a larger number of unrolled categories) than the\n" +"default mode.\n", +menu_instructions[] = "Arrow keys navigate the menu. " " selects submenus --->. " "Highlighted letters are hotkeys. " @@ -79,11 +212,48 @@ save_config_help[] = "configuration options you have selected at that time.\n" "\n" "If you are uncertain what all this means then you should probably\n" - "leave this blank.\n" -; - -static char buf[4096], *bufptr = buf; -static char input_buf[4096]; + "leave this blank.\n", +search_help[] = + "\n" + "Search for CONFIG_ symbols and display their relations.\n" + "Example: search for \"^FOO\"\n" + "Result:\n" + "-----------------------------------------------------------------\n" + "Symbol: FOO [=m]\n" + "Prompt: Foo bus is used to drive the bar HW\n" + "Defined at drivers/pci/Kconfig:47\n" + "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n" + "Location:\n" + " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n" + " -> PCI support (PCI [=y])\n" + " -> PCI access mode ( [=y])\n" + "Selects: LIBCRC32\n" + "Selected by: BAR\n" + "-----------------------------------------------------------------\n" + "o The line 'Prompt:' shows the text used in the menu structure for\n" + " this CONFIG_ symbol\n" + "o The 'Defined at' line tell at what file / line number the symbol\n" + " is defined\n" + "o The 'Depends on:' line tell what symbols needs to be defined for\n" + " this symbol to be visible in the menu (selectable)\n" + "o The 'Location:' lines tell where in the menu structure this symbol\n" + " is located\n" + " A location followed by a [=y] indicate that this is a selectable\n" + " menu item - and current value is displayed inside brackets.\n" + "o The 'Selects:' line tell what symbol will be automatically\n" + " selected if this symbol is selected (y or m)\n" + "o The 'Selected by' line tell what symbol has selected this symbol\n" + "\n" + "Only relevant lines are shown.\n" + "\n\n" + "Search examples:\n" + "Examples: USB => find all CONFIG_ symbols containing USB\n" + " ^USB => find all CONFIG_ symbols starting with USB\n" + " USB$ => find all CONFIG_ symbols ending with USB\n" + "\n"; + +static signed char buf[4096], *bufptr = buf; +static signed char input_buf[4096]; static char filename[PATH_MAX+1] = ".config"; static char *args[1024], **argptr = args; static int indent; @@ -102,11 +272,7 @@ static void conf_save(void); static void show_textbox(const char *title, const char *text, int r, int c); static void show_helptext(const char *title, const char *text); static void show_help(struct menu *menu); -static void show_readme(void); static void show_file(const char *filename, const char *title, int r, int c); -static void show_expr(struct menu *menu, FILE *fp); -static void search_conf(char *pattern); -static int regex_match(const char *string, regex_t *re); static void cprint_init(void); static int cprint1(const char *fmt, ...); @@ -196,6 +362,78 @@ static int cprint(const char *fmt, ...) return res; } +static void get_prompt_str(struct gstr *r, struct property *prop) +{ + int i, j; + struct menu *submenu[8], *menu; + + str_printf(r, "Prompt: %s\n", prop->text); + str_printf(r, " Defined at %s:%d\n", prop->menu->file->name, + prop->menu->lineno); + if (!expr_is_yes(prop->visible.expr)) { + str_append(r, " Depends on: "); + expr_gstr_print(prop->visible.expr, r); + str_append(r, "\n"); + } + menu = prop->menu->parent; + for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) + submenu[i++] = menu; + if (i > 0) { + str_printf(r, " Location:\n"); + for (j = 4; --i >= 0; j += 2) { + menu = submenu[i]; + str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu)); + if (menu->sym) { + str_printf(r, " (%s [=%s])", menu->sym->name ? + menu->sym->name : "", + sym_get_string_value(menu->sym)); + } + str_append(r, "\n"); + } + } +} + +static void get_symbol_str(struct gstr *r, struct symbol *sym) +{ + bool hit; + struct property *prop; + + str_printf(r, "Symbol: %s [=%s]\n", sym->name, + sym_get_string_value(sym)); + for_all_prompts(sym, prop) + get_prompt_str(r, prop); + hit = false; + for_all_properties(sym, prop, P_SELECT) { + if (!hit) { + str_append(r, " Selects: "); + hit = true; + } else + str_printf(r, " && "); + expr_gstr_print(prop->expr, r); + } + if (hit) + str_append(r, "\n"); + if (sym->rev_dep.expr) { + str_append(r, " Selected by: "); + expr_gstr_print(sym->rev_dep.expr, r); + str_append(r, "\n"); + } + str_append(r, "\n\n"); +} + +static struct gstr get_relations_str(struct symbol **sym_arr) +{ + struct symbol *sym; + struct gstr res = str_new(); + int i; + + for (i = 0; sym_arr && (sym = sym_arr[i]); i++) + get_symbol_str(&res, sym); + if (!i) + str_append(&res, "No matches found.\n"); + return res; +} + pid_t pid; static void winch_handler(int sig) @@ -279,112 +517,39 @@ static int exec_conf(void) return WEXITSTATUS(stat); } -static int regex_match(const char *string, regex_t *re) +static void search_conf(void) { - int rc; - - rc = regexec(re, string, (size_t) 0, NULL, 0); - if (rc) - return 0; - return 1; -} - -static void show_expr(struct menu *menu, FILE *fp) -{ - bool hit = false; - fprintf(fp, "Depends:\n "); - if (menu->prompt->visible.expr) { - if (!hit) - hit = true; - expr_fprint(menu->prompt->visible.expr, fp); - } - if (!hit) - fprintf(fp, "None"); - if (menu->sym) { - struct property *prop; - hit = false; - fprintf(fp, "\nSelects:\n "); - for_all_properties(menu->sym, prop, P_SELECT) { - if (!hit) - hit = true; - expr_fprint(prop->expr, fp); - } - if (!hit) - fprintf(fp, "None"); - hit = false; - fprintf(fp, "\nSelected by:\n "); - if (menu->sym->rev_dep.expr) { - hit = true; - expr_fprint(menu->sym->rev_dep.expr, fp); - } - if (!hit) - fprintf(fp, "None"); - } -} - -static void search_conf(char *pattern) -{ - struct symbol *sym = NULL; - struct menu *menu[32] = { 0 }; - struct property *prop = NULL; - FILE *fp = NULL; - bool hit = false; - int i, j, k, l; - regex_t re; - - if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB)) - return; - - fp = fopen(".search.tmp", "w"); - if (fp == NULL) { - perror("fopen"); + struct symbol **sym_arr; + int stat; + struct gstr res; + +again: + cprint_init(); + cprint("--title"); + cprint("Search Configuration Parameter"); + cprint("--inputbox"); + cprint("Enter Keyword"); + cprint("10"); + cprint("75"); + cprint(""); + stat = exec_conf(); + if (stat < 0) + goto again; + switch (stat) { + case 0: + break; + case 1: + show_helptext("Search Configuration", search_help); + goto again; + default: return; } - for_all_symbols(i, sym) { - if (!sym->name) - continue; - if (!regex_match(sym->name, &re)) - continue; - for_all_prompts(sym, prop) { - struct menu *submenu = prop->menu; - if (!submenu) - continue; - j = 0; - hit = false; - while (submenu) { - menu[j++] = submenu; - submenu = submenu->parent; - } - if (j > 0) { - if (!hit) - hit = true; - fprintf(fp, "%s (%s)\n", prop->text, sym->name); - fprintf(fp, "Location:\n"); - } - for (k = j-2, l=1; k > 0; k--, l++) { - const char *prompt = menu_get_prompt(menu[k]); - if (menu[k]->sym) - fprintf(fp, "%*c-> %s (%s)\n", - l, ' ', - prompt, - menu[k]->sym->name); - else - fprintf(fp, "%*c-> %s\n", - l, ' ', - prompt); - } - if (hit) { - show_expr(menu[0], fp); - fprintf(fp, "\n\n\n"); - } - } - } - if (!hit) - fprintf(fp, "No matches found."); - regfree(&re); - fclose(fp); - show_file(".search.tmp", "Search Results", rows, cols); - unlink(".search.tmp"); + + 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) @@ -576,23 +741,6 @@ static void conf(struct menu *menu) 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; @@ -645,7 +793,7 @@ static void conf(struct menu *menu) if (sym) show_help(submenu); else - show_readme(); + show_helptext("README", mconf_readme); break; case 3: if (type == 't') { @@ -669,6 +817,9 @@ static void conf(struct menu *menu) else if (type == 'm') conf(submenu); break; + case 7: + search_conf(); + break; } } } @@ -686,30 +837,27 @@ static void show_textbox(const char *title, const char *text, int r, int c) static void show_helptext(const char *title, const char *text) { - show_textbox(title, text, rows, cols); + show_textbox(title, text, 0, 0); } static void show_help(struct menu *menu) { - const char *help; - char *helptext; + struct gstr help = str_new(); 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); + 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) @@ -722,8 +870,8 @@ static void show_file(const char *filename, const char *title, int r, int c) } cprint("--textbox"); cprint("%s", filename); - cprint("%d", r); - cprint("%d", c); + cprint("%d", r ? r : rows); + cprint("%d", c ? c : cols); } while (exec_conf() < 0); }