summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
Diffstat (limited to 'generic')
-rw-r--r--generic/tclCmdMZ.c20
-rw-r--r--generic/tclExecute.c26
-rw-r--r--generic/tclStringObj.c7
3 files changed, 37 insertions, 16 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index bf75d44..34fd6bf 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -394,14 +394,10 @@ Tcl_RegexpObjCmd(
newPtr = Tcl_NewListObj(2, objs);
} else {
- if (i <= info.nsubs) {
- if (info.matches[i].end <= 0) {
- TclNewObj(newPtr);
- } else {
- newPtr = Tcl_GetRange(objPtr,
- offset + info.matches[i].start,
- offset + info.matches[i].end - 1);
- }
+ if ((i <= info.nsubs) && (info.matches[i].end > 0)) {
+ newPtr = Tcl_GetRange(objPtr,
+ offset + info.matches[i].start,
+ offset + info.matches[i].end - 1);
} else {
TclNewObj(newPtr);
}
@@ -2187,7 +2183,13 @@ StringRangeCmd(
return TCL_ERROR;
}
- if (last >= 0) {
+ if (first < 0) {
+ first = 0;
+ }
+ if (last >= length) {
+ last = length;
+ }
+ if (last >= first) {
Tcl_SetObjResult(interp, Tcl_GetRange(objv[1], first, last));
}
return TCL_OK;
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index a3b0401..e5a6b71 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -5609,10 +5609,16 @@ TEBCresume(
goto gotError;
}
- if (toIdx < 0) {
- TclNewObj(objResultPtr);
- } else {
+ if (fromIdx < 0) {
+ fromIdx = 0;
+ }
+ if (toIdx >= length) {
+ toIdx = length;
+ }
+ if (toIdx >= fromIdx) {
objResultPtr = Tcl_GetRange(OBJ_AT_DEPTH(2), fromIdx, toIdx);
+ } else {
+ TclNewObj(objResultPtr);
}
TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr)));
NEXT_INST_V(1, 3, 1);
@@ -5646,6 +5652,13 @@ TEBCresume(
}
toIdx = TclIndexDecode(toIdx, length - 1);
+ if (toIdx < 0) {
+ goto emptyRange;
+ } else if (toIdx >= length) {
+ toIdx = length - 1;
+ }
+
+ assert ( toIdx >= 0 && toIdx < length );
/*
assert ( fromIdx != TCL_INDEX_BEFORE );
@@ -5659,8 +5672,13 @@ TEBCresume(
if (fromIdx == TCL_INDEX_AFTER) {
goto emptyRange;
}
+
fromIdx = TclIndexDecode(fromIdx, length - 1);
- if (toIdx >= 0) {
+ if (fromIdx < 0) {
+ fromIdx = 0;
+ }
+
+ if (fromIdx <= toIdx) {
objResultPtr = Tcl_GetRange(valuePtr, fromIdx, toIdx);
} else {
emptyRange:
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index b4f05dd..9e0e4af 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -819,6 +819,7 @@ Tcl_GetRange(
FillUnicodeRep(objPtr);
stringPtr = GET_STRING(objPtr);
}
+
if (last < 0 || last >= stringPtr->numChars) {
last = stringPtr->numChars - 1;
}
@@ -829,12 +830,12 @@ Tcl_GetRange(
#if TCL_UTF_MAX == 4
/* See: bug [11ae2be95dac9417] */
if ((first > 0) && ((stringPtr->unicode[first] & 0xFC00) == 0xDC00)
- && ((stringPtr->unicode[first-1] & 0xFC00) == 0xD800)) {
+ && ((stringPtr->unicode[first-1] & 0xFC00) == 0xD800)) {
++first;
}
if ((last + 1 < stringPtr->numChars)
- && ((stringPtr->unicode[last+1] & 0xFC00) == 0xDC00)
- && ((stringPtr->unicode[last] & 0xFC00) == 0xD800)) {
+ && ((stringPtr->unicode[last+1] & 0xFC00) == 0xDC00)
+ && ((stringPtr->unicode[last] & 0xFC00) == 0xD800)) {
++last;
}
#endif