* Copyright (c) 1987 Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1987 Regents of the University of California.\n\
static char sccsid
[] = "@(#)split.c 4.8 (Berkeley) 6/1/90";
#define DEFLINE 1000 /* default num lines per file */
#define ERR -1 /* general error */
#define NO 0 /* no/false */
#define OK 0 /* okay exit */
#define YES 1 /* yes/true */
static long bytecnt
, /* byte count to split on */
numlines
; /* lines in each file */
static int ifd
= ERR
, /* input file descriptor */
ofd
= ERR
; /* output file descriptor */
static short file_open
; /* if a file open */
static char bfr
[MAXBSIZE
], /* I/O buffer */
fname
[MAXPATHLEN
]; /* file name */
for (cnt
= 1; cnt
< argc
; ++cnt
) {
case 0: /* stdin by request */
case 'b': /* byte count split */
bytecnt
= atol(argv
[++cnt
]);
bytecnt
= atol(argv
[cnt
] + 2);
fputs("split: byte count must be greater than zero.\n", stderr
);
if (!isdigit(argv
[cnt
][1]) || bytecnt
)
if ((numlines
= atol(argv
[cnt
] + 1)) <= 0) {
fputs("split: line count must be greater than zero.\n", stderr
);
else if (ifd
== ERR
) { /* input file */
if ((ifd
= open(argv
[cnt
], O_RDONLY
, 0)) < 0) {
else if (!*fname
) /* output file prefix */
strcpy(fname
, argv
[cnt
]);
if (ifd
== ERR
) /* stdin by default */
switch(len
= read(ifd
, bfr
, MAXBSIZE
)) {
if (bcnt
+ len
>= bytecnt
) {
if (write(ofd
, bfr
, dist
) != dist
)
for (C
= bfr
+ dist
; len
>= bytecnt
; len
-= bytecnt
, C
+= bytecnt
) {
if (write(ofd
, C
, (int)bytecnt
) != bytecnt
)
if (write(ofd
, C
, len
) != len
)
if (write(ofd
, bfr
, len
) != len
)
switch(len
= read(ifd
, bfr
, MAXBSIZE
)) {
for (Cs
= Ce
= bfr
; len
--; Ce
++)
if (*Ce
== '\n' && ++lcnt
== numlines
) {
if (write(ofd
, Cs
, bcnt
) != bcnt
)
if (write(ofd
, Cs
, bcnt
) != bcnt
)
fpnt
= fname
+ strlen(fname
);
* hack to increase max files; original code just wandered through
* magic characters. Maximum files is 3 * 26 * 26 == 2028
if (!defname
|| fname
[0] == 'z') {
fputs("split: too many files.\n", stderr
);
fpnt
[0] = fnum
/ 26 + 'a';
fpnt
[1] = fnum
% 26 + 'a';
if (!freopen(fname
, "w", stdout
)) {
fprintf(stderr
, "split: unable to write to %s.\n", fname
);
* print usage message and die
fputs("usage: split [-] [-#] [-b byte_count] [file [prefix]]\n", stderr
);