OSDN Git Service

Merge/rework config system per the latest from linux-2.6.0-test2
authorEric Andersen <andersen@codepoet.org>
Tue, 5 Aug 2003 01:52:39 +0000 (01:52 -0000)
committerEric Andersen <andersen@codepoet.org>
Tue, 5 Aug 2003 01:52:39 +0000 (01:52 -0000)
 -Erik

13 files changed:
extra/config/conf.c
extra/config/confdata.c
extra/config/expr.c
extra/config/expr.h
extra/config/lex.zconf.c_shipped
extra/config/lkc.h
extra/config/lkc_proto.h
extra/config/mconf.c
extra/config/menu.c
extra/config/symbol.c
extra/config/zconf.l
extra/config/zconf.tab.c_shipped
extra/config/zconf.y

index 6bc5de9..20ea2c9 100644 (file)
@@ -35,50 +35,12 @@ static struct menu *rootEntry;
 
 static char nohelp_text[] = "Sorry, no help available for this option yet.\n";
 
-#if 0
-static void printc(int ch)
-{
-       static int sep = 0;
-
-       if (!sep) {
-               putchar('[');
-               sep = 1;
-       } else if (ch)
-               putchar('/');
-       if (!ch) {
-               putchar(']');
-               putchar(' ');
-               sep = 0;
-       } else
-               putchar(ch);
-}
-#endif
-
-static void printo(const char *o)
-{
-       static int sep = 0;
-
-       if (!sep) {
-               putchar('(');
-               sep = 1;
-       } else if (o) {
-               putchar(',');
-               putchar(' ');
-       }
-       if (!o) {
-               putchar(')');
-               putchar(' ');
-               sep = 0;
-       } else
-               printf("%s", o);
-}
-
 static void strip(char *str)
 {
        char *p = str;
        int l;
 
-       while ((isspace((int)*p)))
+       while ((isspace(*p)))
                p++;
        l = strlen(p);
        if (p != str)
@@ -86,10 +48,20 @@ static void strip(char *str)
        if (!l)
                return;
        p = str + l - 1;
-       while ((isspace((int)*p)))
+       while ((isspace(*p)))
                *p-- = 0;
 }
 
+static void check_stdin(void)
+{
+       if (!valid_stdin && input_mode == ask_silent) {
+               printf("aborted!\n\n");
+               printf("Console input/output is redirected. ");
+               printf("Run 'make oldconfig' to update configuration.\n\n");
+               exit(1);
+       }
+}
+
 static void conf_askvalue(struct symbol *sym, const char *def)
 {
        enum symbol_type type = sym_get_type(sym);
@@ -101,6 +73,13 @@ static void conf_askvalue(struct symbol *sym, const char *def)
        line[0] = '\n';
        line[1] = 0;
 
+       if (!sym_is_changable(sym)) {
+               printf("%s\n", def);
+               line[0] = '\n';
+               line[1] = 0;
+               return;
+       }
+
        switch (input_mode) {
        case ask_new:
        case ask_silent:
@@ -108,12 +87,7 @@ static void conf_askvalue(struct symbol *sym, const char *def)
                        printf("%s\n", def);
                        return;
                }
-               if (!valid_stdin && input_mode == ask_silent) {
-                       printf("aborted!\n\n");
-                       printf("Console input/output is redirected. ");
-                       printf("Run 'make oldconfig' to update configuration.\n\n");
-                       exit(1);
-               }
+               check_stdin();
        case ask_all:
                fflush(stdout);
                fgets(line, 128, stdin);
@@ -294,9 +268,8 @@ help:
 static int conf_choice(struct menu *menu)
 {
        struct symbol *sym, *def_sym;
-       struct menu *cmenu, *def_menu;
-       const char *help;
-       int type, len;
+       struct menu *child;
+       int type;
        bool is_new;
 
        sym = menu->sym;
@@ -314,72 +287,111 @@ static int conf_choice(struct menu *menu)
                        break;
                }
        } else {
-               sym->def = sym->curr;
-               if (S_TRI(sym->curr) == mod) {
+               switch (sym_get_tristate_value(sym)) {
+               case no:
+                       return 1;
+               case mod:
                        printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
                        return 0;
+               case yes:
+                       break;
                }
        }
 
        while (1) {
-               printf("%*s%s ", indent - 1, "", menu_get_prompt(menu));
+               int cnt, def;
+
+               printf("%*s%s\n", indent - 1, "", menu_get_prompt(menu));
                def_sym = sym_get_choice_value(sym);
-               def_menu = NULL;
-               for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
-                       if (!menu_is_visible(cmenu))
+               cnt = def = 0;
+               line[0] = '0';
+               line[1] = 0;
+               for (child = menu->list; child; child = child->next) {
+                       if (!menu_is_visible(child))
                                continue;
-                       printo(menu_get_prompt(cmenu));
-                       if (cmenu->sym == def_sym)
-                               def_menu = cmenu;
-               }
-               printo(NULL);
-               if (def_menu)
-                       printf("[%s] ", menu_get_prompt(def_menu));
-               else {
+                       if (!child->sym) {
+                               printf("%*c %s\n", indent, '*', menu_get_prompt(child));
+                               continue;
+                       }
+                       cnt++;
+                       if (child->sym == def_sym) {
+                               def = cnt;
+                               printf("%*c", indent, '>');
+                       } else
+                               printf("%*c", indent, ' ');
+                       printf(" %d. %s", cnt, menu_get_prompt(child));
+                       if (child->sym->name)
+                               printf(" (%s)", child->sym->name);
+                       if (!sym_has_value(child->sym))
+                               printf(" (NEW)");
                        printf("\n");
-                       return 1;
                }
+               printf("%*schoice", indent - 1, "");
+               if (cnt == 1) {
+                       printf("[1]: 1\n");
+                       goto conf_childs;
+               }
+               printf("[1-%d", cnt);
+               if (sym->help)
+                       printf("?");
+               printf("]: ");
                switch (input_mode) {
                case ask_new:
                case ask_silent:
+                       if (!is_new) {
+                               cnt = def;
+                               printf("%d\n", cnt);
+                               break;
+                       }
+                       check_stdin();
                case ask_all:
-                       conf_askvalue(sym, menu_get_prompt(def_menu));
+                       fflush(stdout);
+                       fgets(line, 128, stdin);
                        strip(line);
+                       if (line[0] == '?') {
+                               printf("\n%s\n", menu->sym->help ?
+                                       menu->sym->help : nohelp_text);
+                               continue;
+                       }
+                       if (!line[0])
+                               cnt = def;
+                       else if (isdigit(line[0]))
+                               cnt = atoi(line);
+                       else
+                               continue;
+                       break;
+               case set_random:
+                       def = (random() % cnt) + 1;
+               case set_default:
+               case set_yes:
+               case set_mod:
+               case set_no:
+                       cnt = def;
+                       printf("%d\n", cnt);
                        break;
-               default:
-                       line[0] = 0;
-                       printf("\n");
                }
-               if (line[0] == '?' && !line[1]) {
-                       help = nohelp_text;
-                       if (menu->sym->help)
-                               help = menu->sym->help;
-                       printf("\n%s\n", help);
-                       continue;
+
+       conf_childs:
+               for (child = menu->list; child; child = child->next) {
+                       if (!child->sym || !menu_is_visible(child))
+                               continue;
+                       if (!--cnt)
+                               break;
                }
-               if (line[0]) {
-                       len = strlen(line);
-                       line[len] = 0;
-
-                       def_menu = NULL;
-                       for (cmenu = menu->list; cmenu; cmenu = cmenu->next) {
-                               if (!cmenu->sym || !menu_is_visible(cmenu))
-                                       continue;
-                               if (!strncasecmp(line, menu_get_prompt(cmenu), len)) {
-                                       def_menu = cmenu;
-                                       break;
-                               }
-                       }
+               if (!child)
+                       continue;
+               if (line[strlen(line) - 1] == '?') {
+                       printf("\n%s\n", child->sym->help ?
+                               child->sym->help : nohelp_text);
+                       continue;
                }
-               if (def_menu) {
-                       sym_set_choice_value(sym, def_menu->sym);
-                       if (def_menu->list) {
-                               indent += 2;
-                               conf(def_menu->list);
-                               indent -= 2;
-                       }
-                       return 1;
+               sym_set_choice_value(sym, child->sym);
+               if (child->list) {
+                       indent += 2;
+                       conf(child->list);
+                       indent -= 2;
                }
+               return 1;
        }
 }
 
@@ -420,7 +432,7 @@ static void conf(struct menu *menu)
 
        if (sym_is_choice(sym)) {
                conf_choice(menu);
-               if (S_TRI(sym->curr) != mod)
+               if (sym->curr.tri != mod)
                        return;
                goto conf_childs;
        }
@@ -454,29 +466,17 @@ static void check_conf(struct menu *menu)
                return;
 
        sym = menu->sym;
-       if (!sym)
-               goto conf_childs;
-
-       if (sym_is_choice(sym)) {
-               if (!sym_has_value(sym)) {
+       if (sym) {
+               if (sym_is_changable(sym) && !sym_has_value(sym)) {
                        if (!conf_cnt++)
                                printf("*\n* Restart config...\n*\n");
                        rootEntry = menu_get_parent_menu(menu);
                        conf(rootEntry);
                }
-               if (sym_get_tristate_value(sym) != mod)
+               if (sym_is_choice(sym) && sym_get_tristate_value(sym) != mod)
                        return;
-               goto conf_childs;
        }
 
-       if (!sym_has_value(sym)) {
-               if (!conf_cnt++)
-                       printf("*\n* Restart config...\n*\n");
-               rootEntry = menu_get_parent_menu(menu);
-               conf(rootEntry);
-       }
-
-conf_childs:
        for (child = menu->list; child; child = child->next)
                check_conf(child);
 }
@@ -536,8 +536,8 @@ int main(int ac, char **av)
                        printf("***\n"
                                "*** You have not yet configured uClibc!\n"
                                "***\n"
-                               "*** Please run some configurator (e.g. \"make oldconfig\"\n"
-                               "*** or \"make menuconfig\").\n"
+                               "*** Please run some configurator (e.g. \"make config\" or\n"
+                               "*** \"make oldconfig\" or \"make menuconfig\").\n"
                                "***\n");
                        exit(1);
                }
index cb8a0e7..694477f 100644 (file)
@@ -1,11 +1,9 @@
 /*
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  * Released under the terms of the GNU GPL v2.0.
- *
- * Allow 'n' as a symbol value.
- * 2002-11-05 Petr Baudis <pasky@ucw.cz>
  */
 
+#include <sys/stat.h>
 #include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -38,7 +36,7 @@ static char *conf_expand_value(const char *in)
                strncat(res_value, in, src - in);
                src++;
                dst = name;
-               while (isalnum((int)*src) || *src == '_')
+               while (isalnum(*src) || *src == '_')
                        *dst++ = *src++;
                *dst = 0;
                sym = sym_lookup(name, 0);
@@ -53,7 +51,18 @@ static char *conf_expand_value(const char *in)
 
 char *conf_get_default_confname(void)
 {
-       return conf_expand_value(conf_defname);
+       struct stat buf;
+       static char fullname[4096+1];
+       char *env, *name;
+
+       name = conf_expand_value(conf_defname);
+       env = getenv(SRCTREE);
+       if (env) {
+               sprintf(fullname, "%s/%s", env, name);
+               if (!stat(fullname, &buf))
+                       return fullname;
+       }
+       return name;
 }
 
 int conf_read(const char *name)
@@ -68,12 +77,12 @@ int conf_read(const char *name)
        int i;
 
        if (name) {
-               in = fopen(name, "r");
+               in = zconf_fopen(name);
        } else {
                const char **names = conf_confnames;
                while ((name = *names++)) {
                        name = conf_expand_value(name);
-                       in = fopen(name, "r");
+                       in = zconf_fopen(name);
                        if (in) {
                                printf("#\n"
                                       "# using defaults found in %s\n"
@@ -93,44 +102,43 @@ int conf_read(const char *name)
                case S_INT:
                case S_HEX:
                case S_STRING:
-                       if (S_VAL(sym->def))
-                               free(S_VAL(sym->def));
+                       if (sym->user.val)
+                               free(sym->user.val);
                default:
-                       S_VAL(sym->def) = NULL;
-                       S_TRI(sym->def) = no;
-                       ;
+                       sym->user.val = NULL;
+                       sym->user.tri = no;
                }
        }
 
        while (fgets(line, sizeof(line), in)) {
                lineno++;
+               sym = NULL;
                switch (line[0]) {
-               case '\n':
-                       break;
-               case ' ':
-                       break;
                case '#':
-                       p = strchr(line, ' ');
-                       if (!p)
+                       if (line[1]!=' ')
                                continue;
-                       *p++ = 0;
-                       p = strchr(p, ' ');
+                       p = strchr(line + 2, ' ');
                        if (!p)
                                continue;
                        *p++ = 0;
                        if (strncmp(p, "is not set", 10))
                                continue;
-                       sym = sym_lookup(line+2, 0);
+                       sym = sym_find(line + 2);
+                       if (!sym) {
+                               fprintf(stderr, "%s:%d: trying to assign nonexistent symbol %s\n", name, lineno, line + 2);
+                               break;
+                       }
                        switch (sym->type) {
                        case S_BOOLEAN:
                        case S_TRISTATE:
-                               sym->def = symbol_no.curr;
+                               sym->user.tri = no;
                                sym->flags &= ~SYMBOL_NEW;
                                break;
                        default:
                                ;
                        }
                        break;
+
                case 'A' ... 'Z':
                        p = strchr(line, '=');
                        if (!p)
@@ -145,24 +153,24 @@ int conf_read(const char *name)
                                break;
                        }
                        switch (sym->type) {
-                       case S_TRISTATE:
+                       case S_TRISTATE:
                                if (p[0] == 'm') {
-                                       S_TRI(sym->def) = mod;
+                                       sym->user.tri = mod;
                                        sym->flags &= ~SYMBOL_NEW;
                                        break;
                                }
                        case S_BOOLEAN:
                                if (p[0] == 'y') {
-                                       S_TRI(sym->def) = yes;
+                                       sym->user.tri = yes;
                                        sym->flags &= ~SYMBOL_NEW;
                                        break;
                                }
                                if (p[0] == 'n') {
-                                       S_TRI(sym->def) = no;
+                                       sym->user.tri = no;
                                        sym->flags &= ~SYMBOL_NEW;
                                        break;
                                }
-                               break;
+                               break;
                        case S_STRING:
                                if (*p++ != '"')
                                        break;
@@ -173,48 +181,71 @@ int conf_read(const char *name)
                                        }
                                        memmove(p2, p2 + 1, strlen(p2));
                                }
+                               if (!p2) {
+                                       fprintf(stderr, "%s:%d: invalid string found\n", name, lineno);
+                                       exit(1);
+                               }
                        case S_INT:
                        case S_HEX:
                                if (sym_string_valid(sym, p)) {
-                                       S_VAL(sym->def) = strdup(p);
+                                       sym->user.val = strdup(p);
                                        sym->flags &= ~SYMBOL_NEW;
-                               } else
-                                       fprintf(stderr, "%s:%d:symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+                               } else {
+                                       fprintf(stderr, "%s:%d: symbol value '%s' invalid for %s\n", name, lineno, p, sym->name);
+                                       exit(1);
+                               }
                                break;
                        default:
                                ;
                        }
-                       if (sym_is_choice_value(sym)) {
-                               prop = sym_get_choice_prop(sym);
-                               switch (S_TRI(sym->def)) {
-                               case mod:
-                                       if (S_TRI(prop->def->def) == yes)
-                                               /* warn? */;
-                                       break;
-                               case yes:
-                                       if (S_TRI(prop->def->def) != no)
-                                               /* warn? */;
-                                       S_VAL(prop->def->def) = sym;
-                                       break;
-                               case no:
-                                       break;
-                               }
-                               S_TRI(prop->def->def) = S_TRI(sym->def);
-                       }
+                       break;
+               case '\n':
                        break;
                default:
                        continue;
                }
+               if (sym && sym_is_choice_value(sym)) {
+                       struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
+                       switch (sym->user.tri) {
+                       case no:
+                               break;
+                       case mod:
+                               if (cs->user.tri == yes)
+                                       /* warn? */;
+                               break;
+                       case yes:
+                               if (cs->user.tri != no)
+                                       /* warn? */;
+                               cs->user.val = sym;
+                               break;
+                       }
+                       cs->user.tri = E_OR(cs->user.tri, sym->user.tri);
+                       cs->flags &= ~SYMBOL_NEW;
+               }
        }
        fclose(in);
 
        for_all_symbols(i, sym) {
+               sym_calc_value(sym);
+               if (sym_has_value(sym) && !sym_is_choice_value(sym)) {
+                       if (sym->visible == no)
+                               sym->flags |= SYMBOL_NEW;
+                       switch (sym->type) {
+                       case S_STRING:
+                       case S_INT:
+                       case S_HEX:
+                               if (!sym_string_within_range(sym, sym->user.val))
+                                       sym->flags |= SYMBOL_NEW;
+                       default:
+                               break;
+                       }
+               }
                if (!sym_is_choice(sym))
                        continue;
                prop = sym_get_choice_prop(sym);
-               for (e = prop->dep; e; e = e->left.expr)
-                       sym->flags |= e->right.sym->flags & SYMBOL_NEW;
-               sym->flags &= ~SYMBOL_NEW;
+               for (e = prop->expr; e; e = e->left.expr)
+                       if (e->right.sym->visible != no)
+                               sym->flags |= e->right.sym->flags & SYMBOL_NEW;
        }
 
        sym_change_count = 1;
@@ -227,36 +258,57 @@ int conf_write(const char *name)
        FILE *out, *out_h;
        struct symbol *sym;
        struct menu *menu;
-       char oldname[128];
+       const char *basename;
+       char dirname[128], tmpname[128], newname[128];
        int type, l;
        const char *str;
 
-       out = fopen(".tmpconfig", "w");
+       dirname[0] = 0;
+       if (name && name[0]) {
+               char *slash = strrchr(name, '/');
+               if (slash) {
+                       int size = slash - name + 1;
+                       memcpy(dirname, name, size);
+                       dirname[size] = 0;
+                       if (slash[1])
+                               basename = slash + 1;
+                       else
+                               basename = conf_def_filename;
+               } else
+                       basename = name;
+       } else
+               basename = conf_def_filename;
+
+       sprintf(newname, "%s.tmpconfig.%d", dirname, getpid());
+       out = fopen(newname, "w");
        if (!out)
                return 1;
-       out_h = fopen(".tmpconfig.h", "w");
-       if (!out_h)
-               return 1;
+       out_h = NULL;
+       if (!name) {
+               out_h = fopen(".tmpconfig.h", "w");
+               if (!out_h)
+                       return 1;
+       }
        fprintf(out, "#\n"
                     "# Automatically generated make config: don't edit\n"
                     "#\n");
-       fprintf(out_h, "/*\n"
-                      " * Automatically generated C config: don't edit\n"
-                      " */\n"
-                      "#if !defined __FEATURES_H && !defined __need_uClibc_config_h\n"
-                      "#error Never include <bits/uClibc_config.h> directly; use <features.h> instead.\n"
-                      "#endif\n"
-                      "#define AUTOCONF_INCLUDED\n\n"
-                      "/*\n"
-                      " * Version Number\n"
-                      " */\n"
-                      "#define __UCLIBC_MAJOR__ %s\n"
-                      "#define __UCLIBC_MINOR__ %s\n"
-                      "#define __UCLIBC_SUBLEVEL__ %s\n",
-                      getenv("MAJOR_VERSION"),
-                      getenv("MINOR_VERSION"),
-                      getenv("SUBLEVEL")
-       );
+       if (out_h)
+               fprintf(out_h, "/*\n"
+                            " * Automatically generated C config: don't edit\n"
+                            " */\n"
+                            "#if !defined __FEATURES_H && !defined __need_uClibc_config_h\n"
+                            "#error Never include <bits/uClibc_config.h> directly; use <features.h> instead\n"
+                            "#endif\n"
+                            "#define AUTOCONF_INCLUDED\n\n"
+                            "/*\n"
+                            " * Version Number\n"
+                            " */\n"
+                            "#define __UCLIBC_MAJOR__ %s\n"
+                            "#define __UCLIBC_MINOR__ %s\n"
+                            "#define __UCLIBC_SUBLEVEL__ %s\n",
+                            getenv("MAJOR_VERSION"),
+                            getenv("MINOR_VERSION"),
+                            getenv("SUBLEVEL"));
 
        if (!sym_change_count)
                sym_clear_all_valid();
@@ -272,10 +324,11 @@ int conf_write(const char *name)
                                     "#\n"
                                     "# %s\n"
                                     "#\n", str);
-                       fprintf(out_h, "\n"
-                                      "/*\n"
-                                      " * %s\n"
-                                      " */\n", str);
+                       if (out_h)
+                               fprintf(out_h, "\n"
+                                              "/*\n"
+                                              " * %s\n"
+                                              " */\n", str);
                } else if (!(sym->flags & SYMBOL_CHOICE)) {
                        sym_calc_value(sym);
                        if (!(sym->flags & SYMBOL_WRITE))
@@ -284,7 +337,7 @@ int conf_write(const char *name)
                        type = sym->type;
                        if (type == S_TRISTATE) {
                                sym_calc_value(modules_sym);
-                               if (S_TRI(modules_sym->curr) == no)
+                               if (modules_sym->curr.tri == no)
                                        type = S_BOOLEAN;
                        }
                        switch (type) {
@@ -293,15 +346,18 @@ int conf_write(const char *name)
                                switch (sym_get_tristate_value(sym)) {
                                case no:
                                        fprintf(out, "# %s is not set\n", sym->name);
-                                       fprintf(out_h, "#undef __%s__\n", sym->name);
+                                       if (out_h)
+                                               fprintf(out_h, "#undef %s\n", sym->name);
                                        break;
                                case mod:
                                        fprintf(out, "%s=m\n", sym->name);
-                                       fprintf(out_h, "#define __%s__MODULE 1\n", sym->name);
+                                       if (out_h)
+                                               fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
                                        break;
                                case yes:
                                        fprintf(out, "%s=y\n", sym->name);
-                                       fprintf(out_h, "#define __%s__ 1\n", sym->name);
+                                       if (out_h)
+                                               fprintf(out_h, "#define __%s__ 1\n", sym->name);
                                        break;
                                }
                                break;
@@ -309,34 +365,40 @@ int conf_write(const char *name)
                                // fix me
                                str = sym_get_string_value(sym);
                                fprintf(out, "%s=\"", sym->name);
-                               fprintf(out_h, "#define __%s__ \"", sym->name);
+                               if (out_h)
+                                       fprintf(out_h, "#define __%s__ \"", sym->name);
                                do {
                                        l = strcspn(str, "\"\\");
                                        if (l) {
                                                fwrite(str, l, 1, out);
-                                               fwrite(str, l, 1, out_h);
+                                               if (out_h)
+                                                       fwrite(str, l, 1, out_h);
                                        }
                                        str += l;
                                        while (*str == '\\' || *str == '"') {
                                                fprintf(out, "\\%c", *str);
-                                               fprintf(out_h, "\\%c", *str);
+                                               if (out_h)
+                                                       fprintf(out_h, "\\%c", *str);
                                                str++;
                                        }
                                } while (*str);
                                fputs("\"\n", out);
-                               fputs("\"\n", out_h);
+                               if (out_h)
+                                       fputs("\"\n", out_h);
                                break;
                        case S_HEX:
                                str = sym_get_string_value(sym);
                                if (str[0] != '0' || (str[1] != 'x' && str[1] != 'X')) {
                                        fprintf(out, "%s=%s\n", sym->name, str);
-                                       fprintf(out_h, "#define __%s__ 0x%s\n", sym->name, str);
+                                       if (out_h)
+                                               fprintf(out_h, "#define __%s__ 0x%s\n", sym->name, str);
                                        break;
                                }
                        case S_INT:
                                str = sym_get_string_value(sym);
                                fprintf(out, "%s=%s\n", sym->name, str);
-                               fprintf(out_h, "#define __%s__ %s\n", sym->name, str);
+                               if (out_h)
+                                       fprintf(out_h, "#define __%s__ %s\n", sym->name, str);
                                break;
                        }
                }
@@ -356,18 +418,19 @@ int conf_write(const char *name)
                }
        }
        fclose(out);
-       fclose(out_h);
-
-       if (!name) {
+       if (out_h) {
+               fclose(out_h);
                rename(".tmpconfig.h", "include/bits/uClibc_config.h");
-               name = conf_def_filename;
                file_write_dep(NULL);
-       } else
-               unlink(".tmpconfig.h");
-
-       sprintf(oldname, "%s.old", name);
-       rename(name, oldname);
-       if (rename(".tmpconfig", name))
+       }
+       if (!name || basename != conf_def_filename) {
+               if (!name)
+                       name = conf_def_filename;
+               sprintf(tmpname, "%s.old", name);
+               rename(name, tmpname);
+       }
+       sprintf(tmpname, "%s%s", dirname, basename);
+       if (rename(newname, tmpname))
                return 1;
 
        sym_change_count = 0;
index d1af2a5..3f15ae8 100644 (file)
@@ -55,6 +55,13 @@ struct expr *expr_alloc_and(struct expr *e1, struct expr *e2)
        return e2 ? expr_alloc_two(E_AND, e1, e2) : e1;
 }
 
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2)
+{
+       if (!e1)
+               return e2;
+       return e2 ? expr_alloc_two(E_OR, e1, e2) : e1;
+}
+
 struct expr *expr_copy(struct expr *org)
 {
        struct expr *e;
@@ -158,9 +165,22 @@ static void __expr_eliminate_eq(enum expr_type type, struct expr **ep1, struct e
 
 void expr_eliminate_eq(struct expr **ep1, struct expr **ep2)
 {
-       if (!e1 || !e2 || e1->type != e2->type)
+       if (!e1 || !e2)
                return;
-       __expr_eliminate_eq(e1->type, ep1, ep2);
+       switch (e1->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e1->type, ep1, ep2);
+       default:
+               ;
+       }
+       if (e1->type != e2->type) switch (e2->type) {
+       case E_OR:
+       case E_AND:
+               __expr_eliminate_eq(e2->type, ep1, ep2);
+       default:
+               ;
+       }
        e1 = expr_eliminate_yn(e1);
        e2 = expr_eliminate_yn(e2);
 }
@@ -195,6 +215,7 @@ int expr_eq(struct expr *e1, struct expr *e2)
                trans_count = old_count;
                return res;
        case E_CHOICE:
+       case E_RANGE:
        case E_NONE:
                /* panic */;
        }
@@ -897,6 +918,7 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
        case E_SYMBOL:
                return expr_alloc_comp(type, e->left.sym, sym);
        case E_CHOICE:
+       case E_RANGE:
        case E_NONE:
                /* panic */;
        }
@@ -914,7 +936,7 @@ tristate expr_calc_value(struct expr *e)
        switch (e->type) {
        case E_SYMBOL:
                sym_calc_value(e->left.sym);
-               return S_TRI(e->left.sym->curr);
+               return e->left.sym->curr.tri;
        case E_AND:
                val1 = expr_calc_value(e->left.expr);
                val2 = expr_calc_value(e->right.expr);
@@ -1017,11 +1039,18 @@ void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, in
                expr_print(e->right.expr, fn, data, E_AND);
                break;
        case E_CHOICE:
+               fn(data, e->right.sym->name);
                if (e->left.expr) {
-                       expr_print(e->left.expr, fn, data, E_CHOICE);
                        fn(data, " ^ ");
+                       expr_print(e->left.expr, fn, data, E_CHOICE);
                }
+               break;
+       case E_RANGE:
+               fn(data, "[");
+               fn(data, e->left.sym->name);
+               fn(data, " ");
                fn(data, e->right.sym->name);
+               fn(data, "]");
                break;
        default:
          {
index e96d03b..cc616f1 100644 (file)
@@ -18,10 +18,6 @@ extern "C" {
 struct file {
        struct file *next;
        struct file *parent;
-#ifdef CML1
-       struct statement *stmt;
-       struct statement *last_stmt;
-#endif
        char *name;
        int lineno;
        int flags;
@@ -36,7 +32,7 @@ typedef enum tristate {
 } tristate;
 
 enum expr_type {
-       E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL
+       E_NONE, E_OR, E_AND, E_NOT, E_EQUAL, E_UNEQUAL, E_CHOICE, E_SYMBOL, E_RANGE
 };
 
 union expr_data {
@@ -45,18 +41,10 @@ union expr_data {
 };
 
 struct expr {
-#ifdef CML1
-       int token;
-#else
        enum expr_type type;
-#endif
        union expr_data left, right;
 };
 
-#define E_TRI(ev)      ((ev).tri)
-#define E_EXPR(ev)     ((ev).expr)
-#define E_CALC(ev)     (E_TRI(ev) = expr_calc_value(E_EXPR(ev)))
-
 #define E_OR(dep1, dep2)       (((dep1)>(dep2))?(dep1):(dep2))
 #define E_AND(dep1, dep2)      (((dep1)<(dep2))?(dep1):(dep2))
 #define E_NOT(dep)             (2-(dep))
@@ -66,12 +54,8 @@ struct expr_value {
        tristate tri;
 };
 
-#define S_VAL(sv)      ((sv).value)
-#define S_TRI(sv)      ((sv).tri)
-#define S_EQ(sv1, sv2) (S_VAL(sv1) == S_VAL(sv2) || !strcmp(S_VAL(sv1), S_VAL(sv2)))
-
 struct symbol_value {
-       void *value;
+       void *val;
        tristate tri;
 };
 
@@ -83,31 +67,17 @@ struct symbol {
        struct symbol *next;
        char *name;
        char *help;
-#ifdef CML1
-       int type;
-#else
        enum symbol_type type;
-#endif
-       struct symbol_value curr, def;
+       struct symbol_value curr, user;
        tristate visible;
        int flags;
        struct property *prop;
        struct expr *dep, *dep2;
-       struct menu *menu;
+       struct expr_value rev_dep;
 };
 
 #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER)
 
-#ifdef CML1
-#define SYMBOL_UNKNOWN         S_UNKNOWN
-#define SYMBOL_BOOLEAN         S_BOOLEAN
-#define SYMBOL_TRISTATE                S_TRISTATE
-#define SYMBOL_INT             S_INT
-#define SYMBOL_HEX             S_HEX
-#define SYMBOL_STRING          S_STRING
-#define SYMBOL_OTHER           S_OTHER
-#endif
-
 #define SYMBOL_YES             0x0001
 #define SYMBOL_MOD             0x0002
 #define SYMBOL_NO              0x0004
@@ -122,42 +92,38 @@ struct symbol {
 #define SYMBOL_CHANGED         0x0400
 #define SYMBOL_NEW             0x0800
 #define SYMBOL_AUTO            0x1000
+#define SYMBOL_CHECKED         0x2000
+#define SYMBOL_CHECK_DONE      0x4000
+#define SYMBOL_WARNED          0x8000
 
 #define SYMBOL_MAXLENGTH       256
 #define SYMBOL_HASHSIZE                257
 #define SYMBOL_HASHMASK                0xff
 
 enum prop_type {
-       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_ROOTMENU, P_DEFAULT, P_CHOICE
+       P_UNKNOWN, P_PROMPT, P_COMMENT, P_MENU, P_DEFAULT, P_CHOICE, P_SELECT, P_RANGE
 };
 
 struct property {
        struct property *next;
        struct symbol *sym;
-#ifdef CML1
-       int token;
-#else
        enum prop_type type;
-#endif
        const char *text;
-       struct symbol *def;
        struct expr_value visible;
-       struct expr *dep;
-       struct expr *dep2;
+       struct expr *expr;
        struct menu *menu;
        struct file *file;
        int lineno;
-#ifdef CML1
-       struct property *next_pos;
-#endif
 };
 
 #define for_all_properties(sym, st, tok) \
        for (st = sym->prop; st; st = st->next) \
                if (st->type == (tok))
-#define for_all_prompts(sym, st) for_all_properties(sym, st, P_PROMPT)
 #define for_all_defaults(sym, st) for_all_properties(sym, st, P_DEFAULT)
 #define for_all_choices(sym, st) for_all_properties(sym, st, P_CHOICE)
+#define for_all_prompts(sym, st) \
+       for (st = sym->prop; st; st = st->next) \
+               if (st->text)
 
 struct menu {
        struct menu *next;
@@ -166,12 +132,16 @@ struct menu {
        struct symbol *sym;
        struct property *prompt;
        struct expr *dep;
+       unsigned int flags;
        //char *help;
        struct file *file;
        int lineno;
        void *data;
 };
 
+#define MENU_CHANGED           0x0001
+#define MENU_ROOT              0x0002
+
 #ifndef SWIG
 
 extern struct file *file_list;
@@ -181,18 +151,12 @@ struct file *lookup_file(const char *name);
 extern struct symbol symbol_yes, symbol_no, symbol_mod;
 extern struct symbol *modules_sym;
 extern int cdebug;
-extern int print_type;
 struct expr *expr_alloc_symbol(struct symbol *sym);
-#ifdef CML1
-struct expr *expr_alloc_one(int token, struct expr *ce);
-struct expr *expr_alloc_two(int token, struct expr *e1, struct expr *e2);
-struct expr *expr_alloc_comp(int token, struct symbol *s1, struct symbol *s2);
-#else
 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
 struct expr *expr_alloc_two(enum expr_type type, struct expr *e1, struct expr *e2);
 struct expr *expr_alloc_comp(enum expr_type type, struct symbol *s1, struct symbol *s2);
-#endif
 struct expr *expr_alloc_and(struct expr *e1, struct expr *e2);
+struct expr *expr_alloc_or(struct expr *e1, struct expr *e2);
 struct expr *expr_copy(struct expr *org);
 void expr_free(struct expr *e);
 int expr_eq(struct expr *e1, struct expr *e2);
@@ -212,17 +176,6 @@ struct expr *expr_trans_compare(struct expr *e, enum expr_type type, struct symb
 void expr_fprint(struct expr *e, FILE *out);
 void print_expr(int mask, struct expr *e, int prevtoken);
 
-#ifdef CML1
-static inline int expr_is_yes(struct expr *e)
-{
-       return !e || (e->token == WORD && e->left.sym == &symbol_yes);
-}
-
-static inline int expr_is_no(struct expr *e)
-{
-       return e && (e->token == WORD && e->left.sym == &symbol_no);
-}
-#else
 static inline int expr_is_yes(struct expr *e)
 {
        return !e || (e->type == E_SYMBOL && e->left.sym == &symbol_yes);
@@ -233,7 +186,6 @@ static inline int expr_is_no(struct expr *e)
        return e && (e->type == E_SYMBOL && e->left.sym == &symbol_no);
 }
 #endif
-#endif
 
 #ifdef __cplusplus
 }
index baad0d0..22dda11 100644 (file)
@@ -1,50 +1,84 @@
-#define yy_create_buffer zconf_create_buffer
-#define yy_delete_buffer zconf_delete_buffer
-#define yy_scan_buffer zconf_scan_buffer
-#define yy_scan_string zconf_scan_string
-#define yy_scan_bytes zconf_scan_bytes
-#define yy_flex_debug zconf_flex_debug
-#define yy_init_buffer zconf_init_buffer
-#define yy_flush_buffer zconf_flush_buffer
-#define yy_load_buffer_state zconf_load_buffer_state
-#define yy_switch_to_buffer zconf_switch_to_buffer
-#define yyin zconfin
-#define yyleng zconfleng
-#define yylex zconflex
-#define yyout zconfout
-#define yyrestart zconfrestart
-#define yytext zconftext
 
-/* A lexical scanner generated by flex */
+#line 3 "lex.zconf.c"
 
-/* Scanner skeleton version:
- * $Header: /var/cvs/uClibc/extra/config/lex.zconf.c_shipped,v 1.2 2002/11/08 00:47:06 andersen Exp $
- */
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
 
 #define FLEX_SCANNER
 #define YY_FLEX_MAJOR_VERSION 2
 #define YY_FLEX_MINOR_VERSION 5
+#define YY_FLEX_SUBMINOR_VERSION 31
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
 
+/* begin standard C headers. */
 #include <stdio.h>
+#include <string.h>
 #include <errno.h>
+#include <stdlib.h>
 
-/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
-#ifdef c_plusplus
-#ifndef __cplusplus
-#define __cplusplus
-#endif
-#endif
+/* end standard C headers. */
 
+/* flex integer type definitions */
 
-#ifdef __cplusplus
+#ifndef FLEXINT_H
+#define FLEXINT_H
 
-#include <stdlib.h>
-#ifndef _WIN32
-#include <unistd.h>
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+#endif /* ! C99 */
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
 #endif
 
-/* Use prototypes in function declarations. */
-#define YY_USE_PROTOS
+#endif /* ! FLEXINT_H */
+
+#ifdef __cplusplus
 
 /* The "const" storage-class-modifier is valid. */
 #define YY_USE_CONST
 
 #if __STDC__
 
-#define YY_USE_PROTOS
 #define YY_USE_CONST
 
 #endif /* __STDC__ */
 #endif /* ! __cplusplus */
 
-#ifdef __TURBOC__
- #pragma warn -rch
- #pragma warn -use
-#include <io.h>
-#include <stdlib.h>
-#define YY_USE_CONST
-#define YY_USE_PROTOS
-#endif
-
 #ifdef YY_USE_CONST
 #define yyconst const
 #else
 #define yyconst
 #endif
 
-
-#ifdef YY_USE_PROTOS
-#define YY_PROTO(proto) proto
-#else
-#define YY_PROTO(proto) ()
-#endif
-
 /* Returned upon end-of-file. */
 #define YY_NULL 0
 
  * but we do it the disgusting crufty way forced on us by the ()-less
  * definition of BEGIN.
  */
-#define BEGIN yy_start = 1 + 2 *
+#define BEGIN (yy_start) = 1 + 2 *
 
 /* Translate the current start state into a value that can be later handed
  * to BEGIN to return to the state.  The YYSTATE alias is for lex
  * compatibility.
  */
-#define YY_START ((yy_start - 1) / 2)
+#define YY_START (((yy_start) - 1) / 2)
 #define YYSTATE YY_START
 
 /* Action number for EOF rule of a given start state. */
 #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
 
 /* Special action meaning "start processing a new file". */
-#define YY_NEW_FILE yyrestart( yyin )
+#define YY_NEW_FILE zconfrestart(zconfin  )
 
 #define YY_END_OF_BUFFER_CHAR 0
 
 /* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
 #define YY_BUF_SIZE 16384
+#endif
 
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
 typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
 
-extern int yyleng;
-extern FILE *yyin, *yyout;
+extern int zconfleng;
+
+extern FILE *zconfin, *zconfout;
 
 #define EOB_ACT_CONTINUE_SCAN 0
 #define EOB_ACT_END_OF_FILE 1
 #define EOB_ACT_LAST_MATCH 2
 
-/* The funky do-while in the following #define is used to turn the definition
- * int a single C statement (which needs a semi-colon terminator).  This
- * avoids problems with code like:
- *
- *     if ( condition_holds )
- *             yyless( 5 );
- *     else
- *             do_something_else();
- *
- * Prior to using the do-while the compiler would get upset at the
- * "else" because it interpreted the "if" statement as being all
- * done when it reached the ';' after the yyless() call.
- */
-
-/* Return all but the first 'n' matched characters back to the input stream. */
-
+    #define YY_LESS_LINENO(n)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
 #define yyless(n) \
        do \
                { \
-               /* Undo effects of setting up yytext. */ \
-               *yy_cp = yy_hold_char; \
+               /* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+               *yy_cp = (yy_hold_char); \
                YY_RESTORE_YY_MORE_OFFSET \
-               yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
-               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up zconftext again */ \
                } \
        while ( 0 )
 
-#define unput(c) yyunput( c, yytext_ptr )
+#define unput(c) yyunput( c, (yytext_ptr)  )
 
 /* The following is because we cannot portably get our hands on size_t
  * (without autoconf's help, which isn't available because we want
  * flex-generated scanners to compile on their own).
  */
-typedef unsigned int yy_size_t;
 
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef unsigned int yy_size_t;
+#endif
 
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
 struct yy_buffer_state
        {
        FILE *yy_input_file;
@@ -196,12 +213,16 @@ struct yy_buffer_state
         */
        int yy_at_bol;
 
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+    
        /* Whether to try to fill the input buffer when we reach the
         * end of it.
         */
        int yy_fill_buffer;
 
        int yy_buffer_status;
+
 #define YY_BUFFER_NEW 0
 #define YY_BUFFER_NORMAL 1
        /* When an EOF's been seen but there's still some text to process
@@ -211,97 +232,126 @@ struct yy_buffer_state
         * possible backing-up.
         *
         * When we actually see the EOF, we change the status to "new"
-        * (via yyrestart()), so that the user can continue scanning by
-        * just pointing yyin at a new input file.
+        * (via zconfrestart()), so that the user can continue scanning by
+        * just pointing zconfin at a new input file.
         */
 #define YY_BUFFER_EOF_PENDING 2
+
        };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
 
-static YY_BUFFER_STATE yy_current_buffer = 0;
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */
 
 /* We provide macros for accessing buffer states in case in the
  * future we want to put the buffer states in a more general
  * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
  */
-#define YY_CURRENT_BUFFER yy_current_buffer
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
 
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
 
-/* yy_hold_char holds the character lost when yytext is formed. */
+/* yy_hold_char holds the character lost when zconftext is formed. */
 static char yy_hold_char;
-
 static int yy_n_chars;         /* number of characters read into yy_ch_buf */
-
-
-int yyleng;
+int zconfleng;
 
 /* Points to current character in buffer. */
 static char *yy_c_buf_p = (char *) 0;
 static int yy_init = 1;                /* whether we need to initialize */
 static int yy_start = 0;       /* start state number */
 
-/* Flag which is used to allow yywrap()'s to do buffer switches
- * instead of setting up a fresh yyin.  A bit of a hack ...
+/* Flag which is used to allow zconfwrap()'s to do buffer switches
+ * instead of setting up a fresh zconfin.  A bit of a hack ...
  */
 static int yy_did_buffer_switch_on_eof;
 
-void yyrestart YY_PROTO(( FILE *input_file ));
+void zconfrestart (FILE *input_file  );
+void zconf_switch_to_buffer (YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE zconf_create_buffer (FILE *file,int size  );
+void zconf_delete_buffer (YY_BUFFER_STATE b  );
+void zconf_flush_buffer (YY_BUFFER_STATE b  );
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer  );
+void zconfpop_buffer_state (void );
 
-void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
-void yy_load_buffer_state YY_PROTO(( void ));
-YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
-void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
-void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
-#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+static void zconfensure_buffer_stack (void );
+static void zconf_load_buffer_state (void );
+static void zconf_init_buffer (YY_BUFFER_STATE b,FILE *file  );
 
-YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
-YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
-YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+#define YY_FLUSH_BUFFER zconf_flush_buffer(YY_CURRENT_BUFFER )
 
-static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
-static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
-static void yy_flex_free YY_PROTO(( void * ));
+YY_BUFFER_STATE zconf_scan_buffer (char *base,yy_size_t size  );
+YY_BUFFER_STATE zconf_scan_string (yyconst char *yy_str  );
+YY_BUFFER_STATE zconf_scan_bytes (yyconst char *bytes,int len  );
 
-#define yy_new_buffer yy_create_buffer
+void *zconfalloc (yy_size_t  );
+void *zconfrealloc (void *,yy_size_t  );
+void zconffree (void *  );
+
+#define yy_new_buffer zconf_create_buffer
 
 #define yy_set_interactive(is_interactive) \
        { \
-       if ( ! yy_current_buffer ) \
-               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-       yy_current_buffer->yy_is_interactive = is_interactive; \
+       if ( ! YY_CURRENT_BUFFER ){ \
+        zconfensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
        }
 
 #define yy_set_bol(at_bol) \
        { \
-       if ( ! yy_current_buffer ) \
-               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
-       yy_current_buffer->yy_at_bol = at_bol; \
+       if ( ! YY_CURRENT_BUFFER ){\
+        zconfensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            zconf_create_buffer(zconfin,YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
        }
 
-#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
 
+/* Begin user sect3 */
 
-#define yywrap() 1
+#define zconfwrap(n) 1
 #define YY_SKIP_YYWRAP
+
 typedef unsigned char YY_CHAR;
-FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+
+FILE *zconfin = (FILE *) 0, *zconfout = (FILE *) 0;
+
 typedef int yy_state_type;
-extern char *yytext;
-#define yytext_ptr yytext
-static yyconst short yy_nxt[][37] =
+
+extern int zconflineno;
+
+int zconflineno = 1;
+
+extern char *zconftext;
+#define yytext_ptr zconftext
+static yyconst flex_int16_t yy_nxt[][38] =
     {
     {
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
         0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-        0,    0,    0,    0,    0,    0,    0
+        0,    0,    0,    0,    0,    0,    0,    0
     },
 
     {
        11,   12,   13,   14,   12,   12,   15,   12,   12,   12,
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
-       12,   12,   12,   12,   12,   12,   12
+       12,   12,   12,   12,   12,   12,   12,   12
     },
 
     {
@@ -309,21 +359,21 @@ static yyconst short yy_nxt[][37] =
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
 
        12,   12,   12,   12,   12,   12,   12,   12,   12,   12,
-       12,   12,   12,   12,   12,   12,   12
+       12,   12,   12,   12,   12,   12,   12,   12
     },
 
     {
        11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
-       16,   16,   16,   18,   16,   16,   18,   19,   20,   21,
-       22,   18,   18,   23,   24,   18,   25,   18,   26,   27,
-       18,   28,   29,   30,   18,   18,   16
+       16,   16,   16,   18,   16,   16,   18,   18,   19,   20,
+       21,   22,   18,   18,   23,   24,   18,   25,   18,   26,
+       27,   18,   28,   29,   30,   18,   18,   16
     },
 
     {
        11,   16,   16,   17,   16,   16,   16,   16,   16,   16,
-       16,   16,   16,   18,   16,   16,   18,   19,   20,   21,
-       22,   18,   18,   23,   24,   18,   25,   18,   26,   27,
-       18,   28,   29,   30,   18,   18,   16
+       16,   16,   16,   18,   16,   16,   18,   18,   19,   20,
+       21,   22,   18,   18,   23,   24,   18,   25,   18,   26,
+       27,   18,   28,   29,   30,   18,   18,   16
 
     },
 
@@ -331,14 +381,14 @@ static yyconst short yy_nxt[][37] =
        11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31
+       31,   31,   31,   31,   31,   31,   31,   31
     },
 
     {
        11,   31,   32,   33,   31,   31,   31,   31,   31,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
        31,   31,   31,   31,   31,   31,   31,   31,   31,   31,
-       31,   31,   31,   31,   31,   31,   31
+       31,   31,   31,   31,   31,   31,   31,   31
     },
 
     {
@@ -346,36 +396,36 @@ static yyconst short yy_nxt[][37] =
        34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
 
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   34,   34,   34,   34,   34
+       34,   34,   34,   34,   34,   34,   34,   34
     },
 
     {
        11,   34,   34,   35,   34,   36,   34,   34,   36,   34,
        34,   34,   34,   34,   34,   37,   34,   34,   34,   34,
        34,   34,   34,   34,   34,   34,   34,   34,   34,   34,
-       34,   34,   34,   34,   34,   34,   34
+       34,   34,   34,   34,   34,   34,   34,   34
     },
 
     {
-       11,   38,   38,   39,   40,   41,   38,   42,   41,   43,
-       44,   45,   46,   46,   47,   38,   46,   46,   46,   46,
-       46,   46,   46,   46,   48,   46,   46,   46,   49,   46,
-       46,   46,   46,   46,   46,   46,   50
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
 
     },
 
     {
-       11,   38,   38,   39,   40,   41,   38,   42,   41,   43,
-       44,   45,   46,   46,   47,   38,   46,   46,   46,   46,
-       46,   46,   46,   46,   48,   46,   46,   46,   49,   46,
-       46,   46,   46,   46,   46,   46,   50
+       11,   38,   38,   39,   40,   41,   42,   43,   41,   44,
+       45,   46,   47,   47,   48,   49,   47,   47,   47,   47,
+       47,   47,   47,   47,   47,   50,   47,   47,   47,   51,
+       47,   47,   47,   47,   47,   47,   47,   52
     },
 
     {
       -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
       -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
       -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11,
-      -11,  -11,  -11,  -11,  -11,  -11,  -11
+      -11,  -11,  -11,  -11,  -11,  -11,  -11,  -11
     },
 
     {
@@ -383,36 +433,36 @@ static yyconst short yy_nxt[][37] =
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
 
       -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12,
-      -12,  -12,  -12,  -12,  -12,  -12,  -12
+      -12,  -12,  -12,  -12,  -12,  -12,  -12,  -12
     },
 
     {
-       11,  -13,   51,   52,  -13,  -13,   53,  -13,  -13,  -13,
+       11,  -13,   53,   54,  -13,  -13,   55,  -13,  -13,  -13,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
       -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13,
-      -13,  -13,  -13,  -13,  -13,  -13,  -13
+      -13,  -13,  -13,  -13,  -13,  -13,  -13,  -13
     },
 
     {
        11,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
       -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
       -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14,
-      -14,  -14,  -14,  -14,  -14,  -14,  -14
+      -14,  -14,  -14,  -14,  -14,  -14,  -14,  -14
 
     },
 
     {
-       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56
     },
 
     {
        11,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
       -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16,
-      -16,  -16,  -16,  -16,  -16,  -16,  -16
+      -16,  -16,  -16,  -16,  -16,  -16,  -16,  -16
     },
 
     {
@@ -420,132 +470,132 @@ static yyconst short yy_nxt[][37] =
       -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
 
       -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17,
-      -17,  -17,  -17,  -17,  -17,  -17,  -17
+      -17,  -17,  -17,  -17,  -17,  -17,  -17,  -17
     },
 
     {
        11,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,  -18,
-      -18,  -18,  -18,   56,  -18,  -18,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -18
+      -18,  -18,  -18,   58,  -18,  -18,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -18
     },
 
     {
        11,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,  -19,
-      -19,  -19,  -19,   56,  -19,  -19,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   57,   56,
-       56,   56,   56,   56,   56,   56,  -19
+      -19,  -19,  -19,   58,  -19,  -19,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   59,
+       58,   58,   58,   58,   58,   58,   58,  -19
 
     },
 
     {
        11,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,  -20,
-      -20,  -20,  -20,   56,  -20,  -20,   56,   56,   56,   56,
-       56,   56,   56,   58,   56,   56,   56,   56,   59,   56,
-       56,   56,   56,   56,   56,   56,  -20
+      -20,  -20,  -20,   58,  -20,  -20,   58,   58,   58,   58,
+       58,   58,   58,   58,   60,   58,   58,   58,   58,   61,
+       58,   58,   58,   58,   58,   58,   58,  -20
     },
 
     {
        11,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,  -21,
-      -21,  -21,  -21,   56,  -21,  -21,   56,   56,   56,   56,
-       60,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -21
+      -21,  -21,  -21,   58,  -21,  -21,   58,   58,   58,   58,
+       58,   62,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -21
     },
 
     {
        11,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,  -22,
-      -22,  -22,  -22,   56,  -22,  -22,   56,   56,   56,   56,
+      -22,  -22,  -22,   58,  -22,  -22,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   61,   56,   56,
-       56,   56,   56,   56,   56,   56,  -22
+       58,   58,   58,   58,   58,   58,   58,   58,   63,   58,
+       58,   58,   58,   58,   58,   58,   58,  -22
     },
 
     {
        11,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,  -23,
-      -23,  -23,  -23,   56,  -23,  -23,   56,   56,   56,   56,
-       62,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -23
+      -23,  -23,  -23,   58,  -23,  -23,   58,   58,   58,   58,
+       58,   64,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -23
     },
 
     {
        11,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,  -24,
-      -24,  -24,  -24,   56,  -24,  -24,   56,   56,   56,   56,
-       56,   63,   56,   56,   56,   56,   56,   64,   56,   56,
-       56,   56,   56,   56,   56,   56,  -24
+      -24,  -24,  -24,   58,  -24,  -24,   58,   58,   58,   58,
+       58,   58,   65,   58,   58,   58,   58,   58,   66,   58,
+       58,   58,   58,   58,   58,   58,   58,  -24
 
     },
 
     {
        11,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,  -25,
-      -25,  -25,  -25,   56,  -25,  -25,   65,   56,   56,   56,
-       66,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -25
+      -25,  -25,  -25,   58,  -25,  -25,   58,   67,   58,   58,
+       58,   68,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -25
     },
 
     {
        11,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,  -26,
-      -26,  -26,  -26,   56,  -26,  -26,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   67,
-       56,   56,   56,   56,   56,   56,  -26
+      -26,  -26,  -26,   58,  -26,  -26,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       69,   58,   58,   58,   58,   58,   58,  -26
     },
 
     {
        11,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,  -27,
-      -27,  -27,  -27,   56,  -27,  -27,   56,   56,   56,   56,
+      -27,  -27,  -27,   58,  -27,  -27,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   68,   56,   56,   56,   56,  -27
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   70,   58,   58,   58,   58,  -27
     },
 
     {
        11,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,  -28,
-      -28,  -28,  -28,   56,  -28,  -28,   56,   56,   56,   56,
-       69,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -28
+      -28,  -28,  -28,   58,  -28,  -28,   58,   71,   58,   58,
+       58,   72,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -28
     },
 
     {
        11,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,  -29,
-      -29,  -29,  -29,   56,  -29,  -29,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   70,   56,
-       56,   56,   56,   71,   56,   56,  -29
+      -29,  -29,  -29,   58,  -29,  -29,   58,   58,   58,   58,
+       58,   73,   58,   58,   58,   58,   58,   58,   58,   74,
+       58,   58,   58,   58,   75,   58,   58,  -29
 
     },
 
     {
        11,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,  -30,
-      -30,  -30,  -30,   56,  -30,  -30,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   72,   56,   56,   56,   56,  -30
+      -30,  -30,  -30,   58,  -30,  -30,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   76,   58,   58,   58,   58,  -30
     },
 
     {
-       11,   73,   73,  -31,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73
+       11,   77,   77,  -31,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77
     },
 
     {
-       11,  -32,   74,   75,  -32,  -32,  -32,  -32,  -32,  -32,
+       11,  -32,   78,   79,  -32,  -32,  -32,  -32,  -32,  -32,
       -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
 
       -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32,
-      -32,  -32,  -32,  -32,  -32,  -32,  -32
+      -32,  -32,  -32,  -32,  -32,  -32,  -32,  -32
     },
 
     {
-       11,   76,  -33,  -33,   76,   76,   76,   76,   76,   76,
-       76,   76,   76,   76,   76,   76,   76,   76,   76,   76,
-       76,   76,   76,   76,   76,   76,   76,   76,   76,   76,
-       76,   76,   76,   76,   76,   76,   76
+       11,   80,  -33,  -33,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80
     },
 
     {
-       11,   77,   77,   78,   77,  -34,   77,   77,  -34,   77,
-       77,   77,   77,   77,   77,  -34,   77,   77,   77,   77,
-       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
-       77,   77,   77,   77,   77,   77,   77
+       11,   81,   81,   82,   81,  -34,   81,   81,  -34,   81,
+       81,   81,   81,   81,   81,  -34,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81
 
     },
 
@@ -553,125 +603,125 @@ static yyconst short yy_nxt[][37] =
        11,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
       -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
       -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35,
-      -35,  -35,  -35,  -35,  -35,  -35,  -35
+      -35,  -35,  -35,  -35,  -35,  -35,  -35,  -35
     },
 
     {
        11,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
       -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
       -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36,
-      -36,  -36,  -36,  -36,  -36,  -36,  -36
+      -36,  -36,  -36,  -36,  -36,  -36,  -36,  -36
     },
 
     {
-       11,   79,   79,   80,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
+       11,   83,   83,   84,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
 
-       79,   79,   79,   79,   79,   79,   79,   79,   79,   79,
-       79,   79,   79,   79,   79,   79,   79
+       83,   83,   83,   83,   83,   83,   83,   83,   83,   83,
+       83,   83,   83,   83,   83,   83,   83,   83
     },
 
     {
        11,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
       -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
       -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38,
-      -38,  -38,  -38,  -38,  -38,  -38,  -38
+      -38,  -38,  -38,  -38,  -38,  -38,  -38,  -38
     },
 
     {
        11,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
       -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
       -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39,
-      -39,  -39,  -39,  -39,  -39,  -39,  -39
+      -39,  -39,  -39,  -39,  -39,  -39,  -39,  -39
 
     },
 
     {
        11,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
-      -40,  -40,  -40,  -40,   81,  -40,  -40,  -40,  -40,  -40,
+      -40,  -40,  -40,  -40,   85,  -40,  -40,  -40,  -40,  -40,
       -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40,
-      -40,  -40,  -40,  -40,  -40,  -40,  -40
+      -40,  -40,  -40,  -40,  -40,  -40,  -40,  -40
     },
 
     {
        11,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
       -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
       -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41,
-      -41,  -41,  -41,  -41,  -41,  -41,  -41
+      -41,  -41,  -41,  -41,  -41,  -41,  -41,  -41
     },
 
     {
-       11,  -42,  -42,  -42,  -42,  -42,  -42,   82,  -42,  -42,
-      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,
+       11,   86,   86,  -42,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
 
-      -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,  -42,
-      -42,  -42,  -42,  -42,  -42,  -42,  -42
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86
     },
 
     {
-       11,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
+       11,  -43,  -43,  -43,  -43,  -43,  -43,   87,  -43,  -43,
       -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
       -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43,
-      -43,  -43,  -43,  -43,  -43,  -43,  -43
+      -43,  -43,  -43,  -43,  -43,  -43,  -43,  -43
     },
 
     {
        11,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
       -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
       -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44,
-      -44,  -44,  -44,  -44,  -44,  -44,  -44
+      -44,  -44,  -44,  -44,  -44,  -44,  -44,  -44
 
     },
 
     {
        11,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
-      -45,   83,   84,   84,  -45,  -45,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -45
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45,
+      -45,  -45,  -45,  -45,  -45,  -45,  -45,  -45
     },
 
     {
        11,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,  -46,
-      -46,   84,   84,   84,  -46,  -46,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -46
+      -46,   88,   89,   89,  -46,  -46,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -46
     },
 
     {
        11,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
-      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
+      -47,   89,   89,   89,  -47,  -47,   89,   89,   89,   89,
 
-      -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,  -47,
-      -47,  -47,  -47,  -47,  -47,  -47,  -47
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -47
     },
 
     {
        11,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
-      -48,   84,   84,   84,  -48,  -48,   84,   84,   84,   84,
-       84,   85,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -48
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48,
+      -48,  -48,  -48,  -48,  -48,  -48,  -48,  -48
     },
 
     {
-       11,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,  -49,
-      -49,   84,   84,   84,  -49,  -49,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   86,   84,   84,
-       84,   84,   84,   84,   84,   84,  -49
+       11,  -49,  -49,   90,  -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
 
     },
 
     {
        11,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
-      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
-      -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,  -50,
-      -50,  -50,  -50,  -50,  -50,  -50,   87
+      -50,   89,   89,   89,  -50,  -50,   89,   89,   89,   89,
+       89,   89,   91,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -50
     },
 
     {
-       11,  -51,   51,   52,  -51,  -51,   53,  -51,  -51,  -51,
-      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
-      -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
-      -51,  -51,  -51,  -51,  -51,  -51,  -51
+       11,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,  -51,
+      -51,   89,   89,   89,  -51,  -51,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   92,   89,
+       89,   89,   89,   89,   89,   89,   89,  -51
     },
 
     {
@@ -679,206 +729,206 @@ static yyconst short yy_nxt[][37] =
       -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
 
       -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,  -52,
-      -52,  -52,  -52,  -52,  -52,  -52,  -52
+      -52,  -52,  -52,  -52,  -52,  -52,  -52,   93
     },
 
     {
-       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54
+       11,  -53,   53,   54,  -53,  -53,   55,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53,
+      -53,  -53,  -53,  -53,  -53,  -53,  -53,  -53
     },
 
     {
-       11,   54,   54,   55,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54,   54,   54,   54,
-       54,   54,   54,   54,   54,   54,   54
+       11,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54,
+      -54,  -54,  -54,  -54,  -54,  -54,  -54,  -54
 
     },
 
     {
-       11,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
-      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
-      -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,  -55,
-      -55,  -55,  -55,  -55,  -55,  -55,  -55
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56
     },
 
     {
-       11,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,  -56,
-      -56,  -56,  -56,   56,  -56,  -56,   56,   56,   56,   56,
+       11,   56,   56,   57,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
        56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -56
+       56,   56,   56,   56,   56,   56,   56,   56
     },
 
     {
        11,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
-      -57,  -57,  -57,   56,  -57,  -57,   56,   56,   56,   56,
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   88,   56,
-       56,   56,   56,   56,   56,   56,  -57
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57,
+      -57,  -57,  -57,  -57,  -57,  -57,  -57,  -57
     },
 
     {
        11,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,  -58,
-      -58,  -58,  -58,   56,  -58,  -58,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   89,   56,
-       56,   56,   56,   56,   56,   56,  -58
+      -58,  -58,  -58,   58,  -58,  -58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -58
     },
 
     {
        11,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,  -59,
-      -59,  -59,  -59,   56,  -59,  -59,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   90,   91,   56,   56,
-       56,   56,   56,   56,   56,   56,  -59
+      -59,  -59,  -59,   58,  -59,  -59,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   94,
+       58,   58,   58,   58,   58,   58,   58,  -59
 
     },
 
     {
        11,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,  -60,
-      -60,  -60,  -60,   56,  -60,  -60,   56,   56,   56,   56,
-       56,   92,   56,   56,   56,   56,   56,   56,   56,   93,
-       56,   56,   56,   56,   56,   56,  -60
+      -60,  -60,  -60,   58,  -60,  -60,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   95,
+       58,   58,   58,   58,   58,   58,   58,  -60
     },
 
     {
        11,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,  -61,
-      -61,  -61,  -61,   56,  -61,  -61,   56,   56,   56,   94,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -61
+      -61,  -61,  -61,   58,  -61,  -61,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   96,   97,   58,
+       58,   58,   58,   58,   58,   58,   58,  -61
     },
 
     {
        11,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,  -62,
-      -62,  -62,  -62,   56,  -62,  -62,   56,   56,   56,   56,
+      -62,  -62,  -62,   58,  -62,  -62,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   95,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   96,  -62
+       58,   58,   98,   58,   58,   58,   58,   58,   58,   58,
+       99,   58,   58,   58,   58,   58,   58,  -62
     },
 
     {
        11,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,  -63,
-      -63,  -63,  -63,   56,  -63,  -63,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -63
+      -63,  -63,  -63,   58,  -63,  -63,   58,  100,   58,   58,
+      101,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -63
     },
 
     {
        11,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,  -64,
-      -64,  -64,  -64,   56,  -64,  -64,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   97,   56,   56,  -64
+      -64,  -64,  -64,   58,  -64,  -64,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  102,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  103,  -64
 
     },
 
     {
        11,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,  -65,
-      -65,  -65,  -65,   56,  -65,  -65,   56,   56,   56,   56,
-       56,   56,   56,   56,   98,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -65
+      -65,  -65,  -65,   58,  -65,  -65,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -65
     },
 
     {
        11,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,  -66,
-      -66,  -66,  -66,   56,  -66,  -66,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   99,   56,   56,
-       56,   56,   56,   56,   56,   56,  -66
+      -66,  -66,  -66,   58,  -66,  -66,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  104,   58,   58,  -66
     },
 
     {
        11,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,  -67,
-      -67,  -67,  -67,   56,  -67,  -67,   56,   56,   56,   56,
+      -67,  -67,  -67,   58,  -67,  -67,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  100,   56,   56,  -67
+       58,   58,   58,   58,   58,  105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -67
     },
 
     {
        11,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,  -68,
-      -68,  -68,  -68,   56,  -68,  -68,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,  101,   56,
-       56,   56,   56,   56,   56,   56,  -68
+      -68,  -68,  -68,   58,  -68,  -68,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  106,   58,
+       58,   58,   58,   58,   58,   58,   58,  -68
     },
 
     {
        11,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,  -69,
-      -69,  -69,  -69,   56,  -69,  -69,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-      102,   56,   56,   56,   56,   56,  -69
+      -69,  -69,  -69,   58,  -69,  -69,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  107,   58,   58,  -69
 
     },
 
     {
        11,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,  -70,
-      -70,  -70,  -70,   56,  -70,  -70,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  103,   56,  -70
+      -70,  -70,  -70,   58,  -70,  -70,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  108,
+       58,   58,   58,   58,   58,   58,   58,  -70
     },
 
     {
        11,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,  -71,
-      -71,  -71,  -71,   56,  -71,  -71,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,  104,   56,   56,   56,   56,  -71
+      -71,  -71,  -71,   58,  -71,  -71,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  109,   58,
+       58,   58,   58,   58,   58,   58,   58,  -71
     },
 
     {
        11,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,  -72,
-      -72,  -72,  -72,   56,  -72,  -72,   56,   56,   56,   56,
+      -72,  -72,  -72,   58,  -72,  -72,   58,   58,   58,   58,
 
-       56,   56,   56,   56,  105,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -72
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,  110,   58,   58,   58,   58,   58,  -72
     },
 
     {
-       11,   73,   73,  -73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73,   73,   73,   73,
-       73,   73,   73,   73,   73,   73,   73
+       11,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,  -73,
+      -73,  -73,  -73,   58,  -73,  -73,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  111,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -73
     },
 
     {
-       11,  -74,   74,   75,  -74,  -74,  -74,  -74,  -74,  -74,
-      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
-      -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
-      -74,  -74,  -74,  -74,  -74,  -74,  -74
+       11,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,  -74,
+      -74,  -74,  -74,   58,  -74,  -74,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  112,   58,  -74
 
     },
 
     {
        11,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
-      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
-      -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,  -75,
-      -75,  -75,  -75,  -75,  -75,  -75,  -75
+      -75,  -75,  -75,   58,  -75,  -75,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  113,   58,   58,   58,   58,  -75
     },
 
     {
        11,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
-      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
-      -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,  -76,
-      -76,  -76,  -76,  -76,  -76,  -76,  -76
+      -76,  -76,  -76,   58,  -76,  -76,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -76
     },
 
     {
-       11,   77,   77,   78,   77,  -77,   77,   77,  -77,   77,
-       77,   77,   77,   77,   77,  -77,   77,   77,   77,   77,
+       11,   77,   77,  -77,   77,   77,   77,   77,   77,   77,
+       77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
 
        77,   77,   77,   77,   77,   77,   77,   77,   77,   77,
-       77,   77,   77,   77,   77,   77,   77
+       77,   77,   77,   77,   77,   77,   77,   77
     },
 
     {
-       11,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
+       11,  -78,   78,   79,  -78,  -78,  -78,  -78,  -78,  -78,
       -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
       -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78,
-      -78,  -78,  -78,  -78,  -78,  -78,  -78
+      -78,  -78,  -78,  -78,  -78,  -78,  -78,  -78
     },
 
     {
-       11,  -79,  -79,   80,  -79,  -79,  -79,  -79,  -79,  -79,
-      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,
-      -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,  -79,
-      -79,  -79,  -79,  -79,  -79,  -79,  -79
+       11,   80,  -79,  -79,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80,   80,   80,
+       80,   80,   80,   80,   80,   80,   80,   80
 
     },
 
@@ -886,14 +936,14 @@ static yyconst short yy_nxt[][37] =
        11,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
       -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
       -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80,
-      -80,  -80,  -80,  -80,  -80,  -80,  -80
+      -80,  -80,  -80,  -80,  -80,  -80,  -80,  -80
     },
 
     {
-       11,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
-      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
-      -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,  -81,
-      -81,  -81,  -81,  -81,  -81,  -81,  -81
+       11,   81,   81,   82,   81,  -81,   81,   81,  -81,   81,
+       81,   81,   81,   81,   81,  -81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81,   81,   81,
+       81,   81,   81,   81,   81,   81,   81,   81
     },
 
     {
@@ -901,36 +951,36 @@ static yyconst short yy_nxt[][37] =
       -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
 
       -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82,
-      -82,  -82,  -82,  -82,  -82,  -82,  -82
+      -82,  -82,  -82,  -82,  -82,  -82,  -82,  -82
     },
 
     {
-       11,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
-      -83,  106,   84,   84,  -83,  -83,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -83
+       11,  -83,  -83,   84,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83,
+      -83,  -83,  -83,  -83,  -83,  -83,  -83,  -83
     },
 
     {
        11,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
-      -84,   84,   84,   84,  -84,  -84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -84
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84,
+      -84,  -84,  -84,  -84,  -84,  -84,  -84,  -84
 
     },
 
     {
        11,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
-      -85,   84,   84,   84,  -85,  -85,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -85
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85,
+      -85,  -85,  -85,  -85,  -85,  -85,  -85,  -85
     },
 
     {
-       11,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,  -86,
-      -86,   84,   84,   84,  -86,  -86,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,  -86
+       11,   86,   86,  -86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,
+       86,   86,   86,   86,   86,   86,   86,   86
     },
 
     {
@@ -938,850 +988,1124 @@ static yyconst short yy_nxt[][37] =
       -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
 
       -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87,
-      -87,  -87,  -87,  -87,  -87,  -87,  -87
+      -87,  -87,  -87,  -87,  -87,  -87,  -87,  -87
     },
 
     {
        11,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,  -88,
-      -88,  -88,  -88,   56,  -88,  -88,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,  107,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -88
+      -88,  115,   89,   89,  -88,  -88,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -88
     },
 
     {
        11,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,  -89,
-      -89,  -89,  -89,   56,  -89,  -89,   56,   56,   56,   56,
-       56,   56,   56,   56,  108,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -89
+      -89,   89,   89,   89,  -89,  -89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -89
 
     },
 
     {
        11,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
-      -90,  -90,  -90,   56,  -90,  -90,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  109,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -90
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90,
+      -90,  -90,  -90,  -90,  -90,  -90,  -90,  -90
     },
 
     {
        11,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,  -91,
-      -91,  -91,  -91,   56,  -91,  -91,   56,   56,   56,   56,
-       56,  110,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -91
+      -91,   89,   89,   89,  -91,  -91,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -91
     },
 
     {
        11,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,  -92,
-      -92,  -92,  -92,   56,  -92,  -92,  111,   56,   56,   56,
+      -92,   89,   89,   89,  -92,  -92,   89,   89,   89,   89,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -92
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,  -92
     },
 
     {
        11,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
-      -93,  -93,  -93,   56,  -93,  -93,   56,   56,   56,   56,
-      112,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -93
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93,
+      -93,  -93,  -93,  -93,  -93,  -93,  -93,  -93
     },
 
     {
        11,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,  -94,
-      -94,  -94,  -94,   56,  -94,  -94,   56,   56,  113,   56,
-       56,   56,   56,   56,  114,   56,  115,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -94
+      -94,  -94,  -94,   58,  -94,  -94,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  116,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -94
 
     },
 
     {
        11,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,  -95,
-      -95,  -95,  -95,   56,  -95,  -95,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,  116,
-       56,   56,   56,   56,   56,   56,  -95
+      -95,  -95,  -95,   58,  -95,  -95,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  117,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -95
     },
 
     {
        11,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,  -96,
-      -96,  -96,  -96,   56,  -96,  -96,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -96
+      -96,  -96,  -96,   58,  -96,  -96,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  118,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -96
     },
 
     {
        11,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,  -97,
-      -97,  -97,  -97,   56,  -97,  -97,   56,   56,   56,   56,
+      -97,  -97,  -97,   58,  -97,  -97,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  -97
+       58,   58,  119,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -97
     },
 
     {
        11,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,  -98,
-      -98,  -98,  -98,   56,  -98,  -98,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  117,   56,   56,
-       56,   56,   56,   56,   56,   56,  -98
+      -98,  -98,  -98,   58,  -98,  -98,  120,  121,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -98
     },
 
     {
        11,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,  -99,
-      -99,  -99,  -99,   56,  -99,  -99,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  118,   56,  -99
+      -99,  -99,  -99,   58,  -99,  -99,   58,   58,   58,   58,
+       58,  122,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  -99
 
     },
 
     {
        11, -100, -100, -100, -100, -100, -100, -100, -100, -100,
-     -100, -100, -100,   56, -100, -100,   56,   56,   56,   56,
-       56,   56,   56,   56,  119,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -100
+     -100, -100, -100,   58, -100, -100,   58,   58,  123,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -100
     },
 
     {
        11, -101, -101, -101, -101, -101, -101, -101, -101, -101,
-     -101, -101, -101,   56, -101, -101,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,  120,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -101
+     -101, -101, -101,   58, -101, -101,   58,   58,   58,  124,
+       58,   58,   58,   58,   58,  125,   58,  126,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -101
     },
 
     {
        11, -102, -102, -102, -102, -102, -102, -102, -102, -102,
-     -102, -102, -102,   56, -102, -102,   56,   56,   56,   56,
+     -102, -102, -102,   58, -102, -102,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  121,   56, -102
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+      127,   58,   58,   58,   58,   58,   58, -102
     },
 
     {
        11, -103, -103, -103, -103, -103, -103, -103, -103, -103,
-     -103, -103, -103,   56, -103, -103,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,  122,   56,   56,   56,   56, -103
+     -103, -103, -103,   58, -103, -103,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -103
     },
 
     {
        11, -104, -104, -104, -104, -104, -104, -104, -104, -104,
-     -104, -104, -104,   56, -104, -104,   56,   56,   56,   56,
-       56,   56,   56,   56,  123,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -104
+     -104, -104, -104,   58, -104, -104,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -104
 
     },
 
     {
        11, -105, -105, -105, -105, -105, -105, -105, -105, -105,
-     -105, -105, -105,   56, -105, -105,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,  124,   56,   56,   56, -105
+     -105, -105, -105,   58, -105, -105,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  128,   58,
+       58,   58,   58,   58,   58,   58,   58, -105
     },
 
     {
        11, -106, -106, -106, -106, -106, -106, -106, -106, -106,
-     -106,   84,   84,   84, -106, -106,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84,   84,   84,   84,   84,
-       84,   84,   84,   84,   84,   84, -106
+     -106, -106, -106,   58, -106, -106,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  129,   58, -106
     },
 
     {
        11, -107, -107, -107, -107, -107, -107, -107, -107, -107,
-     -107, -107, -107,   56, -107, -107,   56,   56,   56,   56,
+     -107, -107, -107,   58, -107, -107,   58,   58,   58,   58,
 
-      125,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -107
+       58,   58,   58,   58,   58,  130,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -107
     },
 
     {
        11, -108, -108, -108, -108, -108, -108, -108, -108, -108,
-     -108, -108, -108,   56, -108, -108,   56,   56,  126,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -108
+     -108, -108, -108,   58, -108, -108,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  131,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -108
     },
 
     {
        11, -109, -109, -109, -109, -109, -109, -109, -109, -109,
-     -109, -109, -109,   56, -109, -109,   56,   56,   56,   56,
-      127,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -109
+     -109, -109, -109,   58, -109, -109,   58,   58,   58,   58,
+       58,   58,   58,  132,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -109
 
     },
 
     {
        11, -110, -110, -110, -110, -110, -110, -110, -110, -110,
-     -110, -110, -110,   56, -110, -110,   56,   56,   56,   56,
-       56,   56,   56,   56,  128,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -110
+     -110, -110, -110,   58, -110, -110,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  133,   58, -110
     },
 
     {
        11, -111, -111, -111, -111, -111, -111, -111, -111, -111,
-     -111, -111, -111,   56, -111, -111,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  129,   56, -111
+     -111, -111, -111,   58, -111, -111,   58,   58,   58,   58,
+       58,  134,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -111
     },
 
     {
        11, -112, -112, -112, -112, -112, -112, -112, -112, -112,
-     -112, -112, -112,   56, -112, -112,   56,   56,   56,   56,
+     -112, -112, -112,   58, -112, -112,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,  130,   56,   56,
-       56,   56,   56,   56,   56,   56, -112
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  135,   58,   58,   58,   58, -112
     },
 
     {
        11, -113, -113, -113, -113, -113, -113, -113, -113, -113,
-     -113, -113, -113,   56, -113, -113,   56,   56,   56,   56,
-       56,   56,   56,  131,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -113
+     -113, -113, -113,   58, -113, -113,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  136,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -113
     },
 
     {
        11, -114, -114, -114, -114, -114, -114, -114, -114, -114,
-     -114, -114, -114,   56, -114, -114,   56,   56,   56,   56,
-       56,  132,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -114
+     -114, -114, -114,   58, -114, -114,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  137,   58,   58,   58, -114
 
     },
 
     {
        11, -115, -115, -115, -115, -115, -115, -115, -115, -115,
-     -115, -115, -115,   56, -115, -115,   56,   56,   56,   56,
-      133,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -115
+     -115,   89,   89,   89, -115, -115,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89,   89,   89,   89,
+       89,   89,   89,   89,   89,   89,   89, -115
     },
 
     {
        11, -116, -116, -116, -116, -116, -116, -116, -116, -116,
-     -116, -116, -116,   56, -116, -116,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -116
+     -116, -116, -116,   58, -116, -116,   58,   58,   58,   58,
+       58,  138,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -116
     },
 
     {
        11, -117, -117, -117, -117, -117, -117, -117, -117, -117,
-     -117, -117, -117,   56, -117, -117,   56,   56,   56,   56,
+     -117, -117, -117,   58, -117, -117,   58,   58,   58,  139,
 
-       56,   56,   56,   56,   56,   56,  134,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -117
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -117
     },
 
     {
        11, -118, -118, -118, -118, -118, -118, -118, -118, -118,
-     -118, -118, -118,   56, -118, -118,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -118
+     -118, -118, -118,   58, -118, -118,   58,   58,   58,   58,
+       58,  140,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -118
     },
 
     {
        11, -119, -119, -119, -119, -119, -119, -119, -119, -119,
-     -119, -119, -119,   56, -119, -119,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,  135,   56,
-       56,   56,   56,   56,   56,   56, -119
+     -119, -119, -119,   58, -119, -119,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  141,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -119
 
     },
 
     {
        11, -120, -120, -120, -120, -120, -120, -120, -120, -120,
-     -120, -120, -120,   56, -120, -120,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,  136,
-       56,   56,   56,   56,   56,   56, -120
+     -120, -120, -120,   58, -120, -120,   58,   58,  142,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  143,   58,   58, -120
     },
 
     {
        11, -121, -121, -121, -121, -121, -121, -121, -121, -121,
-     -121, -121, -121,   56, -121, -121,   56,   56,   56,   56,
-       56,   56,   56,   56,  137,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -121
+     -121, -121, -121,   58, -121, -121,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  144,   58, -121
     },
 
     {
        11, -122, -122, -122, -122, -122, -122, -122, -122, -122,
-     -122, -122, -122,   56, -122, -122,   56,   56,  138,   56,
+     -122, -122, -122,   58, -122, -122,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -122
+       58,   58,   58,   58,   58,   58,   58,   58,  145,   58,
+       58,   58,   58,   58,   58,   58,   58, -122
     },
 
     {
        11, -123, -123, -123, -123, -123, -123, -123, -123, -123,
-     -123, -123, -123,   56, -123, -123,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  139,   56,   56,
-       56,   56,   56,   56,   56,   56, -123
+     -123, -123, -123,   58, -123, -123,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  146,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -123
     },
 
     {
        11, -124, -124, -124, -124, -124, -124, -124, -124, -124,
-     -124, -124, -124,   56, -124, -124,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  140,   56,   56, -124
+     -124, -124, -124,   58, -124, -124,   58,   58,   58,   58,
+       58,   58,   58,   58,  147,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -124
 
     },
 
     {
        11, -125, -125, -125, -125, -125, -125, -125, -125, -125,
-     -125, -125, -125,   56, -125, -125,  141,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -125
+     -125, -125, -125,   58, -125, -125,   58,   58,   58,   58,
+       58,   58,  148,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -125
     },
 
     {
        11, -126, -126, -126, -126, -126, -126, -126, -126, -126,
-     -126, -126, -126,   56, -126, -126,   56,   56,   56,   56,
-      142,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -126
+     -126, -126, -126,   58, -126, -126,   58,   58,   58,   58,
+       58,  149,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -126
     },
 
     {
        11, -127, -127, -127, -127, -127, -127, -127, -127, -127,
-     -127, -127, -127,   56, -127, -127,   56,   56,   56,   56,
+     -127, -127, -127,   58, -127, -127,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,  143,   56,   56,
-       56,   56,   56,   56,   56,   56, -127
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -127
     },
 
     {
        11, -128, -128, -128, -128, -128, -128, -128, -128, -128,
-     -128, -128, -128,   56, -128, -128,   56,   56,   56,   56,
-       56,   56,  144,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -128
+     -128, -128, -128,   58, -128, -128,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,  150,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -128
     },
 
     {
        11, -129, -129, -129, -129, -129, -129, -129, -129, -129,
-     -129, -129, -129,   56, -129, -129,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,  145,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -129
+     -129, -129, -129,   58, -129, -129,   58,   58,   58,  151,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -129
 
     },
 
     {
        11, -130, -130, -130, -130, -130, -130, -130, -130, -130,
-     -130, -130, -130,   56, -130, -130,   56,   56,   56,  146,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -130
+     -130, -130, -130,   58, -130, -130,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  152,
+       58,   58,   58,   58,   58,   58,   58, -130
     },
 
     {
        11, -131, -131, -131, -131, -131, -131, -131, -131, -131,
-     -131, -131, -131,   56, -131, -131,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,  147,   56,
-       56,   56,   56,   56,   56,   56, -131
+     -131, -131, -131,   58, -131, -131,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+      153,   58,   58,   58,   58,   58,   58, -131
     },
 
     {
        11, -132, -132, -132, -132, -132, -132, -132, -132, -132,
-     -132, -132, -132,   56, -132, -132,   56,   56,   56,   56,
+     -132, -132, -132,   58, -132, -132,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -132
+       58,  154,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -132
     },
 
     {
        11, -133, -133, -133, -133, -133, -133, -133, -133, -133,
-     -133, -133, -133,   56, -133, -133,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  148,   56,   56,
-       56,   56,   56,   56,   56,   56, -133
+     -133, -133, -133,   58, -133, -133,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  155,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -133
     },
 
     {
        11, -134, -134, -134, -134, -134, -134, -134, -134, -134,
-     -134, -134, -134,   56, -134, -134,   56,   56,   56,   56,
-      149,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -134
+     -134, -134, -134,   58, -134, -134,   58,   58,   58,  156,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -134
 
     },
 
     {
        11, -135, -135, -135, -135, -135, -135, -135, -135, -135,
-     -135, -135, -135,   56, -135, -135,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  150,   56,   56,
-       56,   56,   56,   56,   56,   56, -135
+     -135, -135, -135,   58, -135, -135,   58,   58,   58,  157,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -135
     },
 
     {
        11, -136, -136, -136, -136, -136, -136, -136, -136, -136,
-     -136, -136, -136,   56, -136, -136,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  151,   56,   56, -136
+     -136, -136, -136,   58, -136, -136,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  158,   58,
+       58,   58,   58,   58,   58,   58,   58, -136
     },
 
     {
        11, -137, -137, -137, -137, -137, -137, -137, -137, -137,
-     -137, -137, -137,   56, -137, -137,   56,   56,   56,   56,
+     -137, -137, -137,   58, -137, -137,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,  152,   56,   56,   56,   56, -137
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  159,   58,   58, -137
     },
 
     {
        11, -138, -138, -138, -138, -138, -138, -138, -138, -138,
-     -138, -138, -138,   56, -138, -138,   56,   56,   56,   56,
-      153,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -138
+     -138, -138, -138,   58, -138, -138,   58,  160,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -138
     },
 
     {
        11, -139, -139, -139, -139, -139, -139, -139, -139, -139,
-     -139, -139, -139,   56, -139, -139,   56,   56,   56,   56,
-       56,   56,  154,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -139
+     -139, -139, -139,   58, -139, -139,   58,   58,   58,   58,
+       58,  161,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -139
 
     },
 
     {
        11, -140, -140, -140, -140, -140, -140, -140, -140, -140,
-     -140, -140, -140,   56, -140, -140,  155,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -140
+     -140, -140, -140,   58, -140, -140,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  162,   58,
+       58,   58,   58,   58,   58,   58,   58, -140
     },
 
     {
        11, -141, -141, -141, -141, -141, -141, -141, -141, -141,
-     -141, -141, -141,   56, -141, -141,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  156,   56,   56,
-       56,   56,   56,   56,   56,   56, -141
+     -141, -141, -141,   58, -141, -141,   58,   58,   58,   58,
+       58,   58,   58,  163,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -141
     },
 
     {
        11, -142, -142, -142, -142, -142, -142, -142, -142, -142,
-     -142, -142, -142,   56, -142, -142,   56,   56,   56,   56,
+     -142, -142, -142,   58, -142, -142,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -142
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  164,
+       58,   58,   58,   58,   58,   58,   58, -142
     },
 
     {
        11, -143, -143, -143, -143, -143, -143, -143, -143, -143,
-     -143, -143, -143,   56, -143, -143,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  157,   56,   56, -143
+     -143, -143, -143,   58, -143, -143,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  165,   58,   58,   58,   58, -143
     },
 
     {
        11, -144, -144, -144, -144, -144, -144, -144, -144, -144,
-     -144, -144, -144,   56, -144, -144,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -144
+     -144, -144, -144,   58, -144, -144,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  166,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -144
 
     },
 
     {
        11, -145, -145, -145, -145, -145, -145, -145, -145, -145,
-     -145, -145, -145,   56, -145, -145,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  158,   56,   56, -145
+     -145, -145, -145,   58, -145, -145,   58,   58,   58,   58,
+      167,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -145
     },
 
     {
        11, -146, -146, -146, -146, -146, -146, -146, -146, -146,
-     -146, -146, -146,   56, -146, -146,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,  159,   56,   56,   56, -146
+     -146, -146, -146,   58, -146, -146,   58,   58,   58,   58,
+       58,  168,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -146
     },
 
     {
        11, -147, -147, -147, -147, -147, -147, -147, -147, -147,
-     -147, -147, -147,   56, -147, -147,   56,   56,   56,   56,
+     -147, -147, -147,   58, -147, -147,   58,   58,   58,   58,
 
-       56,   56,   56,   56,  160,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -147
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  169,
+       58,   58,   58,   58,   58,   58,   58, -147
     },
 
     {
        11, -148, -148, -148, -148, -148, -148, -148, -148, -148,
-     -148, -148, -148,   56, -148, -148,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  161,   56, -148
+     -148, -148, -148,   58, -148, -148,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -148
     },
 
     {
        11, -149, -149, -149, -149, -149, -149, -149, -149, -149,
-     -149, -149, -149,   56, -149, -149,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,  162,   56,   56,
-       56,   56,   56,   56,   56,   56, -149
+     -149, -149, -149,   58, -149, -149,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  170,   58,
+       58,   58,   58,   58,   58,   58,   58, -149
 
     },
 
     {
        11, -150, -150, -150, -150, -150, -150, -150, -150, -150,
-     -150, -150, -150,   56, -150, -150,  163,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -150
+     -150, -150, -150,   58, -150, -150,   58,   58,   58,   58,
+       58,  171,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -150
     },
 
     {
        11, -151, -151, -151, -151, -151, -151, -151, -151, -151,
-     -151, -151, -151,   56, -151, -151,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -151
+     -151, -151, -151,   58, -151, -151,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  172,
+       58,   58,   58,   58,   58,   58,   58, -151
     },
 
     {
        11, -152, -152, -152, -152, -152, -152, -152, -152, -152,
-     -152, -152, -152,   56, -152, -152,   56,   56,   56,   56,
+     -152, -152, -152,   58, -152, -152,   58,   58,   58,   58,
 
-      164,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -152
+       58,   58,   58,   58,   58,   58,   58,   58,  173,   58,
+       58,   58,   58,   58,   58,   58,   58, -152
     },
 
     {
        11, -153, -153, -153, -153, -153, -153, -153, -153, -153,
-     -153, -153, -153,   56, -153, -153,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -153
+     -153, -153, -153,   58, -153, -153,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  174,   58,   58, -153
     },
 
     {
        11, -154, -154, -154, -154, -154, -154, -154, -154, -154,
-     -154, -154, -154,   56, -154, -154,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -154
+     -154, -154, -154,   58, -154, -154,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -154
 
     },
 
     {
        11, -155, -155, -155, -155, -155, -155, -155, -155, -155,
-     -155, -155, -155,   56, -155, -155,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,  165,   56,   56, -155
+     -155, -155, -155,   58, -155, -155,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,  175,   58,   58,   58,   58, -155
     },
 
     {
        11, -156, -156, -156, -156, -156, -156, -156, -156, -156,
-     -156, -156, -156,   56, -156, -156,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -156
+     -156, -156, -156,   58, -156, -156,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  176,   58,   58, -156
     },
 
     {
        11, -157, -157, -157, -157, -157, -157, -157, -157, -157,
-     -157, -157, -157,   56, -157, -157,   56,   56,   56,   56,
+     -157, -157, -157,   58, -157, -157,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -157
+       58,  177,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -157
     },
 
     {
        11, -158, -158, -158, -158, -158, -158, -158, -158, -158,
-     -158, -158, -158,   56, -158, -158,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -158
+     -158, -158, -158,   58, -158, -158,   58,   58,   58,   58,
+       58,   58,   58,  178,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -158
     },
 
     {
        11, -159, -159, -159, -159, -159, -159, -159, -159, -159,
-     -159, -159, -159,   56, -159, -159,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -159
+     -159, -159, -159,   58, -159, -159,   58,  179,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -159
 
     },
 
     {
        11, -160, -160, -160, -160, -160, -160, -160, -160, -160,
-     -160, -160, -160,   56, -160, -160,   56,   56,  166,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -160
+     -160, -160, -160,   58, -160, -160,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  180,   58,
+       58,   58,   58,   58,   58,   58,   58, -160
     },
 
     {
        11, -161, -161, -161, -161, -161, -161, -161, -161, -161,
-     -161, -161, -161,   56, -161, -161,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -161
+     -161, -161, -161,   58, -161, -161,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -161
     },
 
     {
        11, -162, -162, -162, -162, -162, -162, -162, -162, -162,
-     -162, -162, -162,   56, -162, -162,   56,   56,   56,   56,
+     -162, -162, -162,   58, -162, -162,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,  167,   56, -162
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  181,   58,   58, -162
     },
 
     {
        11, -163, -163, -163, -163, -163, -163, -163, -163, -163,
-     -163, -163, -163,   56, -163, -163,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,  168,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -163
+     -163, -163, -163,   58, -163, -163,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -163
     },
 
     {
        11, -164, -164, -164, -164, -164, -164, -164, -164, -164,
-     -164, -164, -164,   56, -164, -164,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,  169,   56,   56,   56, -164
+     -164, -164, -164,   58, -164, -164,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,  182,
+       58,   58,   58,   58,   58,   58,   58, -164
 
     },
 
     {
        11, -165, -165, -165, -165, -165, -165, -165, -165, -165,
-     -165, -165, -165,   56, -165, -165,   56,   56,   56,   56,
-      170,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -165
+     -165, -165, -165,   58, -165, -165,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  183,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -165
     },
 
     {
        11, -166, -166, -166, -166, -166, -166, -166, -166, -166,
-     -166, -166, -166,   56, -166, -166,   56,   56,   56,   56,
-      171,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -166
+     -166, -166, -166,   58, -166, -166,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  184,   58,   58, -166
     },
 
     {
        11, -167, -167, -167, -167, -167, -167, -167, -167, -167,
-     -167, -167, -167,   56, -167, -167,   56,   56,   56,   56,
+     -167, -167, -167,   58, -167, -167,   58,   58,   58,   58,
 
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -167
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  185,   58,   58,   58, -167
     },
 
     {
        11, -168, -168, -168, -168, -168, -168, -168, -168, -168,
-     -168, -168, -168,   56, -168, -168,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -168
+     -168, -168, -168,   58, -168, -168,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -168
     },
 
     {
        11, -169, -169, -169, -169, -169, -169, -169, -169, -169,
-     -169, -169, -169,   56, -169, -169,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -169
+     -169, -169, -169,   58, -169, -169,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  186,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -169
 
     },
 
     {
        11, -170, -170, -170, -170, -170, -170, -170, -170, -170,
-     -170, -170, -170,   56, -170, -170,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -170
+     -170, -170, -170,   58, -170, -170,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  187,   58, -170
     },
 
     {
        11, -171, -171, -171, -171, -171, -171, -171, -171, -171,
-     -171, -171, -171,   56, -171, -171,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
-       56,   56,   56,   56,   56,   56, -171
+     -171, -171, -171,   58, -171, -171,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  188,   58,
+       58,   58,   58,   58,   58,   58,   58, -171
     },
 
-    } ;
-
+    {
+       11, -172, -172, -172, -172, -172, -172, -172, -172, -172,
+     -172, -172, -172,   58, -172, -172,   58,   58,   58,   58,
 
-static yy_state_type yy_get_previous_state YY_PROTO(( void ));
-static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
-static int yy_get_next_buffer YY_PROTO(( void ));
-static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+       58,   58,   58,   58,   58,   58,   58,   58,  189,   58,
+       58,   58,   58,   58,   58,   58,   58, -172
+    },
 
-/* Done after the current pattern has been matched and before the
- * corresponding action - sets up yytext.
- */
-#define YY_DO_BEFORE_ACTION \
-       yytext_ptr = yy_bp; \
-       yyleng = (int) (yy_cp - yy_bp); \
-       yy_hold_char = *yy_cp; \
-       *yy_cp = '\0'; \
-       yy_c_buf_p = yy_cp;
+    {
+       11, -173, -173, -173, -173, -173, -173, -173, -173, -173,
+     -173, -173, -173,   58, -173, -173,   58,  190,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -173
+    },
 
-#define YY_NUM_RULES 55
-#define YY_END_OF_BUFFER 56
-static yyconst short int yy_accept[172] =
-    {   0,
-        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-       56,    5,    4,    3,    2,   29,   30,   28,   28,   28,
-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-       54,   51,   53,   46,   50,   49,   48,   44,   41,   35,
-       40,   44,   33,   34,   43,   43,   36,   43,   43,   44,
-        4,    3,    2,    2,    1,   28,   28,   28,   28,   28,
-       28,   28,   15,   28,   28,   28,   28,   28,   28,   28,
-       28,   28,   54,   51,   53,   52,   46,   45,   48,   47,
-       37,   31,   43,   43,   38,   39,   32,   28,   28,   28,
-       28,   28,   28,   28,   28,   26,   25,   28,   28,   28,
-
-       28,   28,   28,   28,   28,   42,   23,   28,   28,   28,
-       28,   28,   28,   28,   28,   14,   28,    7,   28,   28,
-       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,
-       28,   16,   28,   28,   28,   28,   28,   28,   28,   28,
-       28,   10,   28,   13,   28,   28,   28,   28,   28,   28,
-       21,   28,    9,   27,   28,   24,   12,   20,   17,   28,
-        8,   28,   28,   28,   28,   28,    6,   19,   18,   22,
-       11
-    } ;
+    {
+       11, -174, -174, -174, -174, -174, -174, -174, -174, -174,
+     -174, -174, -174,   58, -174, -174,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -174
 
-static yyconst int yy_ec[256] =
-    {   0,
-        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
-       10,    1,    1,    1,   11,   12,   12,   13,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,    1,    1,    1,
-       14,    1,    1,    1,   13,   13,   13,   13,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
-       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
-        1,   15,    1,    1,   13,    1,   16,   17,   18,   19,
+    },
 
-       20,   21,   22,   23,   24,   13,   13,   25,   26,   27,
-       28,   29,   30,   31,   32,   33,   34,   13,   13,   35,
-       13,   13,    1,   36,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+    {
+       11, -175, -175, -175, -175, -175, -175, -175, -175, -175,
+     -175, -175, -175,   58, -175, -175,   58,   58,   58,   58,
+       58,  191,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -175
+    },
 
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
-        1,    1,    1,    1,    1
-    } ;
+    {
+       11, -176, -176, -176, -176, -176, -176, -176, -176, -176,
+     -176, -176, -176,   58, -176, -176,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -176
+    },
 
-/* The intent behind this definition is that it'll catch
- * any uses of REJECT which flex missed.
- */
-#define REJECT reject_used_but_not_detected
-#define yymore() yymore_used_but_not_detected
-#define YY_MORE_ADJ 0
-#define YY_RESTORE_YY_MORE_OFFSET
-char *yytext;
-#line 1 "zconf.l"
-#define INITIAL 0
-#define YY_NEVER_INTERACTIVE 1
-#define COMMAND 1
-#define HELP 2
-#define STRING 3
-#define PARAM 4
+    {
+       11, -177, -177, -177, -177, -177, -177, -177, -177, -177,
+     -177, -177, -177,   58, -177, -177,   58,   58,   58,   58,
 
-#line 5 "zconf.l"
-/*
- * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
- * Released under the terms of the GNU GPL v2.0.
- */
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -177
+    },
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
+    {
+       11, -178, -178, -178, -178, -178, -178, -178, -178, -178,
+     -178, -178, -178,   58, -178, -178,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -178
+    },
 
-#define LKC_DIRECT_LINK
-#include "lkc.h"
-#include "zconf.tab.h"
+    {
+       11, -179, -179, -179, -179, -179, -179, -179, -179, -179,
+     -179, -179, -179,   58, -179, -179,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  192,   58,   58, -179
 
-#define START_STRSIZE  16
+    },
 
-char *text;
-static char *text_ptr;
-static int text_size, text_asize;
+    {
+       11, -180, -180, -180, -180, -180, -180, -180, -180, -180,
+     -180, -180, -180,   58, -180, -180,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -180
+    },
 
-struct buffer {
-        struct buffer *parent;
-        YY_BUFFER_STATE state;
-};
+    {
+       11, -181, -181, -181, -181, -181, -181, -181, -181, -181,
+     -181, -181, -181,   58, -181, -181,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -181
+    },
 
-struct buffer *current_buf;
+    {
+       11, -182, -182, -182, -182, -182, -182, -182, -182, -182,
+     -182, -182, -182,   58, -182, -182,   58,   58,   58,   58,
 
-static int last_ts, first_ts;
+       58,   58,   58,   58,   58,   58,  193,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -182
+    },
 
-static void zconf_endhelp(void);
-static struct buffer *zconf_endfile(void);
+    {
+       11, -183, -183, -183, -183, -183, -183, -183, -183, -183,
+     -183, -183, -183,   58, -183, -183,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  194,   58,   58,   58, -183
+    },
 
-void new_string(void)
-{
-       text = malloc(START_STRSIZE);
-       text_asize = START_STRSIZE;
-       text_ptr = text;
-       text_size = 0;
-       *text_ptr = 0;
-}
+    {
+       11, -184, -184, -184, -184, -184, -184, -184, -184, -184,
+     -184, -184, -184,   58, -184, -184,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -184
 
-void append_string(const char *str, int size)
-{
-       int new_size = text_size + size + 1;
-       if (new_size > text_asize) {
-               text = realloc(text, new_size);
-               text_asize = new_size;
-               text_ptr = text + text_size;
-       }
-       memcpy(text_ptr, str, size);
-       text_ptr += size;
-       text_size += size;
-       *text_ptr = 0;
-}
+    },
 
-void alloc_string(const char *str, int size)
-{
-       text = malloc(size + 1);
-       memcpy(text, str, size);
-       text[size] = 0;
-}
-#line 1719 "lex.zconf.c"
+    {
+       11, -185, -185, -185, -185, -185, -185, -185, -185, -185,
+     -185, -185, -185,   58, -185, -185,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -185
+    },
 
-/* Macros after this point can all be overridden by user definitions in
- * section 1.
- */
+    {
+       11, -186, -186, -186, -186, -186, -186, -186, -186, -186,
+     -186, -186, -186,   58, -186, -186,   58,   58,   58,  195,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -186
+    },
 
-#ifndef YY_SKIP_YYWRAP
-#ifdef __cplusplus
-extern "C" int yywrap YY_PROTO(( void ));
-#else
-extern int yywrap YY_PROTO(( void ));
-#endif
-#endif
+    {
+       11, -187, -187, -187, -187, -187, -187, -187, -187, -187,
+     -187, -187, -187,   58, -187, -187,   58,   58,   58,   58,
 
-#ifndef YY_NO_UNPUT
-static void yyunput YY_PROTO(( int c, char *buf_ptr ));
-#endif
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -187
+    },
 
-#ifndef yytext_ptr
-static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
-#endif
+    {
+       11, -188, -188, -188, -188, -188, -188, -188, -188, -188,
+     -188, -188, -188,   58, -188, -188,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,  196,   58, -188
+    },
 
-#ifdef YY_NEED_STRLEN
-static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+    {
+       11, -189, -189, -189, -189, -189, -189, -189, -189, -189,
+     -189, -189, -189,   58, -189, -189,   58,   58,   58,   58,
+       58,   58,  197,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -189
+
+    },
+
+    {
+       11, -190, -190, -190, -190, -190, -190, -190, -190, -190,
+     -190, -190, -190,   58, -190, -190,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,  198,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -190
+    },
+
+    {
+       11, -191, -191, -191, -191, -191, -191, -191, -191, -191,
+     -191, -191, -191,   58, -191, -191,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,  199,   58,   58,   58, -191
+    },
+
+    {
+       11, -192, -192, -192, -192, -192, -192, -192, -192, -192,
+     -192, -192, -192,   58, -192, -192,   58,   58,   58,   58,
+
+       58,  200,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -192
+    },
+
+    {
+       11, -193, -193, -193, -193, -193, -193, -193, -193, -193,
+     -193, -193, -193,   58, -193, -193,   58,   58,   58,   58,
+       58,  201,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -193
+    },
+
+    {
+       11, -194, -194, -194, -194, -194, -194, -194, -194, -194,
+     -194, -194, -194,   58, -194, -194,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  202,   58,   58, -194
+
+    },
+
+    {
+       11, -195, -195, -195, -195, -195, -195, -195, -195, -195,
+     -195, -195, -195,   58, -195, -195,   58,   58,   58,   58,
+       58,  203,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -195
+    },
+
+    {
+       11, -196, -196, -196, -196, -196, -196, -196, -196, -196,
+     -196, -196, -196,   58, -196, -196,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -196
+    },
+
+    {
+       11, -197, -197, -197, -197, -197, -197, -197, -197, -197,
+     -197, -197, -197,   58, -197, -197,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,  204,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -197
+    },
+
+    {
+       11, -198, -198, -198, -198, -198, -198, -198, -198, -198,
+     -198, -198, -198,   58, -198, -198,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -198
+    },
+
+    {
+       11, -199, -199, -199, -199, -199, -199, -199, -199, -199,
+     -199, -199, -199,   58, -199, -199,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -199
+
+    },
+
+    {
+       11, -200, -200, -200, -200, -200, -200, -200, -200, -200,
+     -200, -200, -200,   58, -200, -200,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -200
+    },
+
+    {
+       11, -201, -201, -201, -201, -201, -201, -201, -201, -201,
+     -201, -201, -201,   58, -201, -201,   58,  205,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -201
+    },
+
+    {
+       11, -202, -202, -202, -202, -202, -202, -202, -202, -202,
+     -202, -202, -202,   58, -202, -202,   58,  206,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -202
+    },
+
+    {
+       11, -203, -203, -203, -203, -203, -203, -203, -203, -203,
+     -203, -203, -203,   58, -203, -203,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -203
+    },
+
+    {
+       11, -204, -204, -204, -204, -204, -204, -204, -204, -204,
+     -204, -204, -204,   58, -204, -204,   58,   58,   58,   58,
+       58,   58,   58,  207,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -204
+
+    },
+
+    {
+       11, -205, -205, -205, -205, -205, -205, -205, -205, -205,
+     -205, -205, -205,   58, -205, -205,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,  208,   58,
+       58,   58,   58,   58,   58,   58,   58, -205
+    },
+
+    {
+       11, -206, -206, -206, -206, -206, -206, -206, -206, -206,
+     -206, -206, -206,   58, -206, -206,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,  209,   58,   58, -206
+    },
+
+    {
+       11, -207, -207, -207, -207, -207, -207, -207, -207, -207,
+     -207, -207, -207,   58, -207, -207,   58,   58,   58,   58,
+
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -207
+    },
+
+    {
+       11, -208, -208, -208, -208, -208, -208, -208, -208, -208,
+     -208, -208, -208,   58, -208, -208,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -208
+    },
+
+    {
+       11, -209, -209, -209, -209, -209, -209, -209, -209, -209,
+     -209, -209, -209,   58, -209, -209,   58,   58,   58,   58,
+       58,  210,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -209
+
+    },
+
+    {
+       11, -210, -210, -210, -210, -210, -210, -210, -210, -210,
+     -210, -210, -210,   58, -210, -210,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58,   58,   58,   58,
+       58,   58,   58,   58,   58,   58,   58, -210
+    },
+
+    } ;
+
+static yy_state_type yy_get_previous_state (void );
+static yy_state_type yy_try_NUL_trans (yy_state_type current_state  );
+static int yy_get_next_buffer (void );
+static void yy_fatal_error (yyconst char msg[]  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up zconftext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       (yytext_ptr) = yy_bp; \
+       zconfleng = (size_t) (yy_cp - yy_bp); \
+       (yy_hold_char) = *yy_cp; \
+       *yy_cp = '\0'; \
+       (yy_c_buf_p) = yy_cp;
+
+#define YY_NUM_RULES 64
+#define YY_END_OF_BUFFER 65
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+       {
+       flex_int32_t yy_verify;
+       flex_int32_t yy_nxt;
+       };
+static yyconst flex_int16_t yy_accept[211] =
+    {   0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+       65,    5,    4,    3,    2,   36,   37,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       63,   60,   62,   55,   59,   58,   57,   53,   48,   42,
+       47,   51,   53,   40,   41,   50,   50,   43,   53,   50,
+       50,   53,    4,    3,    2,    2,    1,   35,   35,   35,
+       35,   35,   35,   35,   16,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   63,   60,   62,   61,
+       55,   54,   57,   56,   44,   51,   38,   50,   50,   52,
+       45,   46,   39,   35,   35,   35,   35,   35,   35,   35,
+
+       35,   35,   30,   29,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   49,   25,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   15,   35,    7,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   17,   35,   35,
+       35,   35,   35,   34,   35,   35,   35,   35,   35,   35,
+       10,   35,   13,   35,   35,   35,   35,   33,   35,   35,
+       35,   35,   35,   22,   35,   32,    9,   31,   35,   26,
+       12,   35,   35,   21,   18,   35,    8,   35,   35,   35,
+       35,   35,   27,   35,   35,    6,   35,   20,   19,   23,
+
+       35,   35,   11,   35,   35,   35,   14,   28,   35,   24
+    } ;
+
+static yyconst flex_int32_t yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    4,    5,    6,    1,    1,    7,    8,    9,
+       10,    1,    1,    1,   11,   12,   12,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,    1,    1,    1,
+       14,    1,    1,    1,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+        1,   15,    1,    1,   16,    1,   17,   18,   19,   20,
+
+       21,   22,   23,   24,   25,   13,   13,   26,   27,   28,
+       29,   30,   31,   32,   33,   34,   35,   13,   13,   36,
+       13,   13,    1,   37,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+extern int zconf_flex_debug;
+int zconf_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *zconftext;
+
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ * Released under the terms of the GNU GPL v2.0.
+ */
+
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define LKC_DIRECT_LINK
+#include "lkc.h"
+
+#define START_STRSIZE  16
+
+char *text;
+static char *text_ptr;
+static int text_size, text_asize;
+
+struct buffer {
+        struct buffer *parent;
+        YY_BUFFER_STATE state;
+};
+
+struct buffer *current_buf;
+
+static int last_ts, first_ts;
+
+static void zconf_endhelp(void);
+static struct buffer *zconf_endfile(void);
+
+void new_string(void)
+{
+       text = malloc(START_STRSIZE);
+       text_asize = START_STRSIZE;
+       text_ptr = text;
+       text_size = 0;
+       *text_ptr = 0;
+}
+
+void append_string(const char *str, int size)
+{
+       int new_size = text_size + size + 1;
+       if (new_size > text_asize) {
+               text = realloc(text, new_size);
+               text_asize = new_size;
+               text_ptr = text + text_size;
+       }
+       memcpy(text_ptr, str, size);
+       text_ptr += size;
+       text_size += size;
+       *text_ptr = 0;
+}
+
+void alloc_string(const char *str, int size)
+{
+       text = malloc(size + 1);
+       memcpy(text, str, size);
+       text[size] = 0;
+}
+
+#define INITIAL 0
+#define COMMAND 1
+#define HELP 2
+#define STRING 3
+#define PARAM 4
+
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
 #endif
 
-#ifndef YY_NO_INPUT
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
 #ifdef __cplusplus
-static int yyinput YY_PROTO(( void ));
+extern "C" int zconfwrap (void );
 #else
-static int input YY_PROTO(( void ));
+extern int zconfwrap (void );
 #endif
 #endif
 
-#if YY_STACK_USED
-static int yy_start_stack_ptr = 0;
-static int yy_start_stack_depth = 0;
-static int *yy_start_stack = 0;
-#ifndef YY_NO_PUSH_STATE
-static void yy_push_state YY_PROTO(( int new_state ));
-#endif
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state YY_PROTO(( void ));
-#endif
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state YY_PROTO(( void ));
+    static void yyunput (int c,char *buf_ptr  );
+    
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char *,yyconst char *,int );
 #endif
 
-#else
-#define YY_NO_PUSH_STATE 1
-#define YY_NO_POP_STATE 1
-#define YY_NO_TOP_STATE 1
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (yyconst char * );
 #endif
 
-#ifdef YY_MALLOC_DECL
-YY_MALLOC_DECL
-#else
-#if __STDC__
-#ifndef __cplusplus
-#include <stdlib.h>
-#endif
+#ifndef YY_NO_INPUT
+
+#ifdef __cplusplus
+static int yyinput (void );
 #else
-/* Just try to get by without declaring the routines.  This will fail
- * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
- * or sizeof(void*) != sizeof(int).
- */
+static int input (void );
 #endif
+
 #endif
 
 /* Amount of stuff to slurp up with each read. */
@@ -1790,12 +2114,11 @@ YY_MALLOC_DECL
 #endif
 
 /* Copy whatever the last rule matched to the standard output. */
-
 #ifndef ECHO
 /* This used to be an fputs(), but since the string might contain NUL's,
  * we now use fwrite().
  */
-#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#define ECHO (void) fwrite( zconftext, zconfleng, 1, zconfout )
 #endif
 
 /* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
@@ -1804,7 +2127,7 @@ YY_MALLOC_DECL
 #ifndef YY_INPUT
 #define YY_INPUT(buf,result,max_size) \
        errno=0; \
-       while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \
+       while ( (result = read( fileno(zconfin), (char *) buf, max_size )) < 0 ) \
        { \
                if( errno != EINTR) \
                { \
@@ -1812,8 +2135,10 @@ YY_MALLOC_DECL
                        break; \
                } \
                errno=0; \
-               clearerr(yyin); \
-       }
+               clearerr(zconfin); \
+       }\
+\
+
 #endif
 
 /* No semi-colon after return; correct usage is to write "yyterminate();" -
@@ -1834,14 +2159,20 @@ YY_MALLOC_DECL
 #define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
 #endif
 
+/* end tables serialization structures and prototypes */
+
 /* Default declaration of generated scanner - a define so the user can
  * easily add parameters.
  */
 #ifndef YY_DECL
-#define YY_DECL int yylex YY_PROTO(( void ))
-#endif
+#define YY_DECL_IS_OURS 1
 
-/* Code executed at the beginning of each rule, after yytext and yyleng
+extern int zconflex (void);
+
+#define YY_DECL int zconflex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after zconftext and zconfleng
  * have been set up.
  */
 #ifndef YY_USER_ACTION
@@ -1856,58 +2187,58 @@ YY_MALLOC_DECL
 #define YY_RULE_SETUP \
        YY_USER_ACTION
 
+/** The main scanner function which does all the work.
+ */
 YY_DECL
-       {
+{
        register yy_state_type yy_current_state;
        register char *yy_cp, *yy_bp;
        register int yy_act;
-
-#line 71 "zconf.l"
-
+    
        int str = 0;
        int ts, i;
 
-#line 1871 "lex.zconf.c"
-
-       if ( yy_init )
+       if ( (yy_init) )
                {
-               yy_init = 0;
+               (yy_init) = 0;
 
 #ifdef YY_USER_INIT
                YY_USER_INIT;
 #endif
 
-               if ( ! yy_start )
-                       yy_start = 1;   /* first start state */
+               if ( ! (yy_start) )
+                       (yy_start) = 1; /* first start state */
 
-               if ( ! yyin )
-                       yyin = stdin;
+               if ( ! zconfin )
+                       zconfin = stdin;
 
-               if ( ! yyout )
-                       yyout = stdout;
+               if ( ! zconfout )
+                       zconfout = stdout;
 
-               if ( ! yy_current_buffer )
-                       yy_current_buffer =
-                               yy_create_buffer( yyin, YY_BUF_SIZE );
+               if ( ! YY_CURRENT_BUFFER ) {
+                       zconfensure_buffer_stack ();
+                       YY_CURRENT_BUFFER_LVALUE =
+                               zconf_create_buffer(zconfin,YY_BUF_SIZE );
+               }
 
-               yy_load_buffer_state();
+               zconf_load_buffer_state( );
                }
 
        while ( 1 )             /* loops until end-of-file is reached */
                {
-               yy_cp = yy_c_buf_p;
+               yy_cp = (yy_c_buf_p);
 
-               /* Support of yytext. */
-               *yy_cp = yy_hold_char;
+               /* Support of zconftext. */
+               *yy_cp = (yy_hold_char);
 
                /* yy_bp points to the position in yy_ch_buf of the start of
                 * the current run.
                 */
                yy_bp = yy_cp;
 
-               yy_current_state = yy_start;
+               yy_current_state = (yy_start);
 yy_match:
-               while ( (yy_current_state = yy_nxt[yy_current_state][yy_ec[YY_SC_TO_UI(*yy_cp)]]) > 0 )
+               while ( (yy_current_state = yy_nxt[yy_current_state][ yy_ec[YY_SC_TO_UI(*yy_cp)]  ]) > 0 )
                        ++yy_cp;
 
                yy_current_state = -yy_current_state;
@@ -1917,334 +2248,321 @@ yy_find_action:
 
                YY_DO_BEFORE_ACTION;
 
-
 do_action:     /* This label is used only to access EOF actions. */
 
-
                switch ( yy_act )
        { /* beginning of action switch */
 case 1:
+/* rule 1 can match eol */
 YY_RULE_SETUP
-#line 75 "zconf.l"
 current_file->lineno++;
        YY_BREAK
 case 2:
 YY_RULE_SETUP
-#line 76 "zconf.l"
 
        YY_BREAK
 case 3:
+/* rule 3 can match eol */
 YY_RULE_SETUP
-#line 78 "zconf.l"
 current_file->lineno++; return T_EOL;
        YY_BREAK
 case 4:
 YY_RULE_SETUP
-#line 80 "zconf.l"
 {
        BEGIN(COMMAND);
 }
        YY_BREAK
 case 5:
 YY_RULE_SETUP
-#line 84 "zconf.l"
 {
-       unput(yytext[0]);
+       unput(zconftext[0]);
        BEGIN(COMMAND);
 }
        YY_BREAK
 
 case 6:
 YY_RULE_SETUP
-#line 91 "zconf.l"
 BEGIN(PARAM); return T_MAINMENU;
        YY_BREAK
 case 7:
 YY_RULE_SETUP
-#line 92 "zconf.l"
 BEGIN(PARAM); return T_MENU;
        YY_BREAK
 case 8:
 YY_RULE_SETUP
-#line 93 "zconf.l"
 BEGIN(PARAM); return T_ENDMENU;
        YY_BREAK
 case 9:
 YY_RULE_SETUP
-#line 94 "zconf.l"
 BEGIN(PARAM); return T_SOURCE;
        YY_BREAK
 case 10:
 YY_RULE_SETUP
-#line 95 "zconf.l"
 BEGIN(PARAM); return T_CHOICE;
        YY_BREAK
 case 11:
 YY_RULE_SETUP
-#line 96 "zconf.l"
 BEGIN(PARAM); return T_ENDCHOICE;
        YY_BREAK
 case 12:
 YY_RULE_SETUP
-#line 97 "zconf.l"
 BEGIN(PARAM); return T_COMMENT;
        YY_BREAK
 case 13:
 YY_RULE_SETUP
-#line 98 "zconf.l"
 BEGIN(PARAM); return T_CONFIG;
        YY_BREAK
 case 14:
 YY_RULE_SETUP
-#line 99 "zconf.l"
-BEGIN(PARAM); return T_HELP;
+BEGIN(PARAM); return T_MENUCONFIG;
        YY_BREAK
 case 15:
 YY_RULE_SETUP
-#line 100 "zconf.l"
-BEGIN(PARAM); return T_IF;
+BEGIN(PARAM); return T_HELP;
        YY_BREAK
 case 16:
 YY_RULE_SETUP
-#line 101 "zconf.l"
-BEGIN(PARAM); return T_ENDIF;
+BEGIN(PARAM); return T_IF;
        YY_BREAK
 case 17:
 YY_RULE_SETUP
-#line 102 "zconf.l"
-BEGIN(PARAM); return T_DEPENDS;
+BEGIN(PARAM); return T_ENDIF;
        YY_BREAK
 case 18:
 YY_RULE_SETUP
-#line 103 "zconf.l"
-BEGIN(PARAM); return T_REQUIRES;
+BEGIN(PARAM); return T_DEPENDS;
        YY_BREAK
 case 19:
 YY_RULE_SETUP
-#line 104 "zconf.l"
-BEGIN(PARAM); return T_OPTIONAL;
+BEGIN(PARAM); return T_REQUIRES;
        YY_BREAK
 case 20:
 YY_RULE_SETUP
-#line 105 "zconf.l"
-BEGIN(PARAM); return T_DEFAULT;
+BEGIN(PARAM); return T_OPTIONAL;
        YY_BREAK
 case 21:
 YY_RULE_SETUP
-#line 106 "zconf.l"
-BEGIN(PARAM); return T_PROMPT;
+BEGIN(PARAM); return T_DEFAULT;
        YY_BREAK
 case 22:
 YY_RULE_SETUP
-#line 107 "zconf.l"
-BEGIN(PARAM); return T_TRISTATE;
+BEGIN(PARAM); return T_PROMPT;
        YY_BREAK
 case 23:
 YY_RULE_SETUP
-#line 108 "zconf.l"
-BEGIN(PARAM); return T_BOOLEAN;
+BEGIN(PARAM); return T_TRISTATE;
        YY_BREAK
 case 24:
 YY_RULE_SETUP
-#line 109 "zconf.l"
-BEGIN(PARAM); return T_BOOLEAN;
+BEGIN(PARAM); return T_DEF_TRISTATE;
        YY_BREAK
 case 25:
 YY_RULE_SETUP
-#line 110 "zconf.l"
-BEGIN(PARAM); return T_INT;
+BEGIN(PARAM); return T_BOOLEAN;
        YY_BREAK
 case 26:
 YY_RULE_SETUP
-#line 111 "zconf.l"
-BEGIN(PARAM); return T_HEX;
+BEGIN(PARAM); return T_BOOLEAN;
        YY_BREAK
 case 27:
 YY_RULE_SETUP
-#line 112 "zconf.l"
-BEGIN(PARAM); return T_STRING;
+BEGIN(PARAM); return T_DEF_BOOLEAN;
        YY_BREAK
 case 28:
 YY_RULE_SETUP
-#line 113 "zconf.l"
+BEGIN(PARAM); return T_DEF_BOOLEAN;
+       YY_BREAK
+case 29:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_INT;
+       YY_BREAK
+case 30:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_HEX;
+       YY_BREAK
+case 31:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_STRING;
+       YY_BREAK
+case 32:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_SELECT;
+       YY_BREAK
+case 33:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_SELECT;
+       YY_BREAK
+case 34:
+YY_RULE_SETUP
+BEGIN(PARAM); return T_RANGE;
+       YY_BREAK
+case 35:
+YY_RULE_SETUP
 {
-               alloc_string(yytext, yyleng);
+               alloc_string(zconftext, zconfleng);
                zconflval.string = text;
                return T_WORD;
        }
        YY_BREAK
-case 29:
+case 36:
 YY_RULE_SETUP
-#line 118 "zconf.l"
 
        YY_BREAK
-case 30:
+case 37:
+/* rule 37 can match eol */
 YY_RULE_SETUP
-#line 119 "zconf.l"
 current_file->lineno++; BEGIN(INITIAL);
        YY_BREAK
 
-
-case 31:
+case 38:
 YY_RULE_SETUP
-#line 123 "zconf.l"
 return T_AND;
        YY_BREAK
-case 32:
+case 39:
 YY_RULE_SETUP
-#line 124 "zconf.l"
 return T_OR;
        YY_BREAK
-case 33:
+case 40:
 YY_RULE_SETUP
-#line 125 "zconf.l"
 return T_OPEN_PAREN;
        YY_BREAK
-case 34:
+case 41:
 YY_RULE_SETUP
-#line 126 "zconf.l"
 return T_CLOSE_PAREN;
        YY_BREAK
-case 35:
+case 42:
 YY_RULE_SETUP
-#line 127 "zconf.l"
 return T_NOT;
        YY_BREAK
-case 36:
+case 43:
 YY_RULE_SETUP
-#line 128 "zconf.l"
 return T_EQUAL;
        YY_BREAK
-case 37:
+case 44:
 YY_RULE_SETUP
-#line 129 "zconf.l"
 return T_UNEQUAL;
        YY_BREAK
-case 38:
+case 45:
 YY_RULE_SETUP
-#line 130 "zconf.l"
 return T_IF;
        YY_BREAK
-case 39:
+case 46:
 YY_RULE_SETUP
-#line 131 "zconf.l"
 return T_ON;
        YY_BREAK
-case 40:
+case 47:
 YY_RULE_SETUP
-#line 132 "zconf.l"
 {
-               str = yytext[0];
+               str = zconftext[0];
                new_string();
                BEGIN(STRING);
        }
        YY_BREAK
-case 41:
+case 48:
+/* rule 48 can match eol */
 YY_RULE_SETUP
-#line 137 "zconf.l"
 BEGIN(INITIAL); current_file->lineno++; return T_EOL;
        YY_BREAK
-case 42:
+case 49:
 YY_RULE_SETUP
-#line 138 "zconf.l"
 /* ignore */
        YY_BREAK
-case 43:
+case 50:
 YY_RULE_SETUP
-#line 139 "zconf.l"
 {
-               alloc_string(yytext, yyleng);
+               alloc_string(zconftext, zconfleng);
                zconflval.string = text;
                return T_WORD;
        }
        YY_BREAK
-case 44:
+case 51:
+YY_RULE_SETUP
+/* comment */
+       YY_BREAK
+case 52:
+/* rule 52 can match eol */
+YY_RULE_SETUP
+current_file->lineno++;
+       YY_BREAK
+case 53:
 YY_RULE_SETUP
-#line 144 "zconf.l"
 
        YY_BREAK
 case YY_STATE_EOF(PARAM):
-#line 145 "zconf.l"
 {
                BEGIN(INITIAL);
        }
        YY_BREAK
 
-
-case 45:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp -= 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
+case 54:
+/* rule 54 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
-#line 151 "zconf.l"
 {
-               append_string(yytext, yyleng);
+               append_string(zconftext, zconfleng);
                zconflval.string = text;
-               return T_STRING;
+               return T_WORD_QUOTE;
        }
        YY_BREAK
-case 46:
+case 55:
 YY_RULE_SETUP
-#line 156 "zconf.l"
 {
-               append_string(yytext, yyleng);
+               append_string(zconftext, zconfleng);
        }
        YY_BREAK
-case 47:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp -= 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
+case 56:
+/* rule 56 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
-#line 159 "zconf.l"
 {
-               append_string(yytext+1, yyleng);
+               append_string(zconftext + 1, zconfleng - 1);
                zconflval.string = text;
-               return T_STRING;
+               return T_WORD_QUOTE;
        }
        YY_BREAK
-case 48:
+case 57:
 YY_RULE_SETUP
-#line 164 "zconf.l"
 {
-               append_string(yytext+1, yyleng);
+               append_string(zconftext + 1, zconfleng - 1);
        }
        YY_BREAK
-case 49:
+case 58:
 YY_RULE_SETUP
-#line 167 "zconf.l"
 {
-               if (str == yytext[0]) {
+               if (str == zconftext[0]) {
                        BEGIN(PARAM);
                        zconflval.string = text;
-                       return T_STRING;
+                       return T_WORD_QUOTE;
                } else
-                       append_string(yytext, 1);
+                       append_string(zconftext, 1);
        }
        YY_BREAK
-case 50:
+case 59:
+/* rule 59 can match eol */
 YY_RULE_SETUP
-#line 175 "zconf.l"
 {
                printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+               current_file->lineno++;
                BEGIN(INITIAL);
                return T_EOL;
        }
        YY_BREAK
 case YY_STATE_EOF(STRING):
-#line 180 "zconf.l"
 {
                BEGIN(INITIAL);
        }
        YY_BREAK
 
-
-case 51:
+case 60:
 YY_RULE_SETUP
-#line 186 "zconf.l"
 {
                ts = 0;
-               for (i = 0; i < yyleng; i++) {
-                       if (yytext[i] == '\t')
+               for (i = 0; i < zconfleng; i++) {
+                       if (zconftext[i] == '\t')
                                ts = (ts & ~7) + 8;
                        else
                                ts++;
@@ -2262,40 +2580,37 @@ YY_RULE_SETUP
                        }
                        append_string("        ", ts);
                }
-               
        }
        YY_BREAK
-case 52:
-*yy_cp = yy_hold_char; /* undo effects of setting up yytext */
-yy_c_buf_p = yy_cp = yy_bp + 1;
-YY_DO_BEFORE_ACTION; /* set up yytext again */
+case 61:
+/* rule 61 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up zconftext */
+(yy_c_buf_p) = yy_cp -= 1;
+YY_DO_BEFORE_ACTION; /* set up zconftext again */
 YY_RULE_SETUP
-#line 209 "zconf.l"
 {
                current_file->lineno++;
                zconf_endhelp();
                return T_HELPTEXT;
        }
        YY_BREAK
-case 53:
+case 62:
+/* rule 62 can match eol */
 YY_RULE_SETUP
-#line 214 "zconf.l"
 {
                current_file->lineno++;
                append_string("\n", 1);
        }
        YY_BREAK
-case 54:
+case 63:
 YY_RULE_SETUP
-#line 218 "zconf.l"
 {
-               append_string(yytext, yyleng);
+               append_string(zconftext, zconfleng);
                if (!first_ts)
                        first_ts = last_ts;
        }
        YY_BREAK
 case YY_STATE_EOF(HELP):
-#line 223 "zconf.l"
 {
                zconf_endhelp();
                return T_HELPTEXT;
@@ -2304,46 +2619,43 @@ case YY_STATE_EOF(HELP):
 
 case YY_STATE_EOF(INITIAL):
 case YY_STATE_EOF(COMMAND):
-#line 229 "zconf.l"
 {
        if (current_buf) {
                zconf_endfile();
                return T_EOF;
        }
-       fclose(yyin);
+       fclose(zconfin);
        yyterminate();
 }
        YY_BREAK
-case 55:
+case 64:
 YY_RULE_SETUP
-#line 238 "zconf.l"
 YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
-#line 2323 "lex.zconf.c"
 
        case YY_END_OF_BUFFER:
                {
                /* Amount of text matched not including the EOB char. */
-               int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+               int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
 
                /* Undo the effects of YY_DO_BEFORE_ACTION. */
-               *yy_cp = yy_hold_char;
+               *yy_cp = (yy_hold_char);
                YY_RESTORE_YY_MORE_OFFSET
 
-               if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+               if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
                        {
                        /* We're scanning a new file or input source.  It's
                         * possible that this happened because the user
-                        * just pointed yyin at a new source and called
-                        * yylex().  If so, then we have to assure
-                        * consistency between yy_current_buffer and our
+                        * just pointed zconfin at a new source and called
+                        * zconflex().  If so, then we have to assure
+                        * consistency between YY_CURRENT_BUFFER and our
                         * globals.  Here is the right place to do so, because
                         * this is the first action (other than possibly a
                         * back-up) that will match for the new input source.
                         */
-                       yy_n_chars = yy_current_buffer->yy_n_chars;
-                       yy_current_buffer->yy_input_file = yyin;
-                       yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+                       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+                       YY_CURRENT_BUFFER_LVALUE->yy_input_file = zconfin;
+                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
                        }
 
                /* Note that here we test for yy_c_buf_p "<=" to the position
@@ -2353,13 +2665,13 @@ YY_FATAL_ERROR( "flex scanner jammed" );
                 * end-of-buffer state).  Contrast this with the test
                 * in input().
                 */
-               if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+               if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
                        { /* This was really a NUL. */
                        yy_state_type yy_next_state;
 
-                       yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+                       (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
 
-                       yy_current_state = yy_get_previous_state();
+                       yy_current_state = yy_get_previous_state(  );
 
                        /* Okay, we're now positioned to make the NUL
                         * transition.  We couldn't have
@@ -2372,41 +2684,41 @@ YY_FATAL_ERROR( "flex scanner jammed" );
 
                        yy_next_state = yy_try_NUL_trans( yy_current_state );
 
-                       yy_bp = yytext_ptr + YY_MORE_ADJ;
+                       yy_bp = (yytext_ptr) + YY_MORE_ADJ;
 
                        if ( yy_next_state )
                                {
                                /* Consume the NUL. */
-                               yy_cp = ++yy_c_buf_p;
+                               yy_cp = ++(yy_c_buf_p);
                                yy_current_state = yy_next_state;
                                goto yy_match;
                                }
 
                        else
                                {
-                               yy_cp = yy_c_buf_p;
+                               yy_cp = (yy_c_buf_p);
                                goto yy_find_action;
                                }
                        }
 
-               else switch ( yy_get_next_buffer() )
+               else switch ( yy_get_next_buffer(  ) )
                        {
                        case EOB_ACT_END_OF_FILE:
                                {
-                               yy_did_buffer_switch_on_eof = 0;
+                               (yy_did_buffer_switch_on_eof) = 0;
 
-                               if ( yywrap() )
+                               if ( zconfwrap( ) )
                                        {
                                        /* Note: because we've taken care in
                                         * yy_get_next_buffer() to have set up
-                                        * yytext, we can now set up
+                                        * zconftext, we can now set up
                                         * yy_c_buf_p so that if some total
                                         * hoser (like flex itself) wants to
                                         * call the scanner after we return the
                                         * YY_NULL, it'll still work - another
                                         * YY_NULL will get returned.
                                         */
-                                       yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+                                       (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
 
                                        yy_act = YY_STATE_EOF(YY_START);
                                        goto do_action;
@@ -2414,30 +2726,30 @@ YY_FATAL_ERROR( "flex scanner jammed" );
 
                                else
                                        {
-                                       if ( ! yy_did_buffer_switch_on_eof )
+                                       if ( ! (yy_did_buffer_switch_on_eof) )
                                                YY_NEW_FILE;
                                        }
                                break;
                                }
 
                        case EOB_ACT_CONTINUE_SCAN:
-                               yy_c_buf_p =
-                                       yytext_ptr + yy_amount_of_matched_text;
+                               (yy_c_buf_p) =
+                                       (yytext_ptr) + yy_amount_of_matched_text;
 
-                               yy_current_state = yy_get_previous_state();
+                               yy_current_state = yy_get_previous_state(  );
 
-                               yy_cp = yy_c_buf_p;
-                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               yy_cp = (yy_c_buf_p);
+                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
                                goto yy_match;
 
                        case EOB_ACT_LAST_MATCH:
-                               yy_c_buf_p =
-                               &yy_current_buffer->yy_ch_buf[yy_n_chars];
+                               (yy_c_buf_p) =
+                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
 
-                               yy_current_state = yy_get_previous_state();
+                               yy_current_state = yy_get_previous_state(  );
 
-                               yy_cp = yy_c_buf_p;
-                               yy_bp = yytext_ptr + YY_MORE_ADJ;
+                               yy_cp = (yy_c_buf_p);
+                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
                                goto yy_find_action;
                        }
                break;
@@ -2448,8 +2760,7 @@ YY_FATAL_ERROR( "flex scanner jammed" );
                        "fatal flex scanner internal error--no action found" );
        } /* end of action switch */
                } /* end of scanning one token */
-       } /* end of yylex */
-
+} /* end of zconflex */
 
 /* yy_get_next_buffer - try to read in a new buffer
  *
@@ -2458,21 +2769,20 @@ YY_FATAL_ERROR( "flex scanner jammed" );
  *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
  *     EOB_ACT_END_OF_FILE - end of file
  */
-
-static int yy_get_next_buffer()
-       {
-       register char *dest = yy_current_buffer->yy_ch_buf;
-       register char *source = yytext_ptr;
+static int yy_get_next_buffer (void)
+{
+       register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+       register char *source = (yytext_ptr);
        register int number_to_move, i;
        int ret_val;
 
-       if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+       if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
                YY_FATAL_ERROR(
                "fatal flex scanner internal error--end of buffer missed" );
 
-       if ( yy_current_buffer->yy_fill_buffer == 0 )
+       if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
                { /* Don't try to fill the buffer, so this is an EOF. */
-               if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+               if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
                        {
                        /* We matched a single character, the EOB, so
                         * treat this as a final EOF.
@@ -2492,34 +2802,30 @@ static int yy_get_next_buffer()
        /* Try to read more data. */
 
        /* First move last chars to start of buffer. */
-       number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+       number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1;
 
        for ( i = 0; i < number_to_move; ++i )
                *(dest++) = *(source++);
 
-       if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+       if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
                /* don't do the read, it's not guaranteed to return an EOF,
                 * just force an EOF
                 */
-               yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
 
        else
                {
-               int num_to_read =
-                       yy_current_buffer->yy_buf_size - number_to_move - 1;
+                       size_t num_to_read =
+                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
 
                while ( num_to_read <= 0 )
                        { /* Not enough room in the buffer - grow it. */
-#ifdef YY_USES_REJECT
-                       YY_FATAL_ERROR(
-"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
-#else
 
                        /* just a shorter name for the current buffer */
-                       YY_BUFFER_STATE b = yy_current_buffer;
+                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER;
 
                        int yy_c_buf_p_offset =
-                               (int) (yy_c_buf_p - b->yy_ch_buf);
+                               (int) ((yy_c_buf_p) - b->yy_ch_buf);
 
                        if ( b->yy_is_our_buffer )
                                {
@@ -2532,8 +2838,7 @@ static int yy_get_next_buffer()
 
                                b->yy_ch_buf = (char *)
                                        /* Include room in for 2 EOB chars. */
-                                       yy_flex_realloc( (void *) b->yy_ch_buf,
-                                                        b->yy_buf_size + 2 );
+                                       zconfrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2  );
                                }
                        else
                                /* Can't grow it, we don't own it. */
@@ -2543,35 +2848,35 @@ static int yy_get_next_buffer()
                                YY_FATAL_ERROR(
                                "fatal error - scanner input buffer overflow" );
 
-                       yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+                       (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
 
-                       num_to_read = yy_current_buffer->yy_buf_size -
+                       num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
                                                number_to_move - 1;
-#endif
+
                        }
 
                if ( num_to_read > YY_READ_BUF_SIZE )
                        num_to_read = YY_READ_BUF_SIZE;
 
                /* Read in more data. */
-               YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
-                       yy_n_chars, num_to_read );
+               YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+                       (yy_n_chars), num_to_read );
 
-               yy_current_buffer->yy_n_chars = yy_n_chars;
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
                }
 
-       if ( yy_n_chars == 0 )
+       if ( (yy_n_chars) == 0 )
                {
                if ( number_to_move == YY_MORE_ADJ )
                        {
                        ret_val = EOB_ACT_END_OF_FILE;
-                       yyrestart( yyin );
+                       zconfrestart(zconfin  );
                        }
 
                else
                        {
                        ret_val = EOB_ACT_LAST_MATCH;
-                       yy_current_buffer->yy_buffer_status =
+                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
                                YY_BUFFER_EOF_PENDING;
                        }
                }
@@ -2579,127 +2884,112 @@ static int yy_get_next_buffer()
        else
                ret_val = EOB_ACT_CONTINUE_SCAN;
 
-       yy_n_chars += number_to_move;
-       yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
-       yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+       (yy_n_chars) += number_to_move;
+       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
 
-       yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+       (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
 
        return ret_val;
-       }
-
+}
 
 /* yy_get_previous_state - get the state just before the EOB char was reached */
 
-static yy_state_type yy_get_previous_state()
-       {
+    static yy_state_type yy_get_previous_state (void)
+{
        register yy_state_type yy_current_state;
        register char *yy_cp;
+    
+       yy_current_state = (yy_start);
 
-       yy_current_state = yy_start;
-
-       for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+       for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
                {
                yy_current_state = yy_nxt[yy_current_state][(*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1)];
                }
 
        return yy_current_state;
-       }
-
+}
 
 /* yy_try_NUL_trans - try to make a transition on the NUL character
  *
  * synopsis
  *     next_state = yy_try_NUL_trans( current_state );
  */
-
-#ifdef YY_USE_PROTOS
-static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
-#else
-static yy_state_type yy_try_NUL_trans( yy_current_state )
-yy_state_type yy_current_state;
-#endif
-       {
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
        register int yy_is_jam;
-
+    
        yy_current_state = yy_nxt[yy_current_state][1];
        yy_is_jam = (yy_current_state <= 0);
 
        return yy_is_jam ? 0 : yy_current_state;
-       }
-
+}
 
-#ifndef YY_NO_UNPUT
-#ifdef YY_USE_PROTOS
-static void yyunput( int c, register char *yy_bp )
-#else
-static void yyunput( c, yy_bp )
-int c;
-register char *yy_bp;
-#endif
-       {
-       register char *yy_cp = yy_c_buf_p;
+    static void yyunput (int c, register char * yy_bp )
+{
+       register char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
 
-       /* undo effects of setting up yytext */
-       *yy_cp = yy_hold_char;
+       /* undo effects of setting up zconftext */
+       *yy_cp = (yy_hold_char);
 
-       if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+       if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
                { /* need to shift things up to make room */
                /* +2 for EOB chars. */
-               register int number_to_move = yy_n_chars + 2;
-               register char *dest = &yy_current_buffer->yy_ch_buf[
-                                       yy_current_buffer->yy_buf_size + 2];
+               register int number_to_move = (yy_n_chars) + 2;
+               register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+                                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
                register char *source =
-                               &yy_current_buffer->yy_ch_buf[number_to_move];
+                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
 
-               while ( source > yy_current_buffer->yy_ch_buf )
+               while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
                        *--dest = *--source;
 
                yy_cp += (int) (dest - source);
                yy_bp += (int) (dest - source);
-               yy_current_buffer->yy_n_chars =
-                       yy_n_chars = yy_current_buffer->yy_buf_size;
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+                       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
 
-               if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+               if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
                        YY_FATAL_ERROR( "flex scanner push-back overflow" );
                }
 
        *--yy_cp = (char) c;
 
+       (yytext_ptr) = yy_bp;
+       (yy_hold_char) = *yy_cp;
+       (yy_c_buf_p) = yy_cp;
+}
 
-       yytext_ptr = yy_bp;
-       yy_hold_char = *yy_cp;
-       yy_c_buf_p = yy_cp;
-       }
-#endif /* ifndef YY_NO_UNPUT */
-
-
+#ifndef YY_NO_INPUT
 #ifdef __cplusplus
-static int yyinput()
+    static int yyinput (void)
 #else
-static int input()
+    static int input  (void)
 #endif
-       {
-       int c;
 
-       *yy_c_buf_p = yy_hold_char;
+{
+       int c;
+    
+       *(yy_c_buf_p) = (yy_hold_char);
 
-       if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+       if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
                {
                /* yy_c_buf_p now points to the character we want to return.
                 * If this occurs *before* the EOB characters, then it's a
                 * valid NUL; if not, then we've hit the end of the buffer.
                 */
-               if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+               if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
                        /* This was really a NUL. */
-                       *yy_c_buf_p = '\0';
+                       *(yy_c_buf_p) = '\0';
 
                else
                        { /* need more input */
-                       int offset = yy_c_buf_p - yytext_ptr;
-                       ++yy_c_buf_p;
+                       int offset = (yy_c_buf_p) - (yytext_ptr);
+                       ++(yy_c_buf_p);
 
-                       switch ( yy_get_next_buffer() )
+                       switch ( yy_get_next_buffer(  ) )
                                {
                                case EOB_ACT_LAST_MATCH:
                                        /* This happens because yy_g_n_b()
@@ -2713,16 +3003,16 @@ static int input()
                                         */
 
                                        /* Reset buffer status. */
-                                       yyrestart( yyin );
+                                       zconfrestart(zconfin );
 
-                                       /* fall through */
+                                       /*FALLTHROUGH*/
 
                                case EOB_ACT_END_OF_FILE:
                                        {
-                                       if ( yywrap() )
+                                       if ( zconfwrap( ) )
                                                return EOF;
 
-                                       if ( ! yy_did_buffer_switch_on_eof )
+                                       if ( ! (yy_did_buffer_switch_on_eof) )
                                                YY_NEW_FILE;
 #ifdef __cplusplus
                                        return yyinput();
@@ -2732,176 +3022,165 @@ static int input()
                                        }
 
                                case EOB_ACT_CONTINUE_SCAN:
-                                       yy_c_buf_p = yytext_ptr + offset;
+                                       (yy_c_buf_p) = (yytext_ptr) + offset;
                                        break;
                                }
                        }
                }
 
-       c = *(unsigned char *) yy_c_buf_p;      /* cast for 8-bit char's */
-       *yy_c_buf_p = '\0';     /* preserve yytext */
-       yy_hold_char = *++yy_c_buf_p;
-
+       c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
+       *(yy_c_buf_p) = '\0';   /* preserve zconftext */
+       (yy_hold_char) = *++(yy_c_buf_p);
 
        return c;
-       }
-
-
-#ifdef YY_USE_PROTOS
-void yyrestart( FILE *input_file )
-#else
-void yyrestart( input_file )
-FILE *input_file;
-#endif
-       {
-       if ( ! yy_current_buffer )
-               yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+}
+#endif /* ifndef YY_NO_INPUT */
 
-       yy_init_buffer( yy_current_buffer, input_file );
-       yy_load_buffer_state();
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void zconfrestart  (FILE * input_file )
+{
+    
+       if ( ! YY_CURRENT_BUFFER ){
+        zconfensure_buffer_stack ();
+               YY_CURRENT_BUFFER_LVALUE =
+            zconf_create_buffer(zconfin,YY_BUF_SIZE );
        }
 
+       zconf_init_buffer(YY_CURRENT_BUFFER,input_file );
+       zconf_load_buffer_state( );
+}
 
-#ifdef YY_USE_PROTOS
-void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
-#else
-void yy_switch_to_buffer( new_buffer )
-YY_BUFFER_STATE new_buffer;
-#endif
-       {
-       if ( yy_current_buffer == new_buffer )
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void zconf_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+       /* TODO. We should be able to replace this entire function body
+        * with
+        *              zconfpop_buffer_state();
+        *              zconfpush_buffer_state(new_buffer);
+     */
+       zconfensure_buffer_stack ();
+       if ( YY_CURRENT_BUFFER == new_buffer )
                return;
 
-       if ( yy_current_buffer )
+       if ( YY_CURRENT_BUFFER )
                {
                /* Flush out information for old buffer. */
-               *yy_c_buf_p = yy_hold_char;
-               yy_current_buffer->yy_buf_pos = yy_c_buf_p;
-               yy_current_buffer->yy_n_chars = yy_n_chars;
+               *(yy_c_buf_p) = (yy_hold_char);
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
                }
 
-       yy_current_buffer = new_buffer;
-       yy_load_buffer_state();
+       YY_CURRENT_BUFFER_LVALUE = new_buffer;
+       zconf_load_buffer_state( );
 
        /* We don't actually know whether we did this switch during
-        * EOF (yywrap()) processing, but the only time this flag
-        * is looked at is after yywrap() is called, so it's safe
+        * EOF (zconfwrap()) processing, but the only time this flag
+        * is looked at is after zconfwrap() is called, so it's safe
         * to go ahead and always set it.
         */
-       yy_did_buffer_switch_on_eof = 1;
-       }
-
-
-#ifdef YY_USE_PROTOS
-void yy_load_buffer_state( void )
-#else
-void yy_load_buffer_state()
-#endif
-       {
-       yy_n_chars = yy_current_buffer->yy_n_chars;
-       yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
-       yyin = yy_current_buffer->yy_input_file;
-       yy_hold_char = *yy_c_buf_p;
-       }
+       (yy_did_buffer_switch_on_eof) = 1;
+}
 
+static void zconf_load_buffer_state  (void)
+{
+       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+       (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+       zconfin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+       (yy_hold_char) = *(yy_c_buf_p);
+}
 
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
-#else
-YY_BUFFER_STATE yy_create_buffer( file, size )
-FILE *file;
-int size;
-#endif
-       {
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE zconf_create_buffer  (FILE * file, int  size )
+{
        YY_BUFFER_STATE b;
-
-       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+    
+       b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
        if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
 
        b->yy_buf_size = size;
 
        /* yy_ch_buf has to be 2 characters longer than the size given because
         * we need to put in 2 end-of-buffer characters.
         */
-       b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+       b->yy_ch_buf = (char *) zconfalloc(b->yy_buf_size + 2  );
        if ( ! b->yy_ch_buf )
-               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in zconf_create_buffer()" );
 
        b->yy_is_our_buffer = 1;
 
-       yy_init_buffer( b, file );
+       zconf_init_buffer(b,file );
 
        return b;
-       }
-
+}
 
-#ifdef YY_USE_PROTOS
-void yy_delete_buffer( YY_BUFFER_STATE b )
-#else
-void yy_delete_buffer( b )
-YY_BUFFER_STATE b;
-#endif
-       {
+/** Destroy the buffer.
+ * @param b a buffer created with zconf_create_buffer()
+ * 
+ */
+    void zconf_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
        if ( ! b )
                return;
 
-       if ( b == yy_current_buffer )
-               yy_current_buffer = (YY_BUFFER_STATE) 0;
+       if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+               YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
 
        if ( b->yy_is_our_buffer )
-               yy_flex_free( (void *) b->yy_ch_buf );
-
-       yy_flex_free( (void *) b );
-       }
-
-
-#ifndef _WIN32
-#include <unistd.h>
-#else
-#ifndef YY_ALWAYS_INTERACTIVE
-#ifndef YY_NEVER_INTERACTIVE
-extern int isatty YY_PROTO(( int ));
-#endif
-#endif
-#endif
+               zconffree((void *) b->yy_ch_buf  );
 
-#ifdef YY_USE_PROTOS
-void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
-#else
-void yy_init_buffer( b, file )
-YY_BUFFER_STATE b;
-FILE *file;
-#endif
+       zconffree((void *) b  );
+}
 
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a zconfrestart() or at EOF.
+ */
+    static void zconf_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
 
-       {
-       yy_flush_buffer( b );
+{
+       int oerrno = errno;
+    
+       zconf_flush_buffer(b );
 
        b->yy_input_file = file;
        b->yy_fill_buffer = 1;
 
-#if YY_ALWAYS_INTERACTIVE
-       b->yy_is_interactive = 1;
-#else
-#if YY_NEVER_INTERACTIVE
-       b->yy_is_interactive = 0;
-#else
-       b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
-#endif
-#endif
-       }
-
-
-#ifdef YY_USE_PROTOS
-void yy_flush_buffer( YY_BUFFER_STATE b )
-#else
-void yy_flush_buffer( b )
-YY_BUFFER_STATE b;
-#endif
+    /* If b is the current buffer, then zconf_init_buffer was _probably_
+     * called from zconfrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = 0;
+    
+       errno = oerrno;
+}
 
-       {
-       if ( ! b )
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void zconf_flush_buffer (YY_BUFFER_STATE  b )
+{
+       if ( ! b )
                return;
 
        b->yy_n_chars = 0;
@@ -2918,31 +3197,123 @@ YY_BUFFER_STATE b;
        b->yy_at_bol = 1;
        b->yy_buffer_status = YY_BUFFER_NEW;
 
-       if ( b == yy_current_buffer )
-               yy_load_buffer_state();
+       if ( b == YY_CURRENT_BUFFER )
+               zconf_load_buffer_state( );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void zconfpush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+       if (new_buffer == NULL)
+               return;
+
+       zconfensure_buffer_stack();
+
+       /* This block is copied from zconf_switch_to_buffer. */
+       if ( YY_CURRENT_BUFFER )
+               {
+               /* Flush out information for old buffer. */
+               *(yy_c_buf_p) = (yy_hold_char);
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+               }
+
+       /* Only push if top exists. Otherwise, replace top. */
+       if (YY_CURRENT_BUFFER)
+               (yy_buffer_stack_top)++;
+       YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+       /* copied from zconf_switch_to_buffer. */
+       zconf_load_buffer_state( );
+       (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void zconfpop_buffer_state (void)
+{
+       if (!YY_CURRENT_BUFFER)
+               return;
+
+       zconf_delete_buffer(YY_CURRENT_BUFFER );
+       YY_CURRENT_BUFFER_LVALUE = NULL;
+       if ((yy_buffer_stack_top) > 0)
+               --(yy_buffer_stack_top);
+
+       if (YY_CURRENT_BUFFER) {
+               zconf_load_buffer_state( );
+               (yy_did_buffer_switch_on_eof) = 1;
+       }
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void zconfensure_buffer_stack (void)
+{
+       int num_to_alloc;
+    
+       if (!(yy_buffer_stack)) {
+
+               /* First allocation is just for 2 elements, since we don't know if this
+                * scanner will even need a stack. We use 2 instead of 1 to avoid an
+                * immediate realloc on the next call.
+         */
+               num_to_alloc = 1;
+               (yy_buffer_stack) = (struct yy_buffer_state**)zconfalloc
+                                                               (num_to_alloc * sizeof(struct yy_buffer_state*)
+                                                               );
+               
+               memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+                               
+               (yy_buffer_stack_max) = num_to_alloc;
+               (yy_buffer_stack_top) = 0;
+               return;
        }
 
+       if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
 
-#ifndef YY_NO_SCAN_BUFFER
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
-#else
-YY_BUFFER_STATE yy_scan_buffer( base, size )
-char *base;
-yy_size_t size;
-#endif
-       {
-       YY_BUFFER_STATE b;
+               /* Increase the buffer to prepare for a possible push. */
+               int grow_size = 8 /* arbitrary grow size */;
+
+               num_to_alloc = (yy_buffer_stack_max) + grow_size;
+               (yy_buffer_stack) = (struct yy_buffer_state**)zconfrealloc
+                                                               ((yy_buffer_stack),
+                                                               num_to_alloc * sizeof(struct yy_buffer_state*)
+                                                               );
+
+               /* zero only the new slots.*/
+               memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+               (yy_buffer_stack_max) = num_to_alloc;
+       }
+}
 
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object. 
+ */
+YY_BUFFER_STATE zconf_scan_buffer  (char * base, yy_size_t  size )
+{
+       YY_BUFFER_STATE b;
+    
        if ( size < 2 ||
             base[size-2] != YY_END_OF_BUFFER_CHAR ||
             base[size-1] != YY_END_OF_BUFFER_CHAR )
                /* They forgot to leave room for the EOB's. */
                return 0;
 
-       b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+       b = (YY_BUFFER_STATE) zconfalloc(sizeof( struct yy_buffer_state )  );
        if ( ! b )
-               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+               YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_buffer()" );
 
        b->yy_buf_size = size - 2;      /* "- 2" to take care of EOB's */
        b->yy_buf_pos = b->yy_ch_buf = base;
@@ -2954,58 +3325,53 @@ yy_size_t size;
        b->yy_fill_buffer = 0;
        b->yy_buffer_status = YY_BUFFER_NEW;
 
-       yy_switch_to_buffer( b );
+       zconf_switch_to_buffer(b  );
 
        return b;
-       }
-#endif
-
-
-#ifndef YY_NO_SCAN_STRING
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
-#else
-YY_BUFFER_STATE yy_scan_string( yy_str )
-yyconst char *yy_str;
-#endif
-       {
-       int len;
-       for ( len = 0; yy_str[len]; ++len )
-               ;
-
-       return yy_scan_bytes( yy_str, len );
-       }
-#endif
+}
 
+/** Setup the input buffer state to scan a string. The next call to zconflex() will
+ * scan from a @e copy of @a str.
+ * @param str a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       zconf_scan_bytes() instead.
+ */
+YY_BUFFER_STATE zconf_scan_string (yyconst char * str )
+{
+    
+       return zconf_scan_bytes(str,strlen(str) );
+}
 
-#ifndef YY_NO_SCAN_BYTES
-#ifdef YY_USE_PROTOS
-YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
-#else
-YY_BUFFER_STATE yy_scan_bytes( bytes, len )
-yyconst char *bytes;
-int len;
-#endif
-       {
+/** Setup the input buffer state to scan the given bytes. The next call to zconflex() will
+ * scan from a @e copy of @a bytes.
+ * @param bytes the byte buffer to scan
+ * @param len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE zconf_scan_bytes  (yyconst char * bytes, int  len )
+{
        YY_BUFFER_STATE b;
        char *buf;
        yy_size_t n;
        int i;
-
+    
        /* Get memory for full buffer, including space for trailing EOB's. */
        n = len + 2;
-       buf = (char *) yy_flex_alloc( n );
+       buf = (char *) zconfalloc(n  );
        if ( ! buf )
-               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+               YY_FATAL_ERROR( "out of dynamic memory in zconf_scan_bytes()" );
 
        for ( i = 0; i < len; ++i )
                buf[i] = bytes[i];
 
        buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
 
-       b = yy_scan_buffer( buf, n );
+       b = zconf_scan_buffer(buf,n );
        if ( ! b )
-               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+               YY_FATAL_ERROR( "bad buffer in zconf_scan_bytes()" );
 
        /* It's okay to grow etc. this buffer, and we should throw it
         * away when we're done.
@@ -3013,148 +3379,164 @@ int len;
        b->yy_is_our_buffer = 1;
 
        return b;
-       }
-#endif
-
+}
 
-#ifndef YY_NO_PUSH_STATE
-#ifdef YY_USE_PROTOS
-static void yy_push_state( int new_state )
-#else
-static void yy_push_state( new_state )
-int new_state;
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
 #endif
-       {
-       if ( yy_start_stack_ptr >= yy_start_stack_depth )
-               {
-               yy_size_t new_size;
 
-               yy_start_stack_depth += YY_START_STACK_INCR;
-               new_size = yy_start_stack_depth * sizeof( int );
+static void yy_fatal_error (yyconst char* msg )
+{
+       (void) fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+}
 
-               if ( ! yy_start_stack )
-                       yy_start_stack = (int *) yy_flex_alloc( new_size );
+/* Redefine yyless() so it works in section 3 code. */
 
-               else
-                       yy_start_stack = (int *) yy_flex_realloc(
-                                       (void *) yy_start_stack, new_size );
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up zconftext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+               zconftext[zconfleng] = (yy_hold_char); \
+               (yy_c_buf_p) = zconftext + yyless_macro_arg; \
+               (yy_hold_char) = *(yy_c_buf_p); \
+               *(yy_c_buf_p) = '\0'; \
+               zconfleng = yyless_macro_arg; \
+               } \
+       while ( 0 )
 
-               if ( ! yy_start_stack )
-                       YY_FATAL_ERROR(
-                       "out of memory expanding start-condition stack" );
-               }
+/* Accessor  methods (get/set functions) to struct members. */
 
-       yy_start_stack[yy_start_stack_ptr++] = YY_START;
+/** Get the current line number.
+ * 
+ */
+int zconfget_lineno  (void)
+{
+        
+    return zconflineno;
+}
 
-       BEGIN(new_state);
-       }
-#endif
+/** Get the input stream.
+ * 
+ */
+FILE *zconfget_in  (void)
+{
+        return zconfin;
+}
 
+/** Get the output stream.
+ * 
+ */
+FILE *zconfget_out  (void)
+{
+        return zconfout;
+}
 
-#ifndef YY_NO_POP_STATE
-static void yy_pop_state()
-       {
-       if ( --yy_start_stack_ptr < 0 )
-               YY_FATAL_ERROR( "start-condition stack underflow" );
+/** Get the length of the current token.
+ * 
+ */
+int zconfget_leng  (void)
+{
+        return zconfleng;
+}
 
-       BEGIN(yy_start_stack[yy_start_stack_ptr]);
-       }
-#endif
+/** Get the current token.
+ * 
+ */
 
+char *zconfget_text  (void)
+{
+        return zconftext;
+}
 
-#ifndef YY_NO_TOP_STATE
-static int yy_top_state()
-       {
-       return yy_start_stack[yy_start_stack_ptr - 1];
-       }
-#endif
+/** Set the current line number.
+ * @param line_number
+ * 
+ */
+void zconfset_lineno (int  line_number )
+{
+    
+    zconflineno = line_number;
+}
 
-#ifndef YY_EXIT_FAILURE
-#define YY_EXIT_FAILURE 2
-#endif
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param in_str A readable stream.
+ * 
+ * @see zconf_switch_to_buffer
+ */
+void zconfset_in (FILE *  in_str )
+{
+        zconfin = in_str ;
+}
 
-#ifdef YY_USE_PROTOS
-static void yy_fatal_error( yyconst char msg[] )
-#else
-static void yy_fatal_error( msg )
-char msg[];
-#endif
-       {
-       (void) fprintf( stderr, "%s\n", msg );
-       exit( YY_EXIT_FAILURE );
-       }
+void zconfset_out (FILE *  out_str )
+{
+        zconfout = out_str ;
+}
 
+int zconfget_debug  (void)
+{
+        return zconf_flex_debug;
+}
 
+void zconfset_debug (int  bdebug )
+{
+        zconf_flex_debug = bdebug ;
+}
 
-/* Redefine yyless() so it works in section 3 code. */
+/* zconflex_destroy is for both reentrant and non-reentrant scanners. */
+int zconflex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+       while(YY_CURRENT_BUFFER){
+               zconf_delete_buffer(YY_CURRENT_BUFFER  );
+               YY_CURRENT_BUFFER_LVALUE = NULL;
+               zconfpop_buffer_state();
+       }
 
-#undef yyless
-#define yyless(n) \
-       do \
-               { \
-               /* Undo effects of setting up yytext. */ \
-               yytext[yyleng] = yy_hold_char; \
-               yy_c_buf_p = yytext + n; \
-               yy_hold_char = *yy_c_buf_p; \
-               *yy_c_buf_p = '\0'; \
-               yyleng = n; \
-               } \
-       while ( 0 )
+       /* Destroy the stack itself. */
+       zconffree((yy_buffer_stack) );
+       (yy_buffer_stack) = NULL;
 
+    return 0;
+}
 
-/* Internal utility routines. */
+/*
+ * Internal utility routines.
+ */
 
 #ifndef yytext_ptr
-#ifdef YY_USE_PROTOS
-static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
-#else
-static void yy_flex_strncpy( s1, s2, n )
-char *s1;
-yyconst char *s2;
-int n;
-#endif
-       {
+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n )
+{
        register int i;
-       for ( i = 0; i < n; ++i )
+       for ( i = 0; i < n; ++i )
                s1[i] = s2[i];
-       }
+}
 #endif
 
 #ifdef YY_NEED_STRLEN
-#ifdef YY_USE_PROTOS
-static int yy_flex_strlen( yyconst char *s )
-#else
-static int yy_flex_strlen( s )
-yyconst char *s;
-#endif
-       {
+static int yy_flex_strlen (yyconst char * s )
+{
        register int n;
-       for ( n = 0; s[n]; ++n )
+       for ( n = 0; s[n]; ++n )
                ;
 
        return n;
-       }
+}
 #endif
 
-
-#ifdef YY_USE_PROTOS
-static void *yy_flex_alloc( yy_size_t size )
-#else
-static void *yy_flex_alloc( size )
-yy_size_t size;
-#endif
-       {
+void *zconfalloc (yy_size_t  size )
+{
        return (void *) malloc( size );
-       }
+}
 
-#ifdef YY_USE_PROTOS
-static void *yy_flex_realloc( void *ptr, yy_size_t size )
-#else
-static void *yy_flex_realloc( ptr, size )
-void *ptr;
-yy_size_t size;
-#endif
-       {
+void *zconfrealloc  (void * ptr, yy_size_t  size )
+{
        /* The cast to (char *) in the following accommodates both
         * implementations that use char* generic pointers, and those
         * that use void* generic pointers.  It works with the latter
@@ -3163,26 +3545,27 @@ yy_size_t size;
         * as though doing an assignment.
         */
        return (void *) realloc( (char *) ptr, size );
-       }
+}
 
-#ifdef YY_USE_PROTOS
-static void yy_flex_free( void *ptr )
-#else
-static void yy_flex_free( ptr )
-void *ptr;
-#endif
-       {
-       free( ptr );
-       }
+void zconffree (void * ptr )
+{
+       free( (char *) ptr );   /* see zconfrealloc() for (char *) cast */
+}
 
-#if YY_MAIN
-int main()
-       {
-       yylex();
-       return 0;
-       }
+#define YYTABLES_NAME "yytables"
+
+#undef YY_NEW_FILE
+#undef YY_FLUSH_BUFFER
+#undef yy_set_bol
+#undef yy_new_buffer
+#undef yy_set_interactive
+#undef yytext_ptr
+#undef YY_DO_BEFORE_ACTION
+
+#ifdef YY_DECL_IS_OURS
+#undef YY_DECL_IS_OURS
+#undef YY_DECL
 #endif
-#line 238 "zconf.l"
 
 void zconf_starthelp(void)
 {
@@ -3194,13 +3577,37 @@ void zconf_starthelp(void)
 static void zconf_endhelp(void)
 {
        zconflval.string = text;
-       BEGIN(INITIAL); 
+       BEGIN(INITIAL);
+}
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+       char *env, fullname[PATH_MAX+1];
+       FILE *f;
+
+       f = fopen(name, "r");
+       if (!f && name[0] != '/') {
+               env = getenv(SRCTREE);
+               if (env) {
+                       sprintf(fullname, "%s/%s", env, name);
+                       f = fopen(fullname, "r");
+               }
+       }
+       return f;
 }
 
 void zconf_initscan(const char *name)
 {
-       yyin = fopen(name, "r");
-       if (!yyin) {
+       zconfin = zconf_fopen(name);
+       if (!zconfin) {
                printf("can't find file %s\n", name);
                exit(1);
        }
@@ -3220,12 +3627,12 @@ void zconf_nextfile(const char *name)
        memset(buf, 0, sizeof(*buf));
 
        current_buf->state = YY_CURRENT_BUFFER;
-       yyin = fopen(name, "r");
-       if (!yyin) {
+       zconfin = zconf_fopen(name);
+       if (!zconfin) {
                printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
                exit(1);
        }
-       yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+       zconf_switch_to_buffer(zconf_create_buffer(zconfin,YY_BUF_SIZE));
        buf->parent = current_buf;
        current_buf = buf;
 
@@ -3253,9 +3660,9 @@ static struct buffer *zconf_endfile(void)
 
        parent = current_buf->parent;
        if (parent) {
-               fclose(yyin);
-               yy_delete_buffer(YY_CURRENT_BUFFER);
-               yy_switch_to_buffer(parent->state);
+               fclose(zconfin);
+               zconf_delete_buffer(YY_CURRENT_BUFFER);
+               zconf_switch_to_buffer(parent->state);
        }
        free(current_buf);
        current_buf = parent;
@@ -3266,7 +3673,7 @@ static struct buffer *zconf_endfile(void)
 int zconf_lineno(void)
 {
        if (current_buf)
-               return current_file->lineno;
+               return current_file->lineno - 1;
        else
                return 0;
 }
@@ -3278,3 +3685,4 @@ char *zconf_curname(void)
        else
                return "<none>";
 }
+
index 688945b..dd040f7 100644 (file)
@@ -21,12 +21,14 @@ extern "C" {
 #include "lkc_proto.h"
 #undef P
 
-void symbol_end(char *help);
+#define SRCTREE "srctree"
+
 int zconfparse(void);
 void zconfdump(FILE *out);
 
 extern int zconfdebug;
 void zconf_starthelp(void);
+FILE *zconf_fopen(const char *name);
 void zconf_initscan(const char *name);
 void zconf_nextfile(const char *name);
 int zconf_lineno(void);
@@ -47,9 +49,11 @@ void menu_add_menu(void);
 void menu_end_menu(void);
 void menu_add_entry(struct symbol *sym);
 void menu_end_entry(void);
-struct property *create_prop(enum prop_type type);
 void menu_add_dep(struct expr *dep);
-struct property *menu_add_prop(int token, char *prompt, struct symbol *def, struct expr *dep);
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep);
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep);
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
 void menu_finalize(struct menu *parent);
 void menu_set_type(int type);
 struct file *file_lookup(const char *name);
@@ -61,16 +65,20 @@ extern struct menu *current_menu;
 /* symbol.c */
 void sym_init(void);
 void sym_clear_all_valid(void);
+void sym_set_changed(struct symbol *sym);
+struct symbol *sym_check_deps(struct symbol *sym);
+struct property *prop_alloc(enum prop_type type, struct symbol *sym);
+struct symbol *prop_get_symbol(struct property *prop);
 
 static inline tristate sym_get_tristate_value(struct symbol *sym)
 {
-       return S_TRI(sym->curr);
+       return sym->curr.tri;
 }
 
 
 static inline struct symbol *sym_get_choice_value(struct symbol *sym)
 {
-       return (struct symbol *)S_VAL(sym->curr);
+       return (struct symbol *)sym->curr.val;
 }
 
 static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
@@ -95,7 +103,6 @@ static inline bool sym_is_optional(struct symbol *sym)
 
 static inline bool sym_has_value(struct symbol *sym)
 {
-       //return S_VAL(sym->def) != NULL;
        return sym->flags & SYMBOL_NEW ? false : true;
 }
 
index 47e9c6d..97c7917 100644 (file)
@@ -5,7 +5,7 @@ P(conf_read,int,(const char *name));
 P(conf_write,int,(const char *name));
 
 /* menu.c */
-extern struct menu rootmenu;
+P(rootmenu,struct menu,);
 
 P(menu_is_visible,bool,(struct menu *menu));
 P(menu_get_prompt,const char *,(struct menu *menu));
@@ -14,17 +14,18 @@ P(menu_get_parent_menu,struct menu *,(struct menu *menu));
 
 /* symbol.c */
 P(symbol_hash,struct symbol *,[SYMBOL_HASHSIZE]);
-extern int sym_change_count;
+P(sym_change_count,int,);
 
 P(sym_lookup,struct symbol *,(const char *name, int isconst));
 P(sym_find,struct symbol *,(const char *name));
-P(sym_type_name,const char *,(int type));
+P(sym_type_name,const char *,(enum symbol_type type));
 P(sym_calc_value,void,(struct symbol *sym));
-P(sym_get_type,int,(struct symbol *sym));
+P(sym_get_type,enum symbol_type,(struct symbol *sym));
 P(sym_tristate_within_range,bool,(struct symbol *sym,tristate tri));
 P(sym_set_tristate_value,bool,(struct symbol *sym,tristate tri));
 P(sym_toggle_tristate_value,tristate,(struct symbol *sym));
 P(sym_string_valid,bool,(struct symbol *sym, const char *newval));
+P(sym_string_within_range,bool,(struct symbol *sym, const char *str));
 P(sym_set_string_value,bool,(struct symbol *sym, const char *newval));
 P(sym_is_changable,bool,(struct symbol *sym));
 P(sym_get_choice_prop,struct property *,(struct symbol *sym));
index 571e39b..2193c73 100644 (file)
@@ -28,6 +28,7 @@
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
+static char menu_backtitle[128];
 static const char menu_instructions[] =
        "Arrow keys navigate the menu.  "
        "<Enter> selects submenus --->.  "
@@ -120,6 +121,7 @@ static void show_readme(void);
 static void init_wsize(void)
 {
        struct winsize ws;
+       char *env;
 
        if (ioctl(1, TIOCGWINSZ, &ws) == -1) {
                rows = 24;
@@ -127,6 +129,20 @@ static void init_wsize(void)
        } else {
                rows = ws.ws_row;
                cols = ws.ws_col;
+               if (!rows) {
+                       env = getenv("LINES");
+                       if (env)
+                               rows = atoi(env);
+                       if (!rows)
+                               rows = 24;
+               }
+               if (!cols) {
+                       env = getenv("COLUMNS");
+                       if (env)
+                               cols = atoi(env);
+                       if (!cols)
+                               cols = 80;
+               }
        }
 
        if (rows < 19 || cols < 80) {
@@ -226,9 +242,7 @@ static void build_conf(struct menu *menu)
                                                menu->data ? "-->" : "++>",
                                                indent + 1, ' ', prompt);
                                } else {
-                                       if (menu->parent != &rootmenu)
-                                               cprint_name("   %*c", indent + 1, ' ');
-                                       cprint_name("%s  --->", prompt);
+                                       cprint_name("   %*c%s  --->", indent + 1, ' ', prompt);
                                }
 
                                if (single_menu_mode && menu->data)
@@ -303,7 +317,10 @@ static void build_conf(struct menu *menu)
                        switch (type) {
                        case S_BOOLEAN:
                                cprint_tag("t%p", menu);
-                               cprint_name("[%c]", val == no ? ' ' : '*');
+                               if (sym_is_changable(sym))
+                                       cprint_name("[%c]", val == no ? ' ' : '*');
+                               else
+                                       cprint_name("---");
                                break;
                        case S_TRISTATE:
                                cprint_tag("t%p", menu);
@@ -312,7 +329,10 @@ static void build_conf(struct menu *menu)
                                case mod: ch = 'M'; break;
                                default:  ch = ' '; break;
                                }
-                               cprint_name("<%c>", ch);
+                               if (sym_is_changable(sym))
+                                       cprint_name("<%c>", ch);
+                               else
+                                       cprint_name("---");
                                break;
                        default:
                                cprint_tag("s%p", menu);
@@ -321,12 +341,18 @@ static void build_conf(struct menu *menu)
                                if (tmp < 0)
                                        tmp = 0;
                                cprint_name("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
-                                       sym_has_value(sym) ? "" : " (NEW)");
+                                       (sym_has_value(sym) || !sym_is_changable(sym)) ?
+                                       "" : " (NEW)");
                                goto conf_childs;
                        }
                }
                cprint_name("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
-                       sym_has_value(sym) ? "" : " (NEW)");
+                       (sym_has_value(sym) || !sym_is_changable(sym)) ?
+                       "" : " (NEW)");
+               if (menu->prompt->type == P_MENU) {
+                       cprint_name("  --->");
+                       return;
+               }
        }
 
 conf_childs:
@@ -390,13 +416,15 @@ static void conf(struct menu *menu)
                        switch (type) {
                        case 'm':
                                if (single_menu_mode)
-                                       submenu->data = (submenu->data)? NULL : (void *)1;
+                                       submenu->data = (void *) (long) !submenu->data;
                                else
                                        conf(submenu);
                                break;
                        case 't':
                                if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
                                        conf_choice(submenu);
+                               else if (submenu->prompt->type == P_MENU)
+                                       conf(submenu);
                                break;
                        case 's':
                                conf_string(submenu);
@@ -602,7 +630,6 @@ static void conf_cleanup(void)
 {
        tcsetattr(1, TCSAFLUSH, &ios_org);
        unlink(".help.tmp");
-       unlink("lxdialog.scrltmp");
 }
 
 static void winch_handler(int sig)
@@ -638,10 +665,9 @@ int main(int ac, char **av)
        conf_parse(av[1]);
        conf_read(NULL);
 
-       backtitle = malloc(128);
        sym = sym_lookup("VERSION", 0);
        sym_calc_value(sym);
-       snprintf(backtitle, 128, "uClibc v%s Configuration",
+       snprintf(menu_backtitle, 128, "uClibc v%s Configuration",
                sym_get_string_value(sym));
 
        mode = getenv("MENUCONFIG_MODE");
index 1beec16..4a889d3 100644 (file)
@@ -54,9 +54,34 @@ void menu_end_menu(void)
        current_menu = current_menu->parent;
 }
 
+struct expr *menu_check_dep(struct expr *e)
+{
+       if (!e)
+               return e;
+
+       switch (e->type) {
+       case E_NOT:
+               e->left.expr = menu_check_dep(e->left.expr);
+               break;
+       case E_OR:
+       case E_AND:
+               e->left.expr = menu_check_dep(e->left.expr);
+               e->right.expr = menu_check_dep(e->right.expr);
+               break;
+       case E_SYMBOL:
+               /* change 'm' into 'm' && MODULES */
+               if (e->left.sym == &symbol_mod)
+                       return expr_alloc_and(e, expr_alloc_symbol(modules_sym));
+               break;
+       default:
+               break;
+       }
+       return e;
+}
+
 void menu_add_dep(struct expr *dep)
 {
-       current_entry->dep = expr_alloc_and(current_entry->dep, dep);
+       current_entry->dep = expr_alloc_and(current_entry->dep, menu_check_dep(dep));
 }
 
 void menu_set_type(int type)
@@ -69,56 +94,43 @@ void menu_set_type(int type)
                sym->type = type;
                return;
        }
-       fprintf(stderr, "%s:%d: type of '%s' redefined from '%s' to '%s'\n",
+       fprintf(stderr, "%s:%d:warning: type of '%s' redefined from '%s' to '%s'\n",
                current_entry->file->name, current_entry->lineno,
                sym->name ? sym->name : "<choice>", sym_type_name(sym->type), sym_type_name(type));
 }
 
-struct property *create_prop(enum prop_type type)
-{
-       struct property *prop;
-
-       prop = malloc(sizeof(*prop));
-       memset(prop, 0, sizeof(*prop));
-       prop->type = type;
-       prop->file = current_file;
-       prop->lineno = zconf_lineno();
-
-       return prop;
-}
-
-struct property *menu_add_prop(int token, char *prompt, struct symbol *def, struct expr *dep)
+struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
 {
-       struct property *prop = create_prop(token);
-       struct property **propp;
+       struct property *prop = prop_alloc(type, current_entry->sym);
 
-       prop->sym = current_entry->sym;
        prop->menu = current_entry;
        prop->text = prompt;
-       prop->def = def;
-       E_EXPR(prop->visible) = dep;
+       prop->expr = expr;
+       prop->visible.expr = menu_check_dep(dep);
 
-       if (prompt)
+       if (prompt) {
+               if (current_entry->prompt)
+                       fprintf(stderr, "%s:%d: prompt redefined\n",
+                               current_entry->file->name, current_entry->lineno);
                current_entry->prompt = prop;
-
-       /* append property to the prop list of symbol */
-       if (prop->sym) {
-               for (propp = &prop->sym->prop; *propp; propp = &(*propp)->next)
-                       ;
-               *propp = prop;
        }
 
        return prop;
 }
 
-void menu_add_prompt(int token, char *prompt, struct expr *dep)
+void menu_add_prompt(enum prop_type type, char *prompt, struct expr *dep)
 {
-       current_entry->prompt = menu_add_prop(token, prompt, NULL, dep);
+       menu_add_prop(type, prompt, NULL, dep);
 }
 
-void menu_add_default(int token, struct symbol *def, struct expr *dep)
+void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep)
 {
-       current_entry->prompt = menu_add_prop(token, NULL, def, dep);
+       menu_add_prop(type, NULL, expr, dep);
+}
+
+void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep)
+{
+       menu_add_prop(type, NULL, expr_alloc_symbol(sym), dep);
 }
 
 void menu_finalize(struct menu *parent)
@@ -126,7 +138,7 @@ void menu_finalize(struct menu *parent)
        struct menu *menu, *last_menu;
        struct symbol *sym;
        struct property *prop;
-       struct expr *parentdep, *basedep, *dep, *dep2;
+       struct expr *parentdep, *basedep, *dep, *dep2, **ep;
 
        sym = parent->sym;
        if (parent->list) {
@@ -143,7 +155,7 @@ void menu_finalize(struct menu *parent)
                        }
                        parentdep = expr_alloc_symbol(sym);
                } else if (parent->prompt)
-                       parentdep = E_EXPR(parent->prompt->visible);
+                       parentdep = parent->prompt->visible.expr;
                else
                        parentdep = parent->dep;
 
@@ -159,23 +171,28 @@ void menu_finalize(struct menu *parent)
                        for (; prop; prop = prop->next) {
                                if (prop->menu != menu)
                                        continue;
-                               dep = expr_transform(E_EXPR(prop->visible));
+                               dep = expr_transform(prop->visible.expr);
                                dep = expr_alloc_and(expr_copy(basedep), dep);
                                dep = expr_eliminate_dups(dep);
                                if (menu->sym && menu->sym->type != S_TRISTATE)
                                        dep = expr_trans_bool(dep);
-                               E_EXPR(prop->visible) = dep;
+                               prop->visible.expr = dep;
+                               if (prop->type == P_SELECT) {
+                                       struct symbol *es = prop_get_symbol(prop);
+                                       es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
+                                                       expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+                               }
                        }
                }
                for (menu = parent->list; menu; menu = menu->next)
                        menu_finalize(menu);
-       } else if (sym && parent->prompt) {
-               basedep = E_EXPR(parent->prompt->visible);
+       } else if (sym) {
+               basedep = parent->prompt ? parent->prompt->visible.expr : NULL;
                basedep = expr_trans_compare(basedep, E_UNEQUAL, &symbol_no);
                basedep = expr_eliminate_dups(expr_transform(basedep));
                last_menu = NULL;
                for (menu = parent->next; menu; menu = menu->next) {
-                       dep = menu->prompt ? E_EXPR(menu->prompt->visible) : menu->dep;
+                       dep = menu->prompt ? menu->prompt->visible.expr : menu->dep;
                        if (!expr_contains_symbol(dep, sym))
                                break;
                        if (expr_depends_symbol(dep, sym))
@@ -204,14 +221,27 @@ void menu_finalize(struct menu *parent)
        for (menu = parent->list; menu; menu = menu->next) {
                if (sym && sym_is_choice(sym) && menu->sym) {
                        menu->sym->flags |= SYMBOL_CHOICEVAL;
+                       if (!menu->prompt)
+                               fprintf(stderr, "%s:%d:warning: choice value must have a prompt\n",
+                                       menu->file->name, menu->lineno);
+                       for (prop = menu->sym->prop; prop; prop = prop->next) {
+                               if (prop->type == P_PROMPT && prop->menu != menu) {
+                                       fprintf(stderr, "%s:%d:warning: choice values currently only support a single prompt\n",
+                                               prop->file->name, prop->lineno);
+                                       
+                               }
+                               if (prop->type == P_DEFAULT)
+                                       fprintf(stderr, "%s:%d:warning: defaults for choice values not supported\n",
+                                               prop->file->name, prop->lineno);
+                       }
                        current_entry = menu;
                        menu_set_type(sym->type);
-                       menu_add_prop(P_CHOICE, NULL, parent->sym, NULL);
-                       prop = sym_get_choice_prop(parent->sym);
-                       //dep = expr_alloc_one(E_CHOICE, dep);
-                       //dep->right.sym = menu->sym;
-                       prop->dep = expr_alloc_one(E_CHOICE, prop->dep);
-                       prop->dep->right.sym = menu->sym;
+                       menu_add_symbol(P_CHOICE, sym, NULL);
+                       prop = sym_get_choice_prop(sym);
+                       for (ep = &prop->expr; *ep; ep = &(*ep)->left.expr)
+                               ;
+                       *ep = expr_alloc_one(E_CHOICE, NULL);
+                       (*ep)->right.sym = menu->sym;
                }
                if (menu->list && (!menu->prompt || !menu->prompt->text)) {
                        for (last_menu = menu->list; ; last_menu = last_menu->next) {
@@ -224,20 +254,79 @@ void menu_finalize(struct menu *parent)
                        menu->list = NULL;
                }
        }
+
+       if (sym && !(sym->flags & SYMBOL_WARNED)) {
+               struct symbol *sym2;
+               if (sym->type == S_UNKNOWN)
+                       fprintf(stderr, "%s:%d:warning: config symbol defined without type\n",
+                               parent->file->name, parent->lineno);
+
+               if (sym_is_choice(sym) && !parent->prompt)
+                       fprintf(stderr, "%s:%d:warning: choice must have a prompt\n",
+                               parent->file->name, parent->lineno);
+
+               for (prop = sym->prop; prop; prop = prop->next) {
+                       switch (prop->type) {
+                       case P_DEFAULT:
+                               if ((sym->type == S_STRING || sym->type == S_INT || sym->type == S_HEX) &&
+                                   prop->expr->type != E_SYMBOL)
+                                       fprintf(stderr, "%s:%d:warning: default must be a single symbol\n",
+                                               prop->file->name, prop->lineno);
+                               break;
+                       case P_SELECT:
+                               sym2 = prop_get_symbol(prop);
+                               if ((sym->type != S_BOOLEAN && sym->type != S_TRISTATE) ||
+                                   (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE))
+                                       fprintf(stderr, "%s:%d:warning: enable is only allowed with boolean and tristate symbols\n",
+                                               prop->file->name, prop->lineno);
+                               break;
+                       case P_RANGE:
+                               if (sym->type != S_INT && sym->type != S_HEX)
+                                       fprintf(stderr, "%s:%d:warning: range is only allowed for int or hex symbols\n",
+                                               prop->file->name, prop->lineno);
+                               if (!sym_string_valid(sym, prop->expr->left.sym->name) ||
+                                   !sym_string_valid(sym, prop->expr->right.sym->name))
+                                       fprintf(stderr, "%s:%d:warning: range is invalid\n",
+                                               prop->file->name, prop->lineno);
+                               break;
+                       default:
+                               ;
+                       }
+               }
+               sym->flags |= SYMBOL_WARNED;
+       }
+
+       if (sym && !sym_is_optional(sym) && parent->prompt) {
+               sym->rev_dep.expr = expr_alloc_or(sym->rev_dep.expr,
+                               expr_alloc_and(parent->prompt->visible.expr,
+                                       expr_alloc_symbol(&symbol_mod)));
+       }
 }
 
 bool menu_is_visible(struct menu *menu)
 {
+       struct menu *child;
+       struct symbol *sym;
        tristate visible;
 
        if (!menu->prompt)
                return false;
-       if (menu->sym) {
-               sym_calc_value(menu->sym);
-               visible = E_TRI(menu->prompt->visible);
+       sym = menu->sym;
+       if (sym) {
+               sym_calc_value(sym);
+               visible = menu->prompt->visible.tri;
        } else
-               visible = E_CALC(menu->prompt->visible);
-       return visible != no;
+               visible = menu->prompt->visible.tri = expr_calc_value(menu->prompt->visible.expr);
+
+       if (visible != no)
+               return true;
+       if (!sym || sym_get_tristate_value(menu->sym) == no)
+               return false;
+
+       for (child = menu->list; child; child = child->next)
+               if (menu_is_visible(child))
+                       return true;
+       return false;
 }
 
 const char *menu_get_prompt(struct menu *menu)
@@ -258,10 +347,9 @@ struct menu *menu_get_parent_menu(struct menu *menu)
 {
        enum prop_type type;
 
-       while (menu != &rootmenu) {
-               menu = menu->parent;
+       for (; menu != &rootmenu; menu = menu->parent) {
                type = menu->prompt ? menu->prompt->type : 0;
-               if (type == P_MENU || type == P_ROOTMENU)
+               if (type == P_MENU)
                        break;
        }
        return menu;
index f2d0015..29d8d3e 100644 (file)
@@ -34,24 +34,14 @@ struct symbol *modules_sym;
 
 void sym_add_default(struct symbol *sym, const char *def)
 {
-       struct property *prop = create_prop(P_DEFAULT);
-       struct property **propp;
-
-       prop->sym = sym;
-       prop->def = sym_lookup(def, 1);
+       struct property *prop = prop_alloc(P_DEFAULT, sym);
 
-       /* append property to the prop list of symbol */
-       if (prop->sym) {
-               for (propp = &prop->sym->prop; *propp; propp = &(*propp)->next)
-                       ;
-               *propp = prop;
-       }
+       prop->expr = expr_alloc_symbol(sym_lookup(def, 1));
 }
 
 void sym_init(void)
 {
        struct symbol *sym;
-       struct utsname uts;
        char *p;
        static bool inited = false;
 
@@ -59,17 +49,6 @@ void sym_init(void)
                return;
        inited = true;
 
-       uname(&uts);
-
-#if 0
-       sym = sym_lookup("ARCH", 0);
-       sym->type = S_STRING;
-       sym->flags |= SYMBOL_AUTO;
-       p = getenv("ARCH");
-       if (p)
-               sym_add_default(sym, p);
-#endif
-
        sym = sym_lookup("VERSION", 0);
        sym->type = S_STRING;
        sym->flags |= SYMBOL_AUTO;
@@ -77,37 +56,32 @@ void sym_init(void)
        if (p)
                sym_add_default(sym, p);
 
-#if 0
-       sym = sym_lookup("UNAME_RELEASE", 0);
-       sym->type = S_STRING;
-       sym->flags |= SYMBOL_AUTO;
-       sym_add_default(sym, uts.release);
-#endif
-
        sym = sym_lookup("TARGET_ARCH", 0);
        sym->type = S_STRING;
        sym->flags |= SYMBOL_AUTO;
        p = getenv("TARGET_ARCH");
        if (p)
                sym_add_default(sym, p);
+
 }
 
-int sym_get_type(struct symbol *sym)
+enum symbol_type sym_get_type(struct symbol *sym)
 {
-       int type = sym->type;
+       enum symbol_type type = sym->type;
+
        if (type == S_TRISTATE) {
                if (sym_is_choice_value(sym) && sym->visible == yes)
                        type = S_BOOLEAN;
                else {
                        sym_calc_value(modules_sym);
-                       if (S_TRI(modules_sym->curr) == no)
+                       if (modules_sym->curr.tri == no)
                                type = S_BOOLEAN;
                }
        }
        return type;
 }
 
-const char *sym_type_name(int type)
+const char *sym_type_name(enum symbol_type type)
 {
        switch (type) {
        case S_BOOLEAN:
@@ -122,6 +96,8 @@ const char *sym_type_name(int type)
                return "string";
        case S_UNKNOWN:
                return "unknown";
+       case S_OTHER:
+               break;
        }
        return "???";
 }
@@ -138,41 +114,104 @@ struct property *sym_get_choice_prop(struct symbol *sym)
 struct property *sym_get_default_prop(struct symbol *sym)
 {
        struct property *prop;
-       tristate visible;
 
        for_all_defaults(sym, prop) {
-               visible = E_CALC(prop->visible);
-               if (visible != no)
+               prop->visible.tri = expr_calc_value(prop->visible.expr);
+               if (prop->visible.tri != no)
+                       return prop;
+       }
+       return NULL;
+}
+
+struct property *sym_get_range_prop(struct symbol *sym)
+{
+       struct property *prop;
+
+       for_all_properties(sym, prop, P_RANGE) {
+               prop->visible.tri = expr_calc_value(prop->visible.expr);
+               if (prop->visible.tri != no)
                        return prop;
        }
        return NULL;
 }
 
-void sym_calc_visibility(struct symbol *sym)
+static void sym_calc_visibility(struct symbol *sym)
 {
        struct property *prop;
-       tristate visible, oldvisible;
+       tristate tri;
 
        /* any prompt visible? */
-       oldvisible = sym->visible;
-       visible = no;
-       for_all_prompts(sym, prop)
-               visible = E_OR(visible, E_CALC(prop->visible));
-       if (oldvisible != visible) {
-               sym->visible = visible;
-               sym->flags |= SYMBOL_CHANGED;
+       tri = no;
+       for_all_prompts(sym, prop) {
+               prop->visible.tri = expr_calc_value(prop->visible.expr);
+               tri = E_OR(tri, prop->visible.tri);
+       }
+       if (sym->visible != tri) {
+               sym->visible = tri;
+               sym_set_changed(sym);
+       }
+       if (sym_is_choice_value(sym))
+               return;
+       tri = no;
+       if (sym->rev_dep.expr)
+               tri = expr_calc_value(sym->rev_dep.expr);
+       if (sym->rev_dep.tri != tri) {
+               sym->rev_dep.tri = tri;
+               sym_set_changed(sym);
+       }
+}
+
+static struct symbol *sym_calc_choice(struct symbol *sym)
+{
+       struct symbol *def_sym;
+       struct property *prop;
+       struct expr *e;
+
+       /* is the user choice visible? */
+       def_sym = sym->user.val;
+       if (def_sym) {
+               sym_calc_visibility(def_sym);
+               if (def_sym->visible != no)
+                       return def_sym;
        }
+
+       /* any of the defaults visible? */
+       for_all_defaults(sym, prop) {
+               prop->visible.tri = expr_calc_value(prop->visible.expr);
+               if (prop->visible.tri == no)
+                       continue;
+               def_sym = prop_get_symbol(prop);
+               sym_calc_visibility(def_sym);
+               if (def_sym->visible != no)
+                       return def_sym;
+       }
+
+       /* just get the first visible value */
+       prop = sym_get_choice_prop(sym);
+       for (e = prop->expr; e; e = e->left.expr) {
+               def_sym = e->right.sym;
+               sym_calc_visibility(def_sym);
+               if (def_sym->visible != no)
+                       return def_sym;
+       }
+
+       /* no choice? reset tristate value */
+       sym->curr.tri = no;
+       return NULL;
 }
 
 void sym_calc_value(struct symbol *sym)
 {
        struct symbol_value newval, oldval;
-       struct property *prop, *def_prop;
-       struct symbol *def_sym;
+       struct property *prop;
        struct expr *e;
 
+       if (!sym)
+               return;
+
        if (sym->flags & SYMBOL_VALID)
                return;
+       sym->flags |= SYMBOL_VALID;
 
        oldval = sym->curr;
 
@@ -187,17 +226,10 @@ void sym_calc_value(struct symbol *sym)
                newval = symbol_no.curr;
                break;
        default:
-               S_VAL(newval) = sym->name;
-               S_TRI(newval) = no;
-               if (sym->flags & SYMBOL_CONST) {
-                       goto out;
-               }
-               //newval = symbol_empty.curr;
-               // generate warning somewhere here later
-               //S_TRI(newval) = yes;
-               goto out;
+               sym->curr.val = sym->name;
+               sym->curr.tri = no;
+               return;
        }
-       sym->flags |= SYMBOL_VALID;
        if (!sym_is_choice_value(sym))
                sym->flags &= ~SYMBOL_WRITE;
 
@@ -206,95 +238,77 @@ void sym_calc_value(struct symbol *sym)
        /* set default if recursively called */
        sym->curr = newval;
 
-       if (sym->visible != no) {
-               sym->flags |= SYMBOL_WRITE;
-               if (!sym_has_value(sym)) {
-                       if (!sym_is_choice(sym)) {
-                               prop = sym_get_default_prop(sym);
-                               if (prop) {
-                                       sym_calc_value(prop->def);
-                                       newval = prop->def->curr;
-                               }
-                       }
-               } else
-                       newval = sym->def;
-
-               S_TRI(newval) = E_AND(S_TRI(newval), sym->visible);
-               /* if the symbol is visible and not optionial,
-                * possibly ignore old user choice. */
-               if (!sym_is_optional(sym) && S_TRI(newval) == no)
-                       S_TRI(newval) = sym->visible;
+       switch (sym_get_type(sym)) {
+       case S_BOOLEAN:
+       case S_TRISTATE:
                if (sym_is_choice_value(sym) && sym->visible == yes) {
                        prop = sym_get_choice_prop(sym);
-                       S_TRI(newval) = (S_VAL(prop->def->curr) == sym) ? yes : no;
-               }
-       } else {
-               prop = sym_get_default_prop(sym);
-               if (prop) {
+                       newval.tri = (prop_get_symbol(prop)->curr.val == sym) ? yes : no;
+               } else if (E_OR(sym->visible, sym->rev_dep.tri) != no) {
                        sym->flags |= SYMBOL_WRITE;
-                       sym_calc_value(prop->def);
-                       newval = prop->def->curr;
+                       if (sym_has_value(sym))
+                               newval.tri = sym->user.tri;
+                       else if (!sym_is_choice(sym)) {
+                               prop = sym_get_default_prop(sym);
+                               if (prop)
+                                       newval.tri = expr_calc_value(prop->expr);
+                       }
+                       newval.tri = E_OR(E_AND(newval.tri, sym->visible), sym->rev_dep.tri);
+               } else if (!sym_is_choice(sym)) {
+                       prop = sym_get_default_prop(sym);
+                       if (prop) {
+                               sym->flags |= SYMBOL_WRITE;
+                               newval.tri = expr_calc_value(prop->expr);
+                       }
                }
-       }
-
-       switch (sym_get_type(sym)) {
-       case S_TRISTATE:
-               if (S_TRI(newval) != mod)
-                       break;
-               sym_calc_value(modules_sym);
-               if (S_TRI(modules_sym->curr) == no)
-                       S_TRI(newval) = yes;
-               break;
-       case S_BOOLEAN:
-               if (S_TRI(newval) == mod)
-                       S_TRI(newval) = yes;
-       }
-
-out:
-       sym->curr = newval;
-
-       if (sym_is_choice(sym) && S_TRI(newval) == yes) {
-               def_sym = S_VAL(sym->def);
-               if (def_sym) {
-                       sym_calc_visibility(def_sym);
-                       if (def_sym->visible == no)
-                               def_sym = NULL;
+               if (sym_get_type(sym) == S_BOOLEAN) {
+                       if (newval.tri == mod)
+                               newval.tri = yes;
+                       if (sym->visible == mod)
+                               sym->visible = yes;
+                       if (sym->rev_dep.tri == mod)
+                               sym->rev_dep.tri = yes;
                }
-               if (!def_sym) {
-                       for_all_defaults(sym, def_prop) {
-                               if (E_CALC(def_prop->visible) == no)
-                                       continue;
-                               sym_calc_visibility(def_prop->def);
-                               if (def_prop->def->visible != no) {
-                                       def_sym = def_prop->def;
-                                       break;
-                               }
+               break;
+       case S_STRING:
+       case S_HEX:
+       case S_INT:
+               if (sym->visible != no) {
+                       sym->flags |= SYMBOL_WRITE;
+                       if (sym_has_value(sym)) {
+                               newval.val = sym->user.val;
+                               break;
                        }
                }
-
-               if (!def_sym) {
-                       prop = sym_get_choice_prop(sym);
-                       for (e = prop->dep; e; e = e->left.expr) {
-                               sym_calc_visibility(e->right.sym);
-                               if (e->right.sym->visible != no) {
-                                       def_sym = e->right.sym;
-                                       break;
-                               }
+               prop = sym_get_default_prop(sym);
+               if (prop) {
+                       struct symbol *ds = prop_get_symbol(prop);
+                       if (ds) {
+                               sym->flags |= SYMBOL_WRITE;
+                               sym_calc_value(ds);
+                               newval.val = ds->curr.val;
                        }
                }
-
-               S_VAL(newval) = def_sym;
+               break;
+       default:
+               ;
        }
 
-       if (memcmp(&oldval, &newval, sizeof(newval)))
-               sym->flags |= SYMBOL_CHANGED;
        sym->curr = newval;
+       if (sym_is_choice(sym) && newval.tri == yes)
+               sym->curr.val = sym_calc_choice(sym);
+
+       if (memcmp(&oldval, &sym->curr, sizeof(oldval)))
+               sym_set_changed(sym);
 
        if (sym_is_choice(sym)) {
                int flags = sym->flags & (SYMBOL_CHANGED | SYMBOL_WRITE);
                prop = sym_get_choice_prop(sym);
-               for (e = prop->dep; e; e = e->left.expr)
+               for (e = prop->expr; e; e = e->left.expr) {
                        e->right.sym->flags |= flags;
+                       if (flags & SYMBOL_CHANGED)
+                               sym_set_changed(e->right.sym);
+               }
        }
 }
 
@@ -308,13 +322,24 @@ void sym_clear_all_valid(void)
        sym_change_count++;
 }
 
+void sym_set_changed(struct symbol *sym)
+{
+       struct property *prop;
+
+       sym->flags |= SYMBOL_CHANGED;
+       for (prop = sym->prop; prop; prop = prop->next) {
+               if (prop->menu)
+                       prop->menu->flags |= MENU_CHANGED;
+       }
+}
+
 void sym_set_all_changed(void)
 {
        struct symbol *sym;
        int i;
 
        for_all_symbols(i, sym)
-               sym->flags |= SYMBOL_CHANGED;
+               sym_set_changed(sym);
 }
 
 bool sym_tristate_within_range(struct symbol *sym, tristate val)
@@ -327,19 +352,13 @@ bool sym_tristate_within_range(struct symbol *sym, tristate val)
        if (type != S_BOOLEAN && type != S_TRISTATE)
                return false;
 
-       switch (val) {
-       case no:
-               if (sym_is_choice_value(sym) && sym->visible == yes)
-                       return false;
-               return sym_is_optional(sym);
-       case mod:
-               if (sym_is_choice_value(sym) && sym->visible == yes)
-                       return false;
-               return type == S_TRISTATE;
-       case yes:
-               return type == S_BOOLEAN || sym->visible == yes;
-       }
-       return false;
+       if (type == S_BOOLEAN && val == mod)
+               return false;
+       if (sym->visible <= sym->rev_dep.tri)
+               return false;
+       if (sym_is_choice_value(sym) && sym->visible == yes)
+               return val == yes;
+       return val >= sym->rev_dep.tri && val <= sym->visible;
 }
 
 bool sym_set_tristate_value(struct symbol *sym, tristate val)
@@ -351,16 +370,16 @@ bool sym_set_tristate_value(struct symbol *sym, tristate val)
 
        if (sym->flags & SYMBOL_NEW) {
                sym->flags &= ~SYMBOL_NEW;
-               sym->flags |= SYMBOL_CHANGED;
+               sym_set_changed(sym);
        }
        if (sym_is_choice_value(sym) && val == yes) {
-               struct property *prop = sym_get_choice_prop(sym);
+               struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
 
-               S_VAL(prop->def->def) = sym;
-               prop->def->flags &= ~SYMBOL_NEW;
+               cs->user.val = sym;
+               cs->flags &= ~SYMBOL_NEW;
        }
 
-       S_TRI(sym->def) = val;
+       sym->user.tri = val;
        if (oldval != val) {
                sym_clear_all_valid();
                if (sym == modules_sym)
@@ -404,12 +423,12 @@ bool sym_string_valid(struct symbol *sym, const char *str)
                ch = *str++;
                if (ch == '-')
                        ch = *str++;
-               if (!isdigit((int)ch))
+               if (!isdigit(ch))
                        return false;
                if (ch == '0' && *str != 0)
                        return false;
                while ((ch = *str++)) {
-                       if (!isdigit((int)ch))
+                       if (!isdigit(ch))
                                return false;
                }
                return true;
@@ -418,21 +437,58 @@ bool sym_string_valid(struct symbol *sym, const char *str)
                        str += 2;
                ch = *str++;
                do {
-                       if (!isxdigit((int)ch))
+                       if (!isxdigit(ch))
                                return false;
                } while ((ch = *str++));
                return true;
        case S_BOOLEAN:
        case S_TRISTATE:
                switch (str[0]) {
-               case 'y':
-               case 'Y':
+               case 'y': case 'Y':
+               case 'm': case 'M':
+               case 'n': case 'N':
+                       return true;
+               }
+               return false;
+       default:
+               return false;
+       }
+}
+
+bool sym_string_within_range(struct symbol *sym, const char *str)
+{
+       struct property *prop;
+       int val;
+
+       switch (sym->type) {
+       case S_STRING:
+               return sym_string_valid(sym, str);
+       case S_INT:
+               if (!sym_string_valid(sym, str))
+                       return false;
+               prop = sym_get_range_prop(sym);
+               if (!prop)
+                       return true;
+               val = strtol(str, NULL, 10);
+               return val >= strtol(prop->expr->left.sym->name, NULL, 10) &&
+                      val <= strtol(prop->expr->right.sym->name, NULL, 10);
+       case S_HEX:
+               if (!sym_string_valid(sym, str))
+                       return false;
+               prop = sym_get_range_prop(sym);
+               if (!prop)
+                       return true;
+               val = strtol(str, NULL, 16);
+               return val >= strtol(prop->expr->left.sym->name, NULL, 16) &&
+                      val <= strtol(prop->expr->right.sym->name, NULL, 16);
+       case S_BOOLEAN:
+       case S_TRISTATE:
+               switch (str[0]) {
+               case 'y': case 'Y':
                        return sym_tristate_within_range(sym, yes);
-               case 'm':
-               case 'M':
+               case 'm': case 'M':
                        return sym_tristate_within_range(sym, mod);
-               case 'n':
-               case 'N':
+               case 'n': case 'N':
                        return sym_tristate_within_range(sym, no);
                }
                return false;
@@ -451,14 +507,11 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
        case S_BOOLEAN:
        case S_TRISTATE:
                switch (newval[0]) {
-               case 'y':
-               case 'Y':
+               case 'y': case 'Y':
                        return sym_set_tristate_value(sym, yes);
-               case 'm':
-               case 'M':
+               case 'm': case 'M':
                        return sym_set_tristate_value(sym, mod);
-               case 'n':
-               case 'N':
+               case 'n': case 'N':
                        return sym_set_tristate_value(sym, no);
                }
                return false;
@@ -466,23 +519,23 @@ bool sym_set_string_value(struct symbol *sym, const char *newval)
                ;
        }
 
-       if (!sym_string_valid(sym, newval))
+       if (!sym_string_within_range(sym, newval))
                return false;
 
        if (sym->flags & SYMBOL_NEW) {
                sym->flags &= ~SYMBOL_NEW;
-               sym->flags |= SYMBOL_CHANGED;
+               sym_set_changed(sym);
        }
 
-       oldval = S_VAL(sym->def);
+       oldval = sym->user.val;
        size = strlen(newval) + 1;
        if (sym->type == S_HEX && (newval[0] != '0' || (newval[1] != 'x' && newval[1] != 'X'))) {
                size += 2;
-               S_VAL(sym->def) = val = malloc(size);
+               sym->user.val = val = malloc(size);
                *val++ = '0';
                *val++ = 'x';
        } else if (!oldval || strcmp(oldval, newval))
-               S_VAL(sym->def) = val = malloc(size);
+               sym->user.val = val = malloc(size);
        else
                return true;
 
@@ -513,20 +566,12 @@ const char *sym_get_string_value(struct symbol *sym)
        default:
                ;
        }
-       return (const char *)S_VAL(sym->curr);
+       return (const char *)sym->curr.val;
 }
 
 bool sym_is_changable(struct symbol *sym)
 {
-       if (sym->visible == no)
-               return false;
-       /* at least 'n' and 'y'/'m' is selectable */
-       if (sym_is_optional(sym))
-               return true;
-       /* no 'n', so 'y' and 'm' must be selectable */
-       if (sym_get_type(sym) == S_TRISTATE && sym->visible == yes)
-               return true;
-       return false;
+       return sym->visible > sym->rev_dep.tri;
 }
 
 struct symbol *sym_lookup(const char *name, int isconst)
@@ -536,7 +581,6 @@ struct symbol *sym_lookup(const char *name, int isconst)
        char *new_name;
        int hash = 0;
 
-       //printf("lookup: %s -> ", name);
        if (name) {
                if (name[0] && !name[1]) {
                        switch (name[0]) {
@@ -552,10 +596,8 @@ struct symbol *sym_lookup(const char *name, int isconst)
                for (symbol = symbol_hash[hash]; symbol; symbol = symbol->next) {
                        if (!strcmp(symbol->name, name)) {
                                if ((isconst && symbol->flags & SYMBOL_CONST) ||
-                                   (!isconst && !(symbol->flags & SYMBOL_CONST))) {
-                                       //printf("h:%p\n", symbol);
+                                   (!isconst && !(symbol->flags & SYMBOL_CONST)))
                                        return symbol;
-                               }
                        }
                }
                new_name = strdup(name);
@@ -575,7 +617,6 @@ struct symbol *sym_lookup(const char *name, int isconst)
        symbol->next = symbol_hash[hash];
        symbol_hash[hash] = symbol;
 
-       //printf("n:%p\n", symbol);
        return symbol;
 }
 
@@ -608,6 +649,104 @@ struct symbol *sym_find(const char *name)
        return symbol;
 }
 
+struct symbol *sym_check_deps(struct symbol *sym);
+
+static struct symbol *sym_check_expr_deps(struct expr *e)
+{
+       struct symbol *sym;
+
+       if (!e)
+               return NULL;
+       switch (e->type) {
+       case E_OR:
+       case E_AND:
+               sym = sym_check_expr_deps(e->left.expr);
+               if (sym)
+                       return sym;
+               return sym_check_expr_deps(e->right.expr);
+       case E_NOT:
+               return sym_check_expr_deps(e->left.expr);
+       case E_EQUAL:
+       case E_UNEQUAL:
+               sym = sym_check_deps(e->left.sym);
+               if (sym)
+                       return sym;
+               return sym_check_deps(e->right.sym);
+       case E_SYMBOL:
+               return sym_check_deps(e->left.sym);
+       default:
+               break;
+       }
+       printf("Oops! How to check %d?\n", e->type);
+       return NULL;
+}
+
+struct symbol *sym_check_deps(struct symbol *sym)
+{
+       struct symbol *sym2;
+       struct property *prop;
+
+       if (sym->flags & SYMBOL_CHECK_DONE)
+               return NULL;
+       if (sym->flags & SYMBOL_CHECK) {
+               printf("Warning! Found recursive dependency: %s", sym->name);
+               return sym;
+       }
+
+       sym->flags |= (SYMBOL_CHECK | SYMBOL_CHECKED);
+       sym2 = sym_check_expr_deps(sym->rev_dep.expr);
+       if (sym2)
+               goto out;
+
+       for (prop = sym->prop; prop; prop = prop->next) {
+               if (prop->type == P_CHOICE)
+                       continue;
+               sym2 = sym_check_expr_deps(prop->visible.expr);
+               if (sym2)
+                       goto out;
+               if (prop->type != P_DEFAULT || sym_is_choice(sym))
+                       continue;
+               sym2 = sym_check_expr_deps(prop->expr);
+               if (sym2)
+                       goto out;
+       }
+out:
+       if (sym2)
+               printf(" %s", sym->name);
+       sym->flags &= ~SYMBOL_CHECK;
+       return sym2;
+}
+
+struct property *prop_alloc(enum prop_type type, struct symbol *sym)
+{
+       struct property *prop;
+       struct property **propp;
+
+       prop = malloc(sizeof(*prop));
+       memset(prop, 0, sizeof(*prop));
+       prop->type = type;
+       prop->sym = sym;
+       prop->file = current_file;
+       prop->lineno = zconf_lineno();
+
+       /* append property to the prop list of symbol */
+       if (sym) {
+               for (propp = &sym->prop; *propp; propp = &(*propp)->next)
+                       ;
+               *propp = prop;
+       }
+
+       return prop;
+}
+
+struct symbol *prop_get_symbol(struct property *prop)
+{
+       if (prop->expr && (prop->expr->type == E_SYMBOL ||
+                          prop->expr->type == E_CHOICE))
+               return prop->expr->left.sym;
+       return NULL;
+}
+
 const char *prop_get_type_name(enum prop_type type)
 {
        switch (type) {
@@ -617,13 +756,16 @@ const char *prop_get_type_name(enum prop_type type)
                return "comment";
        case P_MENU:
                return "menu";
-       case P_ROOTMENU:
-               return "rootmenu";
        case P_DEFAULT:
                return "default";
        case P_CHOICE:
                return "choice";
-       default:
-               return "unknown";
+       case P_SELECT:
+               return "select";
+       case P_RANGE:
+               return "range";
+       case P_UNKNOWN:
+               break;
        }
+       return "unknown";
 }
index a412bf4..55517b2 100644 (file)
@@ -7,6 +7,7 @@
  * Released under the terms of the GNU GPL v2.0.
  */
 
+#include <limits.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -14,7 +15,6 @@
 
 #define LKC_DIRECT_LINK
 #include "lkc.h"
-#include "zconf.tab.h"
 
 #define START_STRSIZE  16
 
@@ -96,6 +96,7 @@ n     [A-Za-z0-9_]
        "endchoice"             BEGIN(PARAM); return T_ENDCHOICE;
        "comment"               BEGIN(PARAM); return T_COMMENT;
        "config"                BEGIN(PARAM); return T_CONFIG;
+       "menuconfig"            BEGIN(PARAM); return T_MENUCONFIG;
        "help"                  BEGIN(PARAM); return T_HELP;
        "if"                    BEGIN(PARAM); return T_IF;
        "endif"                 BEGIN(PARAM); return T_ENDIF;
@@ -105,11 +106,17 @@ n [A-Za-z0-9_]
        "default"               BEGIN(PARAM); return T_DEFAULT;
        "prompt"                BEGIN(PARAM); return T_PROMPT;
        "tristate"              BEGIN(PARAM); return T_TRISTATE;
+       "def_tristate"          BEGIN(PARAM); return T_DEF_TRISTATE;
        "bool"                  BEGIN(PARAM); return T_BOOLEAN;
        "boolean"               BEGIN(PARAM); return T_BOOLEAN;
+       "def_bool"              BEGIN(PARAM); return T_DEF_BOOLEAN;
+       "def_boolean"           BEGIN(PARAM); return T_DEF_BOOLEAN;
        "int"                   BEGIN(PARAM); return T_INT;
        "hex"                   BEGIN(PARAM); return T_HEX;
        "string"                BEGIN(PARAM); return T_STRING;
+       "select"                BEGIN(PARAM); return T_SELECT;
+       "enable"                BEGIN(PARAM); return T_SELECT;
+       "range"                 BEGIN(PARAM); return T_RANGE;
        {n}+    {
                alloc_string(yytext, yyleng);
                zconflval.string = text;
@@ -141,6 +148,8 @@ n   [A-Za-z0-9_]
                zconflval.string = text;
                return T_WORD;
        }
+       #.*     /* comment */
+       \\\n    current_file->lineno++;
        .
        <<EOF>> {
                BEGIN(INITIAL);
@@ -151,29 +160,30 @@ n [A-Za-z0-9_]
        [^'"\\\n]+/\n   {
                append_string(yytext, yyleng);
                zconflval.string = text;
-               return T_STRING;
+               return T_WORD_QUOTE;
        }
        [^'"\\\n]+      {
                append_string(yytext, yyleng);
        }
        \\.?/\n {
-               append_string(yytext+1, yyleng);
+               append_string(yytext + 1, yyleng - 1);
                zconflval.string = text;
-               return T_STRING;
+               return T_WORD_QUOTE;
        }
        \\.?    {
-               append_string(yytext+1, yyleng);
+               append_string(yytext + 1, yyleng - 1);
        }
        \'|\"   {
                if (str == yytext[0]) {
                        BEGIN(PARAM);
                        zconflval.string = text;
-                       return T_STRING;
+                       return T_WORD_QUOTE;
                } else
                        append_string(yytext, 1);
        }
        \n      {
                printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
+               current_file->lineno++;
                BEGIN(INITIAL);
                return T_EOL;
        }
@@ -204,9 +214,8 @@ n   [A-Za-z0-9_]
                        }
                        append_string("        ", ts);
                }
-               
        }
-       \n/[^ \t\n] {
+       [ \t]*\n/[^ \t\n] {
                current_file->lineno++;
                zconf_endhelp();
                return T_HELPTEXT;
@@ -246,12 +255,37 @@ void zconf_starthelp(void)
 static void zconf_endhelp(void)
 {
        zconflval.string = text;
-       BEGIN(INITIAL); 
+       BEGIN(INITIAL);
+}
+
+
+/*
+ * Try to open specified file with following names:
+ * ./name
+ * $(srctree)/name
+ * The latter is used when srctree is separate from objtree
+ * when compiling the kernel.
+ * Return NULL if file is not found.
+ */
+FILE *zconf_fopen(const char *name)
+{
+       char *env, fullname[PATH_MAX+1];
+       FILE *f;
+
+       f = fopen(name, "r");
+       if (!f && name[0] != '/') {
+               env = getenv(SRCTREE);
+               if (env) {
+                       sprintf(fullname, "%s/%s", env, name);
+                       f = fopen(fullname, "r");
+               }
+       }
+       return f;
 }
 
 void zconf_initscan(const char *name)
 {
-       yyin = fopen(name, "r");
+       yyin = zconf_fopen(name);
        if (!yyin) {
                printf("can't find file %s\n", name);
                exit(1);
@@ -272,7 +306,7 @@ void zconf_nextfile(const char *name)
        memset(buf, 0, sizeof(*buf));
 
        current_buf->state = YY_CURRENT_BUFFER;
-       yyin = fopen(name, "r");
+       yyin = zconf_fopen(name);
        if (!yyin) {
                printf("%s:%d: can't open file \"%s\"\n", zconf_curname(), zconf_lineno(), name);
                exit(1);
@@ -318,7 +352,7 @@ static struct buffer *zconf_endfile(void)
 int zconf_lineno(void)
 {
        if (current_buf)
-               return current_file->lineno;
+               return current_file->lineno - 1;
        else
                return 0;
 }
index 2a02d81..c9bfdb4 100644 (file)
@@ -1,7 +1,7 @@
-/* A Bison parser, made from zconf.y, by GNU bison 1.75.  */
+/* A Bison parser, made by GNU Bison 1.875a.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    USER NAME SPACE" below.  */
 
 /* Identify Bison output.  */
-#define YYBISON        1
+#define YYBISON 1
+
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
 
 /* Pure parsers.  */
-#define YYPURE 0
+#define YYPURE 0
 
 /* Using locations.  */
 #define YYLSP_NEEDED 0
      T_ENDCHOICE = 263,
      T_COMMENT = 264,
      T_CONFIG = 265,
-     T_HELP = 266,
-     T_HELPTEXT = 267,
-     T_IF = 268,
-     T_ENDIF = 269,
-     T_DEPENDS = 270,
-     T_REQUIRES = 271,
-     T_OPTIONAL = 272,
-     T_PROMPT = 273,
-     T_DEFAULT = 274,
-     T_TRISTATE = 275,
-     T_BOOLEAN = 276,
-     T_INT = 277,
-     T_HEX = 278,
-     T_WORD = 279,
+     T_MENUCONFIG = 266,
+     T_HELP = 267,
+     T_HELPTEXT = 268,
+     T_IF = 269,
+     T_ENDIF = 270,
+     T_DEPENDS = 271,
+     T_REQUIRES = 272,
+     T_OPTIONAL = 273,
+     T_PROMPT = 274,
+     T_DEFAULT = 275,
+     T_TRISTATE = 276,
+     T_DEF_TRISTATE = 277,
+     T_BOOLEAN = 278,
+     T_DEF_BOOLEAN = 279,
      T_STRING = 280,
-     T_UNEQUAL = 281,
-     T_EOF = 282,
-     T_EOL = 283,
-     T_CLOSE_PAREN = 284,
-     T_OPEN_PAREN = 285,
-     T_ON = 286,
-     T_OR = 287,
-     T_AND = 288,
-     T_EQUAL = 289,
-     T_NOT = 290
+     T_INT = 281,
+     T_HEX = 282,
+     T_WORD = 283,
+     T_WORD_QUOTE = 284,
+     T_UNEQUAL = 285,
+     T_EOF = 286,
+     T_EOL = 287,
+     T_CLOSE_PAREN = 288,
+     T_OPEN_PAREN = 289,
+     T_ON = 290,
+     T_SELECT = 291,
+     T_RANGE = 292,
+     T_OR = 293,
+     T_AND = 294,
+     T_EQUAL = 295,
+     T_NOT = 296
    };
 #endif
 #define T_MAINMENU 258
 #define T_ENDCHOICE 263
 #define T_COMMENT 264
 #define T_CONFIG 265
-#define T_HELP 266
-#define T_HELPTEXT 267
-#define T_IF 268
-#define T_ENDIF 269
-#define T_DEPENDS 270
-#define T_REQUIRES 271
-#define T_OPTIONAL 272
-#define T_PROMPT 273
-#define T_DEFAULT 274
-#define T_TRISTATE 275
-#define T_BOOLEAN 276
-#define T_INT 277
-#define T_HEX 278
-#define T_WORD 279
+#define T_MENUCONFIG 266
+#define T_HELP 267
+#define T_HELPTEXT 268
+#define T_IF 269
+#define T_ENDIF 270
+#define T_DEPENDS 271
+#define T_REQUIRES 272
+#define T_OPTIONAL 273
+#define T_PROMPT 274
+#define T_DEFAULT 275
+#define T_TRISTATE 276
+#define T_DEF_TRISTATE 277
+#define T_BOOLEAN 278
+#define T_DEF_BOOLEAN 279
 #define T_STRING 280
-#define T_UNEQUAL 281
-#define T_EOF 282
-#define T_EOL 283
-#define T_CLOSE_PAREN 284
-#define T_OPEN_PAREN 285
-#define T_ON 286
-#define T_OR 287
-#define T_AND 288
-#define T_EQUAL 289
-#define T_NOT 290
+#define T_INT 281
+#define T_HEX 282
+#define T_WORD 283
+#define T_WORD_QUOTE 284
+#define T_UNEQUAL 285
+#define T_EOF 286
+#define T_EOL 287
+#define T_CLOSE_PAREN 288
+#define T_OPEN_PAREN 289
+#define T_ON 290
+#define T_SELECT 291
+#define T_RANGE 292
+#define T_OR 293
+#define T_AND 294
+#define T_EQUAL 295
+#define T_NOT 296
 
 
 
 
 /* Copy the first part of user declarations.  */
-#line 1 "zconf.y"
+
 
 /*
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
@@ -165,7 +180,7 @@ struct symbol *symbol_hash[257];
 
 /* Enabling traces.  */
 #ifndef YYDEBUG
-# define YYDEBUG 1
+# define YYDEBUG 0
 #endif
 
 /* Enabling verbose error messages.  */
@@ -176,42 +191,33 @@ struct symbol *symbol_hash[257];
 # define YYERROR_VERBOSE 0
 #endif
 
-#ifndef YYSTYPE
-#line 33 "zconf.y"
-typedef union {
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+
+typedef union YYSTYPE {
        int token;
        char *string;
        struct symbol *symbol;
        struct expr *expr;
        struct menu *menu;
-} yystype;
-/* Line 193 of /usr/share/bison/yacc.c.  */
-#line 190 "zconf.tab.c"
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
 
-#ifndef YYLTYPE
-typedef struct yyltype
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} yyltype;
-# define YYLTYPE yyltype
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
+
 
 /* Copy the second part of user declarations.  */
-#line 83 "zconf.y"
+
 
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
 
-/* Line 213 of /usr/share/bison/yacc.c.  */
-#line 215 "zconf.tab.c"
+/* Line 214 of yacc.c.  */
+
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
@@ -247,7 +253,7 @@ typedef struct yyltype
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-        || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+        || (YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
@@ -257,13 +263,13 @@ union yyalloc
   };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
      ((N) * (sizeof (short) + sizeof (YYSTYPE))                                \
-      + YYSTACK_GAP_MAX)
+      + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
@@ -277,7 +283,7 @@ union yyalloc
        {                                       \
          register YYSIZE_T yyi;                \
          for (yyi = 0; yyi < (Count); yyi++)   \
-           (To)[yyi] = (From)[yyi];    \
+           (To)[yyi] = (From)[yyi];            \
        }                                       \
       while (0)
 #  endif
@@ -294,7 +300,7 @@ union yyalloc
        YYSIZE_T yynewbytes;                                            \
        YYCOPY (&yyptr->Stack, Stack, yysize);                          \
        Stack = &yyptr->Stack;                                          \
-       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;   \
+       yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
        yyptr += yynewbytes / sizeof (*yyptr);                          \
       }                                                                        \
     while (0)
@@ -309,23 +315,24 @@ union yyalloc
 
 /* YYFINAL -- State number of the termination state. */
 #define YYFINAL  2
-#define YYLAST   151
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   201
 
 /* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS  36
+#define YYNTOKENS  42
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  39
+#define YYNNTS  41
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  96
+#define YYNRULES  104
 /* YYNRULES -- Number of states. */
-#define YYNSTATES  145
+#define YYNSTATES  182
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
-#define YYMAXUTOK   290
+#define YYMAXUTOK   296
 
-#define YYTRANSLATE(X) \
-  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+#define YYTRANSLATE(YYX)                                               \
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 static const unsigned char yytranslate[] =
@@ -359,7 +366,7 @@ static const unsigned char yytranslate[] =
        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
-      35
+      35,    36,    37,    38,    39,    40,    41
 };
 
 #if YYDEBUG
@@ -368,63 +375,69 @@ static const unsigned char yytranslate[] =
 static const unsigned short yyprhs[] =
 {
        0,     0,     3,     4,     7,     9,    11,    13,    17,    19,
-      21,    23,    26,    28,    30,    32,    34,    36,    39,    43,
-      44,    48,    52,    55,    58,    61,    64,    67,    70,    73,
-      77,    81,    83,    87,    89,    94,    97,    98,   102,   106,
-     109,   112,   116,   118,   121,   122,   125,   128,   130,   136,
-     140,   141,   144,   147,   150,   153,   157,   159,   164,   167,
-     168,   171,   174,   177,   181,   184,   187,   190,   194,   197,
-     200,   201,   205,   208,   212,   215,   218,   219,   221,   225,
-     227,   229,   231,   233,   235,   237,   239,   240,   243,   245,
-     249,   253,   257,   260,   264,   268,   270
+      21,    23,    26,    28,    30,    32,    34,    36,    38,    42,
+      45,    49,    52,    53,    56,    59,    62,    65,    69,    74,
+      78,    83,    87,    91,    95,   100,   105,   110,   116,   119,
+     122,   124,   128,   131,   132,   135,   138,   141,   144,   149,
+     153,   157,   160,   165,   166,   169,   173,   175,   179,   182,
+     183,   186,   189,   192,   196,   199,   201,   205,   208,   209,
+     212,   215,   218,   222,   226,   228,   232,   235,   238,   241,
+     242,   245,   248,   253,   257,   261,   262,   265,   267,   269,
+     272,   275,   278,   280,   282,   283,   286,   288,   292,   296,
+     300,   303,   307,   311,   313
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const yysigned_char yyrhs[] =
 {
-      37,     0,    -1,    -1,    37,    38,    -1,    39,    -1,    47,
-      -1,    58,    -1,     3,    69,    71,    -1,     5,    -1,    14,
-      -1,     8,    -1,     1,    71,    -1,    53,    -1,    63,    -1,
-      41,    -1,    61,    -1,    71,    -1,    10,    24,    -1,    40,
-      28,    42,    -1,    -1,    42,    43,    28,    -1,    42,    67,
-      28,    -1,    42,    65,    -1,    42,    28,    -1,    20,    68,
-      -1,    21,    68,    -1,    22,    68,    -1,    23,    68,    -1,
-      25,    68,    -1,    18,    69,    72,    -1,    19,    74,    72,
-      -1,     7,    -1,    44,    28,    48,    -1,    70,    -1,    45,
-      50,    46,    28,    -1,    45,    50,    -1,    -1,    48,    49,
-      28,    -1,    48,    67,    28,    -1,    48,    65,    -1,    48,
-      28,    -1,    18,    69,    72,    -1,    17,    -1,    19,    74,
-      -1,    -1,    50,    39,    -1,    13,    73,    -1,    70,    -1,
-      51,    28,    54,    52,    28,    -1,    51,    28,    54,    -1,
-      -1,    54,    39,    -1,    54,    58,    -1,    54,    47,    -1,
-       4,    69,    -1,    55,    28,    66,    -1,    70,    -1,    56,
-      59,    57,    28,    -1,    56,    59,    -1,    -1,    59,    39,
-      -1,    59,    58,    -1,    59,    47,    -1,    59,     1,    28,
-      -1,     6,    69,    -1,    60,    28,    -1,     9,    69,    -1,
-      62,    28,    66,    -1,    11,    28,    -1,    64,    12,    -1,
-      -1,    66,    67,    28,    -1,    66,    28,    -1,    15,    31,
-      73,    -1,    15,    73,    -1,    16,    73,    -1,    -1,    69,
-      -1,    69,    13,    73,    -1,    24,    -1,    25,    -1,     5,
-      -1,     8,    -1,    14,    -1,    28,    -1,    27,    -1,    -1,
-      13,    73,    -1,    74,    -1,    74,    34,    74,    -1,    74,
-      26,    74,    -1,    30,    73,    29,    -1,    35,    73,    -1,
-      73,    32,    73,    -1,    73,    33,    73,    -1,    24,    -1,
-      25,    -1
+      43,     0,    -1,    -1,    43,    44,    -1,    45,    -1,    55,
+      -1,    66,    -1,     3,    77,    79,    -1,     5,    -1,    15,
+      -1,     8,    -1,     1,    79,    -1,    61,    -1,    71,    -1,
+      47,    -1,    49,    -1,    69,    -1,    79,    -1,    10,    28,
+      32,    -1,    46,    50,    -1,    11,    28,    32,    -1,    48,
+      50,    -1,    -1,    50,    51,    -1,    50,    75,    -1,    50,
+      73,    -1,    50,    32,    -1,    21,    76,    32,    -1,    22,
+      81,    80,    32,    -1,    23,    76,    32,    -1,    24,    81,
+      80,    32,    -1,    26,    76,    32,    -1,    27,    76,    32,
+      -1,    25,    76,    32,    -1,    19,    77,    80,    32,    -1,
+      20,    81,    80,    32,    -1,    36,    28,    80,    32,    -1,
+      37,    82,    82,    80,    32,    -1,     7,    32,    -1,    52,
+      56,    -1,    78,    -1,    53,    58,    54,    -1,    53,    58,
+      -1,    -1,    56,    57,    -1,    56,    75,    -1,    56,    73,
+      -1,    56,    32,    -1,    19,    77,    80,    32,    -1,    21,
+      76,    32,    -1,    23,    76,    32,    -1,    18,    32,    -1,
+      20,    28,    80,    32,    -1,    -1,    58,    45,    -1,    14,
+      81,    32,    -1,    78,    -1,    59,    62,    60,    -1,    59,
+      62,    -1,    -1,    62,    45,    -1,    62,    66,    -1,    62,
+      55,    -1,     4,    77,    32,    -1,    63,    74,    -1,    78,
+      -1,    64,    67,    65,    -1,    64,    67,    -1,    -1,    67,
+      45,    -1,    67,    66,    -1,    67,    55,    -1,    67,     1,
+      32,    -1,     6,    77,    32,    -1,    68,    -1,     9,    77,
+      32,    -1,    70,    74,    -1,    12,    32,    -1,    72,    13,
+      -1,    -1,    74,    75,    -1,    74,    32,    -1,    16,    35,
+      81,    32,    -1,    16,    81,    32,    -1,    17,    81,    32,
+      -1,    -1,    77,    80,    -1,    28,    -1,    29,    -1,     5,
+      79,    -1,     8,    79,    -1,    15,    79,    -1,    32,    -1,
+      31,    -1,    -1,    14,    81,    -1,    82,    -1,    82,    40,
+      82,    -1,    82,    30,    82,    -1,    34,    81,    33,    -1,
+      41,    81,    -1,    81,    38,    81,    -1,    81,    39,    81,
+      -1,    28,    -1,    29,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
 static const unsigned short yyrline[] =
 {
-       0,    88,    88,    89,    92,    93,    94,    95,    96,    97,
-      98,    99,   102,   104,   105,   106,   107,   113,   121,   127,
-     129,   130,   131,   132,   135,   141,   147,   153,   159,   165,
-     171,   179,   188,   194,   202,   204,   210,   212,   213,   214,
-     215,   218,   224,   230,   237,   239,   244,   254,   262,   264,
-     270,   272,   273,   274,   279,   286,   292,   300,   302,   308,
-     310,   311,   312,   313,   316,   322,   329,   336,   343,   349,
-     356,   357,   358,   361,   366,   371,   379,   381,   385,   390,
-     391,   394,   395,   396,   399,   400,   402,   403,   406,   407,
-     408,   409,   410,   411,   412,   415,   416
+       0,    94,    94,    95,    98,    99,   100,   101,   102,   103,
+     104,   105,   109,   110,   111,   112,   113,   114,   120,   128,
+     134,   142,   152,   154,   155,   156,   157,   160,   166,   173,
+     179,   186,   192,   198,   204,   210,   216,   222,   230,   239,
+     245,   254,   255,   261,   263,   264,   265,   266,   269,   275,
+     281,   287,   293,   299,   301,   306,   315,   324,   325,   331,
+     333,   334,   335,   340,   347,   353,   362,   363,   369,   371,
+     372,   373,   374,   377,   383,   390,   397,   404,   410,   417,
+     418,   419,   422,   427,   432,   440,   442,   447,   448,   451,
+     452,   453,   457,   457,   459,   460,   463,   464,   465,   466,
+     467,   468,   469,   472,   473
 };
 #endif
 
@@ -435,12 +448,14 @@ static const char *const yytname[] =
 {
   "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU", 
   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG", 
-  "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", "T_REQUIRES", 
-  "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE", "T_BOOLEAN", 
-  "T_INT", "T_HEX", "T_WORD", "T_STRING", "T_UNEQUAL", "T_EOF", "T_EOL", 
-  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_OR", "T_AND", "T_EQUAL", 
-  "T_NOT", "$accept", "input", "block", "common_block", 
-  "config_entry_start", "config_stmt", "config_option_list", 
+  "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS", 
+  "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE", 
+  "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT", 
+  "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL", 
+  "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR", 
+  "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block", 
+  "common_block", "config_entry_start", "config_stmt", 
+  "menuconfig_entry_start", "menuconfig_stmt", "config_option_list", 
   "config_option", "choice", "choice_entry", "choice_end", "choice_stmt", 
   "choice_option_list", "choice_option", "choice_block", "if", "if_end", 
   "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt", 
@@ -458,38 +473,41 @@ static const unsigned short yytoknum[] =
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
-     285,   286,   287,   288,   289,   290
+     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
+     295,   296
 };
 # endif
 
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,    36,    37,    37,    38,    38,    38,    38,    38,    38,
-      38,    38,    39,    39,    39,    39,    39,    40,    41,    42,
-      42,    42,    42,    42,    43,    43,    43,    43,    43,    43,
-      43,    44,    45,    46,    47,    47,    48,    48,    48,    48,
-      48,    49,    49,    49,    50,    50,    51,    52,    53,    53,
-      54,    54,    54,    54,    55,    56,    57,    58,    58,    59,
-      59,    59,    59,    59,    60,    61,    62,    63,    64,    65,
-      66,    66,    66,    67,    67,    67,    68,    68,    68,    69,
-      69,    70,    70,    70,    71,    71,    72,    72,    73,    73,
-      73,    73,    73,    73,    73,    74,    74
+       0,    42,    43,    43,    44,    44,    44,    44,    44,    44,
+      44,    44,    45,    45,    45,    45,    45,    45,    46,    47,
+      48,    49,    50,    50,    50,    50,    50,    51,    51,    51,
+      51,    51,    51,    51,    51,    51,    51,    51,    52,    53,
+      54,    55,    55,    56,    56,    56,    56,    56,    57,    57,
+      57,    57,    57,    58,    58,    59,    60,    61,    61,    62,
+      62,    62,    62,    63,    64,    65,    66,    66,    67,    67,
+      67,    67,    67,    68,    69,    70,    71,    72,    73,    74,
+      74,    74,    75,    75,    75,    76,    76,    77,    77,    78,
+      78,    78,    79,    79,    80,    80,    81,    81,    81,    81,
+      81,    81,    81,    82,    82
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const unsigned char yyr2[] =
 {
        0,     2,     0,     2,     1,     1,     1,     3,     1,     1,
-       1,     2,     1,     1,     1,     1,     1,     2,     3,     0,
-       3,     3,     2,     2,     2,     2,     2,     2,     2,     3,
-       3,     1,     3,     1,     4,     2,     0,     3,     3,     2,
-       2,     3,     1,     2,     0,     2,     2,     1,     5,     3,
-       0,     2,     2,     2,     2,     3,     1,     4,     2,     0,
-       2,     2,     2,     3,     2,     2,     2,     3,     2,     2,
-       0,     3,     2,     3,     2,     2,     0,     1,     3,     1,
-       1,     1,     1,     1,     1,     1,     0,     2,     1,     3,
-       3,     3,     2,     3,     3,     1,     1
+       1,     2,     1,     1,     1,     1,     1,     1,     3,     2,
+       3,     2,     0,     2,     2,     2,     2,     3,     4,     3,
+       4,     3,     3,     3,     4,     4,     4,     5,     2,     2,
+       1,     3,     2,     0,     2,     2,     2,     2,     4,     3,
+       3,     2,     4,     0,     2,     3,     1,     3,     2,     0,
+       2,     2,     2,     3,     2,     1,     3,     2,     0,     2,
+       2,     2,     3,     3,     1,     3,     2,     2,     2,     0,
+       2,     2,     4,     3,     3,     0,     2,     1,     1,     2,
+       2,     2,     1,     1,     0,     2,     1,     3,     3,     3,
+       2,     3,     3,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -497,127 +515,151 @@ static const unsigned char yyr2[] =
    means the default is an error.  */
 static const unsigned char yydefact[] =
 {
-       2,     0,     1,     0,     0,     0,     8,     0,    31,    10,
-       0,     0,     0,     9,    85,    84,     3,     4,     0,    14,
-       0,    44,     5,     0,    12,     0,    59,     6,     0,    15,
-       0,    13,    16,    11,    79,    80,     0,    54,    64,    66,
-      17,    95,    96,     0,     0,    46,    88,    19,    36,    35,
-      50,    70,     0,    65,    70,     7,     0,    92,     0,     0,
-       0,     0,    18,    32,    81,    82,    83,    45,     0,    33,
-      49,    55,     0,    60,    62,     0,    61,    56,    67,    91,
-      93,    94,    90,    89,     0,     0,     0,     0,     0,    76,
-      76,    76,    76,    76,    23,     0,     0,    22,     0,    42,
-       0,     0,    40,     0,    39,     0,    34,    51,    53,     0,
-      52,    47,    72,     0,    63,    57,    68,     0,    74,    75,
-      86,    86,    24,    77,    25,    26,    27,    28,    20,    69,
-      21,    86,    43,    37,    38,    48,    71,    73,     0,    29,
-      30,     0,    41,    87,    78
+       2,     0,     1,     0,     0,     0,     8,     0,     0,    10,
+       0,     0,     0,     0,     9,    93,    92,     3,     4,    22,
+      14,    22,    15,    43,    53,     5,    59,    12,    79,    68,
+       6,    74,    16,    79,    13,    17,    11,    87,    88,     0,
+       0,     0,    38,     0,     0,     0,   103,   104,     0,     0,
+       0,    96,    19,    21,    39,    42,    58,    64,     0,    76,
+       7,    63,    73,    75,    18,    20,     0,   100,    55,     0,
+       0,     0,     0,     0,     0,     0,     0,     0,    85,     0,
+      85,     0,    85,    85,    85,    26,     0,     0,    23,     0,
+      25,    24,     0,     0,     0,    85,    85,    47,    44,    46,
+      45,     0,     0,     0,    54,    41,    40,    60,    62,    57,
+      61,    56,    81,    80,     0,    69,    71,    66,    70,    65,
+      99,   101,   102,    98,    97,    77,     0,     0,     0,    94,
+      94,     0,    94,    94,     0,    94,     0,     0,     0,    94,
+       0,    78,    51,    94,    94,     0,     0,    89,    90,    91,
+      72,     0,    83,    84,     0,     0,     0,    27,    86,     0,
+      29,     0,    33,    31,    32,     0,    94,     0,     0,    49,
+      50,    82,    95,    34,    35,    28,    30,    36,     0,    48,
+      52,    37
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const short yydefgoto[] =
 {
-      -1,     1,    16,    17,    18,    19,    62,    95,    20,    21,
-      68,    22,    63,   103,    49,    23,   109,    24,    70,    25,
-      26,    75,    27,    52,    28,    29,    30,    31,    96,    97,
-      71,   113,   122,   123,    69,    32,   139,    45,    46
+      -1,     1,    17,    18,    19,    20,    21,    22,    52,    88,
+      23,    24,   105,    25,    54,    98,    55,    26,   109,    27,
+      56,    28,    29,   117,    30,    58,    31,    32,    33,    34,
+      89,    90,    57,    91,   131,   132,   106,    35,   155,    50,
+      51
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -120
+#define YYPACT_NINF -99
 static const short yypact[] =
 {
-    -120,    17,  -120,    41,    48,    48,  -120,    48,  -120,  -120,
-      48,   -11,    40,  -120,  -120,  -120,  -120,  -120,    13,  -120,
-      23,  -120,  -120,    66,  -120,    72,  -120,  -120,    77,  -120,
-      81,  -120,  -120,  -120,  -120,  -120,    41,  -120,  -120,  -120,
-    -120,  -120,  -120,    40,    40,    57,    59,  -120,  -120,    98,
-    -120,  -120,    49,  -120,  -120,  -120,     7,  -120,    40,    40,
-      67,    67,    99,   117,  -120,  -120,  -120,  -120,    85,  -120,
-      74,    18,    88,  -120,  -120,    95,  -120,  -120,    18,  -120,
-      96,  -120,  -120,  -120,   102,    36,    40,    48,    67,    48,
-      48,    48,    48,    48,  -120,   103,   129,  -120,   114,  -120,
-      48,    67,  -120,   115,  -120,   116,  -120,  -120,  -120,   118,
-    -120,  -120,  -120,   119,  -120,  -120,  -120,    40,    57,    57,
-     135,   135,  -120,   136,  -120,  -120,  -120,  -120,  -120,  -120,
-    -120,   135,  -120,  -120,  -120,  -120,  -120,    57,    40,  -120,
-    -120,    40,  -120,    57,    57
+     -99,    48,   -99,    38,    46,    46,   -99,    46,   -29,   -99,
+      46,   -17,    -3,   -11,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,    38,
+      12,    15,   -99,    18,    51,    62,   -99,   -99,   -11,   -11,
+       4,   -24,   138,   138,   160,   121,   110,    -4,    81,    -4,
+     -99,   -99,   -99,   -99,   -99,   -99,   -19,   -99,   -99,   -11,
+     -11,    70,    70,    73,    32,   -11,    46,   -11,    46,   -11,
+      46,   -11,    46,    46,    46,   -99,    36,    70,   -99,    95,
+     -99,   -99,    96,    46,   106,    46,    46,   -99,   -99,   -99,
+     -99,    38,    38,    38,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   112,   -99,   -99,   -99,   -99,   -99,
+     -99,   117,   -99,   -99,   -99,   -99,   -11,    33,    65,   131,
+       1,   119,   131,     1,   136,     1,   153,   154,   155,   131,
+      70,   -99,   -99,   131,   131,   156,   157,   -99,   -99,   -99,
+     -99,   101,   -99,   -99,   -11,   158,   159,   -99,   -99,   161,
+     -99,   162,   -99,   -99,   -99,   163,   131,   164,   165,   -99,
+     -99,   -99,    99,   -99,   -99,   -99,   -99,   -99,   166,   -99,
+     -99,   -99
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const yysigned_char yypgoto[] =
+static const short yypgoto[] =
 {
-    -120,  -120,  -120,   -38,  -120,  -120,  -120,  -120,  -120,  -120,
-    -120,   -42,  -120,  -120,  -120,  -120,  -120,  -120,  -120,  -120,
-    -120,  -120,   -33,  -120,  -120,  -120,  -120,  -120,  -120,    87,
-      97,    34,    47,    -1,   -23,     2,  -119,   -43,   -53
+     -99,   -99,   -99,   111,   -99,   -99,   -99,   -99,   178,   -99,
+     -99,   -99,   -99,    91,   -99,   -99,   -99,   -99,   -99,   -99,
+     -99,   -99,   -99,   -99,   115,   -99,   -99,   -99,   -99,   -99,
+     -99,   146,   168,    89,    27,     0,   126,    -1,   -98,   -48,
+     -63
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, parse error.  */
-#define YYTABLE_NINF -59
+   If YYTABLE_NINF, syntax error.  */
+#define YYTABLE_NINF -68
 static const short yytable[] =
 {
-      56,    57,   140,    36,    37,    33,    38,    82,    83,    39,
-      74,    67,   142,    40,    73,    80,    81,     2,     3,    76,
-       4,     5,     6,     7,     8,     9,    10,    11,   108,    77,
-      12,    13,   107,    85,    86,   121,    79,   110,    55,    58,
-      59,    47,   118,   119,    14,    15,   112,   111,   132,   -58,
-      72,    48,   -58,     5,    64,     7,     8,    65,    10,    11,
-      41,    42,    12,    66,    41,    42,    43,   117,    14,    15,
-      43,    44,    34,    35,   137,    44,    14,    15,     5,    64,
-       7,     8,    65,    10,    11,    60,   120,    12,    66,    58,
-      59,    41,    42,    61,    50,   143,    98,   105,   144,   131,
-      51,    14,    15,    64,     7,    53,    65,    10,    11,    54,
-      84,    12,    66,   106,    85,    86,   114,    87,    88,    89,
-      90,    91,    92,   115,    93,    14,    15,    94,    84,    59,
-     116,   128,    85,    86,    99,   100,   101,   124,   125,   126,
-     127,   129,   130,   133,   134,   102,   135,   136,   138,   141,
-     104,    78
+      66,    67,    36,    42,    39,    40,    71,    41,   123,   124,
+      43,    44,    74,    75,   120,   154,    72,    46,    47,    69,
+      70,   121,   122,    48,   140,    45,   127,   128,   112,   130,
+      49,   133,   156,   135,   158,   159,    68,   161,    60,    69,
+      70,   165,    69,    70,    61,   167,   168,    62,     2,     3,
+      63,     4,     5,     6,     7,     8,     9,    10,    11,    12,
+      46,    47,    13,    14,   139,   152,    48,   126,   178,    15,
+      16,    69,    70,    49,    37,    38,   129,   166,   151,    15,
+      16,   -67,   114,    64,   -67,     5,   101,     7,     8,   102,
+      10,    11,    12,   143,    65,    13,   103,   153,    46,    47,
+     147,   148,   149,    69,    70,   125,   172,   134,   141,   136,
+     137,   138,    15,    16,     5,   101,     7,     8,   102,    10,
+      11,    12,   145,   146,    13,   103,   101,     7,   142,   102,
+      10,    11,    12,   171,   144,    13,   103,    69,    70,    69,
+      70,    15,    16,   100,   150,   154,   113,   108,   113,   116,
+      73,   157,    15,    16,    74,    75,    70,    76,    77,    78,
+      79,    80,    81,    82,    83,    84,   104,   107,   160,   115,
+      85,   110,    73,   118,    86,    87,    74,    75,    92,    93,
+      94,    95,   111,    96,   119,   162,   163,   164,   169,   170,
+     173,   174,    97,   175,   176,   177,   179,   180,   181,    53,
+      99,    59
 };
 
 static const unsigned char yycheck[] =
 {
-      43,    44,   121,     4,     5,     3,     7,    60,    61,    10,
-      52,    49,   131,    24,    52,    58,    59,     0,     1,    52,
-       3,     4,     5,     6,     7,     8,     9,    10,    70,    52,
-      13,    14,    70,    15,    16,    88,    29,    70,    36,    32,
-      33,    28,    85,    86,    27,    28,    28,    70,   101,     0,
-       1,    28,     3,     4,     5,     6,     7,     8,     9,    10,
-      24,    25,    13,    14,    24,    25,    30,    31,    27,    28,
-      30,    35,    24,    25,   117,    35,    27,    28,     4,     5,
-       6,     7,     8,     9,    10,    26,    87,    13,    14,    32,
-      33,    24,    25,    34,    28,   138,    62,    63,   141,   100,
-      28,    27,    28,     5,     6,    28,     8,     9,    10,    28,
-      11,    13,    14,    28,    15,    16,    28,    18,    19,    20,
-      21,    22,    23,    28,    25,    27,    28,    28,    11,    33,
-      28,    28,    15,    16,    17,    18,    19,    90,    91,    92,
-      93,    12,    28,    28,    28,    28,    28,    28,    13,    13,
-      63,    54
+      48,    49,     3,    32,     4,     5,    30,     7,    71,    72,
+      10,    28,    16,    17,    33,    14,    40,    28,    29,    38,
+      39,    69,    70,    34,    87,    28,    74,    75,    32,    77,
+      41,    79,   130,    81,   132,   133,    32,   135,    39,    38,
+      39,   139,    38,    39,    32,   143,   144,    32,     0,     1,
+      32,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      28,    29,    14,    15,    28,    32,    34,    35,   166,    31,
+      32,    38,    39,    41,    28,    29,    76,   140,   126,    31,
+      32,     0,     1,    32,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    93,    32,    14,    15,    32,    28,    29,
+     101,   102,   103,    38,    39,    32,   154,    80,    13,    82,
+      83,    84,    31,    32,     4,     5,     6,     7,     8,     9,
+      10,    11,    95,    96,    14,    15,     5,     6,    32,     8,
+       9,    10,    11,    32,    28,    14,    15,    38,    39,    38,
+      39,    31,    32,    54,    32,    14,    57,    56,    59,    58,
+      12,    32,    31,    32,    16,    17,    39,    19,    20,    21,
+      22,    23,    24,    25,    26,    27,    55,    56,    32,    58,
+      32,    56,    12,    58,    36,    37,    16,    17,    18,    19,
+      20,    21,    56,    23,    58,    32,    32,    32,    32,    32,
+      32,    32,    32,    32,    32,    32,    32,    32,    32,    21,
+      54,    33
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,    37,     0,     1,     3,     4,     5,     6,     7,     8,
-       9,    10,    13,    14,    27,    28,    38,    39,    40,    41,
-      44,    45,    47,    51,    53,    55,    56,    58,    60,    61,
-      62,    63,    71,    71,    24,    25,    69,    69,    69,    69,
-      24,    24,    25,    30,    35,    73,    74,    28,    28,    50,
-      28,    28,    59,    28,    28,    71,    73,    73,    32,    33,
-      26,    34,    42,    48,     5,     8,    14,    39,    46,    70,
-      54,    66,     1,    39,    47,    57,    58,    70,    66,    29,
-      73,    73,    74,    74,    11,    15,    16,    18,    19,    20,
-      21,    22,    23,    25,    28,    43,    64,    65,    67,    17,
-      18,    19,    28,    49,    65,    67,    28,    39,    47,    52,
-      58,    70,    28,    67,    28,    28,    28,    31,    73,    73,
-      69,    74,    68,    69,    68,    68,    68,    68,    28,    12,
-      28,    69,    74,    28,    28,    28,    28,    73,    13,    72,
-      72,    13,    72,    73,    73
+       0,    43,     0,     1,     3,     4,     5,     6,     7,     8,
+       9,    10,    11,    14,    15,    31,    32,    44,    45,    46,
+      47,    48,    49,    52,    53,    55,    59,    61,    63,    64,
+      66,    68,    69,    70,    71,    79,    79,    28,    29,    77,
+      77,    77,    32,    77,    28,    28,    28,    29,    34,    41,
+      81,    82,    50,    50,    56,    58,    62,    74,    67,    74,
+      79,    32,    32,    32,    32,    32,    81,    81,    32,    38,
+      39,    30,    40,    12,    16,    17,    19,    20,    21,    22,
+      23,    24,    25,    26,    27,    32,    36,    37,    51,    72,
+      73,    75,    18,    19,    20,    21,    23,    32,    57,    73,
+      75,     5,     8,    15,    45,    54,    78,    45,    55,    60,
+      66,    78,    32,    75,     1,    45,    55,    65,    66,    78,
+      33,    81,    81,    82,    82,    32,    35,    81,    81,    77,
+      81,    76,    77,    81,    76,    81,    76,    76,    76,    28,
+      82,    13,    32,    77,    28,    76,    76,    79,    79,    79,
+      32,    81,    32,    32,    14,    80,    80,    32,    80,    80,
+      32,    80,    32,    32,    32,    80,    82,    80,    80,    32,
+      32,    32,    81,    32,    32,    32,    32,    32,    80,    32,
+      32,    32
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -638,13 +680,14 @@ static const unsigned char yystos[] =
 
 #define yyerrok                (yyerrstatus = 0)
 #define yyclearin      (yychar = YYEMPTY)
-#define YYEMPTY                -2
+#define YYEMPTY                (-2)
 #define YYEOF          0
 
 #define YYACCEPT       goto yyacceptlab
 #define YYABORT                goto yyabortlab
 #define YYERROR                goto yyerrlab1
 
+
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
    Once GCC version 2 has supplanted version 1, this can go.  */
@@ -659,13 +702,13 @@ do                                                                \
     {                                                          \
       yychar = (Token);                                                \
       yylval = (Value);                                                \
-      yychar1 = YYTRANSLATE (yychar);                          \
+      yytoken = YYTRANSLATE (yychar);                          \
       YYPOPSTACK;                                              \
       goto yybackup;                                           \
     }                                                          \
   else                                                         \
     {                                                          \
-      yyerror ("syntax error: cannot back up");                        \
+      yyerror ("syntax error: cannot back up");\
       YYERROR;                                                 \
     }                                                          \
 while (0)
@@ -677,7 +720,7 @@ while (0)
    are run).  */
 
 #ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)           \
+# define YYLLOC_DEFAULT(Current, Rhs, N)         \
   Current.first_line   = Rhs[1].first_line;      \
   Current.first_column = Rhs[1].first_column;    \
   Current.last_line    = Rhs[N].last_line;       \
@@ -686,7 +729,11 @@ while (0)
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
-#define YYLEX  yylex ()
+#ifdef YYLEX_PARAM
+# define YYLEX yylex (YYLEX_PARAM)
+#else
+# define YYLEX yylex ()
+#endif
 
 /* Enable debugging if requested.  */
 #if YYDEBUG
@@ -701,19 +748,93 @@ do {                                              \
   if (yydebug)                                 \
     YYFPRINTF Args;                            \
 } while (0)
+
 # define YYDSYMPRINT(Args)                     \
 do {                                           \
   if (yydebug)                                 \
     yysymprint Args;                           \
 } while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)           \
+do {                                                           \
+  if (yydebug)                                                 \
+    {                                                          \
+      YYFPRINTF (stderr, "%s ", Title);                                \
+      yysymprint (stderr,                                      \
+                  Token, Value);       \
+      YYFPRINTF (stderr, "\n");                                        \
+    }                                                          \
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (cinluded).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short *bottom, short *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short *bottom;
+    short *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)                           \
+do {                                                           \
+  if (yydebug)                                                 \
+    yy_stack_print ((Bottom), (Top));                          \
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylineno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylineno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)         \
+do {                                   \
+  if (yydebug)                         \
+    yy_reduce_print (Rule);            \
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
 # define YYDPRINTF(Args)
 # define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
 
+
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef        YYINITDEPTH
 # define YYINITDEPTH 200
@@ -792,95 +913,85 @@ yystpcpy (yydest, yysrc)
 \f
 
 #if YYDEBUG
-/*-----------------------------.
-| Print this symbol on YYOUT.  |
-`-----------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
 
-static void
 #if defined (__STDC__) || defined (__cplusplus)
-yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+static void
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
 #else
-yysymprint (yyout, yytype, yyvalue)
-    FILE* yyout;
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
 
   if (yytype < YYNTOKENS)
     {
-      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
 # ifdef YYPRINT
-      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 # endif
     }
   else
-    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 
   switch (yytype)
     {
       default:
         break;
     }
-  YYFPRINTF (yyout, ")");
+  YYFPRINTF (yyoutput, ")");
 }
-#endif /* YYDEBUG. */
-
 
+#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
-static void
 #if defined (__STDC__) || defined (__cplusplus)
-yydestruct (int yytype, YYSTYPE yyvalue)
+static void
+yydestruct (int yytype, YYSTYPE *yyvaluep)
 #else
-yydestruct (yytype, yyvalue)
+static void
+yydestruct (yytype, yyvaluep)
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
 
   switch (yytype)
     {
+
       default:
         break;
     }
 }
-
 \f
 
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
-   into yyparse.  The argument should have type void *.
-   It should actually point to an object.
-   Grammar actions can access the variable by casting it
-   to the proper pointer type.  */
+/* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
 # else
-#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
 # endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes.  */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
-# endif
+#else
+int yyparse ();
 #endif
+#endif /* ! YYPARSE_PARAM */
+
 
 
 /* The lookahead symbol.  */
@@ -889,13 +1000,32 @@ int yychar;
 /* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
-/* Number of parse errors so far.  */
+/* Number of syntax errors so far.  */
 int yynerrs;
 
 
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int
-yyparse (YYPARSE_PARAM_ARG)
-     YYPARSE_PARAM_DECL
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
 {
   
   register int yystate;
@@ -904,7 +1034,7 @@ yyparse (YYPARSE_PARAM_ARG)
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
   /* Lookahead token as an internal (translated) token number.  */
-  int yychar1 = 0;
+  int yytoken = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -968,7 +1098,7 @@ yyparse (YYPARSE_PARAM_ARG)
  yysetstate:
   *yyssp = yystate;
 
-  if (yyssp >= yyss + yystacksize - 1)
+  if (yyss + yystacksize - 1 <= yyssp)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -1000,10 +1130,10 @@ yyparse (YYPARSE_PARAM_ARG)
       goto yyoverflowlab;
 # else
       /* Extend the stack our own way.  */
-      if (yystacksize >= YYMAXDEPTH)
+      if (YYMAXDEPTH <= yystacksize)
        goto yyoverflowlab;
       yystacksize *= 2;
-      if (yystacksize > YYMAXDEPTH)
+      if (YYMAXDEPTH < yystacksize)
        yystacksize = YYMAXDEPTH;
 
       {
@@ -1029,7 +1159,7 @@ yyparse (YYPARSE_PARAM_ARG)
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
                  (unsigned long int) yystacksize));
 
-      if (yyssp >= yyss + yystacksize - 1)
+      if (yyss + yystacksize - 1 <= yyssp)
        YYABORT;
     }
 
@@ -1054,39 +1184,28 @@ yybackup:
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
-
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  /* Convert token to internal form (in yychar1) for indexing tables with.  */
-
-  if (yychar <= 0)             /* This means end of input.  */
+  if (yychar <= YYEOF)
     {
-      yychar1 = 0;
-      yychar = YYEOF;          /* Don't call YYLEX any more.  */
-
+      yychar = yytoken = YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yychar1 = YYTRANSLATE (yychar);
-
-      /* We have to keep this `#if YYDEBUG', since we use variables
-        which are defined only if `YYDEBUG' is set.  */
-      YYDPRINTF ((stderr, "Next token is "));
-      YYDSYMPRINT ((stderr, yychar1, yylval));
-      YYDPRINTF ((stderr, "\n"));
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
     }
 
-  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
      detect an error, take that action.  */
-  yyn += yychar1;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
     goto yydefault;
   yyn = yytable[yyn];
   if (yyn <= 0)
@@ -1101,8 +1220,7 @@ yybackup:
     YYACCEPT;
 
   /* Shift the lookahead token.  */
-  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
-             yychar, yytname[yychar1]));
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
@@ -1148,435 +1266,463 @@ yyreduce:
   yyval = yyvsp[1-yylen];
 
 
-
-#if YYDEBUG
-  /* We have to keep this `#if YYDEBUG', since we use variables which
-     are defined only if `YYDEBUG' is set.  */
-  if (yydebug)
-    {
-      int yyi;
-
-      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
-                yyn - 1, yyrline[yyn]);
-
-      /* Print the symbols being reduced, and their result.  */
-      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
-       YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-    }
-#endif
+  YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 8:
-#line 96 "zconf.y"
-    { zconfprint("unexpected 'endmenu' statement"); }
+
+    { zconfprint("unexpected 'endmenu' statement"); ;}
     break;
 
   case 9:
-#line 97 "zconf.y"
-    { zconfprint("unexpected 'endif' statement"); }
+
+    { zconfprint("unexpected 'endif' statement"); ;}
     break;
 
   case 10:
-#line 98 "zconf.y"
-    { zconfprint("unexpected 'endchoice' statement"); }
+
+    { zconfprint("unexpected 'endchoice' statement"); ;}
     break;
 
   case 11:
-#line 99 "zconf.y"
-    { zconfprint("syntax error"); yyerrok; }
+
+    { zconfprint("syntax error"); yyerrok; ;}
     break;
 
-  case 17:
-#line 114 "zconf.y"
+  case 18:
+
     {
-       struct symbol *sym = sym_lookup(yyvsp[0].string, 0);
+       struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
        sym->flags |= SYMBOL_OPTIONAL;
        menu_add_entry(sym);
-       printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[0].string);
-}
+       printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
     break;
 
-  case 18:
-#line 122 "zconf.y"
+  case 19:
+
     {
        menu_end_entry();
        printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
-}
+;}
+    break;
+
+  case 20:
+
+    {
+       struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
+       sym->flags |= SYMBOL_OPTIONAL;
+       menu_add_entry(sym);
+       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
     break;
 
-  case 23:
-#line 133 "zconf.y"
-    { }
+  case 21:
+
+    {
+       if (current_entry->prompt)
+               current_entry->prompt->type = P_MENU;
+       else
+               zconfprint("warning: menuconfig statement without prompt");
+       menu_end_entry();
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+;}
     break;
 
-  case 24:
-#line 136 "zconf.y"
+  case 27:
+
     {
        menu_set_type(S_TRISTATE);
        printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
-}
+;}
+    break;
+
+  case 28:
+
+    {
+       menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
+       menu_set_type(S_TRISTATE);
+       printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+;}
     break;
 
-  case 25:
-#line 142 "zconf.y"
+  case 29:
+
     {
        menu_set_type(S_BOOLEAN);
        printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 26:
-#line 148 "zconf.y"
+  case 30:
+
+    {
+       menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
+       menu_set_type(S_BOOLEAN);
+       printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 31:
+
     {
        menu_set_type(S_INT);
        printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 27:
-#line 154 "zconf.y"
+  case 32:
+
     {
        menu_set_type(S_HEX);
        printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 28:
-#line 160 "zconf.y"
+  case 33:
+
     {
        menu_set_type(S_STRING);
        printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 29:
-#line 166 "zconf.y"
+  case 34:
+
     {
-       menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
+       menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 30:
-#line 172 "zconf.y"
+  case 35:
+
     {
-       menu_add_prop(P_DEFAULT, NULL, yyvsp[-1].symbol, yyvsp[0].expr);
+       menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 31:
-#line 180 "zconf.y"
+  case 36:
+
+    {
+       menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
+       printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 37:
+
+    {
+       menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
+       printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 38:
+
     {
        struct symbol *sym = sym_lookup(NULL, 0);
        sym->flags |= SYMBOL_CHOICE;
        menu_add_entry(sym);
-       menu_add_prop(P_CHOICE, NULL, NULL, NULL);
+       menu_add_expr(P_CHOICE, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 32:
-#line 189 "zconf.y"
+  case 39:
+
     {
        menu_end_entry();
        menu_add_menu();
-}
+;}
     break;
 
-  case 33:
-#line 195 "zconf.y"
+  case 40:
+
     {
        if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) {
                menu_end_menu();
                printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
        }
-}
+;}
     break;
 
-  case 35:
-#line 205 "zconf.y"
+  case 42:
+
     {
        printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
        zconfnerrs++;
-}
+;}
     break;
 
-  case 41:
-#line 219 "zconf.y"
+  case 48:
+
     {
-       menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
+       menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 42:
-#line 225 "zconf.y"
+  case 49:
+
+    {
+       menu_set_type(S_TRISTATE);
+       printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 50:
+
+    {
+       menu_set_type(S_BOOLEAN);
+       printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+;}
+    break;
+
+  case 51:
+
     {
        current_entry->sym->flags |= SYMBOL_OPTIONAL;
        printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 43:
-#line 231 "zconf.y"
+  case 52:
+
     {
-       menu_add_prop(P_DEFAULT, NULL, yyvsp[0].symbol, NULL);
-       //current_choice->prop->def = ;
+       menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 46:
-#line 245 "zconf.y"
+  case 55:
+
     {
        printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
        menu_add_entry(NULL);
-       //current_entry->prompt = menu_add_prop(T_IF, NULL, NULL, );
-       menu_add_dep(yyvsp[0].expr);
+       menu_add_dep(yyvsp[-1].expr);
        menu_end_entry();
        menu_add_menu();
-}
+;}
     break;
 
-  case 47:
-#line 255 "zconf.y"
+  case 56:
+
     {
        if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) {
                menu_end_menu();
                printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
        }
-}
+;}
     break;
 
-  case 49:
-#line 265 "zconf.y"
+  case 58:
+
     {
        printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
        zconfnerrs++;
-}
+;}
     break;
 
-  case 54:
-#line 280 "zconf.y"
+  case 63:
+
     {
        menu_add_entry(NULL);
-       menu_add_prop(P_MENU, yyvsp[0].string, NULL, NULL);
+       menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 55:
-#line 287 "zconf.y"
+  case 64:
+
     {
        menu_end_entry();
        menu_add_menu();
-}
+;}
     break;
 
-  case 56:
-#line 293 "zconf.y"
+  case 65:
+
     {
        if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) {
                menu_end_menu();
                printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
        }
-}
+;}
     break;
 
-  case 58:
-#line 303 "zconf.y"
+  case 67:
+
     {
        printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
        zconfnerrs++;
-}
+;}
     break;
 
-  case 63:
-#line 313 "zconf.y"
-    { zconfprint("invalid menu option"); yyerrok; }
+  case 72:
+
+    { zconfprint("invalid menu option"); yyerrok; ;}
     break;
 
-  case 64:
-#line 317 "zconf.y"
+  case 73:
+
     {
-       yyval.string = yyvsp[0].string;
-       printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[0].string);
-}
+       yyval.string = yyvsp[-1].string;
+       printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
+;}
     break;
 
-  case 65:
-#line 323 "zconf.y"
+  case 74:
+
     {
-       zconf_nextfile(yyvsp[-1].string);
-}
+       zconf_nextfile(yyvsp[0].string);
+;}
     break;
 
-  case 66:
-#line 330 "zconf.y"
+  case 75:
+
     {
        menu_add_entry(NULL);
-       menu_add_prop(P_COMMENT, yyvsp[0].string, NULL, NULL);
+       menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 67:
-#line 337 "zconf.y"
+  case 76:
+
     {
        menu_end_entry();
-}
+;}
     break;
 
-  case 68:
-#line 344 "zconf.y"
+  case 77:
+
     {
        printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
        zconf_starthelp();
-}
+;}
     break;
 
-  case 69:
-#line 350 "zconf.y"
+  case 78:
+
     {
        current_entry->sym->help = yyvsp[0].string;
-}
+;}
     break;
 
-  case 72:
-#line 359 "zconf.y"
-    { }
-    break;
+  case 82:
 
-  case 73:
-#line 362 "zconf.y"
     {
-       menu_add_dep(yyvsp[0].expr);
+       menu_add_dep(yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 74:
-#line 367 "zconf.y"
+  case 83:
+
     {
-       menu_add_dep(yyvsp[0].expr);
+       menu_add_dep(yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 75:
-#line 372 "zconf.y"
+  case 84:
+
     {
-       menu_add_dep(yyvsp[0].expr);
+       menu_add_dep(yyvsp[-1].expr);
        printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
-}
+;}
     break;
 
-  case 77:
-#line 382 "zconf.y"
-    {
-       menu_add_prop(P_PROMPT, yyvsp[0].string, NULL, NULL);
-}
-    break;
+  case 86:
 
-  case 78:
-#line 386 "zconf.y"
     {
-       menu_add_prop(P_PROMPT, yyvsp[-2].string, NULL, yyvsp[0].expr);
-}
+       menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
+;}
     break;
 
-  case 81:
-#line 394 "zconf.y"
-    { yyval.token = T_ENDMENU; }
+  case 89:
+
+    { yyval.token = T_ENDMENU; ;}
     break;
 
-  case 82:
-#line 395 "zconf.y"
-    { yyval.token = T_ENDCHOICE; }
+  case 90:
+
+    { yyval.token = T_ENDCHOICE; ;}
     break;
 
-  case 83:
-#line 396 "zconf.y"
-    { yyval.token = T_ENDIF; }
+  case 91:
+
+    { yyval.token = T_ENDIF; ;}
     break;
 
-  case 86:
-#line 402 "zconf.y"
-    { yyval.expr = NULL; }
+  case 94:
+
+    { yyval.expr = NULL; ;}
     break;
 
-  case 87:
-#line 403 "zconf.y"
-    { yyval.expr = yyvsp[0].expr; }
+  case 95:
+
+    { yyval.expr = yyvsp[0].expr; ;}
     break;
 
-  case 88:
-#line 406 "zconf.y"
-    { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); }
+  case 96:
+
+    { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
     break;
 
-  case 89:
-#line 407 "zconf.y"
-    { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); }
+  case 97:
+
+    { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
 
-  case 90:
-#line 408 "zconf.y"
-    { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); }
+  case 98:
+
+    { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
     break;
 
-  case 91:
-#line 409 "zconf.y"
-    { yyval.expr = yyvsp[-1].expr; }
+  case 99:
+
+    { yyval.expr = yyvsp[-1].expr; ;}
     break;
 
-  case 92:
-#line 410 "zconf.y"
-    { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); }
+  case 100:
+
+    { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
     break;
 
-  case 93:
-#line 411 "zconf.y"
-    { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); }
+  case 101:
+
+    { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
 
-  case 94:
-#line 412 "zconf.y"
-    { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); }
+  case 102:
+
+    { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
     break;
 
-  case 95:
-#line 415 "zconf.y"
-    { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); }
+  case 103:
+
+    { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
     break;
 
-  case 96:
-#line 416 "zconf.y"
-    { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); }
+  case 104:
+
+    { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
     break;
 
 
     }
 
-/* Line 1016 of /usr/share/bison/yacc.c.  */
-#line 1565 "zconf.tab.c"
+/* Line 999 of yacc.c.  */
+
 \f
   yyvsp -= yylen;
   yyssp -= yylen;
 
 
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "state stack now");
-      while (yyssp1 != yyssp)
-       YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
+  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
@@ -1621,12 +1767,12 @@ yyerrlab:
               yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
            if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
              yysize += yystrlen (yytname[yyx]) + 15, yycount++;
-         yysize += yystrlen ("parse error, unexpected ") + 1;
+         yysize += yystrlen ("syntax error, unexpected ") + 1;
          yysize += yystrlen (yytname[yytype]);
          yymsg = (char *) YYSTACK_ALLOC (yysize);
          if (yymsg != 0)
            {
-             char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+             char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
              yyp = yystpcpy (yyp, yytname[yytype]);
 
              if (yycount < 5)
@@ -1647,19 +1793,15 @@ yyerrlab:
              YYSTACK_FREE (yymsg);
            }
          else
-           yyerror ("parse error; also virtual memory exhausted");
+           yyerror ("syntax error; also virtual memory exhausted");
        }
       else
 #endif /* YYERROR_VERBOSE */
-       yyerror ("parse error");
+       yyerror ("syntax error");
     }
-  goto yyerrlab1;
 
 
-/*----------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action.  |
-`----------------------------------------------------*/
-yyerrlab1:
+
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
@@ -1671,28 +1813,30 @@ yyerrlab1:
          /* Pop the error token.  */
           YYPOPSTACK;
          /* Pop the rest of the stack.  */
-         while (yyssp > yyss)
+         while (yyss < yyssp)
            {
-             YYDPRINTF ((stderr, "Error: popping "));
-             YYDSYMPRINT ((stderr,
-                           yystos[*yyssp],
-                           *yyvsp));
-             YYDPRINTF ((stderr, "\n"));
-             yydestruct (yystos[*yyssp], *yyvsp);
+             YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+             yydestruct (yystos[*yyssp], yyvsp);
              YYPOPSTACK;
            }
          YYABORT;
         }
 
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-                 yychar, yytname[yychar1]));
-      yydestruct (yychar1, yylval);
+      YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+      yydestruct (yytoken, &yylval);
       yychar = YYEMPTY;
+
     }
 
   /* Else will try to reuse lookahead token after shifting the error
      token.  */
+  goto yyerrlab1;
 
+
+/*----------------------------------------------------.
+| yyerrlab1 -- error raised explicitly by an action.  |
+`----------------------------------------------------*/
+yyerrlab1:
   yyerrstatus = 3;     /* Each real token shifted decrements this.  */
 
   for (;;)
@@ -1713,26 +1857,12 @@ yyerrlab1:
       if (yyssp == yyss)
        YYABORT;
 
-      YYDPRINTF ((stderr, "Error: popping "));
-      YYDSYMPRINT ((stderr,
-                   yystos[*yyssp], *yyvsp));
-      YYDPRINTF ((stderr, "\n"));
-
-      yydestruct (yystos[yystate], *yyvsp);
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
       yyvsp--;
       yystate = *--yyssp;
 
-
-#if YYDEBUG
-      if (yydebug)
-       {
-         short *yyssp1 = yyss - 1;
-         YYFPRINTF (stderr, "Error: state stack now");
-         while (yyssp1 != yyssp)
-           YYFPRINTF (stderr, " %d", *++yyssp1);
-         YYFPRINTF (stderr, "\n");
-       }
-#endif
+      YY_STACK_PRINT (yyss, yyssp);
     }
 
   if (yyn == YYFINAL)
@@ -1780,24 +1910,32 @@ yyreturn:
 }
 
 
-#line 419 "zconf.y"
+
 
 
 void conf_parse(const char *name)
 {
+       struct symbol *sym;
+       int i;
+
        zconf_initscan(name);
 
        sym_init();
        menu_init();
-       rootmenu.prompt = menu_add_prop(P_MENU, "uClibc Configuration", NULL, NULL);
+       modules_sym = sym_lookup("MODULES", 0);
+       rootmenu.prompt = menu_add_prop(P_MENU, "Linux Kernel Configuration", NULL, NULL);
 
        //zconfdebug = 1;
        zconfparse();
        if (zconfnerrs)
                exit(1);
        menu_finalize(&rootmenu);
-
-       modules_sym = sym_lookup("MODULES", 0);
+       for_all_symbols(i, sym) {
+                if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
+                        printf("\n");
+               else
+                       sym->flags |= SYMBOL_CHECK_DONE;
+        }
 
        sym_change_count = 1;
 }
@@ -1813,7 +1951,7 @@ const char *zconf_tokenname(int token)
        case T_ENDIF:           return "endif";
        }
        return "<token>";
-} 
+}
 
 static bool zconf_endtoken(int token, int starttoken, int endtoken)
 {
@@ -1835,7 +1973,7 @@ static void zconfprint(const char *err, ...)
 {
        va_list ap;
 
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
        va_start(ap, err);
        vfprintf(stderr, err, ap);
        va_end(ap);
@@ -1844,7 +1982,7 @@ static void zconfprint(const char *err, ...)
 
 static void zconferror(const char *err)
 {
-       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno(), err);
+       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
 }
 
 void print_quoted_string(FILE *out, const char *str)
@@ -1869,8 +2007,6 @@ void print_symbol(FILE *out, struct menu *menu)
        struct symbol *sym = menu->sym;
        struct property *prop;
 
-       //sym->flags |= SYMBOL_PRINTED;
-
        if (sym_is_choice(sym))
                fprintf(out, "choice\n");
        else
@@ -1895,13 +2031,6 @@ void print_symbol(FILE *out, struct menu *menu)
                fputs("  ???\n", out);
                break;
        }
-#if 0
-       if (!expr_is_yes(sym->dep)) {
-               fputs("  depends ", out);
-               expr_fprint(sym->dep, out);
-               fputc('\n', out);
-       }
-#endif
        for (prop = sym->prop; prop; prop = prop->next) {
                if (prop->menu != menu)
                        continue;
@@ -1909,25 +2038,18 @@ void print_symbol(FILE *out, struct menu *menu)
                case P_PROMPT:
                        fputs("  prompt ", out);
                        print_quoted_string(out, prop->text);
-                       if (prop->def) {
-                               fputc(' ', out);
-                               if (prop->def->flags & SYMBOL_CONST)
-                                       print_quoted_string(out, prop->def->name);
-                               else
-                                       fputs(prop->def->name, out);
-                       }
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs(" if ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                        }
                        fputc('\n', out);
                        break;
                case P_DEFAULT:
                        fputs( "  default ", out);
-                       print_quoted_string(out, prop->def->name);
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       expr_fprint(prop->expr, out);
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs(" if ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                        }
                        fputc('\n', out);
                        break;
@@ -1950,7 +2072,6 @@ void print_symbol(FILE *out, struct menu *menu)
 
 void zconfdump(FILE *out)
 {
-       //struct file *file;
        struct property *prop;
        struct symbol *sym;
        struct menu *menu;
@@ -1961,11 +2082,6 @@ void zconfdump(FILE *out)
                        print_symbol(out, menu);
                else if ((prop = menu->prompt)) {
                        switch (prop->type) {
-                       //case T_MAINMENU:
-                       //      fputs("\nmainmenu ", out);
-                       //      print_quoted_string(out, prop->text);
-                       //      fputs("\n", out);
-                       //      break;
                        case P_COMMENT:
                                fputs("\ncomment ", out);
                                print_quoted_string(out, prop->text);
@@ -1976,19 +2092,12 @@ void zconfdump(FILE *out)
                                print_quoted_string(out, prop->text);
                                fputs("\n", out);
                                break;
-                       //case T_SOURCE:
-                       //      fputs("\nsource ", out);
-                       //      print_quoted_string(out, prop->text);
-                       //      fputs("\n", out);
-                       //      break;
-                       //case T_IF:
-                       //      fputs("\nif\n", out);
                        default:
                                ;
                        }
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs("  depends ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                                fputc('\n', out);
                        }
                        fputs("\n", out);
@@ -2015,3 +2124,4 @@ void zconfdump(FILE *out)
 #include "symbol.c"
 #include "menu.c"
 
+
index a058759..459b690 100644 (file)
@@ -27,7 +27,7 @@ struct symbol *symbol_hash[257];
 
 #define YYERROR_VERBOSE
 %}
-%expect 36
+%expect 40
 
 %union
 {
@@ -46,6 +46,7 @@ struct symbol *symbol_hash[257];
 %token T_ENDCHOICE
 %token T_COMMENT
 %token T_CONFIG
+%token T_MENUCONFIG
 %token T_HELP
 %token <string> T_HELPTEXT
 %token T_IF
@@ -56,17 +57,22 @@ struct symbol *symbol_hash[257];
 %token T_PROMPT
 %token T_DEFAULT
 %token T_TRISTATE
+%token T_DEF_TRISTATE
 %token T_BOOLEAN
+%token T_DEF_BOOLEAN
+%token T_STRING
 %token T_INT
 %token T_HEX
 %token <string> T_WORD
-%token <string> T_STRING
+%token <string> T_WORD_QUOTE
 %token T_UNEQUAL
 %token T_EOF
 %token T_EOL
 %token T_CLOSE_PAREN
 %token T_OPEN_PAREN
 %token T_ON
+%token T_SELECT
+%token T_RANGE
 
 %left T_OR
 %left T_AND
@@ -103,14 +109,15 @@ common_block:
          if_stmt
        | comment_stmt
        | config_stmt
+       | menuconfig_stmt
        | source_stmt
        | nl_or_eof
 ;
 
 
-/* config entry */
+/* config/menuconfig entry */
 
-config_entry_start: T_CONFIG T_WORD
+config_entry_start: T_CONFIG T_WORD T_EOL
 {
        struct symbol *sym = sym_lookup($2, 0);
        sym->flags |= SYMBOL_OPTIONAL;
@@ -118,74 +125,118 @@ config_entry_start: T_CONFIG T_WORD
        printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
 };
 
-config_stmt: config_entry_start T_EOL config_option_list
+config_stmt: config_entry_start config_option_list
 {
        menu_end_entry();
        printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
 };
 
+menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
+{
+       struct symbol *sym = sym_lookup($2, 0);
+       sym->flags |= SYMBOL_OPTIONAL;
+       menu_add_entry(sym);
+       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
+};
+
+menuconfig_stmt: menuconfig_entry_start config_option_list
+{
+       if (current_entry->prompt)
+               current_entry->prompt->type = P_MENU;
+       else
+               zconfprint("warning: menuconfig statement without prompt");
+       menu_end_entry();
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
 config_option_list:
          /* empty */
-       | config_option_list config_option T_EOL
-       | config_option_list depends T_EOL
+       | config_option_list config_option
+       | config_option_list depends
        | config_option_list help
        | config_option_list T_EOL
-{ };
+;
 
-config_option: T_TRISTATE prompt_stmt_opt
+config_option: T_TRISTATE prompt_stmt_opt T_EOL
 {
        menu_set_type(S_TRISTATE);
        printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_BOOLEAN prompt_stmt_opt
+config_option: T_DEF_TRISTATE expr if_expr T_EOL
+{
+       menu_add_expr(P_DEFAULT, $2, $3);
+       menu_set_type(S_TRISTATE);
+       printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_BOOLEAN prompt_stmt_opt T_EOL
 {
        menu_set_type(S_BOOLEAN);
        printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_INT prompt_stmt_opt
+config_option: T_DEF_BOOLEAN expr if_expr T_EOL
+{
+       menu_add_expr(P_DEFAULT, $2, $3);
+       menu_set_type(S_BOOLEAN);
+       printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_INT prompt_stmt_opt T_EOL
 {
        menu_set_type(S_INT);
        printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_HEX prompt_stmt_opt
+config_option: T_HEX prompt_stmt_opt T_EOL
 {
        menu_set_type(S_HEX);
        printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_STRING prompt_stmt_opt
+config_option: T_STRING prompt_stmt_opt T_EOL
 {
        menu_set_type(S_STRING);
        printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_PROMPT prompt if_expr
+config_option: T_PROMPT prompt if_expr T_EOL
 {
-       menu_add_prop(P_PROMPT, $2, NULL, $3);
+       menu_add_prompt(P_PROMPT, $2, $3);
        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 };
 
-config_option: T_DEFAULT symbol if_expr
+config_option: T_DEFAULT expr if_expr T_EOL
 {
-       menu_add_prop(P_DEFAULT, NULL, $2, $3);
+       menu_add_expr(P_DEFAULT, $2, $3);
        printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
 };
 
+config_option: T_SELECT T_WORD if_expr T_EOL
+{
+       menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
+       printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_RANGE symbol symbol if_expr T_EOL
+{
+       menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
+       printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+};
+
 /* choice entry */
 
-choice: T_CHOICE
+choice: T_CHOICE T_EOL
 {
        struct symbol *sym = sym_lookup(NULL, 0);
        sym->flags |= SYMBOL_CHOICE;
        menu_add_entry(sym);
-       menu_add_prop(P_CHOICE, NULL, NULL, NULL);
+       menu_add_expr(P_CHOICE, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
 };
 
-choice_entry: choice T_EOL choice_option_list
+choice_entry: choice choice_option_list
 {
        menu_end_entry();
        menu_add_menu();
@@ -200,7 +251,7 @@ choice_end: end
 };
 
 choice_stmt:
-         choice_entry choice_block choice_end T_EOL
+         choice_entry choice_block choice_end
        | choice_entry choice_block
 {
        printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
@@ -209,28 +260,39 @@ choice_stmt:
 
 choice_option_list:
          /* empty */
-       | choice_option_list choice_option T_EOL
-       | choice_option_list depends T_EOL
+       | choice_option_list choice_option
+       | choice_option_list depends
        | choice_option_list help
        | choice_option_list T_EOL
 ;
 
-choice_option: T_PROMPT prompt if_expr
+choice_option: T_PROMPT prompt if_expr T_EOL
 {
-       menu_add_prop(P_PROMPT, $2, NULL, $3);
+       menu_add_prompt(P_PROMPT, $2, $3);
        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
 };
 
-choice_option: T_OPTIONAL
+choice_option: T_TRISTATE prompt_stmt_opt T_EOL
+{
+       menu_set_type(S_TRISTATE);
+       printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_BOOLEAN prompt_stmt_opt T_EOL
+{
+       menu_set_type(S_BOOLEAN);
+       printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_OPTIONAL T_EOL
 {
        current_entry->sym->flags |= SYMBOL_OPTIONAL;
        printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
 };
 
-choice_option: T_DEFAULT symbol
+choice_option: T_DEFAULT T_WORD if_expr T_EOL
 {
-       menu_add_prop(P_DEFAULT, NULL, $2, NULL);
-       //current_choice->prop->def = $2;
+       menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
        printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
 };
 
@@ -241,11 +303,10 @@ choice_block:
 
 /* if entry */
 
-if: T_IF expr
+if: T_IF expr T_EOL
 {
        printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
        menu_add_entry(NULL);
-       //current_entry->prompt = menu_add_prop(T_IF, NULL, NULL, $2);
        menu_add_dep($2);
        menu_end_entry();
        menu_add_menu();
@@ -260,8 +321,8 @@ if_end: end
 };
 
 if_stmt:
-         if T_EOL if_block if_end T_EOL
-       | if T_EOL if_block
+         if if_block if_end
+       | if if_block
 {
        printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
        zconfnerrs++;
@@ -276,14 +337,14 @@ if_block:
 
 /* menu entry */
 
-menu: T_MENU prompt
+menu: T_MENU prompt T_EOL
 {
        menu_add_entry(NULL);
        menu_add_prop(P_MENU, $2, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
 };
 
-menu_entry: menu T_EOL depends_list
+menu_entry: menu depends_list
 {
        menu_end_entry();
        menu_add_menu();
@@ -298,7 +359,7 @@ menu_end: end
 };
 
 menu_stmt:
-         menu_entry menu_block menu_end T_EOL
+         menu_entry menu_block menu_end
        | menu_entry menu_block
 {
        printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
@@ -313,27 +374,27 @@ menu_block:
        | menu_block error T_EOL                { zconfprint("invalid menu option"); yyerrok; }
 ;
 
-source: T_SOURCE prompt
+source: T_SOURCE prompt T_EOL
 {
        $$ = $2;
        printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
 };
 
-source_stmt: source T_EOL
+source_stmt: source
 {
        zconf_nextfile($1);
 };
 
 /* comment entry */
 
-comment: T_COMMENT prompt
+comment: T_COMMENT prompt T_EOL
 {
        menu_add_entry(NULL);
        menu_add_prop(P_COMMENT, $2, NULL, NULL);
        printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
 };
 
-comment_stmt: comment T_EOL depends_list
+comment_stmt: comment depends_list
 {
        menu_end_entry();
 };
@@ -354,21 +415,21 @@ help: help_start T_HELPTEXT
 /* depends option */
 
 depends_list:    /* empty */
-               | depends_list depends T_EOL
+               | depends_list depends
                | depends_list T_EOL
-{ };
+;
 
-depends: T_DEPENDS T_ON expr
+depends: T_DEPENDS T_ON expr T_EOL
 {
        menu_add_dep($3);
        printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
 }
-       | T_DEPENDS expr
+       | T_DEPENDS expr T_EOL
 {
        menu_add_dep($2);
        printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
 }
-       | T_REQUIRES expr
+       | T_REQUIRES expr T_EOL
 {
        menu_add_dep($2);
        printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
@@ -378,22 +439,18 @@ depends: T_DEPENDS T_ON expr
 
 prompt_stmt_opt:
          /* empty */
-       | prompt
-{
-       menu_add_prop(P_PROMPT, $1, NULL, NULL);
-}
-       | prompt T_IF expr
+       | prompt if_expr
 {
-       menu_add_prop(P_PROMPT, $1, NULL, $3);
+       menu_add_prop(P_PROMPT, $1, NULL, $2);
 };
 
 prompt:          T_WORD
-       | T_STRING
+       | T_WORD_QUOTE
 ;
 
-end:     T_ENDMENU             { $$ = T_ENDMENU; }
-       | T_ENDCHOICE           { $$ = T_ENDCHOICE; }
-       | T_ENDIF               { $$ = T_ENDIF; }
+end:     T_ENDMENU nl_or_eof   { $$ = T_ENDMENU; }
+       | T_ENDCHOICE nl_or_eof { $$ = T_ENDCHOICE; }
+       | T_ENDIF nl_or_eof     { $$ = T_ENDIF; }
 ;
 
 nl_or_eof:
@@ -413,26 +470,34 @@ expr:       symbol                                { $$ = expr_alloc_symbol($1); }
 ;
 
 symbol:          T_WORD        { $$ = sym_lookup($1, 0); free($1); }
-       | T_STRING      { $$ = sym_lookup($1, 1); free($1); }
+       | T_WORD_QUOTE  { $$ = sym_lookup($1, 1); free($1); }
 ;
 
 %%
 
 void conf_parse(const char *name)
 {
+       struct symbol *sym;
+       int i;
+
        zconf_initscan(name);
 
        sym_init();
        menu_init();
-       rootmenu.prompt = menu_add_prop(P_MENU, "uClibc Configuration", NULL, NULL);
+       modules_sym = sym_lookup("MODULES", 0);
+       rootmenu.prompt = menu_add_prop(P_MENU, "Linux Kernel Configuration", NULL, NULL);
 
        //zconfdebug = 1;
        zconfparse();
        if (zconfnerrs)
                exit(1);
        menu_finalize(&rootmenu);
-
-       modules_sym = sym_lookup("MODULES", 0);
+       for_all_symbols(i, sym) {
+                if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
+                        printf("\n");
+               else
+                       sym->flags |= SYMBOL_CHECK_DONE;
+        }
 
        sym_change_count = 1;
 }
@@ -448,7 +513,7 @@ const char *zconf_tokenname(int token)
        case T_ENDIF:           return "endif";
        }
        return "<token>";
-} 
+}
 
 static bool zconf_endtoken(int token, int starttoken, int endtoken)
 {
@@ -470,7 +535,7 @@ static void zconfprint(const char *err, ...)
 {
        va_list ap;
 
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
        va_start(ap, err);
        vfprintf(stderr, err, ap);
        va_end(ap);
@@ -479,7 +544,7 @@ static void zconfprint(const char *err, ...)
 
 static void zconferror(const char *err)
 {
-       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno(), err);
+       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
 }
 
 void print_quoted_string(FILE *out, const char *str)
@@ -504,8 +569,6 @@ void print_symbol(FILE *out, struct menu *menu)
        struct symbol *sym = menu->sym;
        struct property *prop;
 
-       //sym->flags |= SYMBOL_PRINTED;
-
        if (sym_is_choice(sym))
                fprintf(out, "choice\n");
        else
@@ -530,13 +593,6 @@ void print_symbol(FILE *out, struct menu *menu)
                fputs("  ???\n", out);
                break;
        }
-#if 0
-       if (!expr_is_yes(sym->dep)) {
-               fputs("  depends ", out);
-               expr_fprint(sym->dep, out);
-               fputc('\n', out);
-       }
-#endif
        for (prop = sym->prop; prop; prop = prop->next) {
                if (prop->menu != menu)
                        continue;
@@ -544,25 +600,18 @@ void print_symbol(FILE *out, struct menu *menu)
                case P_PROMPT:
                        fputs("  prompt ", out);
                        print_quoted_string(out, prop->text);
-                       if (prop->def) {
-                               fputc(' ', out);
-                               if (prop->def->flags & SYMBOL_CONST)
-                                       print_quoted_string(out, prop->def->name);
-                               else
-                                       fputs(prop->def->name, out);
-                       }
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs(" if ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                        }
                        fputc('\n', out);
                        break;
                case P_DEFAULT:
                        fputs( "  default ", out);
-                       print_quoted_string(out, prop->def->name);
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       expr_fprint(prop->expr, out);
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs(" if ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                        }
                        fputc('\n', out);
                        break;
@@ -585,7 +634,6 @@ void print_symbol(FILE *out, struct menu *menu)
 
 void zconfdump(FILE *out)
 {
-       //struct file *file;
        struct property *prop;
        struct symbol *sym;
        struct menu *menu;
@@ -596,11 +644,6 @@ void zconfdump(FILE *out)
                        print_symbol(out, menu);
                else if ((prop = menu->prompt)) {
                        switch (prop->type) {
-                       //case T_MAINMENU:
-                       //      fputs("\nmainmenu ", out);
-                       //      print_quoted_string(out, prop->text);
-                       //      fputs("\n", out);
-                       //      break;
                        case P_COMMENT:
                                fputs("\ncomment ", out);
                                print_quoted_string(out, prop->text);
@@ -611,19 +654,12 @@ void zconfdump(FILE *out)
                                print_quoted_string(out, prop->text);
                                fputs("\n", out);
                                break;
-                       //case T_SOURCE:
-                       //      fputs("\nsource ", out);
-                       //      print_quoted_string(out, prop->text);
-                       //      fputs("\n", out);
-                       //      break;
-                       //case T_IF:
-                       //      fputs("\nif\n", out);
                        default:
                                ;
                        }
-                       if (!expr_is_yes(E_EXPR(prop->visible))) {
+                       if (!expr_is_yes(prop->visible.expr)) {
                                fputs("  depends ", out);
-                               expr_fprint(E_EXPR(prop->visible), out);
+                               expr_fprint(prop->visible.expr, out);
                                fputc('\n', out);
                        }
                        fputs("\n", out);