Implement 'split -d' which allows a numeric suffix instead of an
alphabetic one. PR: bin/116209 Submitted by: Marcin Gryszkalis <mg@fork.pl> (adapted from) Reviewed by: will MFC after: 1 week
This commit is contained in:
parent
a274be7720
commit
7f418e3407
@ -36,10 +36,12 @@
|
||||
.Nd split a file into pieces
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Fl d
|
||||
.Op Fl l Ar line_count
|
||||
.Op Fl a Ar suffix_length
|
||||
.Op Ar file Op Ar prefix
|
||||
.Nm
|
||||
.Fl d
|
||||
.Fl b Ar byte_count Ns
|
||||
.Oo
|
||||
.Sm off
|
||||
@ -49,10 +51,12 @@
|
||||
.Op Fl a Ar suffix_length
|
||||
.Op Ar file Op Ar prefix
|
||||
.Nm
|
||||
.Fl d
|
||||
.Fl n Ar chunk_count
|
||||
.Op Fl a Ar suffix_length
|
||||
.Op Ar file Op Ar prefix
|
||||
.Nm
|
||||
.Fl d
|
||||
.Fl p Ar pattern
|
||||
.Op Fl a Ar suffix_length
|
||||
.Op Ar file Op Ar prefix
|
||||
@ -108,6 +112,8 @@ or
|
||||
is appended to the number, the file is split into
|
||||
.Ar byte_count
|
||||
gigabyte pieces.
|
||||
.It Fl d
|
||||
Use a numeric suffix instead of a alphabetic suffix.
|
||||
.It Fl l Ar line_count
|
||||
Create split files
|
||||
.Ar line_count
|
||||
|
@ -51,6 +51,7 @@ static const char sccsid[] = "@(#)split.c 8.2 (Berkeley) 4/16/94";
|
||||
#include <inttypes.h>
|
||||
#include <limits.h>
|
||||
#include <locale.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -70,6 +71,7 @@ static char bfr[MAXBSIZE]; /* I/O buffer. */
|
||||
static char fname[MAXPATHLEN]; /* File name prefix. */
|
||||
static regex_t rgx;
|
||||
static int pflag;
|
||||
static bool dflag;
|
||||
static long sufflen = 2; /* File name suffix length. */
|
||||
|
||||
static void newfile(void);
|
||||
@ -88,7 +90,8 @@ main(int argc, char **argv)
|
||||
|
||||
setlocale(LC_ALL, "");
|
||||
|
||||
while ((ch = getopt(argc, argv, "0123456789a:b:l:n:p:")) != -1)
|
||||
dflag = false;
|
||||
while ((ch = getopt(argc, argv, "0123456789a:b:dl:n:p:")) != -1)
|
||||
switch (ch) {
|
||||
case '0': case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7': case '8': case '9':
|
||||
@ -131,6 +134,9 @@ main(int argc, char **argv)
|
||||
errx(EX_USAGE, "%s: offset too large", optarg);
|
||||
bytecnt = (off_t)(bytecnti * scale);
|
||||
break;
|
||||
case 'd': /* Decimal suffix */
|
||||
dflag = true;
|
||||
break;
|
||||
case 'l': /* Line count. */
|
||||
if (numlines != 0)
|
||||
usage();
|
||||
@ -348,6 +354,8 @@ newfile(void)
|
||||
long i, maxfiles, tfnum;
|
||||
static long fnum;
|
||||
static char *fpnt;
|
||||
char beg, end;
|
||||
int pattlen;
|
||||
|
||||
if (ofd == -1) {
|
||||
if (fname[0] == '\0') {
|
||||
@ -359,9 +367,19 @@ newfile(void)
|
||||
ofd = fileno(stdout);
|
||||
}
|
||||
|
||||
/* maxfiles = 26^sufflen, but don't use libm. */
|
||||
if (dflag) {
|
||||
beg = '0';
|
||||
end = '9';
|
||||
}
|
||||
else {
|
||||
beg = 'a';
|
||||
end = 'z';
|
||||
}
|
||||
pattlen = end - beg + 1;
|
||||
|
||||
/* maxfiles = pattlen^sufflen, but don't use libm. */
|
||||
for (maxfiles = 1, i = 0; i < sufflen; i++)
|
||||
if ((maxfiles *= 26) <= 0)
|
||||
if ((maxfiles *= pattlen) <= 0)
|
||||
errx(EX_USAGE, "suffix is too long (max %ld)", i);
|
||||
|
||||
if (fnum == maxfiles)
|
||||
@ -371,8 +389,8 @@ newfile(void)
|
||||
tfnum = fnum;
|
||||
i = sufflen - 1;
|
||||
do {
|
||||
fpnt[i] = tfnum % 26 + 'a';
|
||||
tfnum /= 26;
|
||||
fpnt[i] = tfnum % pattlen + beg;
|
||||
tfnum /= pattlen;
|
||||
} while (i-- > 0);
|
||||
fpnt[sufflen] = '\0';
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user