bug-gnu-emacs
[Top][All Lists]
Advanced

[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
address@hidden>=<;:9876543210/.-,+*)('&%$#"!
flop-string is  !"#$%&'()*+,-./0123456789:;<=>address@hidden
[\]^_`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]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]