diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-14 20:21:18 -0800 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-01-14 20:21:18 -0800 |
commit | ec6d84c7ef684a0b85d15c50dadef9a039574d03 (patch) | |
tree | 09ca81e4358f95d7ef7c3378e76c112c51b18c20 /scripts | |
parent | f1707e2da28f0799cabfef2af47c3af0789cfffa (diff) | |
parent | 7a81787b813bc78a43d7bb76fe1d57d0d552873d (diff) | |
download | history-ec6d84c7ef684a0b85d15c50dadef9a039574d03.tar.gz |
Merge bk://linux-sam.bkbits.net/kconfig
into ppc970.osdl.org:/home/torvalds/v2.6/linux
Diffstat (limited to 'scripts')
-rw-r--r-- | scripts/README.Menuconfig | 201 | ||||
-rw-r--r-- | scripts/kconfig/expr.c | 10 | ||||
-rw-r--r-- | scripts/kconfig/expr.h | 2 | ||||
-rw-r--r-- | scripts/kconfig/lkc.h | 13 | ||||
-rw-r--r-- | scripts/kconfig/lkc_proto.h | 1 | ||||
-rw-r--r-- | scripts/kconfig/mconf.c | 446 | ||||
-rw-r--r-- | scripts/kconfig/menu.c | 40 | ||||
-rw-r--r-- | scripts/kconfig/symbol.c | 38 | ||||
-rw-r--r-- | scripts/kconfig/util.c | 109 | ||||
-rw-r--r-- | scripts/kconfig/zconf.tab.c_shipped | 1 | ||||
-rw-r--r-- | scripts/kconfig/zconf.y | 1 | ||||
-rw-r--r-- | scripts/lxdialog/menubox.c | 11 |
12 files changed, 474 insertions, 399 deletions
diff --git a/scripts/README.Menuconfig b/scripts/README.Menuconfig deleted file mode 100644 index 89ec0f24e14f2a..00000000000000 --- a/scripts/README.Menuconfig +++ /dev/null @@ -1,201 +0,0 @@ -Menuconfig gives the Linux kernel configuration a long needed face -lift. Featuring text based color menus and dialogs, it does not -require X Windows (however, you need ncurses in order to use it). -With this utility you can easily select a kernel option to modify -without sifting through 100 other options. - -Overview --------- -Some kernel features may be built directly into the kernel. -Some may be made into loadable runtime modules. Some features -may be completely removed altogether. There are also certain -kernel parameters which are not really features, but must be -entered in as decimal or hexadecimal numbers or possibly text. - -Menu items beginning with [*], <M> or [ ] represent features -configured to be built in, modularized or removed respectively. -Pointed brackets <> represent module capable features. - more... - -To change any of these features, highlight it with the cursor -keys and press <Y> to build it in, <M> to make it a module or -<N> to removed it. You may also press the <Space Bar> to cycle -through the available options (ie. Y->N->M->Y). - -Items beginning with numbers or other text within parenthesis can -be changed by highlighting the item and pressing <Enter>. Then -enter the new parameter into the dialog box that pops up. - - -Some additional keyboard hints: - -Menus ----------- -o Use the Up/Down arrow keys (cursor keys) to highlight the item - you wish to change or submenu wish to select and press <Enter>. - Submenus are designated by "--->". - - Shortcut: Press the option's highlighted letter (hotkey). - Pressing a hotkey more than once will sequence - through all visible items which use that hotkey. - - You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll - unseen options into view. - -o To exit a menu use the cursor keys to highlight the <Exit> button - and press <ENTER>. - - Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey - using those letters. You may press a single <ESC>, but - there is a delayed response which you may find annoying. - - Also, the <TAB> and cursor keys will cycle between <Select>, - <Exit> and <Help> - -o To get help with an item, use the cursor keys to highlight <Help> - and Press <ENTER>. - - Shortcut: Press <H> or <?>. - - -Radiolists (Choice lists) ------------ -o Use the cursor keys to select the option you wish to set and press - <S> or the <SPACE BAR>. - - Shortcut: Press the first letter of the option you wish to set then - press <S> or <SPACE BAR>. - -o To see available help for the item, use the cursor keys to highlight - <Help> and Press <ENTER>. - - Shortcut: Press <H> or <?>. - - Also, the <TAB> and cursor keys will cycle between <Select> and - <Help> - - -Data Entry ------------ -o Enter the requested information and press <ENTER> - If you are entering hexadecimal values, it is not necessary to - add the '0x' prefix to the entry. - -o For help, use the <TAB> or cursor keys to highlight the help option - and press <ENTER>. You can try <TAB><H> as well. - - -Text Box (Help Window) --------- -o Use the cursor keys to scroll up/down/left/right. The VI editor - keys h,j,k,l function here as do <SPACE BAR> and <B> for those - who are familiar with less and lynx. - -o Press <E>, <X>, <Enter> or <Esc><Esc> to exit. - - -Final Acceptance ----------------- -With the exception of the old style sound configuration, -YOUR CHANGES ARE NOT FINAL. You will be given a last chance to -confirm them prior to exiting Menuconfig. - -If Menuconfig quits with an error while saving your configuration, -you may look in the file /usr/src/linux/.menuconfig.log for -information which may help you determine the cause. - -Alternate Configuration Files ------------------------------ -Menuconfig supports the use of alternate configuration files for -those who, for various reasons, find it necessary to switch -between different kernel configurations. - -At the end of the main menu you will find two options. One is -for saving the current configuration to a file of your choosing. -The other option is for loading a previously saved alternate -configuration. - -Even if you don't use alternate configuration files, but you -find during a Menuconfig session that you have completely messed -up your settings, you may use the "Load Alternate..." option to -restore your previously saved settings from ".config" without -restarting Menuconfig. - -Other information ------------------ -The windowing utility, lxdialog, will only be rebuilt if your kernel -source tree is fresh, or changes are patched into it via a kernel -patch or you do 'make mrproper'. If changes to lxdialog are patched -in, most likely the rebuild time will be short. You may force a -complete rebuild of lxdialog by changing to its directory and doing -'make clean all' - -If you use Menuconfig in an XTERM window make sure you have your -$TERM variable set to point to a xterm definition which supports color. -Otherwise, Menuconfig will look rather bad. Menuconfig will not -display correctly in a RXVT window because rxvt displays only one -intensity of color, bright. - -Menuconfig will display larger menus on screens or xterms which are -set to display more than the standard 25 row by 80 column geometry. -In order for this to work, the "stty size" command must be able to -display the screen's current row and column geometry. I STRONGLY -RECOMMEND that you make sure you do NOT have the shell variables -LINES and COLUMNS exported into your environment. Some distributions -export those variables via /etc/profile. Some ncurses programs can -become confused when those variables (LINES & COLUMNS) don't reflect -the true screen size. - - -NOTICE: lxdialog requires the ncurses libraries to compile. If you - don't already have ncurses you really should get it. - - The makefile for lxdialog attempts to find your ncurses - header file. Although it should find the header for older - versions of ncurses, it is probably a good idea to get the - latest ncurses anyway. - - If you have upgraded your ncurses libraries, MAKE SURE you - remove the old ncurses header files. If you don't you - will most certainly get a segmentation fault. - -WARNING: It is not recommended that you change any defines in - lxdialog's header files. If you have a grayscale display and - are brave, you may tinker with color.h to tune the colors to - your preference. - -COMPATIBILITY ISSUE: - There have been some compatibility problems reported with - older versions of bash and sed. I am trying to work these - out but it is preferable that you upgrade those utilities. - - -******** IMPORTANT, OPTIONAL ALTERNATE PERSONALITY AVAILABLE ******** -******** ******** -If you prefer to have all of the kernel options listed in a single -menu, rather than the default multimenu hierarchy, run the menuconfig -with MENUCONFIG_MODE environment variable set to single_menu. Example: - -make menuconfig MENUCONFIG_MODE=single_menu - -<Enter> will then unroll the appropriate category, or enfold it if it -is already unrolled. - -Note that this mode can eventually be a little more CPU expensive -(especially with a larger number of unrolled categories) than the -default mode. -********************************************************************* - - -Propaganda ----------- -The windowing support utility (lxdialog) is a VERY modified version of -the dialog utility by Savio Lam <lam836@cs.cuhk.hk>. Although lxdialog -is significantly different from dialog, I have left Savio's copyrights -intact. Please DO NOT contact Savio with questions about lxdialog. -He will not be able to assist. - -William Roadcap was the original author of Menuconfig. -Michael Elizabeth Chastain <mec@shout.net> is the current maintainer. - -<END OF FILE> diff --git a/scripts/kconfig/expr.c b/scripts/kconfig/expr.c index 10f45232b4c716..30e4f9d69c2fbc 100644 --- a/scripts/kconfig/expr.c +++ b/scripts/kconfig/expr.c @@ -1087,3 +1087,13 @@ void expr_fprint(struct expr *e, FILE *out) { expr_print(e, expr_print_file_helper, out, E_NONE); } + +static void expr_print_gstr_helper(void *data, const char *str) +{ + str_append((struct gstr*)data, str); +} + +void expr_gstr_print(struct expr *e, struct gstr *gs) +{ + expr_print(e, expr_print_gstr_helper, gs, E_NONE); +} diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index cac51f6a86e843..7d39ff43e6e1fa 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -174,6 +174,8 @@ void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, s struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); void expr_fprint(struct expr *e, FILE *out); +struct gstr; /* forward */ +void expr_gstr_print(struct expr *e, struct gstr *gs); static inline int expr_is_yes(struct expr *e) { diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index e348ee7d86a54d..b8a67fc9d6476d 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -56,9 +56,22 @@ void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep); void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); void menu_finalize(struct menu *parent); void menu_set_type(int type); + +/* util.c */ struct file *file_lookup(const char *name); int file_write_dep(const char *name); +struct gstr { + size_t len; + char *s; +}; +struct gstr str_new(void); +struct gstr str_assign(const char *s); +void str_free(struct gstr *gs); +void str_append(struct gstr *gs, const char *s); +void str_printf(struct gstr *gs, const char *fmt, ...); +const char *str_get(struct gstr *gs); + /* symbol.c */ void sym_init(void); void sym_clear_all_valid(void); diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index 97c79178ee3d9e..6dc6d0c48e7ac8 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -18,6 +18,7 @@ P(sym_change_count,int,); P(sym_lookup,struct symbol *,(const char *name, int isconst)); P(sym_find,struct symbol *,(const char *name)); +P(sym_re_search,struct symbol **,(const char *pattern)); P(sym_type_name,const char *,(enum symbol_type type)); P(sym_calc_value,void,(struct symbol *sym)); P(sym_get_type,enum symbol_type,(struct symbol *sym)); diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 995f800b1bd0d3..730d316fe7fe89 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -18,13 +18,146 @@ #include <string.h> #include <termios.h> #include <unistd.h> -#include <regex.h> #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 [*], <M> 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 <Y> to build it in, <M> to make it a module or\n" +"<N> to removed it. You may also press the <Space Bar> 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 <Enter>.\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 <PAGE UP> and <PAGE DOWN> keys to scroll\n" +" unseen options into view.\n" +"\n" +"o To exit a menu use the cursor keys to highlight the <Exit> button\n" +" and press <ENTER>.\n" +"\n" +" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n" +" using those letters. You may press a single <ESC>, but\n" +" there is a delayed response which you may find annoying.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select>,\n" +" <Exit> and <Help>\n" +"\n" +"o To get help with an item, use the cursor keys to highlight <Help>\n" +" and Press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +"\n" +"Radiolists (Choice lists)\n" +"-----------\n" +"o Use the cursor keys to select the option you wish to set and press\n" +" <S> or the <SPACE BAR>.\n" +"\n" +" Shortcut: Press the first letter of the option you wish to set then\n" +" press <S> or <SPACE BAR>.\n" +"\n" +"o To see available help for the item, use the cursor keys to highlight\n" +" <Help> and Press <ENTER>.\n" +"\n" +" Shortcut: Press <H> or <?>.\n" +"\n" +" Also, the <TAB> and cursor keys will cycle between <Select> and\n" +" <Help>\n" +"\n" +"\n" +"Data Entry\n" +"-----------\n" +"o Enter the requested information and press <ENTER>\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 <TAB> or cursor keys to highlight the help option\n" +" and press <ENTER>. You can try <TAB><H> 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 <SPACE BAR> and <B> for those\n" +" who are familiar with less and lynx.\n" +"\n" +"o Press <E>, <X>, <Enter> or <Esc><Esc> 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" +"<Enter> 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. " "<Enter> selects submenus --->. " "Highlighted letters are hotkeys. " @@ -79,8 +212,45 @@ 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" -; + "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 (<choice> [=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]; @@ -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 : "<choice>", + 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) -{ - 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) +static void search_conf(void) { - 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); } diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index 7b26f982bad59f..0c13156f33441f 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -388,43 +388,3 @@ struct menu *menu_get_parent_menu(struct menu *menu) return menu; } -struct file *file_lookup(const char *name) -{ - struct file *file; - - for (file = file_list; file; file = file->next) { - if (!strcmp(name, file->name)) - return file; - } - - file = malloc(sizeof(*file)); - memset(file, 0, sizeof(*file)); - file->name = strdup(name); - file->next = file_list; - file_list = file; - return file; -} - -int file_write_dep(const char *name) -{ - struct file *file; - FILE *out; - - if (!name) - name = ".config.cmd"; - out = fopen("..config.tmp", "w"); - if (!out) - return 1; - fprintf(out, "deps_config := \\\n"); - for (file = file_list; file; file = file->next) { - if (file->next) - fprintf(out, "\t%s \\\n", file->name); - else - fprintf(out, "\t%s\n", file->name); - } - fprintf(out, "\n.config include/linux/autoconf.h: $(deps_config)\n\n$(deps_config):\n"); - fclose(out); - rename("..config.tmp", name); - return 0; -} - diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index dc35e0787a4f67..affa52f5c65136 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -6,6 +6,7 @@ #include <ctype.h> #include <stdlib.h> #include <string.h> +#include <regex.h> #include <sys/utsname.h> #define LKC_DIRECT_LINK @@ -656,6 +657,43 @@ struct symbol *sym_find(const char *name) return symbol; } +struct symbol **sym_re_search(const char *pattern) +{ + struct symbol *sym, **sym_arr = NULL; + int i, cnt, size; + regex_t re; + + cnt = size = 0; + /* Skip if empty */ + if (strlen(pattern) == 0) + return NULL; + if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) + return NULL; + + for_all_symbols(i, sym) { + if (sym->flags & SYMBOL_CONST || !sym->name) + continue; + if (regexec(&re, sym->name, 0, NULL, 0)) + continue; + if (cnt + 1 >= size) { + void *tmp = sym_arr; + size += 16; + sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); + if (!sym_arr) { + free(tmp); + return NULL; + } + } + sym_arr[cnt++] = sym; + } + if (sym_arr) + sym_arr[cnt] = NULL; + regfree(&re); + + return sym_arr; +} + + struct symbol *sym_check_deps(struct symbol *sym); static struct symbol *sym_check_expr_deps(struct expr *e) diff --git a/scripts/kconfig/util.c b/scripts/kconfig/util.c new file mode 100644 index 00000000000000..1fa4c0b801b34f --- /dev/null +++ b/scripts/kconfig/util.c @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org> + * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org> + * + * Released under the terms of the GNU GPL v2.0. + */ + +#include <string.h> +#include "lkc.h" + +/* file already present in list? If not add it */ +struct file *file_lookup(const char *name) +{ + struct file *file; + + for (file = file_list; file; file = file->next) { + if (!strcmp(name, file->name)) + return file; + } + + file = malloc(sizeof(*file)); + memset(file, 0, sizeof(*file)); + file->name = strdup(name); + file->next = file_list; + file_list = file; + return file; +} + +/* write a dependency file as used by kbuild to track dependencies */ +int file_write_dep(const char *name) +{ + struct file *file; + FILE *out; + + if (!name) + name = ".config.cmd"; + out = fopen("..config.tmp", "w"); + if (!out) + return 1; + fprintf(out, "deps_config := \\\n"); + for (file = file_list; file; file = file->next) { + if (file->next) + fprintf(out, "\t%s \\\n", file->name); + else + fprintf(out, "\t%s\n", file->name); + } + fprintf(out, "\n.config include/linux/autoconf.h: $(deps_config)\n\n$(deps_config):\n"); + fclose(out); + rename("..config.tmp", name); + return 0; +} + + +/* Allocate initial growable sting */ +struct gstr str_new(void) +{ + struct gstr gs; + gs.s = malloc(sizeof(char) * 64); + gs.len = 16; + strcpy(gs.s, "\0"); + return gs; +} + +/* Allocate and assign growable string */ +struct gstr str_assign(const char *s) +{ + struct gstr gs; + gs.s = strdup(s); + gs.len = strlen(s) + 1; + return gs; +} + +/* Free storage for growable string */ +void str_free(struct gstr *gs) +{ + if (gs->s) + free(gs->s); + gs->s = NULL; + gs->len = 0; +} + +/* Append to growable string */ +void str_append(struct gstr *gs, const char *s) +{ + size_t l = strlen(gs->s) + strlen(s) + 1; + if (l > gs->len) { + gs->s = realloc(gs->s, l); + gs->len = l; + } + strcat(gs->s, s); +} + +/* Append printf formatted string to growable string */ +void str_printf(struct gstr *gs, const char *fmt, ...) +{ + va_list ap; + char s[10000]; /* big enough... */ + va_start(ap, fmt); + vsnprintf(s, sizeof(s), fmt, ap); + str_append(gs, s); + va_end(ap); +} + +/* Retreive value of growable string */ +const char *str_get(struct gstr *gs) +{ + return gs->s; +} + diff --git a/scripts/kconfig/zconf.tab.c_shipped b/scripts/kconfig/zconf.tab.c_shipped index a48105a405bb77..f163d8d2d9ef2e 100644 --- a/scripts/kconfig/zconf.tab.c_shipped +++ b/scripts/kconfig/zconf.tab.c_shipped @@ -2121,6 +2121,7 @@ void zconfdump(FILE *out) } #include "lex.zconf.c" +#include "util.c" #include "confdata.c" #include "expr.c" #include "symbol.c" diff --git a/scripts/kconfig/zconf.y b/scripts/kconfig/zconf.y index aad1f51147656a..54460f8d3696b2 100644 --- a/scripts/kconfig/zconf.y +++ b/scripts/kconfig/zconf.y @@ -683,6 +683,7 @@ void zconfdump(FILE *out) } #include "lex.zconf.c" +#include "util.c" #include "confdata.c" #include "expr.c" #include "symbol.c" diff --git a/scripts/lxdialog/menubox.c b/scripts/lxdialog/menubox.c index 124459c043b54e..ce2a9905943140 100644 --- a/scripts/lxdialog/menubox.c +++ b/scripts/lxdialog/menubox.c @@ -276,15 +276,6 @@ dialog_menu (const char *title, const char *prompt, int height, int width, while (key != ESC) { key = wgetch(menu); - if ( key == '/' ) { - int ret = dialog_inputbox("Search Configuration Parameter", - "Enter Keyword", height, width, - (char *) NULL); - if (ret == 0) { - fprintf(stderr, "%s", dialog_input_result); - return 26; - } - } if (key < 256 && isalpha(key)) key = tolower(key); @@ -408,6 +399,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width, case 'y': case 'n': case 'm': + case '/': /* save scroll info */ if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { fprintf(f,"%d\n",scroll); @@ -421,6 +413,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width, case 'n': return 4; case 'm': return 5; case ' ': return 6; + case '/': return 7; } return 0; case 'h': |