summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2022-10-22 23:48:10 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2022-10-22 23:48:10 (GMT)
commit9cfb05d5b2abc38b205ed1c41781ffde314f72b6 (patch)
treea454e3f88ddef08dc92d5af9eea480b179015094 /generic
parent500e1529f18c04152dbf1a395c6c7a61f08f63b3 (diff)
parentc541afcd1abf1c09cd079d8b50a7abd33b8dc739 (diff)
downloadtcl-9cfb05d5b2abc38b205ed1c41781ffde314f72b6.zip
tcl-9cfb05d5b2abc38b205ed1c41781ffde314f72b6.tar.gz
tcl-9cfb05d5b2abc38b205ed1c41781ffde314f72b6.tar.bz2
TIP #643: Provide a public API to retrieve nul terminator length for an encoding
Diffstat (limited to 'generic')
-rw-r--r--generic/tcl.decls5
-rw-r--r--generic/tclDecls.h5
-rw-r--r--generic/tclEncoding.c27
-rw-r--r--generic/tclStubInit.c1
-rw-r--r--generic/tclTest.c24
5 files changed, 60 insertions, 2 deletions
diff --git a/generic/tcl.decls b/generic/tcl.decls
index 209fb9a..49f2b2c 100644
--- a/generic/tcl.decls
+++ b/generic/tcl.decls
@@ -2547,6 +2547,11 @@ declare 682 {
int Tcl_RemoveChannelMode(Tcl_Interp *interp, Tcl_Channel chan, int mode)
}
+# TIP 643
+declare 683 {
+ int Tcl_GetEncodingNulLength(Tcl_Encoding encoding)
+}
+
# ----- BASELINE -- FOR -- 8.7.0 ----- #
##############################################################################
diff --git a/generic/tclDecls.h b/generic/tclDecls.h
index ef1904f..eb2ee1d 100644
--- a/generic/tclDecls.h
+++ b/generic/tclDecls.h
@@ -2036,6 +2036,8 @@ EXTERN int Tcl_GetNumber(Tcl_Interp *interp, const char *bytes,
/* 682 */
EXTERN int Tcl_RemoveChannelMode(Tcl_Interp *interp,
Tcl_Channel chan, int mode);
+/* 683 */
+EXTERN int Tcl_GetEncodingNulLength(Tcl_Encoding encoding);
typedef struct {
const struct TclPlatStubs *tclPlatStubs;
@@ -2754,6 +2756,7 @@ typedef struct TclStubs {
int (*tcl_GetNumberFromObj) (Tcl_Interp *interp, Tcl_Obj *objPtr, void **clientDataPtr, int *typePtr); /* 680 */
int (*tcl_GetNumber) (Tcl_Interp *interp, const char *bytes, size_t numBytes, void **clientDataPtr, int *typePtr); /* 681 */
int (*tcl_RemoveChannelMode) (Tcl_Interp *interp, Tcl_Channel chan, int mode); /* 682 */
+ int (*tcl_GetEncodingNulLength) (Tcl_Encoding encoding); /* 683 */
} TclStubs;
extern const TclStubs *tclStubsPtr;
@@ -4150,6 +4153,8 @@ extern const TclStubs *tclStubsPtr;
(tclStubsPtr->tcl_GetNumber) /* 681 */
#define Tcl_RemoveChannelMode \
(tclStubsPtr->tcl_RemoveChannelMode) /* 682 */
+#define Tcl_GetEncodingNulLength \
+ (tclStubsPtr->tcl_GetEncodingNulLength) /* 683 */
#endif /* defined(USE_TCL_STUBS) */
diff --git a/generic/tclEncoding.c b/generic/tclEncoding.c
index 52b02fc..efe4b43 100644
--- a/generic/tclEncoding.c
+++ b/generic/tclEncoding.c
@@ -983,6 +983,33 @@ Tcl_GetEncodingNames(
}
/*
+ *-------------------------------------------------------------------------
+ *
+ * Tcl_GetEncodingNulLength --
+ *
+ * Given an encoding, return the number of nul bytes used for the
+ * string termination.
+ *
+ * Results:
+ * The name of the encoding.
+ *
+ * Side effects:
+ * None.
+ *
+ *---------------------------------------------------------------------------
+ */
+int
+Tcl_GetEncodingNulLength(
+ Tcl_Encoding encoding)
+{
+ if (encoding == NULL) {
+ encoding = systemEncoding;
+ }
+
+ return ((Encoding *) encoding)->nullSize;
+}
+
+/*
*------------------------------------------------------------------------
*
* Tcl_SetSystemEncoding --
diff --git a/generic/tclStubInit.c b/generic/tclStubInit.c
index e6f6b5c..6d50a46 100644
--- a/generic/tclStubInit.c
+++ b/generic/tclStubInit.c
@@ -2048,6 +2048,7 @@ const TclStubs tclStubs = {
Tcl_GetNumberFromObj, /* 680 */
Tcl_GetNumber, /* 681 */
Tcl_RemoveChannelMode, /* 682 */
+ Tcl_GetEncodingNulLength, /* 683 */
};
/* !END!: Do not edit above this line. */
diff --git a/generic/tclTest.c b/generic/tclTest.c
index ee6062b..c9bad56 100644
--- a/generic/tclTest.c
+++ b/generic/tclTest.c
@@ -1996,12 +1996,17 @@ TestencodingObjCmd(
const char *string;
TclEncoding *encodingPtr;
static const char *const optionStrings[] = {
- "create", "delete", NULL
+ "create", "delete", "nullength", NULL
};
enum options {
- ENC_CREATE, ENC_DELETE
+ ENC_CREATE, ENC_DELETE, ENC_NULLENGTH
};
+ if (objc < 2) {
+ Tcl_WrongNumArgs(interp, 1, objv, "command ?args?");
+ return TCL_ERROR;
+ }
+
if (Tcl_GetIndexFromObj(interp, objv[1], optionStrings, "option", 0,
&index) != TCL_OK) {
return TCL_ERROR;
@@ -2012,6 +2017,7 @@ TestencodingObjCmd(
Tcl_EncodingType type;
if (objc != 5) {
+ Tcl_WrongNumArgs(interp, 2, objv, "name toutfcmd fromutfcmd");
return TCL_ERROR;
}
encodingPtr = (TclEncoding*)ckalloc(sizeof(TclEncoding));
@@ -2048,6 +2054,20 @@ TestencodingObjCmd(
Tcl_FreeEncoding(encoding); /* Free to match CREATE */
TclFreeInternalRep(objv[2]); /* Free the cached ref */
break;
+
+ case ENC_NULLENGTH:
+ if (objc > 3) {
+ Tcl_WrongNumArgs(interp, 2, objv, "?encoding?");
+ return TCL_ERROR;
+ }
+ encoding =
+ Tcl_GetEncoding(interp, objc == 2 ? NULL : Tcl_GetString(objv[2]));
+ if (encoding == NULL) {
+ return TCL_ERROR;
+ }
+ Tcl_SetObjResult(interp,
+ Tcl_NewIntObj(Tcl_GetEncodingNulLength(encoding)));
+ Tcl_FreeEncoding(encoding);
}
return TCL_OK;
}