Menuconfig search changes - pt. 3
PATCH 1/1 Menuconfig search changes - pt. 3
Changes -
The search results are indented.
Added "Selects" to the search results.
The patch is finally attached as inline text... :-) (Once again, this patch should be applied after Andrew's changes)
scripts/kconfig/mconf.c +98 -61
@@ -18,6 +18,7 @@#include <string.h> #include <termios.h> #include <unistd.h> +#include <regex.h> #define LKC_DIRECT_LINK #include "lkc.h"
@@ -102,7 +103,10 @@ static void show_textbox(const char *titstatic 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 *); +static int regex_match (const char *,char *);static void cprint_init (void );static int cprint1 (const char *fmt, ...);
@@ -275,33 +279,59 @@ static int exec_conf(void)return WEXITSTATUS (stat); } -static struct menu *do_search (struct menu *menu,struct symbol *sym) +static int regex_match (const char *string,char *pattern) { -struct menu *child, *ret; -/* Ignore invisible menus ? -if (!menu_is_visible(menu)) -return NULL; -*/ +regex_t re; +int rc; -if (menu->sym) { -if (menu->sym->name && !strcmp (menu->sym->name, sym->name)) -return menu; +if (regcomp (&re, pattern,REG_EXTENDED |REG_NOSUB )) +return 0 ; + rc =regexec (&re, string, (size_t )0 ,NULL ,0 ); +regfree (&re); +if (rc) +return 0 ; +return 1 ; +} + +static void show_expr (struct menu *menu,FILE *fp) +{ +bool hit = false; +fprintf (fp,"Depends:\n " ); +if (menu->dep) { +if (!hit) + hit = true; +expr_fprint (menu->dep, fp); + } +if (menu->sym && menu->sym->dep) { +if (!hit) + hit = true; +expr_fprint (menu->sym->dep, fp); } -for (child = menu->list; child; child = child->next) { - ret =do_search (child, sym); -if (ret) -return ret; +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" ); } -return NULL ; }static void search_conf (char *search_str) { -struct symbol *sym; +struct symbol *sym =NULL ;struct menu *menu[32 ] = {0 }; -int i, j, k; -FILE *fp; +struct property *prop =NULL ; +char *space =NULL ; +FILE *fp =NULL ;bool hit = false; +int i, j, k, l; fp =fopen (".search.tmp" ,"w" );if (fp ==NULL ) {
@@ -309,49 +339,59 @@ static void search_conf(char *search_strreturn ; } for_all_symbols(i, sym) { -if (sym->name &&strstr (sym->name, search_str)) { -struct menu *submenu =do_search (&rootmenu, sym); - +if (!sym->name) +continue ; +if (!regex_match (sym->name, search_str)) +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 (sym->prop && sym->prop->text) -fprintf (fp,"%s (%s)\n" , - sym->prop->text, sym->name); +if (!hit) + hit = true; +if (prop->text) +fprintf (fp,"%s (%s)\n" , prop->text, + sym->name);else fprintf (fp,"%s\n" , sym->name); +fprintf (fp,"Location:\n" ); } -for (k = j-2 ; k >0 ; k--) { -if (!hit) - hit = true; - submenu = menu[k]; -const char *prompt =menu_get_prompt (submenu); -if (submenu->sym) -fprintf (fp," -> %s (%s)\n" , - prompt, submenu->sym->name); + space = (char *)malloc (sizeof (char )*j); +if (space ==NULL ) { +perror ("malloc" ); +continue ; + } +memset (space,' ' , j); +for (k = j-2 , l=1 ; k >0 ; k--, l++) { +const char *prompt =menu_get_prompt (menu[k]); + space[l-1 ] =' ' ; + space[l] ='\0' ; +if (menu[k]->sym) +fprintf (fp,"%s-> %s (%s)\n" , + space, prompt, + menu[k]->sym->name);else -fprintf (fp," -> %s\n" , prompt); +fprintf (fp,"%s-> %s\n" , space, + prompt); + } +free (space); +if (hit) { +show_expr (menu[0 ], fp); +fprintf (fp,"\n\n\n" ); } -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 ); +show_file (".search.tmp" ,"Search Results" , rows, cols);unlink (".search.tmp" ); }
@@ -554,11 +594,9 @@ static void conf(struct menu *menu)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 ;
@@ -650,17 +688,7 @@ static void show_textbox(const char *tit fd =creat (".help.tmp" ,0777 );write (fd, text,strlen (text));close (fd); -do { -cprint_init (); -if (title) { -cprint ("--title" ); -cprint ("%s" , title); - } -cprint ("--textbox" ); -cprint (".help.tmp" ); -cprint ("%d" , r); -cprint ("%d" , c); - }while (exec_conf () <0 ); +show_file (".help.tmp" , title, r, c);unlink (".help.tmp" ); }
@@ -689,13 +717,22 @@ static void show_help(struct menu *menu)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 ("scripts/README.Menuconfig" ); -cprint ("%d" , rows); -cprint ("%d" , cols); - }while (exec_conf () ==-1 ); +cprint ("%s" , filename); +cprint ("%d" , r); +cprint ("%d" , c); + }while (exec_conf () <0 ); }static void conf_choice (struct menu *menu)
Hi,
Quoted 1 line · Yuval Turgeman
(Once again, this patch should be applied after Andrew's changes)
Please send a complete patch, it makes commenting on it easier.
scripts/kconfig/mconf.c static int exec_conf(void) · line 290
Quoted 4 lines
scripts/kconfig/mconf.c +4
-0+if (regcomp (&re, pattern,REG_EXTENDED |REG_NOSUB )) +return 0 ; + rc =regexec (&re, string, (size_t )0 ,NULL ,0 ); +regfree (&re);
You shouldn't compute the pattern at every search.
scripts/kconfig/mconf.c static int exec_conf(void) · line 304
Quoted 9 lines
scripts/kconfig/mconf.c +9
-0+static void show_expr (struct menu *menu,FILE *fp) +{ +bool hit = false; +fprintf (fp,"Depends:\n " ); +if (menu->dep) { +if (!hit) + hit = true; +expr_fprint (menu->dep, fp); + }
menu->dep contains only temporary information. The real information is in prop->visible.expr.
scripts/kconfig/mconf.c static int exec_conf(void) · line 309
Quoted 5 lines
scripts/kconfig/mconf.c +4
-0+if (menu->sym && menu->sym->dep) { +if (!hit) + hit = true; +expr_fprint (menu->sym->dep, fp); }
sym->dep doesn't contain user relevant information.
scripts/kconfig/mconf.c static int exec_conf(void) · line 320
Quoted 9 lines
scripts/kconfig/mconf.c +9
-0+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); + }
With this you print all selection with every menu entry.
You probably also want to print sym->rev_dep, which is used to calculate the selections for this symbol.
scripts/kconfig/mconf.c static void search_conf(char *search_str · line 355
Quoted 4 lines
scripts/kconfig/mconf.c +0
-0while (submenu) { menu[j++] = submenu; submenu = submenu->parent; }
This loop should stop when you find root_menu.
scripts/kconfig/mconf.c static void search_conf(char *search_str · line 363
Quoted 8 lines
scripts/kconfig/mconf.c +5
-0if (j >0 ) { +if (!hit) + hit = true; +if (prop->text) +fprintf (fp,"%s (%s)\n" , prop->text, + sym->name);else fprintf (fp,"%s\n" , sym->name);
This test isn't necessary, every prompt has a text.
scripts/kconfig/mconf.c static void search_conf(char *search_str · line 366
Quoted 1 line
scripts/kconfig/mconf.c +1
-0+ space = (char *)malloc (sizeof (char )*j);
This isn't necessary, just use "%*c" like the other indentations.
bye, Roman
Quoted 1 line · Roman Zippel
Please send a complete patch, it makes commenting on it easier.
Ok, will do.
Quoted 1 line
You shouldn't compute the pattern at every search.
You are correct, I fixed it.
Quoted 2 lines
menu->depcontains only temporary information. The real information is inprop->visible.expr.
Fixed that also...
Quoted 1 line
sym->depdoesn't contain user relevant information.
Fixed.
Quoted 3 lines
With this you print all selection with every menu entry.
You probably also want to printsym->rev_dep, which is used to calculate the selections for this symbol.
I wasn't really aware of rev_dep - very cool! Added a "Selected by" tag also.
Quoted 7 lines
Quoted 5 lines
while (submenu) { menu[j++] = submenu; submenu = submenu->parent; }This loop should stop when you find
root_menu.
It does stop when it gets to rootmenu (rootmenu's parent is NULL).
Quoted 11 lines
scripts/kconfig/mconf.c static void search_conf(char *search_str · line 363
Quoted 9 lines
if (j > 0) {scripts/kconfig/mconf.c +5
-0+if (!hit) + hit = true; +if (prop->text) +fprintf (fp,"%s (%s)\n" , prop->text, + sym->name);else fprintf (fp,"%s\n" , sym->name);This test isn't necessary, every prompt has a text.
Left overs from the old menu search. Removed.
Quoted 4 lines
Quoted 2 lines
+ space = (char*)malloc(sizeof(char)*j);
This isn't necessary, just use "%*c" like the other indentations.
Ok - I keep learning new stuff.... :) - Done also.
I'll submit a final patch against mm3 soon.
Thanks for the help!
Signature · 1 line
Yuval Turgeman
Hi,
Quoted 3 lines · Yuval Turgeman
Quoted 1 line
Please send a complete patch, it makes commenting on it easier.
Ok, will do.
Could you please resend one complete (logical) patch. Something I'd really like to see before merging this (besides other small fixes) is separating the search into a function, which returns the result in a NULL terminated, allocated array.
bye, Roman
Quoted 1 line · Roman Zippel
Could you please resend one complete (logical) patch.
I did - http://lkml.org/lkml/2004/9/4/155 (patch against mm3)
Quoted 3 lines
Something I'd really like to see before merging this (besides other small fixes) is separating the search into a function, which returns the result in a NULL terminated, allocated array.
I agree - exporting the search function to a seperate location in order to use it in other guis (the patch above only applies to mconf).
Thanks,
Yuval.
--
Yuval Turgeman
Hi,
Quoted 3 lines · Yuval Turgeman
Quoted 1 line
Could you please resend one complete (logical) patch.
I did - http://lkml.org/lkml/2004/9/4/155 (patch against mm3)
That's only one part of the patch, it's only arbitrary splitted, I need the merged patch to properly comment on it.
bye, Roman
Quoted 10 lines · Roman Zippel
Hi,
Quoted 3 lines · Yuval Turgeman
Quoted 1 line
Could you please resend one complete (logical) patch.
I did - http://lkml.org/lkml/2004/9/4/155 (patch against mm3)
That's only one part of the patch, it's only arbitrary splitted, I need the merged patch to properly comment on it.
Ok, the first patch was against 2.6.8.1 which was inserted to mm3 (along with Andrew's coding style modifications). The patch mentioned above is against mm3 (so there are 2 patches...)
Do you want a complete patch against 2.6.8.1 ? It could be arranged easily.
Thanks,
Yuval.
Hi,
Quoted 3 lines · Yuval Turgeman
Ok, the first patch was against 2.6.8.1 which was inserted to mm3 (along with Andrew's coding style modifications). The patch mentioned above is against mm3 (so there are 2 patches...)
There is no reason to keep these patches apart, the first one wasn't finished and it also wasn't logically separate from the second.
Quoted 1 line
Do you want a complete patch against 2.6.8.1 ? It could be arranged easily.
Yes, thanks.
bye, Roman