theConfig 10.0
Loading...
Searching...
No Matches
LcCall_tcl.c
Go to the documentation of this file.
1
9/* LABEL-NO */
10
11#include "LibLcConfig_tcl.h"
12
13#undef META_CONTEXT_S
14#define META_CONTEXT_S cfg
15
16/*****************************************************************************/
17/* */
18/* Proc-Call */
19/* */
20/*****************************************************************************/
21
22/*
23[ConfigIncludeCall signature]
24 callback-args := inclDir:String[in] path:String[in] ret:MkBufferListC[inout]
25 [static] proc callback { callback-args ?additional-args...? } ...
26 $cfg SetIncludeFunc callback
27 [instance] ::oo::class create YYY {
28 method callback { callback-args ?additional-args...? } ...
29 }
30 $cfg SetIncludeFunc [list [self] callback]
31 [class] ::oo::class create YYY {
32 self method callback { callback-args ?additional-args...? } ...
33 }
34 $cfg SetIncludeFunc [list YYY callback]
35[ConfigIncludeCall signature]
36*/
37
38enum MkErrorE NS(ConfigIncludeCall) ( LcConfigIncludeCallF_ARGS )
39{
41
42 // 1. setup environment
44 if (interp==NULL || Tcl_InterpDeleted(interp)) return MK_OK;
45
46 // 2. setup arguments
47 struct MkCallS *call = cfg->fConfigIncludeData ;
48 Tcl_Obj *objv[6+MkProcResolve_maxArgsLen] = {0};
49 int objc = 0;
50
51 // 3. setup my
52rescan:
53 switch (call->type) {
54 case MkCallS_own_method: {
55 // this is a instance->method
56 objv[objc++] = OT_SELF_NAME_O(MkOBJ(cfg));
57 break;
58 }
60 case MkCallS_static:
61 objv[objc++] = call->my;
62 break;
63 case MkCallS_proc:
64 break;
65 case MkCallS_init: {
66 check_META(MK(ProcResolve)(MK_RT_CALL interp, MkOBJ(cfg), call)) goto error_mq;
67 goto rescan;
68 }
69 case MkCallS_error:
70 goto error;
71 case MkCallS_null:
72 return MK_OK;
73 }
74
75 // 4. setup methode
76 if (call->mth) objv[objc++] = call->mth;
77
78 // 5. setup CTX arg
79 switch (call->type) {
81 break;
83 case MkCallS_static:
84 case MkCallS_proc:
85 objv[objc++] = META2VAL_X(cfg);
86 break;
87 case MkCallS_init:
88 break;
89 case MkCallS_error:
90 goto error;
91 case MkCallS_null:
92 return MK_OK;
93 }
94 objv[objc++] = Tcl_NewStringObj(incDir,-1);
95 objv[objc++] = Tcl_NewStringObj(path,-1);
96 objv[objc++] = OT_TMP_BFL_OBJ(ret_inout);
97
98 if (call->args) MK(ProcResolveAppendArgs)(call,&objc,objv);
99
100 // 3. call the callback
101 int tclret = MK(EvalObjv) (interp, objc, objv, TCL_EVAL_GLOBAL);
102
103 if (tclret == TCL_OK) {
104 Tcl_ResetResult(interp);
105 return MkErrorGetCode_0E();
106 }
107error:
109error_mq:
110 return MkErrorStack_0E();
111}
112
113void NS(ConfigIncludeFree) ( LcConfigIncludeFreeF_ARGS )
114{
116 if ( interp == NULL || Tcl_InterpDeleted(interp)) return;
117
118 MkCallFree(cfg->fConfigIncludeData);
119
120 //OT_REF_DECR_AND_NULL(cfg->fConfigIncludeHook);
121
122 cfg->fConfigIncludeCall = NULL;
123 cfg->fConfigIncludeFree = NULL;
124}
125
126// =====================================================================================================================
127
128/*
129[SettingDeleteCall signature]
130 callback-args := hdl:EXPORT-HANDLE[in]
131 [static] proc callback { callback-args ?additional-args...? } ...
132 $cfg SetSettingDeleteFunc callback
133 [instance] ::oo::class create XXX {
134 method callback { callback-args ?additional-args...? } ...
135 }
136 $cfg SetSettingDeleteFunc [list [self] callback]
137 [class] ::oo::class create YYY {
138 self method callback { callback-args ?additional-args...? } ...
139 }
140 $cfg SetSettingDeleteFunc [list YYY callback]
141[SettingDeleteCall signature]
142*/
143
144enum MkErrorE NS(SettingDeleteCall) ( LcSettingDeleteCallF_ARGS )
145{
147
148 // 1. setup environment
150 if (interp==NULL || Tcl_InterpDeleted(interp)) return MK_OK;
151
152 static MkThreadLocal bool onCall = false;
153 if (onCall) {
154printSTACK_1(cfg)
155 return MkErrorSetC_2M(cfg,"REKURSIVE call on LcSettingC -> delete handler");
156 }
157 onCall=true;
158
159 // 2. setup arguments
160 struct MkCallS *call = cfg->fSettingDeleteData;
161 Tcl_Obj *objv[5+MkProcResolve_maxArgsLen] = {0};
162 int objc = 0;
163
164 if (call->nsPtr == NULL) {
165 call->nsPtr = Tcl_FindNamespace(interp,VAL2STR(call->nsO),NULL,TCL_GLOBAL_ONLY);
166 if (call->nsPtr == NULL) return MK_OK ; // instance namespace already deleted
167 }
168
169 // 3. setup my
170rescan:
171 switch (call->type) {
172 case MkCallS_own_method: {
173 // this is a instance->method
174 objv[objc++] = OT_SELF_NAME_O(MkOBJ(cfg));
175 break;
176 }
178 case MkCallS_static:
179 objv[objc++] = call->my;
180 break;
181 case MkCallS_proc:
182 break;
183 case MkCallS_init: {
184 check_META(MK(ProcResolve)(MK_RT_CALL interp, MkOBJ(cfg), call)) goto error;
185 goto rescan;
186 }
187 case MkCallS_error:
188 goto error;
189 case MkCallS_null:
190 return MK_OK;
191 }
192
193 // 4. setup methode
194 if (call->mth) objv[objc++] = call->mth;
195
196 objv[objc++] = LONG2VAL(MkObjectHandleGet_1X(cfs));
197
198 if (call->args) MK(ProcResolveAppendArgs)(call,&objc,objv);
199
200 // 3. call the callback
201 int tclret = MK(EvalObjv) (interp, objc, objv, TCL_EVAL_GLOBAL);
202
203//printV("tclret=%i, code=%s\n", tclret, MkLogErrorE(MkErrorGetCode_0E()))
204
205 if (tclret != TCL_OK) goto error;
206
207 Tcl_ResetResult(interp);
208 onCall = false;
209 return MkErrorGetCode_0E();
210
211error:
213 onCall = false;
214 return MkErrorStack_0E();
215}
216
217void NS(SettingDeleteFree) ( LcSettingDeleteFreeF_ARGS )
218{
220 if ( interp == NULL || Tcl_InterpDeleted(interp) ) return;
221
222 MK(CallFree) (&cfg->fSettingDeleteData);
223
224 //OT_REF_DECR_AND_NULL(cfg->fSettingDeleteHook);
225
226 cfg->fSettingDeleteData = NULL;
227 cfg->fSettingDeleteCall = NULL;
228 cfg->fSettingDeleteFree = NULL;
229}
tag: nhi1-release-250425
#define NS(n)
#define MK(n)
#define VAL2STR(obj)
#define LONG2VAL(nat)
#define check_META(code)
#define META2VAL_X(x)
#define OT_ERROR_LNG_2_META(m)
#define OT_TMP_BFL_OBJ(val)
#define OT_SELF_NAME_O(o)
#define MkProcResolve_maxArgsLen
#define SETUP_interp
#define LcSettingDeleteFreeF_ARGS
#define LcSettingDeleteCallF_CHECK
#define LcConfigIncludeCallF_CHECK
#define LcConfigIncludeFreeF_ARGS
#define LcConfigIncludeCallF_ARGS
#define LcSettingDeleteCallF_ARGS
#define MkErrorGetCode_0E()
#define MkErrorStack_0E()
#define MkErrorSetC_2M(err, message)
MkErrorE
MK_OK
#define MkObjectHandleGet_1X(x)
#define MkOBJ(x)
#define MkThreadLocal
#define MK_RT_CALL
#define MkCallFree(cb)
OT_OBJ_T mth
OT_ENV_T interp
OT_OBJ_T args
enum MkCallS::@2 type
OT_NS_T nsPtr
OT_OBJ_T nsO
OT_OBJ_T my