aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scripts/config/Makefile23
-rw-r--r--scripts/config/conf.c6
-rw-r--r--scripts/config/confdata.c6
-rw-r--r--scripts/config/expr.c10
-rw-r--r--scripts/config/expr.h2
-rw-r--r--scripts/config/lkc.h14
-rw-r--r--scripts/config/lkc_proto.h1
-rw-r--r--scripts/config/lxdialog/BIG.FAT.WARNING4
-rw-r--r--scripts/config/lxdialog/checklist.c (renamed from scripts/config/checklist.c)10
-rw-r--r--scripts/config/lxdialog/colors.h (renamed from scripts/config/colors.h)0
-rw-r--r--scripts/config/lxdialog/dialog.h (renamed from scripts/config/dialog.h)9
-rw-r--r--scripts/config/lxdialog/inputbox.c (renamed from scripts/config/inputbox.c)0
-rw-r--r--scripts/config/lxdialog/menubox.c (renamed from scripts/config/menubox.c)16
-rw-r--r--scripts/config/lxdialog/msgbox.c (renamed from scripts/config/msgbox.c)0
-rw-r--r--scripts/config/lxdialog/textbox.c (renamed from scripts/config/textbox.c)0
-rw-r--r--scripts/config/lxdialog/util.c375
-rw-r--r--scripts/config/lxdialog/yesno.c (renamed from scripts/config/yesno.c)0
-rw-r--r--scripts/config/mconf.c376
-rw-r--r--scripts/config/menu.c41
-rw-r--r--scripts/config/symbol.c40
-rw-r--r--scripts/config/util.c420
-rw-r--r--scripts/config/zconf.tab.c_shipped3
-rw-r--r--scripts/config/zconf.y3
23 files changed, 887 insertions, 472 deletions
diff --git a/scripts/config/Makefile b/scripts/config/Makefile
index c0b5b9d35..3c4669f8c 100644
--- a/scripts/config/Makefile
+++ b/scripts/config/Makefile
@@ -9,7 +9,11 @@ include $(top_builddir)/Rules.mak
9 9
10all: ncurses conf mconf 10all: ncurses conf mconf
11 11
12ifeq ($(shell uname),SunOS)
13LIBS = -lcurses
14else
12LIBS = -lncurses 15LIBS = -lncurses
16endif
13ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h)) 17ifeq (/usr/include/ncurses/ncurses.h, $(wildcard /usr/include/ncurses/ncurses.h))
14 HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>" 18 HOSTNCURSES += -I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"
15else 19else
@@ -32,14 +36,17 @@ endif
32endif 36endif
33endif 37endif
34 38
35CONF_SRC =conf.c 39CONF_SRC = conf.c
36MCONF_SRC =mconf.c checklist.c menubox.c textbox.c yesno.c inputbox.c util.c msgbox.c 40MCONF_SRC = mconf.c
37SHARED_SRC=zconf.tab.c 41LXD_SRC = lxdialog/checklist.c lxdialog/menubox.c lxdialog/textbox.c \
38SHARED_DEPS:=$(srcdir)/lkc.h $(srcdir)/lkc_proto.h \ 42 lxdialog/yesno.c lxdialog/inputbox.c lxdialog/util.c \
39 lkc_defs.h $(srcdir)/expr.h zconf.tab.h 43 lxdialog/msgbox.c
40CONF_OBJS =$(patsubst %.c,%.o, $(CONF_SRC)) 44SHARED_SRC = zconf.tab.c
41MCONF_OBJS=$(patsubst %.c,%.o, $(MCONF_SRC)) 45SHARED_DEPS := $(srcdir)/lkc.h $(srcdir)/lkc_proto.h \
42SHARED_OBJS=$(patsubst %.c,%.o, $(SHARED_SRC)) 46 lkc_defs.h $(srcdir)/expr.h zconf.tab.h
47CONF_OBJS = $(patsubst %.c,%.o, $(CONF_SRC))
48MCONF_OBJS = $(patsubst %.c,%.o, $(MCONF_SRC) $(LXD_SRC))
49SHARED_OBJS = $(patsubst %.c,%.o, $(SHARED_SRC))
43 50
44conf: $(CONF_OBJS) $(SHARED_OBJS) 51conf: $(CONF_OBJS) $(SHARED_OBJS)
45 $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@ 52 $(HOSTCC) $(NATIVE_LDFLAGS) $^ -o $@
diff --git a/scripts/config/conf.c b/scripts/config/conf.c
index 3b0c1c1b5..78c1af596 100644
--- a/scripts/config/conf.c
+++ b/scripts/config/conf.c
@@ -31,14 +31,14 @@ char *defconfig_file;
31static int indent = 1; 31static int indent = 1;
32static int valid_stdin = 1; 32static int valid_stdin = 1;
33static int conf_cnt; 33static int conf_cnt;
34static char line[128]; 34static signed char line[128];
35static struct menu *rootEntry; 35static struct menu *rootEntry;
36 36
37static char nohelp_text[] = "Sorry, no help available for this option yet.\n"; 37static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
38 38
39static void strip(char *str) 39static void strip(signed char *str)
40{ 40{
41 char *p = str; 41 signed char *p = str;
42 int l; 42 int l;
43 43
44 while ((isspace(*p))) 44 while ((isspace(*p)))
diff --git a/scripts/config/confdata.c b/scripts/config/confdata.c
index fd3a345e2..7b9000e84 100644
--- a/scripts/config/confdata.c
+++ b/scripts/config/confdata.c
@@ -23,10 +23,10 @@ const char *conf_confnames[] = {
23 NULL, 23 NULL,
24}; 24};
25 25
26static char *conf_expand_value(const char *in) 26static char *conf_expand_value(const signed char *in)
27{ 27{
28 struct symbol *sym; 28 struct symbol *sym;
29 const char *src; 29 const signed char *src;
30 static char res_value[SYMBOL_MAXLENGTH]; 30 static char res_value[SYMBOL_MAXLENGTH];
31 char *dst, name[SYMBOL_MAXLENGTH]; 31 char *dst, name[SYMBOL_MAXLENGTH];
32 32
@@ -287,7 +287,7 @@ int conf_write(const char *name)
287 } else 287 } else
288 basename = conf_def_filename; 288 basename = conf_def_filename;
289 289
290 sprintf(newname, "%s.tmpconfig.%d", dirname, getpid()); 290 sprintf(newname, "%s.tmpconfig.%d", dirname, (int)getpid());
291 out = fopen(newname, "w"); 291 out = fopen(newname, "w");
292 if (!out) 292 if (!out)
293 return 1; 293 return 1;
diff --git a/scripts/config/expr.c b/scripts/config/expr.c
index 10f45232b..30e4f9d69 100644
--- a/scripts/config/expr.c
+++ b/scripts/config/expr.c
@@ -1087,3 +1087,13 @@ void expr_fprint(struct expr *e, FILE *out)
1087{ 1087{
1088 expr_print(e, expr_print_file_helper, out, E_NONE); 1088 expr_print(e, expr_print_file_helper, out, E_NONE);
1089} 1089}
1090
1091static void expr_print_gstr_helper(void *data, const char *str)
1092{
1093 str_append((struct gstr*)data, str);
1094}
1095
1096void expr_gstr_print(struct expr *e, struct gstr *gs)
1097{
1098 expr_print(e, expr_print_gstr_helper, gs, E_NONE);
1099}
diff --git a/scripts/config/expr.h b/scripts/config/expr.h
index cac51f6a8..7d39ff43e 100644
--- a/scripts/config/expr.h
+++ b/scripts/config/expr.h
@@ -174,6 +174,8 @@ void expr_extract_eq(enum expr_type type, struct expr **ep, struct expr **ep1, s
174struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym); 174struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symbol *sym);
175 175
176void expr_fprint(struct expr *e, FILE *out); 176void expr_fprint(struct expr *e, FILE *out);
177struct gstr; /* forward */
178void expr_gstr_print(struct expr *e, struct gstr *gs);
177 179
178static inline int expr_is_yes(struct expr *e) 180static inline int expr_is_yes(struct expr *e)
179{ 181{
diff --git a/scripts/config/lkc.h b/scripts/config/lkc.h
index dd040f7a8..b8a67fc9d 100644
--- a/scripts/config/lkc.h
+++ b/scripts/config/lkc.h
@@ -56,11 +56,21 @@ void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
56void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep); 56void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
57void menu_finalize(struct menu *parent); 57void menu_finalize(struct menu *parent);
58void menu_set_type(int type); 58void menu_set_type(int type);
59
60/* util.c */
59struct file *file_lookup(const char *name); 61struct file *file_lookup(const char *name);
60int file_write_dep(const char *name); 62int file_write_dep(const char *name);
61 63
62extern struct menu *current_entry; 64struct gstr {
63extern struct menu *current_menu; 65 size_t len;
66 char *s;
67};
68struct gstr str_new(void);
69struct gstr str_assign(const char *s);
70void str_free(struct gstr *gs);
71void str_append(struct gstr *gs, const char *s);
72void str_printf(struct gstr *gs, const char *fmt, ...);
73const char *str_get(struct gstr *gs);
64 74
65/* symbol.c */ 75/* symbol.c */
66void sym_init(void); 76void sym_init(void);
diff --git a/scripts/config/lkc_proto.h b/scripts/config/lkc_proto.h
index 97c79178e..6dc6d0c48 100644
--- a/scripts/config/lkc_proto.h
+++ b/scripts/config/lkc_proto.h
@@ -18,6 +18,7 @@ P(sym_change_count,int,);
18 18
19P(sym_lookup,struct symbol *,(const char *name, int isconst)); 19P(sym_lookup,struct symbol *,(const char *name, int isconst));
20P(sym_find,struct symbol *,(const char *name)); 20P(sym_find,struct symbol *,(const char *name));
21P(sym_re_search,struct symbol **,(const char *pattern));
21P(sym_type_name,const char *,(enum symbol_type type)); 22P(sym_type_name,const char *,(enum symbol_type type));
22P(sym_calc_value,void,(struct symbol *sym)); 23P(sym_calc_value,void,(struct symbol *sym));
23P(sym_get_type,enum symbol_type,(struct symbol *sym)); 24P(sym_get_type,enum symbol_type,(struct symbol *sym));
diff --git a/scripts/config/lxdialog/BIG.FAT.WARNING b/scripts/config/lxdialog/BIG.FAT.WARNING
new file mode 100644
index 000000000..a8999d82b
--- /dev/null
+++ b/scripts/config/lxdialog/BIG.FAT.WARNING
@@ -0,0 +1,4 @@
1This is NOT the official version of dialog. This version has been
2significantly modified from the original. It is for use by the Linux
3kernel configuration script. Please do not bother Savio Lam with
4questions about this program.
diff --git a/scripts/config/checklist.c b/scripts/config/lxdialog/checklist.c
index 4dbd16616..71de4a191 100644
--- a/scripts/config/checklist.c
+++ b/scripts/config/lxdialog/checklist.c
@@ -120,7 +120,7 @@ int
120dialog_checklist (const char *title, const char *prompt, int height, int width, 120dialog_checklist (const char *title, const char *prompt, int height, int width,
121 int list_height, int item_no, struct dialog_list_item ** items, 121 int list_height, int item_no, struct dialog_list_item ** items,
122 int flag) 122 int flag)
123 123
124{ 124{
125 int i, x, y, box_x, box_y; 125 int i, x, y, box_x, box_y;
126 int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status; 126 int key = 0, button = 0, choice = 0, scroll = 0, max_choice, *status;
@@ -197,7 +197,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
197 197
198 /* Find length of longest item in order to center checklist */ 198 /* Find length of longest item in order to center checklist */
199 check_x = 0; 199 check_x = 0;
200 for (i = 0; i < item_no; i++) 200 for (i = 0; i < item_no; i++)
201 check_x = MAX (check_x, + strlen (items[i]->name) + 4); 201 check_x = MAX (check_x, + strlen (items[i]->name) + 4);
202 202
203 check_x = (list_width - check_x) / 2; 203 check_x = (list_width - check_x) / 2;
@@ -231,7 +231,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
231 break; 231 break;
232 232
233 233
234 if ( i < max_choice || key == KEY_UP || key == KEY_DOWN || 234 if ( i < max_choice || key == KEY_UP || key == KEY_DOWN ||
235 key == '+' || key == '-' ) { 235 key == '+' || key == '-' ) {
236 if (key == KEY_UP || key == '-') { 236 if (key == KEY_UP || key == '-') {
237 if (!choice) { 237 if (!choice) {
@@ -342,7 +342,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
342 } 342 }
343 wnoutrefresh (list); 343 wnoutrefresh (list);
344 wrefresh (dialog); 344 wrefresh (dialog);
345 345
346 for (i = 0; i < item_no; i++) { 346 for (i = 0; i < item_no; i++) {
347 items[i]->selected = status[i]; 347 items[i]->selected = status[i];
348 } 348 }
@@ -364,7 +364,7 @@ dialog_checklist (const char *title, const char *prompt, int height, int width,
364 /* Now, update everything... */ 364 /* Now, update everything... */
365 doupdate (); 365 doupdate ();
366 } 366 }
367 367
368 368
369 delwin (dialog); 369 delwin (dialog);
370 free (status); 370 free (status);
diff --git a/scripts/config/colors.h b/scripts/config/lxdialog/colors.h
index d34dd37c6..d34dd37c6 100644
--- a/scripts/config/colors.h
+++ b/scripts/config/lxdialog/colors.h
diff --git a/scripts/config/dialog.h b/scripts/config/lxdialog/dialog.h
index 6486cc8f7..7bab3ad0e 100644
--- a/scripts/config/dialog.h
+++ b/scripts/config/lxdialog/dialog.h
@@ -27,6 +27,9 @@
27#include <string.h> 27#include <string.h>
28 28
29#ifdef CURSES_LOC 29#ifdef CURSES_LOC
30#ifdef __sun__
31#define CURS_MACROS
32#endif
30#include CURSES_LOC 33#include CURSES_LOC
31 34
32/* 35/*
@@ -86,7 +89,7 @@
86#define ACS_DARROW 'v' 89#define ACS_DARROW 'v'
87#endif 90#endif
88 91
89/* 92/*
90 * Attribute names 93 * Attribute names
91 */ 94 */
92#define screen_attr attributes[0] 95#define screen_attr attributes[0]
@@ -130,7 +133,7 @@ extern bool use_colors;
130extern chtype attributes[]; 133extern chtype attributes[];
131#endif 134#endif
132 135
133extern char *backtitle; 136extern const char *backtitle;
134 137
135struct dialog_list_item { 138struct dialog_list_item {
136 char *name; 139 char *name;
@@ -162,7 +165,7 @@ int dialog_msgbox (const char *title, const char *prompt, int height,
162 int width, int pause); 165 int width, int pause);
163int dialog_textbox (const char *title, const char *file, int height, int width); 166int dialog_textbox (const char *title, const char *file, int height, int width);
164int dialog_menu (const char *title, const char *prompt, int height, int width, 167int dialog_menu (const char *title, const char *prompt, int height, int width,
165 int menu_height, const char *choice, int item_no, 168 int menu_height, const char *choice, int item_no,
166 struct dialog_list_item ** items); 169 struct dialog_list_item ** items);
167int dialog_checklist (const char *title, const char *prompt, int height, 170int dialog_checklist (const char *title, const char *prompt, int height,
168 int width, int list_height, int item_no, 171 int width, int list_height, int item_no,
diff --git a/scripts/config/inputbox.c b/scripts/config/lxdialog/inputbox.c
index fa7bebc69..fa7bebc69 100644
--- a/scripts/config/inputbox.c
+++ b/scripts/config/lxdialog/inputbox.c
diff --git a/scripts/config/menubox.c b/scripts/config/lxdialog/menubox.c
index 431f09fc9..873dc587b 100644
--- a/scripts/config/menubox.c
+++ b/scripts/config/lxdialog/menubox.c
@@ -26,7 +26,7 @@
26 * 26 *
27 * *) A bugfix for the Page-Down problem 27 * *) A bugfix for the Page-Down problem
28 * 28 *
29 * *) Formerly when I used Page Down and Page Up, the cursor would be set 29 * *) Formerly when I used Page Down and Page Up, the cursor would be set
30 * to the first position in the menu box. Now lxdialog is a bit 30 * to the first position in the menu box. Now lxdialog is a bit
31 * smarter and works more like other menu systems (just have a look at 31 * smarter and works more like other menu systems (just have a look at
32 * it). 32 * it).
@@ -71,7 +71,7 @@ print_item (WINDOW * win, const char *item, int choice, int selected, int hotkey
71 71
72 strncpy(menu_item, item, menu_width); 72 strncpy(menu_item, item, menu_width);
73 menu_item[menu_width] = 0; 73 menu_item[menu_width] = 0;
74 j = first_alpha(menu_item, "YyNnMm"); 74 j = first_alpha(menu_item, "YyNnMmHh");
75 75
76 /* Clear 'residue' of last item */ 76 /* Clear 'residue' of last item */
77 wattrset (win, menubox_attr); 77 wattrset (win, menubox_attr);
@@ -225,7 +225,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
225 225
226 /* 226 /*
227 * Find length of longest item in order to center menu. 227 * Find length of longest item in order to center menu.
228 * Set 'choice' to default item. 228 * Set 'choice' to default item.
229 */ 229 */
230 item_x = 0; 230 item_x = 0;
231 for (i = 0; i < item_no; i++) { 231 for (i = 0; i < item_no; i++) {
@@ -278,23 +278,23 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
278 278
279 if (key < 256 && isalpha(key)) key = tolower(key); 279 if (key < 256 && isalpha(key)) key = tolower(key);
280 280
281 if (strchr("ynm", key)) 281 if (strchr("ynmh", key))
282 i = max_choice; 282 i = max_choice;
283 else { 283 else {
284 for (i = choice+1; i < max_choice; i++) { 284 for (i = choice+1; i < max_choice; i++) {
285 j = first_alpha(items[scroll + i]->name, "YyNnMm>"); 285 j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
286 if (key == tolower(items[scroll + i]->name[j])) 286 if (key == tolower(items[scroll + i]->name[j]))
287 break; 287 break;
288 } 288 }
289 if (i == max_choice) 289 if (i == max_choice)
290 for (i = 0; i < max_choice; i++) { 290 for (i = 0; i < max_choice; i++) {
291 j = first_alpha(items[scroll + i]->name, "YyNnMm>"); 291 j = first_alpha(items[scroll + i]->name, "YyNnMmHh");
292 if (key == tolower(items[scroll + i]->name[j])) 292 if (key == tolower(items[scroll + i]->name[j]))
293 break; 293 break;
294 } 294 }
295 } 295 }
296 296
297 if (i < max_choice || 297 if (i < max_choice ||
298 key == KEY_UP || key == KEY_DOWN || 298 key == KEY_UP || key == KEY_DOWN ||
299 key == '-' || key == '+' || 299 key == '-' || key == '+' ||
300 key == KEY_PPAGE || key == KEY_NPAGE) { 300 key == KEY_PPAGE || key == KEY_NPAGE) {
@@ -398,6 +398,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
398 case 'y': 398 case 'y':
399 case 'n': 399 case 'n':
400 case 'm': 400 case 'm':
401 case '/':
401 /* save scroll info */ 402 /* save scroll info */
402 if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) { 403 if ( (f=fopen("lxdialog.scrltmp","w")) != NULL ) {
403 fprintf(f,"%d\n",scroll); 404 fprintf(f,"%d\n",scroll);
@@ -411,6 +412,7 @@ dialog_menu (const char *title, const char *prompt, int height, int width,
411 case 'n': return 4; 412 case 'n': return 4;
412 case 'm': return 5; 413 case 'm': return 5;
413 case ' ': return 6; 414 case ' ': return 6;
415 case '/': return 7;
414 } 416 }
415 return 0; 417 return 0;
416 case 'h': 418 case 'h':
diff --git a/scripts/config/msgbox.c b/scripts/config/lxdialog/msgbox.c
index 93692e1fb..93692e1fb 100644
--- a/scripts/config/msgbox.c
+++ b/scripts/config/lxdialog/msgbox.c
diff --git a/scripts/config/textbox.c b/scripts/config/lxdialog/textbox.c
index a5a460b5c..a5a460b5c 100644
--- a/scripts/config/textbox.c
+++ b/scripts/config/lxdialog/textbox.c
diff --git a/scripts/config/lxdialog/util.c b/scripts/config/lxdialog/util.c
new file mode 100644
index 000000000..6f83951b9
--- /dev/null
+++ b/scripts/config/lxdialog/util.c
@@ -0,0 +1,375 @@
1/*
2 * util.c
3 *
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "dialog.h"
23
24
25/* use colors by default? */
26bool use_colors = 1;
27
28const char *backtitle = NULL;
29
30const char *dialog_result;
31
32/*
33 * Attribute values, default is for mono display
34 */
35chtype attributes[] =
36{
37 A_NORMAL, /* screen_attr */
38 A_NORMAL, /* shadow_attr */
39 A_NORMAL, /* dialog_attr */
40 A_BOLD, /* title_attr */
41 A_NORMAL, /* border_attr */
42 A_REVERSE, /* button_active_attr */
43 A_DIM, /* button_inactive_attr */
44 A_REVERSE, /* button_key_active_attr */
45 A_BOLD, /* button_key_inactive_attr */
46 A_REVERSE, /* button_label_active_attr */
47 A_NORMAL, /* button_label_inactive_attr */
48 A_NORMAL, /* inputbox_attr */
49 A_NORMAL, /* inputbox_border_attr */
50 A_NORMAL, /* searchbox_attr */
51 A_BOLD, /* searchbox_title_attr */
52 A_NORMAL, /* searchbox_border_attr */
53 A_BOLD, /* position_indicator_attr */
54 A_NORMAL, /* menubox_attr */
55 A_NORMAL, /* menubox_border_attr */
56 A_NORMAL, /* item_attr */
57 A_REVERSE, /* item_selected_attr */
58 A_BOLD, /* tag_attr */
59 A_REVERSE, /* tag_selected_attr */
60 A_BOLD, /* tag_key_attr */
61 A_REVERSE, /* tag_key_selected_attr */
62 A_BOLD, /* check_attr */
63 A_REVERSE, /* check_selected_attr */
64 A_BOLD, /* uarrow_attr */
65 A_BOLD /* darrow_attr */
66};
67
68
69#include "colors.h"
70
71/*
72 * Table of color values
73 */
74int color_table[][3] =
75{
76 {SCREEN_FG, SCREEN_BG, SCREEN_HL},
77 {SHADOW_FG, SHADOW_BG, SHADOW_HL},
78 {DIALOG_FG, DIALOG_BG, DIALOG_HL},
79 {TITLE_FG, TITLE_BG, TITLE_HL},
80 {BORDER_FG, BORDER_BG, BORDER_HL},
81 {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
82 {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
83 {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
84 {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
85 {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
86 {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
87 BUTTON_LABEL_INACTIVE_HL},
88 {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
89 {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
90 {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
91 {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
92 {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
93 {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
94 {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
95 {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
96 {ITEM_FG, ITEM_BG, ITEM_HL},
97 {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
98 {TAG_FG, TAG_BG, TAG_HL},
99 {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
100 {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
101 {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
102 {CHECK_FG, CHECK_BG, CHECK_HL},
103 {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
104 {UARROW_FG, UARROW_BG, UARROW_HL},
105 {DARROW_FG, DARROW_BG, DARROW_HL},
106}; /* color_table */
107
108/*
109 * Set window to attribute 'attr'
110 */
111void
112attr_clear (WINDOW * win, int height, int width, chtype attr)
113{
114 int i, j;
115
116 wattrset (win, attr);
117 for (i = 0; i < height; i++) {
118 wmove (win, i, 0);
119 for (j = 0; j < width; j++)
120 waddch (win, ' ');
121 }
122 touchwin (win);
123}
124
125void dialog_clear (void)
126{
127 attr_clear (stdscr, LINES, COLS, screen_attr);
128 /* Display background title if it exists ... - SLH */
129 if (backtitle != NULL) {
130 int i;
131
132 wattrset (stdscr, screen_attr);
133 mvwaddstr (stdscr, 0, 1, (char *)backtitle);
134 wmove (stdscr, 1, 1);
135 for (i = 1; i < COLS - 1; i++)
136 waddch (stdscr, ACS_HLINE);
137 }
138 wnoutrefresh (stdscr);
139}
140
141/*
142 * Do some initialization for dialog
143 */
144void
145init_dialog (void)
146{
147 initscr (); /* Init curses */
148 keypad (stdscr, TRUE);
149 cbreak ();
150 noecho ();
151
152
153 if (use_colors) /* Set up colors */
154 color_setup ();
155
156
157 dialog_clear ();
158}
159
160/*
161 * Setup for color display
162 */
163void
164color_setup (void)
165{
166 int i;
167
168 if (has_colors ()) { /* Terminal supports color? */
169 start_color ();
170
171 /* Initialize color pairs */
172 for (i = 0; i < ATTRIBUTE_COUNT; i++)
173 init_pair (i + 1, color_table[i][0], color_table[i][1]);
174
175 /* Setup color attributes */
176 for (i = 0; i < ATTRIBUTE_COUNT; i++)
177 attributes[i] = C_ATTR (color_table[i][2], i + 1);
178 }
179}
180
181/*
182 * End using dialog functions.
183 */
184void
185end_dialog (void)
186{
187 endwin ();
188}
189
190
191/*
192 * Print a string of text in a window, automatically wrap around to the
193 * next line if the string is too long to fit on one line. Newline
194 * characters '\n' are replaced by spaces. We start on a new line
195 * if there is no room for at least 4 nonblanks following a double-space.
196 */
197void
198print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
199{
200 int newl, cur_x, cur_y;
201 int i, prompt_len, room, wlen;
202 char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
203
204 strcpy (tempstr, prompt);
205
206 prompt_len = strlen(tempstr);
207
208 /*
209 * Remove newlines
210 */
211 for(i=0; i<prompt_len; i++) {
212 if(tempstr[i] == '\n') tempstr[i] = ' ';
213 }
214
215 if (prompt_len <= width - x * 2) { /* If prompt is short */
216 wmove (win, y, (width - prompt_len) / 2);
217 waddstr (win, tempstr);
218 } else {
219 cur_x = x;
220 cur_y = y;
221 newl = 1;
222 word = tempstr;
223 while (word && *word) {
224 sp = index(word, ' ');
225 if (sp)
226 *sp++ = 0;
227
228 /* Wrap to next line if either the word does not fit,
229 or it is the first word of a new sentence, and it is
230 short, and the next word does not fit. */
231 room = width - cur_x;
232 wlen = strlen(word);
233 if (wlen > room ||
234 (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
235 && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
236 cur_y++;
237 cur_x = x;
238 }
239 wmove (win, cur_y, cur_x);
240 waddstr (win, word);
241 getyx (win, cur_y, cur_x);
242 cur_x++;
243 if (sp && *sp == ' ') {
244 cur_x++; /* double space */
245 while (*++sp == ' ');
246 newl = 1;
247 } else
248 newl = 0;
249 word = sp;
250 }
251 }
252}
253
254/*
255 * Print a button
256 */
257void
258print_button (WINDOW * win, const char *label, int y, int x, int selected)
259{
260 int i, temp;
261
262 wmove (win, y, x);
263 wattrset (win, selected ? button_active_attr : button_inactive_attr);
264 waddstr (win, "<");
265 temp = strspn (label, " ");
266 label += temp;
267 wattrset (win, selected ? button_label_active_attr
268 : button_label_inactive_attr);
269 for (i = 0; i < temp; i++)
270 waddch (win, ' ');
271 wattrset (win, selected ? button_key_active_attr
272 : button_key_inactive_attr);
273 waddch (win, label[0]);
274 wattrset (win, selected ? button_label_active_attr
275 : button_label_inactive_attr);
276 waddstr (win, (char *)label + 1);
277 wattrset (win, selected ? button_active_attr : button_inactive_attr);
278 waddstr (win, ">");
279 wmove (win, y, x + temp + 1);
280}
281
282/*
283 * Draw a rectangular box with line drawing characters
284 */
285void
286draw_box (WINDOW * win, int y, int x, int height, int width,
287 chtype box, chtype border)
288{
289 int i, j;
290
291 wattrset (win, 0);
292 for (i = 0; i < height; i++) {
293 wmove (win, y + i, x);
294 for (j = 0; j < width; j++)
295 if (!i && !j)
296 waddch (win, border | ACS_ULCORNER);
297 else if (i == height - 1 && !j)
298 waddch (win, border | ACS_LLCORNER);
299 else if (!i && j == width - 1)
300 waddch (win, box | ACS_URCORNER);
301 else if (i == height - 1 && j == width - 1)
302 waddch (win, box | ACS_LRCORNER);
303 else if (!i)
304 waddch (win, border | ACS_HLINE);
305 else if (i == height - 1)
306 waddch (win, box | ACS_HLINE);
307 else if (!j)
308 waddch (win, border | ACS_VLINE);
309 else if (j == width - 1)
310 waddch (win, box | ACS_VLINE);
311 else
312 waddch (win, box | ' ');
313 }
314}
315
316/*
317 * Draw shadows along the right and bottom edge to give a more 3D look
318 * to the boxes
319 */
320void
321draw_shadow (WINDOW * win, int y, int x, int height, int width)
322{
323 int i;
324
325 if (has_colors ()) { /* Whether terminal supports color? */
326 wattrset (win, shadow_attr);
327 wmove (win, y + height, x + 2);
328 for (i = 0; i < width; i++)
329 waddch (win, winch (win) & A_CHARTEXT);
330 for (i = y + 1; i < y + height + 1; i++) {
331 wmove (win, i, x + width);
332 waddch (win, winch (win) & A_CHARTEXT);
333 waddch (win, winch (win) & A_CHARTEXT);
334 }
335 wnoutrefresh (win);
336 }
337}
338
339/*
340 * Return the position of the first alphabetic character in a string.
341 */
342int
343first_alpha(const char *string, const char *exempt)
344{
345 int i, in_paren=0, c;
346
347 for (i = 0; i < strlen(string); i++) {
348 c = tolower(string[i]);
349
350 if (strchr("<[(", c)) ++in_paren;
351 if (strchr(">])", c) && in_paren > 0) --in_paren;
352
353 if ((! in_paren) && isalpha(c) &&
354 strchr(exempt, c) == 0)
355 return i;
356 }
357
358 return 0;
359}
360
361/*
362 * Get the first selected item in the dialog_list_item list.
363 */
364struct dialog_list_item *
365first_sel_item(int item_no, struct dialog_list_item ** items)
366{
367 int i;
368
369 for (i = 0; i < item_no; i++) {
370 if (items[i]->selected)
371 return items[i];
372 }
373
374 return NULL;
375}
diff --git a/scripts/config/yesno.c b/scripts/config/lxdialog/yesno.c
index 11fcc25f5..11fcc25f5 100644
--- a/scripts/config/yesno.c
+++ b/scripts/config/lxdialog/yesno.c
diff --git a/scripts/config/mconf.c b/scripts/config/mconf.c
index 63b4ff72f..5bc2abdd8 100644
--- a/scripts/config/mconf.c
+++ b/scripts/config/mconf.c
@@ -23,18 +23,150 @@
23#include <termios.h> 23#include <termios.h>
24#include <unistd.h> 24#include <unistd.h>
25 25
26#include "dialog.h" 26#include "lxdialog/dialog.h"
27 27
28#define LKC_DIRECT_LINK 28#define LKC_DIRECT_LINK
29#include "lkc.h" 29#include "lkc.h"
30 30
31static char menu_backtitle[128]; 31static char menu_backtitle[128];
32static const char menu_instructions[] = 32static const char mconf_readme[] =
33"Overview\n"
34"--------\n"
35"Some features may be built directly into BusyBox. Some features\n"
36"may be completely removed altogether. There are also certain\n"
37"parameters which are not really features, but must be\n"
38"entered in as decimal or hexadecimal numbers or possibly text.\n"
39"\n"
40"Menu items beginning with [*] or [ ] represent features\n"
41"configured to be built in or removed respectively.\n"
42"\n"
43"To change any of these features, highlight it with the cursor\n"
44"keys and press <Y> to build it in or <N> to removed it.\n"
45"You may also press the <Space Bar> to cycle\n"
46"through the available options (ie. Y->N->Y).\n"
47"\n"
48"Some additional keyboard hints:\n"
49"\n"
50"Menus\n"
51"----------\n"
52"o Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
53" you wish to change or submenu wish to select and press <Enter>.\n"
54" Submenus are designated by \"--->\".\n"
55"\n"
56" Shortcut: Press the option's highlighted letter (hotkey).\n"
57" Pressing a hotkey more than once will sequence\n"
58" through all visible items which use that hotkey.\n"
59"\n"
60" You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n"
61" unseen options into view.\n"
62"\n"
63"o To exit a menu use the cursor keys to highlight the <Exit> button\n"
64" and press <ENTER>.\n"
65"\n"
66" Shortcut: Press <ESC><ESC> or <E> or <X> if there is no hotkey\n"
67" using those letters. You may press a single <ESC>, but\n"
68" there is a delayed response which you may find annoying.\n"
69"\n"
70" Also, the <TAB> and cursor keys will cycle between <Select>,\n"
71" <Exit> and <Help>\n"
72"\n"
73"o To get help with an item, use the cursor keys to highlight <Help>\n"
74" and Press <ENTER>.\n"
75"\n"
76" Shortcut: Press <H> or <?>.\n"
77"\n"
78"\n"
79"Radiolists (Choice lists)\n"
80"-----------\n"
81"o Use the cursor keys to select the option you wish to set and press\n"
82" <S> or the <SPACE BAR>.\n"
83"\n"
84" Shortcut: Press the first letter of the option you wish to set then\n"
85" press <S> or <SPACE BAR>.\n"
86"\n"
87"o To see available help for the item, use the cursor keys to highlight\n"
88" <Help> and Press <ENTER>.\n"
89"\n"
90" Shortcut: Press <H> or <?>.\n"
91"\n"
92" Also, the <TAB> and cursor keys will cycle between <Select> and\n"
93" <Help>\n"
94"\n"
95"\n"
96"Data Entry\n"
97"-----------\n"
98"o Enter the requested information and press <ENTER>\n"
99" If you are entering hexadecimal values, it is not necessary to\n"
100" add the '0x' prefix to the entry.\n"
101"\n"
102"o For help, use the <TAB> or cursor keys to highlight the help option\n"
103" and press <ENTER>. You can try <TAB><H> as well.\n"
104"\n"
105"\n"
106"Text Box (Help Window)\n"
107"--------\n"
108"o Use the cursor keys to scroll up/down/left/right. The VI editor\n"
109" keys h,j,k,l function here as do <SPACE BAR> and <B> for those\n"
110" who are familiar with less and lynx.\n"
111"\n"
112"o Press <E>, <X>, <Enter> or <Esc><Esc> to exit.\n"
113"\n"
114"\n"
115"Alternate Configuration Files\n"
116"-----------------------------\n"
117"Menuconfig supports the use of alternate configuration files for\n"
118"those who, for various reasons, find it necessary to switch\n"
119"between different configurations.\n"
120"\n"
121"At the end of the main menu you will find two options. One is\n"
122"for saving the current configuration to a file of your choosing.\n"
123"The other option is for loading a previously saved alternate\n"
124"configuration.\n"
125"\n"
126"Even if you don't use alternate configuration files, but you\n"
127"find during a Menuconfig session that you have completely messed\n"
128"up your settings, you may use the \"Load Alternate...\" option to\n"
129"restore your previously saved settings from \".config\" without\n"
130"restarting Menuconfig.\n"
131"\n"
132"Other information\n"
133"-----------------\n"
134"If you use Menuconfig in an XTERM window make sure you have your\n"
135"$TERM variable set to point to a xterm definition which supports color.\n"
136"Otherwise, Menuconfig will look rather bad. Menuconfig will not\n"
137"display correctly in a RXVT window because rxvt displays only one\n"
138"intensity of color, bright.\n"
139"\n"
140"Menuconfig will display larger menus on screens or xterms which are\n"
141"set to display more than the standard 25 row by 80 column geometry.\n"
142"In order for this to work, the \"stty size\" command must be able to\n"
143"display the screen's current row and column geometry. I STRONGLY\n"
144"RECOMMEND that you make sure you do NOT have the shell variables\n"
145"LINES and COLUMNS exported into your environment. Some distributions\n"
146"export those variables via /etc/profile. Some ncurses programs can\n"
147"become confused when those variables (LINES & COLUMNS) don't reflect\n"
148"the true screen size.\n"
149"\n"
150"Optional personality available\n"
151"------------------------------\n"
152"If you prefer to have all of the options listed in a single\n"
153"menu, rather than the default multimenu hierarchy, run the menuconfig\n"
154"with MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
155"\n"
156"make MENUCONFIG_MODE=single_menu menuconfig\n"
157"\n"
158"<Enter> will then unroll the appropriate category, or enfold it if it\n"
159"is already unrolled.\n"
160"\n"
161"Note that this mode can eventually be a little more CPU expensive\n"
162"(especially with a larger number of unrolled categories) than the\n"
163"default mode.\n",
164menu_instructions[] =
33 "Arrow keys navigate the menu. " 165 "Arrow keys navigate the menu. "
34 "<Enter> selects submenus --->. " 166 "<Enter> selects submenus --->. "
35 "Highlighted letters are hotkeys. " 167 "Highlighted letters are hotkeys. "
36 "Pressing <Y> selectes a feature, while <N> will exclude a feature. " 168 "Pressing <Y> selectes a feature, while <N> will exclude a feature. "
37 "Press <Esc><Esc> to exit, <?> for Help. " 169 "Press <Esc><Esc> to exit, <?> for Help, </> for Search. "
38 "Legend: [*] feature is selected [ ] feature is excluded", 170 "Legend: [*] feature is selected [ ] feature is excluded",
39radiolist_instructions[] = 171radiolist_instructions[] =
40 "Use the arrow keys to navigate this window or " 172 "Use the arrow keys to navigate this window or "
@@ -85,23 +217,50 @@ save_config_help[] =
85 "\n" 217 "\n"
86 "If you are uncertain what all this means then you should probably\n" 218 "If you are uncertain what all this means then you should probably\n"
87 "leave this blank.\n", 219 "leave this blank.\n",
88top_menu_help[] = 220search_help[] =
89 "\n" 221 "\n"
90 "Use the Up/Down arrow keys (cursor keys) to highlight the item\n" 222 "Search for CONFIG_ symbols and display their relations.\n"
91 "you wish to change or submenu wish to select and press <Enter>.\n" 223 "Example: search for \"^FOO\"\n"
92 "Submenus are designated by \"--->\".\n" 224 "Result:\n"
225 "-----------------------------------------------------------------\n"
226 "Symbol: FOO [=m]\n"
227 "Prompt: Foo bus is used to drive the bar HW\n"
228 "Defined at drivers/pci/Kconfig:47\n"
229 "Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
230 "Location:\n"
231 " -> Bus options (PCI, PCMCIA, EISA, MCA, ISA)\n"
232 " -> PCI support (PCI [=y])\n"
233 " -> PCI access mode (<choice> [=y])\n"
234 "Selects: LIBCRC32\n"
235 "Selected by: BAR\n"
236 "-----------------------------------------------------------------\n"
237 "o The line 'Prompt:' shows the text used in the menu structure for\n"
238 " this CONFIG_ symbol\n"
239 "o The 'Defined at' line tell at what file / line number the symbol\n"
240 " is defined\n"
241 "o The 'Depends on:' line tell what symbols needs to be defined for\n"
242 " this symbol to be visible in the menu (selectable)\n"
243 "o The 'Location:' lines tell where in the menu structure this symbol\n"
244 " is located\n"
245 " A location followed by a [=y] indicate that this is a selectable\n"
246 " menu item - and current value is displayed inside brackets.\n"
247 "o The 'Selects:' line tell what symbol will be automatically\n"
248 " selected if this symbol is selected (y or m)\n"
249 "o The 'Selected by' line tell what symbol has selected this symbol\n"
93 "\n" 250 "\n"
94 "Shortcut: Press the option's highlighted letter (hotkey).\n" 251 "Only relevant lines are shown.\n"
95 "\n" 252 "\n\n"
96 "You may also use the <PAGE UP> and <PAGE DOWN> keys to scroll\n" 253 "Search examples:\n"
97 "unseen options into view.\n" 254 "Examples: USB => find all CONFIG_ symbols containing USB\n"
98; 255 " ^USB => find all CONFIG_ symbols starting with USB\n"
256 " USB$ => find all CONFIG_ symbols ending with USB\n"
257 "\n";
99 258
100static char filename[PATH_MAX+1] = ".config"; 259static char filename[PATH_MAX+1] = ".config";
101static int indent = 0; 260static int indent;
102static struct termios ios_org; 261static struct termios ios_org;
103static int rows, cols; 262static int rows = 0, cols = 0;
104struct menu *current_menu; 263static struct menu *current_menu;
105static int child_count; 264static int child_count;
106static int single_menu_mode; 265static int single_menu_mode;
107 266
@@ -116,33 +275,31 @@ static void conf_save(void);
116static void show_textbox(const char *title, const char *text, int r, int c); 275static void show_textbox(const char *title, const char *text, int r, int c);
117static void show_helptext(const char *title, const char *text); 276static void show_helptext(const char *title, const char *text);
118static void show_help(struct menu *menu); 277static void show_help(struct menu *menu);
119static void show_readme(void); 278static void show_file(const char *filename, const char *title, int r, int c);
120 279
121static void init_wsize(void) 280static void init_wsize(void)
122{ 281{
123 struct winsize ws; 282 struct winsize ws;
124 char *env; 283 char *env;
125 284
126 if (ioctl(1, TIOCGWINSZ, &ws) == -1) { 285 if (!ioctl(STDIN_FILENO, TIOCGWINSZ, &ws)) {
127 rows = 24;
128 cols = 80;
129 } else {
130 rows = ws.ws_row; 286 rows = ws.ws_row;
131 cols = ws.ws_col; 287 cols = ws.ws_col;
132 if (!rows) { 288 }
133 env = getenv("LINES"); 289
134 if (env) 290 if (!rows) {
135 rows = atoi(env); 291 env = getenv("LINES");
136 if (!rows) 292 if (env)
137 rows = 24; 293 rows = atoi(env);
138 } 294 if (!rows)
139 if (!cols) { 295 rows = 24;
140 env = getenv("COLUMNS"); 296 }
141 if (env) 297 if (!cols) {
142 cols = atoi(env); 298 env = getenv("COLUMNS");
143 if (!cols) 299 if (env)
144 cols = 80; 300 cols = atoi(env);
145 } 301 if (!cols)
302 cols = 80;
146 } 303 }
147 304
148 if (rows < 19 || cols < 80) { 305 if (rows < 19 || cols < 80) {
@@ -214,6 +371,103 @@ static void cdone(void)
214 item_no = 0; 371 item_no = 0;
215} 372}
216 373
374static void get_prompt_str(struct gstr *r, struct property *prop)
375{
376 int i, j;
377 struct menu *submenu[8], *menu;
378
379 str_printf(r, "Prompt: %s\n", prop->text);
380 str_printf(r, " Defined at %s:%d\n", prop->menu->file->name,
381 prop->menu->lineno);
382 if (!expr_is_yes(prop->visible.expr)) {
383 str_append(r, " Depends on: ");
384 expr_gstr_print(prop->visible.expr, r);
385 str_append(r, "\n");
386 }
387 menu = prop->menu->parent;
388 for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent)
389 submenu[i++] = menu;
390 if (i > 0) {
391 str_printf(r, " Location:\n");
392 for (j = 4; --i >= 0; j += 2) {
393 menu = submenu[i];
394 str_printf(r, "%*c-> %s", j, ' ', menu_get_prompt(menu));
395 if (menu->sym) {
396 str_printf(r, " (%s [=%s])", menu->sym->name ?
397 menu->sym->name : "<choice>",
398 sym_get_string_value(menu->sym));
399 }
400 str_append(r, "\n");
401 }
402 }
403}
404
405static void get_symbol_str(struct gstr *r, struct symbol *sym)
406{
407 bool hit;
408 struct property *prop;
409
410 str_printf(r, "Symbol: %s [=%s]\n", sym->name,
411 sym_get_string_value(sym));
412 for_all_prompts(sym, prop)
413 get_prompt_str(r, prop);
414 hit = false;
415 for_all_properties(sym, prop, P_SELECT) {
416 if (!hit) {
417 str_append(r, " Selects: ");
418 hit = true;
419 } else
420 str_printf(r, " && ");
421 expr_gstr_print(prop->expr, r);
422 }
423 if (hit)
424 str_append(r, "\n");
425 if (sym->rev_dep.expr) {
426 str_append(r, " Selected by: ");
427 expr_gstr_print(sym->rev_dep.expr, r);
428 str_append(r, "\n");
429 }
430 str_append(r, "\n\n");
431}
432
433static struct gstr get_relations_str(struct symbol **sym_arr)
434{
435 struct symbol *sym;
436 struct gstr res = str_new();
437 int i;
438
439 for (i = 0; sym_arr && (sym = sym_arr[i]); i++)
440 get_symbol_str(&res, sym);
441 if (!i)
442 str_append(&res, "No matches found.\n");
443 return res;
444}
445
446static void search_conf(void)
447{
448 struct symbol **sym_arr;
449 struct gstr res;
450
451again:
452 switch (dialog_inputbox("Search Configuration Parameter",
453 "Enter Keyword", 10, 75,
454 NULL)) {
455 case 0:
456 break;
457 case 1:
458 show_helptext("Search Configuration", search_help);
459 goto again;
460 default:
461 return;
462 }
463
464 sym_arr = sym_re_search(dialog_input_result);
465 res = get_relations_str(sym_arr);
466 free(sym_arr);
467 show_textbox("Search Results", str_get(&res), 0, 0);
468 str_free(&res);
469}
470
217static void build_conf(struct menu *menu) 471static void build_conf(struct menu *menu)
218{ 472{
219 struct symbol *sym; 473 struct symbol *sym;
@@ -308,6 +562,11 @@ static void build_conf(struct menu *menu)
308 return; 562 return;
309 } 563 }
310 } else { 564 } else {
565 if (menu == current_menu) {
566 cprint_tag(":%p", menu);
567 cprint_name("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
568 goto conf_childs;
569 }
311 child_count++; 570 child_count++;
312 val = sym_get_tristate_value(sym); 571 val = sym_get_tristate_value(sym);
313 if (sym_is_choice_value(sym) && val == yes) { 572 if (sym_is_choice_value(sym) && val == yes) {
@@ -376,7 +635,7 @@ static void conf(struct menu *menu)
376 while (1) { 635 while (1) {
377 indent = 0; 636 indent = 0;
378 child_count = 0; 637 child_count = 0;
379 current_menu = menu; 638 current_menu = menu;
380 cdone(); cinit(); 639 cdone(); cinit();
381 build_conf(menu); 640 build_conf(menu);
382 if (!child_count) 641 if (!child_count)
@@ -441,7 +700,7 @@ static void conf(struct menu *menu)
441 if (sym) 700 if (sym)
442 show_help(submenu); 701 show_help(submenu);
443 else 702 else
444 show_readme(); 703 show_helptext("README", mconf_readme);
445 break; 704 break;
446 case 3: 705 case 3:
447 if (type == 't') { 706 if (type == 't') {
@@ -465,6 +724,9 @@ static void conf(struct menu *menu)
465 else if (type == 'm') 724 else if (type == 'm')
466 conf(submenu); 725 conf(submenu);
467 break; 726 break;
727 case 7:
728 search_conf();
729 break;
468 } 730 }
469 } 731 }
470} 732}
@@ -476,37 +738,39 @@ static void show_textbox(const char *title, const char *text, int r, int c)
476 fd = creat(".help.tmp", 0777); 738 fd = creat(".help.tmp", 0777);
477 write(fd, text, strlen(text)); 739 write(fd, text, strlen(text));
478 close(fd); 740 close(fd);
479 while (dialog_textbox(title, ".help.tmp", r, c) < 0) 741 show_file(".help.tmp", title, r, c);
480 ;
481 unlink(".help.tmp"); 742 unlink(".help.tmp");
482} 743}
483 744
484static void show_helptext(const char *title, const char *text) 745static void show_helptext(const char *title, const char *text)
485{ 746{
486 show_textbox(title, text, rows, cols); 747 show_textbox(title, text, 0, 0);
487} 748}
488 749
489static void show_help(struct menu *menu) 750static void show_help(struct menu *menu)
490{ 751{
491 const char *help; 752 struct gstr help = str_new();
492 char *helptext;
493 struct symbol *sym = menu->sym; 753 struct symbol *sym = menu->sym;
494 754
495 help = sym->help; 755 if (sym->help)
496 if (!help) 756 {
497 help = nohelp_text; 757 if (sym->name) {
498 if (sym->name) { 758 str_printf(&help, "%s:\n\n", sym->name);
499 helptext = malloc(strlen(sym->name) + strlen(help) + 16); 759 str_append(&help, sym->help);
500 sprintf(helptext, "%s:\n\n%s", sym->name, help); 760 str_append(&help, "\n");
501 show_helptext(menu_get_prompt(menu), helptext); 761 }
502 free(helptext); 762 } else {
503 } else 763 str_append(&help, nohelp_text);
504 show_helptext(menu_get_prompt(menu), help); 764 }
765 get_symbol_str(&help, sym);
766 show_helptext(menu_get_prompt(menu), str_get(&help));
767 str_free(&help);
505} 768}
506 769
507static void show_readme(void) 770static void show_file(const char *filename, const char *title, int r, int c)
508{ 771{
509 show_helptext("Help", top_menu_help); 772 while (dialog_textbox(title, filename, r ? r : rows, c ? c : cols) < 0)
773 ;
510} 774}
511 775
512static void conf_choice(struct menu *menu) 776static void conf_choice(struct menu *menu)
@@ -667,9 +931,9 @@ static void winch_handler(int sig)
667 931
668int main(int ac, char **av) 932int main(int ac, char **av)
669{ 933{
670 int stat;
671 char *mode;
672 struct symbol *sym; 934 struct symbol *sym;
935 char *mode;
936 int stat;
673 937
674 conf_parse(av[1]); 938 conf_parse(av[1]);
675 conf_read(NULL); 939 conf_read(NULL);
@@ -697,7 +961,7 @@ int main(int ac, char **av)
697 init_dialog(); 961 init_dialog();
698 do { 962 do {
699 stat = dialog_yesno(NULL, 963 stat = dialog_yesno(NULL,
700 "Do you wish to save your new BusyBox configuration?", 5, 60); 964 "Do you wish to save your new BusyBox configuration?", 5, 60);
701 } while (stat < 0); 965 } while (stat < 0);
702 end_dialog(); 966 end_dialog();
703 967
diff --git a/scripts/config/menu.c b/scripts/config/menu.c
index 6425296fc..0c13156f3 100644
--- a/scripts/config/menu.c
+++ b/scripts/config/menu.c
@@ -10,7 +10,6 @@
10#include "lkc.h" 10#include "lkc.h"
11 11
12struct menu rootmenu; 12struct menu rootmenu;
13struct menu *current_menu, *current_entry;
14static struct menu **last_entry_ptr; 13static struct menu **last_entry_ptr;
15 14
16struct file *file_list; 15struct file *file_list;
@@ -389,43 +388,3 @@ struct menu *menu_get_parent_menu(struct menu *menu)
389 return menu; 388 return menu;
390} 389}
391 390
392struct file *file_lookup(const char *name)
393{
394 struct file *file;
395
396 for (file = file_list; file; file = file->next) {
397 if (!strcmp(name, file->name))
398 return file;
399 }
400
401 file = malloc(sizeof(*file));
402 memset(file, 0, sizeof(*file));
403 file->name = strdup(name);
404 file->next = file_list;
405 file_list = file;
406 return file;
407}
408
409int file_write_dep(const char *name)
410{
411 struct file *file;
412 FILE *out;
413
414 if (!name)
415 name = ".config.cmd";
416 out = fopen(".config.tmp", "w");
417 if (!out)
418 return 1;
419 fprintf(out, "deps_config := \\\n");
420 for (file = file_list; file; file = file->next) {
421 if (file->next)
422 fprintf(out, "\t%s \\\n", file->name);
423 else
424 fprintf(out, "\t%s\n", file->name);
425 }
426 fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
427 fclose(out);
428 rename(".config.tmp", name);
429 return 0;
430}
431
diff --git a/scripts/config/symbol.c b/scripts/config/symbol.c
index a9fae9c13..ea629728a 100644
--- a/scripts/config/symbol.c
+++ b/scripts/config/symbol.c
@@ -6,6 +6,7 @@
6#include <ctype.h> 6#include <ctype.h>
7#include <stdlib.h> 7#include <stdlib.h>
8#include <string.h> 8#include <string.h>
9#include <regex.h>
9#include <sys/utsname.h> 10#include <sys/utsname.h>
10 11
11#define LKC_DIRECT_LINK 12#define LKC_DIRECT_LINK
@@ -414,7 +415,7 @@ tristate sym_toggle_tristate_value(struct symbol *sym)
414 415
415bool sym_string_valid(struct symbol *sym, const char *str) 416bool sym_string_valid(struct symbol *sym, const char *str)
416{ 417{
417 char ch; 418 signed char ch;
418 419
419 switch (sym->type) { 420 switch (sym->type) {
420 case S_STRING: 421 case S_STRING:
@@ -649,6 +650,43 @@ struct symbol *sym_find(const char *name)
649 return symbol; 650 return symbol;
650} 651}
651 652
653struct symbol **sym_re_search(const char *pattern)
654{
655 struct symbol *sym, **sym_arr = NULL;
656 int i, cnt, size;
657 regex_t re;
658
659 cnt = size = 0;
660 /* Skip if empty */
661 if (strlen(pattern) == 0)
662 return NULL;
663 if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
664 return NULL;
665
666 for_all_symbols(i, sym) {
667 if (sym->flags & SYMBOL_CONST || !sym->name)
668 continue;
669 if (regexec(&re, sym->name, 0, NULL, 0))
670 continue;
671 if (cnt + 1 >= size) {
672 void *tmp = sym_arr;
673 size += 16;
674 sym_arr = realloc(sym_arr, size * sizeof(struct symbol *));
675 if (!sym_arr) {
676 free(tmp);
677 return NULL;
678 }
679 }
680 sym_arr[cnt++] = sym;
681 }
682 if (sym_arr)
683 sym_arr[cnt] = NULL;
684 regfree(&re);
685
686 return sym_arr;
687}
688
689
652struct symbol *sym_check_deps(struct symbol *sym); 690struct symbol *sym_check_deps(struct symbol *sym);
653 691
654static struct symbol *sym_check_expr_deps(struct expr *e) 692static struct symbol *sym_check_expr_deps(struct expr *e)
diff --git a/scripts/config/util.c b/scripts/config/util.c
index 0a2f82757..a72f5ea66 100644
--- a/scripts/config/util.c
+++ b/scripts/config/util.c
@@ -1,375 +1,109 @@
1/* 1/*
2 * util.c 2 * Copyright (C) 2002-2005 Roman Zippel <zippel@linux-m68k.org>
3 * Copyright (C) 2002-2005 Sam Ravnborg <sam@ravnborg.org>
3 * 4 *
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk) 5 * Released under the terms of the GNU GPL v2.0.
5 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#include "dialog.h"
23
24
25/* use colors by default? */
26bool use_colors = 1;
27
28char *backtitle = NULL;
29
30const char *dialog_result;
31
32/*
33 * Attribute values, default is for mono display
34 */
35chtype attributes[] =
36{
37 A_NORMAL, /* screen_attr */
38 A_NORMAL, /* shadow_attr */
39 A_NORMAL, /* dialog_attr */
40 A_BOLD, /* title_attr */
41 A_NORMAL, /* border_attr */
42 A_REVERSE, /* button_active_attr */
43 A_DIM, /* button_inactive_attr */
44 A_REVERSE, /* button_key_active_attr */
45 A_BOLD, /* button_key_inactive_attr */
46 A_REVERSE, /* button_label_active_attr */
47 A_NORMAL, /* button_label_inactive_attr */
48 A_NORMAL, /* inputbox_attr */
49 A_NORMAL, /* inputbox_border_attr */
50 A_NORMAL, /* searchbox_attr */
51 A_BOLD, /* searchbox_title_attr */
52 A_NORMAL, /* searchbox_border_attr */
53 A_BOLD, /* position_indicator_attr */
54 A_NORMAL, /* menubox_attr */
55 A_NORMAL, /* menubox_border_attr */
56 A_NORMAL, /* item_attr */
57 A_REVERSE, /* item_selected_attr */
58 A_BOLD, /* tag_attr */
59 A_REVERSE, /* tag_selected_attr */
60 A_BOLD, /* tag_key_attr */
61 A_REVERSE, /* tag_key_selected_attr */
62 A_BOLD, /* check_attr */
63 A_REVERSE, /* check_selected_attr */
64 A_BOLD, /* uarrow_attr */
65 A_BOLD /* darrow_attr */
66};
67
68
69#include "colors.h"
70
71/*
72 * Table of color values
73 */
74int color_table[][3] =
75{
76 {SCREEN_FG, SCREEN_BG, SCREEN_HL},
77 {SHADOW_FG, SHADOW_BG, SHADOW_HL},
78 {DIALOG_FG, DIALOG_BG, DIALOG_HL},
79 {TITLE_FG, TITLE_BG, TITLE_HL},
80 {BORDER_FG, BORDER_BG, BORDER_HL},
81 {BUTTON_ACTIVE_FG, BUTTON_ACTIVE_BG, BUTTON_ACTIVE_HL},
82 {BUTTON_INACTIVE_FG, BUTTON_INACTIVE_BG, BUTTON_INACTIVE_HL},
83 {BUTTON_KEY_ACTIVE_FG, BUTTON_KEY_ACTIVE_BG, BUTTON_KEY_ACTIVE_HL},
84 {BUTTON_KEY_INACTIVE_FG, BUTTON_KEY_INACTIVE_BG, BUTTON_KEY_INACTIVE_HL},
85 {BUTTON_LABEL_ACTIVE_FG, BUTTON_LABEL_ACTIVE_BG, BUTTON_LABEL_ACTIVE_HL},
86 {BUTTON_LABEL_INACTIVE_FG, BUTTON_LABEL_INACTIVE_BG,
87 BUTTON_LABEL_INACTIVE_HL},
88 {INPUTBOX_FG, INPUTBOX_BG, INPUTBOX_HL},
89 {INPUTBOX_BORDER_FG, INPUTBOX_BORDER_BG, INPUTBOX_BORDER_HL},
90 {SEARCHBOX_FG, SEARCHBOX_BG, SEARCHBOX_HL},
91 {SEARCHBOX_TITLE_FG, SEARCHBOX_TITLE_BG, SEARCHBOX_TITLE_HL},
92 {SEARCHBOX_BORDER_FG, SEARCHBOX_BORDER_BG, SEARCHBOX_BORDER_HL},
93 {POSITION_INDICATOR_FG, POSITION_INDICATOR_BG, POSITION_INDICATOR_HL},
94 {MENUBOX_FG, MENUBOX_BG, MENUBOX_HL},
95 {MENUBOX_BORDER_FG, MENUBOX_BORDER_BG, MENUBOX_BORDER_HL},
96 {ITEM_FG, ITEM_BG, ITEM_HL},
97 {ITEM_SELECTED_FG, ITEM_SELECTED_BG, ITEM_SELECTED_HL},
98 {TAG_FG, TAG_BG, TAG_HL},
99 {TAG_SELECTED_FG, TAG_SELECTED_BG, TAG_SELECTED_HL},
100 {TAG_KEY_FG, TAG_KEY_BG, TAG_KEY_HL},
101 {TAG_KEY_SELECTED_FG, TAG_KEY_SELECTED_BG, TAG_KEY_SELECTED_HL},
102 {CHECK_FG, CHECK_BG, CHECK_HL},
103 {CHECK_SELECTED_FG, CHECK_SELECTED_BG, CHECK_SELECTED_HL},
104 {UARROW_FG, UARROW_BG, UARROW_HL},
105 {DARROW_FG, DARROW_BG, DARROW_HL},
106}; /* color_table */
107
108/*
109 * Set window to attribute 'attr'
110 */ 6 */
111void
112attr_clear (WINDOW * win, int height, int width, chtype attr)
113{
114 int i, j;
115
116 wattrset (win, attr);
117 for (i = 0; i < height; i++) {
118 wmove (win, i, 0);
119 for (j = 0; j < width; j++)
120 waddch (win, ' ');
121 }
122 touchwin (win);
123}
124 7
125void dialog_clear (void) 8#include <string.h>
126{ 9#include "lkc.h"
127 attr_clear (stdscr, LINES, COLS, screen_attr);
128 /* Display background title if it exists ... - SLH */
129 if (backtitle != NULL) {
130 int i;
131
132 wattrset (stdscr, screen_attr);
133 mvwaddstr (stdscr, 0, 1, (char *)backtitle);
134 wmove (stdscr, 1, 1);
135 for (i = 1; i < COLS - 1; i++)
136 waddch (stdscr, ACS_HLINE);
137 }
138 wnoutrefresh (stdscr);
139}
140 10
141/* 11/* file already present in list? If not add it */
142 * Do some initialization for dialog 12struct file *file_lookup(const char *name)
143 */
144void
145init_dialog (void)
146{
147 initscr (); /* Init curses */
148 keypad (stdscr, TRUE);
149 cbreak ();
150 noecho ();
151
152
153 if (use_colors) /* Set up colors */
154 color_setup ();
155
156
157 dialog_clear ();
158}
159
160/*
161 * Setup for color display
162 */
163void
164color_setup (void)
165{ 13{
166 int i; 14 struct file *file;
167 15
168 if (has_colors ()) { /* Terminal supports color? */ 16 for (file = file_list; file; file = file->next) {
169 start_color (); 17 if (!strcmp(name, file->name))
170 18 return file;
171 /* Initialize color pairs */ 19 }
172 for (i = 0; i < ATTRIBUTE_COUNT; i++)
173 init_pair (i + 1, color_table[i][0], color_table[i][1]);
174 20
175 /* Setup color attributes */ 21 file = malloc(sizeof(*file));
176 for (i = 0; i < ATTRIBUTE_COUNT; i++) 22 memset(file, 0, sizeof(*file));
177 attributes[i] = C_ATTR (color_table[i][2], i + 1); 23 file->name = strdup(name);
178 } 24 file->next = file_list;
25 file_list = file;
26 return file;
179} 27}
180 28
181/* 29/* write a dependency file as used by kbuild to track dependencies */
182 * End using dialog functions. 30int file_write_dep(const char *name)
183 */
184void
185end_dialog (void)
186{ 31{
187 endwin (); 32 struct file *file;
33 FILE *out;
34
35 if (!name)
36 name = ".config.cmd";
37 out = fopen(".config.tmp", "w");
38 if (!out)
39 return 1;
40 fprintf(out, "deps_config := \\\n");
41 for (file = file_list; file; file = file->next) {
42 if (file->next)
43 fprintf(out, "\t%s \\\n", file->name);
44 else
45 fprintf(out, "\t%s\n", file->name);
46 }
47 fprintf(out, "\n.config include/config.h: $(deps_config)\n\n$(deps_config):\n");
48 fclose(out);
49 rename(".config.tmp", name);
50 return 0;
188} 51}
189 52
190 53
191/* 54/* Allocate initial growable sting */
192 * Print a string of text in a window, automatically wrap around to the 55struct gstr str_new(void)
193 * next line if the string is too long to fit on one line. Newline
194 * characters '\n' are replaced by spaces. We start on a new line
195 * if there is no room for at least 4 nonblanks following a double-space.
196 */
197void
198print_autowrap (WINDOW * win, const char *prompt, int width, int y, int x)
199{ 56{
200 int newl, cur_x, cur_y; 57 struct gstr gs;
201 int i, prompt_len, room, wlen; 58 gs.s = malloc(sizeof(char) * 64);
202 char tempstr[MAX_LEN + 1], *word, *sp, *sp2; 59 gs.len = 16;
203 60 strcpy(gs.s, "\0");
204 strcpy (tempstr, prompt); 61 return gs;
205
206 prompt_len = strlen(tempstr);
207
208 /*
209 * Remove newlines
210 */
211 for(i=0; i<prompt_len; i++) {
212 if(tempstr[i] == '\n') tempstr[i] = ' ';
213 }
214
215 if (prompt_len <= width - x * 2) { /* If prompt is short */
216 wmove (win, y, (width - prompt_len) / 2);
217 waddstr (win, tempstr);
218 } else {
219 cur_x = x;
220 cur_y = y;
221 newl = 1;
222 word = tempstr;
223 while (word && *word) {
224 sp = index(word, ' ');
225 if (sp)
226 *sp++ = 0;
227
228 /* Wrap to next line if either the word does not fit,
229 or it is the first word of a new sentence, and it is
230 short, and the next word does not fit. */
231 room = width - cur_x;
232 wlen = strlen(word);
233 if (wlen > room ||
234 (newl && wlen < 4 && sp && wlen+1+strlen(sp) > room
235 && (!(sp2 = index(sp, ' ')) || wlen+1+(sp2-sp) > room))) {
236 cur_y++;
237 cur_x = x;
238 }
239 wmove (win, cur_y, cur_x);
240 waddstr (win, word);
241 getyx (win, cur_y, cur_x);
242 cur_x++;
243 if (sp && *sp == ' ') {
244 cur_x++; /* double space */
245 while (*++sp == ' ');
246 newl = 1;
247 } else
248 newl = 0;
249 word = sp;
250 }
251 }
252} 62}
253 63
254/* 64/* Allocate and assign growable string */
255 * Print a button 65struct gstr str_assign(const char *s)
256 */
257void
258print_button (WINDOW * win, const char *label, int y, int x, int selected)
259{ 66{
260 int i, temp; 67 struct gstr gs;
261 68 gs.s = strdup(s);
262 wmove (win, y, x); 69 gs.len = strlen(s) + 1;
263 wattrset (win, selected ? button_active_attr : button_inactive_attr); 70 return gs;
264 waddstr (win, "<");
265 temp = strspn (label, " ");
266 label += temp;
267 wattrset (win, selected ? button_label_active_attr
268 : button_label_inactive_attr);
269 for (i = 0; i < temp; i++)
270 waddch (win, ' ');
271 wattrset (win, selected ? button_key_active_attr
272 : button_key_inactive_attr);
273 waddch (win, label[0]);
274 wattrset (win, selected ? button_label_active_attr
275 : button_label_inactive_attr);
276 waddstr (win, (char *)label + 1);
277 wattrset (win, selected ? button_active_attr : button_inactive_attr);
278 waddstr (win, ">");
279 wmove (win, y, x + temp + 1);
280} 71}
281 72
282/* 73/* Free storage for growable string */
283 * Draw a rectangular box with line drawing characters 74void str_free(struct gstr *gs)
284 */
285void
286draw_box (WINDOW * win, int y, int x, int height, int width,
287 chtype box, chtype border)
288{ 75{
289 int i, j; 76 if (gs->s)
290 77 free(gs->s);
291 wattrset (win, 0); 78 gs->s = NULL;
292 for (i = 0; i < height; i++) { 79 gs->len = 0;
293 wmove (win, y + i, x);
294 for (j = 0; j < width; j++)
295 if (!i && !j)
296 waddch (win, border | ACS_ULCORNER);
297 else if (i == height - 1 && !j)
298 waddch (win, border | ACS_LLCORNER);
299 else if (!i && j == width - 1)
300 waddch (win, box | ACS_URCORNER);
301 else if (i == height - 1 && j == width - 1)
302 waddch (win, box | ACS_LRCORNER);
303 else if (!i)
304 waddch (win, border | ACS_HLINE);
305 else if (i == height - 1)
306 waddch (win, box | ACS_HLINE);
307 else if (!j)
308 waddch (win, border | ACS_VLINE);
309 else if (j == width - 1)
310 waddch (win, box | ACS_VLINE);
311 else
312 waddch (win, box | ' ');
313 }
314} 80}
315 81
316/* 82/* Append to growable string */
317 * Draw shadows along the right and bottom edge to give a more 3D look 83void str_append(struct gstr *gs, const char *s)
318 * to the boxes
319 */
320void
321draw_shadow (WINDOW * win, int y, int x, int height, int width)
322{ 84{
323 int i; 85 size_t l = strlen(gs->s) + strlen(s) + 1;
324 86 if (l > gs->len) {
325 if (has_colors ()) { /* Whether terminal supports color? */ 87 gs->s = realloc(gs->s, l);
326 wattrset (win, shadow_attr); 88 gs->len = l;
327 wmove (win, y + height, x + 2);
328 for (i = 0; i < width; i++)
329 waddch (win, winch (win) & A_CHARTEXT);
330 for (i = y + 1; i < y + height + 1; i++) {
331 wmove (win, i, x + width);
332 waddch (win, winch (win) & A_CHARTEXT);
333 waddch (win, winch (win) & A_CHARTEXT);
334 } 89 }
335 wnoutrefresh (win); 90 strcat(gs->s, s);
336 }
337} 91}
338 92
339/* 93/* Append printf formatted string to growable string */
340 * Return the position of the first alphabetic character in a string. 94void str_printf(struct gstr *gs, const char *fmt, ...)
341 */
342int
343first_alpha(const char *string, const char *exempt)
344{ 95{
345 int i, in_paren=0, c; 96 va_list ap;
346 97 char s[10000]; /* big enough... */
347 for (i = 0; i < strlen(string); i++) { 98 va_start(ap, fmt);
348 c = tolower(string[i]); 99 vsnprintf(s, sizeof(s), fmt, ap);
349 100 str_append(gs, s);
350 if (strchr("<[(", c)) ++in_paren; 101 va_end(ap);
351 if (strchr(">])", c) && in_paren > 0) --in_paren;
352
353 if ((! in_paren) && isalpha(c) &&
354 strchr(exempt, c) == 0)
355 return i;
356 }
357
358 return 0;
359} 102}
360 103
361/* 104/* Retreive value of growable string */
362 * Get the first selected item in the dialog_list_item list. 105const char *str_get(struct gstr *gs)
363 */
364struct dialog_list_item *
365first_sel_item(int item_no, struct dialog_list_item ** items)
366{ 106{
367 int i; 107 return gs->s;
368
369 for (i = 0; i < item_no; i++) {
370 if (items[i]->selected)
371 return items[i];
372 }
373
374 return NULL;
375} 108}
109
diff --git a/scripts/config/zconf.tab.c_shipped b/scripts/config/zconf.tab.c_shipped
index bc2225fb4..be6bd4c0d 100644
--- a/scripts/config/zconf.tab.c_shipped
+++ b/scripts/config/zconf.tab.c_shipped
@@ -175,6 +175,8 @@ static bool zconf_endtoken(int token, int starttoken, int endtoken);
175 175
176struct symbol *symbol_hash[257]; 176struct symbol *symbol_hash[257];
177 177
178static struct menu *current_menu, *current_entry;
179
178#define YYERROR_VERBOSE 180#define YYERROR_VERBOSE
179 181
180 182
@@ -2119,6 +2121,7 @@ void zconfdump(FILE *out)
2119} 2121}
2120 2122
2121#include "lex.zconf.c" 2123#include "lex.zconf.c"
2124#include "util.c"
2122#include "confdata.c" 2125#include "confdata.c"
2123#include "expr.c" 2126#include "expr.c"
2124#include "symbol.c" 2127#include "symbol.c"
diff --git a/scripts/config/zconf.y b/scripts/config/zconf.y
index 658495cda..5ebaf0a78 100644
--- a/scripts/config/zconf.y
+++ b/scripts/config/zconf.y
@@ -25,6 +25,8 @@ static bool zconf_endtoken(int token, int starttoken, int endtoken);
25 25
26struct symbol *symbol_hash[257]; 26struct symbol *symbol_hash[257];
27 27
28static struct menu *current_menu, *current_entry;
29
28#define YYERROR_VERBOSE 30#define YYERROR_VERBOSE
29%} 31%}
30%expect 40 32%expect 40
@@ -681,6 +683,7 @@ void zconfdump(FILE *out)
681} 683}
682 684
683#include "lex.zconf.c" 685#include "lex.zconf.c"
686#include "util.c"
684#include "confdata.c" 687#include "confdata.c"
685#include "expr.c" 688#include "expr.c"
686#include "symbol.c" 689#include "symbol.c"