/
Sapphire/bin/
Sapphire/db/
Sapphire/db/OLC_rooms/
Sapphire/db/abi/
Sapphire/db/em_src/
Sapphire/db/helps/
Sapphire/db/helps/emman/ifunc/
Sapphire/db/npcs/Tatt/
Sapphire/db/objects/Tatt/
Sapphire/db/q_data/
Sapphire/db/rooms/Tatt/
Sapphire/doc/
Sapphire/doc/em/
Sapphire/etc/
Sapphire/src/abic/
Sapphire/src/areacon/
Sapphire/src/client/
Sapphire/src/embc/
Sapphire/src/emi/
Sapphire/src/emi/test/
Sapphire/src/include/
Sapphire/src/sapphire/em/
Sapphire/src/tcon/
/*
 * 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
 */