Function: binhex-decode-region-internal
binhex-decode-region-internal is an autoloaded, interactive and
byte-compiled function defined in binhex.el.gz.
Signature
(binhex-decode-region-internal START END &optional HEADER-ONLY)
Documentation
Binhex decode region between START and END without using an external program.
If HEADER-ONLY is non-nil only decode header and return filename.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/mail/binhex.el.gz
;;;###autoload
(defun binhex-decode-region-internal (start end &optional header-only)
"Binhex decode region between START and END without using an external program.
If HEADER-ONLY is non-nil only decode header and return filename."
(interactive "r")
(let ((work-buffer nil)
(counter 0)
(bits 0) (tmp t)
(lim 0) inputpos
(non-data-chars " \t\n\r:")
file-name-length data-fork-start
header
binhex-last-char binhex-repeat)
(unwind-protect
(save-excursion
(goto-char start)
(when (re-search-forward binhex-begin-line end t)
(setq work-buffer (generate-new-buffer " *binhex-work*"))
(with-current-buffer work-buffer
(set-buffer-multibyte nil))
(beginning-of-line)
(setq bits 0 counter 0)
(while tmp
(skip-chars-forward non-data-chars end)
(setq inputpos (point))
(end-of-line)
(setq lim (point))
(while (and (< inputpos lim)
(setq tmp (binhex-char-map (char-after inputpos))))
(setq bits (+ bits tmp)
counter (1+ counter)
inputpos (1+ inputpos))
(cond ((= counter 4)
(binhex-push-char (ash bits -16) nil work-buffer)
(binhex-push-char (logand (ash bits -8) 255) nil
work-buffer)
(binhex-push-char (logand bits 255) nil
work-buffer)
(setq bits 0 counter 0))
(t (setq bits (ash bits 6)))))
(if (null file-name-length)
(with-current-buffer work-buffer
(setq file-name-length (char-after (point-min))
data-fork-start (+ (point-min)
file-name-length 22))))
(when (and (null header)
(with-current-buffer work-buffer
(>= (buffer-size) data-fork-start)))
(binhex-verify-crc work-buffer
(point-min) data-fork-start)
(setq header (binhex-header work-buffer))
(when header-only (setq tmp nil counter 0)))
(setq tmp (and tmp (not (eq inputpos end)))))
(cond
((= counter 3)
(binhex-push-char (logand (ash bits -16) 255) nil
work-buffer)
(binhex-push-char (logand (ash bits -8) 255) nil
work-buffer))
((= counter 2)
(binhex-push-char (logand (ash bits -10) 255) nil
work-buffer))))
(if header-only nil
(binhex-verify-crc work-buffer
data-fork-start
(+ data-fork-start (aref header 6) 2))
(or (markerp end) (setq end (set-marker (make-marker) end)))
(goto-char start)
(insert-buffer-substring work-buffer
data-fork-start (+ data-fork-start
(aref header 6)))
(delete-region (point) end)))
(and work-buffer (kill-buffer work-buffer)))
(if header (aref header 1))))