114473Ssam #ifndef lint 2*32353Sbostic static char sccsid[] = "@(#)main.c 4.5 (Berkeley) 10/06/87"; 314473Ssam #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; 1217490Ssam int ldbg = 0; 136672Smckusick int svflg = 0; 146672Smckusick int rstflg = 0; 156672Smckusick int svargc; 166672Smckusick char **svargv, **xargv; 176672Smckusick extern FILE *yyin; /* lex input file */ 186672Smckusick char *lexprog; /* points to program argument if it exists */ 196672Smckusick extern errorflag; /* non-zero if any syntax errors; set by yyerror */ 206672Smckusick 216672Smckusick int filefd, symnum, ansfd; 226672Smckusick char *filelist; 236672Smckusick extern int maxsym, errno; 246672Smckusick main(argc, argv) int argc; char *argv[]; { 256672Smckusick if (argc == 1) 266672Smckusick error(FATAL, "Usage: awk [-f source | 'cmds'] [files]"); 276672Smckusick syminit(); 286672Smckusick while (argc > 1) { 296672Smckusick argc--; 306672Smckusick argv++; 316672Smckusick /* this nonsense is because gcos argument handling */ 326672Smckusick /* folds -F into -f. accordingly, one checks the next 336672Smckusick /* character after f to see if it's -f file or -Fx. 346672Smckusick */ 356672Smckusick if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f' && argv[0][2] == '\0') { 36*32353Sbostic if (argv[1][0] == '-' && argv[1][1] == '\0') 37*32353Sbostic yyin = stdin; 38*32353Sbostic else { 39*32353Sbostic yyin = fopen(argv[1], "r"); 40*32353Sbostic if (yyin == NULL) 41*32353Sbostic error(FATAL, "can't open %s", argv[1]); 42*32353Sbostic } 436672Smckusick argc--; 446672Smckusick argv++; 456672Smckusick break; 466672Smckusick } else if (argv[0][0] == '-' && TOLOWER(argv[0][1]) == 'f') { /* set field sep */ 476672Smckusick if (argv[0][2] == 't') /* special case for tab */ 486672Smckusick **FS = '\t'; 496672Smckusick else 506672Smckusick **FS = argv[0][2]; 516672Smckusick continue; 526672Smckusick } else if (argv[0][0] != '-') { 536672Smckusick dprintf("cmds=|%s|\n", argv[0], NULL, NULL); 546672Smckusick yyin = NULL; 556672Smckusick lexprog = argv[0]; 566672Smckusick argv[0] = argv[-1]; /* need this space */ 576672Smckusick break; 586672Smckusick } else if (strcmp("-d", argv[0])==0) { 596672Smckusick dbg = 1; 606672Smckusick } 6117490Ssam else if (strcmp("-l", argv[0])==0) { 6217490Ssam ldbg = 1; 6317490Ssam } 646672Smckusick else if(strcmp("-S", argv[0]) == 0) { 656672Smckusick svflg = 1; 666672Smckusick } 676672Smckusick else if(strncmp("-R", argv[0], 2) == 0) { 686672Smckusick if(thaw(argv[0] + 2) == 0) 696672Smckusick rstflg = 1; 706672Smckusick else { 716672Smckusick fprintf(stderr, "not restored\n"); 726672Smckusick exit(1); 736672Smckusick } 746672Smckusick } 756672Smckusick } 766672Smckusick if (argc <= 1) { 776672Smckusick argv[0][0] = '-'; 786672Smckusick argv[0][1] = '\0'; 796672Smckusick argc++; 806672Smckusick argv--; 816672Smckusick } 826672Smckusick svargc = --argc; 836672Smckusick svargv = ++argv; 846672Smckusick dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL); 856672Smckusick *FILENAME = *svargv; /* initial file name */ 866672Smckusick if(rstflg == 0) 876672Smckusick yyparse(); 886672Smckusick dprintf("errorflag=%d\n", errorflag, NULL, NULL); 896672Smckusick if (errorflag) 906672Smckusick exit(errorflag); 916672Smckusick if(svflg) { 926672Smckusick svflg = 0; 936672Smckusick if(freeze("awk.out") != 0) 946672Smckusick fprintf(stderr, "not saved\n"); 956672Smckusick exit(0); 966672Smckusick } 976672Smckusick run(); 986672Smckusick exit(errorflag); 996672Smckusick } 1006672Smckusick 1016672Smckusick yywrap() 1026672Smckusick { 1036672Smckusick return(1); 1046672Smckusick } 105