/* * Copyright (C) 1999 Stanley J. Brooks */ /* * from slang-1.3.8. Many header declarations are copied from J.E.D.'s * _slang.h file, since we need some of the hidden intrinsics in order * to deal with: * (1) Char_Type arrays * (2) reference types * (3) SLang_Object_Type * */ #include #include #include #include #include #include #include #include /* we need stripped-down version of SLang_Object_Type for cookies: */ typedef struct { unsigned char data_type; /* SLANG_INT_TYPE, ... */ union { void * p_val; double f_val; }v; } SLang_Object_Type; #if 0 typedef struct _SLang_Name_Type { char *name; struct _SLang_Name_Type *next; char name_type; /* These values must be less than 0x10 because they map directly * to byte codes. See _slang.h. */ #define SLANG_LVARIABLE 0x01 #define SLANG_GVARIABLE 0x02 #define SLANG_IVARIABLE 0x03 /* intrinsic variables */ /* Note!!! For Macro MAKE_VARIABLE below to work, SLANG_IVARIABLE Must be 1 less than SLANG_RVARIABLE!!! */ #define SLANG_RVARIABLE 0x04 /* read only variable */ #define SLANG_INTRINSIC 0x05 #define SLANG_FUNCTION 0x06 #define SLANG_MATH_UNARY 0x07 #define SLANG_APP_UNARY 0x08 #define SLANG_ICONSTANT 0x09 #define SLANG_DCONSTANT 0x0A #define SLANG_PVARIABLE 0x0B /* private */ #define SLANG_PFUNCTION 0x0C /* private */ /* Rest of fields depend on name type */ } SLang_Name_Type; #endif typedef struct { char *name; SLang_Name_Type *next; char name_type; SLang_Object_Type obj; } SLang_Global_Var_Type; /* * some extra internals we need, ripped out of _slang.h */ /* From: _slang.h */ struct _SLong_Ref_Type { int is_global; union { SLang_Name_Type *nt; SLang_Object_Type *local_obj; } v; }; extern int SLang_pop(SLang_Object_Type *); extern void SLang_free_object (SLang_Object_Type *); #if 0 extern int SLang_push(SLang_Object_Type *); /* doesn't handle ref-cts, etc */ #endif extern int _SLpush_slang_obj (SLang_Object_Type *); extern int _SLang_deref_assign (SLang_Ref_Type *); extern int _SLstack_depth(void); /* End: _slang.h */ extern SLang_Name_Type *_SLlocate_global_name (char *name); static void cheats_info(char *s) { SLang_Global_Var_Type *gt; gt = (SLang_Global_Var_Type *) _SLlocate_global_name (s); if (gt) { SLang_vmessage("%s %p vs %p",s,s,gt->name); SLang_vmessage("%s %p %.2x",s,gt,gt->name_type); SLang_vmessage("datatype=%.2x p=%p",(gt->obj).data_type, (gt->obj).v.p_val); } return; } /* static void ref_info(char *s) { SLang_Ref_Type *ref; if (-1 != SLang_pop_ref(&ref)) { SLang_vmessage("%s nt=%p obj=%p",s,ref->nt,ref->); } if (ref) SLang_free_ref(ref); return; } */ #define I SLANG_INT_TYPE #define S SLANG_STRING_TYPE #define V SLANG_VOID_TYPE static SLang_Intrin_Fun_Type Cheats_Fun_Table[] = { MAKE_INTRINSIC_S("cheats_info", cheats_info, V), # if 0 MAKE_INTRINSIC_S("ref_info", ref_info, V), MAKE_INTRINSIC_S("getservbyname", VF_getservbyname, I), MAKE_INTRINSIC_S("inet_addr", VF_inet_addr, I), MAKE_INTRINSIC_I("inet_ntoa", VF_inet_ntoa, S), MAKE_INTRINSIC_S("gethostbyname", VF_gethostbyname, I), MAKE_INTRINSIC_I("gethostbyaddr", VF_gethostbyaddr, S), MAKE_INTRINSIC_0("array_get_string", ar_get_string, V), MAKE_INTRINSIC_0("array_get_u32", ar_get_u32, I), MAKE_INTRINSIC_0("array_put_u32", ar_put_u32, V), # endif SLANG_END_TABLE }; static int VFerrno = 13; static SLang_Intrin_Var_Type Cheats_Var_Table[] = { MAKE_VARIABLE("vf_errno", &VFerrno, I, 1), # if 0 MAKE_VARIABLE("vf_errmsg", &VFerrmsg, S, 1), # endif SLANG_END_TABLE }; #undef I #undef S #undef V int init_cheats_module(void) __attribute__((unused)); int init_cheats_module(void) { if (SLdefine_for_ifdef("CHEATS")) { fprintf(stderr,"cheats: fail define_for_isdef(CHEATS)\n"); return -1; } if (SLadd_intrin_fun_table(Cheats_Fun_Table, "_CHEATS") || SLadd_intrin_var_table(Cheats_Var_Table, NULL)) return -1; return 1; }