shgetc.c 561 B

123456789101112131415161718192021222324252627
  1. #include "shgetc.h"
  2. void __shlim(FILE *f, off_t lim)
  3. {
  4. f->shlim = lim;
  5. f->shcnt = f->rend - f->rpos;
  6. if (lim && f->shcnt > lim)
  7. f->shend = f->rpos + lim;
  8. else
  9. f->shend = f->rend;
  10. }
  11. int __shgetc(FILE *f)
  12. {
  13. int c;
  14. if (f->shlim && f->shcnt >= f->shlim || (c=__uflow(f)) < 0) {
  15. f->shend = 0;
  16. return EOF;
  17. }
  18. if (f->shlim && f->rend - f->rpos > f->shlim - f->shcnt - 1)
  19. f->shend = f->rpos + (f->shlim - f->shcnt - 1);
  20. else
  21. f->shend = f->rend;
  22. if (f->rend) f->shcnt += f->rend - f->rpos + 1;
  23. if (f->rpos[-1] != c) f->rpos[-1] = c;
  24. return c;
  25. }