#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_DEPTH 50
#define FUNC_STACK_PUSH(st, val) (st.stack[st.len++] = val)
#define FUNC_STACK_INC(st) (st.state++)
#define FUNC_STACK_BACK(st) (st.len--)
#define FUNC_STACK_LAST(st) (st.stack[st.len - 1])
#define FUNC_STACK_REBASE(st) (st.base = st.len)
#define FUNC_STACK_CLEAN(st) \
st.base = 0; \
st.len = 0; \
st.stack[0] = 0
struct func_stack_t
{
int stack[MAX_STACK_DEPTH];
int base;
int len;
};
void stack_info(struct func_stack_t* block)
{
printf("Block len:%d,\nBlock base:%d\n", block->len, block->base);
for (int i = 0; i < MAX_STACK_DEPTH-1; i++)
{
printf("%d,", block->stack[i]);
}
printf("%d\n", block->stack[MAX_STACK_DEPTH-1]);
}
void stack_sub_to_base(struct func_stack_t* block)
{
while(block->base != block->len)
{
block->stack[block->base] += block->stack[--(block->len)];
}
}
int main(int argc, char const *argv[])
{
struct func_stack_t s;
memset(s.stack, 0, sizeof(int) * MAX_STACK_DEPTH);
FUNC_STACK_PUSH(s, 3);
FUNC_STACK_PUSH(s, 3);
FUNC_STACK_PUSH(s, 3);
FUNC_STACK_REBASE(s);
FUNC_STACK_PUSH(s, 5);
FUNC_STACK_PUSH(s, 5);
stack_info(&s);
stack_sub_to_base(&s);
stack_info(&s);
return 0;
}