X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=coreutils%2Fsplit.c;h=1e1673efbe2c4b9fa51611e13c25752488ad90c4;hb=d1ed3e68b8080161642cc106099c0a17ac7892e6;hp=895a04b06232724d2f59faa4b951a2b287fea892;hpb=7c2db5c1988da00c101cc2aeb8767f18a1fe9eb9;p=oweals%2Fbusybox.git diff --git a/coreutils/split.c b/coreutils/split.c index 895a04b06..1e1673efb 100644 --- a/coreutils/split.c +++ b/coreutils/split.c @@ -1,27 +1,37 @@ /* 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. */ /* 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" -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 - { } + { "", 0 } }; +#endif /* Increment the suffix part of the filename. * Returns NULL if we are out of filenames. @@ -32,7 +42,7 @@ static char *next_file(char *old, unsigned suffix_len) unsigned i = 1; char *curr; - do { + while (1) { curr = old + end - i; if (*curr < 'z') { *curr += 1; @@ -43,7 +53,7 @@ static char *next_file(char *old, unsigned suffix_len) return NULL; } *curr = 'a'; - } while (1); + } return old; } @@ -56,7 +66,7 @@ enum { READ_BUFFER_SIZE = COMMON_BUFSIZE - 1 }; #define SPLIT_OPT_a (1<<2) int split_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; -int split_main(int argc, char **argv) +int split_main(int argc UNUSED_PARAM, char **argv) { unsigned suffix_len = 2; char *pfx; @@ -68,22 +78,25 @@ int split_main(int argc, char **argv) ssize_t bytes_read, to_write; char *src; - opt_complementary = "?2"; - opt = getopt32(argv, "l:b:a:", &count_p, &count_p, &sfx); + opt_complementary = "?2:a+"; /* max 2 args; -a N */ + opt = getopt32(argv, "l:b:a:", &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; } @@ -100,7 +113,7 @@ int split_main(int argc, char **argv) } 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) @@ -132,7 +145,7 @@ int split_main(int argc, char **argv) } } - xwrite(1, src, to_write); + xwrite(STDOUT_FILENO, src, to_write); bytes_read -= to_write; src += to_write; } while (bytes_read);