theLib 10.0
Loading...
Searching...
No Matches
libmyoox_mox.h
Go to the documentation of this file.
1
9#pragma once
10
11#include <tcl.h>
12#include <tclInt.h>
13#include <tclIntDecls.h>
14#include <stdbool.h>
15#include <assert.h>
17#if META_DEBUG
18# include "debug_mk.h"
19#endif
21#if !defined(MOX_FILE_NAME)
22 #define MOX_FILE_NAME (__builtin_strrchr(__FILE__, '/') ? __builtin_strrchr(__FILE__, '/') + 1 : __FILE__)
23#endif
24
25/*****************************************************************************/
26/* */
27/* Macro_API */
28/* */
29/*****************************************************************************/
31#undef HEADER
32#define HEADER
33
34// If the source of libmyoox is direct used in an external library
35// (without dynamic linking) and this library should *not* export
36// the symbol's of libmyoox then the flag MOX_IGNORE_EXTERN have
37// to be set
38#undef MOX_EXTERN
39#if defined(MOX_IGNORE_EXTERN)
40# define MOX_EXTERN
41#elif defined(PIC)
42 // does we build a DLL ?
43# if defined(DLL_EXPORT)
44 // does we build the libmyoox library ?
45# if defined(MOX_BUILD_DLL)
46# define MOX_EXTERN __declspec(dllexport)
47# else
48# define MOX_EXTERN __declspec(dllimport)
49# endif
50# else
51 // no DLL - architecture specific extern specifier
52# define MOX_EXTERN __attribute__ ((visibility("default")))
53# endif
54#else
56# define MOX_EXTERN
57#endif
59// external data lookup
60#undef MOX_EXTERN_DATA
61#if defined(MOX_PRIVATE)
62# define MOX_EXTERN_DATA extern
63#elif defined(MOX_IGNORE_EXTERN)
64# define MOX_EXTERN_DATA extern
65#elif defined(PIC)
66 // does we build a DLL ?
67# if defined(DLL_EXPORT)
68 // does we build the libmyoox library ?
69# if defined(MOX_BUILD_DLL)
70# define MOX_EXTERN_DATA __declspec(dllexport)
71# else
72# define MOX_EXTERN_DATA __declspec(dllimport)
73# endif
74# else
75 // no DLL - architecture specific extern specifier
76# define MOX_EXTERN_DATA __attribute__ ((visibility("default"))) extern
77# endif
78#else
79# define MOX_EXTERN_DATA extern
80#endif
81
82#undef MOX
83#define MOX(n) libmyoox_ ## n
84#undef NS
85#define NS(n) libmyoox_ ## n
86
87// env ----------------------------------------------------------------------------
88
89#if defined(_MSC_VER)
90
91 #error "ATTENTION: not tested on Microsoft"
92
93 // Visual C++ Express-Edition
94
95 # define __attribute__(dummy)
96 # define __func__ __FUNCTION__
97 # define MOX_CLRCALL __clrcall
98 # define MOX_STDCALL __stdcall
99 # define MOX_CDECL __cdecl
100
101 // helper
102 # define mox_inline static inline
103 # define mox_unlink _unlink
104 # define mox_snprintf _snprintf
105
106 # define MOX_ATTR_HOT ???
107 # define MOX_ATTR_COLD ???
108
109#else // !_MSC_VER
110
111 // GCC
112
113 # define MOX_CLRCALL
114 # define MOX_STDCALL
115 # define MOX_CDECL
116
117 // helper
118 # define mox_inline static inline
119 # define mox_unlink unlink
120 # define mox_snprintf snprintf
121
122 # define MOX_ATTR_HOT __attribute__((hot))
123 # define MOX_ATTR_COLD __attribute__((cold))
124
125#endif // _MSC_VER
126
127#if defined(_MANAGED)
128 # define MOX_DECL MOX_CLRCALL
129#elif defined(META_COMPILE_AS_CC)
130 # define MOX_DECL MOX_STDCALL
131#else
132 # define MOX_DECL MOX_CDECL
133#endif
134
135/*****************************************************************************/
136/* MARK_A */
137/* api ... */
138/* */
139/*****************************************************************************/
140
141#define MOX_UNUSED __attribute__((unused))
142
143#define MOX_SETUP_interp MOX_UNUSED MOX_ENV_T interp = moxrt->interp
144
145typedef ClientData MOX_PTR;
146typedef Tcl_Interp* MOX_ENV_T;
147typedef Tcl_Namespace* MOX_NS_T;
148typedef Tcl_Obj* MOX_CLS_T;
149typedef Tcl_Obj* MOX_OBJ_T;
150typedef const char * MOX_STRN;
151
152#define MOX_RT_SIG 0x66a1499b
153typedef struct {
155
156/*
157 enum MOX_RT_StatusE {
158 MOX_RT_STATUS_NEW = 0,
159 MOX_RT_STATUS_ONEXIT = 1,
160 MOX_RT_STATUS_DELETED = 2,
161 } status;
162*/
163
166
167 #define regTclObj(t) MOX_OBJ_T t;
168 #define regTclObj2(t,v) MOX_OBJ_T t;
169 #define regTclCmd(t) MOX_OBJ_T t;
170 #define regTclArray(m,t) MOX_OBJ_T t[m];
171 #include "libmyoox_registry_mox.h"
172 #undef regTclArray
173 #undef regTclCmd
174 #undef regTclObj
175 #undef regTclObj2
176
177} MOX_RT_S;
179
180#undef MOX
181#define MOX(n) libmyoox_ ## n
182#undef NS
183#define NS(n) libmyoox_ ## n
184
185#define MOX_ARGS MOX_ENV_T interp, int objc, MOX_OBJ_T const objv[]
186#define MOX_ARGS_CALL interp, objc, objv
187
188#define MOX_CMD_ARGS MOX_PTR clientData, MOX_ARGS
189#define MOX_CMD_ARGS_CALL clientData, MOX_ARGS_CALL
190
191#define MOX_CPPXSTR(s) MOX_CPPSTR(s)
192#define MOX_CPPSTR(s) #s
193
194#define MoxErrorStack() \
195 Tcl_AppendResult(interp,"\nERROR-STACK: func=",__func__,", file=",__FILE__,", line=",MOX_CPPXSTR(__LINE__),NULL)
196
197#define regTclCmd(t) MOX_EXTERN int MOX_DECL MOX(t) (MOX_CMD_ARGS);
199#undef regTclCmd
200
201#define ClassN(...) MOX(ClassN_direct)(moxrt,interp,__VA_ARGS__)
203
204#define MoxCreate3N(...) MOX(Create3N_direct)(moxrt,interp,__VA_ARGS__)
206 MOX_RT_T moxrt,
207 MOX_ENV_T interp,
208 MOX_OBJ_T clsNsO,
209 MOX_OBJ_T XnameO,
210 MOX_OBJ_T XnsO,
211 int objc,
212 const MOX_OBJ_T* objv
213);
214
216#define MoxMakeNNN(...) MOX(MakeNNN_direct)(moxrt,interp,__VA_ARGS__)
218 MOX_RT_T moxrt,
219 MOX_ENV_T interp,
220 MOX_OBJ_T clsNsO,
221 MOX_OBJ_T XnameO,
222 MOX_OBJ_T XnsO
223);
224
226#define MoxMakeN(...) MOX(MakeN_direct)(moxrt,interp,__VA_ARGS__)
228 MOX_RT_T moxrt,
229 MOX_ENV_T interp,
230 MOX_OBJ_T clsNsO,
231 MOX_OBJ_T XnameO,
232 MOX_OBJ_T XnsO
233);
234
235#define MoxDestroyN(...) MOX(DestroyN_direct)(moxrt, interp,__VA_ARGS__)
237 MOX_RT_T moxrt,
238 MOX_ENV_T interp,
239 MOX_OBJ_T myNsO
240);
241
242/*****************************************************************************/
243/* MARK_M */
244/* my ... */
245/* */
246/*****************************************************************************/
247
248#define MoxResolveN(nsO) MOX(ResolveN)(interp, nsO)
250{
251 assert(nsO!=NULL);
252 Tcl_Namespace *nsPtr;
253 if (TclGetNamespaceFromObj(interp,nsO,&nsPtr) != TCL_OK)
254 return NULL;
255 return nsPtr;
256}
257
258// ====================================================================================================================
259// namespace eval ...
260
261#define MoxPushN(...) Namespace * nsSave = MOX(NsPush)(interp,__VA_ARGS__)
262mox_inline Namespace* MOX(NsPush)( MOX_ENV_T interp, MOX_NS_T nsPtr ) {
263 Interp *iPtr = (Interp *) interp;
264 Namespace * savedNsPtr = iPtr->varFramePtr->nsPtr;
265 iPtr->varFramePtr->nsPtr = (Namespace *) nsPtr;
266 return savedNsPtr;
267}
268
269#define MoxPopN() MOX(NsPop)(interp,nsSave)
270mox_inline Namespace* MOX(NsPop)( MOX_ENV_T interp, Namespace* savedNsPtr ) {
271 Interp *iPtr = (Interp *) interp;
272 iPtr->varFramePtr->nsPtr = savedNsPtr;
273 return NULL;
274}
275
276#define MoxNsEval(_nsPtr) \
277 Namespace *savedNsPtr=NULL; \
278 for (savedNsPtr = MOX(NsPush)(interp,_nsPtr); savedNsPtr ; savedNsPtr=MOX(NsPop)(interp,savedNsPtr) )
279
280#define MoxNsErrorRaise(_nsPtr) goto error_ ## _nsPtr
281
282#define MoxNsErrorCatch(_nsPtr) error_ ## _nsPtr: MOX_UNUSED ; \
283 if ( savedNsPtr && ((savedNsPtr=MOX(NsPop)(interp,savedNsPtr))==NULL) )
284
285#define MoxNsGetVar(ns,tok) Tcl_ObjGetVar2(interp,moxrt->ns,moxrt->tok,TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG)
286#define MoxNsSetVar(ns,tok,new) Tcl_ObjSetVar2(interp,moxrt->ns,moxrt->tok,new,TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG)
287
288/* old, not used anymore
289#define MoxRefGetVar(ref,tok) Tcl_ObjGetVar2(interp,ref,moxrt->tok,TCL_LEAVE_ERR_MSG)
290#define MoxRefSetVar(ref,tok,new) Tcl_ObjSetVar2(interp,ref,moxrt->tok,new,TCL_LEAVE_ERR_MSG)
291*/
292
293// ---------------------------------------------------------------------------
294// "my" Namespace
295
296#define MoxMy__CLASS__N(nsO) MOX(My__CLASS__N)(moxrt, nsO, TCL_LEAVE_ERR_MSG)
297#define MoxMy__CLASS__NN(nsP,f) MOX(My__CLASS__NN)(moxrt, nsP, f)
298#define MoxMy__CLASS__NNN(f) MOX(My__CLASS__NNN)(moxrt, f)
299
301 return Tcl_ObjGetVar2(moxrt->interp,moxrt->my,moxrt->__CLASS__,TCL_NAMESPACE_ONLY|flags);
302}
303
306 MoxPushN(myNsP);
307 MOX_OBJ_T retO = MoxMy__CLASS__NNN(flags);
308 MoxPopN();
309 return retO;
310}
311
314 if (myNsO==NULL) return NULL;
315 MOX_NS_T myNsP = MoxResolveN(myNsO);
316 if (myNsP==NULL) return NULL;
317 return MoxMy__CLASS__NN(myNsP,flags);
318}
319
320#define MoxMyIsNNN() MOX(MyIsNNN)(moxrt)
321#define MoxMyIsNN(nsP) MOX(MyIsNN)(moxrt,nsP)
322#define MoxMyIsN(nsO) MOX(MyIsN)(moxrt,nsO)
323
325 return MoxMy__CLASS__NNN(0) != NULL;
326}
327
330 bool retB = false;
331 MoxPushN(nsP);
332 retB = MoxMyIsNNN();
333 MoxPopN();
334 return retB;
335}
336
339 MOX_NS_T myNsP = MoxResolveN(nsO);
340 if (myNsP == NULL) return false;
341 return MoxMyIsNN(myNsP);
342}
343
344// ------------------------------------------------------------------------------
345// "cls" Namespace
346
347#define MoxCls__SUPER__NNN(f) MOX(Cls__SUPER__NNN)(moxrt, f)
348#define MoxCls__SUPER__NN(nsP,f) MOX(Cls__SUPER__NN)(moxrt, nsP,f)
349#define MoxCls__SUPER__N(nsO) MOX(Cls__SUPER__N)(moxrt, nsO,TCL_LEAVE_ERR_MSG)
350
352 return Tcl_ObjGetVar2(moxrt->interp,moxrt->cls,moxrt->__SUPER__,TCL_NAMESPACE_ONLY|flags);
353}
354
357 MoxPushN(myNsP);
358 MOX_OBJ_T retO = MoxCls__SUPER__NNN(flags);
359 MoxPopN();
360 return retO;
361}
362
365 if (myNsO==NULL) return NULL;
366 MOX_NS_T myNsP = MoxResolveN(myNsO);
367 if (myNsP==NULL) return NULL;
368 return MoxCls__SUPER__NN(myNsP,flags);
369}
370
371#define MoxCls__NAME__NNN(f) MOX(Cls__NAME__NNN)(moxrt, f)
372#define MoxCls__NAME__NN(nsP,f) MOX(Cls__NAME__NN)(moxrt, nsP,f)
373#define MoxCls__NAME__N(nsO) MOX(Cls__NAME__N)(moxrt, nsO,TCL_LEAVE_ERR_MSG)
374
376 return Tcl_ObjGetVar2(moxrt->interp,moxrt->cls,moxrt->__NAME__,TCL_NAMESPACE_ONLY|flags);
377}
378
381 MoxPushN(myNsP);
382 MOX_OBJ_T retO = MoxCls__NAME__NNN(flags);
383 MoxPopN();
384 return retO;
385}
386
389 if (myNsO==NULL) return NULL;
390 MOX_NS_T myNsP = MoxResolveN(myNsO);
391 if (myNsP==NULL) return NULL;
392 return MoxCls__NAME__NN(myNsP,flags);
393}
394
395#define MoxClsIsNNN() MOX(ClsIsNNN)(moxrt)
396#define MoxClsIsNN(nsP) MOX(ClsIsNN)(moxrt,nsP)
397#define MoxClsIsN(nsO) MOX(ClsIsN)(moxrt,nsO)
398
400 return MoxCls__SUPER__NNN(0) != NULL;
401}
402
405 bool retB = false;
406 MoxPushN(nsP);
407 retB = MoxClsIsNNN();
408 MoxPopN();
409 return retB;
410}
411
414 MOX_NS_T myNsP = MoxResolveN(nsO);
415 if (myNsP == NULL) return false;
416 return MoxClsIsNN(myNsP);
417}
418
419#define MoxCls__NS__NNN(f) MOX(Cls__NS__NNN)(moxrt, f)
420#define MoxCls__NS__NN(nsP,f) MOX(Cls__NS__NN)(moxrt, nsP,f)
421#define MoxCls__NS__N(nsO) MOX(Cls__NS__N)(moxrt, nsO,TCL_LEAVE_ERR_MSG)
422
424 return Tcl_ObjGetVar2(moxrt->interp,moxrt->cls,moxrt->__NS__,TCL_NAMESPACE_ONLY|flags);
425}
426
427mox_inline MOX_OBJ_T MOX(Cls__NS__NN) ( MOX_RT_T moxrt, MOX_NS_T myNsP, int flags ) {
429 MoxPushN(myNsP);
430 MOX_OBJ_T retO = MoxCls__NS__NNN(flags);
431 MoxPopN();
432 return retO;
433}
434
435mox_inline MOX_OBJ_T MOX(Cls__NS__N) ( MOX_RT_T moxrt, MOX_OBJ_T myNsO, int flags ) {
437 if (myNsO==NULL) return NULL;
438 MOX_NS_T myNsP = MoxResolveN(myNsO);
439 if (myNsP==NULL) return NULL;
440 return MoxCls__NS__NN(myNsP,flags);
441}
442
443#undef HEADER
#define MoxCls__SUPER__NN(nsP, f)
#define MoxClsIsNNN()
mox_inline bool MOX ClsIsNNN(MOX_RT_T moxrt)
#define MoxPushN(...)
#define MoxClsIsNN(nsP)
mox_inline MOX_OBJ_T MOX My__CLASS__N(MOX_RT_T moxrt, MOX_OBJ_T myNsO, int flags)
mox_inline MOX_OBJ_T MOX Cls__NS__NN(MOX_RT_T moxrt, MOX_NS_T myNsP, int flags)
Tcl_Obj * MOX_CLS_T
mox_inline bool MOX MyIsNN(MOX_RT_T moxrt, MOX_NS_T nsP)
#define mox_inline
mox_inline MOX_OBJ_T MOX Cls__NS__NNN(MOX_RT_T moxrt, int flags)
mox_inline MOX_NS_T MOX ResolveN(MOX_ENV_T interp, MOX_OBJ_T nsO)
#define MoxMyIsNN(nsP)
ClientData MOX_PTR
#define MOX_SETUP_interp
#define MoxPopN()
mox_inline MOX_OBJ_T MOX Cls__NAME__NNN(MOX_RT_T moxrt, int flags)
#define MOX_EXTERN
static library
mox_inline MOX_OBJ_T MOX Cls__NS__N(MOX_RT_T moxrt, MOX_OBJ_T myNsO, int flags)
MOX_EXTERN MOX_OBJ_T MOX_DECL MOX MakeN_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XnameO, MOX_OBJ_T XnsO)
Tcl_Interp * MOX_ENV_T
mox_inline bool MOX MyIsNNN(MOX_RT_T moxrt)
mox_inline bool MOX ClsIsNN(MOX_RT_T moxrt, MOX_NS_T nsP)
MOX_EXTERN int MOX_DECL MOX DestroyN_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T myNsO)
mox_inline MOX_OBJ_T MOX Cls__SUPER__N(MOX_RT_T moxrt, MOX_OBJ_T myNsO, int flags)
mox_inline MOX_OBJ_T MOX My__CLASS__NNN(MOX_RT_T moxrt, int flags)
#define MoxResolveN(nsO)
#define MoxMyIsNNN()
mox_inline Namespace *MOX NsPop(MOX_ENV_T interp, Namespace *savedNsPtr)
MOX_EXTERN MOX_OBJ_T MOX_DECL MOX MakeNNN_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XnameO, MOX_OBJ_T XnsO)
mox_inline bool MOX ClsIsN(MOX_RT_T moxrt, MOX_OBJ_T nsO)
#define MoxCls__NAME__NNN(f)
MOX_RT_S * MOX_RT_T
Tcl_Obj * MOX_OBJ_T
mox_inline MOX_OBJ_T MOX Cls__SUPER__NN(MOX_RT_T moxrt, MOX_NS_T myNsP, int flags)
#define MoxCls__SUPER__NNN(f)
mox_inline MOX_OBJ_T MOX My__CLASS__NN(MOX_RT_T moxrt, MOX_NS_T myNsP, int flags)
#define MOX(n)
const char * MOX_STRN
#define MoxMy__CLASS__NN(nsP, f)
Tcl_Namespace * MOX_NS_T
MOX_EXTERN int MOX_DECL MOX Create3N_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XnameO, MOX_OBJ_T XnsO, int objc, const MOX_OBJ_T *objv)
#define MoxMy__CLASS__NNN(f)
mox_inline MOX_OBJ_T MOX Cls__NAME__N(MOX_RT_T moxrt, MOX_OBJ_T myNsO, int flags)
mox_inline MOX_OBJ_T MOX Cls__SUPER__NNN(MOX_RT_T moxrt, int flags)
mox_inline bool MOX MyIsN(MOX_RT_T moxrt, MOX_OBJ_T nsO)
#define MoxCls__NS__NN(nsP, f)
mox_inline MOX_OBJ_T MOX Cls__NAME__NN(MOX_RT_T moxrt, MOX_NS_T myNsP, int flags)
MOX_EXTERN int MOX_DECL MOX ClassN_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XcodeO)
#define MOX_DECL
#define MoxCls__NAME__NN(nsP, f)
mox_inline Namespace *MOX NsPush(MOX_ENV_T interp, MOX_NS_T nsPtr)
#define MoxCls__NS__NNN(f)
tag: nhi1-release-250425
MOX_NS_T myooxNs
MOX_ENV_T interp