summary refs log tree commit diff
path: root/libio/iogetdelim.c
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-11-20 03:48:11 +0000
committerRoland McGrath <roland@gnu.org>1995-11-20 03:48:11 +0000
commit96aa2d94a2355cdc55c96e808d14a0e7f2ebe77d (patch)
treef7c87e6742af0707b858a1387ca85b679aa8d13e /libio/iogetdelim.c
parenta5a81fecc7194d050066265a15b1ba8bc3abc627 (diff)
downloadglibc-96aa2d94a2355cdc55c96e808d14a0e7f2ebe77d.tar.gz
glibc-96aa2d94a2355cdc55c96e808d14a0e7f2ebe77d.tar.xz
glibc-96aa2d94a2355cdc55c96e808d14a0e7f2ebe77d.zip
Sat Nov 18 16:46:01 1995 Ulrich Drepper <drepper@gnu.ai.mit.edu>
	* libio/Makefile, libio/cleanup.c, libio/clearerr.c, libio/feof.c,
	libio/ferror.c, libio/fgetc.c, libio/filedoalloc.c, libio/fileno.c,
	libio/fileops.c, libio/fputc.c, libio/freopen.c, libio/fseek.c,
	libio/genops.c, libio/getc.c, libio/getchar.c, libio/iofclose.c,
	libio/iofdopen.c, libio/iofflush.c, libio/iofgetpos.c, libio/iofgets.c,
	libio/iofopen.c, libio/iofprintf.c, libio/iofputs.c, libio/iofread.c,
	libio/iofscanf.c, libio/iofsetpos.c, libio/ioftell.c, libio/iofwrite.c,
	libio/iogetdelim.c, libio/iogetline.c, libio/iogets.c, libio/iolibio.h,
	libio/iopadn.c, libio/ioprims.c, libio/ioputs.c, libio/ioseekoff.c,
	libio/ioseekpos.c, libio/iosetbuffer.c, libio/iosetvbuf.c,
	libio/iosprintf.c, libio/ioungetc.c, libio/iovsprintf.c,
	libio/iovsscanf.c, libio/libio.h, libio/libioP.h, libio/putc.c,
	libio/putchar.c, libio/rewind.c, libio/setbuf.c, libio/setlinebuf.c,
	libio/stdfiles.c, libio/stdio.c, libio/stdio.h, libio/strfile.h,
	libio/strops.c, libio/vasprintf.c, libio/vscanf.c, libio/vsnprintf.c:
	New files.  Slightly modified version from Linux libc.

	* libio/memstream.c, libio/vdprintf.c: New files for functions not
	(yet) part of GNU libio.

	* libio/iofopncook.c: Implementation of `fopencookie', mainly written
	by Per Bothner.

	* stdio-common/getline.c: Adapted to libio.
	* stdio-common/snprintf.c: Adapted to libio.
	* stdio-common/vfprintf.c: Adapted to libio.
	* stdio-common/vfscanf.c: Adapted to libio.
	* sysdeps/posix/tempname.c: Adapted to libio.
Diffstat (limited to 'libio/iogetdelim.c')
-rw-r--r--libio/iogetdelim.c105
1 files changed, 105 insertions, 0 deletions
diff --git a/libio/iogetdelim.c b/libio/iogetdelim.c
new file mode 100644
index 0000000000..a6894a5ae6
--- /dev/null
+++ b/libio/iogetdelim.c
@@ -0,0 +1,105 @@
+/*
+Copyright (C) 1994 Free Software Foundation
+
+This file is part of the GNU IO Library.  This library is free
+software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This library 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 General Public License
+along with this library; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+As a special exception, if you link this library with files
+compiled with a GNU compiler to produce an executable, this does not cause
+the resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why
+the executable file might be covered by the GNU General Public License. */
+
+#ifdef __STDC__
+#include <stdlib.h>
+#endif
+#include "libioP.h"
+#include <string.h>
+#include <errno.h>
+
+/* Read up to (and including) a TERMINATOR from FP into *LINEPTR
+   (and null-terminate it).  *LINEPTR is a pointer returned from malloc (or
+   NULL), pointing to *N characters of space.  It is realloc'ed as
+   necessary.  Returns the number of characters read (not including the
+   null terminator), or -1 on error or EOF.  */
+
+_IO_ssize_t
+_IO_getdelim (lineptr, n, delimiter, fp)
+     char **lineptr;
+     _IO_size_t *n;
+      int delimiter;
+      _IO_FILE *fp;
+{
+  register _IO_ssize_t cur_len = 0;
+  _IO_ssize_t len;
+
+  if (lineptr == NULL || n == NULL)
+    {
+#ifdef EINVAL
+      errno = EINVAL;
+#endif
+      return -1;
+    }
+  CHECK_FILE (fp, -1);
+  if (_IO_ferror (fp))
+    return -1;
+
+  if (*lineptr == NULL || *n == 0)
+    {
+      *n = 120;
+      *lineptr = (char *) malloc (*n);
+      if (*lineptr == NULL)
+	return -1;
+    }
+
+  len = fp->_IO_read_end - fp->_IO_read_ptr;
+  if (len <= 0)
+    {
+      if (__underflow (fp) == EOF)
+	return -1;
+      len = fp->_IO_read_end - fp->_IO_read_ptr;
+    }
+
+  for (;;)
+    {
+      _IO_size_t needed;
+      char *t;
+      t = (char *) memchr ((void *) fp->_IO_read_ptr, delimiter, len);
+      if (t != NULL)
+	len = (t - fp->_IO_read_ptr) + 1;
+      /* make enough space for len+1 (for final NUL) bytes. */
+      needed = cur_len + len + 1;
+      if (needed > *n)
+	{
+	  if (t == NULL && needed < 2 * *n)
+	    needed = 2 * *n;  /* Be generous. */
+	  *n = needed;
+	  *lineptr = (char *) realloc (*lineptr, needed);
+	  if (*lineptr == NULL)
+	    return -1;
+	}
+      memcpy (*lineptr + cur_len, (void *) fp->_IO_read_ptr, len);
+      fp->_IO_read_ptr += len;
+      cur_len += len;
+      if (t != NULL || __underflow (fp) == EOF)
+	break;
+      len = fp->_IO_read_end - fp->_IO_read_ptr;
+    }
+  lineptr[cur_len] = '\0';
+  return cur_len;
+}
+
+weak_alias (_IO_getdelim, __getdelim)
+weak_alias (_IO_getdelim, getdelim)