duff.c
author Markus Bröker <mbroeker@largo.dyndns.tv>
Fri, 19 Nov 2010 00:34:26 +0100
changeset 155 a54dcc86addb
parent 63 5a82f89d607e
permissions -rw-r--r--
cunit needs libcunit and libncurses committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * 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, size_t len)
{
    size_t n, pos = 0;

    n = (len + 7) / 8;

    switch (len % 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, *from;
    size_t len;

    if (argc != 2) {
        printf ("Usage: %s <string>\n", argv[0]);
        return EXIT_FAILURE;
    }

    from = argv[1];
    len = strlen (from) + 1;

    if ((to = malloc (len)) == NULL) {
        perror ("MALLOC");
        return EXIT_FAILURE;
    }

    printf ("DUFF: %s\n", duffcopy (to, from, len));

    if (to != NULL) {
        free (to);
    }

    return EXIT_SUCCESS;
}