Merge/rework config system per the latest from linux-2.6.0-test2.
authorandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Tue, 5 Aug 2003 02:18:25 +0000 (02:18 +0000)
committerandersen <andersen@69ca8d6d-28ef-0310-b511-8ec308f3f277>
Tue, 5 Aug 2003 02:18:25 +0000 (02:18 +0000)
Fix the config bugs revealed by the updated config system.
 -Erik

git-svn-id: svn://busybox.net/trunk/busybox@7160 69ca8d6d-28ef-0310-b511-8ec308f3f277

15 files changed:
scripts/config/conf.c
scripts/config/confdata.c
scripts/config/expr.c
scripts/config/expr.h
scripts/config/lex.zconf.c_shipped
scripts/config/lkc.h
scripts/config/lkc_proto.h
scripts/config/mconf.c
scripts/config/menu.c
scripts/config/symbol.c
scripts/config/zconf.l
scripts/config/zconf.tab.c_shipped
scripts/config/zconf.y
shell/Config.in
sysdeps/linux/Config.in

index 884175e..013a679 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 BusyBox!\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 0d24ac5..c6a2864 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,29 +258,50 @@ 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 header file: don't edit\n"
-                      " */\n\n"
-                      "#define AUTOCONF_INCLUDED\n\n"
-                      "/* Version Number */\n"
-                      "#define BB_VER \"%s\"\n"
-                      "#define BB_BT \"%s\"\n\n",
-                      getenv("VERSION"),
-                      getenv("BUILDTIME")
-       );
+       if (out_h)
+               fprintf(out_h, "/*\n"
+                            " * Automatically generated header file: don't edit\n"
+                            " */\n\n"
+                            "#define AUTOCONF_INCLUDED\n\n"
+                            "/* Version Number */\n"
+                            "#define BB_VER \"%s\"\n"
+                            "#define BB_BT \"%s\"\n\n",
+                            getenv("VERSION"),
+                            getenv("BUILDTIME"));
 
        if (!sym_change_count)
                sym_clear_all_valid();
@@ -265,10 +317,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))
@@ -277,7 +330,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) {
@@ -286,17 +339,20 @@ 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:
 #if 0
+                               case mod:
                                        fprintf(out, "%s=m\n", sym->name);
-                                       fprintf(out_h, "#define __%s__MODULE 1\n", sym->name);
-#endif
+                                       if (out_h)
+                                               fprintf(out_h, "#define %s_MODULE 1\n", sym->name);
                                        break;
+#endif
                                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;
@@ -304,34 +360,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;
                        }
                }
@@ -351,18 +413,19 @@ int conf_write(const char *name)
                }
        }
        fclose(out);
-       fclose(out_h);
-
-       if (!name) {
+       if (out_h) {
+               fclose(out_h);
                rename(".tmpconfig.h", "include/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 df10281..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/busybox/scripts/config/lex.zconf.c_shipped,v 1.1 2002/12/05 08:41:07 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 - 1);
+               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 1ea512e..739b3b4 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 --->.  "
@@ -65,7 +66,7 @@ load_config_help[] =
        "configurations available on a single machine.\n"
        "\n"
        "If you have saved a previous configuration in a file other than the\n"
-       "BusyBox default, entering the name of the file here will allow you\n"
+       "BusyBox's default, entering the name of the file here will allow you\n"
        "to modify that configuration.\n"
        "\n"
        "If you are uncertain, then you have probably never used alternate\n"
@@ -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, "BusyBox v%s Configuration",
+       snprintf(menu_backtitle, 128, "BusyBox v%s Configuration",
                sym_get_string_value(sym));
 
        mode = getenv("MENUCONFIG_MODE");
index 3d3b4d1..6e075f8 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));
 
-