mirror of
https://github.com/fluencelabs/musl
synced 2025-06-30 15:11:55 +00:00
add bsd fgetln function
optimized to avoid allocation and return lines directly out of the stream buffer whenever possible.
This commit is contained in:
@ -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 {
|
|||||||
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)
|
|||||||
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;
|
||||||
|
19
src/stdio/fgetln.c
Normal file
19
src/stdio/fgetln.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#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;
|
||||||
|
}
|
Reference in New Issue
Block a user