changeset 1410:ee0109c35b34 draft

Add factor. I was reading http://www.muppetlabs.com/~breadbox/txt/rsa.html and it mentioned "factor" and I noticed it was in coreutils. I'm not sure why it's in coreutils, but it's pretty trivial, so...
author Rob Landley <rob@landley.net>
date Fri, 01 Aug 2014 09:08:00 -0500
parents f477dc852d3b
children dd336488a69b
files scripts/test/factor.test toys/other/factor.c
diffstat 2 files changed, 95 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/scripts/test/factor.test	Fri Aug 01 09:08:00 2014 -0500
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+[ -f testing.sh ] && . testing.sh
+
+#testing "name" "command" "result" "infile" "stdin"
+
+testing "factor -32" "factor -32" "-32: -1 2 2 2 2 2\n" "" ""
+testing "factor 0" "factor 0" "0: 0\n" "" ""
+testing "factor 1" "factor 1" "1: 1\n" "" ""
+testing "factor 2" "factor 2" "2: 2\n" "" ""
+testing "factor 3" "factor 3" "3: 3\n" "" ""
+testing "factor 4" "factor 4" "4: 2 2\n" "" ""
+testing "factor 10000000017" "factor 10000000017" \
+        "10000000017: 3 3 3 7 7 7 1079797\n" "" ""
+testing "factor 10000000018" "factor 10000000018" \
+        "10000000018: 2 131 521 73259\n" "" ""
+testing "factor 10000000019" "factor 10000000019" \
+        "10000000019: 10000000019\n" "" ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/toys/other/factor.c	Fri Aug 01 09:08:00 2014 -0500
@@ -0,0 +1,77 @@
+/* factor.c - Factor integers
+ *
+ * Copyright 2014 Rob Landley <rob@landley.net>
+ *
+ * No standard, but it's in coreutils
+
+USE_FACTOR(NEWTOY(factor, 0, TOYFLAG_USR|TOYFLAG_BIN))
+
+config FACTOR
+  bool "factor"
+  default y
+  help
+    usage: factor NUMBER...
+
+    Factor integers.
+*/
+
+#include "toys.h"
+
+static void factor(char *s)
+{
+  long l, ll;
+
+  l = strtol(s, &s, 0);
+  if (*s) {
+    error_msg("%s: not integer");
+    return;
+  }
+
+  printf("%ld:", l);
+
+  // Negative numbers have -1 as a factor
+  if (l < 0) {
+    printf(" -1");
+    l *= -1;
+  }
+
+  // Deal with 0 and 1 (and 2 since we're here)
+  if (l < 3) {
+    printf(" %ld\n", l);
+    return;
+  }
+
+  // Special case factors of 2
+  while (l && !(l&1)) {
+    printf(" 2");
+    l >>= 1;
+  }
+
+  // test odd numbers.
+  for (ll=3; ;ll += 2) {
+    if (ll*ll>l) {
+      if (l>1) printf(" %ld", l);
+      break;
+    }
+    while (!(l%ll)) {
+      printf(" %ld", ll);
+      l /= ll;
+    }
+  }
+  xputc('\n');
+}
+
+void factor_main(void)
+{
+  if (toys.optc) {
+    char **ss;
+
+    for (ss = toys.optargs; *ss; ss++) factor(*ss);
+  } else for (;;) {
+    char *s = 0;
+    size_t len = 0;
+
+    if (-1 == getline(&s, &len, stdin)) break;
+    factor(s);
+  }
+}