1*14473Ssam #ifndef lint 2*14473Ssam static char sccsid[] = "@(#)main.c 4.2 08/11/83"; 3*14473Ssam #endif 46672Smckusick 56672Smckusick #include "stdio.h" 66672Smckusick #include "ctype.h" 76672Smckusick #include "awk.def" 86672Smckusick #include "awk.h" 96672Smckusick #define TOLOWER(c) (isupper(c) ? tolower(c) : c) /* ugh!!! */ 106672Smckusick 116672Smckusick int dbg = 0; 126672Smckusick int svflg = 0; 136672Smckusick int rstflg = 0; 146672Smckusick int svargc; 156672Smckusick char **svargv, **xargv; 166672Smckusick extern FILE *yyin; /* lex input file */ 176672Smckusick char *lexprog; /* points to program argument if it exists */ 186672Smckusick extern errorflag; /* non-zero if any syntax errors; set by yyerror */ 196672Smckusick 206672Smckusick int filefd, symnum, ansfd; 216672Smckusick char *filelist; 226672Smckusick extern int maxsym, errno; 236672Smckusick main(argc, argv) int argc; char *argv[]; { 246672Smckusick if (argc == 1) 256672Smckusick error(FATAL, "Usage: awk [-f source | 'cmds'] [files]"); 266672Smckusick if (strcmp(argv[0], "a.out")) 276672Smckusick logit(argc, argv); 286672Smckusick syminit(); 296672Smckusick while (argc > 1) { 306672Smckusick argc--; 316672Smckusick argv++; 326672Smckusick /* this nonsense is because gcos argument handling */ 336672Smckusick /* folds -F into -f. accordingly, one checks the next 346672Smckusick /* character after f to see if it's -f file or -Fx. 356672Smckusick */ 366672Smckusick if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') { 376672Smckusick yyin = fopen(argv[1], "r"); 386672Smckusick if (yyin == NULL) 396672Smckusick error(FATAL, "can't open %s", argv[1]); 406672Smckusick argc--; 416672Smckusick argv++; 426672Smckusick break; 436672Smckusick } else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') { /* set field sep */ 446672Smckusick if (argv[0][2] == 't') /* special case for tab */ 456672Smckusick **FS = '\t'; 466672Smckusick else 476672Smckusick **FS = argv[0][2]; 486672Smckusick continue; 496672Smckusick } else if (argv[0][0] != '-') { 506672Smckusick dprintf("cmds=|%s|\n", argv[0], NULL, NULL); 516672Smckusick yyin = NULL; 526672Smckusick lexprog = argv[0]; 536672Smckusick argv[0] = argv[-1]; /* need this space */ 546672Smckusick break; 556672Smckusick } else if (strcmp("-d", argv[0])==0) { 566672Smckusick dbg = 1; 576672Smckusick } 586672Smckusick else if(strcmp("-S", argv[0]) == 0) { 596672Smckusick svflg = 1; 606672Smckusick } 616672Smckusick else if(strncmp("-R", argv[0], 2) == 0) { 626672Smckusick if(thaw(argv[0] + 2) == 0) 636672Smckusick rstflg = 1; 646672Smckusick else { 656672Smckusick fprintf(stderr, "not restored\n"); 666672Smckusick exit(1); 676672Smckusick } 686672Smckusick } 696672Smckusick } 706672Smckusick if (argc <= 1) { 716672Smckusick argv[0][0] = '-'; 726672Smckusick argv[0][1] = '\0'; 736672Smckusick argc++; 746672Smckusick argv--; 756672Smckusick } 766672Smckusick svargc = --argc; 776672Smckusick svargv = ++argv; 786672Smckusick dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL); 796672Smckusick *FILENAME = *svargv; /* initial file name */ 806672Smckusick if(rstflg == 0) 816672Smckusick yyparse(); 826672Smckusick dprintf("errorflag=%d\n", errorflag, NULL, NULL); 836672Smckusick if (errorflag) 846672Smckusick exit(errorflag); 856672Smckusick if(svflg) { 866672Smckusick svflg = 0; 876672Smckusick if(freeze("awk.out") != 0) 886672Smckusick fprintf(stderr, "not saved\n"); 896672Smckusick exit(0); 906672Smckusick } 916672Smckusick run(); 926672Smckusick exit(errorflag); 936672Smckusick } 946672Smckusick 956672Smckusick logit(n, s) char *s[]; 966672Smckusick { int i, tvec[2]; 976672Smckusick FILE *f, *g; 986672Smckusick char buf[512]; 996672Smckusick if ((f=fopen("/crp/pjw/awkhist/awkhist", "a"))==NULL) 1006672Smckusick return; 1016672Smckusick time(tvec); 1026672Smckusick fprintf(f, "%-8s %s", getlogin(), ctime(tvec)); 1036672Smckusick for (i=0; i<n; i++) 1046672Smckusick fprintf(f, "'%s'", s[i]); 1056672Smckusick putc('\n', f); 1066672Smckusick if (strcmp(s[1], "-f")) { 1076672Smckusick fclose(f); 1086672Smckusick return; 1096672Smckusick } 1106672Smckusick if ((g=fopen(s[2], "r"))==NULL) { 1116672Smckusick fclose(f); 1126672Smckusick return; 1136672Smckusick } 1146672Smckusick while ((i=fread(buf, 1, 512, g))>0) 1156672Smckusick fwrite(buf, 1, i, f); 1166672Smckusick fclose(f); 1176672Smckusick fclose(g); 1186672Smckusick } 1196672Smckusick 1206672Smckusick yywrap() 1216672Smckusick { 1226672Smckusick return(1); 1236672Smckusick } 124