#include <stdio.h>
#include <stddef.h>
// Упрощённая версия одноимённого макроса из ядра Linux. :)
#define container_of(ptr, type, member) ((type *)((char *)ptr - offsetof(type, member)))
typedef struct stack_node
{
struct stack_node* next;
} stack_node;
typedef struct
{
stack_node* top;
} stack;
void push(stack* stk, stack_node* item)
{
item->next = stk->top;
stk->top = item;
}
stack_node* pop(stack* stk)
{
stack_node* item = stk->top;
if (item) stk->top = item->next;
return item;
}
typedef struct
{
char* name;
stack_node sn;
} my_object;
my_object* my_object_from_sn(stack_node* sn_ptr)
{
return container_of(sn_ptr, my_object, sn);
}
int main(void) {
my_object a = {"A"}, b = {"B"}, c = {"C"};
stack stk = {};
push(&stk, &a.sn);
push(&stk, &b.sn);
push(&stk, &c.sn);
stack_node* popped;
while ((popped = pop(&stk)))
printf("Popped %s.\n", my_object_from_sn
(popped
)->name
); return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRkZWYuaD4KCi8vINCj0L/RgNC+0YnRkdC90L3QsNGPINCy0LXRgNGB0LjRjyDQvtC00L3QvtC40LzRkdC90L3QvtCz0L4g0LzQsNC60YDQvtGB0LAg0LjQtyDRj9C00YDQsCBMaW51eC4gOikKI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICgodHlwZSAqKSgoY2hhciAqKXB0ciAtIG9mZnNldG9mKHR5cGUsIG1lbWJlcikpKQoKdHlwZWRlZiBzdHJ1Y3Qgc3RhY2tfbm9kZQp7CglzdHJ1Y3Qgc3RhY2tfbm9kZSogbmV4dDsKfSBzdGFja19ub2RlOwoKdHlwZWRlZiBzdHJ1Y3QKewoJc3RhY2tfbm9kZSogdG9wOwp9IHN0YWNrOwoKdm9pZCBwdXNoKHN0YWNrKiBzdGssIHN0YWNrX25vZGUqIGl0ZW0pCnsKCWl0ZW0tPm5leHQgPSBzdGstPnRvcDsKCXN0ay0+dG9wID0gaXRlbTsKfQoKc3RhY2tfbm9kZSogcG9wKHN0YWNrKiBzdGspCnsKCXN0YWNrX25vZGUqIGl0ZW0gPSBzdGstPnRvcDsKCWlmIChpdGVtKSBzdGstPnRvcCA9IGl0ZW0tPm5leHQ7CglyZXR1cm4gaXRlbTsKfQoKdHlwZWRlZiBzdHJ1Y3QKewoJY2hhciogbmFtZTsKCXN0YWNrX25vZGUgc247Cn0gbXlfb2JqZWN0OwoKbXlfb2JqZWN0KiBteV9vYmplY3RfZnJvbV9zbihzdGFja19ub2RlKiBzbl9wdHIpCnsKCXJldHVybiBjb250YWluZXJfb2Yoc25fcHRyLCBteV9vYmplY3QsIHNuKTsKfQoKaW50IG1haW4odm9pZCkgewoJbXlfb2JqZWN0IGEgPSB7IkEifSwgYiA9IHsiQiJ9LCBjID0geyJDIn07CglzdGFjayBzdGsgPSB7fTsKCXB1c2goJnN0aywgJmEuc24pOwoJcHVzaCgmc3RrLCAmYi5zbik7CglwdXNoKCZzdGssICZjLnNuKTsKCglzdGFja19ub2RlKiBwb3BwZWQ7Cgl3aGlsZSAoKHBvcHBlZCA9IHBvcCgmc3RrKSkpCgkJcHJpbnRmKCJQb3BwZWQgJXMuXG4iLCBteV9vYmplY3RfZnJvbV9zbihwb3BwZWQpLT5uYW1lKTsKCXJldHVybiAwOwp9