diff --git a/duff.c b/duff.c 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 +#include +#include + +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 \n", argv[0]); + return EXIT_FAILURE; + } + + from = argv[1]; + + printf ("DUFF: %s\n", duffcopy (to, from, strlen (from))); + return EXIT_SUCCESS; +}