Annotation of rpl/rplawk/main.c, revision 1.1

1.1     ! bertrand    1: /****************************************************************
        !             2: Copyright (C) Lucent Technologies 1997
        !             3: All Rights Reserved
        !             4: 
        !             5: Permission to use, copy, modify, and distribute this software and
        !             6: its documentation for any purpose and without fee is hereby
        !             7: granted, provided that the above copyright notice appear in all
        !             8: copies and that both that the copyright notice and this
        !             9: permission notice and warranty disclaimer appear in supporting
        !            10: documentation, and that the name Lucent Technologies or any of
        !            11: its entities not be used in advertising or publicity pertaining
        !            12: to distribution of the software without specific, written prior
        !            13: permission.
        !            14: 
        !            15: LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
        !            16: INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
        !            17: IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
        !            18: SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            19: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
        !            20: IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
        !            21: ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
        !            22: THIS SOFTWARE.
        !            23: ****************************************************************/
        !            24: 
        !            25: const char *version = "version 20100523";
        !            26: 
        !            27: #define DEBUG
        !            28: #include <stdio.h>
        !            29: #include <ctype.h>
        !            30: #include <locale.h>
        !            31: #include <stdlib.h>
        !            32: #include <string.h>
        !            33: #include <signal.h>
        !            34: #include "awk.h"
        !            35: #include "ytab.h"
        !            36: 
        !            37: extern char    **environ;
        !            38: extern int nfields;
        !            39: 
        !            40: int    dbg = 0;
        !            41: char   *cmdname;   /* gets argv[0] for error messages */
        !            42: extern FILE    *yyin;  /* lex input file */
        !            43: char   *lexprog;   /* points to program argument if it exists */
        !            44: extern int errorflag;  /* non-zero if any syntax errors; set by yyerror */
        !            45: int    compile_time = 2;   /* for error printing: */
        !            46:                /* 2 = cmdline, 1 = compile, 0 = running */
        !            47: 
        !            48: #define    MAX_PFILE   20  /* max number of -f's */
        !            49: 
        !            50: char   *pfile[MAX_PFILE];  /* program filenames from -f's */
        !            51: int    npfile = 0; /* number of filenames */
        !            52: int    curpfile = 0;   /* current filename */
        !            53: 
        !            54: int    safe    = 0;    /* 1 => "safe" mode */
        !            55: 
        !            56: int main(int argc, char *argv[])
        !            57: {
        !            58:    const char *fs = NULL;
        !            59: 
        !            60:    setlocale(LC_CTYPE, "");
        !            61:    setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
        !            62:    cmdname = argv[0];
        !            63:    if (argc == 1) {
        !            64:        fprintf(stderr, 
        !            65:          "usage: %s [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]\n", 
        !            66:          cmdname);
        !            67:        exit(1);
        !            68:    }
        !            69:    signal(SIGFPE, fpecatch);
        !            70:    yyin = NULL;
        !            71:    symtab = makesymtab(NSYMTAB/NSYMTAB);
        !            72:    while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
        !            73:        if (strcmp(argv[1],"-version") == 0 || strcmp(argv[1],"--version") == 0) {
        !            74:            printf("awk %s\n", version);
        !            75:            exit(0);
        !            76:            break;
        !            77:        }
        !            78:        if (strncmp(argv[1], "--", 2) == 0) {   /* explicit end of args */
        !            79:            argc--;
        !            80:            argv++;
        !            81:            break;
        !            82:        }
        !            83:        switch (argv[1][1]) {
        !            84:        case 's':
        !            85:            if (strcmp(argv[1], "-safe") == 0)
        !            86:                safe = 1;
        !            87:            break;
        !            88:        case 'f':   /* next argument is program filename */
        !            89:            argc--;
        !            90:            argv++;
        !            91:            if (argc <= 1)
        !            92:                FATAL("no program filename");
        !            93:            if (npfile >= MAX_PFILE - 1)
        !            94:                FATAL("too many -f options"); 
        !            95:            pfile[npfile++] = argv[1];
        !            96:            break;
        !            97:        case 'F':   /* set field separator */
        !            98:            if (argv[1][2] != 0) {  /* arg is -Fsomething */
        !            99:                if (argv[1][2] == 't' && argv[1][3] == 0)   /* wart: t=>\t */
        !           100:                    fs = "\t";
        !           101:                else if (argv[1][2] != 0)
        !           102:                    fs = &argv[1][2];
        !           103:            } else {        /* arg is -F something */
        !           104:                argc--; argv++;
        !           105:                if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0)   /* wart: t=>\t */
        !           106:                    fs = "\t";
        !           107:                else if (argc > 1 && argv[1][0] != 0)
        !           108:                    fs = &argv[1][0];
        !           109:            }
        !           110:            if (fs == NULL || *fs == '\0')
        !           111:                WARNING("field separator FS is empty");
        !           112:            break;
        !           113:        case 'v':   /* -v a=1 to be done NOW.  one -v for each */
        !           114:            if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1]))
        !           115:                setclvar(argv[1]);
        !           116:            else if (argv[1][2] != '\0')
        !           117:                setclvar(&argv[1][2]);
        !           118:            break;
        !           119:        case 'd':
        !           120:            dbg = atoi(&argv[1][2]);
        !           121:            if (dbg == 0)
        !           122:                dbg = 1;
        !           123:            printf("awk %s\n", version);
        !           124:            break;
        !           125:        default:
        !           126:            WARNING("unknown option %s ignored", argv[1]);
        !           127:            break;
        !           128:        }
        !           129:        argc--;
        !           130:        argv++;
        !           131:    }
        !           132:    /* argv[1] is now the first argument */
        !           133:    if (npfile == 0) {  /* no -f; first argument is program */
        !           134:        if (argc <= 1) {
        !           135:            if (dbg)
        !           136:                exit(0);
        !           137:            FATAL("no program given");
        !           138:        }
        !           139:           dprintf( ("program = |%s|\n", argv[1]) );
        !           140:        lexprog = argv[1];
        !           141:        argc--;
        !           142:        argv++;
        !           143:    }
        !           144:    recinit(recsize);
        !           145:    syminit();
        !           146:    compile_time = 1;
        !           147:    argv[0] = cmdname;  /* put prog name at front of arglist */
        !           148:       dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
        !           149:    arginit(argc, argv);
        !           150:    if (!safe)
        !           151:        envinit(environ);
        !           152:    yyparse();
        !           153:    setlocale(LC_NUMERIC, ""); /* back to whatever it is locally */
        !           154:    if (fs)
        !           155:        *FS = qstring(fs, '\0');
        !           156:       dprintf( ("errorflag=%d\n", errorflag) );
        !           157:    if (errorflag == 0) {
        !           158:        compile_time = 0;
        !           159:        run(winner);
        !           160:    } else
        !           161:        bracecheck();
        !           162:    return(errorflag);
        !           163: }
        !           164: 
        !           165: int pgetc(void)        /* get 1 character from awk program */
        !           166: {
        !           167:    int c;
        !           168: 
        !           169:    for (;;) {
        !           170:        if (yyin == NULL) {
        !           171:            if (curpfile >= npfile)
        !           172:                return EOF;
        !           173:            if (strcmp(pfile[curpfile], "-") == 0)
        !           174:                yyin = stdin;
        !           175:            else if ((yyin = fopen(pfile[curpfile], "r")) == NULL)
        !           176:                FATAL("can't open file %s", pfile[curpfile]);
        !           177:            lineno = 1;
        !           178:        }
        !           179:        if ((c = getc(yyin)) != EOF)
        !           180:            return c;
        !           181:        if (yyin != stdin)
        !           182:            fclose(yyin);
        !           183:        yyin = NULL;
        !           184:        curpfile++;
        !           185:    }
        !           186: }
        !           187: 
        !           188: char *cursource(void)  /* current source file name */
        !           189: {
        !           190:    if (npfile > 0)
        !           191:        return pfile[curpfile];
        !           192:    else
        !           193:        return NULL;
        !           194: }

CVSweb interface <joel.bertrand@systella.fr>