jweinst1
9/30/2018 - 3:54 AM

stack.c

#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;
}