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 #*| printf yes none
=*| pwd yes none =*| pwd yes none
= readlink non-posix none = readlink non-posix none
=* renice yes none =*| renice yes none
=*| rm yes none (-i) =*| rm yes none (-i)
=*| rmdir yes none =*| rmdir yes none
# sed # sed
@ -67,7 +67,7 @@ The following tools are implemented ('*' == finished, '#' == UTF-8 support,
=*| sha512sum non-posix none =*| sha512sum non-posix none
=*| sleep yes none =*| sleep yes none
sort no -m, -o, -d, -f, -i sort no -m, -o, -d, -f, -i
=* split yes none =*| split yes none
=*| sponge non-posix none =*| sponge non-posix none
#* strings yes none #* strings yes none
=* sync non-posix 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 .Dt SPLIT 1
.Os sbase .Os sbase
.Sh NAME .Sh NAME
@ -6,43 +6,45 @@
.Nd split up a file .Nd split up a file
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl a Ar len .Op Fl a Ar num
.Op Fl b Ar bytes[k|m|g] .Op Fl b Ar num[k|m|g] | Fl l Ar num
.Op Fl d .Op Fl d
.Op Fl l Ar lines .Op Ar file Op Ar prefix
.Op Ar input Op Ar prefix
.Sh DESCRIPTION .Sh DESCRIPTION
.Nm .Nm
reads a file, splitting it into smaller files, every splits
.Ar bytes .Ar file
bytes into files with 1000 lines each, named with
or .Ar prefix
.Ar lines "x" followed by 2-digit alphabetical count suffixes.
lines. If If
.Nm .Nm
runs out of filenames before all the data can be written, it stops at the runs out of suffixes, it stops after the last valid filename.
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.
.Sh OPTIONS .Sh OPTIONS
.Bl -tag -width Ds .Bl -tag -width Ds
.It Fl a Ar len .It Fl a Ar num
Set the suffix length to Set suffix length to
.Ar len .Ar num
characters long. characters.
.It Fl b Ar bytes[k|m|g] The default is 2.
.It Fl b Ar num[k|m|g] | Fl l Ar num
Start a new file every Start a new file every
.Ar bytes .Ar num
bytes. The units k, m, and g are case insensitive, and powers of 2, not 10. 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 .It Fl d
Use decimal suffixes rather than alphabetical. Use decimal rather than alphabetical suffixes.
.It Fl l Ar lines
Start a new file every
.Ar lines
lines.
.El .El
.Sh SEE ALSO .Sh SEE ALSO
.Xr cat 1 .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); str[n] = start + (x % base);
x /= base; x /= base;
} }
if (x)
return -1; return x ? -1 : 0;
return 0;
} }
static FILE * static FILE *
@ -34,27 +33,25 @@ nextfile(FILE *f, char *buf, int plen, int slen)
if (!(f = fopen(buf, "w"))) if (!(f = fopen(buf, "w")))
eprintf("'%s':", buf); eprintf("'%s':", buf);
return f; return f;
} }
static void static void
usage(void) usage(void)
{ {
eprintf("usage: %s [-a len] [-b bytes[k|m|g]] [-d] [-l lines] " eprintf("usage: %s [-a num] [-b num[k|m|g] | -l num] [-d] "
"[input [prefix]]\n", argv0); "[file [prefix]]\n", argv0);
} }
int int
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
FILE *in = stdin, *out = NULL; 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; size_t size = 1000, scale = 1, n;
int ch, plen, slen = 2, always = 0;
long l; long l;
int ch, plen, slen = 2, always = 0;
char name[NAME_MAX + 1], *prefix = "x", *file = NULL, *tmp, *end;
ARGBEGIN { ARGBEGIN {
case 'a': case 'a':
@ -111,9 +108,9 @@ main(int argc, char *argv[])
eprintf("names cannot exceed %d bytes\n", NAME_MAX); eprintf("names cannot exceed %d bytes\n", NAME_MAX);
estrlcpy(name, prefix, sizeof(name)); estrlcpy(name, prefix, sizeof(name));
if (file && strcmp(file, "-") != 0) { if (file && strcmp(file, "-")) {
if (!(in = fopen(file, "r"))) if (!(in = fopen(file, "r")))
eprintf("'%s':", file); eprintf("fopen %s:", file);
} }
n = 0; n = 0;
@ -126,9 +123,10 @@ main(int argc, char *argv[])
n += (always || ch == '\n'); n += (always || ch == '\n');
putc(ch, out); putc(ch, out);
} }
if (in != stdin)
fclose(in); fclose(in);
if (out) if (out)
fclose(out); fclose(out);
return 0; return 0;
} }