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