Skip to contentSkip to conversation

Menuconfig search changes - pt. 3

PATCH In review Yuval Turgeman 3 participants 8 messages Sep 3, 2004 – Sep 14, 2004 Kconfig

lore
Share & tools
lore
#0 lore raw

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
diff -uprN linux-2.6.8.1/scripts/kconfig/mconf.c linux/scripts/kconfig/mconf.c
@@ -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 *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 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_str
 		return;
 	}
 	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)
#1 lore raw

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 -0
 			while (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 -0
 			if (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

#2 lore raw
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->dep contains only temporary information. The real information is in prop->visible.expr.

Fixed that also...

Quoted 1 line

sym->dep doesn't contain user relevant information.

Fixed.

Quoted 3 lines

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.

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
#3 lore raw

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

#4 lore raw
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

#5 lore raw

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

#6 lore raw
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.

#7 lore raw

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