Annotation of researchv9/libc/stdio/doscan.c, revision 1.1.1.1

1.1       root        1: /* @(#)doscan.c        4.1 (Berkeley) 12/21/80 */
                      2: #include <stdio.h>
                      3: #include       <ctype.h>
                      4: 
                      5: #define        SPC     01
                      6: #define        STP     02
                      7: 
                      8: #define        SHORT   0
                      9: #define        REGULAR 1
                     10: #define        LONG    2
                     11: #define        INT     0
                     12: #define        FLOAT   1
                     13: 
                     14: char   *_getccl();
                     15: 
                     16: char   _sctab[128] = {
                     17:        0,0,0,0,0,0,0,0,
                     18:        0,SPC,SPC,0,0,0,0,0,
                     19:        0,0,0,0,0,0,0,0,
                     20:        0,0,0,0,0,0,0,0,
                     21:        SPC,0,0,0,0,0,0,0,
                     22:        0,0,0,0,0,0,0,0,
                     23:        0,0,0,0,0,0,0,0,
                     24:        0,0,0,0,0,0,0,0,
                     25: };
                     26: 
                     27: _doscan(iop, fmt, argp)
                     28: FILE *iop;
                     29: register char *fmt;
                     30: register int **argp;
                     31: {
                     32:        register int ch;
                     33:        int nmatch, len, ch1;
                     34:        int **ptr, fileended, size;
                     35: 
                     36:        nmatch = 0;
                     37:        fileended = 0;
                     38:        for (;;) switch (ch = *fmt++) {
                     39:        case '\0': 
                     40:                return (nmatch);
                     41:        case '%': 
                     42:                if ((ch = *fmt++) == '%')
                     43:                        goto def;
                     44:                ptr = 0;
                     45:                if (ch != '*')
                     46:                        ptr = argp++;
                     47:                else
                     48:                        ch = *fmt++;
                     49:                len = 0;
                     50:                size = REGULAR;
                     51:                while (isdigit(ch)) {
                     52:                        len = len*10 + ch - '0';
                     53:                        ch = *fmt++;
                     54:                }
                     55:                if (len == 0)
                     56:                        len = 30000;
                     57:                if (ch=='l') {
                     58:                        size = LONG;
                     59:                        ch = *fmt++;
                     60:                } else if (ch=='h') {
                     61:                        size = SHORT;
                     62:                        ch = *fmt++;
                     63:                } else if (ch=='[')
                     64:                        fmt = _getccl(fmt);
                     65:                if (isupper(ch)) {
                     66:                        ch = tolower(ch);
                     67:                        size = LONG;
                     68:                }
                     69:                if (ch == '\0')
                     70:                        return(-1);
                     71:                if (_innum(ptr, ch, len, size, iop, &fileended) && ptr)
                     72:                        nmatch++;
                     73:                if (fileended)
                     74:                        return(nmatch? nmatch: -1);
                     75:                break;
                     76: 
                     77:        case ' ':
                     78:        case '\n':
                     79:        case '\t': 
                     80:                while ((ch1 = getc(iop))==' ' || ch1=='\t' || ch1=='\n')
                     81:                        ;
                     82:                if (ch1 != EOF)
                     83:                        ungetc(ch1, iop);
                     84:                break;
                     85: 
                     86:        default: 
                     87:        def:
                     88:                ch1 = getc(iop);
                     89:                if (ch1 != ch) {
                     90:                        if (ch1==EOF)
                     91:                                return(-1);
                     92:                        ungetc(ch1, iop);
                     93:                        return(nmatch);
                     94:                }
                     95:        }
                     96: }
                     97: 
                     98: _innum(ptr, type, len, size, iop, eofptr)
                     99: int **ptr, *eofptr;
                    100: struct _iobuf *iop;
                    101: {
                    102:        extern double atof();
                    103:        register char *np;
                    104:        char numbuf[64];
                    105:        register c, base;
                    106:        int expseen, scale, negflg, c1, ndigit;
                    107:        long lcval;
                    108: 
                    109:        if (type=='c' || type=='s' || type=='[')
                    110:                return(_instr(ptr? *(char **)ptr: (char *)NULL, type, len, iop, eofptr));
                    111:        lcval = 0;
                    112:        ndigit = 0;
                    113:        scale = INT;
                    114:        if (type=='e'||type=='f')
                    115:                scale = FLOAT;
                    116:        base = 10;
                    117:        if (type=='o')
                    118:                base = 8;
                    119:        else if (type=='x')
                    120:                base = 16;
                    121:        np = numbuf;
                    122:        expseen = 0;
                    123:        negflg = 0;
                    124:        while ((c = getc(iop))==' ' || c=='\t' || c=='\n');
                    125:        if (c=='-') {
                    126:                negflg++;
                    127:                *np++ = c;
                    128:                c = getc(iop);
                    129:                len--;
                    130:        } else if (c=='+') {
                    131:                len--;
                    132:                c = getc(iop);
                    133:        }
                    134:        for ( ; --len>=0; *np++ = c, c = getc(iop)) {
                    135:                if (isdigit(c)
                    136:                 || base==16 && ('a'<=c && c<='f' || 'A'<=c && c<='F')) {
                    137:                        ndigit++;
                    138:                        if (base==8)
                    139:                                lcval <<=3;
                    140:                        else if (base==10)
                    141:                                lcval = ((lcval<<2) + lcval)<<1;
                    142:                        else
                    143:                                lcval <<= 4;
                    144:                        c1 = c;
                    145:                        if (isdigit(c))
                    146:                                c -= '0';
                    147:                        else if ('a'<=c && c<='f')
                    148:                                c -= 'a'-10;
                    149:                        else
                    150:                                c -= 'A'-10;
                    151:                        lcval += c;
                    152:                        c = c1;
                    153:                        continue;
                    154:                } else if (c=='.') {
                    155:                        if (base!=10 || scale==INT)
                    156:                                break;
                    157:                        ndigit++;
                    158:                        continue;
                    159:                } else if ((c=='e'||c=='E') && expseen==0) {
                    160:                        if (base!=10 || scale==INT || ndigit==0)
                    161:                                break;
                    162:                        expseen++;
                    163:                        *np++ = c;
                    164:                        c = getc(iop);
                    165:                        if (c!='+'&&c!='-'&&('0'>c||c>'9'))
                    166:                                break;
                    167:                } else
                    168:                        break;
                    169:        }
                    170:        if (negflg)
                    171:                lcval = -lcval;
                    172:        if (c != EOF) {
                    173:                ungetc(c, iop);
                    174:                *eofptr = 0;
                    175:        } else
                    176:                *eofptr = 1;
                    177:        if (ptr==NULL || np==numbuf)
                    178:                return(0);
                    179:        *np++ = 0;
                    180:        switch((scale<<4) | size) {
                    181: 
                    182:        case (FLOAT<<4) | SHORT:
                    183:        case (FLOAT<<4) | REGULAR:
                    184:                **(float **)ptr = atof(numbuf);
                    185:                break;
                    186: 
                    187:        case (FLOAT<<4) | LONG:
                    188:                **(double **)ptr = atof(numbuf);
                    189:                break;
                    190: 
                    191:        case (INT<<4) | SHORT:
                    192:                **(short **)ptr = lcval;
                    193:                break;
                    194: 
                    195:        case (INT<<4) | REGULAR:
                    196:                **(int **)ptr = lcval;
                    197:                break;
                    198: 
                    199:        case (INT<<4) | LONG:
                    200:                **(long **)ptr = lcval;
                    201:                break;
                    202:        }
                    203:        return(1);
                    204: }
                    205: 
                    206: _instr(ptr, type, len, iop, eofptr)
                    207: register char *ptr;
                    208: register struct _iobuf *iop;
                    209: int *eofptr;
                    210: {
                    211:        register ch;
                    212:        register char *optr;
                    213:        int ignstp;
                    214: 
                    215:        *eofptr = 0;
                    216:        optr = ptr;
                    217:        if (type=='c' && len==30000)
                    218:                len = 1;
                    219:        ignstp = 0;
                    220:        if (type=='s')
                    221:                ignstp = SPC;
                    222:        while (_sctab[ch = getc(iop)] & ignstp)
                    223:                if (ch==EOF)
                    224:                        break;
                    225:        ignstp = SPC;
                    226:        if (type=='c')
                    227:                ignstp = 0;
                    228:        else if (type=='[')
                    229:                ignstp = STP;
                    230:        while (ch!=EOF && (_sctab[ch]&ignstp)==0) {
                    231:                if (ptr)
                    232:                        *ptr++ = ch;
                    233:                if (--len <= 0)
                    234:                        break;
                    235:                ch = getc(iop);
                    236:        }
                    237:        if (ch != EOF) {
                    238:                if (len > 0)
                    239:                        ungetc(ch, iop);
                    240:                *eofptr = 0;
                    241:        } else
                    242:                *eofptr = 1;
                    243:        if (ptr && ptr!=optr) {
                    244:                if (type!='c')
                    245:                        *ptr++ = '\0';
                    246:                return(1);
                    247:        }
                    248:        return(0);
                    249: }
                    250: 
                    251: char *
                    252: _getccl(s)
                    253: register char *s;
                    254: {
                    255:        register c, t;
                    256: 
                    257:        t = 0;
                    258:        if (*s == '^') {
                    259:                t++;
                    260:                s++;
                    261:        }
                    262:        for (c = 0; c < 128; c++)
                    263:                if (t)
                    264:                        _sctab[c] &= ~STP;
                    265:                else
                    266:                        _sctab[c] |= STP;
                    267:        while (((c = *s++)&0177) != ']') {
                    268:                if (t)
                    269:                        _sctab[c++] |= STP;
                    270:                else
                    271:                        _sctab[c++] &= ~STP;
                    272:                if (c==0)
                    273:                        return(--s);
                    274:        }
                    275:        return(s);
                    276: }

unix.superglobalmegacorp.com

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