From: Yuval Turgeman I added the ability to search for parameters in make menuconfig (find a given parameter's location in the tree). You use '/' to invoke the feature. Signed-off-by: Andrew Morton --- 25-akpm/scripts/kconfig/mconf.c | 104 ++++++++++++++++++++++++++++++++++++- 25-akpm/scripts/lxdialog/menubox.c | 9 +++ 2 files changed, 112 insertions(+), 1 deletion(-) diff -puN scripts/kconfig/mconf.c~searching-for-parameters-in-make-menuconfig scripts/kconfig/mconf.c --- 25/scripts/kconfig/mconf.c~searching-for-parameters-in-make-menuconfig Tue Aug 31 15:55:45 2004 +++ 25-akpm/scripts/kconfig/mconf.c Tue Aug 31 15:56:45 2004 @@ -28,7 +28,7 @@ static const char menu_instructions[] = " selects submenus --->. " "Highlighted letters are hotkeys. " "Pressing includes, excludes, modularizes features. " - "Press to exit, for Help. " + "Press to exit, for Help, for Search. " "Legend: [*] built-in [ ] excluded module < > module capable", radiolist_instructions[] = "Use the arrow keys to navigate this window or " @@ -102,6 +102,7 @@ static void show_textbox(const char *tit static void show_helptext(const char *title, const char *text); static void show_help(struct menu *menu); static void show_readme(void); +static void search_conf(char *); static void cprint_init(void); static int cprint1(const char *fmt, ...); @@ -274,6 +275,88 @@ static int exec_conf(void) return WEXITSTATUS(stat); } +static struct menu *do_search(struct menu *menu, struct symbol *sym) +{ + struct menu *child, *ret; + /* Ignore invisible menus ? + if (!menu_is_visible(menu)) + return NULL; + */ + + if (menu->sym) { + if (menu->sym->name && !strcmp(menu->sym->name, sym->name)) + return menu; + } + for (child = menu->list; child; child = child->next) { + ret = do_search(child, sym); + if (ret) + return ret; + } + return NULL; +} + +static void search_conf(char *search_str) +{ + struct symbol *sym; + struct menu *menu[32] = { 0 }; + int i, j, k; + FILE *fp; + bool hit = false; + + fp = fopen(".search.tmp", "w"); + if (fp == NULL) { + perror("fopen"); + return; + } + for_all_symbols(i, sym) { + if (sym->name && strstr(sym->name, search_str)) { + struct menu *submenu = do_search(&rootmenu, sym); + + j = 0; + while (submenu) { + menu[j++] = submenu; + submenu = submenu->parent; + } + if (j > 0) { + if (sym->prop && sym->prop->text) + fprintf(fp, "%s (%s)\n", + sym->prop->text, sym->name); + else + fprintf(fp, "%s\n", sym->name); + } + for (k = j-2; k > 0; k--) { + const char *prompt; + + if (!hit) + hit = true; + submenu = menu[k]; + prompt = menu_get_prompt(submenu); + if (submenu->sym) + fprintf(fp, " -> %s (%s)\n", + prompt, submenu->sym->name); + else + fprintf(fp, " -> %s\n", prompt); + } + if (hit) + fprintf(fp, "\n"); + } + } + if (!hit) + fprintf(fp, "No matches found."); + fclose(fp); + + do { + cprint_init(); + cprint("--title"); + cprint("Search Results"); + cprint("--textbox"); + cprint(".search.tmp"); + cprint("%d", rows); + cprint("%d", cols); + } while (exec_conf() < 0); + unlink(".search.tmp"); +} + static void build_conf(struct menu *menu) { struct symbol *sym; @@ -463,6 +546,25 @@ static void conf(struct menu *menu) cprint(" Save Configuration to an Alternate File"); } stat = exec_conf(); + if (stat == 26) { + char *search_str; + + if (!strlen(input_buf)) + continue; + search_str = malloc(sizeof(char)*sizeof(input_buf)); + if (search_str == NULL) { + perror("malloc"); + continue; + } + /* Capitalizing the string */ + for (i = 0; input_buf[i]; i++) + search_str[i] = toupper(input_buf[i]); + search_str[i] = '\0'; + /* Searching and displaying all matches */ + search_conf(search_str); + free(search_str); + continue; + } if (stat < 0) continue; diff -puN scripts/lxdialog/menubox.c~searching-for-parameters-in-make-menuconfig scripts/lxdialog/menubox.c --- 25/scripts/lxdialog/menubox.c~searching-for-parameters-in-make-menuconfig Tue Aug 31 15:55:45 2004 +++ 25-akpm/scripts/lxdialog/menubox.c Tue Aug 31 15:55:45 2004 @@ -276,6 +276,15 @@ dialog_menu (const char *title, const ch 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); _