Annotation of qemu/roms/seabios/tools/kconfig/zconf.l, revision 1.1

1.1     ! root        1: %option backup nostdinit noyywrap never-interactive full ecs
        !             2: %option 8bit backup nodefault perf-report perf-report
        !             3: %option noinput
        !             4: %x COMMAND HELP STRING PARAM
        !             5: %{
        !             6: /*
        !             7:  * Copyright (C) 2002 Roman Zippel <[email protected]>
        !             8:  * Released under the terms of the GNU GPL v2.0.
        !             9:  */
        !            10: 
        !            11: #include <limits.h>
        !            12: #include <stdio.h>
        !            13: #include <stdlib.h>
        !            14: #include <string.h>
        !            15: #include <unistd.h>
        !            16: 
        !            17: #define LKC_DIRECT_LINK
        !            18: #include "lkc.h"
        !            19: 
        !            20: #define START_STRSIZE  16
        !            21: 
        !            22: static struct {
        !            23:        struct file *file;
        !            24:        int lineno;
        !            25: } current_pos;
        !            26: 
        !            27: static char *text;
        !            28: static int text_size, text_asize;
        !            29: 
        !            30: struct buffer {
        !            31:         struct buffer *parent;
        !            32:         YY_BUFFER_STATE state;
        !            33: };
        !            34: 
        !            35: struct buffer *current_buf;
        !            36: 
        !            37: static int last_ts, first_ts;
        !            38: 
        !            39: static void zconf_endhelp(void);
        !            40: static void zconf_endfile(void);
        !            41: 
        !            42: static void new_string(void)
        !            43: {
        !            44:        text = malloc(START_STRSIZE);
        !            45:        text_asize = START_STRSIZE;
        !            46:        text_size = 0;
        !            47:        *text = 0;
        !            48: }
        !            49: 
        !            50: static void append_string(const char *str, int size)
        !            51: {
        !            52:        int new_size = text_size + size + 1;
        !            53:        if (new_size > text_asize) {
        !            54:                new_size += START_STRSIZE - 1;
        !            55:                new_size &= -START_STRSIZE;
        !            56:                text = realloc(text, new_size);
        !            57:                text_asize = new_size;
        !            58:        }
        !            59:        memcpy(text + text_size, str, size);
        !            60:        text_size += size;
        !            61:        text[text_size] = 0;
        !            62: }
        !            63: 
        !            64: static void alloc_string(const char *str, int size)
        !            65: {
        !            66:        text = malloc(size + 1);
        !            67:        memcpy(text, str, size);
        !            68:        text[size] = 0;
        !            69: }
        !            70: %}
        !            71: 
        !            72: ws     [ \n\t]
        !            73: n      [A-Za-z0-9_]
        !            74: 
        !            75: %%
        !            76:        int str = 0;
        !            77:        int ts, i;
        !            78: 
        !            79: [ \t]*#.*\n    |
        !            80: [ \t]*\n       {
        !            81:        current_file->lineno++;
        !            82:        return T_EOL;
        !            83: }
        !            84: [ \t]*#.*
        !            85: 
        !            86: 
        !            87: [ \t]+ {
        !            88:        BEGIN(COMMAND);
        !            89: }
        !            90: 
        !            91: .      {
        !            92:        unput(yytext[0]);
        !            93:        BEGIN(COMMAND);
        !            94: }
        !            95: 
        !            96: 
        !            97: <COMMAND>{
        !            98:        {n}+    {
        !            99:                struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
        !           100:                BEGIN(PARAM);
        !           101:                current_pos.file = current_file;
        !           102:                current_pos.lineno = current_file->lineno;
        !           103:                if (id && id->flags & TF_COMMAND) {
        !           104:                        zconflval.id = id;
        !           105:                        return id->token;
        !           106:                }
        !           107:                alloc_string(yytext, yyleng);
        !           108:                zconflval.string = text;
        !           109:                return T_WORD;
        !           110:        }
        !           111:        .
        !           112:        \n      {
        !           113:                BEGIN(INITIAL);
        !           114:                current_file->lineno++;
        !           115:                return T_EOL;
        !           116:        }
        !           117: }
        !           118: 
        !           119: <PARAM>{
        !           120:        "&&"    return T_AND;
        !           121:        "||"    return T_OR;
        !           122:        "("     return T_OPEN_PAREN;
        !           123:        ")"     return T_CLOSE_PAREN;
        !           124:        "!"     return T_NOT;
        !           125:        "="     return T_EQUAL;
        !           126:        "!="    return T_UNEQUAL;
        !           127:        \"|\'   {
        !           128:                str = yytext[0];
        !           129:                new_string();
        !           130:                BEGIN(STRING);
        !           131:        }
        !           132:        \n      BEGIN(INITIAL); current_file->lineno++; return T_EOL;
        !           133:        ---     /* ignore */
        !           134:        ({n}|[-/.])+    {
        !           135:                struct kconf_id *id = kconf_id_lookup(yytext, yyleng);
        !           136:                if (id && id->flags & TF_PARAM) {
        !           137:                        zconflval.id = id;
        !           138:                        return id->token;
        !           139:                }
        !           140:                alloc_string(yytext, yyleng);
        !           141:                zconflval.string = text;
        !           142:                return T_WORD;
        !           143:        }
        !           144:        #.*     /* comment */
        !           145:        \\\n    current_file->lineno++;
        !           146:        .
        !           147:        <<EOF>> {
        !           148:                BEGIN(INITIAL);
        !           149:        }
        !           150: }
        !           151: 
        !           152: <STRING>{
        !           153:        [^'"\\\n]+/\n   {
        !           154:                append_string(yytext, yyleng);
        !           155:                zconflval.string = text;
        !           156:                return T_WORD_QUOTE;
        !           157:        }
        !           158:        [^'"\\\n]+      {
        !           159:                append_string(yytext, yyleng);
        !           160:        }
        !           161:        \\.?/\n {
        !           162:                append_string(yytext + 1, yyleng - 1);
        !           163:                zconflval.string = text;
        !           164:                return T_WORD_QUOTE;
        !           165:        }
        !           166:        \\.?    {
        !           167:                append_string(yytext + 1, yyleng - 1);
        !           168:        }
        !           169:        \'|\"   {
        !           170:                if (str == yytext[0]) {
        !           171:                        BEGIN(PARAM);
        !           172:                        zconflval.string = text;
        !           173:                        return T_WORD_QUOTE;
        !           174:                } else
        !           175:                        append_string(yytext, 1);
        !           176:        }
        !           177:        \n      {
        !           178:                printf("%s:%d:warning: multi-line strings not supported\n", zconf_curname(), zconf_lineno());
        !           179:                current_file->lineno++;
        !           180:                BEGIN(INITIAL);
        !           181:                return T_EOL;
        !           182:        }
        !           183:        <<EOF>> {
        !           184:                BEGIN(INITIAL);
        !           185:        }
        !           186: }
        !           187: 
        !           188: <HELP>{
        !           189:        [ \t]+  {
        !           190:                ts = 0;
        !           191:                for (i = 0; i < yyleng; i++) {
        !           192:                        if (yytext[i] == '\t')
        !           193:                                ts = (ts & ~7) + 8;
        !           194:                        else
        !           195:                                ts++;
        !           196:                }
        !           197:                last_ts = ts;
        !           198:                if (first_ts) {
        !           199:                        if (ts < first_ts) {
        !           200:                                zconf_endhelp();
        !           201:                                return T_HELPTEXT;
        !           202:                        }
        !           203:                        ts -= first_ts;
        !           204:                        while (ts > 8) {
        !           205:                                append_string("        ", 8);
        !           206:                                ts -= 8;
        !           207:                        }
        !           208:                        append_string("        ", ts);
        !           209:                }
        !           210:        }
        !           211:        [ \t]*\n/[^ \t\n] {
        !           212:                current_file->lineno++;
        !           213:                zconf_endhelp();
        !           214:                return T_HELPTEXT;
        !           215:        }
        !           216:        [ \t]*\n        {
        !           217:                current_file->lineno++;
        !           218:                append_string("\n", 1);
        !           219:        }
        !           220:        [^ \t\n].* {
        !           221:                while (yyleng) {
        !           222:                        if ((yytext[yyleng-1] != ' ') && (yytext[yyleng-1] != '\t'))
        !           223:                                break;
        !           224:                        yyleng--;
        !           225:                }
        !           226:                append_string(yytext, yyleng);
        !           227:                if (!first_ts)
        !           228:                        first_ts = last_ts;
        !           229:        }
        !           230:        <<EOF>> {
        !           231:                zconf_endhelp();
        !           232:                return T_HELPTEXT;
        !           233:        }
        !           234: }
        !           235: 
        !           236: <<EOF>>        {
        !           237:        if (current_file) {
        !           238:                zconf_endfile();
        !           239:                return T_EOL;
        !           240:        }
        !           241:        fclose(yyin);
        !           242:        yyterminate();
        !           243: }
        !           244: 
        !           245: %%
        !           246: void zconf_starthelp(void)
        !           247: {
        !           248:        new_string();
        !           249:        last_ts = first_ts = 0;
        !           250:        BEGIN(HELP);
        !           251: }
        !           252: 
        !           253: static void zconf_endhelp(void)
        !           254: {
        !           255:        zconflval.string = text;
        !           256:        BEGIN(INITIAL);
        !           257: }
        !           258: 
        !           259: 
        !           260: /*
        !           261:  * Try to open specified file with following names:
        !           262:  * ./name
        !           263:  * $(srctree)/name
        !           264:  * The latter is used when srctree is separate from objtree
        !           265:  * when compiling the kernel.
        !           266:  * Return NULL if file is not found.
        !           267:  */
        !           268: FILE *zconf_fopen(const char *name)
        !           269: {
        !           270:        char *env, fullname[PATH_MAX+1];
        !           271:        FILE *f;
        !           272: 
        !           273:        f = fopen(name, "r");
        !           274:        if (!f && name != NULL && name[0] != '/') {
        !           275:                env = getenv(SRCTREE);
        !           276:                if (env) {
        !           277:                        sprintf(fullname, "%s/%s", env, name);
        !           278:                        f = fopen(fullname, "r");
        !           279:                }
        !           280:        }
        !           281:        return f;
        !           282: }
        !           283: 
        !           284: void zconf_initscan(const char *name)
        !           285: {
        !           286:        yyin = zconf_fopen(name);
        !           287:        if (!yyin) {
        !           288:                printf("can't find file %s\n", name);
        !           289:                exit(1);
        !           290:        }
        !           291: 
        !           292:        current_buf = malloc(sizeof(*current_buf));
        !           293:        memset(current_buf, 0, sizeof(*current_buf));
        !           294: 
        !           295:        current_file = file_lookup(name);
        !           296:        current_file->lineno = 1;
        !           297:        current_file->flags = FILE_BUSY;
        !           298: }
        !           299: 
        !           300: void zconf_nextfile(const char *name)
        !           301: {
        !           302:        struct file *file = file_lookup(name);
        !           303:        struct buffer *buf = malloc(sizeof(*buf));
        !           304:        memset(buf, 0, sizeof(*buf));
        !           305: 
        !           306:        current_buf->state = YY_CURRENT_BUFFER;
        !           307:        yyin = zconf_fopen(file->name);
        !           308:        if (!yyin) {
        !           309:                printf("%s:%d: can't open file \"%s\"\n",
        !           310:                    zconf_curname(), zconf_lineno(), file->name);
        !           311:                exit(1);
        !           312:        }
        !           313:        yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
        !           314:        buf->parent = current_buf;
        !           315:        current_buf = buf;
        !           316: 
        !           317:        if (file->flags & FILE_BUSY) {
        !           318:                printf("%s:%d: do not source '%s' from itself\n",
        !           319:                       zconf_curname(), zconf_lineno(), name);
        !           320:                exit(1);
        !           321:        }
        !           322:        if (file->flags & FILE_SCANNED) {
        !           323:                printf("%s:%d: file '%s' is already sourced from '%s'\n",
        !           324:                       zconf_curname(), zconf_lineno(), name,
        !           325:                       file->parent->name);
        !           326:                exit(1);
        !           327:        }
        !           328:        file->flags |= FILE_BUSY;
        !           329:        file->lineno = 1;
        !           330:        file->parent = current_file;
        !           331:        current_file = file;
        !           332: }
        !           333: 
        !           334: static void zconf_endfile(void)
        !           335: {
        !           336:        struct buffer *parent;
        !           337: 
        !           338:        current_file->flags |= FILE_SCANNED;
        !           339:        current_file->flags &= ~FILE_BUSY;
        !           340:        current_file = current_file->parent;
        !           341: 
        !           342:        parent = current_buf->parent;
        !           343:        if (parent) {
        !           344:                fclose(yyin);
        !           345:                yy_delete_buffer(YY_CURRENT_BUFFER);
        !           346:                yy_switch_to_buffer(parent->state);
        !           347:        }
        !           348:        free(current_buf);
        !           349:        current_buf = parent;
        !           350: }
        !           351: 
        !           352: int zconf_lineno(void)
        !           353: {
        !           354:        return current_pos.lineno;
        !           355: }
        !           356: 
        !           357: const char *zconf_curname(void)
        !           358: {
        !           359:        return current_pos.file ? current_pos.file->name : "<none>";
        !           360: }

unix.superglobalmegacorp.com

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