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