Annotation of 3BSD/cmd/awk/main.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "awk.def"
                      3: #include "awk.h"
                      4: 
                      5: int    dbg     = 0;
                      6: int    svargc;
                      7: char   **svargv, **xargv;
                      8: extern FILE    *yyin;  /* lex input file */
                      9: char   *lexprog;       /* points to program argument if it exists */
                     10: extern errorflag;      /* non-zero if any syntax errors; set by yyerror */
                     11: 
                     12: int filefd, iflag, symnum, ansfd;
                     13: char *filelist;
                     14: extern int maxsym, errno;
                     15: main(argc, argv) int argc; char *argv[]; {
                     16:        if (argc == 1)
                     17:                error(FATAL, "Usage: awk [-f source | 'cmds'] [files]");
                     18:        if (strcmp(argv[0], "a.out"))
                     19:                logit(argc, argv);
                     20:        syminit();
                     21:        while (argc > 1) {
                     22:                argc--;
                     23:                argv++;
                     24:                if (argv[0][0] == '-' && argv[0][1] == 'f') {
                     25:                        yyin = fopen(argv[1], "r");
                     26:                        if (yyin == NULL)
                     27:                                error(FATAL, "can't open %s", argv[1]);
                     28:                        argc--;
                     29:                        argv++;
                     30:                        break;
                     31:                } else if (argv[0][0] == '-' && argv[0][1] == 'F') {    /* set field sep */
                     32:                        if (argv[0][2] == 't')  /* special case for tab */
                     33:                                **FS = '\t';
                     34:                        else
                     35:                                **FS = argv[0][2];
                     36:                        continue;
                     37:                } else if (argv[0][0] != '-') {
                     38:                        dprintf("cmds=|%s|\n", argv[0], NULL, NULL);
                     39:                        yyin = NULL;
                     40:                        lexprog = argv[0];
                     41:                        argv[0] = argv[-1];     /* need this space */
                     42:                        break;
                     43:                } else if (strcmp("-d", argv[0])==0)
                     44:                        dbg = 1;
                     45:                else if (argv[0][0]=='-' && argv[0][1]=='i') {
                     46:                        iflag=1;
                     47:                        sscanf(argv[0], "-i%d, %d", &filefd, &ansfd);
                     48:                }
                     49:        }
                     50:        if (argc <= 1 && !iflag) {
                     51:                argv[0][0] = '-';
                     52:                argv[0][1] = '\0';
                     53:                argc++;
                     54:                argv--;
                     55:        }
                     56:        if (!iflag) {
                     57:                svargc = --argc;
                     58:                svargv = ++argv;
                     59:                dprintf("svargc=%d svargv[0]=%s\n", svargc, svargv[0], NULL);
                     60:        }
                     61:        *FILENAME = *svargv;    /* initial file name */
                     62: iloop:
                     63:        if (iflag)
                     64:                msgfiles();
                     65:        yyparse();
                     66:        dprintf("errorflag=%d\n", errorflag, NULL, NULL);
                     67:        if (errorflag)
                     68:                exit(0);
                     69:        run();
                     70:        if (iflag)
                     71:                write(ansfd, &errorflag, sizeof(errorflag));
                     72:        else exit(errorflag);
                     73: /*sym cleanup should go here , followed by another syminit*/
                     74:        goto iloop;
                     75: }
                     76: 
                     77: logit(n, s) char *s[];
                     78: {      int i, tvec[2];
                     79:        FILE *f, *g;
                     80:        char buf[BUFSIZ];
                     81:        if ((f=fopen("/usr/pjw/awk/awkhist", "a"))==NULL)
                     82:                return;
                     83:        time(tvec);
                     84:        fprintf(f, "%-8s %s", getlogin(), ctime(tvec));
                     85:        for (i=0; i<n; i++)
                     86:                fprintf(f, "'%s'", s[i]);
                     87:        putc('\n', f);
                     88:        if (strcmp(s[1], "-f")) {
                     89:                fclose(f);
                     90:                return;
                     91:        }
                     92:        if ((g=fopen(s[2], "r"))==NULL) {
                     93:                fclose(f);
                     94:                return;
                     95:        }
                     96:        while ((i=fread(buf, 1, BUFSIZ, g))>0)
                     97:                fwrite(buf, 1, i, f);
                     98:        fclose(f);
                     99:        fclose(g);
                    100: }
                    101: 
                    102: yywrap()
                    103: {
                    104:        return(1);
                    105: }
                    106: 
                    107: msgfiles()
                    108: {      char buf[BUFSIZ], *p, *q, **s;
                    109:        int n;
                    110:        n=read(filefd, buf, BUFSIZ);
                    111:        if (n<=0)       /*no one at other end?*/ {
                    112:                perror("no files");
                    113:                exit(errno);
                    114:        }
                    115:        xfree(filelist);
                    116:        q=filelist=malloc(n);
                    117:        for (p=buf; *p==' ' || *p=='\t' || *p=='\n'; p++); 
                    118:        for (n=0; *p!=';'; )
                    119:        {
                    120:                if (*p==' ' || *p=='\t' || *p=='\n') {
                    121:                        n++;
                    122:                        *q++=0;
                    123:                        while (*p==' ' || *p=='\t' || *p=='\n')
                    124:                                p++;
                    125:                }
                    126:                else    *q++ = *p++;
                    127:        }
                    128:        if (q!=filelist && *(q-1)!=0) {
                    129:                n++;
                    130:                *q++ = 0;
                    131:        }
                    132:        svargc=n;
                    133:        xfree(xargv);
                    134:        xargv=s=svargv=malloc(n*sizeof(char *));
                    135:        for (p=filelist; n>0; n--)
                    136:        {
                    137:                *s++=p;
                    138:                while (*p++ != 0);
                    139:        }
                    140: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.