OSDN Git Service

Teach factor to accept whitespace separated arguments (reported by Robert Thompson).
authorRob Landley <rob@landley.net>
Wed, 24 Dec 2014 22:13:08 +0000 (16:13 -0600)
committerRob Landley <rob@landley.net>
Wed, 24 Dec 2014 22:13:08 +0000 (16:13 -0600)
(The diff looks bigger than it is because of reindenting.)

tests/factor.test
toys/other/factor.c

index a3e4cbf..ed1cc22 100755 (executable)
@@ -16,3 +16,7 @@ testing "factor 10000000018" "factor 10000000018" \
         "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"
+
index 9dc1cca..bf454b4 100644 (file)
@@ -21,46 +21,51 @@ static void factor(char *s)
 {
   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);
 
-  // Special case factors of 2
-  while (l && !(l&1)) {
-    printf(" 2");
-    l >>= 1;
-  }
+    // Negative numbers have -1 as a factor
+    if (l < 0) {
+      printf(" -1");
+      l *= -1;
+    }
 
-  // test odd numbers.
-  for (ll=3; ;ll += 2) {
-    long lll = ll*ll;
+    // Nothing below 4 has factors
+    if (l < 4) {
+      printf(" %ld\n", l);
+      continue;
+    }
 
-    if (lll>l || lll<ll) {
-      if (l>1) printf(" %ld", l);
-      break;
+    // Special case factors of 2
+    while (l && !(l&1)) {
+      printf(" 2");
+      l >>= 1;
     }
-    while (!(l%ll)) {
-      printf(" %ld", ll);
-      l /= ll;
+
+    // test odd numbers.
+    for (ll=3; ;ll += 2) {
+      long lll = ll*ll;
+
+      if (lll>l || lll<ll) {
+        if (l>1) printf(" %ld", l);
+        break;
+      }
+      while (!(l%ll)) {
+        printf(" %ld", ll);
+        l /= ll;
+      }
     }
+    xputc('\n');
   }
-  xputc('\n');
 }
 
 void factor_main(void)