OLD | NEW |
(Empty) | |
| 1 #include "stdio_impl.h" |
| 2 #include <string.h> |
| 3 |
| 4 #define MIN(a,b) ((a)<(b) ? (a) : (b)) |
| 5 |
| 6 char *fgets(char *restrict s, int n, FILE *restrict f) |
| 7 { |
| 8 char *p = s; |
| 9 unsigned char *z; |
| 10 size_t k; |
| 11 int c; |
| 12 |
| 13 FLOCK(f); |
| 14 |
| 15 if (n--<=1) { |
| 16 f->mode |= f->mode-1; |
| 17 FUNLOCK(f); |
| 18 if (n) return 0; |
| 19 *s = 0; |
| 20 return s; |
| 21 } |
| 22 |
| 23 while (n) { |
| 24 z = memchr(f->rpos, '\n', f->rend - f->rpos); |
| 25 k = z ? z - f->rpos + 1 : f->rend - f->rpos; |
| 26 k = MIN(k, n); |
| 27 memcpy(p, f->rpos, k); |
| 28 f->rpos += k; |
| 29 p += k; |
| 30 n -= k; |
| 31 if (z || !n) break; |
| 32 if ((c = getc_unlocked(f)) < 0) { |
| 33 if (p==s || !feof(f)) s = 0; |
| 34 break; |
| 35 } |
| 36 n--; |
| 37 if ((*p++ = c) == '\n') break; |
| 38 } |
| 39 if (s) *p = 0; |
| 40 |
| 41 FUNLOCK(f); |
| 42 |
| 43 return s; |
| 44 } |
| 45 |
| 46 weak_alias(fgets, fgets_unlocked); |
OLD | NEW |