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