1
0

fgetln.c 441 B

123456789101112131415161718192021
  1. #define _GNU_SOURCE
  2. #include "stdio_impl.h"
  3. #include <string.h>
  4. char *fgetln(FILE *f, size_t *plen)
  5. {
  6. char *ret = 0, *z;
  7. ssize_t l;
  8. FLOCK(f);
  9. ungetc(getc_unlocked(f), f);
  10. if (f->rend && (z=memchr(f->rpos, '\n', f->rend - f->rpos))) {
  11. ret = (char *)f->rpos;
  12. *plen = ++z - ret;
  13. f->rpos = (void *)z;
  14. } else if ((l = getline(&f->getln_buf, (size_t[]){0}, f)) > 0) {
  15. *plen = l;
  16. ret = f->getln_buf;
  17. }
  18. FUNLOCK(f);
  19. return ret;
  20. }