Annotation of qemu/roms/seabios/tools/kconfig/zconf.y, revision 1.1.1.1

1.1       root        1: %{
                      2: /*
                      3:  * Copyright (C) 2002 Roman Zippel <[email protected]>
                      4:  * Released under the terms of the GNU GPL v2.0.
                      5:  */
                      6: 
                      7: #include <ctype.h>
                      8: #include <stdarg.h>
                      9: #include <stdio.h>
                     10: #include <stdlib.h>
                     11: #include <string.h>
                     12: #include <stdbool.h>
                     13: 
                     14: #define LKC_DIRECT_LINK
                     15: #include "lkc.h"
                     16: 
                     17: #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
                     18: 
                     19: #define PRINTD         0x0001
                     20: #define DEBUG_PARSE    0x0002
                     21: 
                     22: int cdebug = PRINTD;
                     23: 
                     24: extern int zconflex(void);
                     25: static void zconfprint(const char *err, ...);
                     26: static void zconf_error(const char *err, ...);
                     27: static void zconferror(const char *err);
                     28: static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken);
                     29: 
                     30: struct symbol *symbol_hash[SYMBOL_HASHSIZE];
                     31: 
                     32: static struct menu *current_menu, *current_entry;
                     33: 
                     34: #define YYDEBUG 0
                     35: #if YYDEBUG
                     36: #define YYERROR_VERBOSE
                     37: #endif
                     38: %}
                     39: %expect 30
                     40: 
                     41: %union
                     42: {
                     43:        char *string;
                     44:        struct file *file;
                     45:        struct symbol *symbol;
                     46:        struct expr *expr;
                     47:        struct menu *menu;
                     48:        struct kconf_id *id;
                     49: }
                     50: 
                     51: %token <id>T_MAINMENU
                     52: %token <id>T_MENU
                     53: %token <id>T_ENDMENU
                     54: %token <id>T_SOURCE
                     55: %token <id>T_CHOICE
                     56: %token <id>T_ENDCHOICE
                     57: %token <id>T_COMMENT
                     58: %token <id>T_CONFIG
                     59: %token <id>T_MENUCONFIG
                     60: %token <id>T_HELP
                     61: %token <string> T_HELPTEXT
                     62: %token <id>T_IF
                     63: %token <id>T_ENDIF
                     64: %token <id>T_DEPENDS
                     65: %token <id>T_OPTIONAL
                     66: %token <id>T_PROMPT
                     67: %token <id>T_TYPE
                     68: %token <id>T_DEFAULT
                     69: %token <id>T_SELECT
                     70: %token <id>T_RANGE
                     71: %token <id>T_VISIBLE
                     72: %token <id>T_OPTION
                     73: %token <id>T_ON
                     74: %token <string> T_WORD
                     75: %token <string> T_WORD_QUOTE
                     76: %token T_UNEQUAL
                     77: %token T_CLOSE_PAREN
                     78: %token T_OPEN_PAREN
                     79: %token T_EOL
                     80: 
                     81: %left T_OR
                     82: %left T_AND
                     83: %left T_EQUAL T_UNEQUAL
                     84: %nonassoc T_NOT
                     85: 
                     86: %type <string> prompt
                     87: %type <symbol> symbol
                     88: %type <expr> expr
                     89: %type <expr> if_expr
                     90: %type <id> end
                     91: %type <id> option_name
                     92: %type <menu> if_entry menu_entry choice_entry
                     93: %type <string> symbol_option_arg word_opt
                     94: 
                     95: %destructor {
                     96:        fprintf(stderr, "%s:%d: missing end statement for this entry\n",
                     97:                $$->file->name, $$->lineno);
                     98:        if (current_menu == $$)
                     99:                menu_end_menu();
                    100: } if_entry menu_entry choice_entry
                    101: 
                    102: %{
                    103: /* Include zconf.hash.c here so it can see the token constants. */
                    104: #include "zconf.hash.c"
                    105: %}
                    106: 
                    107: %%
                    108: input: nl start | start;
                    109: 
                    110: start: mainmenu_stmt stmt_list | stmt_list;
                    111: 
                    112: stmt_list:
                    113:          /* empty */
                    114:        | stmt_list common_stmt
                    115:        | stmt_list choice_stmt
                    116:        | stmt_list menu_stmt
                    117:        | stmt_list end                 { zconf_error("unexpected end statement"); }
                    118:        | stmt_list T_WORD error T_EOL  { zconf_error("unknown statement \"%s\"", $2); }
                    119:        | stmt_list option_name error T_EOL
                    120: {
                    121:        zconf_error("unexpected option \"%s\"", kconf_id_strings + $2->name);
                    122: }
                    123:        | stmt_list error T_EOL         { zconf_error("invalid statement"); }
                    124: ;
                    125: 
                    126: option_name:
                    127:        T_DEPENDS | T_PROMPT | T_TYPE | T_SELECT | T_OPTIONAL | T_RANGE | T_DEFAULT | T_VISIBLE
                    128: ;
                    129: 
                    130: common_stmt:
                    131:          T_EOL
                    132:        | if_stmt
                    133:        | comment_stmt
                    134:        | config_stmt
                    135:        | menuconfig_stmt
                    136:        | source_stmt
                    137: ;
                    138: 
                    139: option_error:
                    140:          T_WORD error T_EOL            { zconf_error("unknown option \"%s\"", $1); }
                    141:        | error T_EOL                   { zconf_error("invalid option"); }
                    142: ;
                    143: 
                    144: 
                    145: /* config/menuconfig entry */
                    146: 
                    147: config_entry_start: T_CONFIG T_WORD T_EOL
                    148: {
                    149:        struct symbol *sym = sym_lookup($2, 0);
                    150:        sym->flags |= SYMBOL_OPTIONAL;
                    151:        menu_add_entry(sym);
                    152:        printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), $2);
                    153: };
                    154: 
                    155: config_stmt: config_entry_start config_option_list
                    156: {
                    157:        menu_end_entry();
                    158:        printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
                    159: };
                    160: 
                    161: menuconfig_entry_start: T_MENUCONFIG T_WORD T_EOL
                    162: {
                    163:        struct symbol *sym = sym_lookup($2, 0);
                    164:        sym->flags |= SYMBOL_OPTIONAL;
                    165:        menu_add_entry(sym);
                    166:        printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), $2);
                    167: };
                    168: 
                    169: menuconfig_stmt: menuconfig_entry_start config_option_list
                    170: {
                    171:        if (current_entry->prompt)
                    172:                current_entry->prompt->type = P_MENU;
                    173:        else
                    174:                zconfprint("warning: menuconfig statement without prompt");
                    175:        menu_end_entry();
                    176:        printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
                    177: };
                    178: 
                    179: config_option_list:
                    180:          /* empty */
                    181:        | config_option_list config_option
                    182:        | config_option_list symbol_option
                    183:        | config_option_list depends
                    184:        | config_option_list help
                    185:        | config_option_list option_error
                    186:        | config_option_list T_EOL
                    187: ;
                    188: 
                    189: config_option: T_TYPE prompt_stmt_opt T_EOL
                    190: {
                    191:        menu_set_type($1->stype);
                    192:        printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
                    193:                zconf_curname(), zconf_lineno(),
                    194:                $1->stype);
                    195: };
                    196: 
                    197: config_option: T_PROMPT prompt if_expr T_EOL
                    198: {
                    199:        menu_add_prompt(P_PROMPT, $2, $3);
                    200:        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
                    201: };
                    202: 
                    203: config_option: T_DEFAULT expr if_expr T_EOL
                    204: {
                    205:        menu_add_expr(P_DEFAULT, $2, $3);
                    206:        if ($1->stype != S_UNKNOWN)
                    207:                menu_set_type($1->stype);
                    208:        printd(DEBUG_PARSE, "%s:%d:default(%u)\n",
                    209:                zconf_curname(), zconf_lineno(),
                    210:                $1->stype);
                    211: };
                    212: 
                    213: config_option: T_SELECT T_WORD if_expr T_EOL
                    214: {
                    215:        menu_add_symbol(P_SELECT, sym_lookup($2, 0), $3);
                    216:        printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
                    217: };
                    218: 
                    219: config_option: T_RANGE symbol symbol if_expr T_EOL
                    220: {
                    221:        menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,$2, $3), $4);
                    222:        printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
                    223: };
                    224: 
                    225: symbol_option: T_OPTION symbol_option_list T_EOL
                    226: ;
                    227: 
                    228: symbol_option_list:
                    229:          /* empty */
                    230:        | symbol_option_list T_WORD symbol_option_arg
                    231: {
                    232:        struct kconf_id *id = kconf_id_lookup($2, strlen($2));
                    233:        if (id && id->flags & TF_OPTION)
                    234:                menu_add_option(id->token, $3);
                    235:        else
                    236:                zconfprint("warning: ignoring unknown option %s", $2);
                    237:        free($2);
                    238: };
                    239: 
                    240: symbol_option_arg:
                    241:          /* empty */           { $$ = NULL; }
                    242:        | T_EQUAL prompt        { $$ = $2; }
                    243: ;
                    244: 
                    245: /* choice entry */
                    246: 
                    247: choice: T_CHOICE word_opt T_EOL
                    248: {
                    249:        struct symbol *sym = sym_lookup($2, SYMBOL_CHOICE);
                    250:        sym->flags |= SYMBOL_AUTO;
                    251:        menu_add_entry(sym);
                    252:        menu_add_expr(P_CHOICE, NULL, NULL);
                    253:        printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
                    254: };
                    255: 
                    256: choice_entry: choice choice_option_list
                    257: {
                    258:        $$ = menu_add_menu();
                    259: };
                    260: 
                    261: choice_end: end
                    262: {
                    263:        if (zconf_endtoken($1, T_CHOICE, T_ENDCHOICE)) {
                    264:                menu_end_menu();
                    265:                printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
                    266:        }
                    267: };
                    268: 
                    269: choice_stmt: choice_entry choice_block choice_end
                    270: ;
                    271: 
                    272: choice_option_list:
                    273:          /* empty */
                    274:        | choice_option_list choice_option
                    275:        | choice_option_list depends
                    276:        | choice_option_list help
                    277:        | choice_option_list T_EOL
                    278:        | choice_option_list option_error
                    279: ;
                    280: 
                    281: choice_option: T_PROMPT prompt if_expr T_EOL
                    282: {
                    283:        menu_add_prompt(P_PROMPT, $2, $3);
                    284:        printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
                    285: };
                    286: 
                    287: choice_option: T_TYPE prompt_stmt_opt T_EOL
                    288: {
                    289:        if ($1->stype == S_BOOLEAN || $1->stype == S_TRISTATE) {
                    290:                menu_set_type($1->stype);
                    291:                printd(DEBUG_PARSE, "%s:%d:type(%u)\n",
                    292:                        zconf_curname(), zconf_lineno(),
                    293:                        $1->stype);
                    294:        } else
                    295:                YYERROR;
                    296: };
                    297: 
                    298: choice_option: T_OPTIONAL T_EOL
                    299: {
                    300:        current_entry->sym->flags |= SYMBOL_OPTIONAL;
                    301:        printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
                    302: };
                    303: 
                    304: choice_option: T_DEFAULT T_WORD if_expr T_EOL
                    305: {
                    306:        if ($1->stype == S_UNKNOWN) {
                    307:                menu_add_symbol(P_DEFAULT, sym_lookup($2, 0), $3);
                    308:                printd(DEBUG_PARSE, "%s:%d:default\n",
                    309:                        zconf_curname(), zconf_lineno());
                    310:        } else
                    311:                YYERROR;
                    312: };
                    313: 
                    314: choice_block:
                    315:          /* empty */
                    316:        | choice_block common_stmt
                    317: ;
                    318: 
                    319: /* if entry */
                    320: 
                    321: if_entry: T_IF expr nl
                    322: {
                    323:        printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
                    324:        menu_add_entry(NULL);
                    325:        menu_add_dep($2);
                    326:        $$ = menu_add_menu();
                    327: };
                    328: 
                    329: if_end: end
                    330: {
                    331:        if (zconf_endtoken($1, T_IF, T_ENDIF)) {
                    332:                menu_end_menu();
                    333:                printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
                    334:        }
                    335: };
                    336: 
                    337: if_stmt: if_entry if_block if_end
                    338: ;
                    339: 
                    340: if_block:
                    341:          /* empty */
                    342:        | if_block common_stmt
                    343:        | if_block menu_stmt
                    344:        | if_block choice_stmt
                    345: ;
                    346: 
                    347: /* mainmenu entry */
                    348: 
                    349: mainmenu_stmt: T_MAINMENU prompt nl
                    350: {
                    351:        menu_add_prompt(P_MENU, $2, NULL);
                    352: };
                    353: 
                    354: /* menu entry */
                    355: 
                    356: menu: T_MENU prompt T_EOL
                    357: {
                    358:        menu_add_entry(NULL);
                    359:        menu_add_prompt(P_MENU, $2, NULL);
                    360:        printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
                    361: };
                    362: 
                    363: menu_entry: menu visibility_list depends_list
                    364: {
                    365:        $$ = menu_add_menu();
                    366: };
                    367: 
                    368: menu_end: end
                    369: {
                    370:        if (zconf_endtoken($1, T_MENU, T_ENDMENU)) {
                    371:                menu_end_menu();
                    372:                printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
                    373:        }
                    374: };
                    375: 
                    376: menu_stmt: menu_entry menu_block menu_end
                    377: ;
                    378: 
                    379: menu_block:
                    380:          /* empty */
                    381:        | menu_block common_stmt
                    382:        | menu_block menu_stmt
                    383:        | menu_block choice_stmt
                    384: ;
                    385: 
                    386: source_stmt: T_SOURCE prompt T_EOL
                    387: {
                    388:        printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), $2);
                    389:        zconf_nextfile($2);
                    390: };
                    391: 
                    392: /* comment entry */
                    393: 
                    394: comment: T_COMMENT prompt T_EOL
                    395: {
                    396:        menu_add_entry(NULL);
                    397:        menu_add_prompt(P_COMMENT, $2, NULL);
                    398:        printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
                    399: };
                    400: 
                    401: comment_stmt: comment depends_list
                    402: {
                    403:        menu_end_entry();
                    404: };
                    405: 
                    406: /* help option */
                    407: 
                    408: help_start: T_HELP T_EOL
                    409: {
                    410:        printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
                    411:        zconf_starthelp();
                    412: };
                    413: 
                    414: help: help_start T_HELPTEXT
                    415: {
                    416:        current_entry->help = $2;
                    417: };
                    418: 
                    419: /* depends option */
                    420: 
                    421: depends_list:
                    422:          /* empty */
                    423:        | depends_list depends
                    424:        | depends_list T_EOL
                    425:        | depends_list option_error
                    426: ;
                    427: 
                    428: depends: T_DEPENDS T_ON expr T_EOL
                    429: {
                    430:        menu_add_dep($3);
                    431:        printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
                    432: };
                    433: 
                    434: /* visibility option */
                    435: 
                    436: visibility_list:
                    437:          /* empty */
                    438:        | visibility_list visible
                    439:        | visibility_list T_EOL
                    440: ;
                    441: 
                    442: visible: T_VISIBLE if_expr
                    443: {
                    444:        menu_add_visibility($2);
                    445: };
                    446: 
                    447: /* prompt statement */
                    448: 
                    449: prompt_stmt_opt:
                    450:          /* empty */
                    451:        | prompt if_expr
                    452: {
                    453:        menu_add_prompt(P_PROMPT, $1, $2);
                    454: };
                    455: 
                    456: prompt:          T_WORD
                    457:        | T_WORD_QUOTE
                    458: ;
                    459: 
                    460: end:     T_ENDMENU T_EOL       { $$ = $1; }
                    461:        | T_ENDCHOICE T_EOL     { $$ = $1; }
                    462:        | T_ENDIF T_EOL         { $$ = $1; }
                    463: ;
                    464: 
                    465: nl:
                    466:          T_EOL
                    467:        | nl T_EOL
                    468: ;
                    469: 
                    470: if_expr:  /* empty */                  { $$ = NULL; }
                    471:        | T_IF expr                     { $$ = $2; }
                    472: ;
                    473: 
                    474: expr:    symbol                                { $$ = expr_alloc_symbol($1); }
                    475:        | symbol T_EQUAL symbol                 { $$ = expr_alloc_comp(E_EQUAL, $1, $3); }
                    476:        | symbol T_UNEQUAL symbol               { $$ = expr_alloc_comp(E_UNEQUAL, $1, $3); }
                    477:        | T_OPEN_PAREN expr T_CLOSE_PAREN       { $$ = $2; }
                    478:        | T_NOT expr                            { $$ = expr_alloc_one(E_NOT, $2); }
                    479:        | expr T_OR expr                        { $$ = expr_alloc_two(E_OR, $1, $3); }
                    480:        | expr T_AND expr                       { $$ = expr_alloc_two(E_AND, $1, $3); }
                    481: ;
                    482: 
                    483: symbol:          T_WORD        { $$ = sym_lookup($1, 0); free($1); }
                    484:        | T_WORD_QUOTE  { $$ = sym_lookup($1, SYMBOL_CONST); free($1); }
                    485: ;
                    486: 
                    487: word_opt: /* empty */                  { $$ = NULL; }
                    488:        | T_WORD
                    489: 
                    490: %%
                    491: 
                    492: void conf_parse(const char *name)
                    493: {
                    494:        struct symbol *sym;
                    495:        int i;
                    496: 
                    497:        zconf_initscan(name);
                    498: 
                    499:        sym_init();
                    500:        _menu_init();
                    501:        modules_sym = sym_lookup(NULL, 0);
                    502:        modules_sym->type = S_BOOLEAN;
                    503:        modules_sym->flags |= SYMBOL_AUTO;
                    504:        rootmenu.prompt = menu_add_prompt(P_MENU, "Linux Kernel Configuration", NULL);
                    505: 
                    506: #if YYDEBUG
                    507:        if (getenv("ZCONF_DEBUG"))
                    508:                zconfdebug = 1;
                    509: #endif
                    510:        zconfparse();
                    511:        if (zconfnerrs)
                    512:                exit(1);
                    513:        if (!modules_sym->prop) {
                    514:                struct property *prop;
                    515: 
                    516:                prop = prop_alloc(P_DEFAULT, modules_sym);
                    517:                prop->expr = expr_alloc_symbol(sym_lookup("MODULES", 0));
                    518:        }
                    519: 
                    520:        rootmenu.prompt->text = _(rootmenu.prompt->text);
                    521:        rootmenu.prompt->text = sym_expand_string_value(rootmenu.prompt->text);
                    522: 
                    523:        menu_finalize(&rootmenu);
                    524:        for_all_symbols(i, sym) {
                    525:                if (sym_check_deps(sym))
                    526:                        zconfnerrs++;
                    527:         }
                    528:        if (zconfnerrs)
                    529:                exit(1);
                    530:        sym_set_change_count(1);
                    531: }
                    532: 
                    533: static const char *zconf_tokenname(int token)
                    534: {
                    535:        switch (token) {
                    536:        case T_MENU:            return "menu";
                    537:        case T_ENDMENU:         return "endmenu";
                    538:        case T_CHOICE:          return "choice";
                    539:        case T_ENDCHOICE:       return "endchoice";
                    540:        case T_IF:              return "if";
                    541:        case T_ENDIF:           return "endif";
                    542:        case T_DEPENDS:         return "depends";
                    543:        case T_VISIBLE:         return "visible";
                    544:        }
                    545:        return "<token>";
                    546: }
                    547: 
                    548: static bool zconf_endtoken(struct kconf_id *id, int starttoken, int endtoken)
                    549: {
                    550:        if (id->token != endtoken) {
                    551:                zconf_error("unexpected '%s' within %s block",
                    552:                        kconf_id_strings + id->name, zconf_tokenname(starttoken));
                    553:                zconfnerrs++;
                    554:                return false;
                    555:        }
                    556:        if (current_menu->file != current_file) {
                    557:                zconf_error("'%s' in different file than '%s'",
                    558:                        kconf_id_strings + id->name, zconf_tokenname(starttoken));
                    559:                fprintf(stderr, "%s:%d: location of the '%s'\n",
                    560:                        current_menu->file->name, current_menu->lineno,
                    561:                        zconf_tokenname(starttoken));
                    562:                zconfnerrs++;
                    563:                return false;
                    564:        }
                    565:        return true;
                    566: }
                    567: 
                    568: static void zconfprint(const char *err, ...)
                    569: {
                    570:        va_list ap;
                    571: 
                    572:        fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
                    573:        va_start(ap, err);
                    574:        vfprintf(stderr, err, ap);
                    575:        va_end(ap);
                    576:        fprintf(stderr, "\n");
                    577: }
                    578: 
                    579: static void zconf_error(const char *err, ...)
                    580: {
                    581:        va_list ap;
                    582: 
                    583:        zconfnerrs++;
                    584:        fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno());
                    585:        va_start(ap, err);
                    586:        vfprintf(stderr, err, ap);
                    587:        va_end(ap);
                    588:        fprintf(stderr, "\n");
                    589: }
                    590: 
                    591: static void zconferror(const char *err)
                    592: {
                    593: #if YYDEBUG
                    594:        fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
                    595: #endif
                    596: }
                    597: 
                    598: static void print_quoted_string(FILE *out, const char *str)
                    599: {
                    600:        const char *p;
                    601:        int len;
                    602: 
                    603:        putc('"', out);
                    604:        while ((p = strchr(str, '"'))) {
                    605:                len = p - str;
                    606:                if (len)
                    607:                        fprintf(out, "%.*s", len, str);
                    608:                fputs("\\\"", out);
                    609:                str = p + 1;
                    610:        }
                    611:        fputs(str, out);
                    612:        putc('"', out);
                    613: }
                    614: 
                    615: static void print_symbol(FILE *out, struct menu *menu)
                    616: {
                    617:        struct symbol *sym = menu->sym;
                    618:        struct property *prop;
                    619: 
                    620:        if (sym_is_choice(sym))
                    621:                fprintf(out, "\nchoice\n");
                    622:        else
                    623:                fprintf(out, "\nconfig %s\n", sym->name);
                    624:        switch (sym->type) {
                    625:        case S_BOOLEAN:
                    626:                fputs("  boolean\n", out);
                    627:                break;
                    628:        case S_TRISTATE:
                    629:                fputs("  tristate\n", out);
                    630:                break;
                    631:        case S_STRING:
                    632:                fputs("  string\n", out);
                    633:                break;
                    634:        case S_INT:
                    635:                fputs("  integer\n", out);
                    636:                break;
                    637:        case S_HEX:
                    638:                fputs("  hex\n", out);
                    639:                break;
                    640:        default:
                    641:                fputs("  ???\n", out);
                    642:                break;
                    643:        }
                    644:        for (prop = sym->prop; prop; prop = prop->next) {
                    645:                if (prop->menu != menu)
                    646:                        continue;
                    647:                switch (prop->type) {
                    648:                case P_PROMPT:
                    649:                        fputs("  prompt ", out);
                    650:                        print_quoted_string(out, prop->text);
                    651:                        if (!expr_is_yes(prop->visible.expr)) {
                    652:                                fputs(" if ", out);
                    653:                                expr_fprint(prop->visible.expr, out);
                    654:                        }
                    655:                        fputc('\n', out);
                    656:                        break;
                    657:                case P_DEFAULT:
                    658:                        fputs( "  default ", out);
                    659:                        expr_fprint(prop->expr, out);
                    660:                        if (!expr_is_yes(prop->visible.expr)) {
                    661:                                fputs(" if ", out);
                    662:                                expr_fprint(prop->visible.expr, out);
                    663:                        }
                    664:                        fputc('\n', out);
                    665:                        break;
                    666:                case P_CHOICE:
                    667:                        fputs("  #choice value\n", out);
                    668:                        break;
                    669:                case P_SELECT:
                    670:                        fputs( "  select ", out);
                    671:                        expr_fprint(prop->expr, out);
                    672:                        fputc('\n', out);
                    673:                        break;
                    674:                case P_RANGE:
                    675:                        fputs( "  range ", out);
                    676:                        expr_fprint(prop->expr, out);
                    677:                        fputc('\n', out);
                    678:                        break;
                    679:                case P_MENU:
                    680:                        fputs( "  menu ", out);
                    681:                        print_quoted_string(out, prop->text);
                    682:                        fputc('\n', out);
                    683:                        break;
                    684:                default:
                    685:                        fprintf(out, "  unknown prop %d!\n", prop->type);
                    686:                        break;
                    687:                }
                    688:        }
                    689:        if (menu->help) {
                    690:                int len = strlen(menu->help);
                    691:                while (menu->help[--len] == '\n')
                    692:                        menu->help[len] = 0;
                    693:                fprintf(out, "  help\n%s\n", menu->help);
                    694:        }
                    695: }
                    696: 
                    697: void zconfdump(FILE *out)
                    698: {
                    699:        struct property *prop;
                    700:        struct symbol *sym;
                    701:        struct menu *menu;
                    702: 
                    703:        menu = rootmenu.list;
                    704:        while (menu) {
                    705:                if ((sym = menu->sym))
                    706:                        print_symbol(out, menu);
                    707:                else if ((prop = menu->prompt)) {
                    708:                        switch (prop->type) {
                    709:                        case P_COMMENT:
                    710:                                fputs("\ncomment ", out);
                    711:                                print_quoted_string(out, prop->text);
                    712:                                fputs("\n", out);
                    713:                                break;
                    714:                        case P_MENU:
                    715:                                fputs("\nmenu ", out);
                    716:                                print_quoted_string(out, prop->text);
                    717:                                fputs("\n", out);
                    718:                                break;
                    719:                        default:
                    720:                                ;
                    721:                        }
                    722:                        if (!expr_is_yes(prop->visible.expr)) {
                    723:                                fputs("  depends ", out);
                    724:                                expr_fprint(prop->visible.expr, out);
                    725:                                fputc('\n', out);
                    726:                        }
                    727:                }
                    728: 
                    729:                if (menu->list)
                    730:                        menu = menu->list;
                    731:                else if (menu->next)
                    732:                        menu = menu->next;
                    733:                else while ((menu = menu->parent)) {
                    734:                        if (menu->prompt && menu->prompt->type == P_MENU)
                    735:                                fputs("\nendmenu\n", out);
                    736:                        if (menu->next) {
                    737:                                menu = menu->next;
                    738:                                break;
                    739:                        }
                    740:                }
                    741:        }
                    742: }
                    743: 
                    744: #include "lex.zconf.c"
                    745: #include "util.c"
                    746: #include "confdata.c"
                    747: #include "expr.c"
                    748: #include "symbol.c"
                    749: #include "menu.c"

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.