theKernel 10.0
Loading...
Searching...
No Matches
LibMkKernel_tcl.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#define META_FILE_NAME "MkKernel_tcl.c"
12#define VER TCL_OO_METHOD_VERSION_CURRENT
13
15
16#undef OtClass_ARGS
17#define OtClass_ARGS OBJCMD_ARGS
18
19#define OT_SETUP_hdl_static \
20 int __skip=1;\
21 /* printAry2("cmd",objc,objv); */ \
22 __attribute__((unused)) MK_RT mkrt = MkRT; \
23 __attribute__((unused)) MK_ERR hdl = &MkERROR;
24
25/* LABEL-END */
26
27#include <limits.h>
28#include <float.h>
29#include <math.h>
30#include <ctype.h>
31
32#include "mk_check_tcl.h"
33
34#define MkSetupTmpl()
35#define MkCleanupTmpl()
36
37// #######################################################################
38// -----------------------------------------------------------------------
39// documentation order
54
65
77
89
99
111
119
131
141
142const Tcl_ObjType *MK(tcl_LONG) = NULL;
143const Tcl_ObjType *MK(tcl_WIDE) = NULL;
144const Tcl_ObjType *MK(tcl_DOUBLE) = NULL;
145const Tcl_ObjType *MK(tcl_BOOLEAN) = NULL;
146const Tcl_ObjType *MK(tcl_INDEX) = NULL;
147
148#ifdef OT_REGISTRY_AS_TLS
149 MkThreadLocal OT_OBJ_T MK(reggv)[100] = {0};
150#else
151 OT_OBJ_T MK(reggv)[100] = {0};
152#endif
153#define regTclObj(str) int MK(str);
154#define regTclObj2(def,str) int MK(def);
155#include "MkRegistry_tcl.h"
156#undef regTclObj
157#undef regTclObj2
158
159// --------------------------------------------------------------------------------
160
161// BEGIN-DOC - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
162
163// doc-key: MkKernel,EnumFunc,sco,func
164#define ErrorE_FromInt_doc "MkErrorE [MkKernel ErrorE_FromInt value:int32]"
165#define IdSE_FromInt_doc "MkIdSE [MkKernel IdSE_FromInt value:int32]"
166#define TimeoutE_FromInt_doc "MkTimeoutE [MkKernel TimeoutE_FromInt value:int32]"
167#define TypeE_FromInt_doc "MkTypeE [MkKernel TypeE_FromInt value:int32]"
168
169// doc-key: MkKernel,EnumFunc,sm_,func
170#define ErrorE_ToInt_doc "int32 [MkKernel ErrorE_ToInt value:MkErrorE]"
171#define ErrorE_ToString_doc "string [MkKernel ErrorE_ToString value:MkErrorE]"
172#define IdSE_ToInt_doc "int32 [MkKernel IdSE_ToInt value:MkIdSE]"
173#define IdSE_ToString_doc "string [MkKernel IdSE_ToString value:MkIdSE]"
174#define TimeoutE_ToInt_doc "int32 [MkKernel TimeoutE_ToInt value:MkTimeoutE]"
175#define TimeoutE_ToString_doc "string [MkKernel TimeoutE_ToString value:MkTimeoutE]"
176#define TypeE_ToInt_doc "int32 [MkKernel TypeE_ToInt value:MkTypeE]"
177#define TypeE_ToString_doc "string [MkKernel TypeE_ToString value:MkTypeE]"
178
179// doc-key: MkKernel,Setup,sm_,func
180#define Cleanup_doc "MkKernel Cleanup"
181#define Setup_doc "MkKernel Setup"
182
183// END-DOC - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
184
185// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
186
192
193OT_SELF_T MK(ClassDef)(
194 OT_ENV_T interp,
195 OT_NS_T ns,
196 MK_TYP classM
197) {
198
199 // save base-class "::oo::class" for later use
200 static MkThreadLocal struct MkAtlClassDefS def = {0};
201
202 Tcl_ResetResult(interp);
203
204 while (def.ooclassC == NULL) {
205 OT_OBJ_T objPtr = Tcl_NewStringObj("::oo::class", -1);
206 OT_SELF_T ooclassO = Tcl_GetObjectFromObj(interp, objPtr);
207 Tcl_DecrRefCount(objPtr);
208 check_NULL(ooclassO) goto error_ooclassC;
209 def.ooclassC = Tcl_GetObjectAsClass(ooclassO);
210 break;
211error_ooclassC:
212 Tcl_AppendResult(interp, "\nCLASS-SETUP-ERROR: unable to setup '::oo::class'", NULL);
213 return NULL;
214 }
215
216 OT_OBJ_T cmdO = Tcl_ObjPrintf("%s::%s", ns->fullName, classM->type_class->type_name);
217 OT_REF_INCR(cmdO);
218 const char* cmdbuf = Tcl_GetString(cmdO);
219
220//printC(cmdbuf)
221 OT_SELF_T classO = Tcl_NewObjectInstance(interp,def.ooclassC,cmdbuf,cmdbuf,0, NULL, 0);
222 check_NULL(classO) goto error;
223
224 OT_OBJ_T classObj = Tcl_GetObjectName(interp,classO);
225 Tcl_IncrRefCount(classObj);
226 def.ooRefC[def.count] = classObj;
227 MkSelfSet_3X(classM, (MK_PTR) def.count, interp); // save reference on Tcl-Class in MQ-Type-Self
228
229//printV("class=%-40s, pos=%ld", classM->type_name, def.count);
230
231 def.count++;
232
233//printV("name=%s, base=%p\n", classM->type_name, classM->type_base);
234
235 // If base was defined - create a "tcl superclass" from MQ-Type-Self
236 // > silent assume that "MkObjectC" is always FIRST !!
237 if (def.count != 1 && classM->type_base != NULL /* && classM->type_base != MkTypeDefSTT && classM->type_base != MqTypeCtxSTT */ ) {
238 OT_OBJ_T super = def.ooRefC[(long) (MkOBJ_R(classM->type_base).self ? MkOBJ_R(classM->type_base).self : 0)];
239//printV("cmdbuf=%s, type_name=%s, base=%s\n", cmdbuf, classM->type_name, Tcl_GetStringFromObj(super,NULL));
240/*
241 // PROBLEM: MK(pMkObjectC_Init) not called -< code down create an EMPTY class
242 check_NULL(super)
243 super = Tcl_GetObjectName(interp, MK(ClassDef)(interp, ns, classM->type_base));
244*/
245 check_NULL(super) {
246 Tcl_AppendResult(interp, "\nCLASS-SETUP-ERROR: class '", classM->type_base->type_name,
247 "' has EMPTY base SELF pointer", NULL);
248 goto error;
249 }
250//printV("class=%-40s, super=%s", VAL2STR(cmdO), VAL2STR(super))
251 RL_init( RL_NewS(0,"::oo::define") RL_NewC(2,superclass) ) ; RL_O(1,cmdO) ; RL_O(3,super)
252 check_LNG(Tcl_EvalObjv(interp, 4, RL_data, TCL_EVAL_GLOBAL)) goto error;
253 }
254
255 OT_REF_DECR(cmdO);
256 return classO;
257error:
258 Tcl_AppendResult(interp, "\nCLASS-SETUP-ERROR: found at '", __func__, "'", NULL);
259 OT_REF_DECR(cmdO);
260 return NULL;
261}
262
263//
264// *********************************************************************************
265//
266
267OT_OBJ_T MK(GetMyFromObject) (OT_ENV_T interp, OT_SELF_T object) {
268 OT_NS_T ns = Tcl_GetObjectNamespace(object);
269 Tcl_Command myCmdC = Tcl_FindCommand(interp, "my", ns, TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG);
270 check_NULL(myCmdC) goto error;
271
272 OT_OBJ_T myCmdO = Tcl_NewObj();
273 Tcl_GetCommandFullName(interp,myCmdC,myCmdO);
274
275 return myCmdO;
276error:
277 return NULL;
278}
279
280//
281// *********************************************************************************
282//
283
284#define FRAME_UPDATE \
285 if (*frameP == NULL) { \
286 RL_init( RL_O(0,RG(infoFrameCmd)) RL_NewC(1,0) ) \
287 OT_OBJ_T ret = MK(EvalObjvAR)(MK_RT_CALL NULL,interp,0,RL_objv(2)); \
288 /* check_NULL(ret) OT_ERROR_ABNORMAL(MK_ERROR_PANIC); */ \
289 Tcl_IncrRefCount(ret); \
290 *frameP = ret; \
291 }
292
293#define FRAME_GET(key) \
294 OT_OBJ_T key = NULL; \
295 Tcl_DictObjGet(interp,*frameP,RG(key),&key); \
296
297MK_STRN MK(Get_Call_Proc) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T * frameP) {
298 OT_OBJ_T retObj = NULL;
300 FRAME_GET(method)
301 if (method != NULL) {retObj = method; goto end;}
302 FRAME_GET(proc)
303 if (proc != NULL) {retObj = proc; goto end;}
304 return "main";
305end:
306 return Tcl_GetStringFromObj(retObj,NULL);;
307}
308
309MK_STRN MK(Get_Call_Cmd) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T * frameP) {
310#define Get_Call_Cmd__SIZE 100
311 static MkThreadLocal char buffer[Get_Call_Cmd__SIZE+10];
313 FRAME_GET(cmd)
314 if (cmd == NULL) goto error;
315 int len;
316 char* str = Tcl_GetStringFromObj(cmd, &len);
317 if (len > Get_Call_Cmd__SIZE) {
318 strncpy(buffer,str,Get_Call_Cmd__SIZE);
319 char* nl=strchr(buffer,'\n');
320 if (nl)
321 *nl='\0';
322 else
323 buffer[Get_Call_Cmd__SIZE] = '\0';
324 strcat(buffer," ...");
325 return buffer;
326 } else {
327 return str;
328 }
329error:
330 Tcl_ResetResult(interp);
331 FRAME_GET(type)
332 return Tcl_GetStringFromObj(type,NULL);
333#undef Get_Call_Cmd__SIZE
334}
335
336MK_STRN MK(InfoScript) (MK_RT_ARGS OT_ENV_T interp, MK_STRN script)
337{
338 RL_init( RL_O(0,RG(infoScriptCmd)) )
339 if (script) RL_NewS(1,script)
340 OT_OBJ_T ret = MK(EvalObjvAR)(MK_RT_CALL NULL, interp, 0, RL_objv(script?2:1));
341 if (script) Tcl_DecrRefCount(RL_data[1]);
342 check_NULL(ret) return NULL;
343 return Tcl_GetStringFromObj(ret,NULL);
344}
345
346MK_STRN MK(Get_Call_File) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T * frameP) {
348 FRAME_GET(file)
349 if (file == NULL) goto error;
350 return Tcl_GetStringFromObj(file,NULL);
351error: {
352 MK_STRN script = MK(InfoScript)(MK_RT_CALL interp,NULL);
353 check_NULL(script) goto error1;
354 return script;
355 }
356error1:
357 Tcl_ResetResult(interp);
358 FRAME_GET(type)
359 return Tcl_GetStringFromObj(type,NULL);
360}
361
362MK_I32 MK(Get_Call_Line) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T * frameP) {
364 FRAME_GET(line)
365 if (line == NULL) goto error;
366 MK_I32 lineI = -1;
367 if (Tcl_GetIntFromObj(NULL,line,&lineI)==TCL_ERROR) goto error;
368 return lineI;
369error:
370 Tcl_ResetResult(interp);
371 return -1;
372}
373
374// attention: "level" only used ONCE at startup !!
375bool MK(Get_Call_Stack) (MK_RT_ARGS OT_ENV_T interp, MK_ERR const err, int level) {
376 //Tcl_ResetResult(interp);
377 RL_init( RL_O(0,RG(infoFrameCmd)) ) ; RL_NewI(1,level)
378//printAryX(err,"Get_Call_Stack",3,RL_data)
379 OT_OBJ_T frame = MK(EvalObjvAR)(MK_RT_CALL NULL,interp, TCL_EVAL_NOERR, RL_objv(2));
380 check_NULL(frame) goto error;
381 Tcl_IncrRefCount(frame);
382 //MkErrorStackFormat(err,"mark","mark",-1);
384 MK(Get_Call_Cmd)(MK_RT_CALL interp,&frame),
385 MK(Get_Call_File)(MK_RT_CALL interp,&frame),
386 MK(Get_Call_Line)(MK_RT_CALL interp,&frame)
387 );
388 Tcl_DecrRefCount(frame);
389 RL_Free(1)
390 return true;
391error:
392 Tcl_ResetResult(interp);
393 return false;
394}
395
396//
397// *********************************************************************************
398//
399
400#if 0
401// Assumes little endian
402static char* printBits(size_t const size, void const * const ptr)
403{
404 static char buf[100];
405 char * bufP = &buf[0];
406 unsigned char *b = (unsigned char*) ptr;
407 unsigned char byte;
408 int i, j;
409 int num;
410
411 for (i = (int)size-1; i >= 0; i--) {
412 for (j = 7; j >= 0; j--) {
413 byte = (b[i] >> j) & 1;
414 num = sprintf(bufP,"%u", byte);
415 bufP+=num;
416 }
417 }
418 *bufP = '\0';
419 return buf;
420}
421
422#define myprint(num) ({ \
423 unsigned int tmp=(unsigned int)num; \
424 printV("%-40s → %s\n", #num, printBits(4,&tmp)); \
425})
426#endif
427
428int MK(EnumFlagWorker) (MK_RT_ARGS OT_ENV_T interp, const struct LookupEnumE *keys, OT_OBJ_T enumE, int *ret)
429{
430 // read flag enum
431 int valI = 0;
432 int index = 0;
433 int objc = 0;
434 OT_OBJ_T *objv = NULL;
435 OtErrorCheckLng(Tcl_ListObjGetElements(interp,enumE,&objc,&objv));
436 for (int i=0; i<objc; i++) {
437 OtErrorCheckLng (Tcl_GetIndexFromObjStruct (interp, objv[i], keys,
438 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index));
439 valI |= keys[index].val;
440 }
441//myprint(valI);
442 *ret = valI;
443 return TCL_OK;
444}
445
446//
447// *********************************************************************************
448//
449
450// return TCL error
451OT_SELF_T MK(GetClassObjectFromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T selfO) {
452 //MkRtSetup_NULL;
453 //printLngObj(selfO);
454 RL_init( RL_O(0,RG(infoObjectClassCmd)) ) ; RL_O(1,selfO)
455 OT_OBJ_T clsObj = MK(EvalObjvAR)(MK_RT_CALL NULL,interp,TCL_EVAL_GLOBAL, RL_objv(2));
456 check_NULL(clsObj) goto error;
457 return Tcl_GetObjectFromObj(interp, clsObj);
458error:
459 return NULL;
460}
461
463 OT_ENV_T interp,
464 OT_OBJ_T tclO
465)
466{
467 OT_SELF_T objO = Tcl_GetObjectFromObj (interp, tclO);
468 if (objO == NULL) return NULL;
469 return Tcl_ObjectGetMetadata(objO, &MK(AtomMeta));
470}
471
473 OT_ENV_T interp,
474 OT_SELF_T tclObj,
475 OT_CLS_T clazz,
476 MkTestClassE def
477) {
478 // check if object belong to class
479 OT_OBJ_T objNameO = Tcl_GetObjectName(interp,tclObj);
480 OT_OBJ_T clsNameO = Tcl_GetObjectName(interp,Tcl_GetClassAsObject(clazz));
481 RL_init( RL_O(0,RG(infoObjectClassCmd)) ) ; RL_O(1,objNameO) ; RL_O(2,clsNameO)
482 check_LNG(Tcl_EvalObjv(interp, RL_objv(3), TCL_EVAL_GLOBAL)) {
484 }
485 int isClass = 0;
486 check_LNG(Tcl_GetBooleanFromObj(interp,Tcl_GetObjResult(interp),&isClass)) {
488 }
489 if (!isClass) {
491 }
492 return def;
493}
494
497 OT_OBJ_T lngO,
498 OT_CLS_T clazz,
499 MK_OBJ * objP,
500 MkTestClassE * flagP
501) {
502 assert(lngO != NULL);
504 MK_OBJ objM = NULL;
505
506 // BUG FIX → need name WITH namespace from "Tcl_GetObjectName"
507 OT_SELF_T tclObj = Tcl_GetObjectFromObj (interp, lngO);
508 if (tclObj == NULL) {
509 Tcl_ResetResult(interp);
510 // first check for "", "MK_NULL", ...
511 if (OT_LNG_NULL_IS(lngO)) {
512 flag=MkTestClassE_NULL; goto end;
513 } else {
514 flag=MkTestClassE_NONE_OBJECT; goto end;
515 }
516 };
517
518 objM = Tcl_ObjectGetMetadata(tclObj, &MK(AtomMeta));
519 /* NULL or wrong class */
520 if (objM == NULL) {
521 switch (flag = NS(sCheckClass)(interp,tclObj,clazz,flag)) {
523 case MkTestClassE_WRONG_CLASS: break;
524 default: flag=MkTestClassE_NULL;
525 }
526 goto end;
527 }
528
529 if (clazz != MK(MkObjectC)) {
530 // check if object belong to class
531 switch (flag = NS(sCheckClass)(interp,tclObj,clazz,flag)) {
533 case MkTestClassE_WRONG_CLASS: goto end;
534 default: break;
535 }
536 }
537
538 objM = MkObj(objM);
539 if (objM == NULL) { flag=MkTestClassE_INVALID_SIGNATURE ; goto end; };
540
541 flag = MkTestClassE_OK;
542 if (objP) *objP = objM;
543
544end:
545 if (flagP) *flagP = flag;
546 switch(flag) {
547 case MkTestClassE_NONE_OBJECT : return false;
548 default : return true;
549 }
550}
551
552MK_STRN MK(GetClassNameFromObject) (
554 OT_SELF_T object
555) {
556 OT_CLS_T cls = Tcl_GetObjectAsClass(object);
557 // the "type" of a "Class" is "Class"
558 //return OT_LNG_NAME_FROM_OBJECT(object);
559 if (cls != NULL) return "Class";
560/*
561 if (cls != NULL) {
562 // delete namespace
563 char * run = Tcl_GetString(Tcl_GetObjectName(interp,object));
564 char * last = run;
565 while (*run != '\0') {
566 if (*run == ':') last = run+1;
567 run++;
568 }
569 return last;
570 }
571*/
572
573 // only a real object
574 RL_init( RL_O(0,RG(infoObjectClassCmd)) ) ; RL_O(1,Tcl_GetObjectName(interp,object))
575 OT_OBJ_T classO = MK(EvalObjvAR)(MK_RT_CALL NULL,interp,0,RL_objv(2));
576 check_NULL(classO) return Tcl_GetStringResult(interp);
577 return OT_LNG_NAME_FROM_OBJ(classO);
578}
579
582MK_STRN MK(GetTypeFromObj) (
584 OT_OBJ_T Obj,
585 bool *isObject
586)
587{
588 static MkThreadLocal char buf[50];
589 strncpy(buf, Obj->typePtr ? Obj->typePtr->name : "unknown", 50);
590 buf[50-1] = '\0';
591
592 if (strcmp(buf,"unknown")!=0 && strcmp(buf,"string")!=0 && strcmp(buf,"cmdName")!=0)
593 goto end;
594
595 OT_SELF_T object = Tcl_GetObjectFromObj(interp,Obj);
596 if (object) {
597 if (isObject) *isObject=true;
598 return MK(GetClassNameFromObject)(OT_Prefix_CALL object);
599 }
600end:
601 if (isObject) *isObject=false;
602 return buf;
603}
604
605MK_STRN MK(ClassName) (
607 OT_OBJ_T lngO,
608 bool doShort
609)
610{
611 static MkThreadLocal char buffer[50] = {0};
612 strncpy(buffer,lngO->typePtr ? lngO->typePtr->name : "unknown", 50);
613 buffer[50-1] = '\0';
614 OT_OBJ_T classO = NULL;
615
616 OT_SELF_T objO = Tcl_GetObjectFromObj (interp, lngO);
617 if (objO == NULL) goto type;
618
619 OT_CLS_T cls = Tcl_GetObjectAsClass(objO);
620 if (cls) {
621 classO = Tcl_GetObjectName(interp, objO);
622 goto end;
623 }
624
625 RL_init( RL_O(0,RG(infoObjectClassCmd)) ) ; RL_O(1,lngO)
626 classO = MK(EvalObjvAR)(MK_RT_CALL NULL,interp,0,RL_objv(2));
627
628end:
629 if (classO != NULL) {
630 MK_STRN name = Tcl_GetString(classO);
631 if (doShort) {
632 // from: NamespaceTailCmd --------------------------
633 const char *p;
634 for (p = name; *p != '\0'; p++) {
635 /* empty body */
636 }
637 while (--p > name) {
638 if ((*p == ':') && (*(p-1) == ':')) {
639 p++; /* Just after the last "::" */
640 break;
641 }
642 }
643
644 if (p >= name) {
645 name = p;
646 }
647 // ------------------------------------------------
648 }
649 return name;
650 } else {
651 return "unknown";
652 }
653type:
654 if (strcmp(buffer,"cmdName")==0) {
655 return Tcl_GetString(lngO);
656 } else {
657 return buffer;
658 }
659}
660
661static void MK(LngTupleToMkBufferListS) (
663 int * skipP,
664 MK_BFL * retP
665) {
666 MK_BFL retVal = *retP;
667 int __skip = *skipP;
668
669 if (retVal == NULL) retVal = MkBufferListCreate (objc-__skip);
670 else MkBufferListReserve(retVal,objc-__skip);
671 for (int i=__skip; i<objc; i++) {
672 MkBufferListIndexSetSTR(retVal, i-__skip, VAL2STR(objv[i]));
673 }
674
675 *skipP = objc;
676 *retP = retVal;
677}
678
679enum MkErrorE MK(LngListToMkBufferListS) (
681 OT_OBJ_T argsO,
682 MK_BFL * retP
683)
684{
685 if (argsO == NULL) {
686 return MK_OK;
687 } else {
688 int __skip=0;
689 int listObjc;
690 OT_OBJ_T * listObjv;
691 OtErrorCheckLngGoto (Tcl_ListObjGetElements(interp,argsO,&listObjc,&listObjv));
692 MK(LngTupleToMkBufferListS)( MK_RT_CALL interp,listObjc,listObjv,&__skip,retP);
693 }
694 return MK_OK;
695error:
696 return MK_ERROR;
697}
698
699/*****************************************************************************/
700/* */
701/* Obj_As */
702/* */
703/*****************************************************************************/
704
705#define OT_LNG_STRING(o) Tcl_GetString(o)
706
707#define OT_LNG_STRING_BYTES(o) o->bytes
708#define OT_LNG_STRING_LENGTH(o) o->length
709#define OT_LNG_SKIP_TYPE int
710
711// -------------------------------------------------------------------------------
712
713
715
717 if ((*skipP) >= objc) {
718 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
719 }
720 int len=0;
721 MK_STRN ret = Tcl_GetStringFromObj(objv[(*skipP)++], &len);
722 // mark=MK_NULL
723 if (MK_NULL_STR_CHECK(ret,len)) {
724 ret = NULL;
725 }
726 *retP = ret;
727 return MK_OK;
728}
729
730/*
731enum MkErrorE MK(Obj_AsCSTNULL) (OT_Check_ARGS, MK_STRN *retP) {
732 if ((*skipP) >= objc) {
733 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
734 }
735 MK_STRN ret = Tcl_GetString(objv[(*skipP)++]);
736 if (strcmp(ret,"NULL") == 0) ret=NULL;
737 *retP = Tcl_GetString(objv[(*skipP)++]);
738 return MK_OK;
739}
740*/
741
742enum MkErrorE MK(Obj_AsSTR_COPY) (OT_Check_ARGS, MK_STR ret, size_t size) {
743 if ((*skipP) >= objc) {
744 return WrongNumArgs(hdl, (*skipP), objc, -999, +999, arg);
745 }
746 strncpy(ret,Tcl_GetString(objv[(*skipP)++]),size);
747 return MK_OK;
748}
749
750/*****************************************************************************/
751/* */
752/* Check */
753/* */
754/*****************************************************************************/
755
757
758//
759// *********************************************************************************
760//
761
762/* moved to mk_inline
763int MK(EvalObjv) (
764 OT_ENV_T interp,
765 int objc,
766 OT_OBJ_T const objv[],
767 int flags
768) {
769 int i,ret;
770//printAry(objc,objv)
771 for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
772 ret = Tcl_EvalObjv (interp, objc, objv, flags);
773 for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
774 return ret;
775}
776*/
777
778int MK(EvalObjvVA) (
779 OT_ENV_T interp,
780 int flags,
781 ...
782) {
783 #define SIZE 20
784 int objc;
785 OT_OBJ_T objv[SIZE];
786 va_list ap;
787 va_start(ap, flags);
788 for (objc=0; (objv[objc]=(OT_OBJ_T )va_arg(ap,OT_OBJ_T )) != NULL; objc++) {
789 //Tcl_IncrRefCount(objv[objc]);
790 if (objc >= (SIZE-1)) {
791 Tcl_SetResult(interp, "EVAL-ERROR: size in MkEvalObjvVA is limited to " xstr(SIZE), TCL_STATIC);
792 return TCL_ERROR;
793 }
794 }
795 va_end(ap);
796//printAry2(__func__,objc,objv)
797 int ret;
798 //for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
799 ret = Tcl_EvalObjv (interp, objc, objv, flags);
800 //for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
801 return ret;
802 #undef SIZE
803}
804
805/*
806OT_OBJ_T MK(EvalObjvVR) (
807 OT_VARFRAME_ARGS ,
808 OT_ENV_T interp,
809 int flags,
810 ...
811)
812{
813 #define SIZE 20
814 int objc;
815 OT_OBJ_T objv[SIZE];
816 va_list ap;
817 va_start(ap, flags);
818 for (objc=0; (objv[objc]=(OT_OBJ_T )va_arg(ap,OT_OBJ_T )) != NULL; objc++) {
819 if (objc >= (SIZE-1)) {
820 Tcl_SetResult(interp, "EVAL-ERROR: size in MkEvalObjvVA is limited to " xstr(SIZE), TCL_STATIC);
821 return NULL;
822 }
823 }
824 va_end(ap);
825//printAry2("objv",objc,objv)
826 int ret;
827 //for (i=0;i<objc;i++) Tcl_IncrRefCount(objv[i]);
828 ret = Tcl_EvalObjv (interp, objc, objv, flags);
829 //for (i=0;i<objc;i++) Tcl_DecrRefCount(objv[i]);
830 check_LNG(ret) return NULL;
831 #undef SIZE
832 OT_OBJ_T result = OT_VARFRAME_OBJ_RESULT(interp);
833//printLng(result)
834 return result;
835}
836*/
837
838OT_OBJ_T MK(EvalObjvAR) (
840 OT_ENV_T interp,
841 int flags,
842 int objc,
843 OT_OBJ_T *objv
844)
845{
846//printAry2("objv",objc,objv)
847 int ret = Tcl_EvalObjv (interp, objc, objv, flags);
848 //int ret = MK(EvalObjv) (interp, objc, objv, flags);
849 check_LNG(ret) return NULL;
850 OT_OBJ_T result = OT_VARFRAME_OBJ_RESULT(interp);
851//printLng(result)
852 return result;
853}
854
855/*
856void MK(PrintLngObjAsObject)(MK_RT_ARGS OT_ENV_T interp, MK_STRN name, OT_OBJ_T in, MK_STRN proc) {
857 OT_SELF_T inO = Tcl_GetObjectFromObj(interp,in);
858 if (inO == NULL) {
859 MkLogV_2(MK_ERROR_PRINT,proc,0,"%s object = %s\n", name, Tcl_GetStringResult(interp));
860 } else {
861 OT_SELF_T classO = MK(GetClassObjectFromObj)(MK_RT_CALL interp,in);
862 MkLogV_2(MK_ERROR_PRINT,proc,0,"%s object = %s, class = %s\n", name,
863 OT_LNG_NAME_FROM_OBJECT(inO), OT_LNG_NAME_FROM_OBJECT(classO));
864 }
865}
866*/
867
868/*
869int MK(NewEnsemble) (
870 OT_ENV_T interp,
871 const char * name,
872 OT_NS_T ns,
873 const OtObjProcDefS type[],
874 ClientData clientData
875) {
876 Tcl_DString buffer;
877 // 1. create ensemble
878 Tcl_Command ensembleCmd = Tcl_CreateEnsemble(interp, name, ns, 0);
879 // 2. create commands
880 OT_OBJ_T subcommandsL = Tcl_NewListObj(0,NULL);
881 for (int i=0; type[i].version != 0; i++) {
882 Tcl_DStringInit(&buffer);
883 Tcl_DStringAppend(&buffer,ns->fullName,-1);
884 Tcl_DStringAppend(&buffer,"::",-1);
885 Tcl_DStringAppend(&buffer,type[i].name,-1);
886 check_NULL ( Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer),
887 type[i].callProc,clientData,type[i].deleteProc))
888 goto error;
889 check_LNG (Tcl_ListObjAppendElement(interp,subcommandsL,Tcl_NewStringObj(type[i].name,-1)))
890 goto error;
891 }
892 // 3. add "subcommands"
893 check_LNG (Tcl_SetEnsembleSubcommandList(interp,ensembleCmd,subcommandsL)) goto error;
894 // 4. add "ensemble" to exportList
895 check_LNG (Tcl_Export(interp, ns, name, false)) goto error;
896 // 5. import "ensemble" into parent (::tclXYZ)
897 Tcl_DStringFree(&buffer);
898 Tcl_DStringAppend(&buffer,ns->fullName,-1);
899 Tcl_DStringAppend(&buffer,"::",-1);
900 Tcl_DStringAppend(&buffer,name,-1);
901 check_LNG (Tcl_Import(interp, ns->parentPtr, Tcl_DStringValue(&buffer), true )) goto error;
902
903 return TCL_OK;
904error:
905 return TCL_ERROR;
906}
907*/
908
909int MK(FillNamespace) (
910 OT_ENV_T interp,
911 OT_NS_T ns,
912 const OtObjProcDefS type[],
913 ClientData clientData
914) {
915 Tcl_DString buffer;
916 // 2. create commands
917 for (int i=0; type[i].version != 0; i++) {
918 Tcl_DStringInit(&buffer);
919 Tcl_DStringAppend(&buffer,ns->fullName,-1);
920 Tcl_DStringAppend(&buffer,"::",-1);
921 Tcl_DStringAppend(&buffer,type[i].name,-1);
922 check_NULL ( Tcl_CreateObjCommand(interp, Tcl_DStringValue(&buffer),
923 type[i].callProc,clientData,type[i].deleteProc))
924 goto error;
925 }
926 return TCL_OK;
927error:
928 return TCL_ERROR;
929}
930
931MK_STRN MK(ObjvToString) (MK_RT_ARGS MK_STRN cls, TCL_ARGS) {
932 MkBufferCreateTLS_T(MkBuffer64C,ret,50);
933 MkBufferAppendV(ret,"&%s ", cls);
934 for(int i=1;i<objc;i++) {
935 MkBufferAppendV(ret,"%s ", VAL2STR(objv[i]));
936 }
937 return MkBUF_R(&retR).storage.first.C;
938}
939
942MK_STR MK(PrintLngObj) (
944 MK_STRN header,
945 OT_OBJ_T Obj
946) {
947//printP(Obj)
948 MK_OBJ retObj = NULL;
949 bool isObject;
950 MK_STRN type = MK(GetTypeFromObj) (OT_Prefix_CALL Obj, &isObject);
951 if (isObject) OT_LNG_OBJECT_IS_3(Obj, &retObj, NULL);
952
953 #define objF "[type<%s>, refCount<MQ=%i,TCL=%i,SHARED=%i>, ptr<MQ=%p,TCL=%p>]"
954 #define objA type, (retObj?retObj->refCount:-1),Obj->refCount, Tcl_IsShared(Obj), retObj, (retObj?retObj->self:NULL)
955
956/*
957 printV("ObjName <%20s>, ObjPtr, <%p>, ObjRef <%i>\n", Tcl_GetString(Obj), Obj, Obj->refCount)
958if (retObj) {
959 OT_OBJ_T nameO = OT_SELF_NAME_O(retObj);
960 printV("NameStr <%20s>, NamePtr <%p>, NameRef <%i>\n", Tcl_GetString(nameO), nameO, nameO->refCount)
961
962 OT_OBJ_T cmdO = Tcl_NewObj();
963 Tcl_GetCommandFullName(interp,OT_SELF_CMD_O(retObj),cmdO);
964 printV("CmdStr <%20s>, CmdPtr <%p>, CmdRef <%i>\n", Tcl_GetString(cmdO), cmdO, cmdO->refCount)
965}
966*/
967
968 // fill the buf and get the len back
969 if (header) {
970 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%-20s: %s " objF, header, Tcl_GetString (Obj), objA);
971 } else if (retObj) {
972/*
973 MQ_CTX ctx = MqCtx(retObj);
974 if (ctx) {
975 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s(%s) " objF, Tcl_GetString (Obj), MqConfigGetName(ctx), objA);
976 } else {
977 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s " objF, Tcl_GetString (Obj), objA);
978 }
979*/
980 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s " objF, Tcl_GetString (Obj), objA);
981
982 } else {
983 MkBufferSetV(MkBUF(&MK_RT_REF.tbuf), "%s " objF, Tcl_GetString (Obj), objA);
984
985 }
986
987 #undef objF
988 #undef objA
989
990 return MkBUF_R(&MK_RT_REF.tbuf).storage.first.S;
991}
992
998
999// BEGIN-enum - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1000
1005
1006int MK(Get_MkErrorE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkErrorE *ret) {
1007 const static struct LookupEnumE keys[] = {
1008 { "OK" , MK_OK },
1009 { "MK_OK" , MK_OK },
1010 { "ERROR" , MK_ERROR },
1011 { "CONTINUE" , MK_CONTINUE },
1012 { "MK_ERROR" , MK_ERROR },
1013 { "MK_CONTINUE" , MK_CONTINUE },
1014 { NULL , 0 },
1015 };
1016
1017 int index;
1018 OtErrorCheckLng (Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1019 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index));
1020 *ret = keys[index].val;
1021 return TCL_OK;
1022}
1023
1024int MK(Get_MkIdSE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkIdSE *ret) {
1025 const static struct LookupEnumE keys[] = {
1026 { "UNUSED" , MK_ID_UNUSED },
1027 { "THREAD" , MK_ID_THREAD },
1028 { "PROCESS" , MK_ID_PROCESS },
1029 { "ID_UNUSED" , MK_ID_UNUSED },
1030 { "ID_THREAD" , MK_ID_THREAD },
1031 { "ID_PROCESS" , MK_ID_PROCESS },
1032 { "MK_ID_THREAD" , MK_ID_THREAD },
1033 { "MK_ID_UNUSED" , MK_ID_UNUSED },
1034 { "MK_ID_PROCESS" , MK_ID_PROCESS },
1035 { NULL , 0 },
1036 };
1037
1038 int index;
1039 OtErrorCheckLng (Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1040 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index));
1041 *ret = keys[index].val;
1042 return TCL_OK;
1043}
1044
1045int MK(Get_MkTimeoutE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTimeoutE *ret) {
1046 const static struct LookupEnumE keys[] = {
1047 { "MAX" , MK_TIMEOUT_MAX },
1048 { "LONG" , MK_TIMEOUT_LONG },
1049 { "INIT" , MK_TIMEOUT_INIT },
1050 { "USER" , MK_TIMEOUT_USER },
1051 { "SHORT" , MK_TIMEOUT_SHORT },
1052 { "NORMAL" , MK_TIMEOUT_NORMAL },
1053 { "SOCKET" , MK_TIMEOUT_SOCKET },
1054 { "DEFAULT" , MK_TIMEOUT_DEFAULT },
1055 { "VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1056 { "TIMEOUT_MAX" , MK_TIMEOUT_MAX },
1057 { "TIMEOUT_USER" , MK_TIMEOUT_USER },
1058 { "TIMEOUT_LONG" , MK_TIMEOUT_LONG },
1059 { "TIMEOUT_INIT" , MK_TIMEOUT_INIT },
1060 { "TIMEOUT_SHORT" , MK_TIMEOUT_SHORT },
1061 { "TIMEOUT_NORMAL" , MK_TIMEOUT_NORMAL },
1062 { "TIMEOUT_SOCKET" , MK_TIMEOUT_SOCKET },
1063 { "MK_TIMEOUT_MAX" , MK_TIMEOUT_MAX },
1064 { "MK_TIMEOUT_USER" , MK_TIMEOUT_USER },
1065 { "MK_TIMEOUT_LONG" , MK_TIMEOUT_LONG },
1066 { "MK_TIMEOUT_INIT" , MK_TIMEOUT_INIT },
1067 { "TIMEOUT_DEFAULT" , MK_TIMEOUT_DEFAULT },
1068 { "MK_TIMEOUT_SHORT" , MK_TIMEOUT_SHORT },
1069 { "MK_TIMEOUT_NORMAL" , MK_TIMEOUT_NORMAL },
1070 { "MK_TIMEOUT_SOCKET" , MK_TIMEOUT_SOCKET },
1071 { "TIMEOUT_VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1072 { "MK_TIMEOUT_DEFAULT" , MK_TIMEOUT_DEFAULT },
1073 { "MK_TIMEOUT_VERYSHORT" , MK_TIMEOUT_VERYSHORT },
1074 { NULL , 0 },
1075 };
1076
1077 int index;
1078 OtErrorCheckLng (Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1079 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index));
1080 *ret = keys[index].val;
1081 return TCL_OK;
1082}
1083
1084int MK(Get_MkTypeE_FromObj) (MK_RT_ARGS OT_ENV_T interp, OT_OBJ_T enumE, enum MkTypeE *ret) {
1085 const static struct LookupEnumE keys[] = {
1086 { "I8T" , MK_I8T },
1087 { "BOLT" , MK_BOLT },
1088 { "STRT" , MK_STRT },
1089 { "DBLT" , MK_DBLT },
1090 { "LSTT" , MK_LSTT },
1091 { "I32T" , MK_I32T },
1092 { "FLTT" , MK_FLTT },
1093 { "I16T" , MK_I16T },
1094 { "BINT" , MK_BINT },
1095 { "I64T" , MK_I64T },
1096 { "MK_I8T" , MK_I8T },
1097 { "MK_BOLT" , MK_BOLT },
1098 { "MK_STRT" , MK_STRT },
1099 { "MK_DBLT" , MK_DBLT },
1100 { "MK_LSTT" , MK_LSTT },
1101 { "MK_I32T" , MK_I32T },
1102 { "MK_FLTT" , MK_FLTT },
1103 { "MK_I16T" , MK_I16T },
1104 { "MK_BINT" , MK_BINT },
1105 { "MK_I64T" , MK_I64T },
1106 { NULL , 0 },
1107 };
1108
1109 int index;
1110 OtErrorCheckLng (Tcl_GetIndexFromObjStruct (interp, enumE, &keys,
1111 sizeof(struct LookupClassS), "enum", TCL_EXACT, &index));
1112 *ret = keys[index].val;
1113 return TCL_OK;
1114}
1117
1118// END-enum - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1119
1125
1126// SOFT: delete META if TCL is already "on delete"
1127// CALLED from: "<destructor>", "META-DATA-Destructor"
1128static void MK(AtomMetaDelete) (MK_MNG mng)
1129{
1130 check_NULL(mng) return;
1131 MK_OBJ obj = MkObj(mng);
1132 check_NULL(obj) return;
1133 MkRtSetup_ON(obj);
1134//printObjO(obj);
1135 // SELF is alredy "dead"
1137}
1138
1139static int MK(AtomMetaClone) ( OT_ENV_T interp, ClientData clientData, ClientData *out)
1140{
1141 *out = clientData;
1142 return TCL_OK;
1143}
1144
1145const Tcl_ObjectMetadataType MK(AtomMeta) = {
1146 TCL_OO_METADATA_VERSION_CURRENT,
1147 "MK_OBJ",
1148 MK(AtomMetaDelete),
1149 MK(AtomMetaClone)
1150};
1151
1157
1160static int NS(Print_Class_Cmd) (OtClass_ARGS)
1161{
1162 int ret = TCL_OK;
1164 int index;
1165
1166 static const char *option[] = {
1167 "object", "type", "var", NULL
1168 };
1169 enum options {
1170 OBJECT, TYPE, VARIABLE
1171 };
1172
1173 // get the Index
1174 OtErrorCheckLng (Tcl_GetIndexFromObj (interp, objv[__skip++], option, "subcommand", 0, &index));
1175
1176 // do the work
1177 switch ((enum options) index) {
1178 case OBJECT:
1179 WNA(1,1,"tclObj");
1180 Tcl_SetResult (interp, MK(PrintLngObj) (OT_Prefix_CALL "print", objv[__skip]), TCL_VOLATILE);
1181 break;
1182 case TYPE:
1183 WNA(1,1,"tclObj");
1184 Tcl_SetResult (interp, (char*) MK(GetTypeFromObj) (OT_Prefix_CALL objv[__skip], NULL), TCL_VOLATILE);
1185 break;
1186 case VARIABLE: {
1187 // same as tcl "Print ..."
1188 WNA(1,99,"tclObj...");
1190 RL_init( RL_O(0,RG(infoLevelCmd)) )
1191 OT_OBJ_T lvlObj = MK(EvalObjvAR)(MK_RT_CALL varframe,interp,0,RL_objv(1));
1192 check_NULL(lvlObj) goto varerror;
1193 int lvl;
1194 check_LNG(Tcl_GetIntFromObj(interp,lvlObj,&lvl)) goto varerror;
1195 char *STR;
1196 fputs("print var ",stderr);
1197 if (lvl > 0) {
1198 RL_init( RL_O(0,RG(infoLevelCmd)) RL_NewI(1,0) )
1199 lvlObj = MK(EvalObjvAR)(MK_RT_CALL varframe,interp,0,RL_objv(2));
1200 check_NULL(lvlObj) goto varerror;
1201 OT_OBJ_T nameObj;
1202 check_LNG(Tcl_ListObjIndex(interp,lvlObj,0,&nameObj)) goto varerror;
1203 STR = Tcl_GetString(nameObj);
1204 } else {
1205 STR = "GLOBAL -> ";
1206 }
1207 fputs(STR,stderr);
1208
1209 for (int i=2; i<objc; i++) {
1210 char * nameS = Tcl_GetString(objv[i]);
1211 OT_OBJ_T var = Tcl_ObjGetVar2(interp,objv[i],NULL,0);
1212 if (var) {
1213 fprintf(stderr,"%s<%s>, ", nameS, Tcl_GetString(var));
1214 } else {
1215 fprintf(stderr,"%s<not set>, ", nameS);
1216 }
1217 }
1218 fputs("\n",stderr);
1220 break;
1221varerror:
1222 ret = TCL_ERROR;
1224 break;
1225 }
1226 }
1227
1228 return ret;
1229}
1230
1233static int NS(Const_Class_Cmd) (OtClass_ARGS)
1234{
1236 int index;
1237
1238 OT_OBJ_T lngO = NULL;
1239
1240 static const char *constant[] = {
1241 "maxY", "minY", "maxS", "minS", "maxI", "minI", "maxF", "minF", "maxW", "minW", "maxD", "minD", NULL
1242 };
1243 enum constants {
1244 MAXY, MINY, MAXS, MINS, MAXI, MINI, MAXF, MINF, MAXW, MINW, MAXD, MIND,
1245 };
1246
1247 WNA(1,1,"(maxY|minY|maxS|minS|maxI|minI|maxF|minF|maxW|minW|maxD|minD)");
1248
1249 // get the Index
1250 OtErrorCheckLng (Tcl_GetIndexFromObj (interp, objv[__skip], constant, "constant", 0, &index));
1251
1252 // do the work
1253 switch ((enum constants) index) {
1254 case MAXY: lngO = Tcl_NewIntObj (SCHAR_MAX); break;
1255 case MINY: lngO = Tcl_NewIntObj (SCHAR_MIN); break;
1256 case MAXS: lngO = Tcl_NewIntObj (SHRT_MAX); break;
1257 case MINS: lngO = Tcl_NewIntObj (SHRT_MIN); break;
1258 case MAXI: lngO = Tcl_NewLongObj (INT_MAX); break;
1259 case MINI: lngO = Tcl_NewLongObj (INT_MIN); break;
1260 case MAXF: lngO = Tcl_NewDoubleObj (FLT_MAX); break;
1261 case MINF: lngO = Tcl_NewDoubleObj (FLT_MIN); break;
1262 case MAXW: lngO = Tcl_NewWideIntObj (LLONG_MAX); break;
1263 case MINW: lngO = Tcl_NewWideIntObj (LLONG_MIN); break;
1264 case MAXD: lngO = Tcl_NewDoubleObj (DBL_MAX); break;
1265 case MIND: lngO = Tcl_NewDoubleObj (DBL_MIN); break;
1266 }
1267
1268 Tcl_SetObjResult (interp, lngO);
1269 return TCL_OK;
1270}
1271
1272/*****************************************************************************/
1273/* */
1274/* enum */
1275/* */
1276/*****************************************************************************/
1277
1330// BEGIN-Enum-ToString - created by 'tcl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1331
1336
1338{
1339 switch (type) {
1340 case MK_NO : return ot_fixstrobj("NO" ) ;
1341 case MK_YES : return ot_fixstrobj("YES") ;
1342 }
1343 return ot_fixstrobj("NOTHING");
1344}
1345
1347{
1348 switch (type) {
1349 case MK_OK : return ot_fixstrobj("OK" ) ;
1350 case MK_CONTINUE : return ot_fixstrobj("CONTINUE") ;
1351 case MK_ERROR : return ot_fixstrobj("ERROR" ) ;
1352 }
1353 return ot_fixstrobj("NOTHING");
1354}
1355
1356OT_OBJ_T MK(MkIdSE_ToString) ( const enum MkIdSE type )
1357{
1358 switch (type) {
1359 case MK_ID_UNUSED : return ot_fixstrobj("UNUSED" ) ;
1360 case MK_ID_PROCESS : return ot_fixstrobj("PROCESS") ;
1361 case MK_ID_THREAD : return ot_fixstrobj("THREAD" ) ;
1362 }
1363 return ot_fixstrobj("NOTHING");
1364}
1365
1367{
1368 switch (type) {
1369 case MK_NATIVE_IS_INITIAL : return ot_fixstrobj("INITIAL") ;
1370 case MK_NATIVE_IS_STRING : return ot_fixstrobj("STRING" ) ;
1371 case MK_NATIVE_IS_LITTLE : return ot_fixstrobj("LITTLE" ) ;
1372 case MK_NATIVE_IS_BIG : return ot_fixstrobj("BIG" ) ;
1373 }
1374 return ot_fixstrobj("NOTHING");
1375}
1376
1378{
1379 switch (type) {
1380 case MK_TIMEOUT_INIT : return ot_fixstrobj("INIT" ) ;
1381 case MK_TIMEOUT_LONG : return ot_fixstrobj("LONG" ) ;
1382 case MK_TIMEOUT_NORMAL : return ot_fixstrobj("NORMAL" ) ;
1383 case MK_TIMEOUT_SHORT : return ot_fixstrobj("SHORT" ) ;
1384 case MK_TIMEOUT_SOCKET : return ot_fixstrobj("SOCKET" ) ;
1385 case MK_TIMEOUT_VERYSHORT : return ot_fixstrobj("VERYSHORT") ;
1386 case MK_TIMEOUT_DEFAULT : return ot_fixstrobj("DEFAULT" ) ;
1387 case MK_TIMEOUT_USER : return ot_fixstrobj("USER" ) ;
1388 case MK_TIMEOUT_MAX : return ot_fixstrobj("MAX" ) ;
1389 }
1390 return ot_fixstrobj("NOTHING");
1391}
1392
1394{
1395 switch (type) {
1396 case MK_I8T : return ot_fixstrobj("I8T" ) ;
1397 case MK_BOLT : return ot_fixstrobj("BOLT") ;
1398 case MK_I16T : return ot_fixstrobj("I16T") ;
1399 case MK_I32T : return ot_fixstrobj("I32T") ;
1400 case MK_FLTT : return ot_fixstrobj("FLTT") ;
1401 case MK_I64T : return ot_fixstrobj("I64T") ;
1402 case MK_DBLT : return ot_fixstrobj("DBLT") ;
1403 case MK_BINT : return ot_fixstrobj("BINT") ;
1404 case MK_STRT : return ot_fixstrobj("STRT") ;
1405 case MK_LSTT : return ot_fixstrobj("LSTT") ;
1406 }
1407 return ot_fixstrobj("NOTHING");
1408}
1411
1412// END-Enum-ToString - created by 'tcl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1413
1414// BEGIN-MkKernel - created by 'tcl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1415
1419
1420// doc-key: MkKernel,MkKernel-Enum,sco
1421
1423static OT_ProcRet NS(MkKernel_ErrorE_FromInt) (OtClass_ARGS) {
1426 MK_I32 value = 0;
1429 enum MkErrorE value_out;
1430 MkErrorC_Check(MK_ERROR_FORMAT,MkErrorE_FromInt (value, &value_out));
1431 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(ErrorE,value_out));
1432 goto end;
1433 error:
1435 end:
1437}
1438
1440static OT_ProcRet NS(MkKernel_IdSE_FromInt) (OtClass_ARGS) {
1443 MK_I32 value = 0;
1446 enum MkIdSE value_out;
1447 MkErrorC_Check(MK_ERROR_FORMAT,MkIdSE_FromInt (value, &value_out));
1448 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(IdSE,value_out));
1449 goto end;
1450 error:
1452 end:
1454}
1455
1457static OT_ProcRet NS(MkKernel_TimeoutE_FromInt) (OtClass_ARGS) {
1460 MK_I32 value = 0;
1463 enum MkTimeoutE value_out;
1465 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(TimeoutE,value_out));
1466 goto end;
1467 error:
1469 end:
1471}
1472
1474static OT_ProcRet NS(MkKernel_TypeE_FromInt) (OtClass_ARGS) {
1477 MK_I32 value = 0;
1480 enum MkTypeE value_out;
1481 MkErrorC_Check(MK_ERROR_FORMAT,MkTypeE_FromInt (value, &value_out));
1482 OT_retObj_SET(OT_NEW_Mk_enum_OBJ(TypeE,value_out));
1483 goto end;
1484 error:
1486 end:
1488}
1489
1490// doc-key: MkKernel,MkKernel-Enum,sm_
1491
1493static OT_ProcRet NS(MkKernel_ErrorE_ToInt) (OtClass_ARGS) {
1496 enum MkErrorE value = 0;
1500 goto end;
1501 error:
1503 end:
1505}
1506
1508static OT_ProcRet NS(MkKernel_ErrorE_ToString) (OtClass_ARGS) {
1511 enum MkErrorE value = 0;
1515 goto end;
1516 error:
1518 end:
1520}
1521
1523static OT_ProcRet NS(MkKernel_IdSE_ToInt) (OtClass_ARGS) {
1526 enum MkIdSE value = 0;
1530 goto end;
1531 error:
1533 end:
1535}
1536
1538static OT_ProcRet NS(MkKernel_IdSE_ToString) (OtClass_ARGS) {
1541 enum MkIdSE value = 0;
1545 goto end;
1546 error:
1548 end:
1550}
1551
1553static OT_ProcRet NS(MkKernel_TimeoutE_ToInt) (OtClass_ARGS) {
1556 enum MkTimeoutE value = 0;
1560 goto end;
1561 error:
1563 end:
1565}
1566
1568static OT_ProcRet NS(MkKernel_TimeoutE_ToString) (OtClass_ARGS) {
1571 enum MkTimeoutE value = 0;
1575 goto end;
1576 error:
1578 end:
1580}
1581
1583static OT_ProcRet NS(MkKernel_TypeE_ToInt) (OtClass_ARGS) {
1586 enum MkTypeE value = 0;
1590 goto end;
1591 error:
1593 end:
1595}
1596
1598static OT_ProcRet NS(MkKernel_TypeE_ToString) (OtClass_ARGS) {
1601 enum MkTypeE value = 0;
1605 goto end;
1606 error:
1608 end:
1610}
1611
1613// MkKernel_Enum_TCL_API
1614
1618
1619// doc-key: MkKernel,MkKernel-Setup-libmkkernel,sm_
1620
1622static OT_ProcRet NS(MkKernel_Cleanup) (OtClass_ARGS) {
1626 MkCleanupTmpl ();
1628 goto end;
1629 error:
1631 end:
1633}
1634
1636static OT_ProcRet NS(MkKernel_Setup) (OtClass_ARGS) {
1640 MkSetupTmpl ();
1642 goto end;
1643 error:
1645 end:
1647}
1648
1650// MkKernel_Setup_libmkkernel_TCL_API
1651
1652// END-MkKernel - created by 'tcl_MqC.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1653
1654// ---------------------------------------------------------------------------------------
1655
1656__attribute__((unused)) const static OtObjProcDefS MK(sOtClassDef)[] = {
1657 {VER, "print" , NS(Print_Class_Cmd) , NULL, NULL},
1658 {VER, "const" , NS(Const_Class_Cmd) , NULL, NULL},
1659// BEGIN-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1660
1661// doc-key: MkKernel,EnumFunc,sco
1662 {VER, "ErrorE_FromInt" , NS(MkKernel_ErrorE_FromInt) , NULL, NULL},
1663 {VER, "IdSE_FromInt" , NS(MkKernel_IdSE_FromInt) , NULL, NULL},
1664 {VER, "TimeoutE_FromInt" , NS(MkKernel_TimeoutE_FromInt) , NULL, NULL},
1665 {VER, "TypeE_FromInt" , NS(MkKernel_TypeE_FromInt) , NULL, NULL},
1666
1667// doc-key: MkKernel,EnumFunc,sm_
1668 {VER, "ErrorE_ToInt" , NS(MkKernel_ErrorE_ToInt) , NULL, NULL},
1669 {VER, "ErrorE_ToString" , NS(MkKernel_ErrorE_ToString) , NULL, NULL},
1670 {VER, "IdSE_ToInt" , NS(MkKernel_IdSE_ToInt) , NULL, NULL},
1671 {VER, "IdSE_ToString" , NS(MkKernel_IdSE_ToString) , NULL, NULL},
1672 {VER, "TimeoutE_ToInt" , NS(MkKernel_TimeoutE_ToInt) , NULL, NULL},
1673 {VER, "TimeoutE_ToString" , NS(MkKernel_TimeoutE_ToString) , NULL, NULL},
1674 {VER, "TypeE_ToInt" , NS(MkKernel_TypeE_ToInt) , NULL, NULL},
1675 {VER, "TypeE_ToString" , NS(MkKernel_TypeE_ToString) , NULL, NULL},
1676
1677// doc-key: MkKernel,Setup,sm_
1678 {VER, "Cleanup" , NS(MkKernel_Cleanup) , NULL, NULL},
1679 {VER, "Setup" , NS(MkKernel_Setup) , NULL, NULL},
1680
1681// END-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1682 {0, NULL, NULL, NULL, NULL}
1683};
1684
1685// ---------------------------------------------------------------------------------------
1686// not used.
1687
1688__attribute__((unused)) const static OtObjProcDefS MK(sInstanceDef)[] = {
1689// BEGIN-OBJ - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1690
1691// → no data
1692
1693// END-OBJ - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1694 {0, NULL, NULL, NULL, NULL}
1695};
1696
1702
1703// called on every NEW thread
1704OT_TCL_EXTERN int Tclmkkernel_Init ( OT_ENV_T interp )
1705{
1706 // check for the right tcl version
1707 if (Tcl_InitStubs (interp, "8.6", true) == NULL) {
1708 return TCL_ERROR;
1709 }
1710 if (Tcl_OOInitStubs (interp) == NULL) {
1711 return TCL_ERROR;
1712 }
1713
1714 // setup libmkkernel
1715 MkSetup();
1717
1718 // announce my package
1719 OtErrorCheckLng (Tcl_PkgProvide (interp, "tclmkkernel", META_VERSION ));
1720
1721 // pkg_mkIndex hack → only "Tcl_PkgProvide" is required
1722 if (Tcl_GetVar(interp,"::tcl::newPkgs", TCL_GLOBAL_ONLY) != NULL) return TCL_OK;
1723
1724 // toplevel namespace
1725 OT_NS_T ns = Tcl_CreateNamespace (interp, "tclmkkernel", NULL, NULL);
1726 check_NULL(ns) return TCL_ERROR;
1727
1728 // add PACKAGE commands
1729 OtErrorCheckLng( MK(FillNamespace) (interp,ns,MK(sOtClassDef),NULL));
1730
1731 // ATTENTION: MK(ClassDef) "class-resolution" require that "MkObjectC" is always first
1732 // BEGIN-CLASS-call-init - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1733
1734 OtErrorCheckLng( NS(pMkObjectC_Init) (MK_RT_CALL interp, ns)) ;
1735 OtErrorCheckLng( NS(pMkBufferC_Init) (MK_RT_CALL interp, ns)) ;
1736 OtErrorCheckLng( NS(pMkBufferListC_Init) (MK_RT_CALL interp, ns)) ;
1737 OtErrorCheckLng( NS(pMkLogFileC_Init) (MK_RT_CALL interp, ns)) ;
1738 OtErrorCheckLng( NS(pMkErrorC_Init) (MK_RT_CALL interp, ns)) ;
1739 OtErrorCheckLng( NS(pMkRuntimeC_Init) (MK_RT_CALL interp, ns)) ;
1740 OtErrorCheckLng( NS(pMkBufferStreamC_Init) (MK_RT_CALL interp, ns)) ;
1741
1742 // END-CLASS-call-init - created by 'tcl_MqS.tcl -i NHI1_HOME/theKernel/c/gen/c_mkkernel.meta' - DO NOT change
1743
1744 // init libmkkernel global data
1745 if (MK_RT_REF.mkThreadData.ptr == NULL) {
1746 MK_RT_REF.mkThreadData = (MkThreadDataS) { "tclmkkernel", interp } ;
1747 } else if (strcmp(MK_RT_REF.mkThreadData.name,"tclmkkernel") == 0) {
1748 Tcl_SetErrorCode(interp, "TCLMK", "INIT", "NON-NULL", NULL);
1749 Tcl_SetResult(interp,"error: 'MK_RT_REF.mkThreadData' not NULL as expected",TCL_STATIC);
1750 return TCL_ERROR;
1751 } else {
1752 Tcl_SetErrorCode(interp, "TCLMK", "INIT", "WRONG-NAME", NULL);
1753 Tcl_SetResult(interp,"error: 'MK_RT_REF.mkThreadData' already in use with extension: ",TCL_STATIC);
1754 Tcl_AppendResult(interp, MK_RT_REF.mkThreadData.name, NULL);
1755 return TCL_ERROR;
1756 }
1757
1758 // already done?
1759 if (MK(reggv)[0] == NULL) {
1760
1761 int key=0;
1762#define regTclObj(str) MK(reggv)[MK(str)=key++] = Tcl_NewStringObj(#str,-1);Tcl_IncrRefCount(MK(reggv)[MK(str)]);
1763#define regTclObj2(def,str) MK(reggv)[MK(def)=key++] = Tcl_NewStringObj(str,-1);Tcl_IncrRefCount(MK(reggv)[MK(def)]);
1764#include "MkRegistry_tcl.h"
1765#undef regTclObj
1766#undef regTclObj2
1767 }
1768
1769 // get TCL internal data types
1770 MK(tcl_LONG) = Tcl_GetObjType("int") ;
1771 MK(tcl_WIDE) = Tcl_GetObjType("wideInt") ;
1772 MK(tcl_DOUBLE) = Tcl_GetObjType("double") ;
1773 MK(tcl_BOOLEAN) = Tcl_GetObjType("booleanString") ;
1774 MK(tcl_INDEX) = Tcl_GetObjType("index") ;
1775
1776 // export namespace
1777 OtErrorCheckLng( Tcl_Export(interp, ns, "Mk*C", false ) ) ;
1778
1779 return TCL_OK;
1780}
1781
1783{
1784 MkCleanup();
1785
1786 return TCL_OK;
1787}
tag: nhi1-release-250425
#define IdSE_ToString_doc
#define TimeoutE_FromInt_doc
#define MkCleanupTmpl()
#define objF
#define Get_Call_Cmd__SIZE
#define SIZE
#define FRAME_UPDATE
#define FRAME_GET(key)
#define IdSE_ToInt_doc
OT_TCL_EXTERN int Tclmkkernel_Unload(OT_ENV_T interp, int flags)
#define ErrorE_ToString_doc
#define VER
#define OT_SETUP_hdl_static
#define ErrorE_FromInt_doc
#define ErrorE_ToInt_doc
#define TypeE_ToInt_doc
#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 OtErrorCheckLngGoto(cmd)
#define check_NULL(code)
#define MK(n)
#define VAL2STR(obj)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
#define SETUP_ARGS
#define RL_objv(num)
Tcl_Class OT_CLS_T
#define OT_VARFRAME_DELETE
Tcl_Namespace * OT_NS_T
#define OT_CHECK_NI4(val)
#define OT_retObj_SET_Error
#define RL_NewS(num, str)
#define RL_Free(num)
#define OT_LNG_NAME_FROM_OBJ(_obj)
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_None
#define RL_NewC(num, str)
#define OT_retObj_SET_I32(nat)
#define OT_Prefix_CALL
#define OT_Check_ARGS
#define WNA(min, max, txt)
#define TCL_ARGS
#define NS(n)
#define OT_CHECK_ENUM(ename, val)
#define RL_NewI(num, itg)
#define RL_O(num, obj)
#define ot_fixstrobj(_s)
#define OT_retObj_RETURN
#define OT_VARFRAME_OBJ_RESULT(itp)
#define check_LNG(code)
#define OT_retObj_SET_STR(nat)
#define OT_NEW_Mk_enum_OBJ(typ, val)
Tcl_Object OT_SELF_T
#define OT_TCL_EXTERN
#define RL_init(code)
#define OT_REF_DECR(_obj)
#define OT_retObj_SET(val)
#define RG(_key)
#define str(s)
#define OT_REF_INCR(_obj)
#define OT_VARFRAME_CREATE
#define OT_CHECK_NOARGS
#define OtErrorCheckLng(cmd)
#define MkErrorC_Check(mng, PROC)
#define OT_ProcRet
Tcl_Interp * OT_ENV_T
#define OT_Prefix_ARGS
#define xstr(s)
Tcl_Obj * OT_OBJ_T
#define OT_VARFRAME_ARGS
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 MK_ERROR_FORMAT
#define mk_inline
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 tclmkkernel internal memory …
void MkCleanup(void)
cleanup tclmkkernel internal memory …
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 MkOBJ_R(x)
cast a known-object into an MkObjectS reference
static MK_OBJ MkObj(MK_MNG mng)
cast a unknown-object into an MkObjectS pointer or NULL if not possible
#define MkRefDecrWithoutSelf(...)
#define MkSelfSet_3X(x, self, env)
MkIdSE
signal type of the MkIdS data val …
@ MK_ID_THREAD
val has a thread handle
@ MK_ID_PROCESS
val has a process handle
@ MK_ID_UNUSED
empty struct
struct MkThreadDataS MkThreadDataS
#define MkThreadLocal
#define MkRtSetup_ON(o)
#define MK_RT_CALL
#define MK_RT_ARGS
#define MkRtSetup_NULL
#define MK_RT_REF
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
const char * key
OT_OBJ_T ooRefC[100]
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 …
MkTypeS - class known as typ or type is used as class-base for a Managed-Object-Technology (MOT) type...