[PATCH] scripts: kconfig: implement a sort method

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



With a growing amount of Kernel configuration, it's
getting ever more difficult to find anything on
menuconfig. Because of that, implement mergesort for
kconfig to make it a little easier for anybody
building kernels.

Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx>
---
 scripts/kconfig/lxdialog/menubox.c | 18 +++++----
 scripts/kconfig/mconf.c            | 83 +++++++++++++++++++++++++++++++++++---
 2 files changed, 89 insertions(+), 12 deletions(-)

diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c
index 11ae9ad7ac7b..d6cc04db6e60 100644
--- a/scripts/kconfig/lxdialog/menubox.c
+++ b/scripts/kconfig/lxdialog/menubox.c
@@ -162,6 +162,7 @@ static void print_buttons(WINDOW * win, int height, int width, int selected)
 	print_button(win, gettext(" Help "), y, x + 24, selected == 2);
 	print_button(win, gettext(" Save "), y, x + 36, selected == 3);
 	print_button(win, gettext(" Load "), y, x + 48, selected == 4);
+	print_button(win, gettext(" Sort "), y, x + 60, selected == 5);
 
 	wmove(win, y, x + 1 + 12 * selected);
 	wrefresh(win);
@@ -375,7 +376,7 @@ int dialog_menu(const char *title, const char *prompt,
 		case TAB:
 		case KEY_RIGHT:
 			button = ((key == KEY_LEFT ? --button : ++button) < 0)
-			    ? 4 : (button > 4 ? 0 : button);
+			    ? 5 : (button > 5 ? 0 : button);
 
 			print_buttons(dialog, height, width, button);
 			wrefresh(menu);
@@ -390,6 +391,7 @@ int dialog_menu(const char *title, const char *prompt,
 		case '?':
 		case 'z':
 		case '\n':
+		case '.':
 			/* save scroll info */
 			*s_scroll = scroll;
 			delwin(menu);
@@ -400,19 +402,21 @@ int dialog_menu(const char *title, const char *prompt,
 			case 'h':
 			case '?':
 				return 2;
+			case '.':
+				return 5;
 			case 's':
 			case 'y':
-				return 5;
-			case 'n':
 				return 6;
-			case 'm':
+			case 'n':
 				return 7;
-			case ' ':
+			case 'm':
 				return 8;
-			case '/':
+			case ' ':
 				return 9;
-			case 'z':
+			case '/':
 				return 10;
+			case 'z':
+				return 11;
 			case '\n':
 				return button;
 			}
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 315ce2c7cb9d..c4a2eb561be4 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -642,6 +642,75 @@ static void build_conf(struct menu *menu)
 	indent -= doint;
 }
 
+static int less(struct menu *a, struct menu *b)
+{
+	const char *s1 = _(menu_get_prompt(a));
+	const char *s2 = _(menu_get_prompt(b));
+
+	if (!s1)
+		return 1;
+
+	if (!s2)
+		return 0;
+
+	return strcmp(s1, s2) < 0;
+}
+
+static struct menu *merge(struct menu *a, struct menu *b)
+{
+	struct menu head;
+	struct menu *c = &head;
+
+	while (a && b) {
+		if (less(a, b)) {
+			c->next = a;
+			c = a;
+			a = a->next;
+		} else {
+			c->next = b;
+			c = b;
+			b = b->next;
+		}
+	}
+
+	c->next = a ? a : b;
+
+	return head.next;
+}
+
+static struct menu *mergesort(struct menu *c)
+{
+	struct menu *a;
+	struct menu *b;
+
+	if (!c)
+		return c;
+
+	if (c->list)
+		c->list =  mergesort(c->list);
+
+	if (!c->next)
+		return c;
+
+	a = c;
+	b = c->next;
+
+	while (b && b->next) {
+		c = c->next;
+		b = b->next->next;
+	}
+
+	b = c->next;
+	c->next = NULL;
+
+	return merge(mergesort(a), mergesort(b));
+}
+
+static struct menu *sort_conf(void)
+{
+	return mergesort(&rootmenu);
+}
+
 static void conf(struct menu *menu, struct menu *active_menu)
 {
 	struct menu *submenu;
@@ -668,6 +737,7 @@ static void conf(struct menu *menu, struct menu *active_menu)
 		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
 				  _(menu_instructions),
 				  active_menu, &s_scroll);
+
 		if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
 			break;
 		if (item_count() != 0) {
@@ -720,6 +790,9 @@ static void conf(struct menu *menu, struct menu *active_menu)
 			conf_load();
 			break;
 		case 5:
+			sort_conf();
+			break;
+		case 6:
 			if (item_is_tag('t')) {
 				if (sym_set_tristate_value(sym, yes))
 					break;
@@ -727,24 +800,24 @@ static void conf(struct menu *menu, struct menu *active_menu)
 					show_textbox(NULL, setmod_text, 6, 74);
 			}
 			break;
-		case 6:
+		case 7:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, no);
 			break;
-		case 7:
+		case 8:
 			if (item_is_tag('t'))
 				sym_set_tristate_value(sym, mod);
 			break;
-		case 8:
+		case 9:
 			if (item_is_tag('t'))
 				sym_toggle_tristate_value(sym);
 			else if (item_is_tag('m'))
 				conf(submenu, NULL);
 			break;
-		case 9:
+		case 10:
 			search_conf();
 			break;
-		case 10:
+		case 11:
 			show_all_options = !show_all_options;
 			break;
 		}
-- 
2.11.0.295.gd7dffce1ce

--
To unsubscribe from this list: send the line "unsubscribe linux-kbuild" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux&nblp;USB Development]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite Secrets]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux