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