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