[backfire] uhttpd: merge r28792
[openwrt-10.03/.git] / scripts / config / mconf.c
index 2ef24aa5b69c11dbdb898e31a0b91c6ae507bc57..8c58b623863d54d91c6ad1df1379103fe66303a0 100644 (file)
@@ -22,6 +22,7 @@
 #include <unistd.h>
 #include <locale.h>
 
+#define BUFSIZE 524288
 #define LKC_DIRECT_LINK
 #include "lkc.h"
 
@@ -254,10 +255,10 @@ search_help[] = N_(
        "          USB$ => find all CONFIG_ symbols ending with USB\n"
        "\n");
 
-static char buf[4096], *bufptr = buf;
-static char input_buf[4096];
+static char buf[BUFSIZE], *bufptr = buf;
+static char input_buf[BUFSIZE];
 static char filename[PATH_MAX+1] = ".config";
-static char *args[1024], **argptr = args;
+static char *args[BUFSIZE], **argptr = args;
 static int indent;
 static struct termios ios_org;
 static int rows = 0, cols = 0;
@@ -404,6 +405,7 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
                                       sym_get_string_value(sym));
        for_all_prompts(sym, prop)
                get_prompt_str(r, prop);
+
        hit = false;
        for_all_properties(sym, prop, P_SELECT) {
                if (!hit) {
@@ -415,11 +417,29 @@ static void get_symbol_str(struct gstr *r, struct symbol *sym)
        }
        if (hit)
                str_append(r, "\n");
+
+       hit = false;
+       for_all_properties(sym, prop, P_DESELECT) {
+               if (!hit) {
+                       str_append(r, "  Deselects: ");
+                       hit = true;
+               } else
+                       str_printf(r, " && ");
+               expr_gstr_print(prop->expr, r);
+       }
+       if (hit)
+               str_append(r, "\n");
+
        if (sym->rev_dep.expr) {
                str_append(r, "  Selected by: ");
                expr_gstr_print(sym->rev_dep.expr, r);
                str_append(r, "\n");
        }
+       if (sym->rev_dep_inv.expr) {
+               str_append(r, "  Deselected by: ");
+               expr_gstr_print(sym->rev_dep_inv.expr, r);
+               str_append(r, "\n");
+       }
        str_append(r, "\n\n");
 }
 
@@ -737,6 +757,8 @@ static void conf(struct menu *menu)
                if (menu == &rootmenu) {
                        cprint(":");
                        cprint("--- ");
+                       cprint("D");
+                       cprint(_("    Reset to defaults"));
                        cprint("L");
                        cprint(_("    Load an Alternate Configuration File"));
                        cprint("S");
@@ -783,6 +805,9 @@ static void conf(struct menu *menu)
                        case 's':
                                conf_string(submenu);
                                break;
+                       case 'D':
+                               conf_reset();
+                               break;
                        case 'L':
                                conf_load();
                                break;
@@ -882,6 +907,7 @@ static void conf_choice(struct menu *menu)
        const char *prompt = menu_get_prompt(menu);
        struct menu *child;
        struct symbol *active;
+       struct property *prop;
        int stat;
 
        active = sym_get_choice_value(menu->sym);
@@ -914,6 +940,13 @@ static void conf_choice(struct menu *menu)
                case 0:
                        if (sscanf(input_buf, "%p", &child) != 1)
                                break;
+                       
+                       if (sym_get_tristate_value(child->sym) != yes) {
+                               for_all_properties(menu->sym, prop, P_RESET) {
+                                       if (expr_calc_value(prop->visible.expr) != no)
+                                               conf_reset();
+                               }
+                       }
                        sym_set_tristate_value(child->sym, yes);
                        return;
                case 1: