version 1.12, 2006/08/09 22:42:08 |
version 1.13, 2006/08/10 22:44:17 |
|
|
#include <ctype.h> |
#include <ctype.h> |
#include <err.h> |
#include <err.h> |
#include <fcntl.h> |
#include <fcntl.h> |
|
#include <limits.h> |
#include <stdio.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <stdlib.h> |
#include <string.h> |
#include <string.h> |
|
|
|
|
#define DEFLINE 1000 /* Default num lines per file. */ |
#define DEFLINE 1000 /* Default num lines per file. */ |
|
|
long bytecnt; /* Byte count to split on. */ |
ssize_t bytecnt; /* Byte count to split on. */ |
long numlines; /* Line count to split on. */ |
long numlines; /* Line count to split on. */ |
int file_open; /* If a file open. */ |
int file_open; /* If a file open. */ |
int ifd = -1, ofd = -1; /* Input/output file descriptors. */ |
int ifd = -1, ofd = -1; /* Input/output file descriptors. */ |
|
|
void newfile(void); |
void newfile(void); |
void split1(void); |
void split1(void); |
void split2(void); |
void split2(void); |
void usage(void); |
__dead void usage(void); |
|
|
int |
int |
main(int argc, char *argv[]) |
main(int argc, char *argv[]) |
{ |
{ |
int ch; |
int ch, scale; |
char *ep, *p; |
char *ep, *p; |
const char *errstr; |
const char *errstr; |
|
|
|
|
errx(EX_USAGE, |
errx(EX_USAGE, |
"%s: illegal byte count", optarg); |
"%s: illegal byte count", optarg); |
if (*ep == 'k') |
if (*ep == 'k') |
bytecnt *= 1024; |
scale = 1024; |
else if (*ep == 'm') |
else if (*ep == 'm') |
bytecnt *= 1048576; |
scale = 1048576; |
|
else |
|
scale = 1; |
|
if (bytecnt > SSIZE_MAX / scale) |
|
errx(EX_USAGE, "%s: byte count too large", |
|
optarg); |
|
bytecnt *= scale; |
break; |
break; |
case 'p' : /* pattern matching. */ |
case 'p' : /* pattern matching. */ |
if (regcomp(&rgx, optarg, REG_EXTENDED|REG_NOSUB) != 0) |
if (regcomp(&rgx, optarg, REG_EXTENDED|REG_NOSUB) != 0) |
|
|
void |
void |
split1(void) |
split1(void) |
{ |
{ |
long bcnt; |
ssize_t bcnt, dist, len; |
int dist, len; |
|
char *C; |
char *C; |
|
|
for (bcnt = 0;;) |
for (bcnt = 0;;) |
|
|
for (C = bfr + dist; len >= bytecnt; |
for (C = bfr + dist; len >= bytecnt; |
len -= bytecnt, C += bytecnt) { |
len -= bytecnt, C += bytecnt) { |
newfile(); |
newfile(); |
if (write(ofd, |
if (write(ofd, C, bytecnt) != bytecnt) |
C, (int)bytecnt) != bytecnt) |
|
err(EX_IOERR, "write"); |
err(EX_IOERR, "write"); |
} |
} |
if (len != 0) { |
if (len != 0) { |
|
|
file_open = 1; |
file_open = 1; |
} |
} |
|
|
void |
__dead void |
usage(void) |
usage(void) |
{ |
{ |
extern char *__progname; |
extern char *__progname; |