/* vi: set sw=4 ts=4: */
/*
* split - split a file into pieces
- * Copyright (c) 2007 Bernhard Fischer
+ * Copyright (c) 2007 Bernhard Reutner-Fischer
*
- * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
+ * Licensed under GPLv2 or later, see file LICENSE in this source tree.
*/
+//config:config SPLIT
+//config: bool "split (5.4 kb)"
+//config: default y
+//config: help
+//config: Split a file into pieces.
+//config:
+//config:config FEATURE_SPLIT_FANCY
+//config: bool "Fancy extensions"
+//config: default y
+//config: depends on SPLIT
+//config: help
+//config: Add support for features not required by SUSv3.
+//config: Supports additional suffixes 'b' for 512 bytes,
+//config: 'g' for 1GiB for the -b option.
+
+//applet:IF_SPLIT(APPLET(split, BB_DIR_USR_BIN, BB_SUID_DROP))
+
+//kbuild:lib-$(CONFIG_SPLIT) += split.o
+
/* BB_AUDIT: SUSv3 compliant
* SUSv3 requirements:
* http://www.opengroup.org/onlinepubs/009695399/utilities/split.html
*/
+
+//usage:#define split_trivial_usage
+//usage: "[OPTIONS] [INPUT [PREFIX]]"
+//usage:#define split_full_usage "\n\n"
+//usage: " -b N[k|m] Split by N (kilo|mega)bytes"
+//usage: "\n -l N Split by N lines"
+//usage: "\n -a N Use N letters as suffix"
+//usage:
+//usage:#define split_example_usage
+//usage: "$ split TODO foo\n"
+//usage: "$ cat TODO | split -a 2 -l 2 TODO_\n"
+
#include "libbb.h"
+#include "common_bufsiz.h"
-static const struct suffix_mult split_suffices[] = {
#if ENABLE_FEATURE_SPLIT_FANCY
+static const struct suffix_mult split_suffixes[] = {
{ "b", 512 },
-#endif
{ "k", 1024 },
{ "m", 1024*1024 },
-#if ENABLE_FEATURE_SPLIT_FANCY
{ "g", 1024*1024*1024 },
-#endif
- { NULL, 0 }
+ { "", 0 }
};
+#endif
/* Increment the suffix part of the filename.
* Returns NULL if we are out of filenames.
unsigned i = 1;
char *curr;
- do {
+ while (1) {
curr = old + end - i;
if (*curr < 'z') {
*curr += 1;
return NULL;
}
*curr = 'a';
- } while (1);
+ }
return old;
}
#define read_buffer bb_common_bufsiz1
-enum { READ_BUFFER_SIZE = sizeof(bb_common_bufsiz1) - 1 };
+enum { READ_BUFFER_SIZE = COMMON_BUFSIZE - 1 };
#define SPLIT_OPT_l (1<<0)
#define SPLIT_OPT_b (1<<1)
#define SPLIT_OPT_a (1<<2)
-int split_main(int argc, char **argv);
-int split_main(int argc, char **argv)
+int split_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int split_main(int argc UNUSED_PARAM, char **argv)
{
unsigned suffix_len = 2;
char *pfx;
ssize_t bytes_read, to_write;
char *src;
- opt_complementary = "?2";
- opt = getopt32(argc, argv, "l:b:a:", &count_p, &count_p, &sfx);
+ setup_common_bufsiz();
+
+ opt = getopt32(argv, "^"
+ "l:b:a:+" /* -a N */
+ "\0" "?2"/*max 2 args*/,
+ &count_p, &count_p, &suffix_len
+ );
if (opt & SPLIT_OPT_l)
- cnt = xatoul(count_p);
- if (opt & SPLIT_OPT_b)
- cnt = xatoul_sfx(count_p, split_suffices);
- if (opt & SPLIT_OPT_a)
- suffix_len = xatou(sfx);
+ cnt = XATOOFF(count_p);
+ if (opt & SPLIT_OPT_b) // FIXME: also needs XATOOFF
+ cnt = xatoull_sfx(count_p,
+ IF_FEATURE_SPLIT_FANCY(split_suffixes)
+ IF_NOT_FEATURE_SPLIT_FANCY(km_suffixes)
+ );
sfx = "x";
argv += optind;
if (argv[0]) {
+ int fd;
if (argv[1])
sfx = argv[1];
- xmove_fd(xopen(argv[0], O_RDONLY), 0);
+ fd = xopen_stdin(argv[0]);
+ xmove_fd(fd, STDIN_FILENO);
} else {
argv[0] = (char *) bb_msg_standard_input;
}
}
while (1) {
- bytes_read = safe_read(0, read_buffer, READ_BUFFER_SIZE);
+ bytes_read = safe_read(STDIN_FILENO, read_buffer, READ_BUFFER_SIZE);
if (!bytes_read)
break;
if (bytes_read < 0)
- bb_perror_msg_and_die("%s", argv[0]);
+ bb_simple_perror_msg_and_die(argv[0]);
src = read_buffer;
do {
if (!remaining) {
}
}
- xwrite(1, src, to_write);
+ xwrite(STDOUT_FILENO, src, to_write);
bytes_read -= to_write;
src += to_write;
} while (bytes_read);
}
- return 0;
+ return EXIT_SUCCESS;
}