int g(void); // get next unicode character. void back(void); // forget I got last character. void loc(void); // report where I am in source. // The lines above are prototypes for file g.c #include #define codesize 5000 #define worksize 100000 #define md 100 // md may not exceed 252! typedef unsigned short us; typedef unsigned char uchar; typedef unsigned int ui; typedef unsigned long long int nis; typedef uchar * cp; struct env; typedef struct{struct env * e; cp c;} fun; typedef struct val pf(nis); typedef struct val {uchar tag; union{nis i; fun f; pf * p;} u;} val; // tag=0 for i; tag=1 for f; tag=2 for p. typedef struct env {int refcnt; val v; struct env * out;} env; // void pev(cp, env*); void prv(val); extern int cc; // debugging stuff extern ui symbols[md]; extern int cd; // current depth extern uchar code[codesize]; extern cp cx; // cursor for compiled code. void crsh(char*, cp) __dead2; void Bye(char *) __dead2; // '__dead2' is unrecognized by earlier gccs. // It declares that routine never returns and thus eliminates some warnings and dead code. void compile(void); val eval(cp, env *); env * gw(void); void pm(void); void init(void); void dc(env *);