diff options
author | dgp <dgp@users.sourceforge.net> | 2022-09-18 13:59:26 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2022-09-18 13:59:26 (GMT) |
commit | 260c5156ed0ec2b944268320a267cee9a57cd547 (patch) | |
tree | 773b90fed82fe7a5f5884edf7308c8e725332c0d /generic/tclObj.c | |
parent | d171543388eb0149647f980eb25c80a9bfdadd1e (diff) | |
download | tcl-260c5156ed0ec2b944268320a267cee9a57cd547.zip tcl-260c5156ed0ec2b944268320a267cee9a57cd547.tar.gz tcl-260c5156ed0ec2b944268320a267cee9a57cd547.tar.bz2 |
TIP implementation to add/use public routines Tcl_GetNumber(FromObj).
Diffstat (limited to 'generic/tclObj.c')
-rw-r--r-- | generic/tclObj.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/generic/tclObj.c b/generic/tclObj.c index 5726596..f9b5bd3 100644 --- a/generic/tclObj.c +++ b/generic/tclObj.c @@ -3856,7 +3856,7 @@ TclSetBignumInternalRep( /* *---------------------------------------------------------------------- * - * TclGetNumberFromObj -- + * Tcl_GetNumberFromObj -- * * Extracts a number (of any possible numeric type) from an object. * @@ -3874,7 +3874,7 @@ TclSetBignumInternalRep( */ int -TclGetNumberFromObj( +Tcl_GetNumberFromObj( Tcl_Interp *interp, Tcl_Obj *objPtr, ClientData *clientDataPtr, @@ -3909,6 +3909,42 @@ TclGetNumberFromObj( TclParseNumber(interp, objPtr, "number", NULL, -1, NULL, 0)); return TCL_ERROR; } + +int +Tcl_GetNumber( + Tcl_Interp *interp, + const char *bytes, + size_t numBytes, + ClientData *clientDataPtr, + int *typePtr) +{ + static Tcl_ThreadDataKey numberCacheKey; + Tcl_Obj *objPtr = (Tcl_Obj *)Tcl_GetThreadData(&numberCacheKey, + sizeof(Tcl_Obj)); + + Tcl_FreeInternalRep(objPtr); + + if (bytes == NULL) { + bytes = &tclEmptyString; + numBytes = 0; + } + if (numBytes == (size_t)TCL_INDEX_NONE) { + numBytes = strlen(bytes); + } + if (numBytes > INT_MAX) { + if (interp) { + Tcl_SetObjResult(interp, Tcl_ObjPrintf( + "max size for a Tcl value (%d bytes) exceeded", INT_MAX)); + Tcl_SetErrorCode(interp, "TCL", "MEMORY", NULL); + } + return TCL_ERROR; + } + + objPtr->bytes = (char *) bytes; + objPtr->length = numBytes; + + return Tcl_GetNumberFromObj(interp, objPtr, clientDataPtr, typePtr); +} /* *---------------------------------------------------------------------- |