Date: Wed, 27 Mar 2002 06:10:03 -0800 (PST) From: Stefan Farfeleder <e0026813@stud3.tuwien.ac.at> To: freebsd-standards@FreeBSD.org Subject: Re: standards/36191: P1003.1-2001 csplit utility Message-ID: <200203271410.g2REA3l38144@freefall.freebsd.org>
index | next in thread | raw e-mail
The following reply was made to PR standards/36191; it has been noted by GNATS.
From: Stefan Farfeleder <e0026813@stud3.tuwien.ac.at>
To: "Tim J. Robbins" <tim@robbins.dropbear.id.au>
Cc: freebsd-gnats-submit@FreeBSD.ORG
Subject: Re: standards/36191: P1003.1-2001 csplit utility
Date: Wed, 27 Mar 2002 15:07:51 +0100
This patch fixes/changes these things (based on rev 1.21):
* Posix says: ``An error shall be reported if an operand does not
reference a line between the current position and the end of the
file.''
csplit now reports "out of range" if EOF is found before the line it
is looking for.
* The computation of 10 ** sufflen does not used signed overflow.
* There's a single call to ftell, all others are ftello. I think this
was a typo.
Issues to be resolved:
* Posix requires removal of output files on SIGHUP, SIGINT and SIGTERM.
A simple handler calling cleanup() would do this. [Is there any danger
in calling snprintf() from a signal handler?]
* I think a matching re on the very first line must create an empty file
xx00.
Stefan
---snip---
--- csplit.c.orig Wed Mar 27 13:53:45 2002
+++ csplit.c Wed Mar 27 14:41:07 2002
@@ -250,6 +250,9 @@
first = 0;
}
+ if (p == NULL)
+ errx(1, "%s: out of range", expr);
+
if (ofs <= 0) {
/*
* Negative (or zero) offset: throw back any lines we should
@@ -298,9 +301,12 @@
while (nfiles < maxfiles - 1) {
ofp = newfile();
- while (lineno + 1 != lastline)
- if ((p = getline()) == NULL || fputs(p, ofp) != 0)
+ while (lineno + 1 != lastline) {
+ if ((p = getline()) == NULL)
+ errx(1, "%ld: out of range", lastline);
+ if (fputs(p, ofp) != 0)
break;
+ }
if (!sflag)
printf("%lld\n", (long long)ftello(ofp));
if (fclose(ofp) != 0)
@@ -318,7 +324,7 @@
char *ep, *p;
FILE *ofp;
int ch;
- long i, n;
+ long i;
kflag = sflag = 0;
prefix = "xx";
@@ -371,11 +377,10 @@
overfile = NULL;
for (maxfiles = 1, i = 0; i < sufflen; i++) {
- n = maxfiles;
- maxfiles *= 10;
- if (maxfiles / 10 != n)
+ if (maxfiles > LONG_MAX / 10)
errx(1, "%ld: suffix too long (limit %ld)",
sufflen, i);
+ maxfiles *= 10;
}
while (nfiles < maxfiles - 1 && (expr = *argv++) != NULL) {
@@ -406,7 +411,7 @@
while ((p = getline()) != NULL && fputs(p, ofp) == 0)
;
if (!sflag)
- printf("%lld\n", (long long)ftell(ofp));
+ printf("%lld\n", (long long)ftello(ofp));
if (fclose(ofp) != 0)
err(1, "%s", currfile);
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200203271410.g2REA3l38144>
