Index: fusl/src/stdio/fgets.c |
diff --git a/fusl/src/stdio/fgets.c b/fusl/src/stdio/fgets.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d3f9819e82eec3a5707805d5ae5b661a78adec30 |
--- /dev/null |
+++ b/fusl/src/stdio/fgets.c |
@@ -0,0 +1,46 @@ |
+#include "stdio_impl.h" |
+#include <string.h> |
+ |
+#define MIN(a,b) ((a)<(b) ? (a) : (b)) |
+ |
+char *fgets(char *restrict s, int n, FILE *restrict f) |
+{ |
+ char *p = s; |
+ unsigned char *z; |
+ size_t k; |
+ int c; |
+ |
+ FLOCK(f); |
+ |
+ if (n--<=1) { |
+ f->mode |= f->mode-1; |
+ FUNLOCK(f); |
+ if (n) return 0; |
+ *s = 0; |
+ return s; |
+ } |
+ |
+ while (n) { |
+ z = memchr(f->rpos, '\n', f->rend - f->rpos); |
+ k = z ? z - f->rpos + 1 : f->rend - f->rpos; |
+ k = MIN(k, n); |
+ memcpy(p, f->rpos, k); |
+ f->rpos += k; |
+ p += k; |
+ n -= k; |
+ if (z || !n) break; |
+ if ((c = getc_unlocked(f)) < 0) { |
+ if (p==s || !feof(f)) s = 0; |
+ break; |
+ } |
+ n--; |
+ if ((*p++ = c) == '\n') break; |
+ } |
+ if (s) *p = 0; |
+ |
+ FUNLOCK(f); |
+ |
+ return s; |
+} |
+ |
+weak_alias(fgets, fgets_unlocked); |