summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvincentdarley <vincentdarley>2003-10-14 18:23:31 (GMT)
committervincentdarley <vincentdarley>2003-10-14 18:23:31 (GMT)
commitdd08d357ebf5c18a2de038e6600bc9a1f6436be5 (patch)
treecc1475b28f0953253a92d4e9d00491b37ef39888
parentb7c8b125de1f42a74d05bd5882afc2da0a88604a (diff)
downloadtcl-dd08d357ebf5c18a2de038e6600bc9a1f6436be5.zip
tcl-dd08d357ebf5c18a2de038e6600bc9a1f6436be5.tar.gz
tcl-dd08d357ebf5c18a2de038e6600bc9a1f6436be5.tar.bz2
regsub fix
-rw-r--r--ChangeLog6
-rw-r--r--generic/tclCmdMZ.c15
-rw-r--r--tests/regexp.test15
3 files changed, 33 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index b1e170d..15619a3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2003-10-14 Vince Darley <vincentdarley@users.sourceforge.net>
+
+ * generic/tclCmdMZ.c:
+ * tests/regexp.test: fix to [Bug 823524] in regsub; added three
+ new tests.
+
2003-10-14 Don Porter <dgp@users.sourceforge.net>
* generic/tclBasic.c (TclAppendObjToErrorInfo): New internal routine
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index 463e0c5..2a78838 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -14,7 +14,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclCmdMZ.c,v 1.95 2003/10/14 15:44:52 dgp Exp $
+ * RCS: @(#) $Id: tclCmdMZ.c,v 1.96 2003/10/14 18:23:39 vincentdarley Exp $
*/
#include "tclInt.h"
@@ -627,7 +627,7 @@ Tcl_RegsubObjCmd(dummy, interp, objc, objv)
match = Tcl_RegExpExecObj(interp, regExpr, objPtr, offset,
10 /* matches */, ((offset > 0 &&
- (Tcl_GetUniChar(objPtr,offset-1) != (Tcl_UniChar)'\n'))
+ (wstring[offset-1] != (Tcl_UniChar)'\n'))
? TCL_REG_NOTBOL : 0));
if (match < 0) {
@@ -722,6 +722,17 @@ Tcl_RegsubObjCmd(dummy, interp, objc, objv)
offset++;
} else {
offset += end;
+ if (start == end) {
+ /*
+ * We matched an empty string, which means we must go
+ * forward one more step so we don't match again at the
+ * same spot.
+ */
+ if (offset < wlen) {
+ Tcl_AppendUnicodeToObj(resultPtr, wstring + offset, 1);
+ }
+ offset++;
+ }
}
if (!all) {
break;
diff --git a/tests/regexp.test b/tests/regexp.test
index 86ee8c8..fe4221b 100644
--- a/tests/regexp.test
+++ b/tests/regexp.test
@@ -11,7 +11,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: regexp.test,v 1.24 2003/10/07 04:48:38 dgp Exp $
+# RCS: @(#) $Id: regexp.test,v 1.25 2003/10/14 18:23:31 vincentdarley Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest 2
@@ -616,6 +616,19 @@ test regexp-21.10 {multiple matches handle newlines} {
regsub -all -lineanchor -- {^#[^\n]*\n} "#one\n#two\n#three\n" foo\n
} "foo\nfoo\nfoo\n"
+test regexp-21.11 {multiple matches handle newlines} {
+ regsub -all -line -- ^ "a\nb\nc" \#
+} "\#a\n\#b\n\#c"
+
+test regexp-21.12 {multiple matches handle newlines} {
+ regsub -all -line -- ^ "\n\n" \#
+} "\#\n\#\n\#"
+
+test regexp-21.13 {multiple matches handle newlines} {
+ regexp -all -inline -indices -line -- ^ "a\nb\nc"
+} {{0 -1} {2 1} {4 3}}
+
+
# cleanup
::tcltest::cleanupTests
return