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 <[email protected]>
> ---
>  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

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to