theKernel 10.0
Loading...
Searching...
No Matches
LibMkKernel_atl.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#define META_FILE_NAME "MkKernel_atl.c"
12#define VER TCL_OO_METHOD_VERSION_CURRENT
13
15#include <stdlib.h>
16#include <errno.h>
17
18#undef OtClass_ARGS
19#define OtClass_ARGS OBJCMD_ARGS
20
21#define OT_CLASS NULL
22#undef OT_SELF
23#define OT_SELF NULL
24
25#define OT_SETUP_hdl_static \
26 MK_UNUSED int __skip=1; \
27 MK_UNUSED OT_MK_RT_T amkrt = clientData; \
28 MK_UNUSED MK_RT mkrt = amkrt->mkrt; \
29 MK_UNUSED MK_ERR hdl = &MkERROR; \
30
31 /* printAry2("cmd",objc,objv); */
32
33/* LABEL-END */
34
35#include <limits.h>
36#include <float.h>
37#include <math.h>
38#include <ctype.h>
39
40#include "tmpl/mk_type_S_lng.h"
41#include "mk_check_atl.h"
42#include "utlist_mk.h"
43
44#define MkSetupTmpl()
45#define MkCleanupTmpl()
46
47// #######################################################################
48// -----------------------------------------------------------------------
49// documentation order
64
75
87
99
109
121
129
141
151
152// --------------------------------------------------------------------------------
153
154// BEGIN-DOC - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
155
156// doc-key: MkKernel,EnumFunc,sco,func
157#define ErrorE_FromInt_doc "MkErrorE [MkKernel::ErrorE_FromInt value:int32]"
158#define IdSE_FromInt_doc "MkIdSE [MkKernel::IdSE_FromInt value:int32]"
159#define TimeoutE_FromInt_doc "MkTimeoutE [MkKernel::TimeoutE_FromInt value:int32]"
160#define TypeE_FromInt_doc "MkTypeE [MkKernel::TypeE_FromInt value:int32]"
161
162// doc-key: MkKernel,EnumFunc,sm_,func
163#define ErrorE_ToInt_doc "int32 [MkKernel::ErrorE_ToInt value:MkErrorE]"
164#define ErrorE_ToString_doc "string [MkKernel::ErrorE_ToString value:MkErrorE]"
165#define IdSE_ToInt_doc "int32 [MkKernel::IdSE_ToInt value:MkIdSE]"
166#define IdSE_ToString_doc "string [MkKernel::IdSE_ToString value:MkIdSE]"
167#define TimeoutE_ToInt_doc "int32 [MkKernel::TimeoutE_ToInt value:MkTimeoutE]"
168#define TimeoutE_ToString_doc "string [MkKernel::TimeoutE_ToString value:MkTimeoutE]"
169#define TypeE_ToInt_doc "int32 [MkKernel::TypeE_ToInt value:MkTypeE]"
170#define TypeE_ToString_doc "string [MkKernel::TypeE_ToString value:MkTypeE]"
171
172// doc-key: MkKernel,Setup,sm_,func
173#define Cleanup_doc "MkKernel::Cleanup"
174#define Setup_doc "MkKernel::Setup"
175
176// END-DOC - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
177
178// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
179
180#define AtlClassDefS_SIG 0x88342873
181
182void MK(ClassDef_ns_delete) (ClientData clientData) {
183 AtlClassDefT classDef = clientData;
184 assert (classDef->signature == AtlClassDefS_SIG);
185 OT_OBJ_T classO = classDef->classO;
186 if (classO == NULL) return;
187OT_DEBUG_NAMESPACE_DELETE(MK_COLOR_RED,"%s<%p> in clientData<%p>","CLS",VAL2STR(classO),classO,clientData);
188 OT_MK_RT_T amkrt = classDef->amkrt;
189 if (amkrt==NULL || amkrt->signature != OT_MK_RT_SIG) return;
190 MK_TYP classTT = classDef->classTT;
191 MkRtSetup_RT(amkrt->mkrt);
192 OT_ENV_T interp = amkrt->interp;
193
194 MK_OBJ obj,tmp;
196 if (obj->self == NULL) { obj = MkObjectNext(obj); continue; }
197 OT_OBJ_T selfO = obj->self;
198 OT_NS_T ns = Tcl_FindNamespace(interp,VAL2STR(selfO),NULL,TCL_GLOBAL_ONLY);
199 if (ns == NULL) { obj = MkObjectNext(obj); continue; }
200 Tcl_DeleteNamespace(ns);
201 }
202
203 DL_DELETE(amkrt->atlClassDefL,classDef);
204 classDef->next = NULL;
205
206 classDef->signature = 0x0;
207 OT_REF_DECR_AND_NULL(classDef->classO);
208 MkSysFree(classDef);
209}
210
211#define ClassDefCreateNN(...) NS(ClassDefCreateNN)(OT_MK_CALL __VA_ARGS__)
213{
214 AtlClassDefT classDef = MkSysMalloc(MK_ERROR_PANIC,sizeof(*classDef));
215//mk_dbg_color_ln(MK_COLOR_GREEN,"classDef<%p>",classDef);
216 (*classDef) = (AtlClassDefS) {AtlClassDefS_SIG,classO,amkrt,classTT,clsNS,NULL,NULL};
217 Tcl_IncrRefCount(classO);
218 clsNS->clientData = classDef;
219 clsNS->deleteProc = MK(ClassDef_ns_delete);
220
221 DL_APPEND(amkrt->atlClassDefL,classDef);
222
223 return classDef;
224}
225
226#define AtlClassDefGetTypN(...) NS(AtlClassDefGetTypN)(OT_MK_CALL __VA_ARGS__)
228
229#define AtlClassDefGetTypNN(...) NS(AtlClassDefGetTypNN)(OT_MK_CALL __VA_ARGS__)
231
232#define AtlClassDefGetTypNNN(...) NS(AtlClassDefGetTypNNN)(OT_MK_CALL __VA_ARGS__)
234
235AtlClassDefT MK(AtlClassDefGetNN) (OT_MK_ARGS OT_NS_T classP, OT_CLS_T classO, MK_TYP classTT, int flags)
236{
237//colorBLUE("classP->fullName<%s>, classO<%s>, classTT<%s>", classP->fullName, VAL2STR_NULL(classO), MK_TYP2STR(classTT));
238 assert(classP != NULL);
239 if (classP->clientData) {
240 AtlClassDefT clsDef = classP->clientData;
241 assert(clsDef->signature == AtlClassDefS_SIG);
242 return clsDef;
243 }
244 if (classO == NULL)
245 classO = STR2VAL(classP->fullName);
246 #ifndef NDEBUG
247 OT_NS_T classNsP = MoxResolveN(classO);
248 assert(classNsP == classP);
249 #endif
250 if (classTT == NULL) {
252 int retI;
253
254 // is this a ATL Class ?
255 OT_OBJ_T superO = MoxCls__SUPER__NN(classP,flags);
256 if (superO == NULL) {
257 if (flags & TCL_LEAVE_ERR_MSG) {
258 OT_ERROR_VAR_DEFAULT("[ClassDefError] unable to retrieve '__SUPER__' from '%s'\n -> %s",
259 classP->fullName, Tcl_GetStringResult(interp));
260 Tcl_SetErrorCode(interp,"ATLMK","CLASS","TYP","INVALID",NULL);
261 }
262 return NULL;
263 }
264 int objc;
265 Tcl_Obj **objv;
266 retI = Tcl_ListObjGetElements(interp,superO,&objc,&objv);
267 if (retI == TCL_OK) {
268 for (int i=0; i<objc; i++) {
269 classTT = AtlClassDefGetTypN(objv[i],0);
270 if (classTT) break;
271 }
272 }
273
274 if (classTT == NULL) {
275 if (flags & TCL_LEAVE_ERR_MSG) {
276 OT_ERROR_VAR_DEFAULT("[ClassDefError] unable to retrieve 'MK_TYP' from '%s'",classP->fullName);
277 Tcl_SetErrorCode(interp,"ATLMK","CLASS","TYP","INVALID",NULL);
278 }
279 return NULL;
280 }
281 }
282 return ClassDefCreateNN(classP,classO,classTT);
283}
284
286{
287 AtlClassDefT clsDef = AtlClassDefGetNN(clsP,clsO,NULL,flags);
288 if (clsDef == NULL) return NULL;
289 return clsDef->classTT;
290}
292{
293 MK_TYP retTT=NULL ;
295 MoxPushN(clsP);
296 retTT = AtlClassDefGetTypNNN(clsP,clsO,flags);
297 MoxPopN();
298 return retTT;
299}
301{
302 OT_NS_T ns = MoxResolveN(clsO);
303 if (ns == NULL) return NULL;
304 return AtlClassDefGetTypNN(ns,clsO,flags);
305}
306
307// return classO WITH Tcl_IncrRefCount
308OT_CLS_T MK(ClassDef)(
310 MK_TYP typeTT,
311 OT_NS_T *clsNsP
312) {
313 int retI;
314 Tcl_ResetResult(interp);
315 assert(typeTT != NULL);
316 MK_TYP classTT = typeTT->type_class;
317
318 // 1. ClassName = ::TypeName
319 OT_OBJ_T classNs = Tcl_ObjPrintf("::%s", classTT->type_class->type_name);
320 if (classNs == NULL) return NULL;
321
322 OT_OBJ_T classO = NULL;
323 OT_OBJ_T codeO = NULL;
324
325 // If 'classTT->self' is defined - import it
326 // > require that "interp" and "MkOBJ_R(classTT).env" are in the SAME thread.
327 // > silent assume that class dependency is ORDERED with "MkObjectC" first !!
328 if (classTT != MkObjectC_TT) {
329 if (MkOBJ_R(classTT->type_base).env != amkrt) {
330 char buf[256] = {0};
331 snprintf(buf,256,"\nCLASS-SETUP-ERROR: the '%s-env=%p' and the 'class-def-interp=%p' are not equal",
332 MkOBJ_R(classTT->type_base).type->type_name, MkOBJ_R(classTT->type_base).env, interp
333 );
334 Tcl_AppendResult(interp, buf,NULL);
335 Tcl_SetErrorCode(interp,"ATLMK","CLASS","ENV",NULL);
336 goto error;
337 } else if (MkOBJ_R(classTT->type_base).self == NULL) {
338 Tcl_AppendResult(interp,
339 "\nCLASS-SETUP-ERROR: class '", classTT->type_name, "' has a base class '", classTT->type_base->type_name,
340 "' with EMPTY SELF pointer", NULL);
341 Tcl_SetErrorCode(interp,"ATLMK","CLASS","SELF",NULL);
342 goto error;
343 } else {
344 codeO = MkOBJ_R(classTT->type_base).self;
345 }
346 }
347 // 2. call class-CTOR
348 retI = MOX(ClassN_direct)(amkrt->moxrt,interp,classNs,codeO);
349 if (retI != TCL_OK) goto error;
350
351 // 3. "final" class-Name (should by ClassName but open for future change)
352 classO = Tcl_GetObjResult(interp);
353 OT_REF_INCR(classO);
354
355 OT_OBJ_T superO = Tcl_ObjPrintf("SuperI %s", Tcl_GetString(classO));
356 MkSelfSet_3X(classTT, (MK_PTR) superO, amkrt); // save reference of OT_CLS_T and OT_ENV_T
357 Tcl_IncrRefCount(superO);
358
359 // save my namespace
360 OT_NS_T classNS = (*clsNsP) = MoxResolveN(classO);
361 if (classNS == NULL) goto error;
362
363 // attach Class-O to Class-NS
364 ClassDefCreateNN(classNS,classO,classTT);
365
366 // export public commands
367 retI = Tcl_Export(interp, classNS, "[A-Za-z]*", 0);
368 if (retI != TCL_OK) goto error;
369
370end:
371 if (classO) {
372 Tcl_SetObjResult(interp,classO);
373 OT_REF_DECR(classO);
374 }
375 return classO;
376error:
378 goto end;
379}
380
381//
382// *********************************************************************************
383//
384
385#define FRAME_UPDATE \
386 if (*frameP == NULL) { \
387 RL_init( 2, info_frame_2, RL_NewS(0,"::tcl::info::frame") ) ; RL_T(1,null0) ; \
388 OT_OBJ_T ret = RL_EvalRtEx(TCL_EVAL_GLOBAL); \
389 if (ret==NULL) OT_ERROR_ABNORMAL(MK_ERROR_PANIC); \
390 Tcl_IncrRefCount(ret); \
391 *frameP = ret; \
392 } \
393
394#define FRAME_GET(key) \
395 OT_OBJ_T key = NULL; \
396 Tcl_DictObjGet(interp,*frameP,amkrt->key,&key);
397
398MK_STRN MK(Get_Call_Proc) (FRAME_ARGS) {
399 OT_OBJ_T retObj = NULL;
401 FRAME_GET(method)
402 if (method != NULL) {retObj = method; goto end;}
403 FRAME_GET(proc)
404 if (proc != NULL) {retObj = proc; goto end;}
405 return "main";
406end:
407 return Tcl_GetStringFromObj(retObj,NULL);;
408}
409
410MK_STRN MK(Get_Call_Cmd) (FRAME_ARGS) {
411#define Get_Call_Cmd__SIZE 100
412 static MkThreadLocal char buffer[Get_Call_Cmd__SIZE+10];
414 FRAME_GET(cmd)
415 if (cmd == NULL) goto error;
416 int len;
417 char* str = Tcl_GetStringFromObj(cmd, &len);
418 if (len > Get_Call_Cmd__SIZE) {
419 strncpy(buffer,str,Get_Call_Cmd__SIZE);
420 char* nl=strchr(buffer,'\n');
421 if (nl)
422 *nl='\0';
423 else
424 buffer[Get_Call_Cmd__SIZE] = '\0';
425 strcat(buffer," ...");
426 return buffer;
427 } else {
428 return str;
429 }
430error:
431 Tcl_ResetResult(interp);
432 FRAME_GET(type)
433 return Tcl_GetStringFromObj(type,NULL);
434#undef Get_Call_Cmd__SIZE
435}
436
437MK_STRN MK(Get_Call_File) (FRAME_ARGS) {
439 FRAME_GET(file)
440 if (file == NULL) goto error;
441 return Tcl_GetStringFromObj(file,NULL);
442error: {
443 MK_STRN script = AtlInfoScript(NULL);
444 check_NULL(script) goto error1;
445 return script;
446 }
447error1:
448 Tcl_ResetResult(interp);
449 FRAME_GET(type)
450 return Tcl_GetStringFromObj(type,NULL);
451}
452
453MK_I32 MK(Get_Call_Line) (FRAME_ARGS) {
455 FRAME_GET(line)
456 if (line == NULL) goto error;
457 MK_I32 lineI = -1;
458 if (Tcl_GetIntFromObj(NULL,line,&lineI)==TCL_ERROR) goto error;
459 return lineI;
460error:
461 Tcl_ResetResult(interp);
462 return -1;
463}
464
465// attention: "level" only used ONCE at startup !!
466bool MK(Get_Call_Stack) (OT_MK_ARGS MK_ERR const err, int level) {
467 RL_init( 2, info_frame_2, RL_NewS(0,"::tcl::info::frame") ) ; RL_NewI(1,level) ;
468 OT_OBJ_T frame = RL_EvalRt(TCL_EVAL_GLOBAL);
469 Tcl_IncrRefCount(frame);
470//printLng(frame);
472 MK(Get_Call_Cmd)(FRAME_CALL),
473 MK(Get_Call_File)(FRAME_CALL),
474 MK(Get_Call_Line)(FRAME_CALL)
475 );
476 Tcl_DecrRefCount(frame);
477 return true;
478error:
479 Tcl_ResetResult(interp);
480 return false;
481}
482
483//
484// *********************************************************************************
485//
486
487#if 0
488// Assumes little endian
489static char* printBits(size_t const size, void const * const ptr)
490{
491 static char buf[100];
492 char * bufP = &buf[0];
493 unsigned char *b = (unsigned char*) ptr;
494 unsigned char byte;
495 int i, j;
496 int num;
497
498 for (i = (int)size-1; i >= 0; i--) {
499 for (j = 7; j >= 0; j--) {
500 byte = (b[i] >> j) & 1;
501 num = sprintf(bufP,"%u", byte);
502 bufP+=num;
503 }
504 }
505 *bufP = '\0';
506 return buf;
507}
508
509#define myprint(num) ({ \
510 unsigned int tmp=(unsigned int)num; \
511 printV("%-40s → %s\n", #num, printBits(4,&tmp)); \
512})
513#endif
514
515int MK(EnumFlagWorker) (MK_RT_ARGS OT_ENV_T interp, const struct LookupEnumE *keys, OT_OBJ_T enumE, int *ret)
516{
517 // read flag enum
518 int valI = 0;
519 int index = 0;
520 int objc = 0;
521 OT_OBJ_T *objv = NULL;
522 check_LNG(Tcl_ListObjGetElements(interp,enumE,&objc,&objv)) return TCL_ERROR;
523 for (int i=0; i<objc; i++) {
524 check_LNG (Tcl_GetIndexFromObjStruct (interp, objv[i], keys,
525 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index)) return TCL_ERROR;
526 valI |= keys[index].val;
527 }
528//myprint(valI);
529 *ret = valI;
530 return TCL_OK;
531}
532
533//
534// *********************************************************************************
535//
536
539 OT_OBJ_T myO,
540 OT_CLS_T clsO,
541 MK_OBJ * objP,
542 MkTestClassE * flagP
543) {
544 assert(myO != NULL);
545 assert(clsO!= NULL);
546 Tcl_ResetResult(interp);
548 MOX_RT_T moxrt = amkrt->moxrt;
549 MK_OBJ myOBJ = NULL;
550
551 OT_NS_T myNs = MoxResolveN(myO);
552 if (myNs == NULL) {
553 // first check for "", "MK_NULL", ...
554 int len=0;
555 MK_STRN str = Tcl_GetStringFromObj(myO,&len);
556 if (len == 0 || MkStringIsNULL(MkStringCreate(len,str))) {
558 } else {
560 }
561 goto end;
562 }
563
564 myOBJ = Self2PtrNN(myNs);
565 if (myOBJ == NULL) {
566 if (MoxMyIsNN(myNs)) {
567 flag=MkTestClassE_NULL; goto end;
568 } else {
569 flag=MkTestClassE_NONE_OBJECT; goto end;
570 }
571 }
572
573 if (!MkObjCheck(myOBJ)) {
574 flag=MkTestClassE_INVALID_SIGNATURE; goto end;
575 }
576
577 MK_TYP clsTT = AtlClassDefGetTypN(clsO,0);
578 if (clsTT == NULL) {
579 flag=MkTestClassE_INTERNAL; goto end;
580 }
581
582 if (!__MkCheckTO(clsTT,myOBJ)) {
583 flag = MkTestClassE_WRONG_CLASS; goto end;
584 }
585
586 flag = MkTestClassE_OK;
587 if (objP) *objP = myOBJ;
588
589end:
590 if (flagP) *flagP = flag;
591 switch(flag) {
592 case MkTestClassE_NONE_OBJECT : return false;
593 default : return true;
594 }
595}
596
599MK_STRN MK(GetTypeFromObj) (
601 OT_OBJ_T myO,
602 bool *isObject
603) {
605 const Tcl_ObjType *typePtr=myO->typePtr;
606 MK_STRN name=NULL;
607 bool isObjectB=false;
608
609 if (MoxMyIsN(myO)) {
610 // myoo instance NS
611 isObjectB=true;
612 name = OT_LNG_NAME_FROM_CLASS(MoxMy__CLASS__N(myO));
613 } else if (MoxClsIsN(myO)) {
614 // myoo class NS
615 isObjectB=true;
616 name = "Class";
617 } else {
618 // Tcl_Obj
619 name = typePtr ? typePtr->name : "unknown";
620 isObjectB=false;
621 }
622 if (isObject) *isObject=isObjectB;
623 return name;
624}
625
626static MK_STRN NS(NamespaceTailCmd)(MK_STRN name) {
627 // from: NamespaceTailCmd --------------------------
628 const char *p;
629 for (p = name; *p != '\0'; p++) {
630 /* empty body */
631 }
632 while (--p > name) {
633 if ((*p == ':') && (*(p-1) == ':')) {
634 p++; /* Just after the last "::" */
635 break;
636 }
637 }
638
639 if (p >= name) {
640 name = p;
641 }
642 // ------------------------------------------------
643 return name;
644}
645
646MK_STRN MK(ClassName) (
648 OT_OBJ_T myO,
649 bool doShort
650) {
651 const Tcl_ObjType *typePtr=myO->typePtr;
652 MK_STRN name = NULL;
653 MOX_RT_T const moxrt = amkrt->moxrt;
654
655 if (MoxMyIsN(myO)) {
656 // myoo instance
657 name = OT_LNG_NAME_FROM_CLASS(MoxMy__CLASS__N(myO));
658 } else if (MoxClsIsN(myO)) {
659 // myoo class
660 name = OT_LNG_NAME_FROM_CLASS(myO);
661 } else {
662 snprintf(amkrt->AtlClassName_buf,AtlClassName_buf_size,"Tcl_ObjType<%s>",typePtr ? typePtr->name : "unknown");
663 name = amkrt->AtlClassName_buf;
664 doShort = false;
665 }
666 if (doShort) name = NS(NamespaceTailCmd)(name);
667 return name;
668}
669
670static void MK(LngTupleToMkBufferListS) (
672 int * skipP,
673 MK_BFL * retP
674) {
675 MK_BFL retVal = *retP;
676 int __skip = *skipP;
677
678 if (retVal == NULL) retVal = MkBufferListCreate (objc-__skip);
679 else MkBufferListReserve(retVal,objc-__skip);
680 for (int i=__skip; i<objc; i++) {
681 MkBufferListIndexSetSTR(retVal, i-__skip, VAL2STR(objv[i]));
682 }
683
684 *skipP = objc;
685 *retP = retVal;
686}
687
688enum MkErrorE MK(LngListToMkBufferListS) (
690 OT_OBJ_T argsO,
691 MK_BFL * retP
692) {
693 if (argsO == NULL) {
694 return MK_OK;
695 } else {
696 int __skip=0;
697 int listObjc;
698 OT_OBJ_T * listObjv;
699 check_LNG (Tcl_ListObjGetElements(interp,argsO,&listObjc,&listObjv)) goto error;
700 MK(LngTupleToMkBufferListS)( MK_RT_CALL interp,listObjc,listObjv,&__skip,retP);
701 }
702 return MK_OK;
703error:
704 return MK_ERROR;
705}
706
708{
709 MOX_RT_T const moxrt = amkrt->moxrt;
710 OT_CLS_T objClsO = MoxMy__CLASS__N(objO);
711
712 if (objClsO == NULL) {
713 OT_ERROR_VAR_DEFAULT("HdlIsNullError: '%s' hdl is NULL (not a myoox)",VAL2STR(clsO));
714 Tcl_SetErrorCode(interp,"ATLMK","HDL","NULL",NULL);
715 goto error;
716 }
717
718 MK_STRN objClsC = VAL2STR(objClsO);
719 MK_MNG mng = VAL2MNG(objO);
720
721 if (mng == NULL) {
722 OT_ERROR_VAR_DEFAULT("HdlIsNullError: '%s' hdl is NULL (not an instance)",objClsC);
723 Tcl_SetErrorCode(interp,"ATLMK","HDL","NULL",NULL);
724 goto error;
725 }
726
727 MK_OBJ obj = MkObj(mng);
728 if (obj == NULL) {
729 OT_ERROR_VAR_DEFAULT("HdlIsNullError: '%s' hdl is NULL (not an object)",objClsC);
730 Tcl_SetErrorCode(interp,"ATLMK","HDL","NULL",NULL);
731 goto error;
732 }
733
734 MK_TYP objTT = AtlClassDefGetTypN(objClsO,TCL_LEAVE_ERR_MSG);
735 if (objTT == NULL) goto error_and_stack;
736 MK_TYP clsTT = AtlClassDefGetTypN(clsO,TCL_LEAVE_ERR_MSG);
737 if (clsTT == NULL) goto error_and_stack;
738
739/*
740 RL_init(3,hdl_is_null_3, RL_T(0,ClassIsN) ) ; RL_O(1,objO) ; RL_O(2,clsO) ;
741 OT_OBJ_T retO = RL_EvalRt(TCL_EVAL_GLOBAL);
742 int boolI;
743 if (retO == NULL || Tcl_GetBooleanFromObj(interp,retO,&boolI) != TCL_OK) {
744 OT_ERROR_VAR_DEFAULT("[HdlInternalError] '%s'",Tcl_GetStringResult(interp));
745 Tcl_SetErrorCode(interp,"ATLMK","HDL","INTERNAL",NULL);
746 goto error;
747 }
748*/
749
750 MK_STRN clsC = VAL2STR(clsO);
751 if (objTT == clsTT) {
752 OT_ERROR_VAR_DEFAULT("HdlClassInvalidError: Expected 'hdl' in class '%s' not found", objClsC);
753 Tcl_SetErrorCode(interp,"ATLMK","HDL","INVALID",NULL);
754 } else {
755 OT_ERROR_VAR_DEFAULT("HdlClassInvalidError: Expecting 'hdl' class '%s', but getting class '%s'", clsC, objClsC);
756 Tcl_SetErrorCode(interp,"ATLMK","HDL","WRONG","CLASS",NULL);
757 }
758error_and_stack:
760error:
761 return TCL_ERROR;
762}
763
769
770int MK(UnknownSetup) (
771 OT_ENV_T interp,
772 const OtObjProcDefS methodsDefs[],
773 const ClientData clientData
774) {
775
776 for (int i=0; methodsDefs[i].name != 0; i++) {
777 check_NULL(Tcl_CreateObjCommand(interp, methodsDefs[i].name, methodsDefs[i].callProc, clientData, NULL))
778 goto error;
779 }
780
781 return TCL_OK;
782error:
784 return TCL_ERROR;
785}
786
787/*****************************************************************************/
788/* */
789/* Obj_As */
790/* */
791/*****************************************************************************/
792
793#define OT_LNG_STRING(o) Tcl_GetString(o)
794
795#define OT_LNG_STRING_BYTES(o) o->bytes
796#define OT_LNG_STRING_LENGTH(o) o->length
797#define OT_LNG_SKIP_TYPE int
798
799// -------------------------------------------------------------------------------
800
801
803
805 if ((*skipP) >= objc) {
806 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
807 }
808 int len=0;
809 MK_STRN ret = Tcl_GetStringFromObj(objv[(*skipP)++], &len);
810 // mark=MK_NULL
811 if (MK_NULL_STR_CHECK(ret,len)) {
812 ret = NULL;
813 }
814 *retP = ret;
815 return MK_OK;
816}
817
818/*
819enum MkErrorE MK(Obj_AsCSTNULL) (OT_Check_ARGS, MK_STRN *retP) {
820 if ((*skipP) >= objc) {
821 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
822 }
823 MK_STRN ret = Tcl_GetString(objv[(*skipP)++]);
824 if (strcmp(ret,"NULL") == 0) ret=NULL;
825 *retP = Tcl_GetString(objv[(*skipP)++]);
826 return MK_OK;
827}
828*/
829
830enum MkErrorE MK(Obj_AsSTR_COPY) (OT_Check_ARGS, MK_STR ret, size_t size) {
831 if ((*skipP) >= objc) {
832 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
833 }
834 strncpy(ret,Tcl_GetString(objv[(*skipP)++]),size);
835 return MK_OK;
836}
837
838/*****************************************************************************/
839/* */
840/* Check */
841/* */
842/*****************************************************************************/
843
845
846//
847// *********************************************************************************
848//
849
850int MK(EvalObjvVA) (
851 OT_ENV_T interp,
852 int flags,
853 ...
854) {
855 #define SIZE 20
856 int objc;
857 OT_OBJ_T objv[SIZE];
858 va_list ap;
859 va_start(ap, flags);
860 for (objc=0; (objv[objc]=(OT_OBJ_T )va_arg(ap,OT_OBJ_T )) != NULL; objc++) {
861 //Tcl_IncrRefCount(objv[objc]);
862 if (objc >= (SIZE-1)) {
863 Tcl_SetResult(interp, "EVAL-ERROR: size in MkEvalObjvVA is limited to " xstr(SIZE), TCL_STATIC);
864 return TCL_ERROR;
865 }
866 }
867 va_end(ap);
868//printAry2(__func__,objc,objv)
869 int ret;
870 //for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
871 ret = Tcl_EvalObjv (interp, objc, objv, flags);
872 //for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
873 return ret;
874 #undef SIZE
875}
876
877int MK(FillNamespace) (
878 OT_ENV_T interp,
879 const OtObjProcDefS type[],
880 ClientData env
881) {
882 // 2. create commands
883 for (int i=0; type[i].name != NULL; i++) {
884 check_NULL (
885 Tcl_CreateObjCommand(interp, type[i].name, type[i].callProc, env,NULL)
886 ) return TCL_ERROR;
887 }
888 return TCL_OK;
889}
890
891MK_STRN MK(ObjvToString) (MK_RT_ARGS MK_STRN cls, ATL_ARGS) {
892 MkBufferCreateTLS_T(MkBuffer64C,ret,50);
893 MkBufferAppendV(ret,"&%s ", cls);
894 for(int i=1;i<objc;i++) {
895 MkBufferAppendV(ret,"%s ", VAL2STR(objv[i]));
896 }
897 return MkBUF_R(&retR).storage.first.C;
898}
899
900#define __printV(_color,_caller,_fmt,...) \
901 fprintf(MK_OUT, MK_DEBUG_FMT _color _fmt MK_COLOR_RESET "\n", MK_DEBUG_ARG_1(_caller), __VA_ARGS__)
902#define _printV(fmt,...) \
903 __printV(MK_COLOR_CYAN,caller,fmt, __VA_ARGS__)
904
905void MK(PrintObj2) (
907 MK_STRN header,
908 OT_OBJ_T obj,
909 MK_STRN caller
910) {
911 if (obj == NULL) {
912 _printV("%s=NULL", header);
913 }
914 const Tcl_ObjType *typePtr = obj->typePtr;
915 _printV("STRING # %s<%s>", header, VAL2STR(obj));
916 if (typePtr) {
917 const char * typeName = typePtr->name;
918 _printV(" | OBJECT # typePtr<%s>, refCount<%d>", typeName, obj->refCount);
919 if (strcmp(typeName,"parsedVarName")==0) {
920 _printV(" | %-10p # pointer to the array name Tcl_Obj, or NULL if it is ascalar variable",
921 obj->internalRep.twoPtrValue.ptr1);
922 _printV(" | %-10p # pointer to the element name string (owned by this Tcl_Obj), or NULL if it is a scalar variable",
923 obj->internalRep.twoPtrValue.ptr2);
924 } else if (strcmp(typeName,"nsName")==0) {
925 // ===========================================================================
926 // generic/tclNamesp.c
927 /*
928 * This structure contains a cached pointer to a namespace that is the result
929 * of resolving the namespace's name in some other namespace. It is the
930 * internal representation for a nsName object. It contains the pointer along
931 * with some information that is used to check the cached pointer's validity.
932 */
933
934 typedef struct ResolvedNsName {
935 Namespace *nsPtr; /* A cached pointer to the Namespace that the
936 * name resolved to. */
937 Namespace *refNsPtr; /* Points to the namespace context in which
938 * the name was resolved. NULL if the name is
939 * fully qualified and thus the resolution
940 * does not depend on the context. */
941 int refCount; /* Reference count: 1 for each nsName object
942 * that has a pointer to this ResolvedNsName
943 * structure as its internal rep. This
944 * structure can be freed when refCount
945 * becomes zero. */
946 } ResolvedNsName;
947 // ===========================================================================
948 ResolvedNsName *resNamePtr = obj->internalRep.twoPtrValue.ptr1;
949 if (resNamePtr==NULL) return;
950 Namespace* nsPtr = resNamePtr->nsPtr ;
951 char *nsPtrS = nsPtr ? nsPtr->fullName : "null";
952 ClientData nsPtrCD = nsPtr ? nsPtr->clientData : NULL;
953 Namespace* refNsPtr = resNamePtr->refNsPtr;
954 char *refNsPtrS = refNsPtr ? refNsPtr->fullName : "null";
955 _printV(" | NAMESPACE # namespace<%s>, ClientData<%p>, refNsPtr<%s>", nsPtrS, nsPtrCD, refNsPtrS);
956 }
957 } else {
958 _printV(" | OBJECT # refCount : %d", obj->refCount);
959 }
960}
961#undef _printV
962#undef __printV
963
966MK_STR MK(PrintObj) (
968 MK_STRN header,
969 OT_OBJ_T valO
970) {
971 if (valO == NULL) {
972 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s=NULL", header);
973 } else {
974 //printP(valO)
975 MK_OBJ retObj = NULL;
976 bool isObject;
977 MK_STRN type = MK(GetTypeFromObj) (OT_Prefix_CALL valO, &isObject);
978 if (isObject) OT_LNG_OBJECT_IS_3(valO, &retObj, NULL);
979
980 #define objF "[type<%s>, refCount<MQ=%i,TCL=%i,SHARED=%i>, ptr<MQ=%p,TCL=%p>]"
981 #define objA type, (retObj?retObj->refCount:-1),valO->refCount, Tcl_IsShared(valO), retObj, (retObj?retObj->self:NULL)
982
983 // fill the buf and get the len back
984 if (header) {
985 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%-20s: %s " objF, header, Tcl_GetString (valO), objA);
986 } else if (retObj) {
987 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s " objF, Tcl_GetString (valO), objA);
988 } else {
989 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s " objF, Tcl_GetString (valO), objA);
990 }
991
992 #undef objF
993 #undef objA
994 }
995
996 return MkBUF_R(&MK_RT_REF.tbuf).storage.first.S;
997}
998
999// MARK_P ////////////////////////////////////////////////////////////////////////
1004
1006{
1007 RL_init( 2, info_exists, RL_NewS(0,"::tcl::info::exists") ); RL_O(1,var) ;
1008 return Ot_GetBooleanFromObj(RL_EvalRt(TCL_EVAL_GLOBAL));
1009error:
1010 return 0;
1011}
1012
1014{
1015 RL_init( 2, array_exists, RL_NewS(0,"::tcl::array::exists") ); RL_O(1,var) ;
1016 return Ot_GetBooleanFromObj(RL_EvalRt(TCL_EVAL_GLOBAL));
1017error:
1018 return 0;
1019}
1020
1022{
1023 OT_OBJ_T ret;
1024 if (script) {
1025 RL_init( 2, info_script_2, RL_NewS(0,"::tcl::info::script") ) ; RL_NewS(1,script) ;
1026 ret = RL_EvalRt(TCL_EVAL_GLOBAL);
1027 } else {
1028 RL_init( 1, info_script_1, RL_NewS(0,"::tcl::info::script") ) ;
1029 ret = RL_EvalRt(TCL_EVAL_GLOBAL);
1030 }
1031 return Tcl_GetStringFromObj(ret,NULL);
1032error:
1033 return NULL;
1034}
1035
1036int MK(AtlClassIsN) ( OT_MK_ARGS OT_SELF_T myNsO, OT_CLS_T clsNsO, bool *boolP )
1037{
1039 int retI;
1040 RL_init(3,MyIsClsN,RL_NewS(0,"::myooX::ClassIsN")) ; RL_O(1,myNsO) ; RL_O(2,clsNsO) ;
1041 retI = RL_EvalEx(TCL_EVAL_GLOBAL);
1042 if (retI != TCL_OK) goto error;
1043 OT_OBJ_T retO = Tcl_GetObjResult(interp);
1044 int intB;
1045 retI = Tcl_GetBooleanFromObj(interp,retO,&intB);
1046 if (retI != TCL_OK) goto error;
1047 (*boolP) = intB;
1048error:
1050 return retI;
1051}
1052
1053// MARK_E ////////////////////////////////////////////////////////////////////////
1058
1059// BEGIN-enum - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1060
1065
1066int MK(Get_MkErrorE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkErrorE *ret) {
1067 const static struct LookupEnumE keys[] = {
1068 { "OK" , MK_OK },
1069 { "MK_OK" , MK_OK },
1070 { "ERROR" , MK_ERROR },
1071 { "CONTINUE" , MK_CONTINUE },
1072 { "MK_ERROR" , MK_ERROR },
1073 { "MK_CONTINUE" , MK_CONTINUE },
1074 { NULL , 0 },
1075 };
1076
1077 int index;
1078 check_LNG(Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1079 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index)) return TCL_ERROR;
1080 *ret = keys[index].val;
1081 return TCL_OK;
1082}
1083
1084int MK(Get_MkIdSE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkIdSE *ret) {
1085 const static struct LookupEnumE keys[] = {
1086 { "UNUSED" , MK_ID_UNUSED },
1087 { "THREAD" , MK_ID_THREAD },
1088 { "PROCESS" , MK_ID_PROCESS },
1089 { "ID_UNUSED" , MK_ID_UNUSED },
1090 { "ID_THREAD" , MK_ID_THREAD },
1091 { "ID_PROCESS" , MK_ID_PROCESS },
1092 { "MK_ID_THREAD" , MK_ID_THREAD },
1093 { "MK_ID_UNUSED" , MK_ID_UNUSED },
1094 { "MK_ID_PROCESS" , MK_ID_PROCESS },
1095 { NULL , 0 },
1096 };
1097
1098 int index;
1099 check_LNG(Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1100 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index)) return TCL_ERROR;
1101 *ret = keys[index].val;
1102 return TCL_OK;
1103}
1104
1105int MK(Get_MkTimeoutE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTimeoutE *ret) {
1106 const static struct LookupEnumE keys[] = {
1107 { "MAX" , MK_TIMEOUT_MAX },
1108 { "LONG" , MK_TIMEOUT_LONG },
1109 { "INIT" , MK_TIMEOUT_INIT },
1110 { "USER" , MK_TIMEOUT_USER },
1111 { "SHORT" , MK_TIMEOUT_SHORT },
1112 { "NORMAL" , MK_TIMEOUT_NORMAL },
1113 { "SOCKET" , MK_TIMEOUT_SOCKET },
1114 { "DEFAULT" , MK_TIMEOUT_DEFAULT },
1115 { "VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1116 { "TIMEOUT_MAX" , MK_TIMEOUT_MAX },
1117 { "TIMEOUT_USER" , MK_TIMEOUT_USER },
1118 { "TIMEOUT_LONG" , MK_TIMEOUT_LONG },
1119 { "TIMEOUT_INIT" , MK_TIMEOUT_INIT },
1120 { "TIMEOUT_SHORT" , MK_TIMEOUT_SHORT },
1121 { "TIMEOUT_NORMAL" , MK_TIMEOUT_NORMAL },
1122 { "TIMEOUT_SOCKET" , MK_TIMEOUT_SOCKET },
1123 { "MK_TIMEOUT_MAX" , MK_TIMEOUT_MAX },
1124 { "MK_TIMEOUT_USER" , MK_TIMEOUT_USER },
1125 { "MK_TIMEOUT_LONG" , MK_TIMEOUT_LONG },
1126 { "MK_TIMEOUT_INIT" , MK_TIMEOUT_INIT },
1127 { "TIMEOUT_DEFAULT" , MK_TIMEOUT_DEFAULT },
1128 { "MK_TIMEOUT_SHORT" , MK_TIMEOUT_SHORT },
1129 { "MK_TIMEOUT_NORMAL" , MK_TIMEOUT_NORMAL },
1130 { "MK_TIMEOUT_SOCKET" , MK_TIMEOUT_SOCKET },
1131 { "TIMEOUT_VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1132 { "MK_TIMEOUT_DEFAULT" , MK_TIMEOUT_DEFAULT },
1133 { "MK_TIMEOUT_VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1134 { NULL , 0 },
1135 };
1136
1137 int index;
1138 check_LNG(Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1139 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index)) return TCL_ERROR;
1140 *ret = keys[index].val;
1141 return TCL_OK;
1142}
1143
1144int MK(Get_MkTypeE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTypeE *ret) {
1145 const static struct LookupEnumE keys[] = {
1146 { "I8T" , MK_I8T },
1147 { "BOLT" , MK_BOLT },
1148 { "STRT" , MK_STRT },
1149 { "DBLT" , MK_DBLT },
1150 { "LSTT" , MK_LSTT },
1151 { "I32T" , MK_I32T },
1152 { "FLTT" , MK_FLTT },
1153 { "I16T" , MK_I16T },
1154 { "BINT" , MK_BINT },
1155 { "I64T" , MK_I64T },
1156 { "MK_I8T" , MK_I8T },
1157 { "MK_BOLT" , MK_BOLT },
1158 { "MK_STRT" , MK_STRT },
1159 { "MK_DBLT" , MK_DBLT },
1160 { "MK_LSTT" , MK_LSTT },
1161 { "MK_I32T" , MK_I32T },
1162 { "MK_FLTT" , MK_FLTT },
1163 { "MK_I16T" , MK_I16T },
1164 { "MK_BINT" , MK_BINT },
1165 { "MK_I64T" , MK_I64T },
1166 { NULL , 0 },
1167 };
1168
1169 int index;
1170 check_LNG(Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1171 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index)) return TCL_ERROR;
1172 *ret = keys[index].val;
1173 return TCL_OK;
1174}
1177
1178// END-enum - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1179
1185
1186// CALLED from: "<destructor>", "META-DATA-Destructor"
1187static void MK(Atom_ns_delete) (MK_MNG mng)
1188{
1189 assert(mng != NULL);
1190 MK_OBJ obj = MkObj(mng);
1191 check_NULL(obj) return;
1192 MkRtSetup_ON(obj);
1193 #ifdef OT_DEBUG_NAMESPACE_DELETE
1194 OT_SELF_T selfO = META2VAL_O(obj);
1195 if (selfO) {
1196 OT_DEBUG_NAMESPACE_DELETE(MK_COLOR_ORANGE,"%s<%p>" , "INS", VAL2STR(selfO), selfO);
1197 } else {
1198 OT_DEBUG_NAMESPACE_DELETE(MK_COLOR_ORANGE,"(selfO=NULL) %s" , "INS", MkObjectToName(obj));
1199 }
1200 #endif
1201
1202//MkObjectLogShort_2Lvl(obj,1);
1203//MkSysPrintStackTrace_4(obj,0,__func__,1);
1204//MkDLogV_O(obj,8,"%s [%s]\n",MkObjectToName(obj),__func__);
1205
1206 // SELF is already "dead"
1208}
1209
1210// update SELF if OBJECT is already available
1211// CALLED from: "<contructor>", MkAtomCreate
1214 OT_SELF_T selfO,
1215 MK_OBJ obj,
1216 MK_PTR const env
1217) {
1218 if (obj) {
1219 MkSelfSet (obj, (void*) selfO, env);
1220 //attention "OT_REF_DECR" in "AtomDeleteHard"
1221 OT_REF_INCR(selfO);
1222 MkRefIncr(obj);
1223
1224 OT_NS_T myNsP = MoxResolveN(selfO);
1225 if (myNsP == NULL) goto error;
1226
1227 myNsP->clientData = obj;
1228 myNsP->deleteProc = MK(Atom_ns_delete);
1229 }
1230
1231 return selfO;
1232error:
1233 // HINT: refCnt-leak in "selfO" and "obj"
1236 return NULL;
1237}
1238
1239// create OBJECT and update SELF
1240// CALLED from: "*_SelfCreate"
1243 MK_OBJ obj,
1244 OT_CLS_T clsC,
1245 OT_OBJ_T nameO,
1246 OT_OBJ_T nsO,
1247 int objc,
1248 OT_OBJ_T const objv[],
1249 MK_PTR const env
1250) {
1252 int retI;
1253 OT_SELF_T selfO = NULL;
1254
1255 retI = MoxCreate3N(clsC, nameO, nsO, objc, objv);
1256 if (retI != TCL_OK) goto error;
1257
1258 selfO = Tcl_GetObjResult(interp);
1259 if (selfO == NULL) goto error;
1260
1261 selfO = AtomInit(selfO,obj,env);
1262 if (selfO == NULL) goto error;
1263
1264 return selfO;
1265error:
1268 return NULL;
1269}
1270
1273 MK_OBJ obj,
1274 OT_CLS_T clsC,
1275 OT_OBJ_T nameO,
1276 OT_OBJ_T nsO,
1277 MK_PTR const env
1278) {
1280 OT_SELF_T selfO = NULL;
1281
1282 selfO = MoxMakeN(clsC, nameO, nsO);
1283 if (selfO == NULL) goto error;
1284
1285 selfO = AtomInit(selfO,obj,env);
1286 if (selfO == NULL) goto error;
1287
1288 return selfO;
1289error:
1292 return NULL;
1293}
1294
1295// create instance "nameO" with "namespace" (default current) and install namespace delete callback
1298 MK_OBJ obj,
1299 OT_CLS_T clsC,
1300 OT_OBJ_T nameO,
1301 MK_PTR const env
1302) {
1303 assert(nameO != NULL);
1304
1305 OT_SELF_T selfO = NULL;
1306 OT_OBJ_T nsO = NULL;
1307
1308 // check if "nameO" has Namespace
1309 if (strncmp("::",Tcl_GetString(nameO),2) != 0) {
1310 nsO = STR2VAL(Tcl_GetCurrentNamespace(interp)->fullName);
1311 Tcl_IncrRefCount(nsO);
1312 }
1313 selfO = AtomCreate(obj, clsC, nameO, nsO, 0, NULL, env);
1314 if (selfO == NULL) goto error;
1315
1316 Ot_DecrRefCount(nsO);
1317 return selfO;
1318error:
1319 Ot_DecrRefCount(nsO);
1321 return NULL;
1322}
1323
1329
1332static int NS(Print_Class_Cmd) (OtClass_ARGS)
1333{
1334 int ret = TCL_OK;
1336 int index;
1337
1338 static const char *option[] = {
1339 "object", "type", "var", NULL
1340 };
1341 enum options {
1342 OBJECT, TYPE, VARIABLE
1343 };
1344
1345 // get the Index
1346 check_LNG (Tcl_GetIndexFromObj (interp, objv[__skip++], option, "subcommand", 0, &index))
1347 return TCL_ERROR;
1348
1349 // do the work
1350 switch ((enum options) index) {
1351 case OBJECT:
1352 WNA(1,1,"tclObj");
1353 Tcl_SetResult (interp, MK(PrintObj) (OT_Prefix_CALL "print", objv[__skip]), TCL_VOLATILE);
1354 break;
1355 case TYPE:
1356 WNA(1,1,"tclObj");
1357 Tcl_SetResult (interp, (char*) MK(GetTypeFromObj) (OT_Prefix_CALL objv[__skip], NULL), TCL_VOLATILE);
1358 break;
1359 case VARIABLE: {
1360 // same as tcl "Print ..."
1361 WNA(1,99,"tclObj...");
1363 RL_init( 1, info_level_1, RL_NewS(0,"::tcl::info::level") )
1364 OT_OBJ_T lvlObj = RL_EvalFr(varframe,0);
1365 int lvl;
1366 check_LNG(Tcl_GetIntFromObj(interp,lvlObj,&lvl)) goto error;
1367 char *STR;
1368 fputs("print var ",stderr);
1369 if (lvl > 0) {
1370 RL_init( 2, info_level_2, RL_NewS(0,"::tcl::info::level") ; RL_NewI(1,0) ) ;
1371 lvlObj = RL_EvalFr(varframe,0);
1372 OT_OBJ_T nameObj;
1373 check_LNG(Tcl_ListObjIndex(interp,lvlObj,0,&nameObj)) goto error;
1374 STR = Tcl_GetString(nameObj);
1375 } else {
1376 STR = "GLOBAL -> ";
1377 }
1378 fputs(STR,stderr);
1379
1380 for (int i=2; i<objc; i++) {
1381 char * nameS = Tcl_GetString(objv[i]);
1382 OT_OBJ_T var = Tcl_ObjGetVar2(interp,objv[i],NULL,0);
1383 if (var) {
1384 fprintf(stderr,"%s<%s>, ", nameS, Tcl_GetString(var));
1385 } else {
1386 fprintf(stderr,"%s<not set>, ", nameS);
1387 }
1388 }
1389 fputs("\n",stderr);
1391 break;
1392error:
1393 ret = TCL_ERROR;
1395 break;
1396 }
1397 }
1398
1399 return ret;
1400}
1401
1404static int NS(Const_Class_Cmd) (OtClass_ARGS)
1405{
1407 int index;
1408
1409 OT_OBJ_T Obj = NULL;
1410
1411 static const char *constant[] = {
1412 "maxY", "minY", "maxS", "minS", "maxI", "minI", "maxF", "minF", "maxW", "minW", "maxD", "minD", NULL
1413 };
1414 enum constants {
1415 MAXY, MINY, MAXS, MINS, MAXI, MINI, MAXF, MINF, MAXW, MINW, MAXD, MIND,
1416 };
1417
1418 WNA(1,1,"(maxY|minY|maxS|minS|maxI|minI|maxF|minF|maxW|minW|maxD|minD)");
1419
1420 // get the Index
1421 check_LNG (Tcl_GetIndexFromObj (interp, objv[__skip], constant, "constant", 0, &index))
1422 return TCL_ERROR;
1423
1424 // do the work
1425 switch ((enum constants) index) {
1426 case MAXY: Obj = Tcl_NewIntObj (SCHAR_MAX); break;
1427 case MINY: Obj = Tcl_NewIntObj (SCHAR_MIN); break;
1428 case MAXS: Obj = Tcl_NewIntObj (SHRT_MAX); break;
1429 case MINS: Obj = Tcl_NewIntObj (SHRT_MIN); break;
1430 case MAXI: Obj = Tcl_NewLongObj (INT_MAX); break;
1431 case MINI: Obj = Tcl_NewLongObj (INT_MIN); break;
1432 case MAXF: Obj = Tcl_NewDoubleObj (FLT_MAX); break;
1433 case MINF: Obj = Tcl_NewDoubleObj (FLT_MIN); break;
1434 case MAXW: Obj = Tcl_NewWideIntObj (LLONG_MAX); break;
1435 case MINW: Obj = Tcl_NewWideIntObj (LLONG_MIN); break;
1436 case MAXD: Obj = Tcl_NewDoubleObj (DBL_MAX); break;
1437 case MIND: Obj = Tcl_NewDoubleObj (DBL_MIN); break;
1438 }
1439
1440 Tcl_SetObjResult (interp, Obj);
1441 return TCL_OK;
1442}
1443
1446static int NS(Support_Class_Cmd) (OtClass_ARGS)
1447{
1449 int index;
1450
1451 Tcl_Obj *Obj = NULL;
1452
1453 static const char *constant[] = {
1454 "thread", "fork", NULL
1455 };
1456 enum constants {
1457 THREAD, FORK,
1458 };
1459
1460 WNA(1,1,"(thread|fork)")
1461
1462 // get the Index
1463 check_LNG (Tcl_GetIndexFromObj (interp, objv[__skip], constant, "configuration", 0, &index)) return TCL_ERROR;
1464
1465 // do the work
1466 switch ((enum constants) index) {
1467 case THREAD:
1468#if META_HAS_THREAD
1469 Obj = Tcl_NewBooleanObj (1);
1470#else
1471 Obj = Tcl_NewBooleanObj (0);
1472#endif
1473 break;
1474 case FORK:
1475#if defined(HAVE_FORK)
1476 Obj = Tcl_NewBooleanObj (1);
1477#else
1478 Obj = Tcl_NewBooleanObj (0);
1479#endif
1480 break;
1481 }
1482
1483 Tcl_SetObjResult (interp, Obj);
1484 return TCL_OK;
1485}
1486
1487/*****************************************************************************/
1488/* */
1489/* enum */
1490/* */
1491/*****************************************************************************/
1492
1545// BEGIN-Enum-ToString - created by 'atl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1546
1551
1553{
1554 switch (type) {
1555 case MK_NO : return ot_fixstrobj("NO" ) ;
1556 case MK_YES : return ot_fixstrobj("YES") ;
1557 }
1558 return ot_fixstrobj("NOTHING");
1559}
1560
1562{
1563 switch (type) {
1564 case MK_OK : return ot_fixstrobj("OK" ) ;
1565 case MK_CONTINUE : return ot_fixstrobj("CONTINUE") ;
1566 case MK_ERROR : return ot_fixstrobj("ERROR" ) ;
1567 }
1568 return ot_fixstrobj("NOTHING");
1569}
1570
1571OT_OBJ_T MK(MkIdSE_ToString) ( const enum MkIdSE type )
1572{
1573 switch (type) {
1574 case MK_ID_UNUSED : return ot_fixstrobj("UNUSED" ) ;
1575 case MK_ID_PROCESS : return ot_fixstrobj("PROCESS") ;
1576 case MK_ID_THREAD : return ot_fixstrobj("THREAD" ) ;
1577 }
1578 return ot_fixstrobj("NOTHING");
1579}
1580
1582{
1583 switch (type) {
1584 case MK_NATIVE_IS_INITIAL : return ot_fixstrobj("INITIAL") ;
1585 case MK_NATIVE_IS_STRING : return ot_fixstrobj("STRING" ) ;
1586 case MK_NATIVE_IS_LITTLE : return ot_fixstrobj("LITTLE" ) ;
1587 case MK_NATIVE_IS_BIG : return ot_fixstrobj("BIG" ) ;
1588 }
1589 return ot_fixstrobj("NOTHING");
1590}
1591
1593{
1594 switch (type) {
1595 case MK_TIMEOUT_INIT : return ot_fixstrobj("INIT" ) ;
1596 case MK_TIMEOUT_LONG : return ot_fixstrobj("LONG" ) ;
1597 case MK_TIMEOUT_NORMAL : return ot_fixstrobj("NORMAL" ) ;
1598 case MK_TIMEOUT_SHORT : return ot_fixstrobj("SHORT" ) ;
1599 case MK_TIMEOUT_SOCKET : return ot_fixstrobj("SOCKET" ) ;
1600 case MK_TIMEOUT_VERYSHORT : return ot_fixstrobj("VERYSHORT") ;
1601 case MK_TIMEOUT_DEFAULT : return ot_fixstrobj("DEFAULT" ) ;
1602 case MK_TIMEOUT_USER : return ot_fixstrobj("USER" ) ;
1603 case MK_TIMEOUT_MAX : return ot_fixstrobj("MAX" ) ;
1604 }
1605 return ot_fixstrobj("NOTHING");
1606}
1607
1609{
1610 switch (type) {
1611 case MK_I8T : return ot_fixstrobj("I8T" ) ;
1612 case MK_BOLT : return ot_fixstrobj("BOLT") ;
1613 case MK_I16T : return ot_fixstrobj("I16T") ;
1614 case MK_I32T : return ot_fixstrobj("I32T") ;
1615 case MK_FLTT : return ot_fixstrobj("FLTT") ;
1616 case MK_I64T : return ot_fixstrobj("I64T") ;
1617 case MK_DBLT : return ot_fixstrobj("DBLT") ;
1618 case MK_BINT : return ot_fixstrobj("BINT") ;
1619 case MK_STRT : return ot_fixstrobj("STRT") ;
1620 case MK_LSTT : return ot_fixstrobj("LSTT") ;
1621 }
1622 return ot_fixstrobj("NOTHING");
1623}
1626
1627// END-Enum-ToString - created by 'atl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1628
1629// BEGIN-MkKernel - created by 'atl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1630
1634
1635// doc-key: MkKernel,MkKernel-Enum,sco
1636
1638static OT_ProcRet NS(MkKernel_ErrorE_FromInt) (OtClass_ARGS) {
1641 MK_I32 value = 0;
1644 enum MkErrorE value_out;
1645 MkErrorC_Check(MK_ERROR_FORMAT,MkErrorE_FromInt (value, &value_out));
1646 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(ErrorE,value_out));
1647 goto end;
1648 error:
1650 end:
1652}
1653
1655static OT_ProcRet NS(MkKernel_IdSE_FromInt) (OtClass_ARGS) {
1658 MK_I32 value = 0;
1661 enum MkIdSE value_out;
1662 MkErrorC_Check(MK_ERROR_FORMAT,MkIdSE_FromInt (value, &value_out));
1663 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(IdSE,value_out));
1664 goto end;
1665 error:
1667 end:
1669}
1670
1672static OT_ProcRet NS(MkKernel_TimeoutE_FromInt) (OtClass_ARGS) {
1675 MK_I32 value = 0;
1678 enum MkTimeoutE value_out;
1680 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(TimeoutE,value_out));
1681 goto end;
1682 error:
1684 end:
1686}
1687
1689static OT_ProcRet NS(MkKernel_TypeE_FromInt) (OtClass_ARGS) {
1692 MK_I32 value = 0;
1695 enum MkTypeE value_out;
1696 MkErrorC_Check(MK_ERROR_FORMAT,MkTypeE_FromInt (value, &value_out));
1697 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(TypeE,value_out));
1698 goto end;
1699 error:
1701 end:
1703}
1704
1705// doc-key: MkKernel,MkKernel-Enum,sm_
1706
1708static OT_ProcRet NS(MkKernel_ErrorE_ToInt) (OtClass_ARGS) {
1711 enum MkErrorE value = 0;
1715 goto end;
1716 error:
1718 end:
1720}
1721
1723static OT_ProcRet NS(MkKernel_ErrorE_ToString) (OtClass_ARGS) {
1726 enum MkErrorE value = 0;
1730 goto end;
1731 error:
1733 end:
1735}
1736
1738static OT_ProcRet NS(MkKernel_IdSE_ToInt) (OtClass_ARGS) {
1741 enum MkIdSE value = 0;
1745 goto end;
1746 error:
1748 end:
1750}
1751
1753static OT_ProcRet NS(MkKernel_IdSE_ToString) (OtClass_ARGS) {
1756 enum MkIdSE value = 0;
1760 goto end;
1761 error:
1763 end:
1765}
1766
1768static OT_ProcRet NS(MkKernel_TimeoutE_ToInt) (OtClass_ARGS) {
1771 enum MkTimeoutE value = 0;
1775 goto end;
1776 error:
1778 end:
1780}
1781
1783static OT_ProcRet NS(MkKernel_TimeoutE_ToString) (OtClass_ARGS) {
1786 enum MkTimeoutE value = 0;
1790 goto end;
1791 error:
1793 end:
1795}
1796
1798static OT_ProcRet NS(MkKernel_TypeE_ToInt) (OtClass_ARGS) {
1801 enum MkTypeE value = 0;
1805 goto end;
1806 error:
1808 end:
1810}
1811
1813static OT_ProcRet NS(MkKernel_TypeE_ToString) (OtClass_ARGS) {
1816 enum MkTypeE value = 0;
1820 goto end;
1821 error:
1823 end:
1825}
1826
1828// MkKernel_Enum_ATL_API
1829
1833
1834// doc-key: MkKernel,MkKernel-Setup-libmkkernel,sm_
1835
1837static OT_ProcRet NS(MkKernel_Cleanup) (OtClass_ARGS) {
1841 MkCleanupTmpl ();
1843 goto end;
1844 error:
1846 end:
1848}
1849
1851static OT_ProcRet NS(MkKernel_Setup) (OtClass_ARGS) {
1855 MkSetupTmpl ();
1857 goto end;
1858 error:
1860 end:
1862}
1863
1865// MkKernel_Setup_libmkkernel_ATL_API
1866
1867// END-MkKernel - created by 'atl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1868
1869// ---------------------------------------------------------------------------------------
1870
1871MK_UNUSED
1872static const OtObjProcDefS MK(sOtClassDef)[] = {
1873 { "::MkKernel::print" , NS(Print_Class_Cmd) },
1874 { "::MkKernel::const" , NS(Const_Class_Cmd) },
1875 { "::MkKernel::support" , NS(Support_Class_Cmd) },
1876 // BEGIN-CLASS - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1877
1878 // doc-key: MkKernel,EnumFunc,sco
1879 { "::MkKernel::ErrorE_FromInt" , NS(MkKernel_ErrorE_FromInt) },
1880 { "::MkKernel::IdSE_FromInt" , NS(MkKernel_IdSE_FromInt) },
1881 { "::MkKernel::TimeoutE_FromInt" , NS(MkKernel_TimeoutE_FromInt) },
1882 { "::MkKernel::TypeE_FromInt" , NS(MkKernel_TypeE_FromInt) },
1883
1884 // doc-key: MkKernel,EnumFunc,sm_
1885 { "::MkKernel::ErrorE_ToInt" , NS(MkKernel_ErrorE_ToInt) },
1886 { "::MkKernel::ErrorE_ToString" , NS(MkKernel_ErrorE_ToString) },
1887 { "::MkKernel::IdSE_ToInt" , NS(MkKernel_IdSE_ToInt) },
1888 { "::MkKernel::IdSE_ToString" , NS(MkKernel_IdSE_ToString) },
1889 { "::MkKernel::TimeoutE_ToInt" , NS(MkKernel_TimeoutE_ToInt) },
1890 { "::MkKernel::TimeoutE_ToString" , NS(MkKernel_TimeoutE_ToString) },
1891 { "::MkKernel::TypeE_ToInt" , NS(MkKernel_TypeE_ToInt) },
1892 { "::MkKernel::TypeE_ToString" , NS(MkKernel_TypeE_ToString) },
1893
1894 // doc-key: MkKernel,Setup,sm_
1895 { "::MkKernel::Cleanup" , NS(MkKernel_Cleanup) },
1896 { "::MkKernel::Setup" , NS(MkKernel_Setup) },
1897
1898 // END-CLASS - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1899 { NULL }
1900};
1901
1902// ---------------------------------------------------------------------------------------
1903// not used.
1904
1905__attribute__((unused))
1906static const OtObjProcDefS MK(sInstanceDef)[] = {
1907 // BEGIN-OBJ - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1908
1909 // → no data
1910
1911 // END-OBJ - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1912 { NULL }
1913};
1914
1920
1921void NS(MkKernel_ns_delete)(ClientData clientData)
1922{
1923 OT_MK_RT_T amkrt = clientData;
1924#ifdef OT_DEBUG_NAMESPACE_DELETE
1925 OT_DEBUG_NAMESPACE_DELETE(MK_COLOR_YELLOW,"::MkKernel with amkrt<%p>","MK",amkrt);
1926#endif
1927 OT_ENV_T interp = amkrt->interp;
1928 //amkrt->status = OT_MK_RT_STATUS_ONEXIT;
1929
1930 // BEGIN-CLASS-delete-2 - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1931
1932 OT_NS_T ns;
1933 ns = Tcl_FindNamespace(interp,"::MkBufferStreamC",NULL,TCL_GLOBAL_ONLY);
1934 if (ns) Tcl_DeleteNamespace(ns);
1935 ns = Tcl_FindNamespace(interp,"::MkRuntimeC",NULL,TCL_GLOBAL_ONLY);
1936 if (ns) Tcl_DeleteNamespace(ns);
1937 ns = Tcl_FindNamespace(interp,"::MkErrorC",NULL,TCL_GLOBAL_ONLY);
1938 if (ns) Tcl_DeleteNamespace(ns);
1939 ns = Tcl_FindNamespace(interp,"::MkLogFileC",NULL,TCL_GLOBAL_ONLY);
1940 if (ns) Tcl_DeleteNamespace(ns);
1941 ns = Tcl_FindNamespace(interp,"::MkBufferListC",NULL,TCL_GLOBAL_ONLY);
1942 if (ns) Tcl_DeleteNamespace(ns);
1943 ns = Tcl_FindNamespace(interp,"::MkBufferC",NULL,TCL_GLOBAL_ONLY);
1944 if (ns) Tcl_DeleteNamespace(ns);
1945 ns = Tcl_FindNamespace(interp,"::MkObjectC",NULL,TCL_GLOBAL_ONLY);
1946 if (ns) Tcl_DeleteNamespace(ns);
1947
1948 // END-CLASS-delete-2 - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1949
1950 // delete all TYPES registert in amkrt
1951 // test: Nhi1Exec --prefix=vgs MyServer.atl → should be empty
1952 AtlClassDefT item,tmp;
1953 DL_FOREACH_SAFE(amkrt->atlClassDefL,item,tmp) {
1954 Tcl_DeleteNamespace(item->classNS);
1955 }
1956
1957 #define AtlRtFree(tok) if (amkrt->tok) OT_REF_DECR_AND_NULL(amkrt->tok);
1958 #define regTclObj2(t,v) AtlRtFree(t)
1959 #define regTclObj(t) AtlRtFree(t)
1960 #define regTclCmd(t) AtlRtFree(t)
1962 #undef regTclCmd
1963 #undef regTclObj
1964 #undef regTclObj2
1965
1966 // BEGIN-CLASS-delete - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1967
1968 if (amkrt->AtlMkBufferStreamC) Tcl_DecrRefCount(amkrt->AtlMkBufferStreamC) ;
1969 if (amkrt->AtlMkBufferStreamC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkBufferStreamC_MK_NULL) ;
1970 if (amkrt->AtlMkRuntimeC) Tcl_DecrRefCount(amkrt->AtlMkRuntimeC) ;
1971 if (amkrt->AtlMkRuntimeC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkRuntimeC_MK_NULL) ;
1972 if (amkrt->AtlMkErrorC) Tcl_DecrRefCount(amkrt->AtlMkErrorC) ;
1973 if (amkrt->AtlMkErrorC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkErrorC_MK_NULL) ;
1974 if (amkrt->AtlMkLogFileC) Tcl_DecrRefCount(amkrt->AtlMkLogFileC) ;
1975 if (amkrt->AtlMkLogFileC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkLogFileC_MK_NULL) ;
1976 if (amkrt->AtlMkBufferListC) Tcl_DecrRefCount(amkrt->AtlMkBufferListC) ;
1977 if (amkrt->AtlMkBufferListC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkBufferListC_MK_NULL) ;
1978 if (amkrt->AtlMkBufferC) Tcl_DecrRefCount(amkrt->AtlMkBufferC) ;
1979 if (amkrt->AtlMkBufferC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkBufferC_MK_NULL) ;
1980 if (amkrt->AtlMkObjectC) Tcl_DecrRefCount(amkrt->AtlMkObjectC) ;
1981 if (amkrt->AtlMkObjectC_MK_NULL) Tcl_DecrRefCount(amkrt->AtlMkObjectC_MK_NULL) ;
1982
1983 // END-CLASS-delete - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1984
1985 //amkrt->status = OT_MK_RT_STATUS_DELETED;
1986 amkrt->signature = 0x0;
1987}
1988
1990
1991// called on every NEW thread
1992OT_ATL_EXTERN int Atlmkkernel_Init ( OT_ENV_T interp )
1993{
1994 // check for the right tcl version
1995 if (Tcl_InitStubs (interp, "8.5", false) == NULL) {
1996 return TCL_ERROR;
1997 }
1998
1999 // setup libmkkernel
2000 MkSetup();
2002
2003 // announce my package
2004 check_LNG (Tcl_PkgProvideEx (interp, "atlmkkernel", META_VERSION, &amkrtR )) return TCL_ERROR;
2005
2006 // pkg_mkIndex hack → only "Tcl_PkgProvide" is required
2007 if (Tcl_GetVar(interp,"::tcl::newPkgs", TCL_GLOBAL_ONLY) != NULL) return TCL_OK;
2008
2009 // dependency.
2010 MK_STRN ver = Tcl_PkgRequire(interp, "libmyoox", "1.0", 0);
2011 check_NULL(ver) return TCL_ERROR;
2012
2013 // create local runtime
2014 // -> cleanup in: MkKernel_ns_delete
2015 OT_MK_RT_T amkrt = &amkrtR;
2016 if (amkrt->signature && amkrt->signature != OT_MK_RT_SIG) {
2017 Tcl_SetErrorCode(interp, "ATLMK", "INIT", "SIGNATURE", "INVALID", NULL);
2018 Tcl_SetResult(interp,"error: ATLMK setup failed with INVALID signature", TCL_STATIC);
2019 return TCL_ERROR;
2020 } else {
2021 amkrt->signature = OT_MK_RT_SIG;
2022 }
2023 if (amkrt->interp && amkrt->interp != interp) {
2024 Tcl_SetErrorCode(interp, "ATLMK", "INIT", "INTERPRETER", "INVALID", NULL);
2025 Tcl_SetResult(interp,"error: ATLMK setup failed with INVALID interpreter", TCL_STATIC);
2026 return TCL_ERROR;
2027 } else {
2028 amkrt->interp = interp;
2029 }
2030 if (amkrt->mkrt && amkrt->mkrt != MK_RT_PTR) {
2031 Tcl_SetErrorCode(interp, "ATLMK", "INIT", "MK_RT", "INVALID", NULL);
2032 Tcl_SetResult(interp,"error: ATLMK setup failed with INVALID MkRuntimeS", TCL_STATIC);
2033 return TCL_ERROR;
2034 } else {
2035 amkrt->mkrt = MK_RT_PTR;
2036 }
2037
2038 // get "moxrt" from "::myooX"
2039 MOX_NS_T ns = Tcl_FindNamespace(interp,"::myooX",NULL,TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG);
2040 if (ns == NULL) return TCL_ERROR;
2041 amkrt->moxrt = ns->clientData;
2042 if (amkrt->moxrt == NULL) {
2043 Tcl_SetResult(interp,"error: libmyoox is broken, 'clientData=moxrt' is missing", TCL_STATIC);
2044 Tcl_SetErrorCode(interp, "ATLMK", "INIT", "LOOKUP", NULL);
2045 return TCL_ERROR;
2046 }
2047
2048 // cleanup "access" objects
2049 #define regTclObj2(t,v) if (amkrt->t) OT_REF_DECR(amkrt->t)
2050 #define regTclObj(t) regTclObj2(t,#t)
2051 #define regTclCmd(t) regTclObj2(t,#t)
2053 #undef regTclCmd
2054 #undef regTclObj
2055 #undef regTclObj2
2056
2057 // register "access" objects
2058 #define regTclObj2(t,v) amkrt->t = STR2VAL(v); Tcl_IncrRefCount(amkrt->t);
2059 #define regTclObj(t) regTclObj2(t,#t)
2060 #define regTclCmd(t) regTclObj2(t,#t)
2062 #undef regTclCmd
2063 #undef regTclObj
2064 #undef regTclObj2
2065
2066 // create ::MkKernel
2067 ns = Tcl_FindNamespace(interp,"::MkKernel",NULL,TCL_GLOBAL_ONLY);
2068 if (ns == NULL) {
2069 ns = Tcl_CreateNamespace(interp,"::MkKernel",amkrt,NS(MkKernel_ns_delete));
2070 if (ns == NULL) return TCL_ERROR;
2071 }
2072
2073 // add PACKAGE commands
2074 check_LNG( MK(FillNamespace) (interp,MK(sOtClassDef),amkrt) ) return TCL_ERROR;
2075
2076 // ATTENTION: MK(ClassDef) "class-resolution" require that "MkObjectC" is always first
2077 // BEGIN-CLASS-call-init - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
2078
2079 check_LNG( NS(pMkObjectC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2080 check_LNG( NS(pMkBufferC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2081 check_LNG( NS(pMkBufferListC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2082 check_LNG( NS(pMkLogFileC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2083 check_LNG( NS(pMkErrorC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2084 check_LNG( NS(pMkRuntimeC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2085 check_LNG( NS(pMkBufferStreamC_Init) (OT_MK_CALL ns) ) return TCL_ERROR;
2086
2087 // END-CLASS-call-init - created by 'atl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
2088
2089 // get TCL internal data types
2090 amkrt->LONG = Tcl_GetObjType("int") ;
2091 amkrt->WIDE = Tcl_GetObjType("wideInt") ;
2092 amkrt->DOUBLE = Tcl_GetObjType("double") ;
2093 amkrt->BOOLEAN = Tcl_GetObjType("booleanString") ;
2094 amkrt->INDEX = Tcl_GetObjType("index") ;
2095
2096 amkrt->NS = Tcl_GetObjType("nsName") ;
2097
2098 return TCL_OK;
2099}
2100
2102{
2103 OT_NS_T ns = Tcl_FindNamespace(interp,"::MkKernel",NULL,TCL_GLOBAL_ONLY);
2104 if (ns) Tcl_DeleteNamespace(ns);
2105
2106 MkCleanup();
2107
2108 return TCL_OK;
2109}
__thread OT_MK_RT_S amkrtR
#define IdSE_ToString_doc
#define TimeoutE_FromInt_doc
#define AtlClassDefS_SIG
#define MkCleanupTmpl()
#define objF
#define _printV(fmt,...)
#define Get_Call_Cmd__SIZE
OT_ATL_EXTERN int Atlmkkernel_Unload(OT_ENV_T interp, int flags)
#define AtlClassDefGetTypNN(...)
#define SIZE
#define FRAME_UPDATE
#define FRAME_GET(key)
#define IdSE_ToInt_doc
#define ErrorE_ToString_doc
#define AtlClassDefGetTypN(...)
#define OT_SETUP_hdl_static
#define ErrorE_FromInt_doc
#define ClassDefCreateNN(...)
#define ErrorE_ToInt_doc
#define TypeE_ToInt_doc
#define AtlClassDefGetTypNNN(...)
#define MkSetupTmpl()
#define TypeE_FromInt_doc
#define TimeoutE_ToString_doc
#define Cleanup_doc
#define Setup_doc
#define objA
#define IdSE_FromInt_doc
#define TimeoutE_ToInt_doc
#define OtClass_ARGS
#define TypeE_ToString_doc
#define check_NULL(code)
#define MK(n)
#define AtomMake(...)
#define AtlInfoExists(l)
#define AtomInit(...)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
#define OT_DEBUG_NAMESPACE_DELETE(...)
#define SETUP_moxrt
#define SETUP_ARGS
#define AtlInfoScript(s)
#define OT_VARFRAME_DELETE
#define AtomCreate(...)
#define Ot_GetBooleanFromObj(val)
MOX_ENV_T OT_ENV_T
#define STR2VAL(ptr)
#define OT_CHECK_NI4(val)
MOX_NS_T OT_NS_T
#define OT_retObj_SET_Error
#define OT_LNG_NAME_FROM_CLASS(_cls)
#define AtomCreateCONSTR(...)
#define AtlClassIsN(...)
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_None
#define OT_retObj_SET_I32(nat)
#define OT_Prefix_CALL
#define OT_ERROR_VAR_DEFAULT(...)
MOX_OBJ_T OT_SELF_T
static void Ot_DecrRefCount(OT_OBJ_T tclO)
#define OT_Check_ARGS
#define WNA(min, max, txt)
MOX_CLS_T OT_CLS_T
#define NS(n)
#define VAL2MNG(val)
#define OT_CHECK_ENUM(ename, val)
#define VAL2STR(val)
#define OT_ERROR_LNG_RETURN_HDL_IS_NULL()
#define Self2PtrNN(myP)
#define ot_fixstrobj(_s)
#define OT_retObj_RETURN
#define AtlClassDefGetNN(...)
#define FRAME_ARGS
#define check_LNG(code)
#define OT_ERROR_LNG_2_META(m)
#define OT_ERROR_APPEND_LNG_STACK()
#define OT_MK_CALL
#define OT_MK_ARGS
#define OT_retObj_SET_STR(nat)
#define OT_NEW_Mk_enum_OBJ(typ, val)
struct AtlClassDefS AtlClassDefS
#define OT_REF_DECR_AND_NULL(_obj)
#define ATL_ARGS
#define OT_REF_DECR(_obj)
#define OT_retObj_SET(val)
#define OT_MK_RT_SIG
#define str(s)
#define OT_REF_INCR(_obj)
#define AtlArrayExists(l)
#define OT_VARFRAME_CREATE
#define OT_CHECK_NOARGS
#define MkErrorC_Check(mng, PROC)
#define OT_ProcRet
#define AtlClassName_buf_size
#define FRAME_CALL
#define OT_Prefix_ARGS
#define xstr(s)
#define META2VAL_O(o)
#define OT_ATL_EXTERN
MOX_OBJ_T OT_OBJ_T
tag: nhi1-release-250425
#define RL_EvalRt(f)
#define RL_EvalFr(frm, f)
tag: nhi1-release-250425
#define MkBufferAppendV(...)
#define MkBUF(x)
cast a known-object into an MkBufferS pointer
#define MkBUF_R(x)
cast a known-object into an MkBufferS reference
#define MkBufferSetV(...)
#define MkBufferCreateTLS_T(cls, name, size)
create an new MkBufferC object as T)hread L)ocal S)torage…
#define MkBufferListIndexSetSTR(...)
#define MkBufferListReserve(...)
#define MkBufferListCreate(...)
#define MkErrorStackFormat(...)
#define MkErrorStackFormat_0E()
#define MK_ERROR_PANIC
#define MK_ERROR_FORMAT
#define mk_inline
#define MK_UNUSED
mark unnused variables and functions
static bool MK_NULL_STR_CHECK(char const *const __str, const long int __len)
check if __str is MK_NULL_STR return true or false …
MK_STRN MkTimeoutE_ToString(enum MkTimeoutE value)
return the MkTimeoutE as string …
MkTimeoutE
Predefined Timeout values …
MkBoolE
the internal boolean …
enum MkErrorE MkIdSE_FromInt(MK_I32 const value, enum MkIdSE *value_out)
return the MkIdSE from integer …
static MK_I32 MkTypeE_ToInt(enum MkTypeE value)
return the MkTypeE as integer …
static MK_I32 MkErrorE_ToInt(enum MkErrorE value)
return the MkErrorE as integer …
MK_STRN MkNativeIsE_ToString(enum MkNativeIsE value)
return the MkNativeIsE as string …
static MK_I32 MkTimeoutE_ToInt(enum MkTimeoutE value)
return the MkTimeoutE as integer …
enum MkErrorE MkTypeE_FromInt(MK_I32 const value, enum MkTypeE *value_out)
return the MkTypeE from integer …
MK_STRN MkBoolE_ToString(enum MkBoolE value)
return the MkBoolE as string …
MK_STRN MkIdSE_ToString(enum MkIdSE value)
return the MkIdSE as string …
static MK_I32 MkIdSE_ToInt(enum MkIdSE value)
return the MkIdSE as integer …
enum MkErrorE MkErrorE_FromInt(MK_I32 const value, enum MkErrorE *value_out)
return the MkErrorE from integer …
enum MkErrorE MkTimeoutE_FromInt(MK_I32 const value, enum MkTimeoutE *value_out)
return the MkTimeoutE from integer …
MK_STRN MkTypeE_ToString(enum MkTypeE value)
return the MkTypeE as string …
MkErrorE
collection for the different error-codes …
MkNativeIsE
define if data is string or little or big endian …
MkTypeE
basic data-types supported by Programming-Language-Micro-Kernel (PLMK) …
MK_STRN MkErrorE_ToString(enum MkErrorE value)
return the MkErrorE as string …
@ MK_TIMEOUT_LONG
long timeout in sec (180 sec) …
@ MK_TIMEOUT_VERYSHORT
very short timeout in sec (5 sec) …
@ MK_TIMEOUT_INIT
maximum timeout in sec (900 sec) …
@ MK_TIMEOUT_MAX
request the maximum possible (infinite) timeout value …
@ MK_TIMEOUT_NORMAL
normal timeout in sec (90 sec) …
@ MK_TIMEOUT_USER
request the user defined timeout value from the –timeout configuration value …
@ MK_TIMEOUT_SOCKET
shorter timeout in sec (10 sec) … This TIMEOUT is used for socket connection with 'connect'
@ MK_TIMEOUT_SHORT
short timeout in sec (20 sec) …
@ MK_TIMEOUT_DEFAULT
request the default timeout value …
@ MK_YES
boolean YES
@ MK_NO
boolean NO
@ MK_ERROR
(persistent) raise an error-event, the calling-fucntion is interrupted.
@ MK_CONTINUE
(transient) raise an continue-event, the calling-function must handle this.
@ MK_OK
(persistent) everything is OK.
@ MK_NATIVE_IS_INITIAL
0 = initial value
@ MK_NATIVE_IS_STRING
S = using of the string protocol.
@ MK_NATIVE_IS_LITTLE
L = using if the binary protocoll, data in little-edian.
@ MK_NATIVE_IS_BIG
B = using if the binary protocoll, data in big-endian.
@ MK_I8T
Y: 1 byte 'byte' type.
@ MK_I64T
W: 8 byte 'long long int' type.
@ MK_FLTT
F: 4 byte 'float' type.
@ MK_BINT
B: X byte 'byte-array' type.
@ MK_I16T
S: 2 byte 'short' type.
@ MK_BOLT
O: 1 byte 'boolean' type.
@ MK_DBLT
D: 8 byte 'double' type.
@ MK_I32T
I: 4 byte 'int' type.
@ MK_STRT
C: X byte 'string' type (e.g. with a \0 at the end)
@ MK_LSTT
L: X byte 'list' type.
void MkSetup(void)
setup atlmkkernel internal memory …
void MkCleanup(void)
cleanup atlmkkernel internal memory …
static MkStringR MkStringCreate(MK_NUM len, MK_STRN str)
create a str from ptr and len ...
static bool MkStringIsNULL(MkStringR const strR)
check if strR is MK_NULL_STR return true or false …
MK_PTRB * MK_PTR
generic pointer data-type
const MK_STRB * MK_STRN
constant string pointer data-type
MK_PTRB * MK_MNG
managed object pointer, datatype will be checked at runtime
MK_STRB * MK_STR
string pointer data-type with UTF8 ecoding (string)
signed int MK_I32
4 byte integer data-type
#define __MkCheckTO(t, o)
static MK_OBJ MkObjectNext(MK_OBJ const obj)
get next instance from linked-list of MkObjectS type
#define MkObjectC_TT
class as MkTypeS-class-type, useable in a class-macro as: class##_TT …
#define MkOBJ_R(x)
cast a known-object into an MkObjectS reference
static bool MkObjCheck(MK_MNGN mng)
check MkObjectS -> MkObjectS::signature …
static MK_OBJ MkObj(MK_MNG mng)
cast a unknown-object into an MkObjectS pointer or NULL if not possible
#define MkObjectToName(...)
#define MkRefDecrWithoutSelf(...)
static void MkSelfSet(MK_OBJ const obj, MK_PTR const self, MK_PTR const env)
set the MkObjectS::self value
static void MkRefIncr(MK_OBJ obj)
increment the reference-count
#define MkSelfSet_3X(x, self, env)
MkIdSE
signal type of the MkIdS data val …
#define MkSysFree(pointer)
MK_PTR MkSysMalloc(MK_OBJN fmtobj, size_t const size)
malloc syscall with atlmkkernel error plugin
@ MK_ID_THREAD
val has a thread handle
@ MK_ID_PROCESS
val has a process handle
@ MK_ID_UNUSED
empty struct
#define MkThreadLocal
#define MK_RT_PTR
#define MkRtSetup_ON(o)
#define MK_RT_CALL
#define MK_RT_ARGS
#define MkRtSetup_NULL
#define MK_RT_REF
#define MkRtSetup_RT(r)
#define MkTypeForeachInstancesSave(typ)
tag: nhi1-release-250425
#define WrongNumArgs(...)
MK_ATTR_HOT MK_EXTERN enum MkErrorE MK_DECL MK Obj_AsSTRN(OT_Check_ARGS, MK_STRN *)
tag: nhi1-release-250425
bool MK TestObject(OT_Prefix_ARGS OT_OBJ_T lngO, OT_CLS_T typeO, MK_OBJ *objP, MkTestClassE *flagP)
#define OT_LNG_OBJECT_IS_3(objV, obj, flag)
@ MkTestClassE_NONE_OBJECT
@ MkTestClassE_INTERNAL
@ MkTestClassE_OK
@ MkTestClassE_INVALID_SIGNATURE
@ MkTestClassE_NULL
@ MkTestClassE_WRONG_CLASS
tag: nhi1-release-250425
struct AtlClassDefS * next
The CLASS used to store a list of MkBufferS items into a flat array…
The data-type to store and handle the error-condition …
object header …
MK_PTR self
link between the managed object and the object in the target-programming-language
MkTypeS - class known as typ or type is used as class-base for a Managed-Object-Technology (MOT) type...
MK_TYP type_class
point to the instancesR linked list of the class-type
MK_STRB type_name[MkTypeS_name_size]
public name of the type like TclMqContextC
MK_TYP type_base
base type
OT_CLS_T AtlMkRuntimeC
OT_CLS_T AtlMkErrorC
const Tcl_ObjType * BOOLEAN
OT_OBJ_T AtlMkBufferC_MK_NULL
OT_OBJ_T AtlMkErrorC_MK_NULL
OT_OBJ_T AtlMkBufferStreamC_MK_NULL
struct AtlClassDefS * atlClassDefL
OT_OBJ_T AtlMkObjectC_MK_NULL
OT_CLS_T AtlMkLogFileC
const Tcl_ObjType * WIDE
OT_CLS_T AtlMkBufferListC
const Tcl_ObjType * DOUBLE
OT_CLS_T AtlMkBufferStreamC
const Tcl_ObjType * NS
OT_ENV_T interp
OT_OBJ_T AtlMkLogFileC_MK_NULL
OT_CLS_T AtlMkObjectC
const Tcl_ObjType * INDEX
OT_OBJ_T AtlMkRuntimeC_MK_NULL
OT_CLS_T AtlMkBufferC
const Tcl_ObjType * LONG
OT_OBJ_T AtlMkBufferListC_MK_NULL