duff.c
changeset 56 966ad681f25d
child 57 7739518acafb
new file mode 100644
--- /dev/null
+++ b/duff.c
@@ -0,0 +1,62 @@
+/**
+ * Duff's Device
+ * fast copy algorithm
+ * performs 8 times faster on long strings.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char *duffcopy (char *to, char *from, int num)
+{
+    int n, pos = 0;
+
+    n = (num + 7) / 8;
+
+    switch (num % 8) {
+    case 0:
+        do {
+            to[pos] = from[pos];
+            pos++;
+    case 7:
+            to[pos] = from[pos];
+            pos++;
+    case 6:
+            to[pos] = from[pos];
+            pos++;
+    case 5:
+            to[pos] = from[pos];
+            pos++;
+    case 4:
+            to[pos] = from[pos];
+            pos++;
+    case 3:
+            to[pos] = from[pos];
+            pos++;
+    case 2:
+            to[pos] = from[pos];
+            pos++;
+    case 1:
+            to[pos] = from[pos];
+            pos++;
+        } while (--n > 0);
+    }
+
+    return to;
+}
+
+int main (int argc, char **argv)
+{
+    char to[80], *from;
+
+    if (argc != 2) {
+        printf ("Usage: %s <string>\n", argv[0]);
+        return EXIT_FAILURE;
+    }
+
+    from = argv[1];
+
+    printf ("DUFF: %s\n", duffcopy (to, from, strlen (from)));
+    return EXIT_SUCCESS;
+}