// -- 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)
{
uint64_t p;
uint64_t left = 0;
uint64_t right = n - 1;
char tmp;
if (n < 2)
goto quicksort_done;
p = n/2;
left = 0;
right = n - 1;
quicksort_do:
quicksort_while_left:
if (A[left] >= A[p])
goto quicksort_endwhile_left;
left = left + 1;
goto quicksort_while_left;
quicksort_endwhile_left:
quicksort_while_right:
if (A[p] >= A[right])
goto quicksort_endwhile_right;
right = right - 1;
goto quicksort_while_right;
quicksort_endwhile_right:
if (left>right)
goto quicksort_endif_left_right;
tmp = A[left];
A[left] = A[right];
A[right] = tmp;
if (left != p)
goto quicksort_if_p_eq_right;
p = right;
goto quicksort_endif_p;
quicksort_if_p_eq_right:
if (right != p)
goto quicksort_endif_p;
p = left;
quicksort_endif_p:
left = left + 1;
right = right - 1;
quicksort_endif_left_right:
if (left <= right)
goto quicksort_do;
quicksort(A, right + 1);
quicksort(A+left, n - left);
quicksort_done:
;
}
char msg[] = "hello, world!";
int
main()
{
puts(msg);
quicksort(msg, strlen(msg));
puts(msg);
}