[PATCH 2/3] platform: provide getline and getdelim if not available
Denys Vlasenko
vda.linux at googlemail.com
Mon Jun 20 08:21:02 UTC 2011
On Saturday 18 June 2011 17:56, Timo Teräs wrote:
> Simple implementations. Need to check which platforms need the
> wrapper.
>
> Signed-off-by: Timo Teräs <timo.teras at iki.fi>
> ---
> include/platform.h | 6 ++++++
> libbb/platform.c | 36 ++++++++++++++++++++++++++++++++++++
> 2 files changed, 42 insertions(+), 0 deletions(-)
>
> diff --git a/include/platform.h b/include/platform.h
> index 429220b..be365d2 100644
> --- a/include/platform.h
> +++ b/include/platform.h
> @@ -349,6 +349,7 @@ typedef unsigned smalluint;
> #define HAVE_STRSEP 1
> #define HAVE_STRSIGNAL 1
> #define HAVE_VASPRINTF 1
> +#define HAVE_GETDELIM 1
> #define HAVE_XTABS 1
> #define HAVE_MNTENT_H 1
> #define HAVE_NET_ETHERNET_H 1
> @@ -455,4 +456,9 @@ extern char *strsep(char **stringp, const char *delim) FAST_FUNC;
> extern int vasprintf(char **string_ptr, const char *format, va_list p) FAST_FUNC;
> #endif
>
> +#ifndef HAVE_GETDELIM
> +extern ssize_t getdelim(char **lineptr, size_t *n, int delim, FILE *stream) FAST_FUNC;
> +extern ssize_t getline(char **lineptr, size_t *n, FILE *stream) FAST_FUNC;
> +#endif
> +
> #endif
> diff --git a/libbb/platform.c b/libbb/platform.c
> index 04b8961..6811ba5 100644
> --- a/libbb/platform.c
> +++ b/libbb/platform.c
> @@ -145,3 +145,39 @@ char* FAST_FUNC stpcpy(char *p, const char *to_add)
> return p;
> }
> #endif
> +
> +#ifndef HAVE_GETDELIM
> +ssize_t FAST_FUNC getdelim(char **lineptr, size_t *n, int delim, FILE *stream)
> +{
> + char *line = *lineptr;
> + ssize_t len = 0, alloced = *n;
> + int ch;
> +
> + do {
> + ch = fgetc(stream);
> + if (ch == EOF) {
> + if (len)
> + break;
> + return -1;
> + }
> + if (len + 1 > alloced) {
> + alloced = alloced ? alloced * 2 : 120;
> + line = realloc(line, alloced);
> + if (line == NULL)
> + return -1;
Leaks line on error path.
I think you should just use xrealloc :)
> + }
> + line[len++] = ch;
> + } while (ch != delim);
> +
> + line[len] = 0;
> + *lineptr = line;
> + *n = alloced;
> + return len;
> +}
> +
> +ssize_t FAST_FUNC getline(char **lineptr, size_t *n, FILE *stream)
> +{
> + /* FIXME: could optimize with fgets() */
> + return getdelim(lineptr, n, '\n', stream);
> +}
> +#endif
Since we don't use getdelim, maybe we should only implement getline?
--
vda
More information about the busybox
mailing list