#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#define DECL_STACK_OF(type) \
struct type##_stack{ type *data; size_t max_elements, size; }; \
struct type##_stack create_##type##_stack_of_size(size_t size); \
void push_##type##_to_stack(struct type##_stack *stack, type val); \
type get_##type##_from_stack_at(struct type##_stack *stack, size_t pos);
#define DEF_STACK_OF(type) \
struct type##_stack create_##type##_stack_of_size(size_t size){ \
struct type##_stack result = { \
malloc(sizeof(type)*size), \
size, \
0 \
};\
return result; } \
void push_##type##_to_stack(struct type##_stack *stack, type val){ \
if(stack->size < stack->max_elements){ \
stack->data[stack->size++] = val; } } \
type get_##type##_from_stack_at(struct type##_stack *stack, size_t pos){ \
return stack->data[pos]; }
#define DECL_AND_DEF_STACK_OF(type) \
DECL_STACK_OF(type) \
DEF_STACK_OF (type)
DECL_AND_DEF_STACK_OF(int)
int main(void) {
struct int_stack cont = create_int_stack_of_size(20);
for(size_t i = 0; i < 10; ++i)
push_int_to_stack(&cont, i);
for(size_t i = 0; i < cont.size; ++i)
printf("%d ", get_int_from_stack_at
(&cont
, i
)); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBERUNMX1NUQUNLX09GKHR5cGUpIFwKCXN0cnVjdCB0eXBlIyNfc3RhY2t7IHR5cGUgKmRhdGE7IHNpemVfdCBtYXhfZWxlbWVudHMsIHNpemU7IH07IFwKCXN0cnVjdCB0eXBlIyNfc3RhY2sgY3JlYXRlXyMjdHlwZSMjX3N0YWNrX29mX3NpemUoc2l6ZV90IHNpemUpOyBcCgl2b2lkIHB1c2hfIyN0eXBlIyNfdG9fc3RhY2soc3RydWN0IHR5cGUjI19zdGFjayAqc3RhY2ssIHR5cGUgdmFsKTsgXAoJdHlwZSBnZXRfIyN0eXBlIyNfZnJvbV9zdGFja19hdChzdHJ1Y3QgdHlwZSMjX3N0YWNrICpzdGFjaywgc2l6ZV90IHBvcyk7IAoJCiNkZWZpbmUgREVGX1NUQUNLX09GKHR5cGUpIFwKCXN0cnVjdCB0eXBlIyNfc3RhY2sgY3JlYXRlXyMjdHlwZSMjX3N0YWNrX29mX3NpemUoc2l6ZV90IHNpemUpeyBcCgkJc3RydWN0IHR5cGUjI19zdGFjayByZXN1bHQgPSB7IFwKCQkJbWFsbG9jKHNpemVvZih0eXBlKSpzaXplKSwgXAoJCQlzaXplLCBcCgkJCTAgXAoJCX07XAoJCXJldHVybiByZXN1bHQ7IH0gXAoJdm9pZCBwdXNoXyMjdHlwZSMjX3RvX3N0YWNrKHN0cnVjdCB0eXBlIyNfc3RhY2sgKnN0YWNrLCB0eXBlIHZhbCl7IFwKCQlpZihzdGFjay0+c2l6ZSA8IHN0YWNrLT5tYXhfZWxlbWVudHMpeyBcCgkJCXN0YWNrLT5kYXRhW3N0YWNrLT5zaXplKytdID0gdmFsOyB9IH0gXAoJdHlwZSBnZXRfIyN0eXBlIyNfZnJvbV9zdGFja19hdChzdHJ1Y3QgdHlwZSMjX3N0YWNrICpzdGFjaywgc2l6ZV90IHBvcyl7IFwKCQlyZXR1cm4gc3RhY2stPmRhdGFbcG9zXTsgfQoKI2RlZmluZSBERUNMX0FORF9ERUZfU1RBQ0tfT0YodHlwZSkgXAogICAgREVDTF9TVEFDS19PRih0eXBlKSBcCiAgICBERUZfU1RBQ0tfT0YgKHR5cGUpCgkKREVDTF9BTkRfREVGX1NUQUNLX09GKGludCkKCmludCBtYWluKHZvaWQpIHsKCXN0cnVjdCBpbnRfc3RhY2sgY29udCA9IGNyZWF0ZV9pbnRfc3RhY2tfb2Zfc2l6ZSgyMCk7Cglmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgMTA7ICsraSkKCQlwdXNoX2ludF90b19zdGFjaygmY29udCwgaSk7CgkJCglmb3Ioc2l6ZV90IGkgPSAwOyBpIDwgY29udC5zaXplOyArK2kpCgkJcHJpbnRmKCIlZCAiLCBnZXRfaW50X2Zyb21fc3RhY2tfYXQoJmNvbnQsIGkpKTsKCXJldHVybiAwOwp9Cg==