/* * 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 __EMERALD_H__ #define __EMERALD_H__ #include "sapphire.h" /* * Defines */ #define EM_MAGIC_NUMBER 0x7B041D #define EM_LOADER_VERSION 8 /* * Instruction byte codes. */ #define INSTR_END 0 #define INSTR_NEW_INT 1 #define INSTR_NEW_FLOAT 2 #define INSTR_NEW_STRING 3 #define INSTR_NEW_OBJECT 4 #define INSTR_NEW_ARRAY 5 #define INSTR_PUSH_ZERO 6 #define INSTR_PUSH_ONE 7 #define INSTR_PUSH_INT1 8 #define INSTR_PUSH_INT2 9 #define INSTR_PUSH_INT4 10 #define INSTR_PUSH_FLOAT4 11 #define INSTR_PUSH_FLOAT8 12 #define INSTR_PUSH_STRING 13 #define INSTR_PUSH_ARRAY 14 #define INSTR_PUSH_GLOBAL 15 #define INSTR_PUSH_LOCAL 16 #define INSTR_PUSH_INDEX 17 #define INSTR_POP 18 #define INSTR_CLEAR_GLOBAL /* Not used. */ 19 #define INSTR_CLEAR_LOCAL /* Not used. */ 20 #define INSTR_ASSIGN_GLOBAL 21 #define INSTR_ASSIGN_LOCAL 22 #define INSTR_ASSIGN_INDEX 23 #define INSTR_MULTIPLY 24 #define INSTR_DIVIDE 25 #define INSTR_MODULUS 26 #define INSTR_ADD 27 #define INSTR_SUBTRACT 28 #define INSTR_LSHIFT 29 #define INSTR_RSHIFT 30 #define INSTR_AND 31 #define INSTR_XOR 32 #define INSTR_OR 33 #define INSTR_ONES_COMPLEMENT 34 #define INSTR_JUMP 35 #define INSTR_CAST 36 #define INSTR_COMPARE 37 #define INSTR_CALL_BUILTIN_FUNC 38 #define INSTR_CALL_FUNC 39 #define INSTR_RETURN /* Not used. */ 40 /* * Byte codes translated by the linker. */ #define TRANS_GLOBAL_VAR 75 #define TRANS_BUILTIN_FUNC 76 #define TRANS_FUNC 77 /* * Macros for adding instructions to a byte instruction stream. */ #define ADD_INSTR_I1( p, i ) ( *(p)++ = (i) ) #define ADD_INSTR_I2( p, i ) \ { \ *( (i2 *) (p) ) = (i2) (i); \ (p) += sizeof( i2 ); \ } #define ADD_INSTR_I4( p, i ) \ { \ *( (i4 *) (p) ) = (i4) (i); \ (p) += sizeof( i4 ); \ } #define ADD_INSTR_F4( p, i ) \ { \ *( (f4 *) (p) ) = (f4) (i); \ (p) += sizeof( f4 ); \ } #define ADD_INSTR_F8( p, i ) \ { \ *( (f8 *) (p) ) = (f8) (i); \ (p) += sizeof( f8 ); \ } #define COND_EQUAL 1 #define COND_NOT_EQUAL 2 #define COND_GREATER 3 #define COND_LESS 4 #define COND_GREATER_OR_EQUAL 5 #define COND_LESS_OR_EQUAL 6 #define TYPE_INVALID 1 #define TYPE_VOID 2 #define TYPE_INT 3 #define TYPE_FLOAT 4 #define TYPE_STRING 5 #define TYPE_OBJECT 6 #define TYPE_ARRAY 7 #define OBJ_TYPE_FILE 1 #define OBJ_TYPE_TERM 2 #define OBJ_TYPE_CHAR 3 #define FFLAG_PRIVATE 0x01 #define MAX_ARRAY_SIZE 8192 #define em_setup_abort( ) setjmp( jbAbortJump ) #define em_abort( ) longjmp( jbAbortJump, 1 ) /* * Type defines */ typedef short int i2; typedef long int i4; typedef float f4; typedef double f8; typedef struct em_func EM_FUNC; typedef struct em_value EM_VALUE; typedef struct em_string EM_STRING; typedef struct em_array EM_ARRAY; typedef struct em_object EM_OBJECT; /* * Structures */ struct em_func { short int /* Used at boot time only. */ siFileNumber; char * pName; intt iNumArgs; intt * pArgTypes; int * pArgArrayDim; intt * pArgArrayTypes; intt iNumReturn; intt * pReturnTypes; int * pReturnArrayDim; intt * pReturnArrayTypes; flags fFuncFlags; unsigned long ulCodeSize; byte * pInstrStream; STRUCT_BOOL ( bDynamic ); }; struct em_value { intt iType; union { long lInt; double dFloat; EM_STRING * pString; EM_OBJECT * pObject; EM_VALUE * pMixed; EM_ARRAY * pArray; } u; }; struct em_string { short sLength; char * pString; }; struct em_object { int iObjectType; void * pRealObject; }; struct em_array { short sCount; short sSize; EM_VALUE * pElements; }; struct em_extern_func_type { void ( *pFunc ) ( void ); char * pName; intt iNumArgs; intt iArgTypes[16]; intt iNumReturn; intt iReturnTypes[8]; }; struct _open_file { struct _open_file * pNext; intt iMode; FILE * pFile; }; #ifdef SERVER /* * Prototypes */ /* * emerald.c */ int func_new ( void ); int em_load_obj_file ( char *, bool ); int em_unload_func ( int ); void em_translate ( void ); byte * bct ( byte * ); int em_find_func ( char * ); int em_call_func ( int ); /* * interp.c */ void stack_init ( void ); void stack_free ( void ); void var_stack_push ( register EM_VALUE * ); void var_stack_pop ( register short int ); void var_stack_reset ( void ); bool var_stack_overflow ( void ); void interp_stack_push ( register EM_VALUE * ); void interp_stack_pop ( register short int ); bool interp_stack_overflow ( void ); void init_value ( register EM_VALUE * ); void delete_value ( register EM_VALUE * ); byte * interpret_instruction ( byte * ); /* * array.c */ EM_ARRAY * array_alloc ( register size_t ); void array_free ( register EM_ARRAY * ); EM_ARRAY * array_copy ( register EM_ARRAY * ); /* * error.c */ void print_error ( void ); void em_set_timer ( int ); void em_clear_timer ( void ); void error_check ( void ); byte * bcec ( byte * ); /* * builtin.c */ void em_get_values ( long, ... ); void _lalloc ( void ); void _lallocm ( void ); void _lnullobj ( void ); void _lobjtype ( void ); void _lvstacksize ( void ); void _listacksize ( void ); void _lnumbfuncargs ( void ); void _lnumfuncargs ( void ); void _lopentfile ( void ); void _lclosefile ( void ); void _lcoredump ( void ); /* * ifunc.c */ void _ione_arg ( void ); void _istr_to_int ( void ); void _imud_name ( void ); void _iget_plr_obj ( void ); void _iget_term_obj ( void ); void _inext_char_obj ( void ); void _inext_term_obj ( void ); void _iwrite_to_char ( void ); void _iwrite_to_term ( void ); void _isetup_string_pager ( void ); void _ifinish_string_pager ( void ); void _ipage_string ( void ); /* * Globals */ extern char cErrorBuf[]; extern int iEmError; extern jmp_buf jbAbortJump; extern const struct em_extern_func_type emefCFuncTable[]; extern EM_FUNC ** ppFuncs; extern short int siTopFuncIndex; #endif /* SERVER */ #endif /* __EMERALD_H__ */ /* * End of emerald.h */