Changeset View
Changeset View
Standalone View
Standalone View
usr.bin/split/split.c
Show First 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
#define DEFLINE 1000 /* Default num lines per file. */ | #define DEFLINE 1000 /* Default num lines per file. */ | ||||
static off_t bytecnt; /* Byte count to split on. */ | static off_t bytecnt; /* Byte count to split on. */ | ||||
static off_t chunks = 0; /* Chunks count to split into. */ | static off_t chunks = 0; /* Chunks count to split into. */ | ||||
static long numlines; /* Line count to split on. */ | static long numlines; /* Line count to split on. */ | ||||
static int file_open; /* If a file open. */ | static int file_open; /* If a file open. */ | ||||
static int ifd = -1, ofd = -1; /* Input/output file descriptors. */ | static int ifd = -1, ofd = -1; /* Input/output file descriptors. */ | ||||
static char bfr[MAXBSIZE]; /* I/O buffer. */ | |||||
static char fname[MAXPATHLEN]; /* File name prefix. */ | static char fname[MAXPATHLEN]; /* File name prefix. */ | ||||
static regex_t rgx; | static regex_t rgx; | ||||
static int pflag; | static int pflag; | ||||
static bool dflag; | static bool dflag; | ||||
static long sufflen = 2; /* File name suffix length. */ | static long sufflen = 2; /* File name suffix length. */ | ||||
static void newfile(void); | static void newfile(void); | ||||
static void split1(void); | static void split1(void); | ||||
▲ Show 20 Lines • Show All 116 Lines • ▼ Show 20 Lines | |||||
/* | /* | ||||
* split1 -- | * split1 -- | ||||
* Split the input by bytes. | * Split the input by bytes. | ||||
*/ | */ | ||||
static void | static void | ||||
split1(void) | split1(void) | ||||
{ | { | ||||
static char bfr[MAXBSIZE]; | |||||
off_t bcnt; | off_t bcnt; | ||||
char *C; | char *C; | ||||
ssize_t dist, len; | ssize_t dist, len; | ||||
int nfiles; | int nfiles; | ||||
nfiles = 0; | nfiles = 0; | ||||
for (bcnt = 0;;) | for (bcnt = 0;;) | ||||
switch ((len = read(ifd, bfr, MAXBSIZE))) { | switch ((len = read(ifd, bfr, sizeof(bfr)))) { | ||||
case 0: | case 0: | ||||
exit(0); | exit(0); | ||||
case -1: | case -1: | ||||
err(EX_IOERR, "read"); | err(EX_IOERR, "read"); | ||||
/* NOTREACHED */ | /* NOTREACHED */ | ||||
default: | default: | ||||
if (!file_open) { | if (!file_open) { | ||||
if (!chunks || (nfiles < chunks)) { | if (!chunks || (nfiles < chunks)) { | ||||
Show All 36 Lines | |||||
/* | /* | ||||
* split2 -- | * split2 -- | ||||
* Split the input by lines. | * Split the input by lines. | ||||
*/ | */ | ||||
static void | static void | ||||
split2(void) | split2(void) | ||||
{ | { | ||||
char *buf; | |||||
size_t bufsize; | |||||
ssize_t len; | |||||
long lcnt = 0; | long lcnt = 0; | ||||
FILE *infp; | FILE *infp; | ||||
buf = NULL; | |||||
bufsize = 0; | |||||
/* Stick a stream on top of input file descriptor */ | /* Stick a stream on top of input file descriptor */ | ||||
if ((infp = fdopen(ifd, "r")) == NULL) | if ((infp = fdopen(ifd, "r")) == NULL) | ||||
err(EX_NOINPUT, "fdopen"); | err(EX_NOINPUT, "fdopen"); | ||||
/* Process input one line at a time */ | /* Process input one line at a time */ | ||||
while (fgets(bfr, sizeof(bfr), infp) != NULL) { | while ((len = getline(&buf, &bufsize, infp)) > 0) { | ||||
bapt: why not use getline(3) here? | |||||
const int len = strlen(bfr); | |||||
/* If line is too long to deal with, just write it out */ | |||||
if (bfr[len - 1] != '\n') | |||||
goto writeit; | |||||
/* Check if we need to start a new file */ | /* Check if we need to start a new file */ | ||||
if (pflag) { | if (pflag) { | ||||
regmatch_t pmatch; | regmatch_t pmatch; | ||||
pmatch.rm_so = 0; | pmatch.rm_so = 0; | ||||
pmatch.rm_eo = len - 1; | pmatch.rm_eo = len - 1; | ||||
if (regexec(&rgx, bfr, 0, &pmatch, REG_STARTEND) == 0) | if (regexec(&rgx, buf, 0, &pmatch, REG_STARTEND) == 0) | ||||
newfile(); | newfile(); | ||||
} else if (lcnt++ == numlines) { | } else if (lcnt++ == numlines) { | ||||
newfile(); | newfile(); | ||||
lcnt = 1; | lcnt = 1; | ||||
} | } | ||||
writeit: | |||||
/* Open output file if needed */ | /* Open output file if needed */ | ||||
if (!file_open) | if (!file_open) | ||||
newfile(); | newfile(); | ||||
/* Write out line */ | /* Write out line */ | ||||
if (write(ofd, bfr, len) != len) | if (write(ofd, buf, len) != len) | ||||
err(EX_IOERR, "write"); | err(EX_IOERR, "write"); | ||||
} | } | ||||
/* EOF or error? */ | /* EOF or error? */ | ||||
if (ferror(infp)) | if ((len == -1 && errno != 0) || ferror(infp)) | ||||
err(EX_IOERR, "read"); | err(EX_IOERR, "read"); | ||||
else | else | ||||
exit(0); | exit(0); | ||||
} | } | ||||
/* | /* | ||||
* split3 -- | * split3 -- | ||||
* Split the input into specified number of chunks | * Split the input into specified number of chunks | ||||
▲ Show 20 Lines • Show All 90 Lines • Show Last 20 Lines |
why not use getline(3) here?