Audit split(1)

1) Refactor manpage, add STANDARDS section.
2) Boolean-style-changes.
3) Update usage, reflecting num-idiom also changed in the manpage.
4) Refactor error messages.
5) Also fclose stdin.
6) Empty line before return.
This commit is contained in:
FRIGN 2015-03-17 22:59:48 +01:00
parent 4d946a274f
commit 3725d501b3
3 changed files with 46 additions and 46 deletions

4
README
View File

@ -56,7 +56,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
#*| printf yes none
=*| pwd yes none
= readlink non-posix none
=* renice yes none
=*| renice yes none
=*| rm yes none (-i)
=*| rmdir yes none
# sed
@ -67,7 +67,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=*| sha512sum non-posix none
=*| sleep yes none
sort no -m, -o, -d, -f, -i
=* split yes none
=*| split yes none
=*| sponge non-posix none
#* strings yes none
=* sync non-posix none

62
split.1
View File

@ -1,4 +1,4 @@
.Dd January 30, 2015
.Dd March 17, 2015
.Dt SPLIT 1
.Os sbase
.Sh NAME
@ -6,43 +6,45 @@
.Nd split up a file
.Sh SYNOPSIS
.Nm
.Op Fl a Ar len
.Op Fl b Ar bytes[k|m|g]
.Op Fl a Ar num
.Op Fl b Ar num[k|m|g] | Fl l Ar num
.Op Fl d
.Op Fl l Ar lines
.Op Ar input Op Ar prefix
.Op Ar file Op Ar prefix
.Sh DESCRIPTION
.Nm
reads a file, splitting it into smaller files, every
.Ar bytes
bytes
or
.Ar lines
lines. If
splits
.Ar file
into files with 1000 lines each, named with
.Ar prefix
"x" followed by 2-digit alphabetical count suffixes.
If
.Nm
runs out of filenames before all the data can be written, it stops at the
last valid filename, leaving all the written data on the disk.
The
.Fl b
and
.Fl l
flags are mutually exclusive. Only the last one specified will be obeyed.
runs out of suffixes, it stops after the last valid filename.
.Sh OPTIONS
.Bl -tag -width Ds
.It Fl a Ar len
Set the suffix length to
.Ar len
characters long.
.It Fl b Ar bytes[k|m|g]
.It Fl a Ar num
Set suffix length to
.Ar num
characters.
The default is 2.
.It Fl b Ar num[k|m|g] | Fl l Ar num
Start a new file every
.Ar bytes
bytes. The units k, m, and g are case insensitive, and powers of 2, not 10.
.Ar num
bytes | lines.
The units k, m, and g are case insensitive and powers of 2, not 10.
The default is 1000 lines.
.It Fl d
Use decimal suffixes rather than alphabetical.
.It Fl l Ar lines
Start a new file every
.Ar lines
lines.
Use decimal rather than alphabetical suffixes.
.El
.Sh SEE ALSO
.Xr cat 1
.Sh STANDARDS
The
.Nm
utility is compliant with the
.St -p1003.1-2008
specification.
.Pp
The
.Op Fl d
flag and g unit are an extension to that specification.

26
split.c
View File

@ -17,9 +17,8 @@ itostr(char *str, int x, int n)
str[n] = start + (x % base);
x /= base;
}
if (x)
return -1;
return 0;
return x ? -1 : 0;
}
static FILE *
@ -34,27 +33,25 @@ nextfile(FILE *f, char *buf, int plen, int slen)
if (!(f = fopen(buf, "w")))
eprintf("'%s':", buf);
return f;
}
static void
usage(void)
{
eprintf("usage: %s [-a len] [-b bytes[k|m|g]] [-d] [-l lines] "
"[input [prefix]]\n", argv0);
eprintf("usage: %s [-a num] [-b num[k|m|g] | -l num] [-d] "
"[file [prefix]]\n", argv0);
}
int
main(int argc, char *argv[])
{
FILE *in = stdin, *out = NULL;
char name[NAME_MAX + 1];
char *prefix = "x";
char *file = NULL;
char *tmp, *end;
size_t size = 1000, scale = 1, n;
int ch, plen, slen = 2, always = 0;
long l;
int ch, plen, slen = 2, always = 0;
char name[NAME_MAX + 1], *prefix = "x", *file = NULL, *tmp, *end;
ARGBEGIN {
case 'a':
@ -111,9 +108,9 @@ main(int argc, char *argv[])
eprintf("names cannot exceed %d bytes\n", NAME_MAX);
estrlcpy(name, prefix, sizeof(name));
if (file && strcmp(file, "-") != 0) {
if (file && strcmp(file, "-")) {
if (!(in = fopen(file, "r")))
eprintf("'%s':", file);
eprintf("fopen %s:", file);
}
n = 0;
@ -126,9 +123,10 @@ main(int argc, char *argv[])
n += (always || ch == '\n');
putc(ch, out);
}
if (in != stdin)
fclose(in);
fclose(in);
if (out)
fclose(out);
return 0;
}