提交 61718273 编写于 作者: R Rich Felker

add bsd fgetln function

optimized to avoid allocation and return lines directly out of the
stream buffer whenever possible.
上级 2b964b01
...@@ -172,6 +172,10 @@ int getw(FILE *); ...@@ -172,6 +172,10 @@ int getw(FILE *);
int putw(int, FILE *); int putw(int, FILE *);
#endif #endif
#ifdef _BSD_SOURCE
char *fgetln(FILE *, size_t *);
#endif
#ifdef _GNU_SOURCE #ifdef _GNU_SOURCE
int asprintf(char **, const char *, ...); int asprintf(char **, const char *, ...);
int vasprintf(char **, const char *, va_list); int vasprintf(char **, const char *, va_list);
......
...@@ -57,7 +57,7 @@ struct __FILE_s { ...@@ -57,7 +57,7 @@ struct __FILE_s {
int waiters; int waiters;
void *cookie; void *cookie;
off_t off; off_t off;
void *dummy4; char *getln_buf;
void *mustbezero_2; void *mustbezero_2;
unsigned char *shend; unsigned char *shend;
off_t shlim, shcnt; off_t shlim, shcnt;
......
...@@ -16,6 +16,7 @@ int fclose(FILE *f) ...@@ -16,6 +16,7 @@ int fclose(FILE *f)
r = fflush(f); r = fflush(f);
r |= f->close(f); r |= f->close(f);
if (f->getln_buf) free(f->getln_buf);
if (!perm) free(f); if (!perm) free(f);
return r; return r;
......
#include "stdio_impl.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[]){0}, f)) > 0) {
*plen = l;
ret = f->getln_buf;
}
FUNLOCK(f);
return ret;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册