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:
parent
4d946a274f
commit
3725d501b3
4
README
4
README
@ -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
62
split.1
@ -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
26
split.c
@ -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;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user