changeset 13024:53205d572b1b

(hexl-current-address): New arg VALIDATE. Handle point values in the ASCII text section and in the addresses. (hexl-insert-char): Handle point located in the ASCII text.
author Richard M. Stallman <rms@gnu.org>
date Sun, 10 Sep 1995 17:45:08 +0000
parents 78f30dd2c8fd
children 1eab52043f10
files lisp/hexl.el
diffstat 1 files changed, 35 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/hexl.el	Sun Sep 10 17:44:25 1995 +0000
+++ b/lisp/hexl.el	Sun Sep 10 17:45:08 1995 +0000
@@ -269,13 +269,20 @@
 	(set-buffer-modified-p modified)
 	(goto-char original-point))))
 
-(defun hexl-current-address ()
+(defun hexl-current-address (&optional validate)
   "Return current hexl-address."
   (interactive)
   (let ((current-column (- (% (point) 68) 11)) 
 	(hexl-address 0))
-    (setq hexl-address (+ (* (/ (point) 68) 16)
-			  (/ (- current-column  (/ current-column 5)) 2)))
+    (if (< current-column 0)
+	(if validate
+	    (error "Point is not on a character in the file")
+	  (setq current-column 0)))
+    (setq hexl-address
+	  (+ (* (/ (point) 68) 16)
+	     (if (>= current-column 41)
+		 (- current-column 41)
+	       (/ (- current-column  (/ current-column 5)) 2))))
     hexl-address))
 
 (defun hexl-address-to-marker (address)
@@ -577,17 +584,32 @@
 
 (defun hexl-insert-char (ch num)
   "Insert a character in a hexl buffer."
-  (let ((address (hexl-current-address)))
+  (let ((address (hexl-current-address t)))
     (while (> num 0)
-      (delete-char 2)
-      (insert (format "%02x" ch))
-      (goto-char
-       (+ (* (/ address 16) 68) 52 (% address 16)))
-      (delete-char 1)
-      (insert (hexl-printable-character ch))
-      (or (eq address hexl-max-address)
-	  (setq address (1+ address)))
-      (hexl-goto-address address)
+      (let ((hex-position
+	     (+ (* (/ address 16) 68)
+		11
+		(* 2 (% address 16))
+		(/ (% address 16) 2)))
+	    (ascii-position
+	     (+ (* (/ address 16) 68) 52 (% address 16)))
+	    at-ascii-position)
+	(if (= (point) ascii-position)
+	    (setq at-ascii-position t))
+	(goto-char hex-position)
+	(delete-char 2)
+	(insert (format "%02x" ch))
+	(goto-char ascii-position)
+	(delete-char 1)
+	(insert (hexl-printable-character ch))
+	(or (eq address hexl-max-address)
+	    (setq address (1+ address)))
+	(hexl-goto-address address)
+	(if at-ascii-position
+	    (progn
+	      (beginning-of-line)
+	      (forward-char 51)
+	      (forward-char (% address 16)))))
       (setq num (1- num)))))
 
 ;; hex conversion