[vlc-commits] commit: Replacement for getdelim and getline - fixes #3503 ( Rémi Denis-Courmont )
git at videolan.org
git at videolan.org
Thu Apr 8 17:50:14 CEST 2010
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Thu Apr 8 18:44:34 2010 +0300| [ef4f0e4d7a523ae75aeafca1d6a91b1981318364] | committer: Rémi Denis-Courmont
Replacement for getdelim and getline - fixes #3503
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ef4f0e4d7a523ae75aeafca1d6a91b1981318364
---
compat/getdelim.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++
configure.ac | 2 +-
include/vlc_fixups.h | 8 +++++-
3 files changed, 75 insertions(+), 2 deletions(-)
diff --git a/compat/getdelim.c b/compat/getdelim.c
new file mode 100644
index 0000000..ad1de1d
--- /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 <config.h>
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+
+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 e21d62d..8e47a0c 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 08a16ff..7fe2d52 100644
--- a/include/vlc_fixups.h
+++ b/include/vlc_fixups.h
@@ -43,7 +43,8 @@ typedef struct
# include <stddef.h> /* NULL */
#endif
-#ifndef HAVE_REWIND
+#if !defined (HAVE_REWIND) || \
+ !defined (HAVE_GETDELIM)
# include <stdio.h> /* 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
More information about the vlc-commits
mailing list