Annotation of 42BSD/lib/libc/stdio/doscan.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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