Changeset 28658


Ignore:
Timestamp:
2011-10-28T16:09:12+02:00 (6 years ago)
Author:
nbd
Message:

scripts/config: merge fixes for various issues, including recursive dependency detection/handling (patch by mbm)

Location:
trunk/scripts/config
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/scripts/config/expr.c

    r6502 r28658  
    146146        } 
    147147        if (e1->type == E_SYMBOL && e2->type == E_SYMBOL && 
    148             e1->left.sym == e2->left.sym && (e1->left.sym->flags & (SYMBOL_YES|SYMBOL_NO))) 
     148            e1->left.sym == e2->left.sym && 
     149            (e1->left.sym == &symbol_yes || e1->left.sym == &symbol_no)) 
    149150                return; 
    150151        if (!expr_eq(e1, e2)) 
     
    348349 * e1 || e2 -> ? 
    349350 */ 
    350 struct expr *expr_join_or(struct expr *e1, struct expr *e2) 
     351static struct expr *expr_join_or(struct expr *e1, struct expr *e2) 
    351352{ 
    352353        struct expr *tmp; 
     
    412413} 
    413414 
    414 struct expr *expr_join_and(struct expr *e1, struct expr *e2) 
     415static struct expr *expr_join_and(struct expr *e1, struct expr *e2) 
    415416{ 
    416417        struct expr *tmp; 
     
    10131014} 
    10141015 
    1015 void expr_print(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken) 
     1016void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken) 
    10161017{ 
    10171018        if (!e) { 
    1018                 fn(data, "y"); 
     1019                fn(data, NULL, "y"); 
    10191020                return; 
    10201021        } 
    10211022 
    10221023        if (expr_compare_type(prevtoken, e->type) > 0) 
    1023                 fn(data, "("); 
     1024                fn(data, NULL, "("); 
    10241025        switch (e->type) { 
    10251026        case E_SYMBOL: 
    10261027                if (e->left.sym->name) 
    1027                         fn(data, e->left.sym->name); 
     1028                        fn(data, e->left.sym, e->left.sym->name); 
    10281029                else 
    1029                         fn(data, "<choice>"); 
     1030                        fn(data, NULL, "<choice>"); 
    10301031                break; 
    10311032        case E_NOT: 
    1032                 fn(data, "!"); 
     1033                fn(data, NULL, "!"); 
    10331034                expr_print(e->left.expr, fn, data, E_NOT); 
    10341035                break; 
    10351036        case E_EQUAL: 
    1036                 fn(data, e->left.sym->name); 
    1037                 fn(data, "="); 
    1038                 fn(data, e->right.sym->name); 
     1037                if (e->left.sym->name) 
     1038                        fn(data, e->left.sym, e->left.sym->name); 
     1039                else 
     1040                        fn(data, NULL, "<choice>"); 
     1041                fn(data, NULL, "="); 
     1042                fn(data, e->right.sym, e->right.sym->name); 
    10391043                break; 
    10401044        case E_UNEQUAL: 
    1041                 fn(data, e->left.sym->name); 
    1042                 fn(data, "!="); 
    1043                 fn(data, e->right.sym->name); 
     1045                if (e->left.sym->name) 
     1046                        fn(data, e->left.sym, e->left.sym->name); 
     1047                else 
     1048                        fn(data, NULL, "<choice>"); 
     1049                fn(data, NULL, "!="); 
     1050                fn(data, e->right.sym, e->right.sym->name); 
    10441051                break; 
    10451052        case E_OR: 
    10461053                expr_print(e->left.expr, fn, data, E_OR); 
    1047                 fn(data, " || "); 
     1054                fn(data, NULL, " || "); 
    10481055                expr_print(e->right.expr, fn, data, E_OR); 
    10491056                break; 
    10501057        case E_AND: 
    10511058                expr_print(e->left.expr, fn, data, E_AND); 
    1052                 fn(data, " && "); 
     1059                fn(data, NULL, " && "); 
    10531060                expr_print(e->right.expr, fn, data, E_AND); 
    10541061                break; 
    10551062        case E_CHOICE: 
    1056                 fn(data, e->right.sym->name); 
     1063                fn(data, e->right.sym, e->right.sym->name); 
    10571064                if (e->left.expr) { 
    1058                         fn(data, " ^ "); 
     1065                        fn(data, NULL, " ^ "); 
    10591066                        expr_print(e->left.expr, fn, data, E_CHOICE); 
    10601067                } 
    10611068                break; 
    10621069        case E_RANGE: 
    1063                 fn(data, "["); 
    1064                 fn(data, e->left.sym->name); 
    1065                 fn(data, " "); 
    1066                 fn(data, e->right.sym->name); 
    1067                 fn(data, "]"); 
     1070                fn(data, NULL, "["); 
     1071                fn(data, e->left.sym, e->left.sym->name); 
     1072                fn(data, NULL, " "); 
     1073                fn(data, e->right.sym, e->right.sym->name); 
     1074                fn(data, NULL, "]"); 
    10681075                break; 
    10691076        default: 
     
    10711078                char buf[32]; 
    10721079                sprintf(buf, "<unknown type %d>", e->type); 
    1073                 fn(data, buf); 
     1080                fn(data, NULL, buf); 
    10741081                break; 
    10751082          } 
    10761083        } 
    10771084        if (expr_compare_type(prevtoken, e->type) > 0) 
    1078                 fn(data, ")"); 
    1079 } 
    1080  
    1081 static void expr_print_file_helper(void *data, const char *str) 
     1085                fn(data, NULL, ")"); 
     1086} 
     1087 
     1088static void expr_print_file_helper(void *data, struct symbol *sym, const char *str) 
    10821089{ 
    10831090        fwrite(str, strlen(str), 1, data); 
     
    10891096} 
    10901097 
    1091 static void expr_print_gstr_helper(void *data, const char *str) 
    1092 { 
    1093         str_append((struct gstr*)data, str); 
     1098static void expr_print_gstr_helper(void *data, struct symbol *sym, const char *str) 
     1099{ 
     1100        struct gstr *gs = (struct gstr*)data; 
     1101        const char *sym_str = NULL; 
     1102 
     1103        if (sym) 
     1104                sym_str = sym_get_string_value(sym); 
     1105 
     1106        if (gs->max_width) { 
     1107                unsigned extra_length = strlen(str); 
     1108                const char *last_cr = strrchr(gs->s, '\n'); 
     1109                unsigned last_line_length; 
     1110 
     1111                if (sym_str) 
     1112                        extra_length += 4 + strlen(sym_str); 
     1113 
     1114                if (!last_cr) 
     1115                        last_cr = gs->s; 
     1116 
     1117                last_line_length = strlen(gs->s) - (last_cr - gs->s); 
     1118 
     1119                if ((last_line_length + extra_length) > gs->max_width) 
     1120                        str_append(gs, "\\\n"); 
     1121        } 
     1122 
     1123        str_append(gs, str); 
     1124        if (sym && sym->type != S_UNKNOWN) 
     1125                str_printf(gs, " [=%s]", sym_str); 
    10941126} 
    10951127 
  • trunk/scripts/config/expr.h

    r6647 r28658  
    7878}; 
    7979 
    80 #define for_all_symbols(i, sym) for (i = 0; i < 257; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) 
     80#define for_all_symbols(i, sym) for (i = 0; i < SYMBOL_HASHSIZE; i++) for (sym = symbol_hash[i]; sym; sym = sym->next) if (sym->type != S_OTHER) 
    8181 
    8282#define SYMBOL_YES              0x0001 
     
    9999#define SYMBOL_MAXLENGTH        256 
    100100#define SYMBOL_HASHSIZE         257 
    101 #define SYMBOL_HASHMASK         0xff 
    102101 
    103102enum prop_type { 
  • trunk/scripts/config/lkc.h

    r6502 r28658  
    8989        size_t len; 
    9090        char  *s; 
     91        /* 
     92         * when max_width is not zero long lines in string s (if any) get 
     93         * wrapped not to exceed the max_width value 
     94         */ 
     95        int max_width; 
    9196}; 
    9297struct gstr str_new(void); 
  • trunk/scripts/config/lkc_proto.h

    r9300 r28658  
    4040/* expr.c */ 
    4141P(expr_compare_type,int,(enum expr_type t1, enum expr_type t2)); 
    42 P(expr_print,void,(struct expr *e, void (*fn)(void *, const char *), void *data, int prevtoken)); 
     42P(expr_print,void,(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken)); 
  • trunk/scripts/config/mconf.c

    r6647 r28658  
    873873        struct symbol *sym = menu->sym; 
    874874 
     875        help.max_width = cols - 10; 
     876 
    875877        if (sym->help) 
    876878        { 
  • trunk/scripts/config/symbol.c

    r6753 r28658  
    5757        sym = sym_lookup("ARCH", 0); 
    5858        sym->type = S_STRING; 
    59         sym->flags |= SYMBOL_AUTO; 
    6059        p = getenv("ARCH"); 
    6160        if (p) 
     
    363362        sym_validate_range(sym); 
    364363 
    365         if (memcmp(&oldval, &sym->curr, sizeof(oldval))) 
     364        if (memcmp(&oldval, &sym->curr, sizeof(oldval))) { 
     365                sym->flags &= ~SYMBOL_VALID; 
    366366                sym_set_changed(sym); 
    367  
    368         if (modules_sym == sym) 
    369                 modules_val = modules_sym->curr.tri; 
     367                if (modules_sym == sym) { 
     368                        sym_set_all_changed(); 
     369                        modules_val = modules_sym->curr.tri; 
     370                } 
     371        } 
    370372 
    371373        if (sym_is_choice(sym)) { 
     
    378380                } 
    379381        } 
     382 
     383        if (sym->flags & SYMBOL_AUTO) 
     384                sym->flags &= ~SYMBOL_WRITE; 
    380385} 
    381386 
     
    463468        if (oldval != val) { 
    464469                sym_clear_all_valid(); 
    465                 if (sym == modules_sym) 
    466                         sym_set_all_changed(); 
    467470        } 
    468471 
     
    757760                        } 
    758761                } 
     762                sym_calc_value(sym); 
    759763                sym_arr[cnt++] = sym; 
    760764        } 
  • trunk/scripts/config/zconf.tab.c_shipped

    r6647 r28658  
    170170static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken); 
    171171 
    172 struct symbol *symbol_hash[257]; 
     172struct symbol *symbol_hash[SYMBOL_HASHSIZE]; 
    173173 
    174174static struct menu *current_menu, *current_entry; 
Note: See TracChangeset for help on using the changeset viewer.