sed: use getline() instead of fgetln().

In BSD, fgetln() available in libc but in Illumos the Solaris port had to
include it internally. It also seems to have caused problems [1].

Aid portability by using getline() instead.

Reference:
https://www.illumos.org/issues/3820 [1]

Submitted by:	Johann 'Myrkraverk' Oskarsson <johann@myrkraverk.com>
Reviewed by:	dds
MFC after:	2 weeks
This commit is contained in:
Pedro F. Giffuni 2013-06-26 04:14:19 +00:00
parent 6f79f29583
commit 1a2a4fc8ce
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=252231

View File

@ -1,4 +1,5 @@
/*-
* Copyright (c) 2013 Johann 'Myrkraverk' Oskarsson.
* Copyright (c) 1992 Diomidis Spinellis.
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
@ -57,6 +58,7 @@ static const char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94";
#include <locale.h>
#include <regex.h>
#include <stddef.h>
#define _WITH_GETLINE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -307,8 +309,9 @@ int
mf_fgets(SPACE *sp, enum e_spflag spflag)
{
struct stat sb;
size_t len;
char *p;
ssize_t len;
static char *p = NULL;
static size_t plen = 0;
int c;
static int firstfile;
@ -424,13 +427,13 @@ mf_fgets(SPACE *sp, enum e_spflag spflag)
* We are here only when infile is open and we still have something
* to read from it.
*
* Use fgetln so that we can handle essentially infinite input data.
* Can't use the pointer into the stdio buffer as the process space
* because the ungetc() can cause it to move.
* Use getline() so that we can handle essentially infinite input
* data. The p and plen are static so each invocation gives
* getline() the same buffer which is expanded as needed.
*/
p = fgetln(infile, &len);
if (ferror(infile))
errx(1, "%s: %s", fname, strerror(errno ? errno : EIO));
len = getline(&p, &plen, infile);
if (len == -1)
err(1, "%s", fname);
if (len != 0 && p[len - 1] == '\n')
len--;
cspace(sp, p, len, spflag);