aboutsummaryrefslogtreecommitdiff
path: root/coreutils/factor.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-04-14 14:23:49 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-04-14 14:23:49 +0200
commit8352b717ce615c4445d6e318019169a6e10ac8e1 (patch)
treeed657ce104dbabbcd569a4a2d277000c169b279f /coreutils/factor.c
parent44c0ab410278656b4b82ec20a24c3644a254da89 (diff)
downloadbusybox-8352b717ce615c4445d6e318019169a6e10ac8e1.tar.gz
factor: support "no-argvs" usage
function old new delta factorize_numstr - 72 +72 packed_usage 31562 31566 +4 factor_main 109 101 -8 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 1/1 up/down: 76/-8) Total: 68 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'coreutils/factor.c')
-rw-r--r--coreutils/factor.c56
1 files changed, 39 insertions, 17 deletions
diff --git a/coreutils/factor.c b/coreutils/factor.c
index 281753439..818414775 100644
--- a/coreutils/factor.c
+++ b/coreutils/factor.c
@@ -14,7 +14,7 @@
//kbuild:lib-$(CONFIG_FACTOR) += factor.o
//usage:#define factor_trivial_usage
-//usage: "NUMBER..."
+//usage: "[NUMBER]..."
//usage:#define factor_full_usage "\n\n"
//usage: "Print prime factors"
@@ -165,6 +165,20 @@ static NOINLINE void factorize(wide_t N)
bb_putchar('\n');
}
+static void factorize_numstr(const char *numstr)
+{
+ wide_t N;
+
+ /* Leading + is ok (coreutils compat) */
+ if (*numstr == '+')
+ numstr++;
+ N = bb_strtoull(numstr, NULL, 10);
+ if (errno)
+ bb_show_usage();
+ printf("%llu:", N);
+ factorize(N);
+}
+
int factor_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int factor_main(int argc UNUSED_PARAM, char **argv)
{
@@ -173,24 +187,32 @@ int factor_main(int argc UNUSED_PARAM, char **argv)
//argv += optind;
argv++;
- if (!*argv)
- //TODO: read from stdin
- bb_show_usage();
+ if (!*argv) {
+ /* Read from stdin, several numbers per line are accepted */
+ for (;;) {
+ char *numstr, *line;
+ line = xmalloc_fgetline(stdin);
+ if (!line)
+ return EXIT_SUCCESS;
+ numstr = line;
+ for (;;) {
+ char *end;
+ numstr = skip_whitespace(numstr);
+ if (!numstr[0])
+ break;
+ end = skip_non_whitespace(numstr);
+ if (*end != '\0');
+ *end++ = '\0';
+ factorize_numstr(numstr);
+ numstr = end;
+ }
+ free(line);
+ }
+ }
do {
- wide_t N;
- const char *numstr;
-
- /* Coreutils compat */
- numstr = skip_whitespace(*argv);
- if (*numstr == '+')
- numstr++;
-
- N = bb_strtoull(numstr, NULL, 10);
- if (errno)
- bb_show_usage();
- printf("%llu:", N);
- factorize(N);
+ /* Leading spaces are ok (coreutils compat) */
+ factorize_numstr(skip_whitespace(*argv));
} while (*++argv);
return EXIT_SUCCESS;