[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#794: Artist: patch 2 (of 2): Fix for args-out-of-range error

From: Tomas Abrahamsson
Subject: bug#794: Artist: patch 2 (of 2): Fix for args-out-of-range error
Date: Wed, 27 Aug 2008 14:49:56 +0200
User-agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (usg-unix-v)


        This is the second of two patches for
emacs/lisp/textmodes/artist.el.  The patches do not depend on
each other.  They fix different bugs, but they apply to the
same file.

The patch is against 1.40 of artist.el as checked out from

The patch is written entirely by me. The bug was found by
Rubén Berenguel <address@hidden> and reported in a private
mail to me.  As far as I know, the bug has not been reported
anywhere else.

The bug that this patch fixes is: With e.g. the spray-can
mode, using characters whose internal representation
was >= 256 caused an args-out-of-range error. This is now fixed.

Below is a ChangeLog entry and the patch itself.

If anythning is unclear or needs more work, please contact me.


The ChangeLog entry:

2008-08-27  Tomas Abrahamsson  <address@hidden>

        * textmodes/artist.el (artist-mode-init): Added comment on the
        setting up of the `artist-replacement-table' array.
        (artist-get-replacement-char): New.
        (artist-get-char-at-xy-conv, artist-replace-char)
        (artist-replace-chars, artist-replace-string): Use it instead of
        accessing `artist-replacement-table' directly.
        Reported by Rubén Berenguel <address@hidden>.

The patch:

Index: artist.el
RCS file: /sources/emacs/emacs/lisp/textmodes/artist.el,v
retrieving revision 1.40
diff -u -r1.40 artist.el
--- artist.el   12 Jun 2008 03:56:20 -0000      1.40
+++ artist.el   26 Aug 2008 23:34:09 -0000
@@ -1375,6 +1375,9 @@
 ;; Init and exit
 (defun artist-mode-init ()
   "Init Artist mode.  This will call the hook `artist-mode-init-hook'."
+  ;; Set up a conversion table for mapping tabs and new-lines to spaces.
+  ;; the last case, 0, is for the last position in buffer/region, where
+  ;; the `following-char' function returns 0.
   (let ((i 0))
     (while (< i 256)
       (aset artist-replacement-table i i)
@@ -1382,6 +1385,7 @@
   (aset artist-replacement-table ?\n ?\s)
   (aset artist-replacement-table ?\t ?\s)
   (aset artist-replacement-table 0 ?\s)
+  ;; More setup
   (make-local-variable 'artist-key-is-drawing)
   (make-local-variable 'artist-key-endpoint1)
   (make-local-variable 'artist-key-poly-point-list)
@@ -1944,10 +1948,21 @@
+(defsubst artist-get-replacement-char (c)
+  "Retrieve a replacement for character C from `artist-replacement-table'.
+The replacement is used to convert tabs and new-lines to spaces."
+  ;; Characters may be outside the range of the `artist-replacement-table',
+  ;; for example if they are unicode code points >= 256.
+  ;; Check so we don't attempt to access the array out of its bounds,
+  ;; assuming no such character needs to be replaced.
+  (if (< c (length artist-replacement-table))
+      (aref artist-replacement-table c)
+    c))
 (defun artist-get-char-at-xy-conv (x y)
   "Retrieve the character at X, Y, converting tabs and new-lines to spaces."
-    (aref artist-replacement-table (artist-get-char-at-xy x y))))
+    (artist-get-replacement-char (artist-get-char-at-xy x y))))
 (defun artist-replace-char (new-char)
@@ -1963,12 +1978,12 @@
        (artist-move-to-xy (1+ (artist-current-column))
        (delete-char -1)
-       (insert (aref artist-replacement-table new-char)))
+       (insert (artist-get-replacement-char new-char)))
     ;; In emacs-19, the self-insert-command works better and faster
     (let ((overwrite-mode 'overwrite-mode-textual)
          (fill-column 32765)           ; Large :-)
          (blink-matching-paren nil))
-      (setq last-command-event (aref artist-replacement-table new-char))
+      (setq last-command-event (artist-get-replacement-char new-char))
       (self-insert-command 1))))
 (defun artist-replace-chars (new-char count)
@@ -1980,7 +1995,7 @@
       ;; The self-insert-command doesn't care about the overwrite-mode,
       ;; so the insertion is done in the same way as in picture mode.
       ;; This seems to be a little bit slower.
-      (let* ((replaced-c (aref artist-replacement-table new-char))
+      (let* ((replaced-c (artist-get-replacement-char new-char))
             (replaced-s (make-string count replaced-c)))
        (artist-move-to-xy (+ (artist-current-column) count)
@@ -1990,7 +2005,7 @@
     (let ((overwrite-mode 'overwrite-mode-textual)
          (fill-column 32765)           ; Large :-)
          (blink-matching-paren nil))
-      (setq last-command-event (aref artist-replacement-table new-char))
+      (setq last-command-event (artist-get-replacement-char new-char))
       (self-insert-command count))))
 (defsubst artist-replace-string (string &optional see-thru)
@@ -2003,7 +2018,7 @@
        (blink-matching-paren nil))
     (while char-list
       (let ((c (car char-list)))
-       (if (and see-thru (= (aref artist-replacement-table c) ?\s))
+       (if (and see-thru (= (artist-get-replacement-char c) ?\s))
            (artist-move-to-xy (1+ (artist-current-column))
          (artist-replace-char c)))

reply via email to

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