Annotation of 43BSDReno/usr.bin/awk/lib.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)lib.c      4.7 (Berkeley) 6/25/90";
        !             3: #endif
        !             4: 
        !             5: #include "stdio.h"
        !             6: #include "awk.def"
        !             7: #include "awk.h"
        !             8: #include "ctype.h"
        !             9: 
        !            10: extern FILE    *yyin;  /* lex input file */
        !            11: extern char    *lexprog;       /* points to program argument if it exists */
        !            12: FILE   *infile = NULL;
        !            13: char   *file;
        !            14: #define        RECSIZE (5 * 512)
        !            15: char   record[RECSIZE];
        !            16: char   fields[RECSIZE];
        !            17: char   EMPTY[] = "";
        !            18: 
        !            19: #define        MAXFLD  100
        !            20: int    donefld;        /* 1 = implies rec broken into fields */
        !            21: int    donerec;        /* 1 = record is valid (no flds have changed) */
        !            22: int    mustfld;        /* 1 = NF seen, so always break*/
        !            23: 
        !            24: #define        FINIT   {EMPTY, EMPTY, 0.0, FLD|STR}
        !            25: cell fldtab[MAXFLD] = {        /*room for fields */
        !            26:        { "$record", record, 0.0, STR|FLD},
        !            27:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            28:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            29:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            30:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            31:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            32:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            33:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            34:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            35:        FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT, FINIT,
        !            36: };
        !            37: int    maxfld  = 0;    /* last used field */
        !            38: 
        !            39: 
        !            40: getrec()
        !            41: {
        !            42:        register char *rr;
        !            43:        extern int svargc;
        !            44:        extern char **svargv;
        !            45:        register c, sep;
        !            46: 
        !            47:        dprintf("**RS=%o, **FS=%o\n", **RS, **FS, NULL);
        !            48:        donefld = 0;
        !            49:        donerec = 1;
        !            50:        record[0] = 0;
        !            51:        while (svargc > 0) {
        !            52:                dprintf("svargc=%d, *svargv=%s\n", svargc, *svargv, NULL);
        !            53:                if (infile == NULL) {   /* have to open a new file */
        !            54:                        if (member('=', *svargv)) {     /* it's a var=value argument */
        !            55:                                setclvar(*svargv);
        !            56:                                svargv++;
        !            57:                                svargc--;
        !            58:                                continue;
        !            59:                        }
        !            60:                        *FILENAME = file = *svargv;
        !            61:                        dprintf("opening file %s\n", file, NULL, NULL);
        !            62:                        if (*file == '-') {
        !            63:                                if (yyin == stdin && ! lexprog)
        !            64:                                        error(FATAL, "standard input already used for reading commands");
        !            65:                                else
        !            66:                                        infile = stdin;
        !            67:                        }
        !            68:                        else if ((infile = fopen(file, "r")) == NULL)
        !            69:                                error(FATAL, "can't open %s", file);
        !            70:                }
        !            71:                if ((sep = **RS) == 0)
        !            72:                        sep = '\n';
        !            73:                for (rr = record; ; ) {
        !            74:                        for (; (c=getc(infile)) != sep && c != EOF; *rr++ = c)
        !            75:                                ;
        !            76:                        if (**RS == sep || c == EOF)
        !            77:                                break;
        !            78:                        if ((c = getc(infile)) == '\n' || c == EOF)     /* 2 in a row */
        !            79:                                break;
        !            80:                        *rr++ = '\n';
        !            81:                        *rr++ = c;
        !            82:                }
        !            83:                if (rr > record+RECSIZE)
        !            84:                        error(FATAL, "record `%.20s...' too long", record);
        !            85:                *rr = 0;
        !            86:                if (mustfld)
        !            87:                        fldbld();
        !            88:                if (c != EOF || rr > record) {  /* normal record */
        !            89:                        recloc->tval &= ~NUM;
        !            90:                        recloc->tval |= STR;
        !            91:                        ++nrloc->fval;
        !            92:                        nrloc->tval &= ~STR;
        !            93:                        nrloc->tval |= NUM;
        !            94:                        return(1);
        !            95:                }
        !            96:                /* EOF arrived on this file; set up next */
        !            97:                if (infile != stdin)
        !            98:                        fclose(infile);
        !            99:                infile = NULL;
        !           100:                svargc--;
        !           101:                svargv++;
        !           102:        }
        !           103:        return(0);      /* true end of file */
        !           104: }
        !           105: 
        !           106: setclvar(s)    /* set var=value from s */
        !           107: char *s;
        !           108: {
        !           109:        char *p;
        !           110:        cell *q;
        !           111: 
        !           112:        for (p=s; *p != '='; p++)
        !           113:                ;
        !           114:        *p++ = 0;
        !           115:        q = setsymtab(s, tostring(p), 0.0, STR, symtab);
        !           116:        setsval(q, p);
        !           117:        dprintf("command line set %s to |%s|\n", s, p, NULL);
        !           118: }
        !           119: 
        !           120: fldbld()
        !           121: {
        !           122:        register char *r, *fr, sep;
        !           123:        int i, j;
        !           124: 
        !           125:        r = record;
        !           126:        fr = fields;
        !           127:        i = 0;  /* number of fields accumulated here */
        !           128:        if ((sep = **FS) == ' ')
        !           129:                for (i = 0; ; ) {
        !           130:                        while (*r == ' ' || *r == '\t' || *r == '\n')
        !           131:                                r++;
        !           132:                        if (*r == 0)
        !           133:                                break;
        !           134:                        i++;
        !           135:                        if (i >= MAXFLD)
        !           136:                                error(FATAL, "record `%.20s...' has too many fields", record);
        !           137:                        if (!(fldtab[i].tval&FLD))
        !           138:                                strfree(fldtab[i].sval);
        !           139:                        fldtab[i].sval = fr;
        !           140:                        fldtab[i].tval = FLD | STR;
        !           141:                        do
        !           142:                                *fr++ = *r++;
        !           143:                        while (*r != ' ' && *r != '\t' && *r != '\n' && *r != '\0');
        !           144:                        *fr++ = 0;
        !           145:                }
        !           146:        else if (*r != 0)       /* if 0, it's a null field */
        !           147:                for (;;) {
        !           148:                        i++;
        !           149:                        if (i >= MAXFLD)
        !           150:                                error(FATAL, "record `%.20s...' has too many fields", record);
        !           151:                        if (!(fldtab[i].tval&FLD))
        !           152:                                strfree(fldtab[i].sval);
        !           153:                        fldtab[i].sval = fr;
        !           154:                        fldtab[i].tval = FLD | STR;
        !           155:                        while (*r != sep && *r != '\n' && *r != '\0')   /* \n always a separator */
        !           156:                                *fr++ = *r++;
        !           157:                        *fr++ = 0;
        !           158:                        if (*r++ == 0)
        !           159:                                break;
        !           160:                }
        !           161:        *fr = 0;
        !           162:        for (j=MAXFLD-1; j>i; j--) {    /* clean out junk from previous record */
        !           163:                if (!(fldtab[j].tval&FLD))
        !           164:                        strfree(fldtab[j].sval);
        !           165:                fldtab[j].tval = STR | FLD;
        !           166:                fldtab[j].sval = EMPTY;
        !           167:        }
        !           168:        maxfld = i;
        !           169:        donefld = 1;
        !           170:        for(i=1; i<=maxfld; i++)
        !           171:                if(isnumber(fldtab[i].sval)) {
        !           172:                        fldtab[i].fval = atof(fldtab[i].sval);
        !           173:                        fldtab[i].tval |= NUM;
        !           174:                }
        !           175:        setfval(lookup("NF", symtab, 0), (awkfloat) maxfld);
        !           176:        if (dbg)
        !           177:                for (i = 0; i <= maxfld; i++)
        !           178:                        printf("field %d: |%s|\n", i, fldtab[i].sval);
        !           179: }
        !           180: 
        !           181: recbld()
        !           182: {
        !           183:        int i;
        !           184:        register char *r, *p;
        !           185: 
        !           186:        if (donefld == 0 || donerec == 1)
        !           187:                return;
        !           188:        r = record;
        !           189:        for (i = 1; i <= *NF; i++) {
        !           190:                p = getsval(&fldtab[i]);
        !           191:                while (*r++ = *p++)
        !           192:                        ;
        !           193:                *(r-1) = **OFS;
        !           194:        }
        !           195:        *(r-1) = '\0';
        !           196:        dprintf("in recbld FS=%o, recloc=%o\n", **FS, recloc, NULL);
        !           197:        recloc->tval = STR | FLD;
        !           198:        dprintf("in recbld FS=%o, recloc=%o\n", **FS, recloc, NULL);
        !           199:        if (r > record+RECSIZE)
        !           200:                error(FATAL, "built giant record `%.20s...'", record);
        !           201:        dprintf("recbld = |%s|\n", record, NULL, NULL);
        !           202: }
        !           203: 
        !           204: cell *fieldadr(n)
        !           205: {
        !           206:        if (n >= MAXFLD)
        !           207:                error(FATAL, "trying to access field %d", n);
        !           208:        return(&fldtab[n]);
        !           209: }
        !           210: 
        !           211: int    errorflag       = 0;
        !           212: 
        !           213: yyerror(s) char *s; {
        !           214:        fprintf(stderr, "awk: %s near line %d\n", s, lineno);
        !           215:        errorflag = 2;
        !           216: }
        !           217: 
        !           218: error(f, s, a1, a2, a3, a4, a5, a6, a7) {
        !           219:        fprintf(stderr, "awk: ");
        !           220:        fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
        !           221:        fprintf(stderr, "\n");
        !           222:        if (NR && *NR > 0)
        !           223:                fprintf(stderr, " record number %g\n", *NR);
        !           224:        if (f)
        !           225:                exit(2);
        !           226: }
        !           227: 
        !           228: PUTS(s) char *s; {
        !           229:        dprintf("%s\n", s, NULL, NULL);
        !           230: }
        !           231: 
        !           232: #define        MAXEXPON        38      /* maximum exponenet for fp number */
        !           233: 
        !           234: isnumber(s)
        !           235: register char *s;
        !           236: {
        !           237:        register d1, d2;
        !           238:        int point;
        !           239:        char *es;
        !           240: 
        !           241:        if (s == NULL) 
        !           242:                return (0);
        !           243:        d1 = d2 = point = 0;
        !           244:        while (*s == ' ' || *s == '\t' || *s == '\n')
        !           245:                s++;
        !           246:        if (*s == '\0')
        !           247:                return(0);      /* empty stuff isn't number */
        !           248:        if (*s == '+' || *s == '-')
        !           249:                s++;
        !           250:        if (!isdigit(*s) && *s != '.')
        !           251:                return(0);
        !           252:        if (isdigit(*s)) {
        !           253:                do {
        !           254:                        d1++;
        !           255:                        s++;
        !           256:                } while (isdigit(*s));
        !           257:        }
        !           258:        if(d1 >= MAXEXPON)
        !           259:                return(0);      /* too many digits to convert */
        !           260:        if (*s == '.') {
        !           261:                point++;
        !           262:                s++;
        !           263:        }
        !           264:        if (isdigit(*s)) {
        !           265:                d2++;
        !           266:                do {
        !           267:                        s++;
        !           268:                } while (isdigit(*s));
        !           269:        }
        !           270:        if (!(d1 || point && d2))
        !           271:                return(0);
        !           272:        if (*s == 'e' || *s == 'E') {
        !           273:                s++;
        !           274:                if (*s == '+' || *s == '-')
        !           275:                        s++;
        !           276:                if (!isdigit(*s))
        !           277:                        return(0);
        !           278:                es = s;
        !           279:                do {
        !           280:                        s++;
        !           281:                } while (isdigit(*s));
        !           282:                if (s - es > 2)
        !           283:                        return(0);
        !           284:                else if (s - es == 2 && 10 * (*es-'0') + *(es+1)-'0' >= MAXEXPON)
        !           285:                        return(0);
        !           286:        }
        !           287:        while (*s == ' ' || *s == '\t' || *s == '\n')
        !           288:                s++;
        !           289:        if (*s == '\0')
        !           290:                return(1);
        !           291:        else
        !           292:                return(0);
        !           293: }
        !           294: /*
        !           295: isnumber(s) char *s; {return(0);}
        !           296: */

unix.superglobalmegacorp.com

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