Index: fusl/src/internal/shgetc.c |
diff --git a/fusl/src/internal/shgetc.c b/fusl/src/internal/shgetc.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e878b00ad50ac709b33366f11619817c1e535636 |
--- /dev/null |
+++ b/fusl/src/internal/shgetc.c |
@@ -0,0 +1,27 @@ |
+#include "shgetc.h" |
+ |
+void __shlim(FILE *f, off_t lim) |
+{ |
+ f->shlim = lim; |
+ f->shcnt = f->rend - f->rpos; |
+ if (lim && f->shcnt > lim) |
+ f->shend = f->rpos + lim; |
+ else |
+ f->shend = f->rend; |
+} |
+ |
+int __shgetc(FILE *f) |
+{ |
+ int c; |
+ if (f->shlim && f->shcnt >= f->shlim || (c=__uflow(f)) < 0) { |
+ f->shend = 0; |
+ return EOF; |
+ } |
+ if (f->shlim && f->rend - f->rpos > f->shlim - f->shcnt - 1) |
+ f->shend = f->rpos + (f->shlim - f->shcnt - 1); |
+ else |
+ f->shend = f->rend; |
+ if (f->rend) f->shcnt += f->rend - f->rpos + 1; |
+ if (f->rpos[-1] != c) f->rpos[-1] = c; |
+ return c; |
+} |