theLib 10.0
Loading...
Searching...
No Matches
libmyoox_mox.c File Reference

tag: nhi1-release-250425 More...

#include "libmyoox_private_mox.h"
#include <stdlib.h>
#include <errno.h>
#include "libmyoox_registry_mox.h"
+ Include dependency graph for libmyoox_mox.c:

Go to the source code of this file.

Macros

#define NamespaceTail(...)
 
#define MoxClsNewInstName()
 
#define MoxIsNotOk(cmd)
 
#define MoxSetVar(tok, val)
 
#define MoxSetVar(tok, val)
 
#define CtorNNN_direct(...)
 
#define MoxRtFree(tok)
 
#define regTclObj2(t, v)
 
#define regTclObj(t)
 
#define regTclCmd(t)
 
#define regTclObj2(t, v)
 
#define regTclObj(t)
 
#define regTclCmd(t)
 
#define MoxObjCmd(nme)
 
#define regTclCmd(t)
 

Functions

mox_inline MOX_OBJ_T libmyoox_NamespaceTailObjCmd (MOX_OBJ_T nameO)
 
int libmyoox__InspectI (MOX_CMD_ARGS)
 
mox_inline MOX_OBJ_T libmyoox_ClsNewInstName (MOX_ENV_T interp, MOX_RT_T moxrt)
 
int libmyoox_ClassN_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XcodeO)
 
int libmyoox_ClassN (MOX_CMD_ARGS)
 
MOX_OBJ_T libmyoox_MakeNNN_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T XnameO, MOX_OBJ_T XnsO)
 
MOX_OBJ_T libmyoox_MakeN_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T Xname, MOX_OBJ_T Xns)
 used in public code
 
int libmyoox_MakeN (MOX_CMD_ARGS)
 
static int libmyoox_CtorNNN_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T myNsO, int argc, const MOX_OBJ_T *argv)
 
int libmyoox_CtorN (MOX_CMD_ARGS)
 
int libmyoox_DestroyN_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T myNsO)
 
int libmyoox_DestroyN (MOX_CMD_ARGS)
 
int libmyoox_Create3N_direct (MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T clsNsO, MOX_OBJ_T Xname, MOX_OBJ_T Xns, int objc, const MOX_OBJ_T *objv)
 
int libmyoox_Create3N (MOX_CMD_ARGS)
 
int libmyoox_Create2N (MOX_CMD_ARGS)
 
int libmyoox_Create1N (MOX_CMD_ARGS)
 
int libmyoox_NewN (MOX_CMD_ARGS)
 
MOX_EXTERN int _Myoox_Unload (MOX_ENV_T interp, int flags)
 

Detailed Description

tag: nhi1-release-250425

Definition in file libmyoox_mox.c.

Macro Definition Documentation

◆ CtorNNN_direct

#define CtorNNN_direct ( ...)
Value:
NS(CtorNNN_direct)(moxrt,interp,__VA_ARGS__)
#define CtorNNN_direct(...)
#define NS(n)

Definition at line 334 of file libmyoox_mox.c.

◆ MoxClsNewInstName

#define MoxClsNewInstName ( )
Value:
NS(ClsNewInstName)(interp,moxrt)

Definition at line 57 of file libmyoox_mox.c.

◆ MoxIsNotOk

#define MoxIsNotOk ( cmd)
Value:
((retI=(cmd))!=TCL_OK)

◆ MoxObjCmd

#define MoxObjCmd ( nme)
Value:
do { \
cmd = Tcl_CreateObjCommand(interp, "::myooX::" #nme, NS(nme), moxrt, NULL) ; \
if (cmd == NULL) return TCL_ERROR; \
} while (0)

◆ MoxRtFree

#define MoxRtFree ( tok)
Value:
if (moxrt->tok) Tcl_DecrRefCount(moxrt->tok)

◆ MoxSetVar [1/2]

#define MoxSetVar ( tok,
val )
Value:
if ( MoxNsSetVar(cls,tok,val) == NULL ) break
#define MoxNsSetVar(ns, tok, new)

◆ MoxSetVar [2/2]

#define MoxSetVar ( tok,
val )
Value:
if ( MoxNsSetVar(my,tok,val) == NULL ) break

◆ NamespaceTail

#define NamespaceTail ( ...)
Value:
NS(NamespaceTailObjCmd)(__VA_ARGS__)

Definition at line 17 of file libmyoox_mox.c.

◆ regTclCmd [1/3]

#define regTclCmd ( t)
Value:
#define MoxRtFree(tok)

◆ regTclCmd [2/3]

#define regTclCmd ( t)
Value:
#define regTclObj2(t, v)

◆ regTclCmd [3/3]

#define regTclCmd ( t)
Value:
#define MoxObjCmd(nme)

◆ regTclObj [1/2]

#define regTclObj ( t)
Value:

◆ regTclObj [2/2]

#define regTclObj ( t)
Value:

◆ regTclObj2 [1/2]

#define regTclObj2 ( t,
v )
Value:

◆ regTclObj2 [2/2]

#define regTclObj2 ( t,
v )
Value:
moxrt->t = STR2VAL(v); Tcl_IncrRefCount(moxrt->t)
#define STR2VAL(str)

Function Documentation

◆ _Myoox_Unload()

MOX_EXTERN int _Myoox_Unload ( MOX_ENV_T interp,
int flags )

Definition at line 649 of file libmyoox_mox.c.

650{
651 MOX_NS_T ns = Tcl_FindNamespace(interp,"::myooX",NULL,TCL_GLOBAL_ONLY);
652 if (ns != NULL) Tcl_DeleteNamespace(ns);
653 return TCL_OK;
654}
Tcl_Namespace * MOX_NS_T

◆ libmyoox__InspectI()

int libmyoox__InspectI ( MOX_CMD_ARGS )

Definition at line 39 of file libmyoox_mox.c.

40{
42 if (objc < (1+__skip)) {
43 Tcl_WrongNumArgs(interp,__skip,objv,"varName ...");
44 return TCL_ERROR;
45 }
46 char *NL="";
47 MOX_OBJ_T ret = Tcl_NewObj();
48 for (int i=1; i<objc ; i++) {
49 Tcl_AppendPrintfToObj(ret,"%s[%d] %s",NL,i,NS(_InspectI_direct)(objv[i]));
50 NL="\n";
51 }
52 Tcl_SetObjResult(interp,ret);
53 return TCL_OK;
54};
Tcl_Obj * MOX_OBJ_T
#define MOX_SETUP_hdl_static

◆ libmyoox_ClassN()

int libmyoox_ClassN ( MOX_CMD_ARGS )

Definition at line 154 of file libmyoox_mox.c.

155{
157 if (objc < (1+__skip) || objc > (2+__skip)) {
158 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs ?Xcode?");
159 return TCL_ERROR;
160 }
161 MOX_OBJ_T clsNsO = objv[__skip++];
162 MOX_OBJ_T Xcode = __skip < objc ? objv[__skip++] : NULL;
163
164 return ClassN(clsNsO, Xcode);
165}
#define ClassN(...)

◆ libmyoox_ClassN_direct()

int libmyoox_ClassN_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T clsNsO,
MOX_OBJ_T XcodeO )

MARK_C CODE

Definition at line 93 of file libmyoox_mox.c.

98 {
99 assert(clsNsO != NULL);
100 MOX_STRN clsNsC = VAL2STR(clsNsO);
101
102 // check if clsNsO is a valid tcl namespace
103 MOX_NS_T clsNsP = Tcl_FindNamespace(interp,clsNsC,NULL,TCL_GLOBAL_ONLY);
104 if (clsNsP==NULL) {
105 clsNsP = Tcl_CreateNamespace(interp,clsNsC,NULL,NULL);
106 if (clsNsP==NULL) return TCL_ERROR;
107 }
108
109 MOX_OBJ_T clsRefO = Tcl_ObjPrintf("%s::cls", clsNsC);
110 clsRefO = Tcl_ObjSetVar2(interp,moxrt->clsNs2Ref,clsNsO,clsRefO,TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG);
111 if (clsRefO == NULL) return TCL_ERROR;
112
113 int retI = TCL_ERROR;
114 #define MoxIsNotOk(cmd) ((retI=(cmd))!=TCL_OK)
115 MoxNsEval(clsNsP) {
116 // namespace path ::myooX
117 {
118 RL_init(3,ns_path, RL_NewC(0,namespace); RL_NewC(1,path); RL_NewS(2,"::myooX")) ;
119 if (MoxIsNotOk(RL_EvalEx(0))) break;
120 }
121
122 #define MoxSetVar(tok,val) if ( MoxNsSetVar(cls,tok,val) == NULL ) break
123 MoxSetVar(__NS__ , clsNsO) ; // set cls(__NS__) $clsNs
124 MoxSetVar(__NAME__ , NamespaceTail(clsNsO)) ; // set cls(__NAME__) [namespace tail $clsNs]
125 MoxSetVar(__SUPER__ , Tcl_NewObj()) ; // set cls(__SUPER__) ""
126 MoxSetVar(__NS_ALL_SORTED__ , Tcl_NewObj()) ; // set cls(__NS_ALL_SORTED__) ""
127 MoxSetVar(__INDEX__ , Tcl_NewIntObj(0)) ; // set cls(__INDEX__) 0
128 MoxSetVar(__CTOR__ , Tcl_NewObj()) ; // set cls(__CTOR__) ""
129 MoxSetVar(__DTOR__ , Tcl_NewObj()) ; // set cls(__DTOR__) ""
130 #undef MoxSetVar
131
132 // if {$Xcode ne ""} { ...
133 if (XcodeO && strcmp(VAL2STR(XcodeO),"")!=0) {
134 // namespace eval $clsNs $Xcode
135 if (MoxIsNotOk(Tcl_EvalObjEx(interp, XcodeO, 0))) break;
136 }
137
138 // # reset internal dependencies
139 // RecompileN $clsNs
140 {
141 RL_init(2,recompile, RL_NewC(0,RecompileN)) ; RL_O(1,clsNsO) ;
142 if (MoxIsNotOk(RL_EvalEx(0))) break;
143 }
144 }
145 MoxNsErrorCatch(clsNsP) {
146 return retI;
147 }
148 #undef MoxIsNotOk
149
150 return TCL_OK;
151}
#define NamespaceTail(...)
#define MoxIsNotOk(cmd)
#define MoxSetVar(tok, val)
#define MoxNsErrorCatch(_nsPtr)
#define MoxNsEval(_nsPtr)
const char * MOX_STRN
#define VAL2STR(val)
#define RL_NewS(num, s)
Definition rl_mox.h:38
#define RL_EvalEx(f)
Definition rl_mox.h:61
#define RL_O(num, l)
Definition rl_mox.h:41
#define RL_NewC(num, s)
Definition rl_mox.h:42
#define RL_init(max, ref, code)
Definition rl_mox.h:17

◆ libmyoox_ClsNewInstName()

mox_inline MOX_OBJ_T libmyoox_ClsNewInstName ( MOX_ENV_T interp,
MOX_RT_T moxrt )

Definition at line 58 of file libmyoox_mox.c.

58 {
59 MOX_OBJ_T clsNmeO = MoxNsGetVar(cls,__NAME__);
60 if (clsNmeO == NULL) return NULL;
61 MOX_OBJ_T valO = MoxNsGetVar(cls,__INDEX__);
62 if (valO == NULL) return NULL;
63
64 static const Tcl_ObjType * longType = NULL;
65 long newLong;
66 if (longType == NULL || valO->typePtr != longType) {
67 if (Tcl_GetLongFromObj(interp,valO,&newLong)) return NULL;
68 longType = valO->typePtr;
69 }
70 if (Tcl_IsShared(valO)) {
71 newLong = valO->internalRep.longValue+1;
72 valO = MoxNsSetVar(cls,__INDEX__, Tcl_NewLongObj(newLong));
73 } else {
74 Tcl_InvalidateStringRep(valO);
75 newLong = ++valO->internalRep.longValue;
76 }
77#if MOX_USE_OBJ_PRINTF
78 return Tcl_ObjPrintf("%s-%ld", VAL2STR(clsNmeO), newLong);
79#else
80 char buf[256];
81 int lenI = snprintf(buf,256,"%s-%ld", VAL2STR(clsNmeO), newLong);
82 return Tcl_NewStringObj(buf,lenI);
83#endif
84}
#define MoxNsGetVar(ns, tok)

◆ libmyoox_Create1N()

int libmyoox_Create1N ( MOX_CMD_ARGS )

Definition at line 535 of file libmyoox_mox.c.

535 {
537
538 if (objc < (1+__skip)) {
539 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs ...");
540 return TCL_ERROR;
541 }
542 MOX_OBJ_T clsNsO = objv[__skip++];
543
544 return MoxCreate3N(clsNsO,NULL,NULL,objc-2,objv+2);
545}
#define MoxCreate3N(...)

◆ libmyoox_Create2N()

int libmyoox_Create2N ( MOX_CMD_ARGS )

Definition at line 522 of file libmyoox_mox.c.

522 {
524 if (objc < (2+__skip)) {
525 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs Xname ...");
526 return TCL_ERROR;
527 }
528 MOX_OBJ_T clsNsO = objv[__skip++];
529 MOX_OBJ_T XnameO = objv[__skip++];
530
531 return MoxCreate3N(clsNsO,XnameO,NULL,objc-3,objv+3);
532}

◆ libmyoox_Create3N()

int libmyoox_Create3N ( MOX_CMD_ARGS )

Definition at line 508 of file libmyoox_mox.c.

508 {
510 if (objc < (3+__skip)) {
511 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs Xname Xns ...");
512 return TCL_ERROR;
513 }
514 MOX_OBJ_T clsNsO = objv[__skip++];
515 MOX_OBJ_T XnameO = objv[__skip++];
516 MOX_OBJ_T XnsO = objv[__skip++];
517
518 return MoxCreate3N(clsNsO,XnameO,XnsO,objc-4,objv+4);
519}

◆ libmyoox_Create3N_direct()

int libmyoox_Create3N_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T clsNsO,
MOX_OBJ_T Xname,
MOX_OBJ_T Xns,
int objc,
const MOX_OBJ_T * objv )

Definition at line 471 of file libmyoox_mox.c.

479 {
480 assert(moxrt != NULL);
481 assert(interp != NULL);
482 assert(clsNsO != NULL);
483
484 MOX_NS_T clsNsPtr = MoxResolveN(clsNsO);
485 if (clsNsPtr == NULL) return TCL_ERROR;
486
487 MoxNsEval(clsNsPtr) {
488
489 // MoxMakeN $clsNs
490 MOX_OBJ_T myNsO = MoxMakeNNN(clsNsO, Xname, Xns);
491 if (myNsO == NULL) break;
492
493 // CtorN $clsNs $myRef ...
494 Tcl_IncrRefCount(myNsO);
495 int retI = CtorNNN_direct(myNsO, objc, objv);
496 Tcl_DecrRefCount(myNsO);
497 if ( retI == TCL_ERROR ) break;
498 }
499
500 MoxNsErrorCatch(clsNsPtr) {
501 return TCL_ERROR;
502 }
503
504 return TCL_OK;
505}
#define MoxMakeNNN(...)
The "NN" code require that the "clsNsO" is already set in the "interp".
#define MoxResolveN(nsO)

◆ libmyoox_CtorN()

int libmyoox_CtorN ( MOX_CMD_ARGS )

Definition at line 376 of file libmyoox_mox.c.

376 {
378 if (objc < (3+__skip) || objc > (3+__skip)) {
379 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs myRef argsL");
380 return TCL_ERROR;
381 }
382 MOX_OBJ_T clsNsO = objv[__skip++];
383 MOX_OBJ_T myNsO = objv[__skip++];
384 MOX_OBJ_T argsLO = objv[__skip++];
385
386 int ret;
387
388 int argc; MOX_OBJ_T *argv;
389 ret = Tcl_ListObjGetElements(interp,argsLO, &argc, &argv);
390 if (ret == TCL_ERROR) return TCL_ERROR;
391
392 MOX_NS_T clsNsPtr = MoxResolveN(clsNsO);
393 if (clsNsPtr == NULL) return TCL_ERROR;
394
395 MoxPushN(clsNsPtr);
396 ret = CtorNNN_direct(myNsO,argc,argv);
397 MoxPopN();
398
399 return ret;
400}
#define MoxPushN(...)
#define MoxPopN()

◆ libmyoox_CtorNNN_direct()

static int libmyoox_CtorNNN_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T myNsO,
int argc,
const MOX_OBJ_T * argv )
static

Definition at line 335 of file libmyoox_mox.c.

341 {
342 MOX_OBJ_T ctorO = MoxNsGetVar(cls,__CTOR__);
343 if (ctorO == NULL) return TCL_ERROR;
344 MOX_STRN ctorC = VAL2STR(ctorO);
345
346 // if {$cls(__CTOR__) ne ""} {
347 if (ctorC[0] != '\0') {
348 // $cls(__CTOR__) $myRef {*}$argsL
349 RL_init(16, ctor_eval, ) ; RL_O(0,ctorO) ; RL_O(1,myNsO) ; RL_args(2,argc,argv);
350 int retR = RL_EvalEx(TCL_EVAL_GLOBAL);
351
352 // on error {err opt} {
353 if (retR == TCL_ERROR) {
354 // _ErrorCatchCtorFailedN $myNs $err $opt
355 MOX_OBJ_T errOptO = Tcl_GetReturnOptions(interp,retR);
356 RL_init(4, ctor_catch, RL_NewS(0,"_ErrorCatchCtorFailedN"); RL_NewS(1,"CtorN"));
357 RL_O(2,myNsO); RL_O(3,errOptO);
358 RL_EvalEx(0);
359 return TCL_ERROR;
360 }
361
362 // } elseif {[llength $argsL]} {
363 } else if (argc) {
364 // _ErrorRaiseCtorInvalidArgumentN $myNs $argsL
365 RL_init(4, ctor_raise, RL_NewS(0,"_ErrorRaiseCtorInvalidArgumentN"); RL_NewS(1,"CtorN"));
366 RL_O(2,myNsO); RL_NewL(3,argc,argv);
367 RL_EvalEx(0);
368 return TCL_ERROR;
369 }
370 // set myRef
371 Tcl_SetObjResult(interp,myNsO);
372 return TCL_OK;
373}
#define RL_args(start, _c, _v)
Definition rl_mox.h:45
#define RL_NewL(num, c, v)
Definition rl_mox.h:39

◆ libmyoox_DestroyN()

int libmyoox_DestroyN ( MOX_CMD_ARGS )

Definition at line 456 of file libmyoox_mox.c.

456 {
458
459 if (objc < (1+__skip) || objc > (1+__skip)) {
460 Tcl_WrongNumArgs(interp,__skip,objv,"myNs");
461 return TCL_ERROR;
462 }
463
464 MOX_OBJ_T myNsO = objv[__skip++];
465
466 return MoxDestroyN(myNsO);
467}
#define MoxDestroyN(...)

◆ libmyoox_DestroyN_direct()

int libmyoox_DestroyN_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T myNsO )

Definition at line 404 of file libmyoox_mox.c.

404 {
405
406 MOX_NS_T myNsPtr = MoxResolveN(myNsO);
407 if (myNsPtr == NULL) return TCL_ERROR;
408
409 MoxNsEval(myNsPtr) {
410 MOX_OBJ_T clsNsO = MoxNsGetVar(my,__CLASS__);
411 if (clsNsO == NULL) break;
412
413 MOX_NS_T clsNsPtr = MoxResolveN(clsNsO);
414 if (clsNsPtr == NULL) break;
415
416 MoxNsEval(clsNsPtr) {
417
418 MOX_OBJ_T dtorO = MoxNsGetVar(cls,__DTOR__);
419 if (dtorO == NULL) break;
420 MOX_STRN dtorC = VAL2STR(dtorO);
421
422 // if {$cls(__DTOR__) ne ""} { ...
423 if (dtorC[0] != '\0') {
424 // $cls(__DTOR__) $myRef
425 RL_init(2, destroy_eval, ) ; RL_O(0,dtorO) ; RL_O(1,myNsO) ;
426 int retR = RL_EvalEx(TCL_EVAL_GLOBAL);
427
428 // on error {err opt} { ...
429 if (retR == TCL_ERROR) {
430 // _ErrorCatchDtorFailedN $myNs $err $opt
431 MOX_OBJ_T errOptO = Tcl_GetReturnOptions(interp,retR);
432 RL_init(4, destroy_catch, RL_NewS(0,"_ErrorCatchDtorFailedN"); RL_NewS(1,"DestroyN") );
433 RL_O(2,myNsO); RL_O(3,errOptO);
434 RL_EvalEx(0);
435 break;
436 }
437 }
438 }
439 MoxNsErrorCatch(clsNsPtr) {
440 break;
441 }
442 }
443
444 MoxNsErrorCatch(myNsPtr) {
445 return TCL_ERROR;
446 }
447
448 // namespace delete $my(__NS__)
449 Tcl_DeleteNamespace(myNsPtr);
450
451 Tcl_FreeResult(interp);
452 return TCL_OK;
453}

◆ libmyoox_MakeN()

int libmyoox_MakeN ( MOX_CMD_ARGS )

Definition at line 315 of file libmyoox_mox.c.

315 {
317 if (objc < (1+__skip) || objc > (3+__skip)) {
318 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs ?instName? ?instNs?");
319 return TCL_ERROR;
320 }
321 MOX_OBJ_T clsNsO = objv[__skip++];
322 MOX_OBJ_T XnameO = __skip < objc ? objv[__skip++] : NULL;
323 MOX_OBJ_T XnsO = __skip < objc ? objv[__skip++] : NULL;
324
325 MOX_OBJ_T retO = MoxMakeNNN(clsNsO, XnameO, XnsO);
326 if (retO == NULL) return TCL_ERROR;
327
328 return TCL_OK;
329}

◆ libmyoox_MakeN_direct()

MOX_OBJ_T libmyoox_MakeN_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T clsNsO,
MOX_OBJ_T Xname,
MOX_OBJ_T Xns )

used in public code

Definition at line 288 of file libmyoox_mox.c.

294 {
295 assert(moxrt != NULL);
296 assert(interp != NULL);
297 assert(clsNsO != NULL);
298
299 MOX_OBJ_T myNsO=NULL;
300
301 MOX_NS_T clsNsPtr = MoxResolveN(clsNsO);
302 if (clsNsPtr == NULL) return NULL;
303
304 MoxPushN(clsNsPtr);
305
306 // MoxMakeN $clsNs
307 myNsO = MoxMakeNNN(clsNsO, Xname, Xns);
308
309 MoxPopN();
310
311 return myNsO;
312}

◆ libmyoox_MakeNNN_direct()

MOX_OBJ_T libmyoox_MakeNNN_direct ( MOX_RT_T moxrt,
MOX_ENV_T interp,
MOX_OBJ_T clsNsO,
MOX_OBJ_T XnameO,
MOX_OBJ_T XnsO )

Definition at line 170 of file libmyoox_mox.c.

176 {
177 Tcl_ResetResult(interp);
178 #if !MOX_USE_OBJ_PRINTF
179 char buf[256];
180 int lenI;
181 #endif
182
183 assert(clsNsO != NULL);
184 char* XnameC = XnameO != NULL ? VAL2STR(XnameO) : NULL;
185 char* XnsC = XnsO != NULL ? VAL2STR(XnsO) : NULL;
186 MOX_OBJ_T myNsO = NULL;
187 MOX_OBJ_T myNameO = NULL;
188
189 //if {$Xname eq ""} { ...
190 if (XnameC == NULL) {
191 // set Xname "$cls(__NAME__)-[incr cls(__INDEX__)]"
192 MOX_OBJ_T XnameO = MoxClsNewInstName();
193 if (XnameO == NULL) return NULL;
194 myNameO = XnameO;
195 Tcl_IncrRefCount(myNameO);
196
197 // if {$Xns eq ""} { ...
198 if (XnsC == NULL) {
199 // set myNs "${clsNs}::$Xname"
200 #if MOX_USE_OBJ_PRINTF
201 myNsO = Tcl_ObjPrintf("%s::%s", VAL2STR(clsNsO), VAL2STR(XnameO));
202 #else
203 lenI = snprintf(buf,256,"%s::%s", VAL2STR(clsNsO), VAL2STR(XnameO));
204 myNsO = Tcl_NewStringObj(buf,lenI);
205 #endif
206 } else {
207 // set myNs "${Xns}::$Xname"
208 #if MOX_USE_OBJ_PRINTF
209 myNsO = Tcl_ObjPrintf("%s::%s", XnsC, VAL2STR(XnameO));
210 #else
211 lenI = snprintf(buf,256,"%s::%s", XnsC, VAL2STR(XnameO));
212 myNsO = Tcl_NewStringObj(buf,lenI);
213 #endif
214 }
215 Tcl_IncrRefCount(myNsO);
216
217 // } elseif {[string match ::* $Xname]} { ...
218 } else if (XnameC[0] == ':' && XnameC[1] == ':') {
219 // set myNs "$Xname"
220 myNsO = XnameO;
221 Tcl_IncrRefCount(myNsO);
222 myNameO = NamespaceTail(myNsO);
223 Tcl_IncrRefCount(myNameO);
224
225 // } elseif {$Xns eq ""} { ...
226 } else if (XnsC == NULL) {
227 // set myNs "${clsNs}::$Xname"
228 #if MOX_USE_OBJ_PRINTF
229 myNsO = Tcl_ObjPrintf("%s::%s", VAL2STR(clsNsO), VAL2STR(XnameO));
230 #else
231 lenI = snprintf(buf,256,"%s::%s", VAL2STR(clsNsO), VAL2STR(XnameO));
232 myNsO = Tcl_NewStringObj(buf,lenI);
233 #endif
234 Tcl_IncrRefCount(myNsO);
235 myNameO = XnameO;
236 Tcl_IncrRefCount(myNameO);
237
238 // } else { ...
239 } else {
240 // set myNs "${Xns}::$Xname"
241 #if MOX_USE_OBJ_PRINTF
242 myNsO = Tcl_ObjPrintf("%s::%s", XnsC, VAL2STR(XnameO));
243 #else
244 lenI = snprintf(buf,256,"%s::%s", XnsC, VAL2STR(XnameO));
245 myNsO = Tcl_NewStringObj(buf,lenI);
246 #endif
247 Tcl_IncrRefCount(myNsO);
248 myNameO = XnameO;
249 Tcl_IncrRefCount(myNameO);
250 }
251
252 MOX_STRN myNsC = VAL2STR(myNsO);
253
254 MOX_NS_T myNsPtr = Tcl_FindNamespace(interp,myNsC,NULL,TCL_GLOBAL_ONLY);
255
256 // if {![namespace exists $myNs]} { ...
257 if (myNsPtr == NULL) {
258
259 myNsPtr = Tcl_CreateNamespace(interp,myNsC,NULL /*ClientData*/, NULL /*ClientProc*/);
260 if (myNsPtr == NULL) goto error;
261
262 MoxNsEval(myNsPtr) {
263
264 #define MoxSetVar(tok,val) \
265 if ( MoxNsSetVar(my,tok,val) == NULL ) break
266 MoxSetVar(__NS__, myNsO); // __NS__ $myNs
267 MoxSetVar(__NAME__, myNameO); // __NAME__ [namespace tail $myNs]
268 MoxSetVar(__CLASS__, clsNsO); // __CLASS__ $clsNs
269 #undef MoxSetVar
270
271 }
272
273 MoxNsErrorCatch(myNsPtr) {
274 goto error;
275 }
276 }
277
278 // set myNs
279 Tcl_SetObjResult(interp,myNsO);
280
281error:
282 if (myNsO) Tcl_DecrRefCount(myNsO);
283 if (myNameO) Tcl_DecrRefCount(myNameO);
284 return myNsO;
285}
#define MoxClsNewInstName()

◆ libmyoox_NamespaceTailObjCmd()

mox_inline MOX_OBJ_T libmyoox_NamespaceTailObjCmd ( MOX_OBJ_T nameO)

Definition at line 18 of file libmyoox_mox.c.

18 {
19 MOX_STRN name = VAL2STR(nameO);
20 // from: NamespaceTailCmd --------------------------
21 MOX_STRN p;
22 for (p = name; *p != '\0'; p++) {
23 /* empty body */
24 }
25 while (--p > name) {
26 if ((*p == ':') && (*(p-1) == ':')) {
27 p++; /* Just after the last "::" */
28 break;
29 }
30 }
31
32 if (p >= name) {
33 name = p;
34 }
35 // ------------------------------------------------
36 return STR2VAL(name);
37}

◆ libmyoox_NewN()

int libmyoox_NewN ( MOX_CMD_ARGS )

Definition at line 548 of file libmyoox_mox.c.

548 {
550
551 if (objc < (1+__skip)) {
552 Tcl_WrongNumArgs(interp,__skip,objv,"clsNs ...");
553 return TCL_ERROR;
554 }
555 MOX_OBJ_T clsNsO = objv[__skip++];
556
557 return MoxCreate3N(clsNsO,NULL,NULL,objc-2,objv+2);
558}