#include <stdlib.h>
#include <stdio.h>
#define node_add(new, p, n) \
n->prev = new; \
new->next = n; \
new->prev = p; \
p->next = new
#define node_del(p, n) \
n->prev = p; \
p->next = n
#define list_of(T) \
struct { \
T data; \
void *it; \
void *prev; \
void *next; \
}
#define list_alloc(ptr, alloc_func) \
({ ptr = alloc_func(sizeof(__typeof__(*ptr))); ptr->prev = ptr; ptr->next = ptr; ptr; })
#define list_shift(ptr, value, alloc_func) ({ int __ret = 0; \
__typeof__(ptr) node = alloc_func(sizeof(__typeof__(*ptr))), next; \
if (node != NULL) { \
node->data = value; \
next = ((__typeof__(ptr)) ptr->next); \
node_add(node, ptr, next); \
__ret = 1; \
}; __ret; })
#define list_push(ptr, value, alloc_func) ({ int __ret = 0; \
__typeof__(ptr) node = alloc_func(sizeof(__typeof__(*ptr))), prev; \
if (node != NULL) { \
node->data = value; \
prev = ((__typeof__(ptr)) ptr->prev); \
node_add(node, prev, ptr); \
__ret = 1; \
}; __ret; })
#define list_foreach(ptr, value) for( \
__typeof__(ptr->data) value = ((__typeof__(ptr))(ptr->it = ptr->next))->data; \
ptr->it != ptr; \
value = ((__typeof__(ptr))(ptr->it = ((__typeof__(ptr))ptr->it)->next))->data)
#define list_it_free(ptr, free_func) { __typeof__(ptr) it = ptr->it, prev = it->prev, next = it->next; node_del(prev, next); ptr->it = prev; free_func(it); }
#define list_clear(ptr, free_func) list_foreach(ptr, value) { list_it_free(ptr, free_func); }
#define list_free(ptr, free_func) list_clear(ptr, free_func); free_func(ptr); ptr = NULL
int main() {
list_of
(int) *list
= list_alloc
(list
, malloc);
for (int i = 9; i >= 0; i--) {
}
for (int i = 8; i >= 0; i--) {
}
list_foreach(list, value) {
if (value % 2 == 0) {
list_it_free
(list
, free); }
}
list_foreach(list, value) {
}
list_foreach(list, value) {
}
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNkZWZpbmUgbm9kZV9hZGQobmV3LCBwLCBuKSBcCiAgbi0+cHJldiA9IG5ldzsgXAogIG5ldy0+bmV4dCA9IG47IFwKICBuZXctPnByZXYgPSBwOyBcCiAgcC0+bmV4dCA9IG5ldwogIAojZGVmaW5lIG5vZGVfZGVsKHAsIG4pIFwKICBuLT5wcmV2ID0gcDsgXAogIHAtPm5leHQgPSBuCiAgICAKI2RlZmluZSBsaXN0X29mKFQpIFwKICBzdHJ1Y3QgeyBcCiAgICBUIGRhdGE7IFwKICAgIHZvaWQgKml0OyBcCiAgICB2b2lkICpwcmV2OyBcCiAgICB2b2lkICpuZXh0OyBcCiAgfQogIAojZGVmaW5lIGxpc3RfYWxsb2MocHRyLCBhbGxvY19mdW5jKSBcCiAgKHsgcHRyID0gYWxsb2NfZnVuYyhzaXplb2YoX190eXBlb2ZfXygqcHRyKSkpOyBwdHItPnByZXYgPSBwdHI7IHB0ci0+bmV4dCA9IHB0cjsgcHRyOyB9KQogIAojZGVmaW5lIGxpc3Rfc2hpZnQocHRyLCB2YWx1ZSwgYWxsb2NfZnVuYykgKHsgaW50IF9fcmV0ID0gMDsgXAogIF9fdHlwZW9mX18ocHRyKSBub2RlID0gYWxsb2NfZnVuYyhzaXplb2YoX190eXBlb2ZfXygqcHRyKSkpLCBuZXh0OyBcCiAgaWYgKG5vZGUgIT0gTlVMTCkgeyAgXAogICAgbm9kZS0+ZGF0YSA9IHZhbHVlOyBcCiAgICBuZXh0ID0gKChfX3R5cGVvZl9fKHB0cikpIHB0ci0+bmV4dCk7IFwKICAgIG5vZGVfYWRkKG5vZGUsIHB0ciwgbmV4dCk7IFwKICAgIF9fcmV0ID0gMTsgXAogIH07IF9fcmV0OyB9KQogIAojZGVmaW5lIGxpc3RfcHVzaChwdHIsIHZhbHVlLCBhbGxvY19mdW5jKSAoeyBpbnQgX19yZXQgPSAwOyBcCiAgX190eXBlb2ZfXyhwdHIpIG5vZGUgPSBhbGxvY19mdW5jKHNpemVvZihfX3R5cGVvZl9fKCpwdHIpKSksIHByZXY7IFwKICBpZiAobm9kZSAhPSBOVUxMKSB7ICBcCiAgICBub2RlLT5kYXRhID0gdmFsdWU7IFwKICAgIHByZXYgPSAoKF9fdHlwZW9mX18ocHRyKSkgcHRyLT5wcmV2KTsgXAogICAgbm9kZV9hZGQobm9kZSwgcHJldiwgcHRyKTsgXAogICAgX19yZXQgPSAxOyBcCiAgfTsgX19yZXQ7IH0pCiAgCiNkZWZpbmUgbGlzdF9mb3JlYWNoKHB0ciwgdmFsdWUpIGZvciggXAogIF9fdHlwZW9mX18ocHRyLT5kYXRhKSB2YWx1ZSA9ICgoX190eXBlb2ZfXyhwdHIpKShwdHItPml0ID0gcHRyLT5uZXh0KSktPmRhdGE7IFwKICBwdHItPml0ICE9IHB0cjsgXAogIHZhbHVlID0gKChfX3R5cGVvZl9fKHB0cikpKHB0ci0+aXQgPSAoKF9fdHlwZW9mX18ocHRyKSlwdHItPml0KS0+bmV4dCkpLT5kYXRhKQoKI2RlZmluZSBsaXN0X2l0X2ZyZWUocHRyLCBmcmVlX2Z1bmMpIHsgX190eXBlb2ZfXyhwdHIpIGl0ID0gcHRyLT5pdCwgcHJldiA9IGl0LT5wcmV2LCBuZXh0ID0gaXQtPm5leHQ7IG5vZGVfZGVsKHByZXYsIG5leHQpOyBwdHItPml0ID0gcHJldjsgZnJlZV9mdW5jKGl0KTsgfQoKI2RlZmluZSBsaXN0X2NsZWFyKHB0ciwgZnJlZV9mdW5jKSBsaXN0X2ZvcmVhY2gocHRyLCB2YWx1ZSkgeyBsaXN0X2l0X2ZyZWUocHRyLCBmcmVlX2Z1bmMpOyB9CgojZGVmaW5lIGxpc3RfZnJlZShwdHIsIGZyZWVfZnVuYykgbGlzdF9jbGVhcihwdHIsIGZyZWVfZnVuYyk7IGZyZWVfZnVuYyhwdHIpOyBwdHIgPSBOVUxMCgppbnQgbWFpbigpIHsKICAgIGxpc3Rfb2YoaW50KSAqbGlzdCA9IGxpc3RfYWxsb2MobGlzdCwgbWFsbG9jKTsKICAgIAogICAgZm9yIChpbnQgaSA9IDk7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGlzdF9zaGlmdChsaXN0LCBpLCBtYWxsb2MpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDg7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGlzdF9wdXNoKGxpc3QsIGksIG1hbGxvYyk7CiAgICB9CiAgICAKICAgIGxpc3RfZm9yZWFjaChsaXN0LCB2YWx1ZSkgewogICAgICAgIHByaW50ZigiJWRcbiIsIHZhbHVlKTsKICAgICAgICBpZiAodmFsdWUgJSAyID09IDApIHsKICAgICAgICAgICAgbGlzdF9pdF9mcmVlKGxpc3QsIGZyZWUpOwogICAgICAgIH0KICAgIH0KICAgIAogICAgcHJpbnRmKCJcbiIpOwogICAgbGlzdF9mb3JlYWNoKGxpc3QsIHZhbHVlKSB7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgdmFsdWUpOwogICAgfQogICAgCiAgICBsaXN0X2NsZWFyKGxpc3QsIGZyZWUpOwogICAgbGlzdF9mb3JlYWNoKGxpc3QsIHZhbHVlKSB7CiAgICAgICAgcHJpbnRmKCIlZFxuIiwgdmFsdWUpOwogICAgfQogICAgCiAgICBsaXN0X2ZyZWUobGlzdCwgZnJlZSk7Cn0=