summaryrefslogtreecommitdiffstats
path: root/tcsh-6.14.00-wide-seeks.patch
diff options
context:
space:
mode:
authorMiloslav Trmac <mitr@fedoraproject.org>2006-07-10 20:52:23 +0000
committerMiloslav Trmac <mitr@fedoraproject.org>2006-07-10 20:52:23 +0000
commitc58467173adf712465f7912d4112b642750b6ca5 (patch)
treee86e1c3edaf147a7afa0446a9c8963e8b1486c9b /tcsh-6.14.00-wide-seeks.patch
parentbed8c67a167414670a54d4e95d9edc8a194a7c41 (diff)
downloadtcsh-rebase-6.19.00-c58467173adf712465f7912d4112b642750b6ca5.tar.gz
tcsh-rebase-6.19.00-c58467173adf712465f7912d4112b642750b6ca5.tar.xz
tcsh-rebase-6.19.00-c58467173adf712465f7912d4112b642750b6ca5.zip
- Fix seeking over multibyte characters (#195972)
- Don't ship obsolete eight-bit.txt
Diffstat (limited to 'tcsh-6.14.00-wide-seeks.patch')
-rw-r--r--tcsh-6.14.00-wide-seeks.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/tcsh-6.14.00-wide-seeks.patch b/tcsh-6.14.00-wide-seeks.patch
new file mode 100644
index 0000000..53c22a0
--- /dev/null
+++ b/tcsh-6.14.00-wide-seeks.patch
@@ -0,0 +1,66 @@
+--- tcsh/sh.h 2005-03-25 19:46:41.000000000 +0100
++++ tcsh-6.14.00/sh.h 2006-07-03 03:45:30.000000000 +0200
+@@ -801,6 +801,13 @@
+ * exactly one if the input is seekable and tell is available.
+ * In other cases, the shell buffers enough blocks to keep all loops
+ * in the buffer.
++ *
++ * If (WIDE_STRINGS && cantell), fbobp is always a byte offset, but
++ * (fseekp - fbobp) and (feobp - fbobp) are character offsets (usable for
++ * fbuf indexing).
++ *
++ * If (!cantell), all offsets are character offsets; if (!WIDE_STRINGS), there
++ * is no difference between byte and character offsets.
+ */
+ EXTERN struct Bin {
+ off_t Bfseekp; /* Seek pointer, generally != lseek() value */
+@@ -824,7 +831,7 @@
+ #define TCSH_F_SEEK 2 /* File seek */
+ #define TCSH_E_SEEK 3 /* Eval seek */
+ union {
+- off_t _f_seek;
++ off_t _f_seek; /* A byte offset if (cantell) */
+ Char* _c_seek;
+ } fc;
+ #define f_seek fc._f_seek
+diff -u tcsh-6.14.00/sh.lex.c tcsh-6.14.00/sh.lex.c
+--- tcsh-6.14.00/sh.lex.c 2006-07-03 03:46:11.000000000 +0200
++++ tcsh-6.14.00/sh.lex.c 2006-07-05 16:31:51.000000000 +0200
+@@ -1736,7 +1736,9 @@
+ memmove(cbuf, cbuf + i, partial - i);
+ partial -= i;
+ } while (partial != 0 && nchars != 0);
+- /* Throwing away possible partial multibyte characters on error */
++ /* Throwing away possible partial multibyte characters on error if the
++ stream is not seekable */
++ lseek(fildes, -(off_t)partial, L_INCR);
+ return res != 0 ? res : r;
+ }
+
+@@ -1753,7 +1755,13 @@
+ (void) lseek(SHIN, fseekp, L_SET);
+ }
+ if (fseekp == feobp) {
+- fbobp = feobp;
++ off_t bytes;
++ size_t i;
++
++ bytes = fbobp;
++ for (i = 0; i < (size_t)(feobp - fbobp); i++)
++ bytes += fclens[i];
++ fbobp = fseekp = feobp = bytes;
+ do
+ c = wide_read(SHIN, fbuf[0], BUFSIZE, 1);
+ while (c < 0 && errno == EINTR);
+@@ -1926,9 +1934,9 @@
+ return;
+ case TCSH_F_SEEK:
+ #ifdef WIDE_STRINGS
+- if (cantell && fseekp >= fbobp && fseekp < feobp) {
++ if (cantell && fseekp >= fbobp && fseekp <= feobp) {
+ size_t i;
+-
++
+ l->f_seek = fbobp;
+ for (i = 0; i < fseekp - fbobp; i++)
+ l->f_seek += fclens[i];