00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef INC_SML_FUNCSIG_H
00019 #define INC_SML_FUNCSIG_H
00020
00021 #ifndef INC_MI32_STDDEFNS_H
00022 #include <mi32/stddefns.h>
00023 #endif
00024
00034
00035 #define ARGT_v 0 // (void) (return type only)
00036 #define ARGT_b 1 // (bool)
00037 #define ARGT_d 2 // (double)
00038 #define ARGT_i 3 // (INT32)
00039 #define ARGT_u 4 // (UINT32)
00040 #define ARGT_pv 5 // (void*)
00041 #define ARGT_U 6 // (MIUNICODE*)
00042 #define ARGT_cU 7 // (const MIUNICODE*)
00043 #define ARGT_c 8 // (char*)
00044 #define ARGT_cc 9 // (const char*)
00045 #define ARGT_pva 10 // (void*) that we need to free
00046
00047 #define DEFSIG0(ret) (ret)
00048 #define DEFSIG1(ret, a) (a << 4) | ret
00049 #define DEFSIG2(ret, a, b) (b << 8) | (a << 4) | ret
00050 #define DEFSIG3(ret, a, b, c) (c << 12) | (b << 8) | (a << 4) | ret
00051 #define DEFSIG4(ret, a, b, c, d) (d << 16) | (c << 12) | (b << 8) | (a << 4) | ret
00052
00053
00054
00055
00056
00058
00059
00060 #define DEFSIG_0(LHS, TYPE, RHS, N) \
00061 LHS##TYPE = (RHS | (ARGT_##TYPE << ((N)*4))),
00062
00063 #define DEFSIG_1(LHS, TYPE, RHS, N) \
00064 LHS##TYPE = (RHS | (ARGT_##TYPE << ((N)*4))), \
00065 DEFSIG_0(LHS##TYPE##_, d, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00066 DEFSIG_0(LHS##TYPE##_, b, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00067 DEFSIG_0(LHS##TYPE##_, i, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00068 DEFSIG_0(LHS##TYPE##_, u, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00069 DEFSIG_0(LHS##TYPE##_, pv, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00070 DEFSIG_0(LHS##TYPE##_, U, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00071 DEFSIG_0(LHS##TYPE##_, cU, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00072 DEFSIG_0(LHS##TYPE##_, c, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00073 DEFSIG_0(LHS##TYPE##_, cc, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00074
00075 #define DEFSIG_2(LHS, TYPE, RHS, N) \
00076 LHS##TYPE = (RHS | (ARGT_##TYPE << ((N)*4))), \
00077 DEFSIG_1(LHS##TYPE##_, d, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00078 DEFSIG_1(LHS##TYPE##_, b, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00079 DEFSIG_1(LHS##TYPE##_, i, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00080 DEFSIG_1(LHS##TYPE##_, u, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00081 DEFSIG_1(LHS##TYPE##_, pv, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00082 DEFSIG_1(LHS##TYPE##_, U, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00083 DEFSIG_1(LHS##TYPE##_, cU, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00084 DEFSIG_1(LHS##TYPE##_, c, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00085 DEFSIG_1(LHS##TYPE##_, cc, (RHS | (ARGT_##TYPE << ((N) * 4))), N+1) \
00086
00087 #define DEFSIG DEFSIG_2(SIG_, v, 0, 0) \
00088 DEFSIG_2(SIG_, d, 0, 0) \
00089 DEFSIG_2(SIG_, b, 0, 0) \
00090 DEFSIG_2(SIG_, i, 0, 0) \
00091 DEFSIG_2(SIG_, u, 0, 0) \
00092 DEFSIG_2(SIG_, pv, 0, 0) \
00093 DEFSIG_2(SIG_, U, 0, 0) \
00094 DEFSIG_2(SIG_, cU, 0, 0) \
00095 DEFSIG_2(SIG_, c, 0, 0) \
00096 DEFSIG_2(SIG_, cc, 0, 0) \
00097 DEFSIG_2(SIG_, pva, 0, 0)
00098
00099
00124 enum SMLFUNCSIG {
00125 SIG_OldStyle = 0,
00126 DEFSIG
00139
00140 SIG_v_i_i_b = DEFSIG3(ARGT_v, ARGT_i, ARGT_i, ARGT_b),
00141 SIG_v_i_i_i = DEFSIG3(ARGT_v, ARGT_i, ARGT_i, ARGT_i),
00142 SIG_v_i_i_i_b = DEFSIG4(ARGT_v, ARGT_i, ARGT_i, ARGT_i, ARGT_b),
00143 SIG_v_d_d_b = DEFSIG3(ARGT_v, ARGT_d, ARGT_d, ARGT_b),
00144 SIG_v_d_d_d = DEFSIG3(ARGT_v, ARGT_d, ARGT_d, ARGT_d),
00145 SIG_v_d_d_d_d = DEFSIG4(ARGT_v, ARGT_d, ARGT_d, ARGT_d, ARGT_d),
00146 SIG_v_pv_cU_i = DEFSIG3(ARGT_v, ARGT_pv, ARGT_cU, ARGT_i),
00147 SIG_v_pv_pv_pv = DEFSIG3(ARGT_v, ARGT_pv, ARGT_pv, ARGT_pv),
00148 SIG_v_pv_pv_d = DEFSIG3(ARGT_v, ARGT_pv, ARGT_pv, ARGT_d),
00149 SIG_i_pv_b_pv = DEFSIG3(ARGT_i, ARGT_pv, ARGT_b, ARGT_pv),
00150 SIG_i_pv_pv_pv_d = DEFSIG4(ARGT_i, ARGT_pv, ARGT_pv, ARGT_pv, ARGT_d),
00151 SIG_i_u_pv_pv = DEFSIG3(ARGT_i, ARGT_u, ARGT_pv, ARGT_pv),
00152 SIG_i_i_d_d = DEFSIG3(ARGT_i, ARGT_i, ARGT_d, ARGT_d),
00153 SIG_i_i_i_d = DEFSIG3(ARGT_i, ARGT_i, ARGT_i, ARGT_d),
00154 SIG_i_pv_d_d = DEFSIG3(ARGT_i, ARGT_pv, ARGT_d, ARGT_d),
00155 SIG_i_d_d_d = DEFSIG3(ARGT_i, ARGT_d, ARGT_d, ARGT_d),
00156 SIG_i_d_pv_d_d = DEFSIG4(ARGT_i, ARGT_d, ARGT_pv, ARGT_d, ARGT_d),
00157 SIG_i_pv_pv_b = DEFSIG3(ARGT_i, ARGT_pv, ARGT_pv, ARGT_b),
00158
00159 SIG_LAST
00160 };
00161
00163 typedef void (*FUNCPTR_v)();
00165 typedef double (*FUNCPTR_d)();
00167 typedef bool (*FUNCPTR_b)();
00169 typedef INT32 (*FUNCPTR_i)();
00171 typedef UINT32 (*FUNCPTR_u)();
00173 typedef void* (*FUNCPTR_vp)();
00175 typedef MIUNICODE* (*FUNCPTR_U)();
00177 typedef const MIUNICODE* (*FUNCPTR_cU)();
00179 typedef char* (*FUNCPTR_c)();
00181 typedef const char* (*FUNCPTR_cc)();
00182
00184 typedef void (*FUNCPTR_v_b)(bool);
00185
00186 namespace SML {
00187
00188 typedef enum ::SMLFUNCSIG FUNCSIG;
00189
00191 inline int FUNCSIG_GetNumParms (
00192 SMLFUNCSIG sig
00193 ) {
00194 UINT32 x = sig;
00195 int num = 0;
00196 x >>= 4;
00197 while (x) {
00198 x >>= 4;
00199 ++num;
00200 }
00201 return num;
00202 }
00203
00205 inline SMLFUNCSIG FUNCSIG_GetRetType (
00206 SMLFUNCSIG sig
00207 ) {
00208 UINT32 x = sig;
00209 return ((SMLFUNCSIG)(x & 0x0F));
00210 }
00211
00213 inline SMLFUNCSIG FUNCSIG_GetParmType (
00214 SMLFUNCSIG sig,
00215 int n
00216 ) {
00217 UINT32 x = sig;
00218 x >>= ((n + 1) * 4);
00219 return ((SMLFUNCSIG)(x & 0x0F));
00220 }
00221
00222 }
00223
00224
00225 #endif // INC_SML_FUNCSIG_H
00226
00227