35 lines
816 B
C
35 lines
816 B
C
#ifndef _STACK_H
|
|
#define _STACK_H
|
|
#include "types.h"
|
|
|
|
typedef struct {
|
|
number_t *data;
|
|
index_t size;
|
|
index_t sp;
|
|
} stack_t;
|
|
|
|
|
|
/*
|
|
Check for possible stack underflow (should normally not happen, in contrast to stack overflow)
|
|
*/
|
|
#if STACKUNDERFLOWCHECK>0
|
|
#define STACKUNDERFLOW(DS,N,R) if (SEMPTYN(DS,N)) { R->error=ESTACK; return 0; };
|
|
#else
|
|
#define STACKUNDERFLOW(DS,N,R)
|
|
#endif
|
|
|
|
#define SEMPTY(S) S->sp==0
|
|
#define SFULL(S) S->sp==S->size
|
|
#define SEMPTYN(S,n) S->sp<n
|
|
#define SFULLN(S,n) (S->sp+n)>S->size
|
|
#define POP(S) S->data[--S->sp]
|
|
#define PUSH(S,x) S->data[S->sp++]=x
|
|
#define NTH(S,n) S->data[S->sp-n]
|
|
|
|
stack_t * StackAllocate(int size);
|
|
void StackCopy(stack_t *src, stack_t *dst);
|
|
void StackInit(stack_t *S,int size,number_t *data);
|
|
void StackReset(stack_t *S);
|
|
|
|
#endif
|