#include <stdio.h>
#include <stdlib.h>
enum node_type {type_nil, type_node};
struct int_list {
enum node_type type;
union {
struct {int value; struct int_list *next;} node;
struct {} nil;
} as;
};
#define hd(list) ((list).as.node.value)
#define tl(list) ((list).as.node.next)
#define is_nil(list) ((list).type == type_nil)
#define is_node(list) ((list).type == type_node)
struct int_list int_list_nil() {
return (struct int_list){type_nil, 0, 0};
}
struct int_list int_list_cons(int value, struct int_list next) {
struct int_list list
= {type_node
, value
, malloc(sizeof (struct int_list
))}; *tl(list) = next;
return list;
}
void int_list_free(struct int_list list) {
if (is_node
(list
)) int_list_free
(*tl
(list
)), free(tl
(list
)); }
void int_list_each(void (f)(int), struct int_list list) {
if (is_node(list)) f(hd(list)), int_list_each(f, *tl(list));
}
struct int_list int_list_rev_aux(struct int_list acc, struct int_list list) {
return is_nil(list)
? acc
: int_list_rev_aux(int_list_cons(hd(list), acc), *tl(list));
}
struct int_list int_list_rev(struct int_list list) {
return int_list_rev_aux(int_list_nil(), list);
}
struct int_list int_list_append(struct int_list a, struct int_list b) {
if (is_node(a))
return int_list_cons(hd(a), int_list_append(*tl(a), b));
else if (is_node(b))
return int_list_cons(hd(b), int_list_append(a, *tl(b)));
else
return int_list_nil();
}
struct pair_of_int_lists {
struct int_list first, second;
};
struct pair_of_int_lists int_list_partition_aux(void *context, int (predicate)(void *, int), struct pair_of_int_lists acc, struct int_list list) {
#define _(a, b) ((struct pair_of_int_lists){(a), (b)})
if (is_nil(list))
return acc;
else if (predicate(context, hd(list)))
return int_list_partition_aux(context, predicate, _(int_list_cons(hd(list), acc.first), acc.second), *tl(list));
else
return int_list_partition_aux(context, predicate, _(acc.first, int_list_cons(hd(list), acc.second)), *tl(list));
#undef _
}
struct pair_of_int_lists int_list_partition(void *context, int (predicate)(void *, int), struct int_list list) {
struct pair_of_int_lists acc = {int_list_nil(), int_list_nil()};
struct int_list reversed = int_list_rev(list);
acc = int_list_partition_aux(context, predicate, acc, reversed);
int_list_free(reversed);
return acc;
}
int less_than_context(void *context, int value) {
return value < *(int *)context;
}
struct int_list int_list_qsort(struct int_list list) {
int pivot;
struct int_list sorted, tail, smaller, rest, a, b;
struct pair_of_int_lists pair;
if (is_nil(list))
return int_list_nil();
else {
pivot = hd(list), tail = *tl(list);
pair = int_list_partition(&pivot, less_than_context, tail);
smaller = pair.first, rest = pair.second;
sorted = int_list_append(a = int_list_qsort(smaller), b = int_list_cons(pivot, int_list_qsort(rest)));
int_list_free(smaller), int_list_free(rest), int_list_free(a), int_list_free(b);
return sorted;
}
}
#define list_cons(x, xs) _Generic((xs), struct int_list : int_list_cons, default : int_list_cons)((x), (xs))
#define list_free(list) _Generic((list), struct int_list : int_list_free, default : int_list_free)(list)
#define list_each(f, list) _Generic((list), struct int_list : int_list_each, default : int_list_each)((f), (list))
#define list_qsort(list) _Generic((list), struct int_list : int_list_qsort, default : int_list_qsort)(list)
void print_int
(int x
) {printf("%d", x
);} int main() {
struct int_list list = list_cons(4, list_cons(8, list_cons(8, list_cons(3, int_list_nil()))));
struct int_list sorted = list_qsort(list);
list_each
(print_int
, list
);puts(""); list_each
(print_int
, sorted
);puts(""); list_free(list), list = int_list_nil();
list_free(sorted), sorted = int_list_nil();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KZW51bSBub2RlX3R5cGUge3R5cGVfbmlsLCB0eXBlX25vZGV9OwpzdHJ1Y3QgaW50X2xpc3QgewogIGVudW0gbm9kZV90eXBlIHR5cGU7CiAgdW5pb24gewogICAgc3RydWN0IHtpbnQgdmFsdWU7IHN0cnVjdCBpbnRfbGlzdCAqbmV4dDt9IG5vZGU7CiAgICBzdHJ1Y3Qge30gbmlsOwogIH0gYXM7Cn07CiNkZWZpbmUgaGQobGlzdCkgKChsaXN0KS5hcy5ub2RlLnZhbHVlKQojZGVmaW5lIHRsKGxpc3QpICgobGlzdCkuYXMubm9kZS5uZXh0KQojZGVmaW5lIGlzX25pbChsaXN0KSAoKGxpc3QpLnR5cGUgPT0gdHlwZV9uaWwpCiNkZWZpbmUgaXNfbm9kZShsaXN0KSAoKGxpc3QpLnR5cGUgPT0gdHlwZV9ub2RlKQpzdHJ1Y3QgaW50X2xpc3QgaW50X2xpc3RfbmlsKCkgewogIHJldHVybiAoc3RydWN0IGludF9saXN0KXt0eXBlX25pbCwgMCwgMH07Cn0Kc3RydWN0IGludF9saXN0IGludF9saXN0X2NvbnMoaW50IHZhbHVlLCBzdHJ1Y3QgaW50X2xpc3QgbmV4dCkgewogIHN0cnVjdCBpbnRfbGlzdCBsaXN0ID0ge3R5cGVfbm9kZSwgdmFsdWUsIG1hbGxvYyhzaXplb2YgKHN0cnVjdCBpbnRfbGlzdCkpfTsKICAqdGwobGlzdCkgPSBuZXh0OwogIHJldHVybiBsaXN0Owp9CnZvaWQgaW50X2xpc3RfZnJlZShzdHJ1Y3QgaW50X2xpc3QgbGlzdCkgewogIGlmIChpc19ub2RlKGxpc3QpKSBpbnRfbGlzdF9mcmVlKCp0bChsaXN0KSksIGZyZWUodGwobGlzdCkpOwp9CnZvaWQgaW50X2xpc3RfZWFjaCh2b2lkIChmKShpbnQpLCBzdHJ1Y3QgaW50X2xpc3QgbGlzdCkgewogIGlmIChpc19ub2RlKGxpc3QpKSBmKGhkKGxpc3QpKSwgaW50X2xpc3RfZWFjaChmLCAqdGwobGlzdCkpOwp9CnN0cnVjdCBpbnRfbGlzdCBpbnRfbGlzdF9yZXZfYXV4KHN0cnVjdCBpbnRfbGlzdCBhY2MsIHN0cnVjdCBpbnRfbGlzdCBsaXN0KSB7CiAgcmV0dXJuIGlzX25pbChsaXN0KQogICAgPyBhY2MKICAgIDogaW50X2xpc3RfcmV2X2F1eChpbnRfbGlzdF9jb25zKGhkKGxpc3QpLCBhY2MpLCAqdGwobGlzdCkpOwp9CnN0cnVjdCBpbnRfbGlzdCBpbnRfbGlzdF9yZXYoc3RydWN0IGludF9saXN0IGxpc3QpIHsKICByZXR1cm4gaW50X2xpc3RfcmV2X2F1eChpbnRfbGlzdF9uaWwoKSwgbGlzdCk7Cn0Kc3RydWN0IGludF9saXN0IGludF9saXN0X2FwcGVuZChzdHJ1Y3QgaW50X2xpc3QgYSwgc3RydWN0IGludF9saXN0IGIpIHsKICBpZiAoaXNfbm9kZShhKSkgCiAgICByZXR1cm4gaW50X2xpc3RfY29ucyhoZChhKSwgaW50X2xpc3RfYXBwZW5kKCp0bChhKSwgYikpOwogIGVsc2UgaWYgKGlzX25vZGUoYikpCiAgICByZXR1cm4gaW50X2xpc3RfY29ucyhoZChiKSwgaW50X2xpc3RfYXBwZW5kKGEsICp0bChiKSkpOwogIGVsc2UKICAgIHJldHVybiBpbnRfbGlzdF9uaWwoKTsKfQpzdHJ1Y3QgcGFpcl9vZl9pbnRfbGlzdHMgewogIHN0cnVjdCBpbnRfbGlzdCBmaXJzdCwgc2Vjb25kOwp9OwpzdHJ1Y3QgcGFpcl9vZl9pbnRfbGlzdHMgaW50X2xpc3RfcGFydGl0aW9uX2F1eCh2b2lkICpjb250ZXh0LCBpbnQgKHByZWRpY2F0ZSkodm9pZCAqLCBpbnQpLCBzdHJ1Y3QgcGFpcl9vZl9pbnRfbGlzdHMgYWNjLCBzdHJ1Y3QgaW50X2xpc3QgbGlzdCkgewojZGVmaW5lIF8oYSwgYikgKChzdHJ1Y3QgcGFpcl9vZl9pbnRfbGlzdHMpeyhhKSwgKGIpfSkKICBpZiAoaXNfbmlsKGxpc3QpKQogICAgcmV0dXJuIGFjYzsKICBlbHNlIGlmIChwcmVkaWNhdGUoY29udGV4dCwgaGQobGlzdCkpKQogICAgcmV0dXJuIGludF9saXN0X3BhcnRpdGlvbl9hdXgoY29udGV4dCwgcHJlZGljYXRlLCBfKGludF9saXN0X2NvbnMoaGQobGlzdCksIGFjYy5maXJzdCksIGFjYy5zZWNvbmQpLCAqdGwobGlzdCkpOwogIGVsc2UKICAgIHJldHVybiBpbnRfbGlzdF9wYXJ0aXRpb25fYXV4KGNvbnRleHQsIHByZWRpY2F0ZSwgXyhhY2MuZmlyc3QsIGludF9saXN0X2NvbnMoaGQobGlzdCksIGFjYy5zZWNvbmQpKSwgKnRsKGxpc3QpKTsKI3VuZGVmIF8KfQpzdHJ1Y3QgcGFpcl9vZl9pbnRfbGlzdHMgaW50X2xpc3RfcGFydGl0aW9uKHZvaWQgKmNvbnRleHQsIGludCAocHJlZGljYXRlKSh2b2lkICosIGludCksIHN0cnVjdCBpbnRfbGlzdCBsaXN0KSB7CiAgc3RydWN0IHBhaXJfb2ZfaW50X2xpc3RzIGFjYyA9IHtpbnRfbGlzdF9uaWwoKSwgaW50X2xpc3RfbmlsKCl9OwogIHN0cnVjdCBpbnRfbGlzdCByZXZlcnNlZCA9IGludF9saXN0X3JldihsaXN0KTsKICBhY2MgPSBpbnRfbGlzdF9wYXJ0aXRpb25fYXV4KGNvbnRleHQsIHByZWRpY2F0ZSwgYWNjLCByZXZlcnNlZCk7CiAgaW50X2xpc3RfZnJlZShyZXZlcnNlZCk7CiAgcmV0dXJuIGFjYzsKfQppbnQgbGVzc190aGFuX2NvbnRleHQodm9pZCAqY29udGV4dCwgaW50IHZhbHVlKSB7CiAgcmV0dXJuIHZhbHVlIDwgKihpbnQgKiljb250ZXh0Owp9CnN0cnVjdCBpbnRfbGlzdCBpbnRfbGlzdF9xc29ydChzdHJ1Y3QgaW50X2xpc3QgbGlzdCkgewogIGludCBwaXZvdDsKICBzdHJ1Y3QgaW50X2xpc3Qgc29ydGVkLCB0YWlsLCBzbWFsbGVyLCByZXN0LCBhLCBiOwogIHN0cnVjdCBwYWlyX29mX2ludF9saXN0cyBwYWlyOwogIGlmIChpc19uaWwobGlzdCkpCiAgICByZXR1cm4gaW50X2xpc3RfbmlsKCk7CiAgZWxzZSB7CiAgICBwaXZvdCA9IGhkKGxpc3QpLCB0YWlsID0gKnRsKGxpc3QpOwogICAgcGFpciA9IGludF9saXN0X3BhcnRpdGlvbigmcGl2b3QsIGxlc3NfdGhhbl9jb250ZXh0LCB0YWlsKTsKICAgIHNtYWxsZXIgPSBwYWlyLmZpcnN0LCByZXN0ID0gcGFpci5zZWNvbmQ7CiAgICBzb3J0ZWQgPSBpbnRfbGlzdF9hcHBlbmQoYSA9IGludF9saXN0X3Fzb3J0KHNtYWxsZXIpLCBiID0gaW50X2xpc3RfY29ucyhwaXZvdCwgaW50X2xpc3RfcXNvcnQocmVzdCkpKTsKICAgIGludF9saXN0X2ZyZWUoc21hbGxlciksIGludF9saXN0X2ZyZWUocmVzdCksIGludF9saXN0X2ZyZWUoYSksIGludF9saXN0X2ZyZWUoYik7CiAgICByZXR1cm4gc29ydGVkOwogIH0KfQojZGVmaW5lIGxpc3RfY29ucyh4LCB4cykgX0dlbmVyaWMoKHhzKSwgc3RydWN0IGludF9saXN0IDogaW50X2xpc3RfY29ucywgZGVmYXVsdCA6IGludF9saXN0X2NvbnMpKCh4KSwgKHhzKSkKI2RlZmluZSBsaXN0X2ZyZWUobGlzdCkgX0dlbmVyaWMoKGxpc3QpLCBzdHJ1Y3QgaW50X2xpc3QgOiBpbnRfbGlzdF9mcmVlLCBkZWZhdWx0IDogaW50X2xpc3RfZnJlZSkobGlzdCkKI2RlZmluZSBsaXN0X2VhY2goZiwgbGlzdCkgX0dlbmVyaWMoKGxpc3QpLCBzdHJ1Y3QgaW50X2xpc3QgOiBpbnRfbGlzdF9lYWNoLCBkZWZhdWx0IDogaW50X2xpc3RfZWFjaCkoKGYpLCAobGlzdCkpCiNkZWZpbmUgbGlzdF9xc29ydChsaXN0KSBfR2VuZXJpYygobGlzdCksIHN0cnVjdCBpbnRfbGlzdCA6IGludF9saXN0X3Fzb3J0LCBkZWZhdWx0IDogaW50X2xpc3RfcXNvcnQpKGxpc3QpCnZvaWQgcHJpbnRfaW50KGludCB4KSB7cHJpbnRmKCIlZCIsIHgpO30KaW50IG1haW4oKSB7CiAgc3RydWN0IGludF9saXN0IGxpc3QgPSBsaXN0X2NvbnMoNCwgbGlzdF9jb25zKDgsIGxpc3RfY29ucyg4LCBsaXN0X2NvbnMoMywgaW50X2xpc3RfbmlsKCkpKSkpOwogIHN0cnVjdCBpbnRfbGlzdCBzb3J0ZWQgPSBsaXN0X3Fzb3J0KGxpc3QpOwogIGxpc3RfZWFjaChwcmludF9pbnQsIGxpc3QpO3B1dHMoIiIpOwogIGxpc3RfZWFjaChwcmludF9pbnQsIHNvcnRlZCk7cHV0cygiIik7CiAgbGlzdF9mcmVlKGxpc3QpLCBsaXN0ID0gaW50X2xpc3RfbmlsKCk7CiAgbGlzdF9mcmVlKHNvcnRlZCksIHNvcnRlZCA9IGludF9saXN0X25pbCgpOwogIHJldHVybiAwOwp9Cg==