[BACK]Return to main.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Annotation of src/usr.bin/awk/main.c, Revision 1.1

1.1     ! tholo       1: /****************************************************************
        !             2: Copyright (C) AT&T and Lucent Technologies 1996
        !             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 names of AT&T or Lucent Technologies
        !            11: or any of their entities not be used in advertising or publicity
        !            12: pertaining to distribution of the software without specific,
        !            13: written prior permission.
        !            14:
        !            15: AT&T AND LUCENT DISCLAIM ALL WARRANTIES WITH REGARD TO THIS
        !            16: SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
        !            17: FITNESS. IN NO EVENT SHALL AT&T OR LUCENT OR ANY OF THEIR
        !            18: ENTITIES BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
        !            19: DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
        !            20: DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
        !            21: OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
        !            22: USE OR PERFORMANCE OF THIS SOFTWARE.
        !            23: ****************************************************************/
        !            24:
        !            25: char   *version = "version May 27, 1996";
        !            26:
        !            27: #define DEBUG
        !            28: #include <stdio.h>
        !            29: #include <ctype.h>
        !            30: #include <stdlib.h>
        !            31: #include <string.h>
        !            32: #include <signal.h>
        !            33: #include "awk.h"
        !            34: #include "awkgram.h"
        !            35:
        !            36: extern char    **environ;
        !            37: extern int     nfields;
        !            38:
        !            39: int    dbg     = 0;
        !            40: char   *cmdname;       /* gets argv[0] for error messages */
        !            41: extern FILE    *yyin;  /* lex input file */
        !            42: char   *lexprog;       /* points to program argument if it exists */
        !            43: extern int errorflag;  /* non-zero if any syntax errors; set by yyerror */
        !            44: int    compile_time = 2;       /* for error printing: */
        !            45:                                /* 2 = cmdline, 1 = compile, 0 = running */
        !            46:
        !            47: char   *pfile[20];     /* program filenames from -f's */
        !            48: int    npfile = 0;     /* number of filenames */
        !            49: int    curpfile = 0;   /* current filename */
        !            50:
        !            51: int main(int argc, char *argv[])
        !            52: {
        !            53:        char *fs = NULL, *marg;
        !            54:        int temp;
        !            55:
        !            56:        if ((cmdname = strrchr(argv[0], '/')) != NULL)
        !            57:                cmdname++;
        !            58:        else
        !            59:                cmdname = argv[0];
        !            60:        if (argc == 1) {
        !            61:                fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [-mf n] [-mr n] [files]\n", cmdname);
        !            62:                exit(1);
        !            63:        }
        !            64:        gs = newGstring();      /* for lex */
        !            65:        signal(SIGFPE, fpecatch);
        !            66:        yyin = NULL;
        !            67:        symtab = makesymtab(NSYMTAB);
        !            68:        while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') {
        !            69:                if (strcmp((char *) argv[1], "--") == 0) {      /* explicit end of args */
        !            70:                        argc--;
        !            71:                        argv++;
        !            72:                        break;
        !            73:                }
        !            74:                switch (argv[1][1]) {
        !            75:                case 'f':       /* next argument is program filename */
        !            76:                        argc--;
        !            77:                        argv++;
        !            78:                        if (argc <= 1)
        !            79:                                ERROR "no program filename" FATAL;
        !            80:                        pfile[npfile++] = argv[1];
        !            81:                        break;
        !            82:                case 'F':       /* set field separator */
        !            83:                        if (argv[1][2] != 0) {  /* arg is -Fsomething */
        !            84:                                if (argv[1][2] == 't' && argv[1][3] == 0)       /* wart: t=>\t */
        !            85:                                        fs = (char *) "\t";
        !            86:                                else if (argv[1][2] != 0)
        !            87:                                        fs = &argv[1][2];
        !            88:                        } else {                /* arg is -F something */
        !            89:                                argc--; argv++;
        !            90:                                if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0)   /* wart: t=>\t */
        !            91:                                        fs = (char *) "\t";
        !            92:                                else if (argc > 1 && argv[1][0] != 0)
        !            93:                                        fs = &argv[1][0];
        !            94:                        }
        !            95:                        if (fs == NULL || *fs == '\0')
        !            96:                                ERROR "field separator FS is empty" WARNING;
        !            97:                        break;
        !            98:                case 'v':       /* -v a=1 to be done NOW.  one -v for each */
        !            99:                        if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1]))
        !           100:                                setclvar(argv[1]);
        !           101:                        break;
        !           102:                case 'm':       /* more memory: -mr=record, -mf=fields */
        !           103:                        marg = argv[1];
        !           104:                        if (argv[1][3])
        !           105:                                temp = atoi(&argv[1][3]);
        !           106:                        else {
        !           107:                                argv++; argc--;
        !           108:                                temp = atoi(&argv[1][0]);
        !           109:                        }
        !           110:                        switch (marg[2]) {
        !           111:                        case 'r':       recsize = temp; break;
        !           112:                        case 'f':       nfields = temp; break;
        !           113:                        default: ERROR "unknown option %s\n", marg FATAL;
        !           114:                        }
        !           115:                        break;
        !           116:                case 'd':
        !           117:                        dbg = atoi(&argv[1][2]);
        !           118:                        if (dbg == 0)
        !           119:                                dbg = 1;
        !           120:                        printf("awk %s\n", version);
        !           121:                        break;
        !           122:                default:
        !           123:                        ERROR "unknown option %s ignored", argv[1] WARNING;
        !           124:                        break;
        !           125:                }
        !           126:                argc--;
        !           127:                argv++;
        !           128:        }
        !           129:        /* argv[1] is now the first argument */
        !           130:        if (npfile == 0) {      /* no -f; first argument is program */
        !           131:                if (argc <= 1) {
        !           132:                        if (dbg)
        !           133:                                exit(0);
        !           134:                        ERROR "no program given" FATAL;
        !           135:                }
        !           136:                dprintf( ("program = |%s|\n", argv[1]) );
        !           137:                lexprog = argv[1];
        !           138:                argc--;
        !           139:                argv++;
        !           140:        }
        !           141:        recinit(recsize);
        !           142:        syminit();
        !           143:        compile_time = 1;
        !           144:        argv[0] = cmdname;      /* put prog name at front of arglist */
        !           145:        dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) );
        !           146:        arginit(argc, argv);
        !           147:        envinit(environ);
        !           148:        yyparse();
        !           149:        if (fs)
        !           150:                *FS = tostring(qstring(fs, '\0'));
        !           151:        dprintf( ("errorflag=%d\n", errorflag) );
        !           152:        if (errorflag == 0) {
        !           153:                compile_time = 0;
        !           154:                run(winner);
        !           155:        } else
        !           156:                bracecheck();
        !           157:        return(errorflag);
        !           158: }
        !           159:
        !           160: int pgetc(void)                /* get 1 character from awk program */
        !           161: {
        !           162:        int c;
        !           163:
        !           164:        for (;;) {
        !           165:                if (yyin == NULL) {
        !           166:                        if (curpfile >= npfile)
        !           167:                                return EOF;
        !           168:                        if (strcmp((char *) pfile[curpfile], "-") == 0)
        !           169:                                yyin = stdin;
        !           170:                        else if ((yyin = fopen((char *) pfile[curpfile], "r")) == NULL)
        !           171:                                ERROR "can't open file %s", pfile[curpfile] FATAL;
        !           172:                }
        !           173:                if ((c = getc(yyin)) != EOF)
        !           174:                        return c;
        !           175:                if (yyin != stdin)
        !           176:                        fclose(yyin);
        !           177:                yyin = NULL;
        !           178:                curpfile++;
        !           179:        }
        !           180: }