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