1 /*- 2 * Copyright (c) 1991 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * %sccs.include.proprietary.c% 6 */ 7 8 #ifndef lint 9 char copyright[] = 10 "@(#) Copyright (c) 1991 The Regents of the University of California.\n\ 11 All rights reserved.\n"; 12 #endif /* not lint */ 13 14 #ifndef lint 15 static char sccsid[] = "@(#)main.c 4.6 (Berkeley) 04/17/91"; 16 #endif /* not lint */ 17 18 #include "stdio.h" 19 #include "ctype.h" 20 #include "awk.def" 21 #include "awk.h" 22 #define TOLOWER(c) (isupper(c) ? tolower(c) : c) /* ugh!!! */ 23 24 int dbg = 0; 25 int ldbg = 0; 26 int svflg = 0; 27 int rstflg = 0; 28 int svargc; 29 char **svargv, **xargv; 30 extern FILE *yyin; /* lex input file */ 31 char *lexprog; /* points to program argument if it exists */ 32 extern errorflag; /* non-zero if any syntax errors; set by yyerror */ 33 34 int filefd, symnum, ansfd; 35 char *filelist; 36 extern int maxsym, errno; 37 main(argc, argv) int argc; char *argv[]; { 38 if (argc == 1) 39 error(FATAL, "Usage: awk [-f source | 'cmds'] [files]"); 40 syminit(); 41 while (argc > 1) { 42 argc--; 43 argv++; 44 /* this nonsense is because gcos argument handling */ 45 /* folds -F into -f. accordingly, one checks the next 46 /* character after f to see if it's -f file or -Fx. 47 */ 48 if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') { 49 if (argv[1][0] == '-' && argv[1][1] == '\0') 50 yyin = stdin; 51 else { 52 yyin = fopen(argv[1], "r"); 53 if (yyin == NULL) 54 error(FATAL, "can't open %s", argv[1]); 55 } 56 argc--; 57 argv++; 58 break; 59 } else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') { /* set field sep */ 60 if (argv[0][2] == 't') /* special case for tab */ 61 **FS = '\t'; 62 else 63 **FS = argv[0][2]; 64 continue; 65 } else if (argv[0][0] != '-') { 66 dprintf("cmds=|%s|\n", argv[0], NULL, NULL); 67 yyin = NULL; 68 lexprog = argv[0]; 69 argv[0] = argv[-1]; /* need this space */ 70 break; 71 } else if (strcmp("-d", argv[0])==0) { 72 dbg = 1; 73 } 74 else if (strcmp("-l", argv[0])==0) { 75 ldbg = 1; 76 } 77 else if(strcmp("-S", argv[0]) == 0) { 78 svflg = 1; 79 } 80 else if(strncmp("-R", argv[0], 2) == 0) { 81 if(thaw(argv[0] + 2) == 0) 82 rstflg = 1; 83 else { 84 fprintf(stderr, "not restored\n"); 85 exit(1); 86 } 87 } 88 } 89 if (argc <= 1) { 90 argv[0][0] = '-'; 91 argv[0][1] = '\0'; 92 argc++; 93 argv--; 94 } 95 svargc = --argc; 96 svargv = ++argv; 97 dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL); 98 *FILENAME = *svargv; /* initial file name */ 99 if(rstflg == 0) 100 yyparse(); 101 dprintf("errorflag=%d\n", errorflag, NULL, NULL); 102 if (errorflag) 103 exit(errorflag); 104 if(svflg) { 105 svflg = 0; 106 if(freeze("awk.out") != 0) 107 fprintf(stderr, "not saved\n"); 108 exit(0); 109 } 110 run(); 111 exit(errorflag); 112 } 113 114 yywrap() 115 { 116 return(1); 117 } 118