=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/sed/main.c,v retrieving revision 1.14 retrieving revision 1.15 diff -c -r1.14 -r1.15 *** src/usr.bin/sed/main.c 2008/10/09 10:58:32 1.14 --- src/usr.bin/sed/main.c 2008/10/16 16:34:32 1.15 *************** *** 1,4 **** ! /* $OpenBSD: main.c,v 1.14 2008/10/09 10:58:32 millert Exp $ */ /*- * Copyright (c) 1992 Diomidis Spinellis. --- 1,4 ---- ! /* $OpenBSD: main.c,v 1.15 2008/10/16 16:34:32 millert Exp $ */ /*- * Copyright (c) 1992 Diomidis Spinellis. *************** *** 38,44 **** "@(#) Copyright (c) 1992, 1993\n\ The Regents of the University of California. All rights reserved.\n"; /* from: static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94"; */ ! static const char rcsid[] = "$OpenBSD: main.c,v 1.14 2008/10/09 10:58:32 millert Exp $"; #endif /* not lint */ #include --- 38,44 ---- "@(#) Copyright (c) 1992, 1993\n\ The Regents of the University of California. All rights reserved.\n"; /* from: static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 1/3/94"; */ ! static const char rcsid[] = "$OpenBSD: main.c,v 1.15 2008/10/16 16:34:32 millert Exp $"; #endif /* not lint */ #include *************** *** 46,51 **** --- 46,52 ---- #include #include #include + #include #include #include #include *************** *** 159,165 **** * together. Empty strings and files are ignored. */ char * ! cu_fgets(char **outbuf, size_t *outlen) { static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF; static FILE *f; /* Current open file */ --- 160,166 ---- * together. Empty strings and files are ignored. */ char * ! cu_fgets(char **outbuf, size_t *outsize) { static enum {ST_EOF, ST_FILE, ST_STRING} state = ST_EOF; static FILE *f; /* Current open file */ *************** *** 168,173 **** --- 169,177 ---- size_t len; char *p; + if (*outbuf == NULL) + *outsize = 0; + again: switch (state) { case ST_EOF: *************** *** 196,207 **** case ST_FILE: if ((p = fgetln(f, &len)) != NULL) { linenum++; ! if (len >= *outlen) { ! do { ! *outlen *= 2; ! } while (len >= *outlen); free(*outbuf); ! *outbuf = xmalloc(*outlen); } memcpy(*outbuf, p, len); (*outbuf)[len] = '\0'; --- 200,209 ---- case ST_FILE: if ((p = fgetln(f, &len)) != NULL) { linenum++; ! if (len >= *outsize) { free(*outbuf); ! *outsize = ROUNDLEN(len + 1); ! *outbuf = xmalloc(*outsize); } memcpy(*outbuf, p, len); (*outbuf)[len] = '\0'; *************** *** 217,229 **** if (linenum == 0 && s[0] == '#' && s[1] == 'n') nflag = 1; p = *outbuf; ! len = *outlen; for (;;) { ! if (len-- <= 1) { ! *outbuf = xrealloc(*outbuf, *outlen * 2); ! p = *outbuf + *outlen - len - 1; ! len += *outlen; ! *outlen *= 2; } switch (*s) { case '\0': --- 219,232 ---- if (linenum == 0 && s[0] == '#' && s[1] == 'n') nflag = 1; p = *outbuf; ! len = *outsize; for (;;) { ! if (len <= 1) { ! *outbuf = xrealloc(*outbuf, ! *outsize + _POSIX2_LINE_MAX); ! p = *outbuf + *outsize - len; ! len += _POSIX2_LINE_MAX; ! *outsize += _POSIX2_LINE_MAX; } switch (*s) { case '\0': *************** *** 245,250 **** --- 248,254 ---- return (*outbuf); default: *p++ = *s++; + len--; } } }