ntpd: default to FEATURE_NTP_AUTH=y
[oweals/busybox.git] / coreutils / factor.c
index 28175343991c0e395c5089869c82646be14ea888..467e23a4d81aebbda0fcba7cab6f31d05f14c0d8 100644 (file)
@@ -4,17 +4,17 @@
  * Licensed under GPLv2, see file LICENSE in this source tree.
  */
 //config:config FACTOR
-//config:      bool "factor"
+//config:      bool "factor (2.6 kb)"
 //config:      default y
 //config:      help
-//config:        factor factorizes integers
+//config:      factor factorizes integers
 
 //applet:IF_FACTOR(APPLET(factor, BB_DIR_USR_BIN, BB_SUID_DROP))
 
 //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;