extern int _NXStreamChangeBuffer(NXStream *s, unsigned char ch) { int wasReading; _NXVerifyStream(s); wasReading = (s->flags & NX_READFLAG); NXChangeBuffer(s); if (wasReading) NXPutc(s, ch); else ch = NXGetc(s); return ((int)(ch)); }
int NXVScanf(NXStream *stream, register const char *fmt, va_list arg) { register int ch; int nmatch, len, ch1; void *ptr; int fileended, size; char _sctab[SCTAB_SIZE]; _NXVerifyStream(stream); bzero( _sctab, SCTAB_SIZE ); _sctab[9] = _sctab[10] = _sctab[32] = SPC; nmatch = 0; fileended = 0; for (;;) switch (ch = *fmt++) { case '\0': return (nmatch); case '%': if ((ch = *fmt++) == '%') goto def; ptr = 0; if (ch != '*') ptr = va_arg(arg, void *); else ch = *fmt++; len = 0; size = REGULAR; while (isdigit(ch)) { len = len*10 + ch - '0'; ch = *fmt++; } if (len == 0) len = 30000; if (ch=='l') { size = LONG; ch = *fmt++; } else if (ch=='h') { size = SHORT; ch = *fmt++; } else if (ch=='[') fmt = _getccl(fmt, _sctab); if (isupper(ch)) { ch = tolower(ch); size = LONG; } if (ch == '\0') return(-1); if (_innum(ptr, ch, len, size, stream, &fileended, _sctab) && ptr) nmatch++; if (fileended) return(nmatch? nmatch: -1); break; case ' ': case '\n': case '\t': while ((ch1 = NXGetc(stream))==' ' || ch1=='\t' || ch1=='\n') ; if (ch1 != EOF) NXUngetc(stream); break; default: def: ch1 = NXGetc(stream); if (ch1 != ch) { if (ch1==EOF) return(-1); NXUngetc(stream); return(nmatch); } }