* Copyright (c) 1987, 1993, 1994
* The Regents of the University of California. All rights reserved.
* 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
static char copyright
[] =
"@(#) Copyright (c) 1987, 1993, 1994\n\
The Regents of the University of California. All rights reserved.\n";
static char sccsid
[] = "@(#)split.c 8.2 (Berkeley) 4/16/94";
#define DEFLINE 1000 /* Default num lines per file. */
long bytecnt
; /* Byte count to split on. */
long numlines
; /* Line count to split on. */
int file_open
; /* If a file open. */
int ifd
= -1, ofd
= -1; /* Input/output file descriptors. */
char bfr
[MAXBSIZE
]; /* I/O buffer. */
char fname
[MAXPATHLEN
]; /* File name prefix. */
void newfile
__P((void));
while ((ch
= getopt(argc
, argv
, "-0123456789b:l:")) != EOF
)
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
* Undocumented kludge: split was originally designed
* to take a number after a dash.
if (p
[0] == '-' && p
[1] == ch
&& !p
[2])
numlines
= strtol(++p
, &ep
, 10);
strtol(argv
[optind
] + 1, &ep
, 10);
if (numlines
<= 0 || *ep
)
"%s: illegal line count.", optarg
);
case '-': /* Undocumented: historic stdin flag. */
case 'b': /* Byte count. */
if ((bytecnt
= strtol(optarg
, &ep
, 10)) <= 0 ||
*ep
!= '\0' && *ep
!= 'k' && *ep
!= 'm')
errx(1, "%s: illegal byte count.", optarg
);
case 'l': /* Line count. */
if ((numlines
= strtol(optarg
, &ep
, 10)) <= 0 || *p
)
errx(1, "%s: illegal line count.", optarg
);
if (ifd
== -1) { /* Input file. */
if ((ifd
= open(*argv
, O_RDONLY
, 0)) < 0)
if (*argv
!= NULL
) /* File name prefix. */
(void)strcpy(fname
, *argv
++);
if (ifd
== -1) /* Stdin by default. */
* Split the input by bytes.
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
) {
C
, (int)bytecnt
) != bytecnt
)
if (write(ofd
, C
, len
) != len
)
if (write(ofd
, bfr
, len
) != len
)
* Split the input by lines.
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
)
* Open a new output file.
fpnt
= fname
+ strlen(fname
);
* Hack to increase max files; original code wandered through
* magic characters. Maximum files is 3 * 26 * 26 == 2028
if (!defname
|| fname
[0] == 'z')
errx(1, "too many files.");
fpnt
[0] = fnum
/ 26 + 'a';
fpnt
[1] = fnum
% 26 + 'a';
if (!freopen(fname
, "w", stdout
))
"usage: split [-b byte_count] [-l line_count] [file [prefix]]\n");