summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgp@users.sourceforge.net <dgp>2014-03-11 03:38:55 (GMT)
committerdgp@users.sourceforge.net <dgp>2014-03-11 03:38:55 (GMT)
commit0b115ab7f5bc2a1afb462833a43a55ce13f557b2 (patch)
tree68b0ba7e1239b62a199f35a0035f41ee9d1099a4
parent178e3f2dd9f0a4f130eedc8844f7203898cabe64 (diff)
downloadtcl-0b115ab7f5bc2a1afb462833a43a55ce13f557b2.zip
tcl-0b115ab7f5bc2a1afb462833a43a55ce13f557b2.tar.gz
tcl-0b115ab7f5bc2a1afb462833a43a55ce13f557b2.tar.bz2
Trial rewrite of AUTO input translation.
-rw-r--r--generic/tclIO.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/generic/tclIO.c b/generic/tclIO.c
index 6194637..8d8e30f 100644
--- a/generic/tclIO.c
+++ b/generic/tclIO.c
@@ -5680,6 +5680,40 @@ TranslateInputEOL(
break;
}
case TCL_TRANSLATE_AUTO: {
+#if 1
+ const char *crFound, *src = srcStart;
+ char *dst = dstStart;
+ int lesser;
+
+ if ((statePtr->flags & INPUT_SAW_CR) && srcLen) {
+ if (*src == '\n') {
+ src++;
+ srcLen--;
+ }
+ ResetFlag(statePtr, INPUT_SAW_CR);
+ }
+ lesser = (dstLen < srcLen) ? dstLen : srcLen;
+ while ((crFound = memchr(src, '\r', lesser))) {
+ int numBytes = crFound - src;
+ memmove(dst, src, numBytes);
+
+ dst[numBytes] = '\n';
+ dst += numBytes + 1;
+ dstLen -= numBytes + 1;
+ src += numBytes + 1;
+ srcLen -= numBytes + 1;
+ if (srcLen == 0) {
+ SetFlag(statePtr, INPUT_SAW_CR);
+ } else if (*src == '\n') {
+ src++;
+ srcLen--;
+ }
+ lesser = (dstLen < srcLen) ? dstLen : srcLen;
+ }
+ memmove(dst, src, lesser);
+ srcLen = src + lesser - srcStart;
+ dstLen = dst + lesser - dstStart;
+#else
const char *srcEnd = srcStart + srcLen;
const char *dstEnd = dstStart + dstLen;
const char *src = srcStart;
@@ -5706,6 +5740,7 @@ TranslateInputEOL(
}
srcLen = src - srcStart;
dstLen = dst - dstStart;
+#endif
break;
}
default: