summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2016-11-01 15:42:50 (GMT)
committerdgp <dgp@users.sourceforge.net>2016-11-01 15:42:50 (GMT)
commitcdc8b6080c2a2f05f3f66adfa3184405f04dc003 (patch)
tree52b0d7cb7390f6382be877a794f749ee0ad61a7b
parent418ded1bc9df7ae0976ce3793aa0190c93609332 (diff)
downloadtcl-cdc8b6080c2a2f05f3f66adfa3184405f04dc003.zip
tcl-cdc8b6080c2a2f05f3f66adfa3184405f04dc003.tar.gz
tcl-cdc8b6080c2a2f05f3f66adfa3184405f04dc003.tar.bz2
Replace indexing with pointer increments.dgp_string_cat
-rw-r--r--generic/tclStringObj.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c
index 05dcba4..7fd7cc1 100644
--- a/generic/tclStringObj.c
+++ b/generic/tclStringObj.c
@@ -2635,8 +2635,8 @@ TclStringCatObjv(
Tcl_Obj * const objv[],
Tcl_Obj **objPtrPtr)
{
- Tcl_Obj *objResultPtr;
- int i, length = 0, binary = 1, first = 0;
+ Tcl_Obj *objPtr, *objResultPtr, * const *ov;
+ int oc, length = 0, binary = 1, first = 0;
int allowUniChar = 1, requestUniChar = 0;
/* assert (objc >= 2) */
@@ -2648,8 +2648,9 @@ TclStringCatObjv(
* Error on overflow.
*/
- for (i = 0; i < objc && (binary || allowUniChar); i++) {
- Tcl_Obj *objPtr = objv[i];
+ ov = objv, oc = objc;
+ while (oc-- && (binary || allowUniChar)) {
+ objPtr = *ov++;
if (objPtr->bytes) {
/* Value has a string rep. */
@@ -2683,43 +2684,47 @@ TclStringCatObjv(
if (binary) {
/* Result will be pure byte array. Pre-size it */
- for (i = 0; i < objc && length >= 0; i++) {
- Tcl_Obj *objPtr = objv[i];
+ ov = objv; oc = objc;
+ while (oc-- && (length >= 0)) {
+ objPtr = *ov++;
if (objPtr->bytes == NULL) {
int numBytes;
Tcl_GetByteArrayFromObj(objPtr, &numBytes);
if (length == 0) {
- first = i;
+ first = objc - oc - 1;
}
length += numBytes;
}
}
} else if (allowUniChar && requestUniChar) {
/* Result will be pure Tcl_UniChar array. Pre-size it. */
- for (i = 0; i < objc && length >= 0; i++) {
- Tcl_Obj *objPtr = objv[i];
+ ov = objv; oc = objc;
+ while (oc-- && (length >= 0)) {
+ objPtr = *ov++;
if ((objPtr->bytes == NULL) || (objPtr->length)) {
int numChars;
Tcl_GetUnicodeFromObj(objPtr, &numChars);
if (length == 0) {
- first = i;
+ first = objc - oc - 1;
}
length += numChars;
}
}
} else {
/* Result will be concat of string reps. Pre-size it. */
- for (i = 0; i < objc && length >= 0; i++) {
- Tcl_Obj *objPtr = objv[i];
+ ov = objv; oc = objc;
+ while (oc-- && (length >= 0)) {
int numBytes;
+ objPtr = *ov++;
+
Tcl_GetStringFromObj(objPtr, &numBytes);
if ((length == 0) && numBytes) {
- first = i;
+ first = objc - oc - 1;
}
length += numBytes;
}