summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--generic/tclBasic.c4
-rw-r--r--generic/tclCompCmdsSZ.c3
-rw-r--r--generic/tclCompile.c6
-rw-r--r--generic/tclObj.c2
-rw-r--r--generic/tclParse.c4
-rw-r--r--generic/tclUtil.c31
7 files changed, 33 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index f297f9e..02ba909 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2011-03-06 Don Porter <dgp@users.sourceforge.net>
+ * generic/tclBasic.c: More replacements of Tcl_UtfBackslash() calls
+ * generic/tclCompile.c: with TclParseBackslash() where possible.
+ * generic/tclCompCmdsSZ.c:
+ * generic/tclParse.c:
+ * generic/tclUtil.c:
+
* generic/tclUtil.c (TclFindElement): Guard escape sequence scans
to not overrun the string end. [Bug 3192636]
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index b07a55d..5100dd9 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -4907,7 +4907,7 @@ TclEvalEx(
int line, /* The line the script starts on. */
int *clNextOuter, /* Information about an outer context for */
const char *outerScript) /* continuation line data. This is set only in
- * EvalTokensStandard(), to properly handle
+ * TclSubstTokens(), to properly handle
* [...]-nested commands. The 'outerScript'
* refers to the most-outer script containing
* the embedded command, which is refered to
@@ -5413,7 +5413,7 @@ TclAdvanceContinuations(
/*
* Track the invisible continuation lines embedded in a script, if any.
* Here they are just spaces (already). They were removed by
- * EvalTokensStandard via Tcl_UtfBackslash.
+ * TclSubstTokens via TclParseBackslash.
*
* *clNextPtrPtr <=> We have continuation lines to track.
* **clNextPtrPtr >= 0 <=> We are not beyond the last possible location.
diff --git a/generic/tclCompCmdsSZ.c b/generic/tclCompCmdsSZ.c
index d0f9764..7398579 100644
--- a/generic/tclCompCmdsSZ.c
+++ b/generic/tclCompCmdsSZ.c
@@ -688,7 +688,8 @@ TclSubstCompile(
count++;
continue;
case TCL_TOKEN_BS:
- length = Tcl_UtfBackslash(tokenPtr->start, NULL, buf);
+ length = TclParseBackslash(tokenPtr->start, tokenPtr->size,
+ NULL, buf);
literal = TclRegisterNewLiteral(envPtr, buf, length);
TclEmitPush(literal, envPtr);
count++;
diff --git a/generic/tclCompile.c b/generic/tclCompile.c
index 8005034..9dcafb4 100644
--- a/generic/tclCompile.c
+++ b/generic/tclCompile.c
@@ -1393,7 +1393,8 @@ TclWordKnownAtCompileTime(
case TCL_TOKEN_BS:
if (tempPtr != NULL) {
char utfBuf[TCL_UTF_MAX];
- int length = Tcl_UtfBackslash(tokenPtr->start, NULL, utfBuf);
+ int length = TclParseBackslash(tokenPtr->start,
+ tokenPtr->size, NULL, utfBuf);
Tcl_AppendToObj(tempPtr, utfBuf, length);
}
@@ -2031,7 +2032,8 @@ TclCompileTokens(
break;
case TCL_TOKEN_BS:
- length = Tcl_UtfBackslash(tokenPtr->start, NULL, buffer);
+ length = TclParseBackslash(tokenPtr->start, tokenPtr->size,
+ NULL, buffer);
Tcl_DStringAppend(&textBuffer, buffer, length);
/*
diff --git a/generic/tclObj.c b/generic/tclObj.c
index 4742f9d..ad48ad1 100644
--- a/generic/tclObj.c
+++ b/generic/tclObj.c
@@ -79,7 +79,7 @@ typedef struct ObjData {
typedef struct ThreadSpecificData {
Tcl_HashTable *lineCLPtr; /* This table remembers for each Tcl_Obj
* generated by a call to the function
- * EvalTokensStandard() from a literal text
+ * TclSubstTokens() from a literal text
* where bs+nl sequences occured in it, if
* any. I.e. this table keeps track of
* invisible and stripped continuation lines.
diff --git a/generic/tclParse.c b/generic/tclParse.c
index 149644d..705a141 100644
--- a/generic/tclParse.c
+++ b/generic/tclParse.c
@@ -2172,8 +2172,8 @@ TclSubstTokens(
break;
case TCL_TOKEN_BS:
- appendByteLength = Tcl_UtfBackslash(tokenPtr->start, NULL,
- utfCharBytes);
+ appendByteLength = TclParseBackslash(tokenPtr->start,
+ tokenPtr->size, NULL, utfCharBytes);
append = utfCharBytes;
/*
diff --git a/generic/tclUtil.c b/generic/tclUtil.c
index 3fd6271..7161fdd 100644
--- a/generic/tclUtil.c
+++ b/generic/tclUtil.c
@@ -326,14 +326,13 @@ TclFindElement(
*
* TclCopyAndCollapse --
*
- * Copy a string and eliminate any backslashes that aren't in braces.
+ * Copy a string and substitute all backslash escape sequences
*
* Results:
- * Count characters get copied from src to dst. Along the way, if
- * backslash sequences are found outside braces, the backslashes are
- * eliminated in the copy. After scanning count chars from source, a null
- * character is placed at the end of dst. Returns the number of
- * characters that got copied.
+ * Count bytes get copied from src to dst. Along the way, backslash
+ * sequences are substituted in the copy. After scanning count bytes
+ * from src, a null character is placed at the end of dst. Returns
+ * the number of bytes that got written to dst.
*
* Side effects:
* None.
@@ -343,26 +342,28 @@ TclFindElement(
int
TclCopyAndCollapse(
- int count, /* Number of characters to copy from src. */
+ int count, /* Number of byte to copy from src. */
const char *src, /* Copy from here... */
char *dst) /* ... to here. */
{
- register char c;
- int numRead;
int newCount = 0;
- int backslashCount;
- for (c = *src; count > 0; src++, c = *src, count--) {
+ while (count > 0) {
+ char c = *src;
if (c == '\\') {
- backslashCount = Tcl_UtfBackslash(src, &numRead, dst);
+ int numRead;
+ int backslashCount = TclParseBackslash(src, count, &numRead, dst);
+
dst += backslashCount;
newCount += backslashCount;
- src += numRead-1;
- count -= numRead-1;
+ src += numRead;
+ count -= numRead;
} else {
*dst = c;
dst++;
newCount++;
+ src++;
+ count--;
}
}
*dst = 0;
@@ -742,7 +743,7 @@ Tcl_ScanCountedElement(
} else {
int size;
- Tcl_UtfBackslash(p, &size, NULL);
+ TclParseBackslash(p, lastChar - p, &size, NULL);
p += size-1;
flags |= USE_BRACES;
}