#ifndef INTERPRETER_H
#define INTERPRETER_H
#include <math.h>
#include <inttypes.h>
#include "cmdlist.c"
void myprint(char * s);
//#define FOR_DEBUGGER
using namespace std;
#ifdef FOR_DEBUGGER
extern uint64_t *pc;
extern uint64_t *prog;
#define MAINDISPATCH goto *labels[*pc++]
#define DISPATCH return -1
int interpret();
void pushpar(uint64_t progpar);
#else
#define MAINDISPATCH DISPATCH
#define DISPATCH goto *labels[*pc++]
int interpret(uint64_t *prog, uint64_t progpar);
#endif //FOR_DEBUGGER
#define GETPAR *pc++
#define PUSH(x) datastack[++datastackindex].u = x
#define PUSHFLOAT(x) datastack[++datastackindex].d = x
#define POP datastack[datastackindex--]
#define TOS datastack[datastackindex]
#define PUSHCALLSTACK(x) callstack[++callstackindex] = x
#define POPCALLSTACK callstack[callstackindex--]
#define STACKSIZE 256
#define LOCALSSIZE 8192
typedef union {
uint64_t u;
int64_t i;
double d;
uint64_t *p;
} data64bit;
extern uint8_t datastackindex;
extern uint8_t callstackindex;
extern data64bit datastack[STACKSIZE];
extern uint64_t callstack[STACKSIZE];
extern data64bit locals[LOCALSSIZE];
uint64_t *loadscript(int state_index, char *waspath);
#endif // INTERPRETER_H