diff options
author | dgp <dgp@users.sourceforge.net> | 2020-04-14 16:30:11 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2020-04-14 16:30:11 (GMT) |
commit | e4c15393cc40c5fa6f39c6b453402be80c928f93 (patch) | |
tree | 60d3076a9e898770ed665cdf6adead6c8ecc3c65 /generic/tclTest.c | |
parent | 605adef3f657935661b6a6ef51d093af12222984 (diff) | |
parent | f5916c3bbed2e6f24f6375209f5ab64a35d10d1d (diff) | |
download | tcl-e4c15393cc40c5fa6f39c6b453402be80c928f93.zip tcl-e4c15393cc40c5fa6f39c6b453402be80c928f93.tar.gz tcl-e4c15393cc40c5fa6f39c6b453402be80c928f93.tar.bz2 |
merge 8.7
Diffstat (limited to 'generic/tclTest.c')
-rw-r--r-- | generic/tclTest.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/generic/tclTest.c b/generic/tclTest.c index f077834..2261a02 100644 --- a/generic/tclTest.c +++ b/generic/tclTest.c @@ -316,6 +316,7 @@ static Tcl_FSListVolumesProc SimpleListVolumes; static Tcl_FSPathInFilesystemProc SimplePathInFilesystem; static Tcl_Obj * SimpleRedirect(Tcl_Obj *pathPtr); static Tcl_FSMatchInDirectoryProc SimpleMatchInDirectory; +static Tcl_ObjCmdProc TestUtfPrevCmd; static Tcl_ObjCmdProc TestNumUtfCharsCmd; static Tcl_ObjCmdProc TestFindFirstCmd; static Tcl_ObjCmdProc TestFindLastCmd; @@ -577,6 +578,8 @@ Tcltest_Init( NULL, NULL); Tcl_CreateObjCommand(interp, "testsetobjerrorcode", TestsetobjerrorcodeCmd, NULL, NULL); + Tcl_CreateObjCommand(interp, "testutfprev", + TestUtfPrevCmd, (ClientData) 0, NULL); Tcl_CreateObjCommand(interp, "testnumutfchars", TestNumUtfCharsCmd, NULL, NULL); Tcl_CreateObjCommand(interp, "testfindfirst", @@ -6808,6 +6811,55 @@ SimpleListVolumes(void) } /* + * Used to check operations of Tcl_UtfPrev. + * + * Usage: testutfprev $bytes $offset + */ + +static int +TestUtfPrevCmd( + TCL_UNUSED(void *), + Tcl_Interp *interp, + int objc, + Tcl_Obj *const objv[]) +{ + int numBytes, offset; + char *bytes; + const char *result; + Tcl_Obj *copy; + + if (objc < 2 || objc > 3) { + Tcl_WrongNumArgs(interp, 1, objv, "bytes ?offset?"); + return TCL_ERROR; + } + + bytes = (char *) Tcl_GetByteArrayFromObj(objv[1], &numBytes); + + if (objc == 3) { + if (TCL_OK != Tcl_GetIntFromObj(interp, objv[2], &offset)) { + return TCL_ERROR; + } + if (offset < 0) { + offset = 0; + } + if (offset > numBytes) { + offset = numBytes; + } + } else { + offset = numBytes; + } + copy = Tcl_DuplicateObj(objv[1]); + bytes = (char *) Tcl_SetByteArrayLength(copy, numBytes+1); + bytes[numBytes] = '\0'; + + result = Tcl_UtfPrev(bytes + offset, bytes); + + Tcl_DecrRefCount(copy); + Tcl_SetObjResult(interp, Tcl_NewIntObj(result - bytes)); + return TCL_OK; +} + +/* * Used to check correct string-length determining in Tcl_NumUtfChars */ |