Author: nbd
Date: 2015-01-08 15:33:53 +0100 (Thu, 08 Jan 2015)
New Revision: 43873

Modified:
   trunk/Config.in
   trunk/scripts/config/conf.c
   trunk/scripts/config/confdata.c
   trunk/scripts/config/expr.h
   trunk/scripts/config/list.h
   trunk/scripts/config/lkc.h
   trunk/scripts/config/lkc_proto.h
   trunk/scripts/config/lxdialog/check-lxdialog.sh
   trunk/scripts/config/lxdialog/checklist.c
   trunk/scripts/config/lxdialog/dialog.h
   trunk/scripts/config/lxdialog/inputbox.c
   trunk/scripts/config/lxdialog/menubox.c
   trunk/scripts/config/lxdialog/textbox.c
   trunk/scripts/config/lxdialog/util.c
   trunk/scripts/config/lxdialog/yesno.c
   trunk/scripts/config/mconf.c
   trunk/scripts/config/menu.c
   trunk/scripts/config/symbol.c
   trunk/scripts/config/util.c
   trunk/scripts/config/zconf.gperf
   trunk/scripts/config/zconf.hash.c_shipped
   trunk/scripts/config/zconf.l
   trunk/scripts/config/zconf.lex.c_shipped
   trunk/scripts/config/zconf.tab.c_shipped
   trunk/scripts/config/zconf.y
Log:
scripts/config: sync with linux upstream

Signed-off-by: Felix Fietkau <[email protected]>

Modified: trunk/Config.in
===================================================================
--- trunk/Config.in     2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/Config.in     2015-01-08 14:33:53 UTC (rev 43873)
@@ -7,6 +7,7 @@
 mainmenu "OpenWrt Configuration"
 
 config MODULES
+       option modules
        bool
        default y
 

Modified: trunk/scripts/config/conf.c
===================================================================
--- trunk/scripts/config/conf.c 2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/conf.c 2015-01-08 14:33:53 UTC (rev 43873)
@@ -13,6 +13,7 @@
 #include <getopt.h>
 #include <sys/stat.h>
 #include <sys/time.h>
+#include <errno.h>
 
 #include "lkc.h"
 
@@ -514,14 +515,24 @@
                {
                        struct timeval now;
                        unsigned int seed;
+                       char *seed_env;
 
                        /*
                         * Use microseconds derived seed,
                         * compensate for systems where it may be zero
                         */
                        gettimeofday(&now, NULL);
+                       seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 
1));
 
-                       seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 
1));
+                       seed_env = getenv("KCONFIG_SEED");
+                       if( seed_env && *seed_env ) {
+                               char *endp;
+                               int tmp = (int)strtol(seed_env, &endp, 0);
+                               if (*endp == '\0') {
+                                       seed = tmp;
+                               }
+                       }
+                       fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed );
                        srand(seed);
                        break;
                }
@@ -622,7 +633,8 @@
                conf_set_all_new_symbols(def_default);
                break;
        case randconfig:
-               conf_set_all_new_symbols(def_random);
+               /* Really nothing to do in this loop */
+               while (conf_set_all_new_symbols(def_random)) ;
                break;
        case defconfig:
                conf_set_all_new_symbols(def_default);
@@ -664,7 +676,7 @@
        } else if (input_mode == savedefconfig) {
                if (conf_write_defconfig(defconfig_file)) {
                        fprintf(stderr, _("n*** Error while saving defconfig 
to: %s\n\n"),
-                               defconfig_file);
+                               defconfig_file);
                        return 1;
                }
        } else if (input_mode != listnewconfig) {

Modified: trunk/scripts/config/confdata.c
===================================================================
--- trunk/scripts/config/confdata.c     2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/confdata.c     2015-01-08 14:33:53 UTC (rev 43873)
@@ -140,7 +140,9 @@
                        sym->flags |= def_flags;
                        break;
                }
-               conf_warning("symbol value '%s' invalid for %s", p, sym->name);
+               if (def != S_DEF_AUTO)
+                       conf_warning("symbol value '%s' invalid for %s",
+                                    p, sym->name);
                return 1;
        case S_OTHER:
                if (*p != '"') {
@@ -161,7 +163,8 @@
                        memmove(p2, p2 + 1, strlen(p2));
                }
                if (!p2) {
-                       conf_warning("invalid string found");
+                       if (def != S_DEF_AUTO)
+                               conf_warning("invalid string found");
                        return 1;
                }
                /* fall through */
@@ -172,7 +175,9 @@
                        sym->def[def].val = strdup(p);
                        sym->flags |= def_flags;
                } else {
-                       conf_warning("symbol value '%s' invalid for %s", p, 
sym->name);
+                       if (def != S_DEF_AUTO)
+                               conf_warning("symbol value '%s' invalid for %s",
+                                            p, sym->name);
                        return 1;
                }
                break;
@@ -1043,7 +1048,7 @@
        conf_changed_callback = fn;
 }
 
-static void randomize_choice_values(struct symbol *csym)
+static bool randomize_choice_values(struct symbol *csym)
 {
        struct property *prop;
        struct symbol *sym;
@@ -1056,7 +1061,7 @@
         * In both cases stop.
         */
        if (csym->curr.tri != yes)
-               return;
+               return false;
 
        prop = sym_get_choice_prop(csym);
 
@@ -1080,13 +1085,18 @@
                else {
                        sym->def[S_DEF_USER].tri = no;
                }
+               sym->flags |= SYMBOL_DEF_USER;
+               /* clear VALID to get value calculated */
+               sym->flags &= ~SYMBOL_VALID;
        }
        csym->flags |= SYMBOL_DEF_USER;
        /* clear VALID to get value calculated */
        csym->flags &= ~(SYMBOL_VALID);
+
+       return true;
 }
 
-static void set_all_choice_values(struct symbol *csym)
+void set_all_choice_values(struct symbol *csym)
 {
        struct property *prop;
        struct symbol *sym;
@@ -1103,20 +1113,66 @@
        }
        csym->flags |= SYMBOL_DEF_USER;
        /* clear VALID to get value calculated */
-       csym->flags &= ~(SYMBOL_VALID);
+       csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);
 }
 
-void conf_set_all_new_symbols(enum conf_def_mode mode)
+bool conf_set_all_new_symbols(enum conf_def_mode mode)
 {
        struct symbol *sym, *csym;
-       int i, cnt;
+       int i, cnt, pby, pty, ptm;      /* pby: probability of boolean  = y
+                                        * pty: probability of tristate = y
+                                        * ptm: probability of tristate = m
+                                        */
 
+       pby = 50; pty = ptm = 33; /* can't go as the default in switch-case
+                                  * below, otherwise gcc whines about
+                                  * -Wmaybe-uninitialized */
+       if (mode == def_random) {
+               int n, p[3];
+               char *env = getenv("KCONFIG_PROBABILITY");
+               n = 0;
+               while( env && *env ) {
+                       char *endp;
+                       int tmp = strtol( env, &endp, 10 );
+                       if( tmp >= 0 && tmp <= 100 ) {
+                               p[n++] = tmp;
+                       } else {
+                               errno = ERANGE;
+                               perror( "KCONFIG_PROBABILITY" );
+                               exit( 1 );
+                       }
+                       env = (*endp == ':') ? endp+1 : endp;
+                       if( n >=3 ) {
+                               break;
+                       }
+               }
+               switch( n ) {
+               case 1:
+                       pby = p[0]; ptm = pby/2; pty = pby-ptm;
+                       break;
+               case 2:
+                       pty = p[0]; ptm = p[1]; pby = pty + ptm;
+                       break;
+               case 3:
+                       pby = p[0]; pty = p[1]; ptm = p[2];
+                       break;
+               }
+
+               if( pty+ptm > 100 ) {
+                       errno = ERANGE;
+                       perror( "KCONFIG_PROBABILITY" );
+                       exit( 1 );
+               }
+       }
+       bool has_changed = false;
+
        for_all_symbols(i, sym) {
-               if (sym_has_value(sym))
+               if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))
                        continue;
                switch (sym_get_type(sym)) {
                case S_BOOLEAN:
                case S_TRISTATE:
+                       has_changed = true;
                        switch (mode) {
                        case def_yes:
                                sym->def[S_DEF_USER].tri = yes;
@@ -1125,11 +1181,21 @@
                                sym->def[S_DEF_USER].tri = mod;
                                break;
                        case def_no:
-                               sym->def[S_DEF_USER].tri = no;
+                               if (sym->flags & SYMBOL_ALLNOCONFIG_Y)
+                                       sym->def[S_DEF_USER].tri = yes;
+                               else
+                                       sym->def[S_DEF_USER].tri = no;
                                break;
                        case def_random:
-                               cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2;
-                               sym->def[S_DEF_USER].tri = (tristate)(rand() % 
cnt);
+                               sym->def[S_DEF_USER].tri = no;
+                               cnt = rand() % 100;
+                               if (sym->type == S_TRISTATE) {
+                                       if (cnt < pty)
+                                               sym->def[S_DEF_USER].tri = yes;
+                                       else if (cnt < (pty+ptm))
+                                               sym->def[S_DEF_USER].tri = mod;
+                               } else if (cnt < pby)
+                                       sym->def[S_DEF_USER].tri = yes;
                                break;
                        default:
                                continue;
@@ -1154,14 +1220,26 @@
         * selected in a choice block and we set it to yes,
         * and the rest to no.
         */
+       if (mode != def_random) {
+               for_all_symbols(i, csym) {
+                       if ((sym_is_choice(csym) && !sym_has_value(csym)) ||
+                           sym_is_choice_value(csym))
+                               csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES;
+               }
+       }
+
        for_all_symbols(i, csym) {
                if (sym_has_value(csym) || !sym_is_choice(csym))
                        continue;
 
                sym_calc_value(csym);
                if (mode == def_random)
-                       randomize_choice_values(csym);
-               else
+                       has_changed = randomize_choice_values(csym);
+               else {
                        set_all_choice_values(csym);
+                       has_changed = true;
+               }
        }
+
+       return has_changed;
 }

Modified: trunk/scripts/config/expr.h
===================================================================
--- trunk/scripts/config/expr.h 2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/expr.h 2015-01-08 14:33:53 UTC (rev 43873)
@@ -93,7 +93,7 @@
 #define SYMBOL_CHOICEVAL  0x0020  /* used as a value in a choice block */
 #define SYMBOL_VALID      0x0080  /* set when symbol.curr is calculated */
 #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
-#define SYMBOL_WRITE      0x0200  /* ? */
+#define SYMBOL_WRITE      0x0200  /* write symbol to file (KCONFIG_CONFIG) */
 #define SYMBOL_CHANGED    0x0400  /* ? */
 #define SYMBOL_AUTO       0x1000  /* value from environment variable */
 #define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
@@ -106,6 +106,12 @@
 #define SYMBOL_DEF3       0x40000  /* symbol.def[S_DEF_3] is valid */
 #define SYMBOL_DEF4       0x80000  /* symbol.def[S_DEF_4] is valid */
 
+/* choice values need to be set before calculating this symbol value */
+#define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000
+
+/* Set symbol to y if allnoconfig; used for symbols that hide others */
+#define SYMBOL_ALLNOCONFIG_Y 0x200000
+
 #define SYMBOL_MAXLENGTH       256
 #define SYMBOL_HASHSIZE                9973
 

Modified: trunk/scripts/config/list.h
===================================================================
--- trunk/scripts/config/list.h 2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/list.h 2015-01-08 14:33:53 UTC (rev 43873)
@@ -34,7 +34,7 @@
  * list_entry - get the struct for this entry
  * @ptr:       the &struct list_head pointer.
  * @type:      the type of the struct this is embedded in.
- * @member:    the name of the list_struct within the struct.
+ * @member:    the name of the list_head within the struct.
  */
 #define list_entry(ptr, type, member) \
        container_of(ptr, type, member)
@@ -43,7 +43,7 @@
  * list_for_each_entry -       iterate over list of given type
  * @pos:       the type * to use as a loop cursor.
  * @head:      the head for your list.
- * @member:    the name of the list_struct within the struct.
+ * @member:    the name of the list_head within the struct.
  */
 #define list_for_each_entry(pos, head, member)                         \
        for (pos = list_entry((head)->next, typeof(*pos), member);      \
@@ -51,6 +51,19 @@
             pos = list_entry(pos->member.next, typeof(*pos), member))
 
 /**
+ * list_for_each_entry_safe - iterate over list of given type safe against 
removal of list entry
+ * @pos:       the type * to use as a loop cursor.
+ * @n:         another type * to use as temporary storage
+ * @head:      the head for your list.
+ * @member:    the name of the list_head within the struct.
+ */
+#define list_for_each_entry_safe(pos, n, head, member)                 \
+       for (pos = list_entry((head)->next, typeof(*pos), member),      \
+               n = list_entry(pos->member.next, typeof(*pos), member); \
+            &pos->member != (head);                                    \
+            pos = n, n = list_entry(n->member.next, typeof(*n), member))
+
+/**
  * list_empty - tests whether a list is empty
  * @head: the list to test.
  */
@@ -88,4 +101,31 @@
        __list_add(_new, head->prev, head);
 }
 
+/*
+ * Delete a list entry by making the prev/next entries
+ * point to each other.
+ *
+ * This is only for internal list manipulation where we know
+ * the prev/next entries already!
+ */
+static inline void __list_del(struct list_head *prev, struct list_head *next)
+{
+       next->prev = prev;
+       prev->next = next;
+}
+
+#define LIST_POISON1  ((void *) 0x00100100)
+#define LIST_POISON2  ((void *) 0x00200200)
+/**
+ * list_del - deletes entry from list.
+ * @entry: the element to delete from the list.
+ * Note: list_empty() on entry does not return true after this, the entry is
+ * in an undefined state.
+ */
+static inline void list_del(struct list_head *entry)
+{
+       __list_del(entry->prev, entry->next);
+       entry->next = (struct list_head*)LIST_POISON1;
+       entry->prev = (struct list_head*)LIST_POISON2;
+}
 #endif

Modified: trunk/scripts/config/lkc.h
===================================================================
--- trunk/scripts/config/lkc.h  2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/lkc.h  2015-01-08 14:33:53 UTC (rev 43873)
@@ -61,6 +61,7 @@
 #define T_OPT_MODULES          1
 #define T_OPT_DEFCONFIG_LIST   2
 #define T_OPT_ENV              3
+#define T_OPT_ALLNOCONFIG_Y    4
 
 struct kconf_id {
        int name;
@@ -86,7 +87,8 @@
 char *conf_get_default_confname(void);
 void sym_set_change_count(int count);
 void sym_add_change_count(int count);
-void conf_set_all_new_symbols(enum conf_def_mode mode);
+bool conf_set_all_new_symbols(enum conf_def_mode mode);
+void set_all_choice_values(struct symbol *csym);
 
 struct conf_printer {
        void (*print_symbol)(FILE *, struct symbol *, const char *, void *);

Modified: trunk/scripts/config/lkc_proto.h
===================================================================
--- trunk/scripts/config/lkc_proto.h    2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/lkc_proto.h    2015-01-08 14:33:53 UTC (rev 43873)
@@ -15,6 +15,7 @@
 /* menu.c */
 P(rootmenu,struct menu,);
 
+P(menu_is_empty, bool, (struct menu *menu));
 P(menu_is_visible, bool, (struct menu *menu));
 P(menu_has_prompt, bool, (struct menu *menu));
 P(menu_get_prompt,const char *,(struct menu *menu));

Modified: trunk/scripts/config/lxdialog/check-lxdialog.sh
===================================================================
--- trunk/scripts/config/lxdialog/check-lxdialog.sh     2015-01-08 12:46:44 UTC 
(rev 43872)
+++ trunk/scripts/config/lxdialog/check-lxdialog.sh     2015-01-08 14:33:53 UTC 
(rev 43873)
@@ -4,6 +4,8 @@
 # What library to link
 ldflags()
 {
+       pkg-config --libs ncursesw 2>/dev/null && exit
+       pkg-config --libs ncurses 2>/dev/null && exit
        for ext in so a dll.a dylib ; do
                for lib in ncursesw ncurses curses ; do
                        $cc -print-file-name=lib${lib}.${ext} | grep -q /
@@ -19,13 +21,17 @@
 # Where is ncurses.h?
 ccflags()
 {
-       if [ -f /usr/include/ncursesw/curses.h ]; then
-               echo '-I/usr/include/ncursesw 
-DCURSES_LOC="<ncursesw/curses.h>"'
+       if pkg-config --cflags ncursesw 2>/dev/null; then
+               echo '-DCURSES_LOC="<ncurses.h>" -DNCURSES_WIDECHAR=1'
+       elif pkg-config --cflags ncurses 2>/dev/null; then
+               echo '-DCURSES_LOC="<ncurses.h>"'
+       elif [ -f /usr/include/ncursesw/curses.h ]; then
+               echo '-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"'
                echo ' -DNCURSES_WIDECHAR=1'
        elif [ -f /usr/include/ncurses/ncurses.h ]; then
                echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'
        elif [ -f /usr/include/ncurses/curses.h ]; then
-               echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"'
+               echo '-I/usr/include/ncurses -DCURSES_LOC="<curses.h>"'
        elif [ -f /usr/include/ncurses.h ]; then
                echo '-DCURSES_LOC="<ncurses.h>"'
        else

Modified: trunk/scripts/config/lxdialog/checklist.c
===================================================================
--- trunk/scripts/config/lxdialog/checklist.c   2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/checklist.c   2015-01-08 14:33:53 UTC (rev 
43873)
@@ -132,16 +132,16 @@
        }
 
 do_resize:
-       if (getmaxy(stdscr) < (height + 6))
+       if (getmaxy(stdscr) < (height + CHECKLIST_HEIGTH_MIN))
                return -ERRDISPLAYTOOSMALL;
-       if (getmaxx(stdscr) < (width + 6))
+       if (getmaxx(stdscr) < (width + CHECKLIST_WIDTH_MIN))
                return -ERRDISPLAYTOOSMALL;
 
        max_choice = MIN(list_height, item_count());
 
        /* center dialog box on screen */
-       x = (COLS - width) / 2;
-       y = (LINES - height) / 2;
+       x = (getmaxx(stdscr) - width) / 2;
+       y = (getmaxy(stdscr) - height) / 2;
 
        draw_shadow(stdscr, y, x, height, width);
 
@@ -168,13 +168,13 @@
 
        /* create new window for the list */
        list = subwin(dialog, list_height, list_width, y + box_y + 1,
-                     x + box_x + 1);
+                     x + box_x + 1);
 
        keypad(list, TRUE);
 
        /* draw a box around the list items */
        draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
-                dlg.menubox_border.atr, dlg.menubox.atr);
+                dlg.menubox_border.atr, dlg.menubox.atr);
 
        /* Find length of longest item in order to center checklist */
        check_x = 0;

Modified: trunk/scripts/config/lxdialog/dialog.h
===================================================================
--- trunk/scripts/config/lxdialog/dialog.h      2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/dialog.h      2015-01-08 14:33:53 UTC (rev 
43873)
@@ -106,8 +106,14 @@
        int hl;         /* highlight this item */
 };
 
+struct subtitle_list {
+       struct subtitle_list *next;
+       const char *text;
+};
+
 struct dialog_info {
        const char *backtitle;
+       struct subtitle_list *subtitles;
        struct dialog_color screen;
        struct dialog_color shadow;
        struct dialog_color dialog;
@@ -164,7 +170,7 @@
 /* item list manipulation for lxdialog use */
 #define MAXITEMSTR 200
 struct dialog_item {
-       char str[MAXITEMSTR];   /* promtp displayed */
+       char str[MAXITEMSTR];   /* prompt displayed */
        char tag;
        void *data;     /* pointer to menu item - used by menubox+checklist */
        int selected;   /* Set to 1 by dialog_*() function if selected. */
@@ -194,8 +200,23 @@
 int on_key_esc(WINDOW *win);
 int on_key_resize(void);
 
+/* minimum (re)size values */
+#define CHECKLIST_HEIGTH_MIN 6 /* For dialog_checklist() */
+#define CHECKLIST_WIDTH_MIN 6
+#define INPUTBOX_HEIGTH_MIN 2  /* For dialog_inputbox() */
+#define INPUTBOX_WIDTH_MIN 2
+#define MENUBOX_HEIGTH_MIN 15  /* For dialog_menu() */
+#define MENUBOX_WIDTH_MIN 65
+#define TEXTBOX_HEIGTH_MIN 8   /* For dialog_textbox() */
+#define TEXTBOX_WIDTH_MIN 8
+#define YESNO_HEIGTH_MIN 4     /* For dialog_yesno() */
+#define YESNO_WIDTH_MIN 4
+#define WINDOW_HEIGTH_MIN 19   /* For init_dialog() */
+#define WINDOW_WIDTH_MIN 80
+
 int init_dialog(const char *backtitle);
 void set_dialog_backtitle(const char *backtitle);
+void set_dialog_subtitles(struct subtitle_list *subtitles);
 void end_dialog(int x, int y);
 void attr_clear(WINDOW * win, int height, int width, chtype attr);
 void dialog_clear(void);

Modified: trunk/scripts/config/lxdialog/inputbox.c
===================================================================
--- trunk/scripts/config/lxdialog/inputbox.c    2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/inputbox.c    2015-01-08 14:33:53 UTC (rev 
43873)
@@ -42,7 +42,7 @@
  * Display a dialog box for inputing a string
  */
 int dialog_inputbox(const char *title, const char *prompt, int height, int 
width,
-                    const char *init)
+                   const char *init)
 {
        int i, x, y, box_y, box_x, box_width;
        int input_x = 0, key = 0, button = -1;
@@ -56,14 +56,14 @@
                strcpy(instr, init);
 
 do_resize:
-       if (getmaxy(stdscr) <= (height - 2))
+       if (getmaxy(stdscr) <= (height - INPUTBOX_HEIGTH_MIN))
                return -ERRDISPLAYTOOSMALL;
-       if (getmaxx(stdscr) <= (width - 2))
+       if (getmaxx(stdscr) <= (width - INPUTBOX_WIDTH_MIN))
                return -ERRDISPLAYTOOSMALL;
 
        /* center dialog box on screen */
-       x = (COLS - width) / 2;
-       y = (LINES - height) / 2;
+       x = (getmaxx(stdscr) - width) / 2;
+       y = (getmaxy(stdscr) - height) / 2;
 
        draw_shadow(stdscr, y, x, height, width);
 

Modified: trunk/scripts/config/lxdialog/menubox.c
===================================================================
--- trunk/scripts/config/lxdialog/menubox.c     2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/menubox.c     2015-01-08 14:33:53 UTC (rev 
43873)
@@ -64,7 +64,7 @@
  * Print menu item
  */
 static void do_print_item(WINDOW * win, const char *item, int line_y,
-                          int selected, int hotkey)
+                         int selected, int hotkey)
 {
        int j;
        char *menu_item = malloc(menu_width + 1);
@@ -182,7 +182,7 @@
  * Display a menu for choosing among a number of options
  */
 int dialog_menu(const char *title, const char *prompt,
-                const void *selected, int *s_scroll)
+               const void *selected, int *s_scroll)
 {
        int i, j, x, y, box_x, box_y;
        int height, width, menu_height;
@@ -193,7 +193,7 @@
 do_resize:
        height = getmaxy(stdscr);
        width = getmaxx(stdscr);
-       if (height < 15 || width < 65)
+       if (height < MENUBOX_HEIGTH_MIN || width < MENUBOX_WIDTH_MIN)
                return -ERRDISPLAYTOOSMALL;
 
        height -= 4;
@@ -203,8 +203,8 @@
        max_choice = MIN(menu_height, item_count());
 
        /* center dialog box on screen */
-       x = (COLS - width) / 2;
-       y = (LINES - height) / 2;
+       x = (getmaxx(stdscr) - width) / 2;
+       y = (getmaxy(stdscr) - height) / 2;
 
        draw_shadow(stdscr, y, x, height, width);
 
@@ -303,10 +303,11 @@
                                }
                }
 
-               if (i < max_choice ||
-                   key == KEY_UP || key == KEY_DOWN ||
-                   key == '-' || key == '+' ||
-                   key == KEY_PPAGE || key == KEY_NPAGE) {
+               if (item_count() != 0 &&
+                   (i < max_choice ||
+                    key == KEY_UP || key == KEY_DOWN ||
+                    key == '-' || key == '+' ||
+                    key == KEY_PPAGE || key == KEY_NPAGE)) {
                        /* Remove highligt of current item */
                        print_item(scroll + choice, choice, FALSE);
 

Modified: trunk/scripts/config/lxdialog/textbox.c
===================================================================
--- trunk/scripts/config/lxdialog/textbox.c     2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/textbox.c     2015-01-08 14:33:53 UTC (rev 
43873)
@@ -80,7 +80,7 @@
 
 do_resize:
        getmaxyx(stdscr, height, width);
-       if (height < 8 || width < 8)
+       if (height < TEXTBOX_HEIGTH_MIN || width < TEXTBOX_WIDTH_MIN)
                return -ERRDISPLAYTOOSMALL;
        if (initial_height != 0)
                height = initial_height;
@@ -98,8 +98,8 @@
                        width = 0;
 
        /* center dialog box on screen */
-       x = (COLS - width) / 2;
-       y = (LINES - height) / 2;
+       x = (getmaxx(stdscr) - width) / 2;
+       y = (getmaxy(stdscr) - height) / 2;
 
        draw_shadow(stdscr, y, x, height, width);
 

Modified: trunk/scripts/config/lxdialog/util.c
===================================================================
--- trunk/scripts/config/lxdialog/util.c        2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/util.c        2015-01-08 14:33:53 UTC (rev 
43873)
@@ -254,15 +254,56 @@
 
 void dialog_clear(void)
 {
-       attr_clear(stdscr, LINES, COLS, dlg.screen.atr);
+       int lines, columns;
+
+       lines = getmaxy(stdscr);
+       columns = getmaxx(stdscr);
+
+       attr_clear(stdscr, lines, columns, dlg.screen.atr);
        /* Display background title if it exists ... - SLH */
        if (dlg.backtitle != NULL) {
-               int i;
+               int i, len = 0, skip = 0;
+               struct subtitle_list *pos;
 
                wattrset(stdscr, dlg.screen.atr);
                mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle);
+
+               for (pos = dlg.subtitles; pos != NULL; pos = pos->next) {
+                       /* 3 is for the arrow and spaces */
+                       len += strlen(pos->text) + 3;
+               }
+
                wmove(stdscr, 1, 1);
-               for (i = 1; i < COLS - 1; i++)
+               if (len > columns - 2) {
+                       const char *ellipsis = "[...] ";
+                       waddstr(stdscr, ellipsis);
+                       skip = len - (columns - 2 - strlen(ellipsis));
+               }
+
+               for (pos = dlg.subtitles; pos != NULL; pos = pos->next) {
+                       if (skip == 0)
+                               waddch(stdscr, ACS_RARROW);
+                       else
+                               skip--;
+
+                       if (skip == 0)
+                               waddch(stdscr, ' ');
+                       else
+                               skip--;
+
+                       if (skip < strlen(pos->text)) {
+                               waddstr(stdscr, pos->text + skip);
+                               skip = 0;
+                       } else
+                               skip -= strlen(pos->text);
+
+                       if (skip == 0)
+                               waddch(stdscr, ' ');
+                       else
+                               skip--;
+               }
+
+               for (i = len + 1; i < columns - 1; i++)
                        waddch(stdscr, ACS_HLINE);
        }
        wnoutrefresh(stdscr);
@@ -281,7 +322,7 @@
        getyx(stdscr, saved_y, saved_x);
 
        getmaxyx(stdscr, height, width);
-       if (height < 19 || width < 80) {
+       if (height < WINDOW_HEIGTH_MIN || width < WINDOW_WIDTH_MIN) {
                endwin();
                return -ERRDISPLAYTOOSMALL;
        }
@@ -302,6 +343,11 @@
        dlg.backtitle = backtitle;
 }
 
+void set_dialog_subtitles(struct subtitle_list *subtitles)
+{
+       dlg.subtitles = subtitles;
+}
+
 /*
  * End using dialog functions.
  */
@@ -330,27 +376,19 @@
 /*
  * Print a string of text in a window, automatically wrap around to the
  * next line if the string is too long to fit on one line. Newline
- * characters '\n' are replaced by spaces.  We start on a new line
+ * characters '\n' are propperly processed.  We start on a new line
  * if there is no room for at least 4 nonblanks following a double-space.
  */
 void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
 {
        int newl, cur_x, cur_y;
-       int i, prompt_len, room, wlen;
-       char tempstr[MAX_LEN + 1], *word, *sp, *sp2;
+       int prompt_len, room, wlen;
+       char tempstr[MAX_LEN + 1], *word, *sp, *sp2, *newline_separator = 0;
 
        strcpy(tempstr, prompt);
 
        prompt_len = strlen(tempstr);
 
-       /*
-        * Remove newlines
-        */
-       for (i = 0; i < prompt_len; i++) {
-               if (tempstr[i] == '\n')
-                       tempstr[i] = ' ';
-       }
-
        if (prompt_len <= width - x * 2) {      /* If prompt is short */
                wmove(win, y, (width - prompt_len) / 2);
                waddstr(win, tempstr);
@@ -360,7 +398,10 @@
                newl = 1;
                word = tempstr;
                while (word && *word) {
-                       sp = strchr(word, ' ');
+                       sp = strpbrk(word, "\n ");
+                       if (sp && *sp == '\n')
+                               newline_separator = sp;
+
                        if (sp)
                                *sp++ = 0;
 
@@ -372,7 +413,7 @@
                        if (wlen > room ||
                            (newl && wlen < 4 && sp
                             && wlen + 1 + strlen(sp) > room
-                            && (!(sp2 = strchr(sp, ' '))
+                            && (!(sp2 = strpbrk(sp, "\n "))
                                 || wlen + 1 + (sp2 - sp) > room))) {
                                cur_y++;
                                cur_x = x;
@@ -380,7 +421,15 @@
                        wmove(win, cur_y, cur_x);
                        waddstr(win, word);
                        getyx(win, cur_y, cur_x);
-                       cur_x++;
+
+                       /* Move to the next line if the word separator was a 
newline */
+                       if (newline_separator) {
+                               cur_y++;
+                               cur_x = x;
+                               newline_separator = 0;
+                       } else
+                               cur_x++;
+
                        if (sp && *sp == ' ') {
                                cur_x++;        /* double space */
                                while (*++sp == ' ') ;
@@ -574,7 +623,7 @@
 void item_add_str(const char *fmt, ...)
 {
        va_list ap;
-        size_t avail;
+       size_t avail;
 
        avail = sizeof(item_cur->node.str) - strlen(item_cur->node.str);
 

Modified: trunk/scripts/config/lxdialog/yesno.c
===================================================================
--- trunk/scripts/config/lxdialog/yesno.c       2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/lxdialog/yesno.c       2015-01-08 14:33:53 UTC (rev 
43873)
@@ -45,14 +45,14 @@
        WINDOW *dialog;
 
 do_resize:
-       if (getmaxy(stdscr) < (height + 4))
+       if (getmaxy(stdscr) < (height + YESNO_HEIGTH_MIN))
                return -ERRDISPLAYTOOSMALL;
-       if (getmaxx(stdscr) < (width + 4))
+       if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN))
                return -ERRDISPLAYTOOSMALL;
 
        /* center dialog box on screen */
-       x = (COLS - width) / 2;
-       y = (LINES - height) / 2;
+       x = (getmaxx(stdscr) - width) / 2;
+       y = (getmaxy(stdscr) - height) / 2;
 
        draw_shadow(stdscr, y, x, height, width);
 

Modified: trunk/scripts/config/mconf.c
===================================================================
--- trunk/scripts/config/mconf.c        2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/mconf.c        2015-01-08 14:33:53 UTC (rev 43873)
@@ -35,16 +35,16 @@
 "\n"
 "To change any of these features, highlight it with the cursor\n"
 "keys and press <Y> to build it in, <M> to make it a module or\n"
-"<N> to removed it.  You may also press the <Space Bar> to cycle\n"
-"through the available options (ie. Y->N->M->Y).\n"
+"<N> to remove it.  You may also press the <Space Bar> to cycle\n"
+"through the available options (i.e. Y->N->M->Y).\n"
 "\n"
 "Some additional keyboard hints:\n"
 "\n"
 "Menus\n"
 "----------\n"
-"o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"
-"   you wish to change or submenu wish to select and press <Enter>.\n"
-"   Submenus are designated by \"--->\".\n"
+"o  Use the Up/Down arrow keys (cursor keys) to highlight the item you\n"
+"   wish to change or the submenu you wish to select and press <Enter>.\n"
+"   Submenus are designated by \"--->\", empty ones by \"----\".\n"
 "\n"
 "   Shortcut: Press the option's highlighted letter (hotkey).\n"
 "             Pressing a hotkey more than once will sequence\n"
@@ -61,7 +61,7 @@
 "             there is a delayed response which you may find annoying.\n"
 "\n"
 "   Also, the <TAB> and cursor keys will cycle between <Select>,\n"
-"   <Exit> and <Help>.\n"
+"   <Exit>, <Help>, <Save>, and <Load>.\n"
 "\n"
 "o  To get help with an item, use the cursor keys to highlight <Help>\n"
 "   and press <ENTER>.\n"
@@ -101,7 +101,7 @@
 "Text Box    (Help Window)\n"
 "--------\n"
 "o  Use the cursor keys to scroll up/down/left/right.  The VI editor\n"
-"   keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for \n"
+"   keys h,j,k,l function here as do <u>, <d>, <SPACE BAR> and <B> for\n"
 "   those who are familiar with less and lynx.\n"
 "\n"
 "o  Press <E>, <X>, <q>, <Enter> or <Esc><Esc> to exit.\n"
@@ -113,23 +113,21 @@
 "those who, for various reasons, find it necessary to switch\n"
 "between different configurations.\n"
 "\n"
-"At the end of the main menu you will find two options.  One is\n"
-"for saving the current configuration to a file of your choosing.\n"
-"The other option is for loading a previously saved alternate\n"
-"configuration.\n"
+"The <Save> button will let you save the current configuration to\n"
+"a file of your choosing.  Use the <Load> button to load a previously\n"
+"saved alternate configuration.\n"
 "\n"
-"Even if you don't use alternate configuration files, but you\n"
-"find during a Menuconfig session that you have completely messed\n"
-"up your settings, you may use the \"Load Alternate...\" option to\n"
-"restore your previously saved settings from \".config\" without\n"
-"restarting Menuconfig.\n"
+"Even if you don't use alternate configuration files, but you find\n"
+"during a Menuconfig session that you have completely messed up your\n"
+"settings, you may use the <Load> button to restore your previously\n"
+"saved settings from \".config\" without restarting Menuconfig.\n"
 "\n"
 "Other information\n"
 "-----------------\n"
-"If you use Menuconfig in an XTERM window make sure you have your\n"
-"$TERM variable set to point to a xterm definition which supports color.\n"
-"Otherwise, Menuconfig will look rather bad.  Menuconfig will not\n"
-"display correctly in a RXVT window because rxvt displays only one\n"
+"If you use Menuconfig in an XTERM window, make sure you have your\n"
+"$TERM variable set to point to an xterm definition which supports\n"
+"color.  Otherwise, Menuconfig will look rather bad.  Menuconfig will\n"
+"not display correctly in an RXVT window because rxvt displays only one\n"
 "intensity of color, bright.\n"
 "\n"
 "Menuconfig will display larger menus on screens or xterms which are\n"
@@ -144,8 +142,8 @@
 "\n"
 "Optional personality available\n"
 "------------------------------\n"
-"If you prefer to have all of the options listed in a single menu, rather\n"
-"than the default multimenu hierarchy, run the menuconfig with\n"
+"If you prefer to have all of the options listed in a single menu,\n"
+"rather than the default multimenu hierarchy, run the menuconfig with\n"
 "MENUCONFIG_MODE environment variable set to single_menu. Example:\n"
 "\n"
 "make MENUCONFIG_MODE=single_menu menuconfig\n"
@@ -168,11 +166,11 @@
 " mono       => selects colors suitable for monochrome displays\n"
 " blackbg    => selects a color scheme with black background\n"
 " classic    => theme with blue background. The classic look\n"
-" bluetitle  => a LCD friendly version of classic. (default)\n"
+" bluetitle  => an LCD friendly version of classic. (default)\n"
 "\n"),
 menu_instructions[] = N_(
        "Arrow keys navigate the menu.  "
-       "<Enter> selects submenus --->.  "
+       "<Enter> selects submenus ---> (or empty submenus ----).  "
        "Highlighted letters are hotkeys.  "
        "Pressing <Y> includes, <N> excludes, <M> modularizes features.  "
        "Press <Esc><Esc> to exit, <?> for Help, </> for Search.  "
@@ -234,24 +232,24 @@
        "Symbol: FOO [=m]\n"
        "Type  : tristate\n"
        "Prompt: Foo bus is used to drive the bar HW\n"
-       "  Defined at drivers/pci/Kconfig:47\n"
-       "  Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
        "  Location:\n"
        "    -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
        "      -> PCI support (PCI [=y])\n"
        "(1)     -> PCI access mode (<choice> [=y])\n"
+       "  Defined at drivers/pci/Kconfig:47\n"
+       "  Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
        "  Selects: LIBCRC32\n"
-       "  Selected by: BAR\n"
+       "  Selected by: BAR [=n]\n"
        "-----------------------------------------------------------------\n"
        "o The line 'Type:' shows the type of the configuration option for\n"
        "  this symbol (boolean, tristate, string, ...)\n"
        "o The line 'Prompt:' shows the text used in the menu structure for\n"
        "  this symbol\n"
-       "o The 'Defined at' line tell at what file / line number the symbol\n"
+       "o The 'Defined at' line tells at what file / line number the symbol\n"
        "  is defined\n"
-       "o The 'Depends on:' line tell what symbols needs to be defined for\n"
+       "o The 'Depends on:' line tells what symbols need to be defined for\n"
        "  this symbol to be visible in the menu (selectable)\n"
-       "o The 'Location:' lines tell where in the menu structure this symbol\n"
+       "o The 'Location:' lines tells where in the menu structure this 
symbol\n"
        "  is located\n"
        "    A location followed by a [=y] indicates that this is a\n"
        "    selectable menu item - and the current value is displayed inside\n"
@@ -259,9 +257,9 @@
        "    Press the key in the (#) prefix to jump directly to that\n"
        "    location. You will be returned to the current search results\n"
        "    after exiting this new menu.\n"
-       "o The 'Selects:' line tell what symbol will be automatically\n"
+       "o The 'Selects:' line tells what symbols will be automatically\n"
        "  selected if this symbol is selected (y or m)\n"
-       "o The 'Selected by' line tell what symbol has selected this symbol\n"
+       "o The 'Selected by' line tells what symbol has selected this symbol\n"
        "\n"
        "Only relevant lines are shown.\n"
        "\n\n"
@@ -297,7 +295,7 @@
        int size;
 
        size = snprintf(menu_backtitle, sizeof(menu_backtitle),
-                       "%s - %s", config_filename, rootmenu.prompt->text);
+                       "%s - %s", config_filename, rootmenu.prompt->text);
        if (size >= sizeof(menu_backtitle))
                menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
        set_dialog_backtitle(menu_backtitle);
@@ -307,7 +305,51 @@
                filename[sizeof(filename)-1] = '\0';
 }
 
+struct subtitle_part {
+       struct list_head entries;
+       const char *text;
+};
+static LIST_HEAD(trail);
 
+static struct subtitle_list *subtitles;
+static void set_subtitle(void)
+{
+       struct subtitle_part *sp;
+       struct subtitle_list *pos, *tmp;
+
+       for (pos = subtitles; pos != NULL; pos = tmp) {
+               tmp = pos->next;
+               free(pos);
+       }
+
+       subtitles = NULL;
+       list_for_each_entry(sp, &trail, entries) {
+               if (sp->text) {
+                       if (pos) {
+                               pos->next = xcalloc(1, sizeof(*pos));
+                               pos = pos->next;
+                       } else {
+                               subtitles = pos = xcalloc(1, sizeof(*pos));
+                       }
+                       pos->text = sp->text;
+               }
+       }
+
+       set_dialog_subtitles(subtitles);
+}
+
+static void reset_subtitle(void)
+{
+       struct subtitle_list *pos, *tmp;
+
+       for (pos = subtitles; pos != NULL; pos = tmp) {
+               tmp = pos->next;
+               free(pos);
+       }
+       subtitles = NULL;
+       set_dialog_subtitles(subtitles);
+}
+
 struct search_data {
        struct list_head *head;
        struct menu **targets;
@@ -349,10 +391,12 @@
        char *dialog_input;
        int dres, vscroll = 0, hscroll = 0;
        bool again;
+       struct gstr sttext;
+       struct subtitle_part stpart;
 
        title = str_new();
-       str_printf( &title, _("Enter %s (sub)string to search for "
-                             "(with or without \"%s\")"), CONFIG_, CONFIG_);
+       str_printf( &title, _("Enter (sub)string or regexp to search for "
+                             "(with or without \"%s\")"), CONFIG_);
 
 again:
        dialog_clear();
@@ -375,6 +419,11 @@
        if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
                dialog_input += strlen(CONFIG_);
 
+       sttext = str_new();
+       str_printf(&sttext, "Search (%s)", dialog_input_result);
+       stpart.text = str_get(&sttext);
+       list_add_tail(&stpart.entries, &trail);
+
        sym_arr = sym_re_search(dialog_input);
        do {
                LIST_HEAD(head);
@@ -385,8 +434,10 @@
                        .targets = targets,
                        .keys = keys,
                };
+               struct jump_key *pos, *tmp;
 
                res = get_relations_str(sym_arr, &head);
+               set_subtitle();
                dres = show_textbox_ext(_("Search Results"), (char *)
                                        str_get(&res), 0, 0, keys, &vscroll,
                                        &hscroll, &update_text, (void *)
@@ -398,9 +449,13 @@
                                again = true;
                        }
                str_free(&res);
+               list_for_each_entry_safe(pos, tmp, &head, entries)
+                       free(pos);
        } while (again);
        free(sym_arr);
        str_free(&title);
+       list_del(trail.prev);
+       str_free(&sttext);
 }
 
 static void build_conf(struct menu *menu)
@@ -437,8 +492,9 @@
                                                  menu->data ? "-->" : "++>",
                                                  indent + 1, ' ', prompt);
                                } else
-                                       item_make("   %*c%s  --->", indent + 1, 
' ', prompt);
-
+                                       item_make("   %*c%s  %s",
+                                                 indent + 1, ' ', prompt,
+                                                 menu_is_empty(menu) ? "----" 
: "--->");
                                item_set_tag('m');
                                item_set_data(menu);
                                if (single_menu_mode && menu->data)
@@ -569,7 +625,7 @@
                          (sym_has_value(sym) || !sym_is_changable(sym)) ?
                          "" : _(" (NEW)"));
                if (menu->prompt->type == P_MENU) {
-                       item_add_str("  --->");
+                       item_add_str("  %s", menu_is_empty(menu) ? "----" : 
"--->");
                        return;
                }
        }
@@ -585,27 +641,36 @@
 {
        struct menu *submenu;
        const char *prompt = menu_get_prompt(menu);
+       struct subtitle_part stpart;
        struct symbol *sym;
        int res;
        int s_scroll = 0;
 
+       if (menu != &rootmenu)
+               stpart.text = menu_get_prompt(menu);
+       else
+               stpart.text = NULL;
+       list_add_tail(&stpart.entries, &trail);
+
        while (1) {
                item_reset();
                current_menu = menu;
                build_conf(menu);
                if (!child_count)
                        break;
+               set_subtitle();
                dialog_clear();
                res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
                                  _(menu_instructions),
                                  active_menu, &s_scroll);
                if (res == 1 || res == KEY_ESC || res == -ERRDISPLAYTOOSMALL)
                        break;
-               if (!item_activate_selected())
-                       continue;
-               if (!item_tag())
-                       continue;
-
+               if (item_count() != 0) {
+                       if (!item_activate_selected())
+                               continue;
+                       if (!item_tag())
+                               continue;
+               }
                submenu = item_data();
                active_menu = item_data();
                if (submenu)
@@ -636,13 +701,17 @@
                case 2:
                        if (sym)
                                show_help(submenu);
-                       else
+                       else {
+                               reset_subtitle();
                                show_helptext(_("README"), _(mconf_readme));
+                       }
                        break;
                case 3:
+                       reset_subtitle();
                        conf_save();
                        break;
                case 4:
+                       reset_subtitle();
                        conf_load();
                        break;
                case 5:
@@ -675,6 +744,8 @@
                        break;
                }
        }
+
+       list_del(trail.prev);
 }
 
 static int show_textbox_ext(const char *title, char *text, int r, int c, int
@@ -751,7 +822,9 @@
                dialog_clear();
                res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),
                                        _(radiolist_instructions),
-                                        15, 70, 6);
+                                       MENUBOX_HEIGTH_MIN,
+                                       MENUBOX_WIDTH_MIN,
+                                       CHECKLIST_HEIGTH_MIN);
                selected = item_activate_selected();
                switch (res) {
                case 0:
@@ -887,11 +960,12 @@
        int res;
 
        save_and_exit = 1;
+       reset_subtitle();
        dialog_clear();
        if (conf_get_changed())
                res = dialog_yesno(NULL,
-                                  _("Do you wish to save your new 
configuration ?\n"
-                                    "<ESC><ESC> to continue."),
+                                  _("Do you wish to save your new 
configuration?\n"
+                                    "(Press <ESC><ESC> to continue kernel 
configuration.)"),
                                   6, 60);
        else
                res = -1;
@@ -966,4 +1040,3 @@
 
        return res;
 }
-

Modified: trunk/scripts/config/menu.c
===================================================================
--- trunk/scripts/config/menu.c 2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/menu.c 2015-01-08 14:33:53 UTC (rev 43873)
@@ -119,9 +119,10 @@
                sym->type = type;
                return;
        }
-       menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'",
-           sym->name ? sym->name : "<choice>",
-           sym_type_name(sym->type), sym_type_name(type));
+       menu_warn(current_entry,
+               "ignoring type redefinition of '%s' from '%s' to '%s'",
+               sym->name ? sym->name : "<choice>",
+               sym_type_name(sym->type), sym_type_name(type));
 }
 
 struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr 
*expr, struct expr *dep)
@@ -146,11 +147,24 @@
                        struct menu *menu = current_entry;
 
                        while ((menu = menu->parent) != NULL) {
+                               struct expr *dup_expr;
+
                                if (!menu->visibility)
                                        continue;
+                               /*
+                                * Do not add a reference to the
+                                * menu's visibility expression but
+                                * use a copy of it.  Otherwise the
+                                * expression reduction functions
+                                * will modify expressions that have
+                                * multiple references which can
+                                * cause unwanted side effects.
+                                */
+                               dup_expr = expr_copy(menu->visibility);
+
                                prop->visible.expr
                                        = expr_alloc_and(prop->visible.expr,
-                                                        menu->visibility);
+                                                        dup_expr);
                        }
                }
 
@@ -184,12 +198,15 @@
 
 void menu_add_option(int token, char *arg)
 {
-       struct property *prop;
-
        switch (token) {
        case T_OPT_MODULES:
-               prop = prop_alloc(P_DEFAULT, modules_sym);
-               prop->expr = expr_alloc_symbol(current_entry->sym);
+               if (modules_sym)
+                       zconf_error("symbol '%s' redefines option 'modules'"
+                                   " already defined by symbol '%s'",
+                                   current_entry->sym->name,
+                                   modules_sym->name
+                                   );
+               modules_sym = current_entry->sym;
                break;
        case T_OPT_DEFCONFIG_LIST:
                if (!sym_defconfig_list)
@@ -200,6 +217,9 @@
        case T_OPT_ENV:
                prop_add_env(arg);
                break;
+       case T_OPT_ALLNOCONFIG_Y:
+               current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
+               break;
        }
 }
 
@@ -238,8 +258,8 @@
                                    "config symbol '%s' uses select, but is "
                                    "not boolean or tristate", sym->name);
                        else if (sym2->type != S_UNKNOWN &&
-                                sym2->type != S_BOOLEAN &&
-                                sym2->type != S_TRISTATE)
+                                sym2->type != S_BOOLEAN &&
+                                sym2->type != S_TRISTATE)
                                prop_warn(prop,
                                    "'%s' has wrong type. 'select' only "
                                    "accept arguments of boolean and "
@@ -248,7 +268,7 @@
                case P_RANGE:
                        if (sym->type != S_INT && sym->type != S_HEX)
                                prop_warn(prop, "range is only allowed "
-                                               "for int or hex symbols");
+                                               "for int or hex symbols");
                        if (!menu_validate_number(sym, prop->expr->left.sym) ||
                            !menu_validate_number(sym, prop->expr->right.sym))
                                prop_warn(prop, "range is invalid");
@@ -430,6 +450,22 @@
        return true;
 }
 
+/*
+ * Determine if a menu is empty.
+ * A menu is considered empty if it contains no or only
+ * invisible entries.
+ */
+bool menu_is_empty(struct menu *menu)
+{
+       struct menu *child;
+
+       for (child = menu->list; child; child = child->next) {
+               if (menu_is_visible(child))
+                       return(false);
+       }
+       return(true);
+}
+
 bool menu_is_visible(struct menu *menu)
 {
        struct menu *child;
@@ -512,16 +548,9 @@
 {
        int i, j;
        struct menu *submenu[8], *menu, *location = NULL;
-       struct jump_key *jump;
+       struct jump_key *jump = NULL;
 
        str_printf(r, _("Prompt: %s\n"), _(prop->text));
-       str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
-               prop->menu->lineno);
-       if (!expr_is_yes(prop->visible.expr)) {
-               str_append(r, _("  Depends on: "));
-               expr_gstr_print(prop->visible.expr, r);
-               str_append(r, "\n");
-       }
        menu = prop->menu->parent;
        for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) {
                bool accessible = menu_is_visible(menu);
@@ -557,8 +586,8 @@
                str_printf(r, _("  Location:\n"));
                for (j = 4; --i >= 0; j += 2) {
                        menu = submenu[i];
-                       if (head && location && menu == location)
-                               jump->offset = r->len - 1;
+                       if (jump && menu == location)
+                               jump->offset = strlen(r->s);
                        str_printf(r, "%*c-> %s", j, ' ',
                                   _(menu_get_prompt(menu)));
                        if (menu->sym) {
@@ -572,6 +601,18 @@
 }
 
 /*
+ * get property of type P_SYMBOL
+ */
+static struct property *get_symbol_prop(struct symbol *sym)
+{
+       struct property *prop = NULL;
+
+       for_all_properties(sym, prop, P_SYMBOL)
+               break;
+       return prop;
+}
+
+/*
  * head is optional and may be NULL
  */
 void get_symbol_str(struct gstr *r, struct symbol *sym,
@@ -595,6 +636,18 @@
        }
        for_all_prompts(sym, prop)
                get_prompt_str(r, prop, head);
+
+       prop = get_symbol_prop(sym);
+       if (prop) {
+               str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name,
+                       prop->menu->lineno);
+               if (!expr_is_yes(prop->visible.expr)) {
+                       str_append(r, _("  Depends on: "));
+                       expr_gstr_print(prop->visible.expr, r);
+                       str_append(r, "\n");
+               }
+       }
+
        hit = false;
        for_all_properties(sym, prop, P_SELECT) {
                if (!hit) {

Modified: trunk/scripts/config/symbol.c
===================================================================
--- trunk/scripts/config/symbol.c       2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/symbol.c       2015-01-08 14:33:53 UTC (rev 43873)
@@ -136,7 +136,7 @@
        return NULL;
 }
 
-static int sym_get_range_val(struct symbol *sym, int base)
+static long long sym_get_range_val(struct symbol *sym, int base)
 {
        sym_calc_value(sym);
        switch (sym->type) {
@@ -149,13 +149,14 @@
        default:
                break;
        }
-       return strtol(sym->curr.val, NULL, base);
+       return strtoll(sym->curr.val, NULL, base);
 }
 
 static void sym_validate_range(struct symbol *sym)
 {
        struct property *prop;
-       int base, val, val2;
+       int base;
+       long long val, val2;
        char str[64];
 
        switch (sym->type) {
@@ -171,7 +172,7 @@
        prop = sym_get_range_prop(sym);
        if (!prop)
                return;
-       val = strtol(sym->curr.val, NULL, base);
+       val = strtoll(sym->curr.val, NULL, base);
        val2 = sym_get_range_val(prop->expr->left.sym, base);
        if (val >= val2) {
                val2 = sym_get_range_val(prop->expr->right.sym, base);
@@ -179,9 +180,9 @@
                        return;
        }
        if (sym->type == S_INT)
-               sprintf(str, "%d", val2);
+               sprintf(str, "%lld", val2);
        else
-               sprintf(str, "0x%x", val2);
+               sprintf(str, "0x%llx", val2);
        sym->curr.val = strdup(str);
 }
 
@@ -300,6 +301,14 @@
 
        if (sym->flags & SYMBOL_VALID)
                return;
+
+       if (sym_is_choice_value(sym) &&
+           sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) {
+               sym->flags &= ~SYMBOL_NEED_SET_CHOICE_VALUES;
+               prop = sym_get_choice_prop(sym);
+               sym_calc_value(prop_get_symbol(prop));
+       }
+
        sym->flags |= SYMBOL_VALID;
 
        oldval = sym->curr;
@@ -425,6 +434,9 @@
 
        if (sym->flags & SYMBOL_AUTO)
                sym->flags &= ~SYMBOL_WRITE;
+
+       if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES)
+               set_all_choice_values(sym);
 }
 
 void sym_clear_all_valid(void)
@@ -583,7 +595,7 @@
 bool sym_string_within_range(struct symbol *sym, const char *str)
 {
        struct property *prop;
-       int val;
+       long long val;
 
        switch (sym->type) {
        case S_STRING:
@@ -594,7 +606,7 @@
                prop = sym_get_range_prop(sym);
                if (!prop)
                        return true;
-               val = strtol(str, NULL, 10);
+               val = strtoll(str, NULL, 10);
                return val >= sym_get_range_val(prop->expr->left.sym, 10) &&
                       val <= sym_get_range_val(prop->expr->right.sym, 10);
        case S_HEX:
@@ -603,7 +615,7 @@
                prop = sym_get_range_prop(sym);
                if (!prop)
                        return true;
-               val = strtol(str, NULL, 16);
+               val = strtoll(str, NULL, 16);
                return val >= sym_get_range_val(prop->expr->left.sym, 16) &&
                       val <= sym_get_range_val(prop->expr->right.sym, 16);
        case S_BOOLEAN:
@@ -943,38 +955,89 @@
        return res;
 }
 
+struct sym_match {
+       struct symbol   *sym;
+       off_t           so, eo;
+};
+
+/* Compare matched symbols as thus:
+ * - first, symbols that match exactly
+ * - then, alphabetical sort
+ */
+static int sym_rel_comp(const void *sym1, const void *sym2)
+{
+       const struct sym_match *s1 = sym1;
+       const struct sym_match *s2 = sym2;
+       int exact1, exact2;
+
+       /* Exact match:
+        * - if matched length on symbol s1 is the length of that symbol,
+        *   then this symbol should come first;
+        * - if matched length on symbol s2 is the length of that symbol,
+        *   then this symbol should come first.
+        * Note: since the search can be a regexp, both symbols may match
+        * exactly; if this is the case, we can't decide which comes first,
+        * and we fallback to sorting alphabetically.
+        */
+       exact1 = (s1->eo - s1->so) == strlen(s1->sym->name);
+       exact2 = (s2->eo - s2->so) == strlen(s2->sym->name);
+       if (exact1 && !exact2)
+               return -1;
+       if (!exact1 && exact2)
+               return 1;
+
+       /* As a fallback, sort symbols alphabetically */
+       return strcmp(s1->sym->name, s2->sym->name);
+}
+
 struct symbol **sym_re_search(const char *pattern)
 {
        struct symbol *sym, **sym_arr = NULL;
+       struct sym_match *sym_match_arr = NULL;
        int i, cnt, size;
        regex_t re;
+       regmatch_t match[1];
 
        cnt = size = 0;
        /* Skip if empty */
        if (strlen(pattern) == 0)
                return NULL;
-       if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE))
+       if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))
                return NULL;
 
        for_all_symbols(i, sym) {
                if (sym->flags & SYMBOL_CONST || !sym->name)
                        continue;
-               if (regexec(&re, sym->name, 0, NULL, 0))
+               if (regexec(&re, sym->name, 1, match, 0))
                        continue;
-               if (cnt + 1 >= size) {
-                       void *tmp = sym_arr;
+               if (cnt >= size) {
+                       void *tmp;
                        size += 16;
-                       sym_arr = realloc(sym_arr, size * sizeof(struct symbol 
*));
-                       if (!sym_arr) {
-                               free(tmp);
-                               return NULL;
-                       }
+                       tmp = realloc(sym_match_arr, size * sizeof(struct 
sym_match));
+                       if (!tmp)
+                               goto sym_re_search_free;
+                       sym_match_arr = tmp;
                }
                sym_calc_value(sym);
-               sym_arr[cnt++] = sym;
+               /* As regexec returned 0, we know we have a match, so
+                * we can use match[0].rm_[se]o without further checks
+                */
+               sym_match_arr[cnt].so = match[0].rm_so;
+               sym_match_arr[cnt].eo = match[0].rm_eo;
+               sym_match_arr[cnt++].sym = sym;
        }
-       if (sym_arr)
+       if (sym_match_arr) {
+               qsort(sym_match_arr, cnt, sizeof(struct sym_match), 
sym_rel_comp);
+               sym_arr = malloc((cnt+1) * sizeof(struct symbol));
+               if (!sym_arr)
+                       goto sym_re_search_free;
+               for (i = 0; i < cnt; i++)
+                       sym_arr[i] = sym_match_arr[i].sym;
                sym_arr[cnt] = NULL;
+       }
+sym_re_search_free:
+       /* sym_match_arr can be NULL if no match, but free(NULL) is OK */
+       free(sym_match_arr);
        regfree(&re);
 
        return sym_arr;
@@ -984,7 +1047,7 @@
  * When we check for recursive dependencies we use a stack to save
  * current state so we can print out relevant info to user.
  * The entries are located on the call stack so no need to free memory.
- * Note inser() remove() must always match to properly clear the stack.
+ * Note insert() remove() must always match to properly clear the stack.
  */
 static struct dep_stack {
        struct dep_stack *prev, *next;

Modified: trunk/scripts/config/util.c
===================================================================
--- trunk/scripts/config/util.c 2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/util.c 2015-01-08 14:33:53 UTC (rev 43873)
@@ -155,5 +155,3 @@
        fprintf(stderr, "Out of memory.\n");
        exit(1);
 }
-
-

Modified: trunk/scripts/config/zconf.gperf
===================================================================
--- trunk/scripts/config/zconf.gperf    2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/zconf.gperf    2015-01-08 14:33:53 UTC (rev 43873)
@@ -43,5 +43,6 @@
 modules,       T_OPT_MODULES,  TF_OPTION
 defconfig_list,        T_OPT_DEFCONFIG_LIST,TF_OPTION
 env,           T_OPT_ENV,      TF_OPTION
+allnoconfig_y, T_OPT_ALLNOCONFIG_Y,TF_OPTION
 reset,         T_RESET,        TF_COMMAND
 %%

Modified: trunk/scripts/config/zconf.hash.c_shipped
===================================================================
--- trunk/scripts/config/zconf.hash.c_shipped   2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/zconf.hash.c_shipped   2015-01-08 14:33:53 UTC (rev 
43873)
@@ -1,5 +1,5 @@
-/* ANSI-C code produced by gperf version 3.0.4 */
-/* Command-line: gperf  */
+/* ANSI-C code produced by gperf version 3.0.3 */
+/* Command-line: 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/gperf
  */
 /* Computed positions: -k'1,3' */
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -32,11 +32,13 @@
 struct kconf_id;
 /* maximum key range = 47, duplicates = 0 */
 
-#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || 
defined(__cplusplus) || defined(__GNUC_STDC_INLINE__)
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
 inline
-#elif defined(__GNUC__)
-__inline
 #endif
+#endif
 static unsigned int
 kconf_id_hash (register const char *str, register unsigned int len)
 {
@@ -51,7 +53,7 @@
       49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
       49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
       49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
-      49, 49, 49, 49, 49, 49, 49, 49, 40,  5,
+      49, 49, 49, 49, 49, 49, 49, 20, 40,  5,
        0,  0,  5, 49,  5, 20, 49, 49,  5, 20,
        5,  0, 35, 49,  0, 15,  0, 10, 15, 49,
       25, 49, 49, 49, 49, 49, 49, 49, 49, 49,
@@ -69,7 +71,7 @@
       49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
       49, 49, 49, 49, 49, 49
     };
-  register int hval = len;
+  register unsigned int hval = len;
 
   switch (hval)
     {
@@ -114,6 +116,7 @@
     char kconf_id_strings_str33[sizeof("hex")];
     char kconf_id_strings_str35[sizeof("menuconfig")];
     char kconf_id_strings_str37[sizeof("visible")];
+    char kconf_id_strings_str38[sizeof("allnoconfig_y")];
     char kconf_id_strings_str41[sizeof("prompt")];
     char kconf_id_strings_str42[sizeof("depends")];
     char kconf_id_strings_str44[sizeof("bool")];
@@ -150,6 +153,7 @@
     "hex",
     "menuconfig",
     "visible",
+    "allnoconfig_y",
     "prompt",
     "depends",
     "bool",
@@ -157,18 +161,12 @@
     "mainmenu"
   };
 #define kconf_id_strings ((const char *) &kconf_id_strings_contents)
-#ifdef __GNUC__
-__inline
-#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
-__attribute__ ((__gnu_inline__))
-#endif
-#endif
 struct kconf_id *
 kconf_id_lookup (register const char *str, register unsigned int len)
 {
   enum
     {
-      TOTAL_KEYWORDS = 33,
+      TOTAL_KEYWORDS = 34,
       MIN_WORD_LENGTH = 2,
       MAX_WORD_LENGTH = 14,
       MIN_HASH_VALUE = 2,
@@ -178,55 +176,56 @@
   static struct kconf_id wordlist[] =
     {
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str2,    
        T_ON,           TF_PARAM},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str2),             
T_ON,           TF_PARAM},
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str5,    
        T_ENDIF,        TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str6,    
        T_OPTION,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str7,    
T_ENDMENU,      TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str8,    
T_OPTIONAL,     TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str9,    
T_ENDCHOICE,    TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str10,   
        T_RANGE,        TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str11,   
        T_CHOICE,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str12,   
T_DEFAULT,      TF_COMMAND, S_UNKNOWN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str13,   
T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str14,   
        T_HELP,         TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str5),             
T_ENDIF,        TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str6),             
T_OPTION,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str7),     
T_ENDMENU,      TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str8),     
T_OPTIONAL,     TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str9),     
T_ENDCHOICE,    TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str10),            
T_RANGE,        TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str11),            
T_CHOICE,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str12),    
T_DEFAULT,      TF_COMMAND, S_UNKNOWN},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str13),    
T_DEFAULT,      TF_COMMAND, S_BOOLEAN},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str14),            
T_HELP,         TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str16,   
        T_CONFIG,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str17,   
T_DEFAULT,      TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str18,   
        T_OPT_ENV,      TF_OPTION},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str19,   
T_OPT_DEFCONFIG_LIST,TF_OPTION},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str20,   
        T_RESET,        TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str21,   
        T_TYPE,         TF_COMMAND, S_STRING},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str22,   
        T_IF,           TF_COMMAND|TF_PARAM},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str23,   
        T_TYPE,         TF_COMMAND, S_INT},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str16),            
T_CONFIG,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str17),    
T_DEFAULT,      TF_COMMAND, S_TRISTATE},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str18),            
T_OPT_ENV,      TF_OPTION},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str19),    
T_OPT_DEFCONFIG_LIST,TF_OPTION},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str20),            
T_RESET,        TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str21),            
T_TYPE,         TF_COMMAND, S_STRING},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str22),            
T_IF,           TF_COMMAND|TF_PARAM},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str23),            
T_TYPE,         TF_COMMAND, S_INT},
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str26,   
        T_SELECT,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str27,   
T_OPT_MODULES,  TF_OPTION},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str28,   
T_TYPE,         TF_COMMAND, S_TRISTATE},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str29,   
        T_MENU,         TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str26),            
T_SELECT,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str27),    
T_OPT_MODULES,  TF_OPTION},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str28),    T_TYPE, 
        TF_COMMAND, S_TRISTATE},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str29),            
T_MENU,         TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str31,   
        T_SOURCE,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str32,   
T_COMMENT,      TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str33,   
        T_TYPE,         TF_COMMAND, S_HEX},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str31),            
T_SOURCE,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str32),    
T_COMMENT,      TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str33),            
T_TYPE,         TF_COMMAND, S_HEX},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str35,   
T_MENUCONFIG,   TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str35),    
T_MENUCONFIG,   TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str37,   
T_VISIBLE,      TF_COMMAND},
-      {-1}, {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str41,   
        T_PROMPT,       TF_COMMAND},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str42,   
T_DEPENDS,      TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str37),    
T_VISIBLE,      TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str38),    
T_OPT_ALLNOCONFIG_Y,TF_OPTION},
+      {-1}, {-1},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str41),            
T_PROMPT,       TF_COMMAND},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str42),    
T_DEPENDS,      TF_COMMAND},
       {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str44,   
        T_TYPE,         TF_COMMAND, S_BOOLEAN},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str44),            
T_TYPE,         TF_COMMAND, S_BOOLEAN},
       {-1}, {-1},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str47,   
T_TYPE,         TF_COMMAND, S_BOOLEAN},
-      {(int)(long)&((struct kconf_id_strings_t *)0)->kconf_id_strings_str48,   
T_MAINMENU,     TF_COMMAND}
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str47),    T_TYPE, 
        TF_COMMAND, S_BOOLEAN},
+      {offsetof(struct kconf_id_strings_t, kconf_id_strings_str48),    
T_MAINMENU,     TF_COMMAND}
     };
 
   if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
     {
-      register int key = kconf_id_hash (str, len);
+      unsigned int key = kconf_id_hash (str, len);
 
-      if (key <= MAX_HASH_VALUE && key >= 0)
+      if (key <= MAX_HASH_VALUE)
         {
           register int o = wordlist[key].name;
           if (o >= 0)

Modified: trunk/scripts/config/zconf.l
===================================================================
--- trunk/scripts/config/zconf.l        2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/zconf.l        2015-01-08 14:33:53 UTC (rev 43873)
@@ -29,8 +29,8 @@
 static int text_size, text_asize;
 
 struct buffer {
-        struct buffer *parent;
-        YY_BUFFER_STATE state;
+       struct buffer *parent;
+       YY_BUFFER_STATE state;
 };
 
 struct buffer *current_buf;
@@ -70,7 +70,6 @@
 }
 %}
 
-ws     [ \n\t]
 n      [A-Za-z0-9_]
 
 %%

Modified: trunk/scripts/config/zconf.lex.c_shipped
===================================================================
--- trunk/scripts/config/zconf.lex.c_shipped    2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/zconf.lex.c_shipped    2015-01-08 14:33:53 UTC (rev 
43873)
@@ -792,8 +792,8 @@
 static int text_size, text_asize;
 
 struct buffer {
-        struct buffer *parent;
-        YY_BUFFER_STATE state;
+       struct buffer *parent;
+       YY_BUFFER_STATE state;
 };
 
 struct buffer *current_buf;

Modified: trunk/scripts/config/zconf.tab.c_shipped
===================================================================
--- trunk/scripts/config/zconf.tab.c_shipped    2015-01-08 12:46:44 UTC (rev 
43872)
+++ trunk/scripts/config/zconf.tab.c_shipped    2015-01-08 14:33:53 UTC (rev 
43873)
@@ -2311,9 +2311,6 @@
 
        sym_init();
        _menu_init();
-       modules_sym = sym_lookup(NULL, 0);
-       modules_sym->type = S_BOOLEAN;
-       modules_sym->flags |= SYMBOL_AUTO;
        rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", 
NULL);
 
 #if YYDEBUG
@@ -2323,13 +2320,9 @@
        zconfparse();
        if (zconfnerrs)
                exit(1);
-       if (!modules_sym->prop) {
-               struct property *prop;
+       if (!modules_sym)
+               modules_sym = sym_find( "n" );
 
-               prop = prop_alloc(P_DEFAULT, modules_sym);
-               prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
-       }
-
        rootmenu.prompt->text = _(rootmenu.prompt->text);
        rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
 
@@ -2337,7 +2330,7 @@
        for_all_symbols(i, sym) {
                if (sym_check_deps(sym))
                        zconfnerrs++;
-        }
+       }
        if (zconfnerrs)
                exit(1);
        sym_set_change_count(1);

Modified: trunk/scripts/config/zconf.y
===================================================================
--- trunk/scripts/config/zconf.y        2015-01-08 12:46:44 UTC (rev 43872)
+++ trunk/scripts/config/zconf.y        2015-01-08 14:33:53 UTC (rev 43873)
@@ -503,9 +503,6 @@
 
        sym_init();
        _menu_init();
-       modules_sym = sym_lookup(NULL, 0);
-       modules_sym->type = S_BOOLEAN;
-       modules_sym->flags |= SYMBOL_AUTO;
        rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", 
NULL);
 
 #if YYDEBUG
@@ -515,13 +512,9 @@
        zconfparse();
        if (zconfnerrs)
                exit(1);
-       if (!modules_sym->prop) {
-               struct property *prop;
+       if (!modules_sym)
+               modules_sym = sym_find( "n" );
 
-               prop = prop_alloc(P_DEFAULT, modules_sym);
-               prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
-       }
-
        rootmenu.prompt->text = _(rootmenu.prompt->text);
        rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
 
@@ -529,7 +522,7 @@
        for_all_symbols(i, sym) {
                if (sym_check_deps(sym))
                        zconfnerrs++;
-        }
+       }
        if (zconfnerrs)
                exit(1);
        sym_set_change_count(1);

_______________________________________________
openwrt-commits mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-commits

Reply via email to