# HG changeset patch # User Rob Landley # Date 1419459188 21600 # Node ID 89384d54d49ab09429f9f520ba33c16a63a09799 # Parent 1cc305c51cdeaf21c17a42a0c2bf6d573b537d42 Teach factor to accept whitespace separated arguments (reported by Robert Thompson). (The diff looks bigger than it is because of reindenting.) diff -r 1cc305c51cde -r 89384d54d49a tests/factor.test --- a/tests/factor.test Tue Dec 23 19:20:24 2014 -0600 +++ b/tests/factor.test Wed Dec 24 16:13:08 2014 -0600 @@ -16,3 +16,7 @@ "10000000018: 2 131 521 73259\n" "" "" testing "factor 10000000019" "factor 10000000019" \ "10000000019: 10000000019\n" "" "" + +testing "factor 3 6 from stdin" "factor" "3: 3\n6: 2 3\n" "" "3 6" +testing "factor stdin newline" "factor" "3: 3\n6: 2 3\n" "" "3\n6\n" + diff -r 1cc305c51cde -r 89384d54d49a toys/other/factor.c --- a/toys/other/factor.c Tue Dec 23 19:20:24 2014 -0600 +++ b/toys/other/factor.c Wed Dec 24 16:13:08 2014 -0600 @@ -21,46 +21,51 @@ { long l, ll; - l = strtol(s, &s, 0); - if (*s) { - error_msg("%s: not integer"); - return; - } - - printf("%ld:", l); + for (;;) { + while(isspace(*s)) s++; + if (!*s) return; - // Negative numbers have -1 as a factor - if (l < 0) { - printf(" -1"); - l *= -1; - } + l = strtol(s, &s, 0); + if (*s && !isspace(*s)) { + error_msg("%s: not integer"); + return; + } - // Deal with 0 and 1 (and 2 since we're here) - if (l < 3) { - printf(" %ld\n", l); - return; - } + printf("%ld:", l); + + // Negative numbers have -1 as a factor + if (l < 0) { + printf(" -1"); + l *= -1; + } - // Special case factors of 2 - while (l && !(l&1)) { - printf(" 2"); - l >>= 1; - } + // Nothing below 4 has factors + if (l < 4) { + printf(" %ld\n", l); + continue; + } - // test odd numbers. - for (ll=3; ;ll += 2) { - long lll = ll*ll; + // Special case factors of 2 + while (l && !(l&1)) { + printf(" 2"); + l >>= 1; + } - if (lll>l || lll1) printf(" %ld", l); - break; + // test odd numbers. + for (ll=3; ;ll += 2) { + long lll = ll*ll; + + if (lll>l || lll1) printf(" %ld", l); + break; + } + while (!(l%ll)) { + printf(" %ld", ll); + l /= ll; + } } - while (!(l%ll)) { - printf(" %ld", ll); - l /= ll; - } + xputc('\n'); } - xputc('\n'); } void factor_main(void)