// -- 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);
}