theSq3Lite 10.0 NHI1 - theKernel - theLink - theConfig - theSq3Lite - theCompiler - theBrain - theGuard - theLib - theATL
c - tcl - atl - cs - py - rb - jv - cc
Loading...
Searching...
No Matches
Sq3ValueC_tcl.c
Go to the documentation of this file.
1
12/* LABEL-START */
13
14#define META_FILE_NAME "Sq3ValueC_tcl.c"
15
17
18#define OT_CLASS NS(Sq3ValueC)
19#define OT_CLASS_NAME "Sq3ValueC"
20
21#define OBJECT2VAL(O) MkAssertCastM(Sq3ValueC,(Tcl_ObjectGetMetadata(O, &MK(AtomMeta))))
22
23// TCL class
25
26// META class
28MkThreadLocal OT_OBJ_T SQ3(Sq3ValueC_MK_NULL) = NULL;
29
30// META: ObjNew feature: selfCreate will be called from "ObjNew->MkSelfNew" if MkObj need a SELF pointer
31static MK_PTR NS(Sq3ValueC_selfCreate) (MK_RT_ARGS MK_OBJ const obj, MK_PTR const env) {
32 OT_ENV_T interp = env;
33 return MK(AtomCreate) (MK_RT_CALL interp,obj,OT_CLASS,NULL,NULL);
34}
35// META: is called when the META object is destroyed and SELF does NOT belongs to the META.
36static void NS(Sq3ValueC_selfDelete) (MK_RT_ARGS MK_PTR selfP, MK_PTR const env) {
37 OT_SELF_T selfO = selfP;
38 OT_ENV_T interp = env;
39 MK(AtomDeleteHard) (MK_RT_CALL interp, selfO);
40}
41// META: is called when the META object is destroyed and SELF does NOT belong to the META.
42static void NS(Sq3ValueC_selfUnlink) (MK_RT_ARGS MK_PTR selfP, MK_PTR const env) {
43 OT_SELF_T selfO = selfP;
44 OT_ENV_T interp = env;
45 MK(AtomUnlink) (MK_RT_CALL interp, selfO);
46}
47
48// ATTENTION: TCL has no "Unlink" because the "Tcl_ObjectSetMetadata(selfO,&MK(AtomMeta),NULL);" call
49// also the destructor
50
51#define OT_SETUP_hdl_static_constr_pre
52#define OT_SETUP_hdl_static_constr \
53 OT_SETUP_hdl_static_constr_pre; \
54 OT_SETUP_hdl_static
55
56#define OT_SETUP_hdl_static \
57 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
58 AllRtSetup_NULL; \
59 __attribute__((unused)) OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
60 __attribute__((unused)) MK_TYP hdl = Sq3ValueC##_TT;
61
62#define OT_SETUP_hdl SetupHdlFromMetaData_2(VAL,SQ3_VAL);
63#define OT_SETUP_hdl__null_allow SetupHdlFromMetaData__null_allow_2(VAL,SQ3_VAL);
64#define OT_SETUP_hdl_destr SetupHdlFromMetaData__null_allow_2(VAL,SQ3_VAL);
65
66#define OT_SETUP_hdl_constr_pre
67#define OT_SETUP_hdl_constr \
68 OT_SETUP_hdl_constr_pre; \
69 int __skip=Tcl_ObjectContextSkippedArgs(objCtx); \
70 AllRtSetup_NULL; \
71 MK_RT_UNUSED OT_SELF_T selfO = Tcl_ObjectContextObject(objCtx); \
72 SQ3_VAL hdl = (SQ3_VAL) &MkERROR;
73
74#if !defined(SetupRtFromHdl_XN)
75 #define SetupRtFromHdl_XN(hdl) AllRtSetup_XN(hdl)
76 #define SetupRtFromHdl_X(hdl) AllRtSetup_X(hdl)
77#endif
78
79// initialize the TCL and MO class specific object
80#define ClassInit \
81 /* if not already done, initialize NEW MQ type */ \
82 if (Sq3ValueCTT == NULL) Sq3ValueCTT = Sq3ValueSTT; \
83 \
84 /* protect against double call */ \
85 if (Sq3ValueCTT->selfCreate == NS(Sq3ValueC_selfCreate)) return MK_OK; \
86 \
87 /* add "selfCreate" and "selfDelete" feature to the MQ-Class */ \
88 Sq3ValueCTT->selfCreate = NS(Sq3ValueC_selfCreate); \
89 Sq3ValueCTT->selfDelete = NS(Sq3ValueC_selfDelete); \
90 Sq3ValueCTT->selfUnlink = NS(Sq3ValueC_selfUnlink); \
91 \
92 /* create the TCL-class */ \
93 OT_SELF_T classO = MK(ClassDef)(interp,ns,Sq3ValueCTT); \
94 check_NULL(classO) goto error; \
95 OT_CLASS = Tcl_GetObjectAsClass(classO); \
96 \
97 /* create the TCL static Methods */ \
98 static MkThreadLocal OtUnknownS NS(sClassUnknown) = {OT_UNKNOWN_CLASS}; \
99 check_LNG(MK(UnknownSetup) (interp,classO,NS(sOtClassDef),&NS(sClassUnknown))) goto error; \
100 \
101 /* create the TCL instance Methods */ \
102 static MkThreadLocal OtUnknownS NS(sInstanceUnknown) = {OT_UNKNOWN_INSTANCE}; \
103 check_LNG(MK(UnknownSetup) (interp,classO,NS(sInstanceDef),&NS(sInstanceUnknown))) goto error; \
104 \
105 /* define the "NULL" object */ \
106 SQ3(Sq3ValueC_MK_NULL) = Tcl_GetObjectName(interp, \
107 MK(AtomCreate) (MK_RT_CALL interp, NULL /*obj*/, OT_CLASS, "MK_NULL" /*name*/, "::tclsq3lite::Sq3ValueC" /*ns*/) \
108 ); \
109 Tcl_IncrRefCount(SQ3(Sq3ValueC_MK_NULL));
110
111#define VER TCL_OO_METHOD_VERSION_CURRENT
112
113/* LABEL-END */
114
115// BEGIN-DOC - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
116
117// doc-key: Sq3ValueC,Sq3Value,sc_,func
118#define GetNull_doc "Sq3ValueC [Sq3ValueC GetNull]"
119#define HandleResolve_doc "Sq3ValueC [Sq3ValueC HandleResolve netHdl:MK_HDL]"
120#define Instances_doc "Sq3ValueC [Sq3ValueC Instances]"
121
122// doc-key: Sq3ValueC,Sq3Value,oCx,func
123#define Dup_doc "Sq3ValueC [$sq3val Dup] (const)"
124
125// doc-key: Sq3ValueC,Sq3Value,oc_,func
126#define BUF_doc "MkBufferC [$val BUF] (const)"
127#define Blob_doc "MkBufferC [$sq3val Blob] (const)"
128#define Next_doc "Sq3ValueC [$val Next]"
129#define Prev_doc "Sq3ValueC [$val Prev]"
130
131// doc-key: Sq3ValueC,Sq3Value,oco,func
132#define VtabInFirst_doc "Sq3ValueC [$pVal VtabInFirst]"
133#define VtabInNext_doc "Sq3ValueC [$pVal VtabInNext]"
134
135// doc-key: Sq3ValueC,Sq3Value,om_,func
136#define BinaryR_doc "binary [$sq3val BinaryR] (const)"
137#define Bytes_doc "Sq3TextE [$sq3val Bytes] (const)"
138#define Double_doc "double [$sq3val Double] (const)"
139#define Encoding_doc "Sq3TextE [$sq3val Encoding] (const)"
140#define FromBind_doc "bool [$sq3val FromBind] (const)"
141// skip class-overload: HandleGet → MkObjectHandleGet
142#define Int_doc "int32 [$sq3val Int] (const)"
143#define Int64_doc "int64 [$sq3val Int64] (const)"
144// skip class-overload: Log → MkObjectLog
145#define NoChange_doc "bool [$sq3val NoChange] (const)"
146#define NumericType_doc "Sq3TypeE [$sq3val NumericType] (const)"
147#define StringR_doc "string [$sq3val StringR] (const)"
148#define SubType_doc "int32 [$sq3val SubType] (const)"
149#define Text_doc "string [$sq3val Text] (const)"
150#define Type_doc "Sq3TypeE [$sq3val Type] (const)"
151
152// END-DOC - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
153
154/*****************************************************************************/
155/* */
156/* O B J E C T */
157/* */
158/*****************************************************************************/
159
160// BEGIN-Sq3ValueC - created by 'tcl_MqC.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
161
165
166// doc-key: Sq3ValueC,Sq3ValueC-Class-Export,sc_
167
169static OT_ProcRet NS(Sq3ValueC_HandleResolve) (OtClass_ARGS) {
172 MK_HDL netHdl = 0;
175 SQ3_VAL retVal = Sq3ValueHandleResolve (netHdl);
176 OT_retObj_SET_VAL(retVal);
177 goto end;
178 error:
180 end:
182}
183
184// doc-key: Sq3ValueC,Sq3ValueC-Class-Export,om_
185
186// skip on class-overload: Sq3ValueHandleGet → MkObjectHandleGet
188static OT_ProcRet NS(Sq3ValueC_HandleGet) (Sq3ValueC_ARGS) {OT_ERROR_LNG_RETURN;}
189
191// Sq3ValueC_Class_TCL_API
192
196
197// doc-key: Sq3ValueC,Sq3ValueC-Class-Introspection,oc_
198
200static OT_ProcRet NS(Sq3ValueC_Next) (Sq3ValueC_ARGS) {
204 SQ3_VAL retVal = Sq3ValueNext (hdl);
205 OT_retObj_SET_VAL(retVal);
206 goto end;
207 error:
209 end:
211}
212
214static OT_ProcRet NS(Sq3ValueC_Prev) (Sq3ValueC_ARGS) {
218 SQ3_VAL retVal = Sq3ValuePrev (hdl);
219 OT_retObj_SET_VAL(retVal);
220 goto end;
221 error:
223 end:
225}
226
227// doc-key: Sq3ValueC,Sq3ValueC-Class-Introspection,sc_
228
230static OT_ProcRet NS(Sq3ValueC_Instances) (OtClass_ARGS) {
234 SQ3_VAL retVal = Sq3ValueInstances ();
235 OT_retObj_SET_VAL(retVal);
236 goto end;
237 error:
239 end:
241}
242
244// Sq3ValueC_Class_TCL_API
245
249
250// doc-key: Sq3ValueC,Sq3ValueC-Class-Misc,sc_
251
253static OT_ProcRet NS(Sq3ValueC_GetNull) (OtClass_ARGS) {
257 SQ3_VAL retVal = Sq3ValueGetNull ();
258 OT_retObj_SET_VAL(retVal);
259 goto end;
260 error:
262 end:
264}
265
267// Sq3ValueC_Class_TCL_API
268
272
273// doc-key: Sq3ValueC,Sq3ValueC-Info,om_
274
276static OT_ProcRet NS(Sq3ValueC_Bytes) (Sq3ValueC_ARGS) {
281 goto end;
282 error:
284 end:
286}
287
289static OT_ProcRet NS(Sq3ValueC_Encoding) (Sq3ValueC_ARGS) {
294 goto end;
295 error:
297 end:
299}
300
302static OT_ProcRet NS(Sq3ValueC_FromBind) (Sq3ValueC_ARGS) {
307 goto end;
308 error:
310 end:
312}
313
314// skip on class-overload: Sq3ValueLog → MkObjectLog
317
319static OT_ProcRet NS(Sq3ValueC_NoChange) (Sq3ValueC_ARGS) {
324 goto end;
325 error:
327 end:
329}
330
332static OT_ProcRet NS(Sq3ValueC_NumericType) (Sq3ValueC_ARGS) {
337 goto end;
338 error:
340 end:
342}
343
345static OT_ProcRet NS(Sq3ValueC_SubType) (Sq3ValueC_ARGS) {
350 goto end;
351 error:
353 end:
355}
356
358static OT_ProcRet NS(Sq3ValueC_Type) (Sq3ValueC_ARGS) {
363 goto end;
364 error:
366 end:
368}
369
371// Sq3ValueC_Info_TCL_API
372
376
377// doc-key: Sq3ValueC,Sq3ValueC-TOR,oCx
378
380static OT_ProcRet NS(Sq3ValueC_Dup) (Sq3ValueC_ARGS) {
384 SQ3_VAL retVal = Sq3ValueDup (hdl);
385 if (retVal == NULL) {
386 OT_ERROR_CONSTRUCTOR(Sq3ValueC);
387 goto error;
388 }
389 OT_retObj_SET_VAL(retVal);
390 goto end;
391 error:
393 end:
395}
396
398// Sq3ValueC_TOR_TCL_API
399
403
404// doc-key: Sq3ValueC,Sq3ValueC-Types,oc_
405
407static OT_ProcRet NS(Sq3ValueC_BUF) (Sq3ValueC_ARGS) {
411 MK_BUF retVal = Sq3ValueBUF (hdl);
412 OT_retObj_SET_BUF(retVal);
413 goto end;
414 error:
416 end:
418}
419
421static OT_ProcRet NS(Sq3ValueC_Blob) (Sq3ValueC_ARGS) {
425 MK_BUF retVal = Sq3ValueBlob (hdl);
426 OT_retObj_SET_BUF(retVal);
427 goto end;
428 error:
430 end:
432}
433
434// doc-key: Sq3ValueC,Sq3ValueC-Types,om_
435
437static OT_ProcRet NS(Sq3ValueC_BinaryR) (Sq3ValueC_ARGS) {
441 MkBinaryR retVal = Sq3ValueBinaryR (hdl);
443 goto end;
444 error:
446 end:
448}
449
451static OT_ProcRet NS(Sq3ValueC_Double) (Sq3ValueC_ARGS) {
456 goto end;
457 error:
459 end:
461}
462
464static OT_ProcRet NS(Sq3ValueC_Int) (Sq3ValueC_ARGS) {
469 goto end;
470 error:
472 end:
474}
475
477static OT_ProcRet NS(Sq3ValueC_Int64) (Sq3ValueC_ARGS) {
482 goto end;
483 error:
485 end:
487}
488
490static OT_ProcRet NS(Sq3ValueC_StringR) (Sq3ValueC_ARGS) {
494 MkStringR retVal = Sq3ValueStringR (hdl);
496 goto end;
497 error:
499 end:
501}
502
504static OT_ProcRet NS(Sq3ValueC_Text) (Sq3ValueC_ARGS) {
509 goto end;
510 error:
512 end:
514}
515
517// Sq3ValueC_Types_TCL_API
518
522
523// doc-key: Sq3ValueC,Sq3ValueC-Vtab,oco
524
526static OT_ProcRet NS(Sq3ValueC_VtabInFirst) (Sq3ValueC_ARGS) {
530 SQ3_VAL ppOut;
531 MkErrorC_Check(hdl,Sq3ValueVtabInFirst (hdl, &ppOut));
532 OT_retObj_SET_VAL(ppOut);
533 goto end;
534 error:
536 end:
538}
539
541static OT_ProcRet NS(Sq3ValueC_VtabInNext) (Sq3ValueC_ARGS) {
545 SQ3_VAL ppOut;
546 MkErrorC_Check(hdl,Sq3ValueVtabInNext (hdl, &ppOut));
547 OT_retObj_SET_VAL(ppOut);
548 goto end;
549 error:
551 end:
553}
554
556// Sq3ValueC_Vtab_TCL_API
557
558// END-Sq3ValueC - created by 'tcl_MqC.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
559
560// ---------------------------------------------------------------------------------------
561
562static Tcl_MethodType NS(sOtClassDef)[] = {
563// BEGIN-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
564
565// doc-key: Sq3ValueC,Sq3Value,sc_
566 {VER, "GetNull" , NS(Sq3ValueC_GetNull) , NULL, NULL},
567 {VER, "HandleResolve" , NS(Sq3ValueC_HandleResolve) , NULL, NULL},
568 {VER, "Instances" , NS(Sq3ValueC_Instances) , NULL, NULL},
569
570// END-CLASS - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
571 {0, NULL, NULL, NULL}
572};
573
574// ---------------------------------------------------------------------------------------
575
576static Tcl_MethodType NS(sInstanceDef)[] = {
577// BEGIN-OBJ - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
578
579// doc-key: Sq3ValueC,Sq3Value,oCx
580 {VER, "Dup" , NS(Sq3ValueC_Dup) , NULL, NULL},
581
582// doc-key: Sq3ValueC,Sq3Value,oc_
583 {VER, "BUF" , NS(Sq3ValueC_BUF) , NULL, NULL},
584 {VER, "Blob" , NS(Sq3ValueC_Blob) , NULL, NULL},
585 {VER, "Next" , NS(Sq3ValueC_Next) , NULL, NULL},
586 {VER, "Prev" , NS(Sq3ValueC_Prev) , NULL, NULL},
587
588// doc-key: Sq3ValueC,Sq3Value,oco
589 {VER, "VtabInFirst" , NS(Sq3ValueC_VtabInFirst) , NULL, NULL},
590 {VER, "VtabInNext" , NS(Sq3ValueC_VtabInNext) , NULL, NULL},
591
592// doc-key: Sq3ValueC,Sq3Value,om_
593 {VER, "BinaryR" , NS(Sq3ValueC_BinaryR) , NULL, NULL},
594 {VER, "Bytes" , NS(Sq3ValueC_Bytes) , NULL, NULL},
595 {VER, "Double" , NS(Sq3ValueC_Double) , NULL, NULL},
596 {VER, "Encoding" , NS(Sq3ValueC_Encoding) , NULL, NULL},
597 {VER, "FromBind" , NS(Sq3ValueC_FromBind) , NULL, NULL},
598 // skip class-overload: Sq3ValueHandleGet → HandleGet, NS(Sq3ValueC_HandleGet)
599 {VER, "Int" , NS(Sq3ValueC_Int) , NULL, NULL},
600 {VER, "Int64" , NS(Sq3ValueC_Int64) , NULL, NULL},
601 // skip class-overload: Sq3ValueLog → Log, NS(Sq3ValueC_Log)
602 {VER, "NoChange" , NS(Sq3ValueC_NoChange) , NULL, NULL},
603 {VER, "NumericType" , NS(Sq3ValueC_NumericType) , NULL, NULL},
604 {VER, "StringR" , NS(Sq3ValueC_StringR) , NULL, NULL},
605 {VER, "SubType" , NS(Sq3ValueC_SubType) , NULL, NULL},
606 {VER, "Text" , NS(Sq3ValueC_Text) , NULL, NULL},
607 {VER, "Type" , NS(Sq3ValueC_Type) , NULL, NULL},
608
609// END-OBJ - created by 'tcl_MqS.tcl -i NHI1_HOME/theSq3Lite/c/gen/c_sq3lite.meta' - DO NOT change
610 {0, NULL, NULL, NULL, NULL}
611};
612
618
619int NS(pSq3ValueC_Init) ( MK_RT_ARGS Tcl_Interp *interp, Tcl_Namespace *ns)
620{
622
623 return TCL_OK;
624error:
625 return TCL_ERROR;
626}
#define MK(n)
#define OT_CHECK_NIH(val)
#define OT_retObj_SET_BOL(nat)
#define OT_SETUP_NOARG(d)
#define OT_SETUP_ONEARG(d)
Tcl_Class OT_CLS_T
#define OT_ERROR_LNG_RETURN
#define OT_retObj_SET_Error
#define OT_retObj_SET_BUF(nat)
#define OT_ERROR_CONSTRUCTOR(class)
#define OT_retObj_SET_DBL(nat)
#define OT_retObj_SET_I64(nat)
#define OT_CHECK_REQUIRED(val)
#define OT_retObj_SET_I32(nat)
#define OT_GET__ME_REF_MkStringR(s)
#define OT_GET__ME_REF_MkBinaryR(b)
#define OT_retObj_RETURN
#define OT_retObj_SET_STR(nat)
Tcl_Object OT_SELF_T
#define OT_retObj_SET(val)
#define OT_CHECK_NOARGS
#define MkErrorC_Check(mng, PROC)
#define OT_ProcRet
Tcl_Interp * OT_ENV_T
Tcl_Obj * OT_OBJ_T
LibSq3Lite_private_tcl.h - 17 Apr 2025 - aotto1968.
#define OtClass_ARGS
#define SQ3(n)
#define OT_NEW_Sq3_enum_OBJ(typ, val)
#define NS(n)
#define OT_retObj_SET_VAL(nat)
#define Sq3ValueC_ARGS
#define Instances_doc
#define Int64_doc
#define BinaryR_doc
#define Blob_doc
#define OT_SETUP_hdl
#define Int_doc
static __thread MK_TYP Sq3ValueCTT
#define Text_doc
#define Dup_doc
#define NumericType_doc
#define GetNull_doc
#define Next_doc
#define HandleResolve_doc
#define VtabInFirst_doc
#define Prev_doc
#define VER
#define OT_CLASS
#define OT_SETUP_hdl_static
#define Type_doc
#define BUF_doc
#define StringR_doc
#define SubType_doc
#define FromBind_doc
#define VtabInNext_doc
#define Double_doc
#define ClassInit
#define NoChange_doc
#define Bytes_doc
#define Encoding_doc
#define MK_UNUSED
#define MK_DEPRECATED
MK_PTRB * MK_PTR
int32_t MK_HDL
#define MkThreadLocal
#define MK_RT_CALL
#define MK_RT_ARGS
static SQ3_VAL Sq3ValueGetNull(void)
Null-Slot - return a Sq3ValueC typed NULL instance …
#define Sq3ValueInstances()
#define Sq3ValueHandleResolve(...)
static SQ3_VAL Sq3ValueNext(SQ3_VAL const val)
get next instance from linked-list of Sq3ValueS type
static SQ3_VAL Sq3ValuePrev(SQ3_VAL const val)
get previous instance from linked-list of Sq3ValueS type
static enum Sq3TextE Sq3ValueEncoding(SQ3_VALN sq3val)
Report the internal text encoding state of an sqlite3_value object …
static enum Sq3TypeE Sq3ValueType(SQ3_VALN sq3val)
Obtaining SQL Values …
static enum Sq3TextE Sq3ValueBytes(SQ3_VALN sq3val)
Obtaining SQL Values …
static MK_I32 Sq3ValueSubType(SQ3_VALN sq3val)
Finding The Subtype Of SQL Values …
static MK_BOOL Sq3ValueFromBind(SQ3_VALN sq3val)
Obtaining SQL Values …
static MK_BOOL Sq3ValueNoChange(SQ3_VALN sq3val)
Obtaining SQL Values …
static enum Sq3TypeE Sq3ValueNumericType(SQ3_VALN sq3val)
Obtaining SQL Values …
static SQ3_VAL Sq3ValueDup(SQ3_VALN sq3val)
Copy And Free SQL Values …
static MkStringR Sq3ValueStringR(SQ3_VALN sq3val)
Obtaining SQL Values …
#define Sq3ValueBUF(...)
static MkBinaryR Sq3ValueBinaryR(SQ3_VALN sq3val)
Obtaining SQL Values …
#define Sq3ValueBlob(...)
static MK_I64 Sq3ValueInt64(SQ3_VALN sq3val)
Obtaining SQL Values …
static MK_STRN Sq3ValueText(SQ3_VALN sq3val)
Obtaining SQL Values …
static MK_DBL Sq3ValueDouble(SQ3_VALN sq3val)
Obtaining SQL Values …
static MK_I32 Sq3ValueInt(SQ3_VALN sq3val)
Obtaining SQL Values …
static enum MkErrorE Sq3ValueVtabInNext(SQ3_VAL pVal, SQ3_VAL *ppOut)
Find all elements on the right-hand side of an IN constraint …
static enum MkErrorE Sq3ValueVtabInFirst(SQ3_VAL pVal, SQ3_VAL *ppOut)
Find all elements on the right-hand side of an IN constraint …
Struct to represent the data of the Sq3ValueC …