source:
asp3_tinet_ecnl_arm/trunk/musl-1.1.18/src/stdio/fgets.c
Last change on this file was 352, checked in by , 6 years ago | |
---|---|
|
|
File size: 718 bytes |
Rev | Line | |
---|---|---|
[352] | 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); |
Note:
See TracBrowser
for help on using the repository browser.