Annotation of qemu/roms/seabios/tools/kconfig/zconf.y, revision 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.