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>
This commit is contained in:
parent
44c0ab4102
commit
8352b717ce
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user