Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 1 | #include "shgetc.h" |
| 2 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 3 | void __shlim(FILE* f, off_t lim) { |
| 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; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 10 | } |
| 11 | |
George Kulakowski | 17e3b04 | 2016-02-18 15:59:50 -0800 | [diff] [blame] | 12 | int __shgetc(FILE* f) { |
| 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) |
| 23 | f->shcnt += f->rend - f->rpos + 1; |
| 24 | if (f->rpos[-1] != c) |
| 25 | f->rpos[-1] = c; |
| 26 | return c; |
Viet-Trung Luu | 96b05c1 | 2016-01-11 11:26:36 -0800 | [diff] [blame] | 27 | } |