size_t fread(void *destv, size_t size, size_t nmemb, FILE *f) { unsigned char *dest = destv; size_t len = size*nmemb, l = len, k; /* Never touch the file if length is zero.. */ if (!l) return 0; FLOCK(f); if (f->rend - f->rpos > 0) { /* First exhaust the buffer. */ k = MIN(f->rend - f->rpos, l); memcpy(dest, f->rpos, k); f->rpos += k; dest += k; l -= k; } /* Read the remainder directly */ for (; l; l-=k, dest+=k) { k = __toread(f) ? 0 : f->read(f, dest, l); if (k+1<=1) { FUNLOCK(f); return (len-l)/size; } } FUNLOCK(f); return nmemb; }
wint_t ungetwc(wint_t c, FILE* f) { unsigned char mbc[MB_LEN_MAX]; int l = 1; locale_t *ploc = &CURRENT_LOCALE, loc = *ploc; FLOCK(f); if (f->mode <= 0) fwide(f, 1); *ploc = f->locale; if (!f->rpos) __toread(f); if (!f->rpos || f->rpos < f->buf - UNGET + l || c == WEOF || (!isascii(c) && (l = wctomb((void*)mbc, c)) < 0)) { FUNLOCK(f); *ploc = loc; return WEOF; } if (isascii(c)) *--f->rpos = c; else memcpy(f->rpos -= l, mbc, l); f->flags &= ~F_EOF; FUNLOCK(f); *ploc = loc; return c; }
int __uflow(FILE *f) { unsigned char c; if (!__toread(f) && f->read(f, &c, 1)==1) return c; return EOF; }