all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: Tomas Abrahamsson <tab@lysator.liu.se>
To: bug-gnu-emacs@gnu.org
Subject: bug#794: Artist: patch 2 (of 2): Fix for args-out-of-range error
Date: Wed, 27 Aug 2008 14:49:56 +0200	[thread overview]
Message-ID: <uqprnuzkp7.fsf@sellafield.lysator.liu.se> (raw)


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)))







         reply	other threads:[~2008-08-27 12:49 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <87y72iz7v8.fsf@cyd.mit.edu>
2008-08-27 12:49 ` bug#795: Artist: patch 1 (of 2): Cut/copy menu selection bugfix Tomas Abrahamsson
2008-08-27 17:30   ` bug#795: marked as done (Artist: patch 1 (of 2): Cut/copy menu selection bugfix) Emacs bug Tracking System
2008-08-27 12:49 ` Tomas Abrahamsson [this message]
2008-08-27 17:30   ` bug#794: marked as done (Artist: patch 2 (of 2): Fix for args-out-of-range error) Emacs bug Tracking System

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=uqprnuzkp7.fsf@sellafield.lysator.liu.se \
    --to=tab@lysator.liu.se \
    --cc=794@emacsbugs.donarmstrong.com \
    --cc=bug-gnu-emacs@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.