[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
translate-region occasionally misses chars?
From: |
Peck, Jeff |
Subject: |
translate-region occasionally misses chars? |
Date: |
Thu, 2 May 2002 22:51:11 -0400 |
Running ntemacs 20.7 on Win2K, and with 21.2 the problem continues.
Using translate-region, occasionally and intermittantly
a character will *not* be translated.
Attached is a function that demonstrates the problem.
Starting from some buffer (I used Help-apropos "file" for my test)
The routine copies buf1 to another buffer (buf2),
and then applies translate-region to that buffer.
The particular translation swaps each printing char with
another, Z<=>E, Y<=>F, etc. so applying it twice should return
the original buffer.
But occasionally, as demonstrated by the output below,
a single character will fail to be translated.
[can't tell if it fails on pass1 or pass2, but it doesn't matter]
Of course, it may not be translate-region's fault,
I have other experience, not so reproducible, where a char
in a file just appears to read in wrong! [that is, the buffer
shows --nomodification-- but it there is a character that
does not agree with the file].
If anyone knows what is happening, my eternal thanks.
In the meantime, my use of translate-region is wrapped
in a loop that compares the before to the double application
and keeps trying until they are the same... bletch.
It fails on both my Win2k machines, I don't a have a unix/linux to test.
If someone can confirm this on other OS, that would be a comfort.
It is intermittant, to you may need to try it a couple times.
Sometimes it fails immediately and frequently, other times it takes longer.
I have not found a correlation with OS activity, paging, filesystem or
whatever.
;;; this routine applies translate-region and logs the errors to *Messages*
;;; print flip-string and flop-string for a convenient translation table
;;; to see that the erroneous chars really are 'missed translations' and
;;; not some random bit loss. (flop-string has no other purpose)
(defun test-flip (n &optional i)
(message "flip %d chars, %d times" (- (point-max)(point-min)) n)
(sit-for 1)
(setq i n)
(let ((flip-string ; reverse chars and nums:
(do ((str "") (i 0 (1+ i))) ((> i 255) str)
(let ((chr (char-to-string
(if (or (<= i 32) (>= i 127)) i (- 159 i)))))
(setq str (concat str chr)))))
(flop-string
(do ((str "") (i 0 (1+ i))) ((> i 255) str)
(let ((chr (char-to-string
(if (or (<= i 32) (>= i 127)) i i))))
(setq str (concat str chr)))))
(buf1 (current-buffer))
(buf2 (get-buffer-create "*flip*")))
(message "flip-string is %s" (substring flip-string 32 127))
(message "flop-string is %s" (substring flop-string 32 127))
;; copy buf1 to buf2
(set-buffer buf2)
(erase-buffer)
(insert-buffer buf1)
(while (plusp n)
(progn
(setq n (- n 1))
(translate-region (point-min) (point-max) flip-string)
(translate-region (point-min) (point-max) flip-string)
(let ((comp (abs (compare-buffer-substrings buf1 4 (- (point-max) 4)
buf2 4 (- (point-max)
4)))))
(if (not (zerop comp))
(let ((str1 (save-excursion
(set-buffer buf1)
(buffer-substring comp (+ comp 7))))
(str2 (buffer-substring comp (+ comp 7))))
(message "%d. error at %d: [%s] [%s]" (- i n) comp str1
str2)
(sit-for 1)
(erase-buffer)
(insert-buffer buf1)
)))))))
Here is output from one run against *Apropos*
flip 12089 chars, 50 times
flip-string is ~}|{zyxwvutsrqponmlkjihgfedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFE
DCBA@?>=<;:9876543210/.-,+*)('&%$#"!
flop-string is !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ
[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Mark set
43. error at 1168: [oint.
c] [oin+.
c]
44. error at 144: [tation.] [tat6on.]
45. error at 579: [-x appe] [-x >ppe]
46. error at 1623: [ one.
c] [ on:.
c]
47. error at 2072: [ subdir] [ su=dir]
48. error at 2301: [ FILE-B] [ FISE-B]
49. error at 216: [me RET
] [me MET
]
50. error at 372: [additio] [add6tio]
- translate-region occasionally misses chars?,
Peck, Jeff <=