17#define NamespaceTail(...) NS(NamespaceTailObjCmd)(__VA_ARGS__)
22 for (p = name; *p !=
'\0'; p++) {
26 if ((*p ==
':') && (*(p-1) ==
':')) {
42 if (objc < (1+__skip)) {
43 Tcl_WrongNumArgs(interp,__skip,objv,
"varName ...");
48 for (
int i=1; i<objc ; i++) {
49 Tcl_AppendPrintfToObj(ret,
"%s[%d] %s",NL,i,
NS(_InspectI_direct)(objv[i]));
52 Tcl_SetObjResult(interp,ret);
57#define MoxClsNewInstName() NS(ClsNewInstName)(interp,moxrt)
60 if (clsNmeO == NULL)
return NULL;
62 if (valO == NULL)
return NULL;
64 static const Tcl_ObjType * longType = NULL;
66 if (longType == NULL || valO->typePtr != longType) {
67 if (Tcl_GetLongFromObj(interp,valO,&newLong))
return NULL;
68 longType = valO->typePtr;
70 if (Tcl_IsShared(valO)) {
71 newLong = valO->internalRep.longValue+1;
72 valO =
MoxNsSetVar(cls,__INDEX__, Tcl_NewLongObj(newLong));
74 Tcl_InvalidateStringRep(valO);
75 newLong = ++valO->internalRep.longValue;
78 return Tcl_ObjPrintf(
"%s-%ld",
VAL2STR(clsNmeO), newLong);
81 int lenI = snprintf(buf,256,
"%s-%ld",
VAL2STR(clsNmeO), newLong);
82 return Tcl_NewStringObj(buf,lenI);
99 assert(clsNsO != NULL);
103 MOX_NS_T clsNsP = Tcl_FindNamespace(interp,clsNsC,NULL,TCL_GLOBAL_ONLY);
105 clsNsP = Tcl_CreateNamespace(interp,clsNsC,NULL,NULL);
106 if (clsNsP==NULL)
return TCL_ERROR;
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;
113 int retI = TCL_ERROR;
114 #define MoxIsNotOk(cmd) ((retI=(cmd))!=TCL_OK)
122 #define MoxSetVar(tok,val) if ( MoxNsSetVar(cls,tok,val) == NULL ) break
126 MoxSetVar(__NS_ALL_SORTED__ , Tcl_NewObj()) ;
127 MoxSetVar(__INDEX__ , Tcl_NewIntObj(0)) ;
133 if (XcodeO && strcmp(
VAL2STR(XcodeO),
"")!=0) {
135 if (
MoxIsNotOk(Tcl_EvalObjEx(interp, XcodeO, 0)))
break;
157 if (objc < (1+__skip) || objc > (2+__skip)) {
158 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs ?Xcode?");
162 MOX_OBJ_T Xcode = __skip < objc ? objv[__skip++] : NULL;
164 return ClassN(clsNsO, Xcode);
177 Tcl_ResetResult(interp);
178 #if !MOX_USE_OBJ_PRINTF
183 assert(clsNsO != NULL);
184 char* XnameC = XnameO != NULL ?
VAL2STR(XnameO) : NULL;
185 char* XnsC = XnsO != NULL ?
VAL2STR(XnsO) : NULL;
190 if (XnameC == NULL) {
193 if (XnameO == NULL)
return NULL;
195 Tcl_IncrRefCount(myNameO);
200 #if MOX_USE_OBJ_PRINTF
201 myNsO = Tcl_ObjPrintf(
"%s::%s",
VAL2STR(clsNsO),
VAL2STR(XnameO));
203 lenI = snprintf(buf,256,
"%s::%s",
VAL2STR(clsNsO),
VAL2STR(XnameO));
204 myNsO = Tcl_NewStringObj(buf,lenI);
208 #if MOX_USE_OBJ_PRINTF
209 myNsO = Tcl_ObjPrintf(
"%s::%s", XnsC,
VAL2STR(XnameO));
211 lenI = snprintf(buf,256,
"%s::%s", XnsC,
VAL2STR(XnameO));
212 myNsO = Tcl_NewStringObj(buf,lenI);
215 Tcl_IncrRefCount(myNsO);
218 }
else if (XnameC[0] ==
':' && XnameC[1] ==
':') {
221 Tcl_IncrRefCount(myNsO);
223 Tcl_IncrRefCount(myNameO);
226 }
else if (XnsC == NULL) {
228 #if MOX_USE_OBJ_PRINTF
229 myNsO = Tcl_ObjPrintf(
"%s::%s",
VAL2STR(clsNsO),
VAL2STR(XnameO));
231 lenI = snprintf(buf,256,
"%s::%s",
VAL2STR(clsNsO),
VAL2STR(XnameO));
232 myNsO = Tcl_NewStringObj(buf,lenI);
234 Tcl_IncrRefCount(myNsO);
236 Tcl_IncrRefCount(myNameO);
241 #if MOX_USE_OBJ_PRINTF
242 myNsO = Tcl_ObjPrintf(
"%s::%s", XnsC,
VAL2STR(XnameO));
244 lenI = snprintf(buf,256,
"%s::%s", XnsC,
VAL2STR(XnameO));
245 myNsO = Tcl_NewStringObj(buf,lenI);
247 Tcl_IncrRefCount(myNsO);
249 Tcl_IncrRefCount(myNameO);
254 MOX_NS_T myNsPtr = Tcl_FindNamespace(interp,myNsC,NULL,TCL_GLOBAL_ONLY);
257 if (myNsPtr == NULL) {
259 myNsPtr = Tcl_CreateNamespace(interp,myNsC,NULL , NULL );
260 if (myNsPtr == NULL)
goto error;
264 #define MoxSetVar(tok,val) \
265 if ( MoxNsSetVar(my,tok,val) == NULL ) break
279 Tcl_SetObjResult(interp,myNsO);
282 if (myNsO) Tcl_DecrRefCount(myNsO);
283 if (myNameO) Tcl_DecrRefCount(myNameO);
295 assert(moxrt != NULL);
296 assert(interp != NULL);
297 assert(clsNsO != NULL);
302 if (clsNsPtr == NULL)
return NULL;
317 if (objc < (1+__skip) || objc > (3+__skip)) {
318 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs ?instName? ?instNs?");
322 MOX_OBJ_T XnameO = __skip < objc ? objv[__skip++] : NULL;
323 MOX_OBJ_T XnsO = __skip < objc ? objv[__skip++] : NULL;
326 if (retO == NULL)
return TCL_ERROR;
334#define CtorNNN_direct(...) NS(CtorNNN_direct)(moxrt,interp,__VA_ARGS__)
343 if (ctorO == NULL)
return TCL_ERROR;
347 if (ctorC[0] !=
'\0') {
353 if (retR == TCL_ERROR) {
355 MOX_OBJ_T errOptO = Tcl_GetReturnOptions(interp,retR);
371 Tcl_SetObjResult(interp,myNsO);
378 if (objc < (3+__skip) || objc > (3+__skip)) {
379 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs myRef argsL");
389 ret = Tcl_ListObjGetElements(interp,argsLO, &argc, &argv);
390 if (ret == TCL_ERROR)
return TCL_ERROR;
393 if (clsNsPtr == NULL)
return TCL_ERROR;
407 if (myNsPtr == NULL)
return TCL_ERROR;
411 if (clsNsO == NULL)
break;
414 if (clsNsPtr == NULL)
break;
419 if (dtorO == NULL)
break;
423 if (dtorC[0] !=
'\0') {
429 if (retR == TCL_ERROR) {
431 MOX_OBJ_T errOptO = Tcl_GetReturnOptions(interp,retR);
449 Tcl_DeleteNamespace(myNsPtr);
451 Tcl_FreeResult(interp);
459 if (objc < (1+__skip) || objc > (1+__skip)) {
460 Tcl_WrongNumArgs(interp,__skip,objv,
"myNs");
480 assert(moxrt != NULL);
481 assert(interp != NULL);
482 assert(clsNsO != NULL);
485 if (clsNsPtr == NULL)
return TCL_ERROR;
491 if (myNsO == NULL)
break;
494 Tcl_IncrRefCount(myNsO);
496 Tcl_DecrRefCount(myNsO);
497 if ( retI == TCL_ERROR )
break;
510 if (objc < (3+__skip)) {
511 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs Xname Xns ...");
518 return MoxCreate3N(clsNsO,XnameO,XnsO,objc-4,objv+4);
524 if (objc < (2+__skip)) {
525 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs Xname ...");
531 return MoxCreate3N(clsNsO,XnameO,NULL,objc-3,objv+3);
538 if (objc < (1+__skip)) {
539 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs ...");
544 return MoxCreate3N(clsNsO,NULL,NULL,objc-2,objv+2);
551 if (objc < (1+__skip)) {
552 Tcl_WrongNumArgs(interp,__skip,objv,
"clsNs ...");
557 return MoxCreate3N(clsNsO,NULL,NULL,objc-2,objv+2);
566static void NS(ApiNsDelete) (
MOX_PTR clientData) {
572 #define MoxRtFree(tok) if (moxrt->tok) Tcl_DecrRefCount(moxrt->tok)
573 #define regTclObj2(t,v) MoxRtFree(t)
574 #define regTclObj(t) MoxRtFree(t)
575 #define regTclCmd(t) MoxRtFree(t)
590 if (Tcl_InitStubs (interp,
"8.5", 0) == NULL)
return TCL_ERROR;
593 if (Tcl_PkgProvide (interp,
"libmyoox",
"1.0" ) == TCL_ERROR)
return TCL_ERROR;
596 if (Tcl_GetVar(interp,
"::tcl::newPkgs", TCL_GLOBAL_ONLY) != NULL)
return TCL_OK;
599 if (Tcl_PkgRequire(interp,
"tclmyoox",
"1.0", 0) == NULL)
return TCL_ERROR;
602 MOX_RT_T moxrt = calloc(1,
sizeof(*moxrt));
604 Tcl_SetErrorCode(interp,
"MYOOX",
"SETUP",
"ALLOC");
605 Tcl_SetResult(interp,
"error: myooX setup failed with '", TCL_STATIC);
606 Tcl_AppendResult(interp,Tcl_ErrnoMsg(errno),
"'",NULL);
613 #define regTclObj2(t,v) moxrt->t = STR2VAL(v); Tcl_IncrRefCount(moxrt->t)
614 #define regTclObj(t) regTclObj2(t,#t)
615 #define regTclCmd(t) regTclObj2(t,#t)
622 MOX_NS_T ns = Tcl_FindNamespace(interp,
"::myooX",NULL,TCL_GLOBAL_ONLY);
624 ns = Tcl_CreateNamespace(interp,
"::myooX",NULL,NULL);
625 if (ns==NULL)
return TCL_ERROR;
627 ns->clientData = moxrt;
628 ns->deleteProc =
NS(ApiNsDelete);
635 #define MoxObjCmd(nme) do { \
636 cmd = Tcl_CreateObjCommand(interp, "::myooX::" #nme, NS(nme), moxrt, NULL) ; \
637 if (cmd == NULL) return TCL_ERROR; \
641 #define regTclCmd(t) MoxObjCmd(t)
651 MOX_NS_T ns = Tcl_FindNamespace(interp,
"::myooX",NULL,TCL_GLOBAL_ONLY);
652 if (ns != NULL) Tcl_DeleteNamespace(ns);
#define CtorNNN_direct(...)
#define NamespaceTail(...)
#define MoxClsNewInstName()
MOX_EXTERN int _Myoox_Unload(MOX_ENV_T interp, int flags)
#define MoxSetVar(tok, val)
#define MoxNsSetVar(ns, tok, new)
#define MoxMakeNNN(...)
The "NN" code require that the "clsNsO" is already set in the "interp".
#define MOX_EXTERN
static library
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)
#define MoxNsErrorCatch(_nsPtr)
MOX_EXTERN int MOX_DECL MOX DestroyN_direct(MOX_RT_T moxrt, MOX_ENV_T interp, MOX_OBJ_T myNsO)
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)
#define MoxNsEval(_nsPtr)
#define MoxNsGetVar(ns, tok)
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)
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_SETUP_hdl_static
#define RL_args(start, _c, _v)
#define RL_NewL(num, c, v)
#define RL_init(max, ref, code)