| #define _GNU_SOURCE | |
| #include "stdio_impl.h" | |
| #include <string.h> | |
| char* fgetln(FILE* f, size_t* plen) { | |
| char *ret = 0, *z; | |
| ssize_t l; | |
| FLOCK(f); | |
| ungetc(getc_unlocked(f), f); | |
| if ((z = memchr(f->rpos, '\n', f->rend - f->rpos))) { | |
| ret = (char*)f->rpos; | |
| *plen = ++z - ret; | |
| f->rpos = (void*)z; | |
| } else if ((l = getline(&f->getln_buf, (size_t[]){}, f)) > 0) { | |
| *plen = l; | |
| ret = f->getln_buf; | |
| } | |
| FUNLOCK(f); | |
| return ret; | |
| } |