summaryrefslogtreecommitdiffstats
path: root/generic/tclBinary.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2021-01-11 08:33:04 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2021-01-11 08:33:04 (GMT)
commit089b9970444fbf3410572b30650c80fc75bdda82 (patch)
treed55677f792c046ae4bf64ce7a09e29ff3ee8a6c5 /generic/tclBinary.c
parentb61dbff448d4ccad302a205fa518de3af09fa7ea (diff)
parent50199a530295ebd023b19ba7a96c17a2a0a99b66 (diff)
downloadtcl-089b9970444fbf3410572b30650c80fc75bdda82.zip
tcl-089b9970444fbf3410572b30650c80fc75bdda82.tar.gz
tcl-089b9970444fbf3410572b30650c80fc75bdda82.tar.bz2
TIP #481 implementation: Tcl_GetStringFromObj() with size_t length parameter
Diffstat (limited to 'generic/tclBinary.c')
-rw-r--r--generic/tclBinary.c32
1 files changed, 31 insertions, 1 deletions
diff --git a/generic/tclBinary.c b/generic/tclBinary.c
index 1b36244..396beec 100644
--- a/generic/tclBinary.c
+++ b/generic/tclBinary.c
@@ -496,7 +496,7 @@ TclGetBytesFromObj(
/*
*----------------------------------------------------------------------
*
- * Tcl_GetByteArrayFromObj --
+ * Tcl_GetByteArrayFromObj/TclGetByteArrayFromObj --
*
* Attempt to get the array of bytes from the Tcl object. If the object
* is not already a ByteArray object, an attempt will be made to convert
@@ -511,6 +511,7 @@ TclGetBytesFromObj(
*----------------------------------------------------------------------
*/
+#undef Tcl_GetByteArrayFromObj
unsigned char *
Tcl_GetByteArrayFromObj(
Tcl_Obj *objPtr, /* The ByteArray object. */
@@ -533,6 +534,35 @@ Tcl_GetByteArrayFromObj(
if (lengthPtr != NULL) {
*lengthPtr = baPtr->used;
}
+ return (unsigned char *) baPtr->bytes;
+}
+
+unsigned char *
+TclGetByteArrayFromObj(
+ Tcl_Obj *objPtr, /* The ByteArray object. */
+ size_t *lengthPtr) /* If non-NULL, filled with length of the
+ * array of bytes in the ByteArray object. */
+{
+ ByteArray *baPtr;
+ const Tcl_ObjIntRep *irPtr;
+ unsigned char *result = TclGetBytesFromObj(NULL, objPtr, (int *)NULL);
+
+ if (result) {
+ return result;
+ }
+
+ irPtr = TclFetchIntRep(objPtr, &tclByteArrayType);
+ assert(irPtr != NULL);
+
+ baPtr = GET_BYTEARRAY(irPtr);
+
+ if (lengthPtr != NULL) {
+#if TCL_MAJOR_VERSION > 8
+ *lengthPtr = baPtr->used;
+#else
+ *lengthPtr = ((size_t)(unsigned)(baPtr->used + 1)) - 1;
+#endif
+ }
return baPtr->bytes;
}