|
|
1.1 ! root 1: /* ! 2: Copyright (c) 1989 AT&T ! 3: All Rights Reserved ! 4: ! 5: THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T. ! 6: ! 7: The copyright notice above does not evidence any ! 8: actual or intended publication of such source code. ! 9: */ ! 10: ! 11: char *version = "version May 31, 1992"; ! 12: ! 13: #define DEBUG ! 14: #include <stdio.h> ! 15: #include <ctype.h> ! 16: #include <stdlib.h> ! 17: #include <string.h> ! 18: #include <signal.h> ! 19: #include "awk.h" ! 20: #include "y.tab.h" ! 21: ! 22: extern char **environ; ! 23: extern int nfields; ! 24: ! 25: int dbg = 0; ! 26: uchar *cmdname; /* gets argv[0] for error messages */ ! 27: extern FILE *yyin; /* lex input file */ ! 28: uchar *lexprog; /* points to program argument if it exists */ ! 29: extern int errorflag; /* non-zero if any syntax errors; set by yyerror */ ! 30: int compile_time = 2; /* for error printing: */ ! 31: /* 2 = cmdline, 1 = compile, 0 = running */ ! 32: ! 33: uchar *pfile[20]; /* program filenames from -f's */ ! 34: int npfile = 0; /* number of filenames */ ! 35: int curpfile = 0; /* current filename */ ! 36: ! 37: ! 38: main(int argc, uchar *argv[]) ! 39: { ! 40: uchar *fs = NULL, *marg; ! 41: int temp; ! 42: ! 43: cmdname = argv[0]; ! 44: if (argc == 1) { ! 45: fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [-mf n] [-mr n] [files]\n", cmdname); ! 46: exit(1); ! 47: } ! 48: signal(SIGFPE, fpecatch); ! 49: yyin = NULL; ! 50: symtab = makesymtab(NSYMTAB); ! 51: while (argc > 1 && argv[1][0] == '-' && argv[1][1] != '\0') { ! 52: if (strcmp((char *) argv[1], "--") == 0) { /* explicit end of args */ ! 53: argc--; ! 54: argv++; ! 55: break; ! 56: } ! 57: switch (argv[1][1]) { ! 58: case 'f': /* next argument is program filename */ ! 59: argc--; ! 60: argv++; ! 61: if (argc <= 1) ! 62: ERROR "no program filename" FATAL; ! 63: pfile[npfile++] = argv[1]; ! 64: break; ! 65: case 'F': /* set field separator */ ! 66: if (argv[1][2] != 0) { /* arg is -Fsomething */ ! 67: if (argv[1][2] == 't' && argv[1][3] == 0) /* wart: t=>\t */ ! 68: fs = (uchar *) "\t"; ! 69: else if (argv[1][2] != 0) ! 70: fs = &argv[1][2]; ! 71: } else { /* arg is -F something */ ! 72: argc--; argv++; ! 73: if (argc > 1 && argv[1][0] == 't' && argv[1][1] == 0) /* wart: t=>\t */ ! 74: fs = (uchar *) "\t"; ! 75: else if (argc > 1 && argv[1][0] != 0) ! 76: fs = &argv[1][0]; ! 77: } ! 78: if (fs == NULL || *fs == '\0') ! 79: ERROR "field separator FS is empty" WARNING; ! 80: break; ! 81: case 'v': /* -v a=1 to be done NOW. one -v for each */ ! 82: if (argv[1][2] == '\0' && --argc > 1 && isclvar((++argv)[1])) ! 83: setclvar(argv[1]); ! 84: break; ! 85: case 'm': /* more memory: -mr=record, -mf=fields */ ! 86: marg = argv[1]; ! 87: if (argv[1][3]) ! 88: temp = atoi(&argv[1][3]); ! 89: else { ! 90: argv++; argc--; ! 91: temp = atoi(&argv[1][0]); ! 92: } ! 93: switch (marg[2]) { ! 94: case 'r': recsize = temp; break; ! 95: case 'f': nfields = temp; break; ! 96: default: ERROR "unknown option %s\n", marg FATAL; ! 97: } ! 98: break; ! 99: case 'd': ! 100: dbg = atoi(&argv[1][2]); ! 101: if (dbg == 0) ! 102: dbg = 1; ! 103: printf("awk %s\n", version); ! 104: break; ! 105: default: ! 106: ERROR "unknown option %s ignored", argv[1] WARNING; ! 107: break; ! 108: } ! 109: argc--; ! 110: argv++; ! 111: } ! 112: /* argv[1] is now the first argument */ ! 113: if (npfile == 0) { /* no -f; first argument is program */ ! 114: if (argc <= 1) { ! 115: if (dbg) ! 116: exit(0); ! 117: ERROR "no program given" FATAL; ! 118: } ! 119: dprintf( ("program = |%s|\n", argv[1]) ); ! 120: lexprog = argv[1]; ! 121: argc--; ! 122: argv++; ! 123: } ! 124: recinit(recsize); ! 125: syminit(); ! 126: compile_time = 1; ! 127: argv[0] = cmdname; /* put prog name at front of arglist */ ! 128: dprintf( ("argc=%d, argv[0]=%s\n", argc, argv[0]) ); ! 129: arginit(argc, argv); ! 130: envinit(environ); ! 131: yyparse(); ! 132: if (fs) ! 133: *FS = tostring(qstring(fs, '\0')); ! 134: dprintf( ("errorflag=%d\n", errorflag) ); ! 135: if (errorflag == 0) { ! 136: compile_time = 0; ! 137: run(winner); ! 138: } else ! 139: bracecheck(); ! 140: return(errorflag); ! 141: } ! 142: ! 143: pgetc(void) /* get program character */ ! 144: { ! 145: int c; ! 146: ! 147: for (;;) { ! 148: if (yyin == NULL) { ! 149: if (curpfile >= npfile) ! 150: return EOF; ! 151: if (strcmp((char *) pfile[curpfile], "-") == 0) ! 152: yyin = stdin; ! 153: else if ((yyin = fopen((char *) pfile[curpfile], "r")) == NULL) ! 154: ERROR "can't open file %s", pfile[curpfile] FATAL; ! 155: } ! 156: if ((c = getc(yyin)) != EOF) ! 157: return c; ! 158: if (yyin != stdin) ! 159: fclose(yyin); ! 160: yyin = NULL; ! 161: curpfile++; ! 162: } ! 163: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.