1 #ifndef lint 2 static char sccsid[] = "@(#)main.c 4.2 08/11/83"; 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 svflg = 0; 13 int rstflg = 0; 14 int svargc; 15 char **svargv, **xargv; 16 extern FILE *yyin; /* lex input file */ 17 char *lexprog; /* points to program argument if it exists */ 18 extern errorflag; /* non-zero if any syntax errors; set by yyerror */ 19 20 int filefd, symnum, ansfd; 21 char *filelist; 22 extern int maxsym, errno; 23 main(argc, argv) int argc; char *argv[]; { 24 if (argc == 1) 25 error(FATAL, "Usage: awk [-f source | 'cmds'] [files]"); 26 if (strcmp(argv[0], "a.out")) 27 logit(argc, argv); 28 syminit(); 29 while (argc > 1) { 30 argc--; 31 argv++; 32 /* this nonsense is because gcos argument handling */ 33 /* folds -F into -f. accordingly, one checks the next 34 /* character after f to see if it's -f file or -Fx. 35 */ 36 if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') { 37 yyin = fopen(argv[1], "r"); 38 if (yyin == NULL) 39 error(FATAL, "can't open %s", argv[1]); 40 argc--; 41 argv++; 42 break; 43 } else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') { /* set field sep */ 44 if (argv[0][2] == 't') /* special case for tab */ 45 **FS = '\t'; 46 else 47 **FS = argv[0][2]; 48 continue; 49 } else if (argv[0][0] != '-') { 50 dprintf("cmds=|%s|\n", argv[0], NULL, NULL); 51 yyin = NULL; 52 lexprog = argv[0]; 53 argv[0] = argv[-1]; /* need this space */ 54 break; 55 } else if (strcmp("-d", argv[0])==0) { 56 dbg = 1; 57 } 58 else if(strcmp("-S", argv[0]) == 0) { 59 svflg = 1; 60 } 61 else if(strncmp("-R", argv[0], 2) == 0) { 62 if(thaw(argv[0] + 2) == 0) 63 rstflg = 1; 64 else { 65 fprintf(stderr, "not restored\n"); 66 exit(1); 67 } 68 } 69 } 70 if (argc <= 1) { 71 argv[0][0] = '-'; 72 argv[0][1] = '\0'; 73 argc++; 74 argv--; 75 } 76 svargc = --argc; 77 svargv = ++argv; 78 dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL); 79 *FILENAME = *svargv; /* initial file name */ 80 if(rstflg == 0) 81 yyparse(); 82 dprintf("errorflag=%d\n", errorflag, NULL, NULL); 83 if (errorflag) 84 exit(errorflag); 85 if(svflg) { 86 svflg = 0; 87 if(freeze("awk.out") != 0) 88 fprintf(stderr, "not saved\n"); 89 exit(0); 90 } 91 run(); 92 exit(errorflag); 93 } 94 95 logit(n, s) char *s[]; 96 { int i, tvec[2]; 97 FILE *f, *g; 98 char buf[512]; 99 if ((f=fopen("/crp/pjw/awkhist/awkhist", "a"))==NULL) 100 return; 101 time(tvec); 102 fprintf(f, "%-8s %s", getlogin(), ctime(tvec)); 103 for (i=0; i<n; i++) 104 fprintf(f, "'%s'", s[i]); 105 putc('\n', f); 106 if (strcmp(s[1], "-f")) { 107 fclose(f); 108 return; 109 } 110 if ((g=fopen(s[2], "r"))==NULL) { 111 fclose(f); 112 return; 113 } 114 while ((i=fread(buf, 1, 512, g))>0) 115 fwrite(buf, 1, i, f); 116 fclose(f); 117 fclose(g); 118 } 119 120 yywrap() 121 { 122 return(1); 123 } 124