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: }