miller/c/containers/loop_stack.h
2016-05-26 13:24:53 -04:00

35 lines
1.1 KiB
C

// Holds broken/continued flags for loops (for-srec, for-oosvar, while, do-while).
#ifndef LOOP_STACK_H
#define LOOP_STACK_H
#define LOOP_BROKEN 0x8000
#define LOOP_CONTINUED 0x0100
typedef struct _loop_stack_t {
int num_used_minus_one;
int num_allocated;
int* pframes;
} loop_stack_t;
loop_stack_t* loop_stack_alloc();
void loop_stack_free(loop_stack_t* pstack);
// To be used on entry to loop handler.
void loop_stack_push(loop_stack_t* pstack);
// To be used on exit from loop handler.
int loop_stack_pop(loop_stack_t* pstack);
// To be used by break/continue handler.
// NOTE: For efficiency the stack is **NOT** bounds-checked here. E.g. if set is done before a push,
// or after an emptying pop, behavior is unspecified.
void loop_stack_set(loop_stack_t* pstack, int bits);
void loop_stack_clear(loop_stack_t* pstack, int bits);
// To be used by loop handler.
// NOTE: For efficiency the stack is **NOT** bounds-checked here. E.g. if set is done before a push,
// or after an emptying pop, behavior is unspecified.
int loop_stack_get(loop_stack_t* pstack);
#endif // LOOP_STACK_H