[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) |
Hi,
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
:pserver:anonymous@cvs.savannah.gnu.org:/sources/emacs
The patch is written entirely by me. The bug was found by
Rubén Berenguel <ruben@maia.ub.es> 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.
BRs
Tomas
The ChangeLog entry:
2008-08-27 Tomas Abrahamsson <tab@lysator.liu.se>
* 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 <ruben@maia.ub.es>.
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 @@
(following-char))
+(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."
(save-excursion
- (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))
(artist-current-line))
(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)
(artist-current-line))
@@ -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-current-line))
(artist-replace-char c)))
- bug#794: Artist: patch 2 (of 2): Fix for args-out-of-range error,
Tomas Abrahamsson <=