#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DEF_LinkedList(T) \
typedef struct _LinkedList##T{ \
T value; \
struct _LinkedList##T *next; \
} LinkedList##T; \
LinkedList##T *LinkedList##T##_New(const T *value){ \
LinkedList##T *result = calloc(0, sizeof(LinkedList##T)); \
memcpy(&result->value, value, sizeof(T)); \
return result; \
} \
void LinkedList##T##_Free(LinkedList##T *list) { \
LinkedList##T *prev; \
while(prev = list){ \
list = list->next; \
free(prev); \
} \
free(list); \
} \
LinkedList##T *LinkedList##T##_Top(LinkedList##T *list){ \
if(!list) NULL; \
while(list->next) list = list->next; \
return list; \
}\
int LinkedList##T##_Push(LinkedList##T *list, const T *value){ \
if(list == NULL) return LinkedList##T##_New(value); \
LinkedList##T *top = LinkedList##T##_Top(list); \
top->next = LinkedList##T##_New(value); \
return list; \
} \
void LinkedList##T##_ForEach(const LinkedList##T *list, void(*op)(const T *)){ \
while(list){ \
op(&list->value); \
list = list->next; \
} \
}
typedef int Int;
DEF_LinkedList(Int);
void printOp(const int *v){
}
int main(void) {
LinkedListInt *list;
int i;
for(i = 0; i <= 10; ++i)
list = LinkedListInt_Push(list, &i);
LinkedListInt_ForEach(list, printOp);
LinkedListInt_Free(list);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBERUZfTGlua2VkTGlzdChUKSBcIAoJdHlwZWRlZiBzdHJ1Y3QgX0xpbmtlZExpc3QjI1R7IFwKCQlUIHZhbHVlOyBcCgkJc3RydWN0IF9MaW5rZWRMaXN0IyNUICpuZXh0OyBcCgl9IExpbmtlZExpc3QjI1Q7IFwKCUxpbmtlZExpc3QjI1QgKkxpbmtlZExpc3QjI1QjI19OZXcoY29uc3QgVCAqdmFsdWUpeyBcCgkJTGlua2VkTGlzdCMjVCAqcmVzdWx0ID0gY2FsbG9jKDAsIHNpemVvZihMaW5rZWRMaXN0IyNUKSk7IFwKCQltZW1jcHkoJnJlc3VsdC0+dmFsdWUsIHZhbHVlLCBzaXplb2YoVCkpOyBcCgkJcmV0dXJuICByZXN1bHQ7IFwKCX0gXAoJdm9pZCBMaW5rZWRMaXN0IyNUIyNfRnJlZShMaW5rZWRMaXN0IyNUICpsaXN0KSB7IFwKCQlMaW5rZWRMaXN0IyNUICpwcmV2OyBcCgkJd2hpbGUocHJldiA9IGxpc3QpeyBcCgkJCWxpc3QgPSBsaXN0LT5uZXh0OyBcCgkJCWZyZWUocHJldik7IFwKCQl9ICBcCgkJZnJlZShsaXN0KTsgXAoJfSBcCglMaW5rZWRMaXN0IyNUICpMaW5rZWRMaXN0IyNUIyNfVG9wKExpbmtlZExpc3QjI1QgKmxpc3QpeyBcCgkJaWYoIWxpc3QpIE5VTEw7IFwKCQl3aGlsZShsaXN0LT5uZXh0KSBsaXN0ID0gbGlzdC0+bmV4dDsgXAoJCXJldHVybiBsaXN0OyBcCgl9XAoJaW50IExpbmtlZExpc3QjI1QjI19QdXNoKExpbmtlZExpc3QjI1QgKmxpc3QsIGNvbnN0IFQgKnZhbHVlKXsgXAoJCWlmKGxpc3QgPT0gTlVMTCkgcmV0dXJuIExpbmtlZExpc3QjI1QjI19OZXcodmFsdWUpOyBcCgkJTGlua2VkTGlzdCMjVCAqdG9wID0gTGlua2VkTGlzdCMjVCMjX1RvcChsaXN0KTsgXAoJCXRvcC0+bmV4dCA9IExpbmtlZExpc3QjI1QjI19OZXcodmFsdWUpOyBcCgkJcmV0dXJuIGxpc3Q7IFwKCX0gXAoJdm9pZCBMaW5rZWRMaXN0IyNUIyNfRm9yRWFjaChjb25zdCBMaW5rZWRMaXN0IyNUICpsaXN0LCB2b2lkKCpvcCkoY29uc3QgVCAqKSl7IFwKCQl3aGlsZShsaXN0KXsgXAoJCQlvcCgmbGlzdC0+dmFsdWUpOyBcCgkJCWxpc3QgPSBsaXN0LT5uZXh0OyBcCgkJfSBcCgl9CgkKdHlwZWRlZiBpbnQgSW50OwpERUZfTGlua2VkTGlzdChJbnQpOwoJCgp2b2lkIHByaW50T3AoY29uc3QgaW50ICp2KXsKCXByaW50ZigiJWkiLCAqdik7Cn0KCmludCBtYWluKHZvaWQpIHsKCUxpbmtlZExpc3RJbnQgKmxpc3Q7CglpbnQgaTsKCWZvcihpID0gMDsgaSA8PSAxMDsgKytpKQoJCWxpc3QgPSBMaW5rZWRMaXN0SW50X1B1c2gobGlzdCwgJmkpOwoJCQoJTGlua2VkTGlzdEludF9Gb3JFYWNoKGxpc3QsIHByaW50T3ApOwoJCglMaW5rZWRMaXN0SW50X0ZyZWUobGlzdCk7CglyZXR1cm4gMDsKfQo=