--- /dev/null
+/*****************************************************************************
+ * 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);
+}
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.])
])
# include <stddef.h> /* NULL */
#endif
-#ifndef HAVE_REWIND
+#if !defined (HAVE_REWIND) || \
+ !defined (HAVE_GETDELIM)
# include <stdio.h> /* FILE */
#endif
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