carl9170: Update based on commit 467556acea56f361a21b2a3761ca056b9da2d237 dated Nov...
[linux-libre-firmware.git] / carl9170fw / config / menu.c
index c1d53200c306dc6202cbcc13555a05333c34411a..e9357931b47db3fdf7f63da842a045697e038ed9 100644 (file)
@@ -119,12 +119,13 @@ void menu_set_type(int type)
                sym->type = type;
                return;
        }
-       menu_warn(current_entry, "type of '%s' redefined from '%s' to '%s'",
-           sym->name ? sym->name : "<choice>",
-           sym_type_name(sym->type), sym_type_name(type));
+       menu_warn(current_entry,
+               "ignoring type redefinition of '%s' from '%s' to '%s'",
+               sym->name ? sym->name : "<choice>",
+               sym_type_name(sym->type), sym_type_name(type));
 }
 
-struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
+static struct property *menu_add_prop(enum prop_type type, char *prompt, struct expr *expr, struct expr *dep)
 {
        struct property *prop = prop_alloc(type, current_entry->sym);
 
@@ -216,6 +217,9 @@ void menu_add_option(int token, char *arg)
        case T_OPT_ENV:
                prop_add_env(arg);
                break;
+       case T_OPT_ALLNOCONFIG_Y:
+               current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
+               break;
        }
 }
 
@@ -229,6 +233,8 @@ static void sym_check_prop(struct symbol *sym)
 {
        struct property *prop;
        struct symbol *sym2;
+       char *use;
+
        for (prop = sym->prop; prop; prop = prop->next) {
                switch (prop->type) {
                case P_DEFAULT:
@@ -248,23 +254,25 @@ static void sym_check_prop(struct symbol *sym)
                        }
                        break;
                case P_SELECT:
+               case P_IMPLY:
+                       use = prop->type == P_SELECT ? "select" : "imply";
                        sym2 = prop_get_symbol(prop);
                        if (sym->type != S_BOOLEAN && sym->type != S_TRISTATE)
                                prop_warn(prop,
-                                   "config symbol '%s' uses select, but is "
-                                   "not boolean or tristate", sym->name);
+                                   "config symbol '%s' uses %s, but is "
+                                   "not boolean or tristate", sym->name, use);
                        else if (sym2->type != S_UNKNOWN &&
-                                sym2->type != S_BOOLEAN &&
-                                sym2->type != S_TRISTATE)
+                                sym2->type != S_BOOLEAN &&
+                                sym2->type != S_TRISTATE)
                                prop_warn(prop,
-                                   "'%s' has wrong type. 'select' only "
+                                   "'%s' has wrong type. '%s' only "
                                    "accept arguments of boolean and "
-                                   "tristate type", sym2->name);
+                                   "tristate type", sym2->name, use);
                        break;
                case P_RANGE:
                        if (sym->type != S_INT && sym->type != S_HEX)
                                prop_warn(prop, "range is only allowed "
-                                               "for int or hex symbols");
+                                               "for int or hex symbols");
                        if (!menu_validate_number(sym, prop->expr->left.sym) ||
                            !menu_validate_number(sym, prop->expr->right.sym))
                                prop_warn(prop, "range is invalid");
@@ -329,6 +337,10 @@ void menu_finalize(struct menu *parent)
                                        struct symbol *es = prop_get_symbol(prop);
                                        es->rev_dep.expr = expr_alloc_or(es->rev_dep.expr,
                                                        expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
+                               } else if (prop->type == P_IMPLY) {
+                                       struct symbol *es = prop_get_symbol(prop);
+                                       es->implied.expr = expr_alloc_or(es->implied.expr,
+                                                       expr_alloc_and(expr_alloc_symbol(menu->sym), expr_copy(dep)));
                                }
                        }
                }
@@ -473,7 +485,7 @@ bool menu_is_visible(struct menu *menu)
 
        if (menu->visibility) {
                if (expr_calc_value(menu->visibility) == no)
-                       return no;
+                       return false;
        }
 
        sym = menu->sym;
@@ -544,7 +556,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
 {
        int i, j;
        struct menu *submenu[8], *menu, *location = NULL;
-       struct jump_key *jump;
+       struct jump_key *jump = NULL;
 
        str_printf(r, _("Prompt: %s\n"), _(prop->text));
        menu = prop->menu->parent;
@@ -582,8 +594,8 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
                str_printf(r, _("  Location:\n"));
                for (j = 4; --i >= 0; j += 2) {
                        menu = submenu[i];
-                       if (head && location && menu == location)
-                               jump->offset = r->len - 1;
+                       if (jump && menu == location)
+                               jump->offset = strlen(r->s);
                        str_printf(r, "%*c-> %s", j, ' ',
                                   _(menu_get_prompt(menu)));
                        if (menu->sym) {
@@ -597,7 +609,7 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
 }
 
 /*
- * get peoperty of type P_SYMBOL
+ * get property of type P_SYMBOL
  */
 static struct property *get_symbol_prop(struct symbol *sym)
 {
@@ -608,13 +620,30 @@ static struct property *get_symbol_prop(struct symbol *sym)
        return prop;
 }
 
+static void get_symbol_props_str(struct gstr *r, struct symbol *sym,
+                                enum prop_type tok, const char *prefix)
+{
+       bool hit = false;
+       struct property *prop;
+
+       for_all_properties(sym, prop, tok) {
+               if (!hit) {
+                       str_append(r, prefix);
+                       hit = true;
+               } else
+                       str_printf(r, " && ");
+               expr_gstr_print(prop->expr, r);
+       }
+       if (hit)
+               str_append(r, "\n");
+}
+
 /*
  * head is optional and may be NULL
  */
-void get_symbol_str(struct gstr *r, struct symbol *sym,
+static void get_symbol_str(struct gstr *r, struct symbol *sym,
                    struct list_head *head)
 {
-       bool hit;
        struct property *prop;
 
        if (sym && sym->name) {
@@ -644,22 +673,20 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,
                }
        }
 
-       hit = false;
-       for_all_properties(sym, prop, P_SELECT) {
-               if (!hit) {
-                       str_append(r, "  Selects: ");
-                       hit = true;
-               } else
-                       str_printf(r, " && ");
-               expr_gstr_print(prop->expr, r);
-       }
-       if (hit)
-               str_append(r, "\n");
+       get_symbol_props_str(r, sym, P_SELECT, _("  Selects: "));
        if (sym->rev_dep.expr) {
                str_append(r, _("  Selected by: "));
                expr_gstr_print(sym->rev_dep.expr, r);
                str_append(r, "\n");
        }
+
+       get_symbol_props_str(r, sym, P_IMPLY, _("  Implies: "));
+       if (sym->implied.expr) {
+               str_append(r, _("  Implied by: "));
+               expr_gstr_print(sym->implied.expr, r);
+               str_append(r, "\n");
+       }
+
        str_append(r, "\n\n");
 }