NetBSD/gnu/libexec/uucp/libuucp/getlin.c

82 lines
1.9 KiB
C

/* getlin.c
Replacement for getline.
Copyright (C) 1992 Ian Lance Taylor
This file is part of Taylor UUCP.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License
as published by the Free Software Foundation; either version 2 of
the License, 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
The author of the program may be contacted at ian@airs.com or
c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254.
*/
#include "uucp.h"
/* Read a line from a file, returning the number of characters read.
This should really return ssize_t. Returns -1 on error. */
#define CGETLINE_DEFAULT (63)
int
getline (pzline, pcline, e)
char **pzline;
size_t *pcline;
FILE *e;
{
char *zput, *zend;
int bchar;
if (*pzline == NULL)
{
*pzline = (char *) malloc (CGETLINE_DEFAULT);
if (*pzline == NULL)
return -1;
*pcline = CGETLINE_DEFAULT;
}
zput = *pzline;
zend = *pzline + *pcline - 1;
while ((bchar = getc (e)) != EOF)
{
if (zput >= zend)
{
size_t cnew;
char *znew;
cnew = *pcline * 2 + 1;
znew = (char *) realloc ((pointer) *pzline, cnew);
if (znew == NULL)
return -1;
zput = znew + *pcline - 1;
zend = znew + cnew - 1;
*pzline = znew;
*pcline = cnew;
}
*zput++ = bchar;
if (bchar == '\n')
break;
}
if (zput == *pzline)
return -1;
*zput = '\0';
return zput - *pzline;
}