(defgroup reftex): Update home page url-link.
[bpt/emacs.git] / lisp / hexl.el
index 45044da..d753fc8 100644 (file)
@@ -1,7 +1,7 @@
 ;;; hexl.el --- edit a file in a hex dump format using the hexl filter
 
 ;; Copyright (C) 1989, 1994, 1998, 2001, 2002, 2003, 2004,
-;;   2005 Free Software Foundation, Inc.
+;;   2005, 2006 Free Software Foundation, Inc.
 
 ;; Author: Keith Gabryelski <ag@wheaties.ai.mit.edu>
 ;; Maintainer: FSF
@@ -38,7 +38,7 @@
 ;; grouping.
 ;;
 ;; -iso in `hexl-options' will allow iso characters to display in the
-;; ASCII region of the screen (if your emacs supports this) instead of
+;; ASCII region of the screen (if your Emacs supports this) instead of
 ;; changing them to dots.
 
 ;;; Code:
@@ -62,7 +62,7 @@ and \"-de\" when dehexlifying a buffer."
   :group 'hexl)
 
 (defcustom hexl-iso ""
-  "If your emacs can handle ISO characters, this should be set to
+  "If your Emacs can handle ISO characters, this should be set to
 \"-iso\" otherwise it should be \"\"."
   :type 'string
   :group 'hexl)
@@ -229,7 +229,7 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
                                  original-point))
          (or (bolp) (setq original-point (1- original-point))))
         (hexlify-buffer)
-        (set-buffer-modified-p modified))
+        (restore-buffer-modified-p modified))
       (make-local-variable 'hexl-max-address)
       (setq hexl-max-address max-address)
       (condition-case nil
@@ -300,9 +300,16 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
       (lambda (string &optional bound noerror count)
        (funcall
         (if isearch-forward 're-search-forward 're-search-backward)
-        (if (> (length string) 80)
-            (regexp-quote string)
-          (mapconcat 'string string "\\(?:\n\\(?:[:a-f0-9]+ \\)+ \\)?"))
+         (let ((textre
+                (if (> (length string) 80)
+                    (regexp-quote string)
+                  (mapconcat (lambda (c) (regexp-quote (string c))) string
+                             "\\(?:\n\\(?:[:a-f0-9]+ \\)+ \\)?"))))
+           (if (string-match "\\` ?\\([a-f0-9]+ \\)*[a-f0-9]+ ?\\'" string)
+               (concat textre "\\|"
+                       (mapconcat 'regexp-quote (split-string string " ")
+                                  " \\(?: .+\n[a-f0-9]+: \\)?"))
+             textre))
         bound noerror count))
     (let ((isearch-search-fun-function nil))
       (isearch-search-fun))))
@@ -318,35 +325,35 @@ You can use \\[hexl-find-file] to visit a file in Hexl mode.
   "Save a hexl format buffer as binary in visited file if modified."
   (interactive)
   (if hexl-in-save-buffer nil
-    (set-buffer-modified-p (if (buffer-modified-p)
-                              (save-excursion
-                                (let ((buf (generate-new-buffer " hexl"))
-                                      (name (buffer-name))
-                                      (file-name (buffer-file-name))
-                                      (start (point-min))
-                                      (end (point-max))
-                                      modified)
-                                  (set-buffer buf)
-                                  (insert-buffer-substring name start end)
-                                  (set-buffer name)
-                                  (dehexlify-buffer)
-                                  ;; Prevent infinite recursion.
-                                  (let ((hexl-in-save-buffer t))
-                                    (save-buffer))
-                                  (setq modified (buffer-modified-p))
-                                  (delete-region (point-min) (point-max))
-                                  (insert-buffer-substring buf start end)
-                                  (kill-buffer buf)
-                                  modified))
-                            (message "(No changes need to be saved)")
-                            nil))
+    (restore-buffer-modified-p
+     (if (buffer-modified-p)
+         (let ((buf (generate-new-buffer " hexl"))
+               (name (buffer-name))
+               (start (point-min))
+               (end (point-max))
+               modified)
+           (with-current-buffer buf
+             (insert-buffer-substring name start end)
+             (set-buffer name)
+             (dehexlify-buffer)
+             ;; Prevent infinite recursion.
+             (let ((hexl-in-save-buffer t))
+               (save-buffer))
+             (setq modified (buffer-modified-p))
+             (delete-region (point-min) (point-max))
+             (insert-buffer-substring buf start end)
+             (kill-buffer buf)
+             modified))
+       (message "(No changes need to be saved)")
+       nil))
     ;; Return t to indicate we have saved t
     t))
 
 ;;;###autoload
 (defun hexl-find-file (filename)
-  "Edit file FILENAME in hexl-mode.
-Switch to a buffer visiting file FILENAME, creating one in none exists."
+  "Edit file FILENAME as a binary file in hex dump format.
+Switch to a buffer visiting file FILENAME, creating one if none exists,
+and edit the file in `hexl-mode'."
   (interactive
    (list
     (let ((completion-ignored-extensions nil))
@@ -367,7 +374,7 @@ With arg, don't unhexlify buffer."
            (original-point (1+ (hexl-current-address))))
        (dehexlify-buffer)
        (remove-hook 'write-contents-functions 'hexl-save-buffer t)
-       (set-buffer-modified-p modified)
+       (restore-buffer-modified-p modified)
        (goto-char original-point)
        ;; Maybe adjust point for the removed CR characters.
        (when (eq (coding-system-eol-type buffer-file-coding-system) 1)
@@ -403,7 +410,7 @@ Ask the user for confirmation."
            (original-point (1+ (hexl-current-address))))
        (dehexlify-buffer)
        (remove-hook 'write-contents-functions 'hexl-save-buffer t)
-       (set-buffer-modified-p modified)
+       (restore-buffer-modified-p modified)
        (goto-char original-point))))
 
 (defun hexl-current-address (&optional validate)
@@ -698,7 +705,12 @@ This discards the buffer's undo information."
        (buffer-undo-list t))
     (apply 'call-process-region (point-min) (point-max)
           (expand-file-name hexl-program exec-directory)
-          t t nil (split-string hexl-options))
+          t t nil
+           ;; Manually encode the args, otherwise they're encoded using
+           ;; coding-system-for-write (i.e. buffer-file-coding-system) which
+           ;; may not be what we want (e.g. utf-16 on a non-utf-16 system).
+           (mapcar (lambda (s) (encode-coding-string s locale-coding-system))
+                   (split-string hexl-options)))
     (if (> (point) (hexl-address-to-marker hexl-max-address))
        (hexl-goto-address hexl-max-address))))
 
@@ -917,14 +929,14 @@ Customize the variable `hexl-follow-ascii' to disable this feature."
            )))))
 
 (defun hexl-activate-ruler ()
-  "Activate `ruler-mode'"
+  "Activate `ruler-mode'."
   (require 'ruler-mode)
   (set (make-local-variable 'ruler-mode-ruler-function)
        'hexl-mode-ruler)
   (ruler-mode 1))
 
 (defun hexl-follow-line ()
-  "Activate `hl-line-mode'"
+  "Activate `hl-line-mode'."
   (require 'frame)
   (require 'hl-line)
   (with-no-warnings
@@ -1071,5 +1083,5 @@ This function is assumed to be used as call back function for `hl-line-mode'."
 
 (provide 'hexl)
 
-;;; arch-tag: d5a7aa8a-9bce-480b-bcff-6c4c7ca5ea4a
+;; arch-tag: d5a7aa8a-9bce-480b-bcff-6c4c7ca5ea4a
 ;;; hexl.el ends here