#ifndef STACK_H
#define STACK_H
#include <assert.h>
#include <stdlib.h>
#define stack_of(T) struct { size_t top; T value[]; }
#define operate(list, ...) { \
size_t x = list ? list->top : 0 \
, y = x + 1; \
if ((x & y) == 0) { \
void *temp = realloc(list, sizeof *list \
+ (x + y) * sizeof list->value[0]); \
if (!temp) \
return EXIT_FAILURE; \
list = temp; \
} \
__VA_ARGS__; \
}
#define push(list, v) operate(list, list->value[x] = v; list->top = y)
#define pop(list) (assert(list && list->top), list->value[--list->top]); \
operate(list, )
#endif
// #include "stack.h" // embedded above
#include <stdio.h>
int main(void) {
stack_of(int) *fubar = NULL;
int x;
push(fubar, 42);
push(fubar, -1);
x
= pop
(fubar
); printf("popped: %d\n", x
); x
= pop
(fubar
); printf("popped: %d\n", x
); x
= pop
(fubar
); printf("popped: %d\n", x
);}
I2lmbmRlZiBTVEFDS19ICiNkZWZpbmUgU1RBQ0tfSAojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2RlZmluZSBzdGFja19vZihUKSBzdHJ1Y3QgeyBzaXplX3QgdG9wOyBUIHZhbHVlW107IH0KIAojZGVmaW5lIG9wZXJhdGUobGlzdCwgLi4uKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBzaXplX3QgeCA9IGxpc3QgPyBsaXN0LT50b3AgOiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgLCB5ID0geCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgaWYgKCh4ICYgeSkgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgdm9pZCAqdGVtcCA9IHJlYWxsb2MobGlzdCwgc2l6ZW9mICpsaXN0ICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoeCArIHkpICogc2l6ZW9mIGxpc3QtPnZhbHVlWzBdKTsgXAogICAgICAgIGlmICghdGVtcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBsaXN0ID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBfX1ZBX0FSR1NfXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKfQogCiNkZWZpbmUgcHVzaChsaXN0LCB2KSBvcGVyYXRlKGxpc3QsIGxpc3QtPnZhbHVlW3hdID0gdjsgbGlzdC0+dG9wID0geSkKI2RlZmluZSBwb3AobGlzdCkgKGFzc2VydChsaXN0ICYmIGxpc3QtPnRvcCksIGxpc3QtPnZhbHVlWy0tbGlzdC0+dG9wXSk7IFwKICAgICAgICAgICAgICAgICAgb3BlcmF0ZShsaXN0LCApCiNlbmRpZgoKLy8gI2luY2x1ZGUgInN0YWNrLmgiIC8vIGVtYmVkZGVkIGFib3ZlCiNpbmNsdWRlIDxzdGRpby5oPgppbnQgbWFpbih2b2lkKSB7CiAgICBzdGFja19vZihpbnQpICpmdWJhciA9IE5VTEw7CiAgICBpbnQgeDsKICAgIHB1c2goZnViYXIsIDQyKTsKICAgIHB1c2goZnViYXIsIC0xKTsKICAgIHggPSBwb3AoZnViYXIpOyBwcmludGYoInBvcHBlZDogJWRcbiIsIHgpOwogICAgeCA9IHBvcChmdWJhcik7IHByaW50ZigicG9wcGVkOiAlZFxuIiwgeCk7CiAgICB4ID0gcG9wKGZ1YmFyKTsgcHJpbnRmKCJwb3BwZWQ6ICVkXG4iLCB4KTsKICAgIGZyZWUoZnViYXIpOwp9