// -- Some adjustments for didactic reasons ----------
typedef unsigned long   uint64_t;   // ok on theseus
typedef unsigned char   uint8_t;

int putchar ( int character );
// ---------------------------------------------------

void
puts(char *str)
{
    while (*str) {
        putchar(*str++);
    }
    putchar('\n');
}

uint64_t
strlen(char *str)
{
    char *ch = str;
    while (*ch) {
        ++ch;
    }
    return ch - str;
}

void
quicksort(char *A, uint64_t n)
{
    if (n < 2) {
        return;
    }

    uint64_t p = n/2;
    uint64_t left = 0;
    uint64_t right = n - 1;

    do {
        while (A[left] < A[p]) {
            ++left;
        }
        while (A[p] < A[right]) {
            --right;
        }
        if (left <= right) {
            char tmp = A[left];
            A[left] = A[right];
            A[right] = tmp;

            if (left == p) {
                p = right;
            } else if (right == p) {
                p = left;
            }
            ++left;
            --right;
        }
    } while (left <= right);

    quicksort(A, right + 1);
    quicksort(A+left, n - left);
}

char msg[] = "hello, world!";

int
main()
{
    puts(msg);
    quicksort(msg, strlen(msg));
    puts(msg);
}