// TinC - Tiny, in C
// tinc.h

#define COMPILER "TinC v1.0\n\n"

/*--------------------------------------------------------------*/
/* A clutch of constants */

#define FALSE        	0
#define TRUE         	-1
#define EXIT_SUCCESS 	0
#define EXIT_FAIL    	1
#define STRTMPSIZE   	256

#define TAB             '\t'
#define CR              '\015'
#define LF              '\n'

#define MAXSYMSIZE	16
#define MAXGLOBALS      1000
#define MAXLOCALS	64
#define MAXSTAGE	99000


/*--------------------------------------------------------------*/
/* Definition of Token Types, etc */

typedef char  Symbol[MAXSYMSIZE+1];

#define NKW             8
#define NKW1            9

static Symbol KWlist[NKW] =    {"if", "else", "endif", "while",
				"endwhile", "char", "end", "int"
			       };

#define TOK_IDENTIFIER 'x'
#define TOK_IF         'i'
#define TOK_ELSE       'l'
#define TOK_ENDIF      'e'
#define TOK_WHILE      'w'
#define TOK_ENDWHILE   'e'
#define TOK_CHARDEF    'c'
#define TOK_END        'e'
#define TOK_NUM        '#'
#define TOK_INTDEF     'j'

static char KWcode[NKW1 + 1] = {TOK_IDENTIFIER, TOK_IF, TOK_ELSE, TOK_ENDIF,
				TOK_WHILE, TOK_ENDWHILE, TOK_CHARDEF, TOK_END,
				TOK_INTDEF
				};

/*--------------------------------------------------------------*/
/* Data Type Sizes (in base units) - used in SizeOfType() */

// is the stack character (byte) or word based? ...

#define CHARSTACK	TRUE

#ifdef CHARSTACK
#define SIZEOFCHAR	1
#define SIZEOFINT	2
#else
#define SIZEOFCHAR	1
#define SIZEOFINT	1
#endif


/*--------------------------------------------------------------*/
/* return codes for WhatIs() */

#define UNKNOWN		0
#define LOCAL		1
#define GLOBAL		2


/*--------------------------------------------------------------*/
/* pcode definitions */

#define PC_LABEL               0
#define PC_CLEAR_PRIMARY       1
#define PC_NEGATE_PRIMARY      2
#define PC_NOT_PRIMARY         3
#define PC_MOVE_CONST_PRIMARY  4
#define PC_MOVE_VAR_PRIMARY    5
#define PC_PUSH_PRIMARY        6
#define PC_POPADD_PRIMARY      7
#define PC_POPSUB_PRIMARY      8
#define PC_POPMUL_PRIMARY      9
#define PC_POPDIV_PRIMARY      10
#define PC_POPAND_PRIMARY      11
#define PC_POPOR_PRIMARY       12
#define PC_POPXOR_PRIMARY      13
#define PC_POPCMP_PRIMARY      14
#define PC_SET_PRIMARY_EQ      15
#define PC_SET_PRIMARY_NE      16
#define PC_SET_PRIMARY_LT      17
#define PC_SET_PRIMARY_GT      18
#define PC_SET_PRIMARY_GE      19
#define PC_SET_PRIMARY_LE      20
#define PC_MOVE_PRIMARY_VAR    21
#define PC_BRANCH              22
#define PC_BRANCH_FALSE        23
#define PC_HEADER              24
#define PC_PROLOG              25
#define PC_EPILOG              26
#define PC_ALLOCATE            27
#define PC_GROWSTACK	       28
#define PC_SHRINKSTACK	       29

#define PC_MOVE_LVAR_PRIMARY   30
#define PC_MOVE_PRIMARY_LVAR   31

#define PC_MOVE_A_PRIMARY      32
#define PC_MOVE_AL_PRIMARY     33
#define PC_POP_SECONDARY       34
#define PC_ADJUST_SECONDARY    35
#define PC_MOVE_SI_PRIMARY     36
#define PC_ADD_PRIMARY_SEC     37
#define PC_MOVE_PRIMARY_SI     38
#define PC_PUSH_SECONDARY      39
#define PC_PRIMARY_SECONDARY   40
