From: Rémi Denis-Courmont Date: Thu, 8 Apr 2010 15:44:34 +0000 (+0300) Subject: Replacement for getdelim and getline - fixes #3503 X-Git-Tag: 1.1.0-pre1~84 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=ef4f0e4d7a523ae75aeafca1d6a91b1981318364;p=vlc Replacement for getdelim and getline - fixes #3503 --- diff --git a/compat/getdelim.c b/compat/getdelim.c new file mode 100644 index 0000000000..ad1de1da9d --- /dev/null +++ b/compat/getdelim.c @@ -0,0 +1,67 @@ +/***************************************************************************** + * getdelim.c: POSIX getdelim() and getline() replacements + ***************************************************************************** + * Copyright © 2010 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +ssize_t getdelim (char **restrict lineptr, size_t *restrict n, + int delimiter, FILE *restrict stream) +{ + char *ptr = *lineptr; + size_t size = (ptr != NULL) ? *n : 0; + size_t len = 0; + + for (;;) + { + if ((size - len) <= 2) + { + size = size ? (size * 2) : 256; + ptr = realloc (*lineptr, size); + if (ptr == NULL) + return -1; + *lineptr = ptr; + *n = size; + } + + int c = fgetc (stream); + if (c == -1) + { + if (len == 0 || ferror (stream)) + return -1; + break; /* EOF */ + } + ptr[len++] = c; + if (c == delimiter) + break; + } + + ptr[len] = '\0'; + return len; +} + +ssize_t getline (char **restrict lineptr, size_t *restrict n, + FILE *restrict stream) +{ + return getdelim (lineptr, n, '\n', stream); +} diff --git a/configure.ac b/configure.ac index e21d62d404..8e47a0cd3a 100644 --- a/configure.ac +++ b/configure.ac @@ -549,7 +549,7 @@ need_libc=false dnl Check for usual libc functions AC_CHECK_FUNCS([ctime_r daemon fcntl fdopendir fork getenv getpwuid_r gettimeofday isatty lstat memalign posix_fadvise posix_madvise posix_memalign putenv setenv setlocale stricmp strnicmp tdestroy uselocale]) -AC_REPLACE_FUNCS([asprintf atof atoll getcwd getpid gmtime_r lldiv localtime_r nrand48 rewind strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll swab vasprintf]) +AC_REPLACE_FUNCS([asprintf atof atoll getcwd getdelim getpid gmtime_r lldiv localtime_r nrand48 rewind strcasecmp strcasestr strdup strlcpy strncasecmp strndup strnlen strsep strtof strtok_r strtoll swab vasprintf]) AC_CHECK_FUNCS(fdatasync,, [AC_DEFINE(fdatasync, fsync, [Alias fdatasync() to fsync() if missing.]) ]) diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index 08a16ff950..7fe2d52481 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -43,7 +43,8 @@ typedef struct # include /* NULL */ #endif -#ifndef HAVE_REWIND +#if !defined (HAVE_REWIND) || \ + !defined (HAVE_GETDELIM) # include /* FILE */ #endif @@ -142,6 +143,11 @@ void rewind (FILE *); char *getcwd (char *buf, size_t size); #endif +#ifndef HAVE_GETDELIM +ssize_t getdelim (char **, size_t *, int, FILE *); +ssize_t getline (char **, size_t *, FILE *); +#endif + #ifndef HAVE_GETPID pid_t getpid (void); #endif