mirror of
https://github.com/sheumann/hush.git
synced 2024-06-06 17:29:42 +00:00
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
|
//kbuild:lib-$(CONFIG_FACTOR) += factor.o
|
||||||
|
|
||||||
//usage:#define factor_trivial_usage
|
//usage:#define factor_trivial_usage
|
||||||
//usage: "NUMBER..."
|
//usage: "[NUMBER]..."
|
||||||
//usage:#define factor_full_usage "\n\n"
|
//usage:#define factor_full_usage "\n\n"
|
||||||
//usage: "Print prime factors"
|
//usage: "Print prime factors"
|
||||||
|
|
||||||
|
@ -165,6 +165,20 @@ static NOINLINE void factorize(wide_t N)
|
||||||
bb_putchar('\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, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int factor_main(int argc UNUSED_PARAM, char **argv)
|
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 += optind;
|
||||||
argv++;
|
argv++;
|
||||||
|
|
||||||
if (!*argv)
|
if (!*argv) {
|
||||||
//TODO: read from stdin
|
/* Read from stdin, several numbers per line are accepted */
|
||||||
bb_show_usage();
|
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 {
|
do {
|
||||||
wide_t N;
|
/* Leading spaces are ok (coreutils compat) */
|
||||||
const char *numstr;
|
factorize_numstr(skip_whitespace(*argv));
|
||||||
|
|
||||||
/* 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);
|
|
||||||
} while (*++argv);
|
} while (*++argv);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user