carl9170: Update to latest upstream 1.4 v1.4
authorJason Self <j@jxself.org>
Sat, 16 Jan 2021 18:11:26 +0000 (10:11 -0800)
committerJason Self <j@jxself.org>
Sat, 16 Jan 2021 18:11:26 +0000 (10:11 -0800)
17 files changed:
WHENCE
carl9170fw/config/.gitignore
carl9170fw/config/CMakeLists.txt
carl9170fw/config/conf.c
carl9170fw/config/confdata.c
carl9170fw/config/expr.c
carl9170fw/config/expr.h
carl9170fw/config/lexer.l [new file with mode: 0644]
carl9170fw/config/lkc.h
carl9170fw/config/lkc_proto.h
carl9170fw/config/parser.y [new file with mode: 0644]
carl9170fw/config/preprocess.c
carl9170fw/config/symbol.c
carl9170fw/config/zconf.l [deleted file]
carl9170fw/config/zconf.y [deleted file]
carl9170fw/toolchain/Makefile
carl9170fw/toolchain/SHA256SUMS

diff --git a/WHENCE b/WHENCE
index cffa41d9c252ad2864bbbffd27d9f0fa1a127ace..65d172492fc6959e4ebebb659d4fc105a7f33411 100644 (file)
--- a/WHENCE
+++ b/WHENCE
@@ -154,8 +154,8 @@ From https://git.kernel.org/pub/scm/utils/cis-tools/cis-tools.git
 
 Driver: carl9170 -- Atheros AR9170 802.11 draft-n USB driver
 
-Version: Based on commit 001384147050b9cd9daadb4d3115cc0f13f5b319
-dated May 5 2019.
+Version: Based on commit bdb09091452a302db607b14c9025a91d9c09405a
+dated July 25 2020.
 
 Licence: GPLv2 or later.
 
index f4679a3709fd3b538476175e8ed15050aeef4e00..c68f45bdf587a60aabdee07d25c10568b7144a0f 100644 (file)
@@ -1,7 +1,4 @@
-zconf.hash.c
-zconf.tab.c
 conf
-lex.backup
-zconf.lex.c
-zconf.tab.h
-
+parser.tab.c
+parser.tab.h
+lexer.lex.c
index 23e7218cfd9edbdba94907332d9ec2ae38a377ca..5b341fcd213d2235f700d6e1189807e17a3c7119 100644 (file)
@@ -11,13 +11,13 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
 
 file(MAKE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/../include/generated")
 
-BISON_TARGET(zconf zconf.y zconf.tab.c COMPILE_FLAGS "-l -b zconf -p yy -t")
-FLEX_TARGET(zconfscan zconf.l zconf.lex.c COMPILE_FLAGS "-Pyy -L")
+BISON_TARGET(parser parser.y parser.tab.c COMPILE_FLAGS "-l -b parser -p yy -t")
+FLEX_TARGET(lexer lexer.l lexer.lex.c COMPILE_FLAGS "-Pyy -L")
 
-SET(zconf_deps ${FLEX_zconfscan_OUTPUTS})
-SET_SOURCE_FILES_PROPERTIES(${BISON_zconf_OUTPUTS}
-      PROPERTIES OBJECT_DEPENDS "${zconf_deps}")
+SET(parser_deps ${FLEX_lexer_OUTPUTS})
+SET_SOURCE_FILES_PROPERTIES(${BISON_parser_OUTPUTS}
+      PROPERTIES OBJECT_DEPENDS "${parser_deps}")
 
-set(conf_src conf.c symbol.c confdata.c expr.c preprocess.c ${BISON_zconf_OUTPUTS} ${FLEX_zconfscan_OUTPUTS})
+set(conf_src conf.c util.c symbol.c confdata.c expr.c preprocess.c ${BISON_parser_OUTPUTS} ${FLEX_lexer_OUTPUTS})
 
 add_executable(conf ${conf_src})
index 2949b7d983193e8ae9eb7e26d4612e1f0827dd4b..5f1758c73ccf1762114c542ce08bbd5340822550 100644 (file)
@@ -32,6 +32,7 @@ enum input_mode {
        defconfig,
        savedefconfig,
        listnewconfig,
+       helpnewconfig,
        olddefconfig,
 };
 static enum input_mode input_mode = oldaskconfig;
@@ -90,7 +91,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
        line[0] = '\n';
        line[1] = 0;
 
-       if (!sym_is_changable(sym)) {
+       if (!sym_is_changeable(sym)) {
                printf("%s\n", def);
                line[0] = '\n';
                line[1] = 0;
@@ -234,7 +235,7 @@ static int conf_choice(struct menu *menu)
 
        sym = menu->sym;
        is_new = !sym_has_value(sym);
-       if (sym_is_changable(sym)) {
+       if (sym_is_changeable(sym)) {
                conf_sym(menu);
                sym_calc_value(sym);
                switch (sym_get_tristate_value(sym)) {
@@ -418,7 +419,7 @@ static void check_conf(struct menu *menu)
 
        sym = menu->sym;
        if (sym && !sym_has_value(sym)) {
-               if (sym_is_changable(sym) ||
+               if (sym_is_changeable(sym) ||
                    (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
                        if (input_mode == listnewconfig) {
                                if (sym->name) {
@@ -434,6 +435,11 @@ static void check_conf(struct menu *menu)
                                                printf("%s%s=%s\n", CONFIG_, sym->name, str);
                                        }
                                }
+                       } else if (input_mode == helpnewconfig) {
+                               printf("-----\n");
+                               print_help(menu);
+                               printf("-----\n");
+
                        } else {
                                if (!conf_cnt++)
                                        printf("*\n* Restart config...\n*\n");
@@ -451,7 +457,7 @@ static struct option long_opts[] = {
        {"oldaskconfig",    no_argument,       NULL, oldaskconfig},
        {"oldconfig",       no_argument,       NULL, oldconfig},
        {"syncconfig",      no_argument,       NULL, syncconfig},
-       {"defconfig",       optional_argument, NULL, defconfig},
+       {"defconfig",       required_argument, NULL, defconfig},
        {"savedefconfig",   required_argument, NULL, savedefconfig},
        {"allnoconfig",     no_argument,       NULL, allnoconfig},
        {"allyesconfig",    no_argument,       NULL, allyesconfig},
@@ -459,6 +465,7 @@ static struct option long_opts[] = {
        {"alldefconfig",    no_argument,       NULL, alldefconfig},
        {"randconfig",      no_argument,       NULL, randconfig},
        {"listnewconfig",   no_argument,       NULL, listnewconfig},
+       {"helpnewconfig",   no_argument,       NULL, helpnewconfig},
        {"olddefconfig",    no_argument,       NULL, olddefconfig},
        {NULL, 0, NULL, 0}
 };
@@ -469,6 +476,7 @@ static void conf_usage(const char *progname)
        printf("Usage: %s [-s] [option] <kconfig-file>\n", progname);
        printf("[option] is _one_ of the following:\n");
        printf("  --listnewconfig         List new options\n");
+       printf("  --helpnewconfig         List new options and help text\n");
        printf("  --oldaskconfig          Start a new configuration using a line-oriented program\n");
        printf("  --oldconfig             Update a configuration using a provided .config as base\n");
        printf("  --syncconfig            Similar to oldconfig but generates configuration in\n"
@@ -488,7 +496,6 @@ int main(int ac, char **av)
        const char *progname = av[0];
        int opt;
        const char *name, *defconfig_file = NULL /* gcc uninit */;
-       struct stat tmpstat;
        int no_conf_write = 0;
 
        tty_stdio = isatty(0) && isatty(1);
@@ -544,6 +551,7 @@ int main(int ac, char **av)
                case allmodconfig:
                case alldefconfig:
                case listnewconfig:
+               case helpnewconfig:
                case olddefconfig:
                        break;
                case '?':
@@ -560,23 +568,9 @@ int main(int ac, char **av)
        name = av[optind];
        conf_parse(name);
        //zconfdump(stdout);
-       if (sync_kconfig) {
-               name = conf_get_configname();
-               if (stat(name, &tmpstat)) {
-                       fprintf(stderr, "***\n"
-                               "*** Configuration file \"%s\" not found!\n"
-                               "***\n"
-                               "*** Please run some configurator (e.g. \"make oldconfig\" or\n"
-                               "*** \"make menuconfig\" or \"make xconfig\").\n"
-                               "***\n", name);
-                       exit(1);
-               }
-       }
 
        switch (input_mode) {
        case defconfig:
-               if (!defconfig_file)
-                       defconfig_file = conf_get_default_confname();
                if (conf_read(defconfig_file)) {
                        fprintf(stderr,
                                "***\n"
@@ -591,6 +585,7 @@ int main(int ac, char **av)
        case oldaskconfig:
        case oldconfig:
        case listnewconfig:
+       case helpnewconfig:
        case olddefconfig:
                conf_read(NULL);
                break;
@@ -672,6 +667,7 @@ int main(int ac, char **av)
                /* fall through */
        case oldconfig:
        case listnewconfig:
+       case helpnewconfig:
        case syncconfig:
                /* Update until a loop caused no more changes */
                do {
@@ -690,7 +686,7 @@ int main(int ac, char **av)
                                defconfig_file);
                        return 1;
                }
-       } else if (input_mode != listnewconfig) {
+       } else if (input_mode != listnewconfig && input_mode != helpnewconfig) {
                if (!no_conf_write && conf_write(NULL)) {
                        fprintf(stderr, "\n*** Error during writing of the configuration.\n\n");
                        exit(1);
index d67695d19ac77fdad52cbc4f4f005e8110ffcb58..a124a25e899fde96872ff0a9952e079070339d44 100644 (file)
@@ -3,6 +3,7 @@
  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
  */
 
+#include <sys/mman.h>
 #include <sys/stat.h>
 #include <ctype.h>
 #include <errno.h>
@@ -36,6 +37,52 @@ static bool is_dir(const char *path)
        return S_ISDIR(st.st_mode);
 }
 
+/* return true if the given two files are the same, false otherwise */
+static bool is_same(const char *file1, const char *file2)
+{
+       int fd1, fd2;
+       struct stat st1, st2;
+       void *map1, *map2;
+       bool ret = false;
+
+       fd1 = open(file1, O_RDONLY);
+       if (fd1 < 0)
+               return ret;
+
+       fd2 = open(file2, O_RDONLY);
+       if (fd2 < 0)
+               goto close1;
+
+       ret = fstat(fd1, &st1);
+       if (ret)
+               goto close2;
+       ret = fstat(fd2, &st2);
+       if (ret)
+               goto close2;
+
+       if (st1.st_size != st2.st_size)
+               goto close2;
+
+       map1 = mmap(NULL, st1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0);
+       if (map1 == MAP_FAILED)
+               goto close2;
+
+       map2 = mmap(NULL, st2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0);
+       if (map2 == MAP_FAILED)
+               goto close2;
+
+       if (bcmp(map1, map2, st1.st_size))
+               goto close2;
+
+       ret = true;
+close2:
+       close(fd2);
+close1:
+       close(fd1);
+
+       return ret;
+}
+
 /*
  * Create the parent directory of the given path.
  *
@@ -130,8 +177,6 @@ static void conf_message(const char *fmt, ...)
 static const char *conf_filename;
 static int conf_lineno, conf_warnings;
 
-const char conf_defname[] = "include/generated/defconfig";
-
 static void conf_warning(const char *fmt, ...)
 {
        va_list ap;
@@ -179,28 +224,13 @@ const char *conf_get_configname(void)
        return name ? name : ".config";
 }
 
-const char *conf_get_autoconfig_name(void)
+static const char *conf_get_autoconfig_name(void)
 {
        char *name = getenv("KCONFIG_AUTOCONFIG");
 
        return name ? name : "include/generated/auto.conf";
 }
 
-char *conf_get_default_confname(void)
-{
-       static char fullname[PATH_MAX+1];
-       char *env, *name;
-
-       name = expand_string(conf_defname);
-       env = getenv(SRCTREE);
-       if (env) {
-               sprintf(fullname, "%s/%s", env, name);
-               if (is_present(fullname))
-                       return fullname;
-       }
-       return name;
-}
-
 static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
 {
        char *p2;
@@ -504,11 +534,9 @@ int conf_read(const char *name)
                        switch (sym->type) {
                        case S_BOOLEAN:
                        case S_TRISTATE:
-                               if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym))
-                                       break;
-                               if (!sym_is_choice(sym))
+                               if (sym->def[S_DEF_USER].tri == sym_get_tristate_value(sym))
                                        continue;
-                               /* fall through */
+                               break;
                        default:
                                if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
                                        continue;
@@ -812,7 +840,7 @@ int conf_write_defconfig(const char *filename)
                                goto next_menu;
                        sym->flags &= ~SYMBOL_WRITE;
                        /* If we cannot change the symbol - skip */
-                       if (!sym_is_changable(sym))
+                       if (!sym_is_changeable(sym))
                                goto next_menu;
                        /* If symbol equals to default value - skip */
                        if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
@@ -863,40 +891,36 @@ int conf_write(const char *name)
        FILE *out;
        struct symbol *sym;
        struct menu *menu;
-       const char *basename;
        const char *str;
-       char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8];
+       char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
        char *env;
+       int i;
+       bool need_newline = false;
+
+       if (!name)
+               name = conf_get_configname();
+
+       if (!*name) {
+               fprintf(stderr, "config name is empty\n");
+               return -1;
+       }
+
+       if (is_dir(name)) {
+               fprintf(stderr, "%s: Is a directory\n", name);
+               return -1;
+       }
+
+       if (make_parent_dir(name))
+               return -1;
 
-       dirname[0] = 0;
-       if (name && name[0]) {
-               char *slash;
-
-               if (is_dir(name)) {
-                       strcpy(dirname, name);
-                       strcat(dirname, "/");
-                       basename = conf_get_configname();
-               } else if ((slash = strrchr(name, '/'))) {
-                       int size = slash - name + 1;
-                       memcpy(dirname, name, size);
-                       dirname[size] = 0;
-                       if (slash[1])
-                               basename = slash + 1;
-                       else
-                               basename = conf_get_configname();
-               } else
-                       basename = name;
-       } else
-               basename = conf_get_configname();
-
-       sprintf(newname, "%s%s", dirname, basename);
        env = getenv("KCONFIG_OVERWRITECONFIG");
-       if (!env || !*env) {
-               sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
-               out = fopen(tmpname, "w");
-       } else {
+       if (env && *env) {
                *tmpname = 0;
-               out = fopen(newname, "w");
+               out = fopen(name, "w");
+       } else {
+               snprintf(tmpname, sizeof(tmpname), "%s.%d.tmp",
+                        name, (int)getpid());
+               out = fopen(tmpname, "w");
        }
        if (!out)
                return 1;
@@ -917,12 +941,17 @@ int conf_write(const char *name)
                                     "#\n"
                                     "# %s\n"
                                     "#\n", str);
-               } else if (!(sym->flags & SYMBOL_CHOICE)) {
+                       need_newline = false;
+               } else if (!(sym->flags & SYMBOL_CHOICE) &&
+                          !(sym->flags & SYMBOL_WRITTEN)) {
                        sym_calc_value(sym);
                        if (!(sym->flags & SYMBOL_WRITE))
                                goto next;
-                       sym->flags &= ~SYMBOL_WRITE;
-
+                       if (need_newline) {
+                               fprintf(out, "\n");
+                               need_newline = false;
+                       }
+                       sym->flags |= SYMBOL_WRITTEN;
                        conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
                }
 
@@ -934,6 +963,12 @@ next:
                if (menu->next)
                        menu = menu->next;
                else while ((menu = menu->parent)) {
+                       if (!menu->sym && menu_is_visible(menu) &&
+                           menu != &rootmenu) {
+                               str = menu_get_prompt(menu);
+                               fprintf(out, "# end of %s\n", str);
+                               need_newline = true;
+                       }
                        if (menu->next) {
                                menu = menu->next;
                                break;
@@ -942,15 +977,24 @@ next:
        }
        fclose(out);
 
+       for_all_symbols(i, sym)
+               sym->flags &= ~SYMBOL_WRITTEN;
+
        if (*tmpname) {
-               strcat(dirname, basename);
-               strcat(dirname, ".old");
-               rename(newname, dirname);
-               if (rename(tmpname, newname))
+               if (is_same(name, tmpname)) {
+                       conf_message("No change to %s", name);
+                       unlink(tmpname);
+                       sym_set_change_count(0);
+                       return 0;
+               }
+
+               snprintf(oldname, sizeof(oldname), "%s.old", name);
+               rename(name, oldname);
+               if (rename(tmpname, name))
                        return 1;
        }
 
-       conf_message("configuration written to %s", newname);
+       conf_message("configuration written to %s", name);
 
        sym_set_change_count(0);
 
@@ -963,8 +1007,6 @@ static int conf_write_dep(const char *name)
        struct file *file;
        FILE *out;
 
-       if (!name)
-               name = ".kconfig.d";
        out = fopen("..config.tmp", "w");
        if (!out)
                return 1;
@@ -1072,8 +1114,6 @@ int conf_write_autoconf(int overwrite)
        if (!overwrite && is_present(autoconf_name))
                return 0;
 
-       sym_clear_all_valid();
-
        conf_write_dep("include/generated/auto.conf.cmd");
 
        if (conf_touch_deps())
index 77ffff3a053ccb844a0f368ae59661a01bc8444c..9f1de58e9f0c995fba0a0a0cf076be4a18e79ca1 100644 (file)
@@ -254,6 +254,13 @@ static int expr_eq(struct expr *e1, struct expr *e2)
 {
        int res, old_count;
 
+       /*
+        * A NULL expr is taken to be yes, but there's also a different way to
+        * represent yes. expr_is_yes() checks for either representation.
+        */
+       if (!e1 || !e2)
+               return expr_is_yes(e1) && expr_is_yes(e2);
+
        if (e1->type != e2->type)
                return 0;
        switch (e1->type) {
index 999edb60cd53e9808cb8b156b80a6341f814cc46..017843c9a4f42c81b234c8c25838ca514053047d 100644 (file)
@@ -141,6 +141,7 @@ struct symbol {
 #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
 #define SYMBOL_WRITE      0x0200  /* write symbol to file (KCONFIG_CONFIG) */
 #define SYMBOL_CHANGED    0x0400  /* ? */
+#define SYMBOL_WRITTEN    0x0800  /* track info to avoid double-write to .config */
 #define SYMBOL_NO_WRITE   0x1000  /* Symbol for internal use only; it will not be written */
 #define SYMBOL_CHECKED    0x2000  /* used during dependency checking */
 #define SYMBOL_WARNED     0x8000  /* warning has been issued */
@@ -172,7 +173,7 @@ struct symbol {
  *         int "BAZ Value"
  *         range 1..255
  *
- * Please, also check zconf.y:print_symbol() when modifying the
+ * Please, also check parser.y:print_symbol() when modifying the
  * list of property types!
  */
 enum prop_type {
diff --git a/carl9170fw/config/lexer.l b/carl9170fw/config/lexer.l
new file mode 100644 (file)
index 0000000..8aa0197
--- /dev/null
@@ -0,0 +1,471 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ */
+%option nostdinit noyywrap never-interactive full ecs
+%option 8bit nodefault yylineno
+%x ASSIGN_VAL HELP STRING
+%{
+
+#include <assert.h>
+#include <limits.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "lkc.h"
+#include "parser.tab.h"
+
+#define YY_DECL                static int yylex1(void)
+
+#define START_STRSIZE  16
+
+static struct {
+       struct file *file;
+       int lineno;
+} current_pos;
+
+static int prev_prev_token = T_EOL;
+static int prev_token = T_EOL;
+static char *text;
+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 char *expand_token(const char *in, size_t n);
+static void append_expanded_string(const char *in);
+static void zconf_endhelp(void);
+static void zconf_endfile(void);
+
+static void new_string(void)
+{
+       text = xmalloc(START_STRSIZE);
+       text_asize = START_STRSIZE;
+       text_size = 0;
+       *text = 0;
+}
+
+static void append_string(const char *str, int size)
+{
+       int new_size = text_size + size + 1;
+       if (new_size > text_asize) {
+               new_size += START_STRSIZE - 1;
+               new_size &= -START_STRSIZE;
+               text = xrealloc(text, new_size);
+               text_asize = new_size;
+       }
+       memcpy(text + text_size, str, size);
+       text_size += size;
+       text[text_size] = 0;
+}
+
+static void alloc_string(const char *str, int size)
+{
+       text = xmalloc(size + 1);
+       memcpy(text, str, size);
+       text[size] = 0;
+}
+
+static void warn_ignored_character(char chr)
+{
+       fprintf(stderr,
+               "%s:%d:warning: ignoring unsupported character '%c'\n",
+               current_file->name, yylineno, chr);
+}
+%}
+
+n      [A-Za-z0-9_-]
+
+%%
+       int str = 0;
+       int ts, i;
+
+#.*                    /* ignore comment */
+[ \t]*                 /* whitespaces */
+\\\n                   /* escaped new line */
+\n                     return T_EOL;
+"allnoconfig_y"                return T_ALLNOCONFIG_Y;
+"bool"                 return T_BOOL;
+"choice"               return T_CHOICE;
+"comment"              return T_COMMENT;
+"config"               return T_CONFIG;
+"def_bool"             return T_DEF_BOOL;
+"def_tristate"         return T_DEF_TRISTATE;
+"default"              return T_DEFAULT;
+"defconfig_list"       return T_DEFCONFIG_LIST;
+"depends"              return T_DEPENDS;
+"endchoice"            return T_ENDCHOICE;
+"endif"                        return T_ENDIF;
+"endmenu"              return T_ENDMENU;
+"help"|"---help---"    return T_HELP;
+"hex"                  return T_HEX;
+"if"                   return T_IF;
+"imply"                        return T_IMPLY;
+"int"                  return T_INT;
+"mainmenu"             return T_MAINMENU;
+"menu"                 return T_MENU;
+"menuconfig"           return T_MENUCONFIG;
+"modules"              return T_MODULES;
+"on"                   return T_ON;
+"option"               return T_OPTION;
+"optional"             return T_OPTIONAL;
+"prompt"               return T_PROMPT;
+"range"                        return T_RANGE;
+"select"               return T_SELECT;
+"source"               return T_SOURCE;
+"string"               return T_STRING;
+"tristate"             return T_TRISTATE;
+"visible"              return T_VISIBLE;
+"||"                   return T_OR;
+"&&"                   return T_AND;
+"="                    return T_EQUAL;
+"!="                   return T_UNEQUAL;
+"<"                    return T_LESS;
+"<="                   return T_LESS_EQUAL;
+">"                    return T_GREATER;
+">="                   return T_GREATER_EQUAL;
+"!"                    return T_NOT;
+"("                    return T_OPEN_PAREN;
+")"                    return T_CLOSE_PAREN;
+":="                   return T_COLON_EQUAL;
+"+="                   return T_PLUS_EQUAL;
+\"|\'                  {
+                               str = yytext[0];
+                               new_string();
+                               BEGIN(STRING);
+                       }
+{n}+                   {
+                               alloc_string(yytext, yyleng);
+                               yylval.string = text;
+                               return T_WORD;
+                       }
+({n}|$)+               {
+                               /* this token includes at least one '$' */
+                               yylval.string = expand_token(yytext, yyleng);
+                               if (strlen(yylval.string))
+                                       return T_WORD;
+                               free(yylval.string);
+                       }
+.                      warn_ignored_character(*yytext);
+
+<ASSIGN_VAL>{
+       [^[:blank:]\n]+.*       {
+               alloc_string(yytext, yyleng);
+               yylval.string = text;
+               return T_ASSIGN_VAL;
+       }
+       \n      { BEGIN(INITIAL); return T_EOL; }
+       .
+}
+
+<STRING>{
+       "$".*   append_expanded_string(yytext);
+       [^$'"\\\n]+     {
+               append_string(yytext, yyleng);
+       }
+       \\.?    {
+               append_string(yytext + 1, yyleng - 1);
+       }
+       \'|\"   {
+               if (str == yytext[0]) {
+                       BEGIN(INITIAL);
+                       yylval.string = text;
+                       return T_WORD_QUOTE;
+               } else
+                       append_string(yytext, 1);
+       }
+       \n      {
+               fprintf(stderr,
+                       "%s:%d:warning: multi-line strings not supported\n",
+                       zconf_curname(), zconf_lineno());
+               unput('\n');
+               BEGIN(INITIAL);
+               yylval.string = text;
+               return T_WORD_QUOTE;
+       }
+       <<EOF>> {
+               BEGIN(INITIAL);
+               yylval.string = text;
+               return T_WORD_QUOTE;
+       }
+}
+
+<HELP>{
+       [ \t]+  {
+               ts = 0;
+               for (i = 0; i < yyleng; i++) {
+                       if (yytext[i] == '\t')
+                               ts = (ts & ~7) + 8;
+                       else
+                               ts++;
+               }
+               last_ts = ts;
+               if (first_ts) {
+                       if (ts < first_ts) {
+                               zconf_endhelp();
+                               return T_HELPTEXT;
+                       }
+                       ts -= first_ts;
+                       while (ts > 8) {
+                               append_string("        ", 8);
+                               ts -= 8;
+                       }
+                       append_string("        ", ts);
+               }
+       }
+       [ \t]*\n/[^ \t\n] {
+               zconf_endhelp();
+               return T_HELPTEXT;
+       }
+       [ \t]*\n        {
+               append_string("\n", 1);
+       }
+       [^ \t\n].* {
+               while (yyleng) {
+                       if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
+                               break;
+                       yyleng--;
+               }
+               append_string(yytext, yyleng);
+               if (!first_ts)
+                       first_ts = last_ts;
+       }
+       <<EOF>> {
+               zconf_endhelp();
+               return T_HELPTEXT;
+       }
+}
+
+<<EOF>>        {
+       BEGIN(INITIAL);
+
+       if (prev_token != T_EOL && prev_token != T_HELPTEXT)
+               fprintf(stderr, "%s:%d:warning: no new line at end of file\n",
+                       current_file->name, yylineno);
+
+       if (current_file) {
+               zconf_endfile();
+               return T_EOL;
+       }
+       fclose(yyin);
+       yyterminate();
+}
+
+%%
+
+/* second stage lexer */
+int yylex(void)
+{
+       int token;
+
+repeat:
+       token = yylex1();
+
+       if (prev_token == T_EOL || prev_token == T_HELPTEXT) {
+               if (token == T_EOL) {
+                       /* Do not pass unneeded T_EOL to the parser. */
+                       goto repeat;
+               } else {
+                       /*
+                        * For the parser, update file/lineno at the first token
+                        * of each statement. Generally, \n is a statement
+                        * terminator in Kconfig, but it is not always true
+                        * because \n could be escaped by a backslash.
+                        */
+                       current_pos.file = current_file;
+                       current_pos.lineno = yylineno;
+               }
+       }
+
+       if (prev_prev_token == T_EOL && prev_token == T_WORD &&
+           (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL))
+               BEGIN(ASSIGN_VAL);
+
+       prev_prev_token = prev_token;
+       prev_token = token;
+
+       return token;
+}
+
+static char *expand_token(const char *in, size_t n)
+{
+       char *out;
+       int c;
+       char c2;
+       const char *rest, *end;
+
+       new_string();
+       append_string(in, n);
+
+       /* get the whole line because we do not know the end of token. */
+       while ((c = input()) != EOF) {
+               if (c == '\n') {
+                       unput(c);
+                       break;
+               }
+               c2 = c;
+               append_string(&c2, 1);
+       }
+
+       rest = text;
+       out = expand_one_token(&rest);
+
+       /* push back unused characters to the input stream */
+       end = rest + strlen(rest);
+       while (end > rest)
+               unput(*--end);
+
+       free(text);
+
+       return out;
+}
+
+static void append_expanded_string(const char *str)
+{
+       const char *end;
+       char *res;
+
+       str++;
+
+       res = expand_dollar(&str);
+
+       /* push back unused characters to the input stream */
+       end = str + strlen(str);
+       while (end > str)
+               unput(*--end);
+
+       append_string(res, strlen(res));
+
+       free(res);
+}
+
+void zconf_starthelp(void)
+{
+       new_string();
+       last_ts = first_ts = 0;
+       BEGIN(HELP);
+}
+
+static void zconf_endhelp(void)
+{
+       yylval.string = text;
+       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 firmware.
+ * 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 != NULL && name[0] != '/') {
+               env = getenv(SRCTREE);
+               if (env) {
+                       snprintf(fullname, sizeof(fullname),
+                                "%s/%s", env, name);
+                       f = fopen(fullname, "r");
+               }
+       }
+       return f;
+}
+
+void zconf_initscan(const char *name)
+{
+       yyin = zconf_fopen(name);
+       if (!yyin) {
+               fprintf(stderr, "can't find file %s\n", name);
+               exit(1);
+       }
+
+       current_buf = xmalloc(sizeof(*current_buf));
+       memset(current_buf, 0, sizeof(*current_buf));
+
+       current_file = file_lookup(name);
+       yylineno = 1;
+}
+
+void zconf_nextfile(const char *name)
+{
+       struct file *iter;
+       struct file *file = file_lookup(name);
+       struct buffer *buf = xmalloc(sizeof(*buf));
+       memset(buf, 0, sizeof(*buf));
+
+       current_buf->state = YY_CURRENT_BUFFER;
+       yyin = zconf_fopen(file->name);
+       if (!yyin) {
+               fprintf(stderr, "%s:%d: can't open file \"%s\"\n",
+                       zconf_curname(), zconf_lineno(), file->name);
+               exit(1);
+       }
+       yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
+       buf->parent = current_buf;
+       current_buf = buf;
+
+       current_file->lineno = yylineno;
+       file->parent = current_file;
+
+       for (iter = current_file; iter; iter = iter->parent) {
+               if (!strcmp(iter->name, file->name)) {
+                       fprintf(stderr,
+                               "Recursive inclusion detected.\n"
+                               "Inclusion path:\n"
+                               "  current file : %s\n", file->name);
+                       iter = file;
+                       do {
+                               iter = iter->parent;
+                               fprintf(stderr, "  included from: %s:%d\n",
+                                       iter->name, iter->lineno - 1);
+                       } while (strcmp(iter->name, file->name));
+                       exit(1);
+               }
+       }
+
+       yylineno = 1;
+       current_file = file;
+}
+
+static void zconf_endfile(void)
+{
+       struct buffer *parent;
+
+       current_file = current_file->parent;
+       if (current_file)
+               yylineno = current_file->lineno;
+
+       parent = current_buf->parent;
+       if (parent) {
+               fclose(yyin);
+               yy_delete_buffer(YY_CURRENT_BUFFER);
+               yy_switch_to_buffer(parent->state);
+       }
+       free(current_buf);
+       current_buf = parent;
+}
+
+int zconf_lineno(void)
+{
+       return current_pos.lineno;
+}
+
+const char *zconf_curname(void)
+{
+       return current_pos.file ? current_pos.file->name : "<none>";
+}
index 531ff7c57d92dce95e933fee200e6fc0ed3f13b4..4fb16f3166268fd5686b303797561374f58470cf 100644 (file)
@@ -49,8 +49,6 @@ const char *zconf_curname(void);
 
 /* confdata.c */
 const char *conf_get_configname(void);
-const char *conf_get_autoconfig_name(void);
-char *conf_get_default_confname(void);
 void sym_set_change_count(int count);
 void sym_add_change_count(int count);
 bool conf_set_all_new_symbols(enum conf_def_mode mode);
@@ -90,7 +88,7 @@ void *xrealloc(void *p, size_t size);
 char *xstrdup(const char *s);
 char *xstrndup(const char *s, size_t n);
 
-/* zconf.l */
+/* lexer.l */
 int yylex(void);
 
 struct gstr {
index 86c267540ccc70e74fbb4962210e498aae65766d..f9ab98238aeff1974ebe917bc0eba7f0f32e1be9 100644 (file)
@@ -42,7 +42,7 @@ tristate sym_toggle_tristate_value(struct symbol *sym);
 bool sym_string_valid(struct symbol *sym, const char *newval);
 bool sym_string_within_range(struct symbol *sym, const char *str);
 bool sym_set_string_value(struct symbol *sym, const char *newval);
-bool sym_is_changable(struct symbol *sym);
+bool sym_is_changeable(struct symbol *sym);
 struct property * sym_get_choice_prop(struct symbol *sym);
 const char * sym_get_string_value(struct symbol *sym);
 
@@ -58,7 +58,6 @@ void env_write_dep(FILE *f, const char *auto_conf_name);
 void variable_add(const char *name, const char *value,
                  enum variable_flavor flavor);
 void variable_all_del(void);
-char *expand_string(const char *in);
 char *expand_dollar(const char **str);
 char *expand_one_token(const char **str);
 
diff --git a/carl9170fw/config/parser.y b/carl9170fw/config/parser.y
new file mode 100644 (file)
index 0000000..b3eff96
--- /dev/null
@@ -0,0 +1,730 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
+ */
+%{
+
+#include <ctype.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdbool.h>
+
+#include "lkc.h"
+
+#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
+
+#define PRINTD         0x0001
+#define DEBUG_PARSE    0x0002
+
+int cdebug = PRINTD;
+
+static void yyerror(const char *err);
+static void zconfprint(const char *err, ...);
+static void zconf_error(const char *err, ...);
+static bool zconf_endtoken(const char *tokenname,
+                          const char *expected_tokenname);
+
+struct symbol *symbol_hash[SYMBOL_HASHSIZE];
+
+static struct menu *current_menu, *current_entry;
+
+%}
+
+%union
+{
+       char *string;
+       struct symbol *symbol;
+       struct expr *expr;
+       struct menu *menu;
+       enum symbol_type type;
+       enum variable_flavor flavor;
+}
+
+%token <string> T_HELPTEXT
+%token <string> T_WORD
+%token <string> T_WORD_QUOTE
+%token T_ALLNOCONFIG_Y
+%token T_BOOL
+%token T_CHOICE
+%token T_CLOSE_PAREN
+%token T_COLON_EQUAL
+%token T_COMMENT
+%token T_CONFIG
+%token T_DEFAULT
+%token T_DEFCONFIG_LIST
+%token T_DEF_BOOL
+%token T_DEF_TRISTATE
+%token T_DEPENDS
+%token T_ENDCHOICE
+%token T_ENDIF
+%token T_ENDMENU
+%token T_HELP
+%token T_HEX
+%token T_IF
+%token T_IMPLY
+%token T_INT
+%token T_MAINMENU
+%token T_MENU
+%token T_MENUCONFIG
+%token T_MODULES
+%token T_ON
+%token T_OPEN_PAREN
+%token T_OPTION
+%token T_OPTIONAL
+%token T_PLUS_EQUAL
+%token T_PROMPT
+%token T_RANGE
+%token T_SELECT
+%token T_SOURCE
+%token T_STRING
+%token T_TRISTATE
+%token T_VISIBLE
+%token T_EOL
+%token <string> T_ASSIGN_VAL
+
+%left T_OR
+%left T_AND
+%left T_EQUAL T_UNEQUAL
+%left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL
+%nonassoc T_NOT
+
+%type <string> prompt
+%type <symbol> nonconst_symbol
+%type <symbol> symbol
+%type <type> type logic_type default
+%type <expr> expr
+%type <expr> if_expr
+%type <string> end
+%type <menu> if_entry menu_entry choice_entry
+%type <string> word_opt assign_val
+%type <flavor> assign_op
+
+%destructor {
+       fprintf(stderr, "%s:%d: missing end statement for this entry\n",
+               $$->file->name, $$->lineno);
+       if (current_menu == $$)
+               menu_end_menu();
+} if_entry menu_entry choice_entry
+
+%%
+input: mainmenu_stmt stmt_list | stmt_list;
+
+/* mainmenu entry */
+
+mainmenu_stmt: T_MAINMENU prompt T_EOL
+{
+       menu_add_prompt(P_MENU, $2, NULL);
+};
+
+stmt_list:
+         /* empty */
+       | stmt_list common_stmt
+       | stmt_list choice_stmt
+       | stmt_list menu_stmt
+       | stmt_list T_WORD error T_EOL  { zconf_error("unknown statement \"%s\"", $2); }
+       | stmt_list error T_EOL         { zconf_error("invalid statement"); }
+;
+
+common_stmt:
+         if_stmt
+       | comment_stmt
+       | config_stmt
+       | menuconfig_stmt
+       | source_stmt
+       | assignment_stmt
+;
+
+/* config/menuconfig entry */
+
+config_entry_start: T_CONFIG nonconst_symbol T_EOL
+{
+       $2->flags |= SYMBOL_OPTIONAL;
+       menu_add_entry($2);
+       printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
+};
+
+config_stmt: config_entry_start config_option_list
+{
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
+{
+       $2->flags |= SYMBOL_OPTIONAL;
+       menu_add_entry($2);
+       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
+};
+
+menuconfig_stmt: menuconfig_entry_start config_option_list
+{
+       if (current_entry->prompt)
+               current_entry->prompt->type = P_MENU;
+       else
+               zconfprint("warning: menuconfig statement without prompt");
+       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
+};
+
+config_option_list:
+         /* empty */
+       | config_option_list config_option
+       | config_option_list depends
+       | config_option_list help
+;
+
+config_option: type prompt_stmt_opt T_EOL
+{
+       menu_set_type($1);
+       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+               zconf_curname(), zconf_lineno(),
+               $1);
+};
+
+config_option: T_PROMPT prompt if_expr T_EOL
+{
+       menu_add_prompt(P_PROMPT, $2, $3);
+       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: default expr if_expr T_EOL
+{
+       menu_add_expr(P_DEFAULT, $2, $3);
+       if ($1 != S_UNKNOWN)
+               menu_set_type($1);
+       printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
+               zconf_curname(), zconf_lineno(),
+               $1);
+};
+
+config_option: T_SELECT nonconst_symbol if_expr T_EOL
+{
+       menu_add_symbol(P_SELECT, $2, $3);
+       printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_IMPLY nonconst_symbol if_expr T_EOL
+{
+       menu_add_symbol(P_IMPLY, $2, $3);
+       printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_RANGE symbol symbol if_expr T_EOL
+{
+       menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
+       printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
+};
+
+config_option: T_OPTION T_MODULES T_EOL
+{
+       menu_add_option_modules();
+};
+
+config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
+{
+       menu_add_option_defconfig_list();
+};
+
+config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
+{
+       menu_add_option_allnoconfig_y();
+};
+
+/* choice entry */
+
+choice: T_CHOICE word_opt T_EOL
+{
+       struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
+       sym->flags |= SYMBOL_NO_WRITE;
+       menu_add_entry(sym);
+       menu_add_expr(P_CHOICE, NULL, NULL);
+       free($2);
+       printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
+};
+
+choice_entry: choice choice_option_list
+{
+       $$ = menu_add_menu();
+};
+
+choice_end: end
+{
+       if (zconf_endtoken($1, "choice")) {
+               menu_end_menu();
+               printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
+       }
+};
+
+choice_stmt: choice_entry choice_block choice_end
+;
+
+choice_option_list:
+         /* empty */
+       | choice_option_list choice_option
+       | choice_option_list depends
+       | choice_option_list help
+;
+
+choice_option: T_PROMPT prompt if_expr T_EOL
+{
+       menu_add_prompt(P_PROMPT, $2, $3);
+       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: logic_type prompt_stmt_opt T_EOL
+{
+       menu_set_type($1);
+       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
+              zconf_curname(), zconf_lineno(), $1);
+};
+
+choice_option: T_OPTIONAL T_EOL
+{
+       current_entry->sym->flags |= SYMBOL_OPTIONAL;
+       printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
+};
+
+choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
+{
+       menu_add_symbol(P_DEFAULT, $2, $3);
+       printd(DEBUG_PARSE, "%s:%d:default\n",
+              zconf_curname(), zconf_lineno());
+};
+
+type:
+         logic_type
+       | T_INT                 { $$ = S_INT; }
+       | T_HEX                 { $$ = S_HEX; }
+       | T_STRING              { $$ = S_STRING; }
+
+logic_type:
+         T_BOOL                { $$ = S_BOOLEAN; }
+       | T_TRISTATE            { $$ = S_TRISTATE; }
+
+default:
+         T_DEFAULT             { $$ = S_UNKNOWN; }
+       | T_DEF_BOOL            { $$ = S_BOOLEAN; }
+       | T_DEF_TRISTATE        { $$ = S_TRISTATE; }
+
+choice_block:
+         /* empty */
+       | choice_block common_stmt
+;
+
+/* if entry */
+
+if_entry: T_IF expr T_EOL
+{
+       printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
+       menu_add_entry(NULL);
+       menu_add_dep($2);
+       $$ = menu_add_menu();
+};
+
+if_end: end
+{
+       if (zconf_endtoken($1, "if")) {
+               menu_end_menu();
+               printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
+       }
+};
+
+if_stmt: if_entry stmt_list if_end
+;
+
+/* menu entry */
+
+menu: T_MENU prompt T_EOL
+{
+       menu_add_entry(NULL);
+       menu_add_prompt(P_MENU, $2, NULL);
+       printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
+};
+
+menu_entry: menu menu_option_list
+{
+       $$ = menu_add_menu();
+};
+
+menu_end: end
+{
+       if (zconf_endtoken($1, "menu")) {
+               menu_end_menu();
+               printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
+       }
+};
+
+menu_stmt: menu_entry stmt_list menu_end
+;
+
+menu_option_list:
+         /* empty */
+       | menu_option_list visible
+       | menu_option_list depends
+;
+
+source_stmt: T_SOURCE prompt T_EOL
+{
+       printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
+       zconf_nextfile($2);
+       free($2);
+};
+
+/* comment entry */
+
+comment: T_COMMENT prompt T_EOL
+{
+       menu_add_entry(NULL);
+       menu_add_prompt(P_COMMENT, $2, NULL);
+       printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
+};
+
+comment_stmt: comment comment_option_list
+;
+
+comment_option_list:
+         /* empty */
+       | comment_option_list depends
+;
+
+/* help option */
+
+help_start: T_HELP T_EOL
+{
+       printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
+       zconf_starthelp();
+};
+
+help: help_start T_HELPTEXT
+{
+       if (current_entry->help) {
+               free(current_entry->help);
+               zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
+                          current_entry->sym->name ?: "<choice>");
+       }
+
+       /* Is the help text empty or all whitespace? */
+       if ($2[strspn($2, " \f\n\r\t\v")] == '\0')
+               zconfprint("warning: '%s' defined with blank help text",
+                          current_entry->sym->name ?: "<choice>");
+
+       current_entry->help = $2;
+};
+
+/* depends option */
+
+depends: T_DEPENDS T_ON expr T_EOL
+{
+       menu_add_dep($3);
+       printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
+};
+
+/* visibility option */
+visible: T_VISIBLE if_expr T_EOL
+{
+       menu_add_visibility($2);
+};
+
+/* prompt statement */
+
+prompt_stmt_opt:
+         /* empty */
+       | prompt if_expr
+{
+       menu_add_prompt(P_PROMPT, $1, $2);
+};
+
+prompt:          T_WORD
+       | T_WORD_QUOTE
+;
+
+end:     T_ENDMENU T_EOL       { $$ = "menu"; }
+       | T_ENDCHOICE T_EOL     { $$ = "choice"; }
+       | T_ENDIF T_EOL         { $$ = "if"; }
+;
+
+if_expr:  /* empty */                  { $$ = NULL; }
+       | T_IF expr                     { $$ = $2; }
+;
+
+expr:    symbol                                { $$ = expr_alloc_symbol($1); }
+       | symbol T_LESS symbol                  { $$ = expr_alloc_comp(E_LTH, $1, $3); }
+       | symbol T_LESS_EQUAL symbol            { $$ = expr_alloc_comp(E_LEQ, $1, $3); }
+       | symbol T_GREATER symbol               { $$ = expr_alloc_comp(E_GTH, $1, $3); }
+       | symbol T_GREATER_EQUAL symbol         { $$ = expr_alloc_comp(E_GEQ, $1, $3); }
+       | symbol T_EQUAL symbol                 { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
+       | symbol T_UNEQUAL symbol               { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
+       | T_OPEN_PAREN expr T_CLOSE_PAREN       { $$ = $2; }
+       | T_NOT expr                            { $$ = expr_alloc_one(E_NOT, $2); }
+       | expr T_OR expr                        { $$ = expr_alloc_two(E_OR, $1, $3); }
+       | expr T_AND expr                       { $$ = expr_alloc_two(E_AND, $1, $3); }
+;
+
+/* For symbol definitions, selects, etc., where quotes are not accepted */
+nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
+
+symbol:          nonconst_symbol
+       | T_WORD_QUOTE  { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
+;
+
+word_opt: /* empty */                  { $$ = NULL; }
+       | T_WORD
+
+/* assignment statement */
+
+assignment_stmt:  T_WORD assign_op assign_val T_EOL    { variable_add($1, $3, $2); free($1); free($3); }
+
+assign_op:
+         T_EQUAL       { $$ = VAR_RECURSIVE; }
+       | T_COLON_EQUAL { $$ = VAR_SIMPLE; }
+       | T_PLUS_EQUAL  { $$ = VAR_APPEND; }
+;
+
+assign_val:
+       /* empty */             { $$ = xstrdup(""); };
+       | T_ASSIGN_VAL
+;
+
+%%
+
+void conf_parse(const char *name)
+{
+       struct symbol *sym;
+       int i;
+
+       zconf_initscan(name);
+
+       _menu_init();
+
+       if (getenv("ZCONF_DEBUG"))
+               yydebug = 1;
+       yyparse();
+
+       /* Variables are expanded in the parse phase. We can free them here. */
+       variable_all_del();
+
+       if (yynerrs)
+               exit(1);
+       if (!modules_sym)
+               modules_sym = sym_find( "n" );
+
+       if (!menu_has_prompt(&rootmenu)) {
+               current_entry = &rootmenu;
+               menu_add_prompt(P_MENU, "Main menu", NULL);
+       }
+
+       menu_finalize(&rootmenu);
+       for_all_symbols(i, sym) {
+               if (sym_check_deps(sym))
+                       yynerrs++;
+       }
+       if (yynerrs)
+               exit(1);
+       sym_set_change_count(1);
+}
+
+static bool zconf_endtoken(const char *tokenname,
+                          const char *expected_tokenname)
+{
+       if (strcmp(tokenname, expected_tokenname)) {
+               zconf_error("unexpected '%s' within %s block",
+                           tokenname, expected_tokenname);
+               yynerrs++;
+               return false;
+       }
+       if (current_menu->file != current_file) {
+               zconf_error("'%s' in different file than '%s'",
+                           tokenname, expected_tokenname);
+               fprintf(stderr, "%s:%d: location of the '%s'\n",
+                       current_menu->file->name, current_menu->lineno,
+                       expected_tokenname);
+               yynerrs++;
+               return false;
+       }
+       return true;
+}
+
+static void zconfprint(const char *err, ...)
+{
+       va_list ap;
+
+       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       va_start(ap, err);
+       vfprintf(stderr, err, ap);
+       va_end(ap);
+       fprintf(stderr, "\n");
+}
+
+static void zconf_error(const char *err, ...)
+{
+       va_list ap;
+
+       yynerrs++;
+       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
+       va_start(ap, err);
+       vfprintf(stderr, err, ap);
+       va_end(ap);
+       fprintf(stderr, "\n");
+}
+
+static void yyerror(const char *err)
+{
+       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
+}
+
+static void print_quoted_string(FILE *out, const char *str)
+{
+       const char *p;
+       int len;
+
+       putc('"', out);
+       while ((p = strchr(str, '"'))) {
+               len = p - str;
+               if (len)
+                       fprintf(out, "%.*s", len, str);
+               fputs("\\\"", out);
+               str = p + 1;
+       }
+       fputs(str, out);
+       putc('"', out);
+}
+
+static void print_symbol(FILE *out, struct menu *menu)
+{
+       struct symbol *sym = menu->sym;
+       struct property *prop;
+
+       if (sym_is_choice(sym))
+               fprintf(out, "\nchoice\n");
+       else
+               fprintf(out, "\nconfig %s\n", sym->name);
+       switch (sym->type) {
+       case S_BOOLEAN:
+               fputs("  bool\n", out);
+               break;
+       case S_TRISTATE:
+               fputs("  tristate\n", out);
+               break;
+       case S_STRING:
+               fputs("  string\n", out);
+               break;
+       case S_INT:
+               fputs("  integer\n", out);
+               break;
+       case S_HEX:
+               fputs("  hex\n", out);
+               break;
+       default:
+               fputs("  ???\n", out);
+               break;
+       }
+       for (prop = sym->prop; prop; prop = prop->next) {
+               if (prop->menu != menu)
+                       continue;
+               switch (prop->type) {
+               case P_PROMPT:
+                       fputs("  prompt ", out);
+                       print_quoted_string(out, prop->text);
+                       if (!expr_is_yes(prop->visible.expr)) {
+                               fputs(" if ", out);
+                               expr_fprint(prop->visible.expr, out);
+                       }
+                       fputc('\n', out);
+                       break;
+               case P_DEFAULT:
+                       fputs( "  default ", out);
+                       expr_fprint(prop->expr, out);
+                       if (!expr_is_yes(prop->visible.expr)) {
+                               fputs(" if ", out);
+                               expr_fprint(prop->visible.expr, out);
+                       }
+                       fputc('\n', out);
+                       break;
+               case P_CHOICE:
+                       fputs("  #choice value\n", out);
+                       break;
+               case P_SELECT:
+                       fputs( "  select ", out);
+                       expr_fprint(prop->expr, out);
+                       fputc('\n', out);
+                       break;
+               case P_IMPLY:
+                       fputs( "  imply ", out);
+                       expr_fprint(prop->expr, out);
+                       fputc('\n', out);
+                       break;
+               case P_RANGE:
+                       fputs( "  range ", out);
+                       expr_fprint(prop->expr, out);
+                       fputc('\n', out);
+                       break;
+               case P_MENU:
+                       fputs( "  menu ", out);
+                       print_quoted_string(out, prop->text);
+                       fputc('\n', out);
+                       break;
+               case P_SYMBOL:
+                       fputs( "  symbol ", out);
+                       fprintf(out, "%s\n", prop->sym->name);
+                       break;
+               default:
+                       fprintf(out, "  unknown prop %d!\n", prop->type);
+                       break;
+               }
+       }
+       if (menu->help) {
+               int len = strlen(menu->help);
+               while (menu->help[--len] == '\n')
+                       menu->help[len] = 0;
+               fprintf(out, "  help\n%s\n", menu->help);
+       }
+}
+
+void zconfdump(FILE *out)
+{
+       struct property *prop;
+       struct symbol *sym;
+       struct menu *menu;
+
+       menu = rootmenu.list;
+       while (menu) {
+               if ((sym = menu->sym))
+                       print_symbol(out, menu);
+               else if ((prop = menu->prompt)) {
+                       switch (prop->type) {
+                       case P_COMMENT:
+                               fputs("\ncomment ", out);
+                               print_quoted_string(out, prop->text);
+                               fputs("\n", out);
+                               break;
+                       case P_MENU:
+                               fputs("\nmenu ", out);
+                               print_quoted_string(out, prop->text);
+                               fputs("\n", out);
+                               break;
+                       default:
+                               ;
+                       }
+                       if (!expr_is_yes(prop->visible.expr)) {
+                               fputs("  depends ", out);
+                               expr_fprint(prop->visible.expr, out);
+                               fputc('\n', out);
+                       }
+               }
+
+               if (menu->list)
+                       menu = menu->list;
+               else if (menu->next)
+                       menu = menu->next;
+               else while ((menu = menu->parent)) {
+                       if (menu->prompt && menu->prompt->type == P_MENU)
+                               fputs("\nendmenu\n", out);
+                       if (menu->next) {
+                               menu = menu->next;
+                               break;
+                       }
+               }
+       }
+}
+
+#include "menu.c"
index 592dfbfa9fb30d6804043a5bad23b9f683adefd8..0243086fb16854d9c7555b13f4ad3f3b2b96c456 100644 (file)
@@ -15,6 +15,7 @@
 #define ARRAY_SIZE(arr)                (sizeof(arr) / sizeof((arr)[0]))
 
 static char *expand_string_with_args(const char *in, int argc, char *argv[]);
+static char *expand_string(const char *in);
 
 static void __attribute__((noreturn)) pperror(const char *format, ...)
 {
@@ -550,7 +551,7 @@ static char *expand_string_with_args(const char *in, int argc, char *argv[])
        return __expand_string(&in, is_end_of_str, argc, argv);
 }
 
-char *expand_string(const char *in)
+static char *expand_string(const char *in)
 {
        return expand_string_with_args(in, 0, NULL);
 }
index 1f9266dadedf63f2c01fb102e3e173d3349520e7..f56eec5ea4c7fc26658bc55a25c7eadb9203e231 100644 (file)
@@ -785,7 +785,7 @@ const char *sym_get_string_value(struct symbol *sym)
        return (const char *)sym->curr.val;
 }
 
-bool sym_is_changable(struct symbol *sym)
+bool sym_is_changeable(struct symbol *sym)
 {
        return sym->visible > sym->rev_dep.tri;
 }
@@ -1114,7 +1114,7 @@ static void sym_check_print_recursive(struct symbol *last_sym)
        }
 
        fprintf(stderr,
-               "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n"
+               "For a resolution refer to Documentation/kbuild/kconfig-language.rst\n"
                "subsection \"Kconfig recursive dependency limitations\"\n"
                "\n");
 
diff --git a/carl9170fw/config/zconf.l b/carl9170fw/config/zconf.l
deleted file mode 100644 (file)
index c52cce8..0000000
+++ /dev/null
@@ -1,470 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
- */
-%option nostdinit noyywrap never-interactive full ecs
-%option 8bit nodefault yylineno
-%x ASSIGN_VAL HELP STRING
-%{
-
-#include <assert.h>
-#include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-
-#include "lkc.h"
-#include "zconf.tab.h"
-
-#define YY_DECL                static int yylex1(void)
-
-#define START_STRSIZE  16
-
-static struct {
-       struct file *file;
-       int lineno;
-} current_pos;
-
-static int prev_prev_token = T_EOL;
-static int prev_token = T_EOL;
-static char *text;
-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 char *expand_token(const char *in, size_t n);
-static void append_expanded_string(const char *in);
-static void zconf_endhelp(void);
-static void zconf_endfile(void);
-
-static void new_string(void)
-{
-       text = xmalloc(START_STRSIZE);
-       text_asize = START_STRSIZE;
-       text_size = 0;
-       *text = 0;
-}
-
-static void append_string(const char *str, int size)
-{
-       int new_size = text_size + size + 1;
-       if (new_size > text_asize) {
-               new_size += START_STRSIZE - 1;
-               new_size &= -START_STRSIZE;
-               text = xrealloc(text, new_size);
-               text_asize = new_size;
-       }
-       memcpy(text + text_size, str, size);
-       text_size += size;
-       text[text_size] = 0;
-}
-
-static void alloc_string(const char *str, int size)
-{
-       text = xmalloc(size + 1);
-       memcpy(text, str, size);
-       text[size] = 0;
-}
-
-static void warn_ignored_character(char chr)
-{
-       fprintf(stderr,
-               "%s:%d:warning: ignoring unsupported character '%c'\n",
-               current_file->name, yylineno, chr);
-}
-%}
-
-n      [A-Za-z0-9_-]
-
-%%
-       int str = 0;
-       int ts, i;
-
-#.*                    /* ignore comment */
-[ \t]*                 /* whitespaces */
-\\\n                   /* escaped new line */
-\n                     return T_EOL;
-"allnoconfig_y"                return T_ALLNOCONFIG_Y;
-"bool"                 return T_BOOL;
-"choice"               return T_CHOICE;
-"comment"              return T_COMMENT;
-"config"               return T_CONFIG;
-"def_bool"             return T_DEF_BOOL;
-"def_tristate"         return T_DEF_TRISTATE;
-"default"              return T_DEFAULT;
-"defconfig_list"       return T_DEFCONFIG_LIST;
-"depends"              return T_DEPENDS;
-"endchoice"            return T_ENDCHOICE;
-"endif"                        return T_ENDIF;
-"endmenu"              return T_ENDMENU;
-"help"|"---help---"    return T_HELP;
-"hex"                  return T_HEX;
-"if"                   return T_IF;
-"imply"                        return T_IMPLY;
-"int"                  return T_INT;
-"mainmenu"             return T_MAINMENU;
-"menu"                 return T_MENU;
-"menuconfig"           return T_MENUCONFIG;
-"modules"              return T_MODULES;
-"on"                   return T_ON;
-"option"               return T_OPTION;
-"optional"             return T_OPTIONAL;
-"prompt"               return T_PROMPT;
-"range"                        return T_RANGE;
-"select"               return T_SELECT;
-"source"               return T_SOURCE;
-"string"               return T_STRING;
-"tristate"             return T_TRISTATE;
-"visible"              return T_VISIBLE;
-"||"                   return T_OR;
-"&&"                   return T_AND;
-"="                    return T_EQUAL;
-"!="                   return T_UNEQUAL;
-"<"                    return T_LESS;
-"<="                   return T_LESS_EQUAL;
-">"                    return T_GREATER;
-">="                   return T_GREATER_EQUAL;
-"!"                    return T_NOT;
-"("                    return T_OPEN_PAREN;
-")"                    return T_CLOSE_PAREN;
-":="                   return T_COLON_EQUAL;
-"+="                   return T_PLUS_EQUAL;
-\"|\'                  {
-                               str = yytext[0];
-                               new_string();
-                               BEGIN(STRING);
-                       }
-{n}+                   {
-                               alloc_string(yytext, yyleng);
-                               yylval.string = text;
-                               return T_WORD;
-                       }
-({n}|$)+               {
-                               /* this token includes at least one '$' */
-                               yylval.string = expand_token(yytext, yyleng);
-                               if (strlen(yylval.string))
-                                       return T_WORD;
-                               free(yylval.string);
-                       }
-.                      warn_ignored_character(*yytext);
-
-<ASSIGN_VAL>{
-       [^[:blank:]\n]+.*       {
-               alloc_string(yytext, yyleng);
-               yylval.string = text;
-               return T_ASSIGN_VAL;
-       }
-       \n      { BEGIN(INITIAL); return T_EOL; }
-       .
-}
-
-<STRING>{
-       "$".*   append_expanded_string(yytext);
-       [^$'"\\\n]+     {
-               append_string(yytext, yyleng);
-       }
-       \\.?    {
-               append_string(yytext + 1, yyleng - 1);
-       }
-       \'|\"   {
-               if (str == yytext[0]) {
-                       BEGIN(INITIAL);
-                       yylval.string = text;
-                       return T_WORD_QUOTE;
-               } else
-                       append_string(yytext, 1);
-       }
-       \n      {
-               fprintf(stderr,
-                       "%s:%d:warning: multi-line strings not supported\n",
-                       zconf_curname(), zconf_lineno());
-               unput('\n');
-               BEGIN(INITIAL);
-               yylval.string = text;
-               return T_WORD_QUOTE;
-       }
-       <<EOF>> {
-               BEGIN(INITIAL);
-               yylval.string = text;
-               return T_WORD_QUOTE;
-       }
-}
-
-<HELP>{
-       [ \t]+  {
-               ts = 0;
-               for (i = 0; i < yyleng; i++) {
-                       if (yytext[i] == '\t')
-                               ts = (ts & ~7) + 8;
-                       else
-                               ts++;
-               }
-               last_ts = ts;
-               if (first_ts) {
-                       if (ts < first_ts) {
-                               zconf_endhelp();
-                               return T_HELPTEXT;
-                       }
-                       ts -= first_ts;
-                       while (ts > 8) {
-                               append_string("        ", 8);
-                               ts -= 8;
-                       }
-                       append_string("        ", ts);
-               }
-       }
-       [ \t]*\n/[^ \t\n] {
-               zconf_endhelp();
-               return T_HELPTEXT;
-       }
-       [ \t]*\n        {
-               append_string("\n", 1);
-       }
-       [^ \t\n].* {
-               while (yyleng) {
-                       if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
-                               break;
-                       yyleng--;
-               }
-               append_string(yytext, yyleng);
-               if (!first_ts)
-                       first_ts = last_ts;
-       }
-       <<EOF>> {
-               zconf_endhelp();
-               return T_HELPTEXT;
-       }
-}
-
-<<EOF>>        {
-       BEGIN(INITIAL);
-
-       if (prev_token != T_EOL && prev_token != T_HELPTEXT)
-               fprintf(stderr, "%s:%d:warning: no new line at end of file\n",
-                       current_file->name, yylineno);
-
-       if (current_file) {
-               zconf_endfile();
-               return T_EOL;
-       }
-       fclose(yyin);
-       yyterminate();
-}
-
-%%
-
-/* second stage lexer */
-int yylex(void)
-{
-       int token;
-
-repeat:
-       token = yylex1();
-
-       if (prev_token == T_EOL || prev_token == T_HELPTEXT) {
-               if (token == T_EOL) {
-                       /* Do not pass unneeded T_EOL to the parser. */
-                       goto repeat;
-               } else {
-                       /*
-                        * For the parser, update file/lineno at the first token
-                        * of each statement. Generally, \n is a statement
-                        * terminator in Kconfig, but it is not always true
-                        * because \n could be escaped by a backslash.
-                        */
-                       current_pos.file = current_file;
-                       current_pos.lineno = yylineno;
-               }
-       }
-
-       if (prev_prev_token == T_EOL && prev_token == T_WORD &&
-           (token == T_EQUAL || token == T_COLON_EQUAL || token == T_PLUS_EQUAL))
-               BEGIN(ASSIGN_VAL);
-
-       prev_prev_token = prev_token;
-       prev_token = token;
-
-       return token;
-}
-
-static char *expand_token(const char *in, size_t n)
-{
-       char *out;
-       int c;
-       char c2;
-       const char *rest, *end;
-
-       new_string();
-       append_string(in, n);
-
-       /* get the whole line because we do not know the end of token. */
-       while ((c = input()) != EOF) {
-               if (c == '\n') {
-                       unput(c);
-                       break;
-               }
-               c2 = c;
-               append_string(&c2, 1);
-       }
-
-       rest = text;
-       out = expand_one_token(&rest);
-
-       /* push back unused characters to the input stream */
-       end = rest + strlen(rest);
-       while (end > rest)
-               unput(*--end);
-
-       free(text);
-
-       return out;
-}
-
-static void append_expanded_string(const char *str)
-{
-       const char *end;
-       char *res;
-
-       str++;
-
-       res = expand_dollar(&str);
-
-       /* push back unused characters to the input stream */
-       end = str + strlen(str);
-       while (end > str)
-               unput(*--end);
-
-       append_string(res, strlen(res));
-
-       free(res);
-}
-
-void zconf_starthelp(void)
-{
-       new_string();
-       last_ts = first_ts = 0;
-       BEGIN(HELP);
-}
-
-static void zconf_endhelp(void)
-{
-       yylval.string = text;
-       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 firmware.
- * 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 != NULL && 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 = zconf_fopen(name);
-       if (!yyin) {
-               fprintf(stderr, "can't find file %s\n", name);
-               exit(1);
-       }
-
-       current_buf = xmalloc(sizeof(*current_buf));
-       memset(current_buf, 0, sizeof(*current_buf));
-
-       current_file = file_lookup(name);
-       yylineno = 1;
-}
-
-void zconf_nextfile(const char *name)
-{
-       struct file *iter;
-       struct file *file = file_lookup(name);
-       struct buffer *buf = xmalloc(sizeof(*buf));
-       memset(buf, 0, sizeof(*buf));
-
-       current_buf->state = YY_CURRENT_BUFFER;
-       yyin = zconf_fopen(file->name);
-       if (!yyin) {
-               fprintf(stderr, "%s:%d: can't open file \"%s\"\n",
-                       zconf_curname(), zconf_lineno(), file->name);
-               exit(1);
-       }
-       yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
-       buf->parent = current_buf;
-       current_buf = buf;
-
-       current_file->lineno = yylineno;
-       file->parent = current_file;
-
-       for (iter = current_file; iter; iter = iter->parent) {
-               if (!strcmp(iter->name, file->name)) {
-                       fprintf(stderr,
-                               "Recursive inclusion detected.\n"
-                               "Inclusion path:\n"
-                               "  current file : %s\n", file->name);
-                       iter = file;
-                       do {
-                               iter = iter->parent;
-                               fprintf(stderr, "  included from: %s:%d\n",
-                                       iter->name, iter->lineno - 1);
-                       } while (strcmp(iter->name, file->name));
-                       exit(1);
-               }
-       }
-
-       yylineno = 1;
-       current_file = file;
-}
-
-static void zconf_endfile(void)
-{
-       struct buffer *parent;
-
-       current_file = current_file->parent;
-       if (current_file)
-               yylineno = current_file->lineno;
-
-       parent = current_buf->parent;
-       if (parent) {
-               fclose(yyin);
-               yy_delete_buffer(YY_CURRENT_BUFFER);
-               yy_switch_to_buffer(parent->state);
-       }
-       free(current_buf);
-       current_buf = parent;
-}
-
-int zconf_lineno(void)
-{
-       return current_pos.lineno;
-}
-
-const char *zconf_curname(void)
-{
-       return current_pos.file ? current_pos.file->name : "<none>";
-}
diff --git a/carl9170fw/config/zconf.y b/carl9170fw/config/zconf.y
deleted file mode 100644 (file)
index 60936c7..0000000
+++ /dev/null
@@ -1,731 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
- */
-%{
-
-#include <ctype.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include "lkc.h"
-
-#define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
-
-#define PRINTD         0x0001
-#define DEBUG_PARSE    0x0002
-
-int cdebug = PRINTD;
-
-static void yyerror(const char *err);
-static void zconfprint(const char *err, ...);
-static void zconf_error(const char *err, ...);
-static bool zconf_endtoken(const char *tokenname,
-                          const char *expected_tokenname);
-
-struct symbol *symbol_hash[SYMBOL_HASHSIZE];
-
-static struct menu *current_menu, *current_entry;
-
-%}
-
-%union
-{
-       char *string;
-       struct symbol *symbol;
-       struct expr *expr;
-       struct menu *menu;
-       enum symbol_type type;
-       enum variable_flavor flavor;
-}
-
-%token <string> T_HELPTEXT
-%token <string> T_WORD
-%token <string> T_WORD_QUOTE
-%token T_ALLNOCONFIG_Y
-%token T_BOOL
-%token T_CHOICE
-%token T_CLOSE_PAREN
-%token T_COLON_EQUAL
-%token T_COMMENT
-%token T_CONFIG
-%token T_DEFAULT
-%token T_DEFCONFIG_LIST
-%token T_DEF_BOOL
-%token T_DEF_TRISTATE
-%token T_DEPENDS
-%token T_ENDCHOICE
-%token T_ENDIF
-%token T_ENDMENU
-%token T_HELP
-%token T_HEX
-%token T_IF
-%token T_IMPLY
-%token T_INT
-%token T_MAINMENU
-%token T_MENU
-%token T_MENUCONFIG
-%token T_MODULES
-%token T_ON
-%token T_OPEN_PAREN
-%token T_OPTION
-%token T_OPTIONAL
-%token T_PLUS_EQUAL
-%token T_PROMPT
-%token T_RANGE
-%token T_SELECT
-%token T_SOURCE
-%token T_STRING
-%token T_TRISTATE
-%token T_VISIBLE
-%token T_EOL
-%token <string> T_ASSIGN_VAL
-
-%left T_OR
-%left T_AND
-%left T_EQUAL T_UNEQUAL
-%left T_LESS T_LESS_EQUAL T_GREATER T_GREATER_EQUAL
-%nonassoc T_NOT
-
-%type <string> prompt
-%type <symbol> nonconst_symbol
-%type <symbol> symbol
-%type <type> type logic_type default
-%type <expr> expr
-%type <expr> if_expr
-%type <string> end
-%type <menu> if_entry menu_entry choice_entry
-%type <string> word_opt assign_val
-%type <flavor> assign_op
-
-%destructor {
-       fprintf(stderr, "%s:%d: missing end statement for this entry\n",
-               $$->file->name, $$->lineno);
-       if (current_menu == $$)
-               menu_end_menu();
-} if_entry menu_entry choice_entry
-
-%%
-input: mainmenu_stmt stmt_list | stmt_list;
-
-/* mainmenu entry */
-
-mainmenu_stmt: T_MAINMENU prompt T_EOL
-{
-       menu_add_prompt(P_MENU, $2, NULL);
-};
-
-stmt_list:
-         /* empty */
-       | stmt_list common_stmt
-       | stmt_list choice_stmt
-       | stmt_list menu_stmt
-       | stmt_list T_WORD error T_EOL  { zconf_error("unknown statement \"%s\"", $2); }
-       | stmt_list error T_EOL         { zconf_error("invalid statement"); }
-;
-
-common_stmt:
-         if_stmt
-       | comment_stmt
-       | config_stmt
-       | menuconfig_stmt
-       | source_stmt
-       | assignment_stmt
-;
-
-/* config/menuconfig entry */
-
-config_entry_start: T_CONFIG nonconst_symbol T_EOL
-{
-       $2->flags |= SYMBOL_OPTIONAL;
-       menu_add_entry($2);
-       printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2->name);
-};
-
-config_stmt: config_entry_start config_option_list
-{
-       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
-};
-
-menuconfig_entry_start: T_MENUCONFIG nonconst_symbol T_EOL
-{
-       $2->flags |= SYMBOL_OPTIONAL;
-       menu_add_entry($2);
-       printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2->name);
-};
-
-menuconfig_stmt: menuconfig_entry_start config_option_list
-{
-       if (current_entry->prompt)
-               current_entry->prompt->type = P_MENU;
-       else
-               zconfprint("warning: menuconfig statement without prompt");
-       printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
-};
-
-config_option_list:
-         /* empty */
-       | config_option_list config_option
-       | config_option_list depends
-       | config_option_list help
-;
-
-config_option: type prompt_stmt_opt T_EOL
-{
-       menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
-               zconf_curname(), zconf_lineno(),
-               $1);
-};
-
-config_option: T_PROMPT prompt if_expr T_EOL
-{
-       menu_add_prompt(P_PROMPT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
-};
-
-config_option: default expr if_expr T_EOL
-{
-       menu_add_expr(P_DEFAULT, $2, $3);
-       if ($1 != S_UNKNOWN)
-               menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
-               zconf_curname(), zconf_lineno(),
-               $1);
-};
-
-config_option: T_SELECT nonconst_symbol if_expr T_EOL
-{
-       menu_add_symbol(P_SELECT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
-};
-
-config_option: T_IMPLY nonconst_symbol if_expr T_EOL
-{
-       menu_add_symbol(P_IMPLY, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:imply\n", zconf_curname(), zconf_lineno());
-};
-
-config_option: T_RANGE symbol symbol if_expr T_EOL
-{
-       menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
-       printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
-};
-
-config_option: T_OPTION T_MODULES T_EOL
-{
-       menu_add_option_modules();
-};
-
-config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
-{
-       menu_add_option_defconfig_list();
-};
-
-config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
-{
-       menu_add_option_allnoconfig_y();
-};
-
-/* choice entry */
-
-choice: T_CHOICE word_opt T_EOL
-{
-       struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
-       sym->flags |= SYMBOL_NO_WRITE;
-       menu_add_entry(sym);
-       menu_add_expr(P_CHOICE, NULL, NULL);
-       free($2);
-       printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
-};
-
-choice_entry: choice choice_option_list
-{
-       $$ = menu_add_menu();
-};
-
-choice_end: end
-{
-       if (zconf_endtoken($1, "choice")) {
-               menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
-       }
-};
-
-choice_stmt: choice_entry choice_block choice_end
-;
-
-choice_option_list:
-         /* empty */
-       | choice_option_list choice_option
-       | choice_option_list depends
-       | choice_option_list help
-;
-
-choice_option: T_PROMPT prompt if_expr T_EOL
-{
-       menu_add_prompt(P_PROMPT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
-};
-
-choice_option: logic_type prompt_stmt_opt T_EOL
-{
-       menu_set_type($1);
-       printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
-              zconf_curname(), zconf_lineno(), $1);
-};
-
-choice_option: T_OPTIONAL T_EOL
-{
-       current_entry->sym->flags |= SYMBOL_OPTIONAL;
-       printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
-};
-
-choice_option: T_DEFAULT nonconst_symbol if_expr T_EOL
-{
-       menu_add_symbol(P_DEFAULT, $2, $3);
-       printd(DEBUG_PARSE, "%s:%d:default\n",
-              zconf_curname(), zconf_lineno());
-};
-
-type:
-         logic_type
-       | T_INT                 { $$ = S_INT; }
-       | T_HEX                 { $$ = S_HEX; }
-       | T_STRING              { $$ = S_STRING; }
-
-logic_type:
-         T_BOOL                { $$ = S_BOOLEAN; }
-       | T_TRISTATE            { $$ = S_TRISTATE; }
-
-default:
-         T_DEFAULT             { $$ = S_UNKNOWN; }
-       | T_DEF_BOOL            { $$ = S_BOOLEAN; }
-       | T_DEF_TRISTATE        { $$ = S_TRISTATE; }
-
-choice_block:
-         /* empty */
-       | choice_block common_stmt
-;
-
-/* if entry */
-
-if_entry: T_IF expr T_EOL
-{
-       printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
-       menu_add_entry(NULL);
-       menu_add_dep($2);
-       $$ = menu_add_menu();
-};
-
-if_end: end
-{
-       if (zconf_endtoken($1, "if")) {
-               menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
-       }
-};
-
-if_stmt: if_entry stmt_list if_end
-;
-
-/* menu entry */
-
-menu: T_MENU prompt T_EOL
-{
-       menu_add_entry(NULL);
-       menu_add_prompt(P_MENU, $2, NULL);
-       printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
-};
-
-menu_entry: menu menu_option_list
-{
-       $$ = menu_add_menu();
-};
-
-menu_end: end
-{
-       if (zconf_endtoken($1, "menu")) {
-               menu_end_menu();
-               printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
-       }
-};
-
-menu_stmt: menu_entry stmt_list menu_end
-;
-
-menu_option_list:
-         /* empty */
-       | menu_option_list visible
-       | menu_option_list depends
-;
-
-source_stmt: T_SOURCE prompt T_EOL
-{
-       printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
-       zconf_nextfile($2);
-       free($2);
-};
-
-/* comment entry */
-
-comment: T_COMMENT prompt T_EOL
-{
-       menu_add_entry(NULL);
-       menu_add_prompt(P_COMMENT, $2, NULL);
-       printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
-};
-
-comment_stmt: comment comment_option_list
-;
-
-comment_option_list:
-         /* empty */
-       | comment_option_list depends
-;
-
-/* help option */
-
-help_start: T_HELP T_EOL
-{
-       printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
-       zconf_starthelp();
-};
-
-help: help_start T_HELPTEXT
-{
-       if (current_entry->help) {
-               free(current_entry->help);
-               zconfprint("warning: '%s' defined with more than one help text -- only the last one will be used",
-                          current_entry->sym->name ?: "<choice>");
-       }
-
-       /* Is the help text empty or all whitespace? */
-       if ($2[strspn($2, " \f\n\r\t\v")] == '\0')
-               zconfprint("warning: '%s' defined with blank help text",
-                          current_entry->sym->name ?: "<choice>");
-
-       current_entry->help = $2;
-};
-
-/* depends option */
-
-depends: T_DEPENDS T_ON expr T_EOL
-{
-       menu_add_dep($3);
-       printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
-};
-
-/* visibility option */
-visible: T_VISIBLE if_expr T_EOL
-{
-       menu_add_visibility($2);
-};
-
-/* prompt statement */
-
-prompt_stmt_opt:
-         /* empty */
-       | prompt if_expr
-{
-       menu_add_prompt(P_PROMPT, $1, $2);
-};
-
-prompt:          T_WORD
-       | T_WORD_QUOTE
-;
-
-end:     T_ENDMENU T_EOL       { $$ = "menu"; }
-       | T_ENDCHOICE T_EOL     { $$ = "choice"; }
-       | T_ENDIF T_EOL         { $$ = "if"; }
-;
-
-if_expr:  /* empty */                  { $$ = NULL; }
-       | T_IF expr                     { $$ = $2; }
-;
-
-expr:    symbol                                { $$ = expr_alloc_symbol($1); }
-       | symbol T_LESS symbol                  { $$ = expr_alloc_comp(E_LTH, $1, $3); }
-       | symbol T_LESS_EQUAL symbol            { $$ = expr_alloc_comp(E_LEQ, $1, $3); }
-       | symbol T_GREATER symbol               { $$ = expr_alloc_comp(E_GTH, $1, $3); }
-       | symbol T_GREATER_EQUAL symbol         { $$ = expr_alloc_comp(E_GEQ, $1, $3); }
-       | symbol T_EQUAL symbol                 { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
-       | symbol T_UNEQUAL symbol               { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
-       | T_OPEN_PAREN expr T_CLOSE_PAREN       { $$ = $2; }
-       | T_NOT expr                            { $$ = expr_alloc_one(E_NOT, $2); }
-       | expr T_OR expr                        { $$ = expr_alloc_two(E_OR, $1, $3); }
-       | expr T_AND expr                       { $$ = expr_alloc_two(E_AND, $1, $3); }
-;
-
-/* For symbol definitions, selects, etc., where quotes are not accepted */
-nonconst_symbol: T_WORD { $$ = sym_lookup($1, 0); free($1); };
-
-symbol:          nonconst_symbol
-       | T_WORD_QUOTE  { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
-;
-
-word_opt: /* empty */                  { $$ = NULL; }
-       | T_WORD
-
-/* assignment statement */
-
-assignment_stmt:  T_WORD assign_op assign_val T_EOL    { variable_add($1, $3, $2); free($1); free($3); }
-
-assign_op:
-         T_EQUAL       { $$ = VAR_RECURSIVE; }
-       | T_COLON_EQUAL { $$ = VAR_SIMPLE; }
-       | T_PLUS_EQUAL  { $$ = VAR_APPEND; }
-;
-
-assign_val:
-       /* empty */             { $$ = xstrdup(""); };
-       | T_ASSIGN_VAL
-;
-
-%%
-
-void conf_parse(const char *name)
-{
-       struct symbol *sym;
-       int i;
-
-       zconf_initscan(name);
-
-       _menu_init();
-
-       if (getenv("ZCONF_DEBUG"))
-               yydebug = 1;
-       yyparse();
-
-       /* Variables are expanded in the parse phase. We can free them here. */
-       variable_all_del();
-
-       if (yynerrs)
-               exit(1);
-       if (!modules_sym)
-               modules_sym = sym_find( "n" );
-
-       if (!menu_has_prompt(&rootmenu)) {
-               current_entry = &rootmenu;
-               menu_add_prompt(P_MENU, "Main menu", NULL);
-       }
-
-       menu_finalize(&rootmenu);
-       for_all_symbols(i, sym) {
-               if (sym_check_deps(sym))
-                       yynerrs++;
-       }
-       if (yynerrs)
-               exit(1);
-       sym_set_change_count(1);
-}
-
-static bool zconf_endtoken(const char *tokenname,
-                          const char *expected_tokenname)
-{
-       if (strcmp(tokenname, expected_tokenname)) {
-               zconf_error("unexpected '%s' within %s block",
-                           tokenname, expected_tokenname);
-               yynerrs++;
-               return false;
-       }
-       if (current_menu->file != current_file) {
-               zconf_error("'%s' in different file than '%s'",
-                           tokenname, expected_tokenname);
-               fprintf(stderr, "%s:%d: location of the '%s'\n",
-                       current_menu->file->name, current_menu->lineno,
-                       expected_tokenname);
-               yynerrs++;
-               return false;
-       }
-       return true;
-}
-
-static void zconfprint(const char *err, ...)
-{
-       va_list ap;
-
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
-       va_start(ap, err);
-       vfprintf(stderr, err, ap);
-       va_end(ap);
-       fprintf(stderr, "\n");
-}
-
-static void zconf_error(const char *err, ...)
-{
-       va_list ap;
-
-       yynerrs++;
-       fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
-       va_start(ap, err);
-       vfprintf(stderr, err, ap);
-       va_end(ap);
-       fprintf(stderr, "\n");
-}
-
-static void yyerror(const char *err)
-{
-       fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
-}
-
-static void print_quoted_string(FILE *out, const char *str)
-{
-       const char *p;
-       int len;
-
-       putc('"', out);
-       while ((p = strchr(str, '"'))) {
-               len = p - str;
-               if (len)
-                       fprintf(out, "%.*s", len, str);
-               fputs("\\\"", out);
-               str = p + 1;
-       }
-       fputs(str, out);
-       putc('"', out);
-}
-
-static void print_symbol(FILE *out, struct menu *menu)
-{
-       struct symbol *sym = menu->sym;
-       struct property *prop;
-
-       if (sym_is_choice(sym))
-               fprintf(out, "\nchoice\n");
-       else
-               fprintf(out, "\nconfig %s\n", sym->name);
-       switch (sym->type) {
-       case S_BOOLEAN:
-               fputs("  bool\n", out);
-               break;
-       case S_TRISTATE:
-               fputs("  tristate\n", out);
-               break;
-       case S_STRING:
-               fputs("  string\n", out);
-               break;
-       case S_INT:
-               fputs("  integer\n", out);
-               break;
-       case S_HEX:
-               fputs("  hex\n", out);
-               break;
-       default:
-               fputs("  ???\n", out);
-               break;
-       }
-       for (prop = sym->prop; prop; prop = prop->next) {
-               if (prop->menu != menu)
-                       continue;
-               switch (prop->type) {
-               case P_PROMPT:
-                       fputs("  prompt ", out);
-                       print_quoted_string(out, prop->text);
-                       if (!expr_is_yes(prop->visible.expr)) {
-                               fputs(" if ", out);
-                               expr_fprint(prop->visible.expr, out);
-                       }
-                       fputc('\n', out);
-                       break;
-               case P_DEFAULT:
-                       fputs( "  default ", out);
-                       expr_fprint(prop->expr, out);
-                       if (!expr_is_yes(prop->visible.expr)) {
-                               fputs(" if ", out);
-                               expr_fprint(prop->visible.expr, out);
-                       }
-                       fputc('\n', out);
-                       break;
-               case P_CHOICE:
-                       fputs("  #choice value\n", out);
-                       break;
-               case P_SELECT:
-                       fputs( "  select ", out);
-                       expr_fprint(prop->expr, out);
-                       fputc('\n', out);
-                       break;
-               case P_IMPLY:
-                       fputs( "  imply ", out);
-                       expr_fprint(prop->expr, out);
-                       fputc('\n', out);
-                       break;
-               case P_RANGE:
-                       fputs( "  range ", out);
-                       expr_fprint(prop->expr, out);
-                       fputc('\n', out);
-                       break;
-               case P_MENU:
-                       fputs( "  menu ", out);
-                       print_quoted_string(out, prop->text);
-                       fputc('\n', out);
-                       break;
-               case P_SYMBOL:
-                       fputs( "  symbol ", out);
-                       fprintf(out, "%s\n", prop->sym->name);
-                       break;
-               default:
-                       fprintf(out, "  unknown prop %d!\n", prop->type);
-                       break;
-               }
-       }
-       if (menu->help) {
-               int len = strlen(menu->help);
-               while (menu->help[--len] == '\n')
-                       menu->help[len] = 0;
-               fprintf(out, "  help\n%s\n", menu->help);
-       }
-}
-
-void zconfdump(FILE *out)
-{
-       struct property *prop;
-       struct symbol *sym;
-       struct menu *menu;
-
-       menu = rootmenu.list;
-       while (menu) {
-               if ((sym = menu->sym))
-                       print_symbol(out, menu);
-               else if ((prop = menu->prompt)) {
-                       switch (prop->type) {
-                       case P_COMMENT:
-                               fputs("\ncomment ", out);
-                               print_quoted_string(out, prop->text);
-                               fputs("\n", out);
-                               break;
-                       case P_MENU:
-                               fputs("\nmenu ", out);
-                               print_quoted_string(out, prop->text);
-                               fputs("\n", out);
-                               break;
-                       default:
-                               ;
-                       }
-                       if (!expr_is_yes(prop->visible.expr)) {
-                               fputs("  depends ", out);
-                               expr_fprint(prop->visible.expr, out);
-                               fputc('\n', out);
-                       }
-               }
-
-               if (menu->list)
-                       menu = menu->list;
-               else if (menu->next)
-                       menu = menu->next;
-               else while ((menu = menu->parent)) {
-                       if (menu->prompt && menu->prompt->type == P_MENU)
-                               fputs("\nendmenu\n", out);
-                       if (menu->next) {
-                               menu = menu->next;
-                               break;
-                       }
-               }
-       }
-}
-
-#include "util.c"
-#include "menu.c"
index 43e546d1fb392cd9e157e3cb0d1bd4767e44d051..6f5356380c08fbd9fa9719cfe501e1987495007d 100644 (file)
@@ -1,26 +1,26 @@
-BINUTILS_VER=2.32
+BINUTILS_VER=2.34
 BINUTILS_TAR=binutils-$(BINUTILS_VER).tar.xz
-BINUTILS_URL="https://ftp.gnu.org/gnu/binutils/$(BINUTILS_TAR)"
+BINUTILS_URL="http://ftpmirror.gnu.org/gnu/binutils/$(BINUTILS_TAR)"
 
-NEWLIB_VER=3.1.0
+NEWLIB_VER=3.3.0
 NEWLIB_TAR=newlib-$(NEWLIB_VER).tar.gz
 NEWLIB_URL="ftp://sourceware.org/pub/newlib/$(NEWLIB_TAR)"
 
-GCC_VER=9.1.0
+GCC_VER=10.2.0
 GCC_TAR=gcc-$(GCC_VER).tar.xz
-GCC_URL="https://ftp.gnu.org/gnu/gcc/gcc-$(GCC_VER)/$(GCC_TAR)"
+GCC_URL="http://ftpmirror.gnu.org/gnu/gcc/gcc-$(GCC_VER)/$(GCC_TAR)"
 
 MPFR_VER=4.0.2
 MPFR_TAR=mpfr-$(MPFR_VER).tar.xz
-MPFR_URL="https://ftp.gnu.org/gnu/mpfr/$(MPFR_TAR)"
+MPFR_URL="http://ftpmirror.gnu.org/gnu/mpfr/$(MPFR_TAR)"
 
-GMP_VER=6.1.2
+GMP_VER=6.2.0
 GMP_TAR=gmp-$(GMP_VER).tar.xz
-GMP_URL="https://ftp.gnu.org/gnu/gmp/$(GMP_TAR)"
+GMP_URL="http://ftpmirror.gnu.org/gnu/gmp/$(GMP_TAR)"
 
 MPC_VER=1.1.0
 MPC_TAR=mpc-$(MPC_VER).tar.gz
-MPC_URL="https://ftp.gnu.org/gnu/mpc/$(MPC_TAR)"
+MPC_URL="http://ftpmirror.gnu.org/gnu/mpc/$(MPC_TAR)"
 
 JOBS?=$(shell grep -c ^processor /proc/cpuinfo)
 
index 3a5395960186f470687803a8bc19f02263fbdac8..5fcebf4a69e64657756e7b5040b12cddd4366387 100644 (file)
@@ -1,6 +1,6 @@
-87b565e89a9a684fe4ebeeddb8399dce2599f9c9049854ca8c0dfbdea0e21912  src/gmp-6.1.2.tar.xz
 6985c538143c1208dcb1ac42cedad6ff52e267b47e5f970183a3e75125b43c2e  src/mpc-1.1.0.tar.gz
-fb4fa1cc21e9060719208300a61420e4089d6de6ef59cf533b57fe74801d102a  src/newlib-3.1.0.tar.gz
 1d3be708604eae0e42d578ba93b390c2a145f17743a744d8f3f8c2ad5855a38a  src/mpfr-4.0.2.tar.xz
-0ab6c55dd86a92ed561972ba15b9b70a8b9f75557f896446c82e8b36e473ee04  src/binutils-2.32.tar.xz
-79a66834e96a6050d8fe78db2c3b32fb285b230b855d0a66288235bc04b327a0  src/gcc-9.1.0.tar.xz
+f00b0e8803dc9bab1e2165bd568528135be734df3fabf8d0161828cd56028952  src/binutils-2.34.tar.xz
+258e6cd51b3fbdfc185c716d55f82c08aff57df0c6fbd143cf6ed561267a1526  src/gmp-6.2.0.tar.xz
+58dd9e3eaedf519360d92d84205c3deef0b3fc286685d1c562e245914ef72c66  src/newlib-3.3.0.tar.gz
+b8dd4368bb9c7f0b98188317ee0254dd8cc99d1e3a18d0ff146c855fe16c1d8c  src/gcc-10.2.0.tar.xz