/*
* Copyright (C) 1995-1997 Christopher D. Granz
*
* This header may not be removed.
*
* Refer to the file "License" included in this package for further
* information and before using any of the following.
*/
#ifndef __EMC_H__
#define __EMC_H__
#include "emerald.h"
/*
* Defines
*/
#ifdef str_free
#undef str_free
#endif
#define str_free( s ) \
if ( (s) != NULL ) \
free_mem( (void **) &(s) );
#define NODE_IDENTIFIER 61
#define NODE_STRING 62
#define NODE_INT 63
#define NODE_FLOAT 64
#define NODE_INFO 48
#define NODE_FUNCTION 49
#define NODE_OPER_INDEX 50
#define NODE_OPER_FUNC_CALL 51
#define NODE_OPER_INC 52
#define NODE_OPER_DEC 53
#define NODE_UOPER_INC 54
#define NODE_UOPER_DEC 55
#define NODE_UOPER_ADDRESS_OF 56
#define NODE_UOPER_BUILTIN_FUNC 57
#define NODE_UOPER_PLUS 58
#define NODE_UOPER_MINUS 59
#define NODE_UOPER_NOT_EQUAL 60
#define NODE_OPER_MUL 32
#define NODE_OPER_DIV 33
#define NODE_OPER_MOD 34
#define NODE_OPER_ADD 35
#define NODE_OPER_SUB 36
#define NODE_OPER_LEFT 37
#define NODE_OPER_RIGHT 38
#define NODE_ROPER_LESS 39
#define NODE_ROPER_GREATER 40
#define NODE_ROPER_LESS_EQUAL 41
#define NODE_ROPER_GREATER_EQUAL 42
#define NODE_ROPER_EQUAL 43
#define NODE_ROPER_NOT_EQUAL 44
#define NODE_OPER_AND 45
#define NODE_OPER_XOR 46
#define NODE_OPER_OR 47
#define NODE_LOPER_AND 16
#define NODE_LOPER_OR 17
#define NODE_COPER_QUEST 18
#define NODE_COPER_COLON 19
#define NODE_OPER_ASSIGN 20
#define NODE_OPER_MUL_ASSIGN 21
#define NODE_OPER_DIV_ASSIGN 22
#define NODE_OPER_MOD_ASSIGN 23
#define NODE_OPER_ADD_ASSIGN 24
#define NODE_OPER_SUB_ASSIGN 25
#define NODE_OPER_LEFT_ASSIGN 26
#define NODE_OPER_RIGHT_ASSIGN 27
#define NODE_OPER_AND_ASSIGN 28
#define NODE_OPER_XOR_ASSIGN 29
#define NODE_OPER_OR_ASSIGN 30
#define NODE_RETURNED 31
#define NODE_TYPE_INT 1
#define NODE_TYPE_FLOAT 2
#define NODE_TYPE_STRING 3
#define NODE_TYPE_OBJECT 4
#define NODE_TYPE_ARRAY 5
#define NODE_STAR 6
#define NODE_TREE 7
#define NODE_IF 8
#define NODE_ELSE 9
#define NODE_WHILE 10
#define NODE_BROKEN 11
#define NODE_CONTINUED 12
#define NODE_BREAK 13
#define NODE_CONTINUE 14
#define NODE_RETURN 15
/*
* Structures
*/
/*
* One node in the parse tree.
*/
typedef struct node
{
intt iType;
union
{
long lInt;
double dFloat;
char * pString;
struct node * pLeft;
} uL;
struct
{
struct node * pRight;
} uR;
} NODE;
typedef struct tmp_sym_entry
{
struct tmp_sym_entry * pNext;
char * pSymbol;
intt iType;
} TMP_SYM_ENTRY;
typedef struct sym_entry
{
struct sym_entry * pNext;
char * pSymbol;
} SYM_ENTRY;
typedef struct func_entry
{
struct func_entry * pNext;
unsigned short int usiSymName;
flags fFuncFlags;
intt iNumArgs;
intt iNumReturn;
unsigned long ulCodeSize;
byte * pCode;
} FUNC_ENTRY;
/*
* Prototypes
*/
/*
* main.c
*/
int main ( int, char *[] );
void write_emo ( FILE * );
/*
* memory.c
*/
void * alloc_mem ( register size_t );
void * realloc_mem ( register void *, register size_t );
void free_mem ( register void ** );
void zero_out ( register void *, register size_t );
char * str_dup ( register char * );
/*
* fileio.c
*/
FILE * open_file ( char *, char * );
void close_file ( FILE * );
/*
* error.c
*/
void warning ( char *, ... );
void error ( char *, ... );
void fatal ( char *, ... );
/*
* node.c
*/
NODE * node_int ( long );
NODE * node_float ( double );
NODE * node_string ( int, char * );
NODE * node_tree ( int, NODE *, NODE * );
/*
* lex.yy.c
*/
int yylex ( void );
int yywrap ( void );
/*
* y.tab.c
*/
int yyparse ( void );
/*
* Globals
*/
extern int errno;
extern char cNullChar;
extern FILE * yyin;
extern FILE * yyout;
extern char * yytext;
extern NODE * pNodeTree;
extern TMP_SYM_ENTRY pSymbolTable;
extern unsigned short int usiSymbolListSize;
extern SYM_ENTRY * pSymbolList;
extern unsigned short int usiFuncListSize;
extern FUNC_ENTRY * pFuncList;
#endif /* __EMC_H__ */
/*
* End of emc.h
*/