Function: yenc-decode-region

yenc-decode-region is an autoloaded, interactive and byte-compiled function defined in yenc.el.gz.

Signature

(yenc-decode-region START END)

Documentation

Yenc decode region between START and END using an internal decoder.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/mail/yenc.el.gz
;;;###autoload
(defun yenc-decode-region (start end)
  "Yenc decode region between START and END using an internal decoder."
  (interactive "r")
  (let (work-buffer)
    (unwind-protect
	(save-excursion
	  (goto-char start)
	  (when (re-search-forward yenc-begin-line end t)
	    (let ((first (match-end 0))
		  (header-alist (yenc-parse-line (match-string 0)))
		  bytes last footer-alist char)
	      (when (re-search-forward "^=ypart.*$" end t)
		(setq first (match-end 0)))
	      (when (re-search-forward "^=yend.*$" end t)
		(setq last (match-beginning 0))
		(setq footer-alist (yenc-parse-line (match-string 0)))
		(setq work-buffer (generate-new-buffer " *yenc-work*"))
		(with-current-buffer work-buffer
		  (set-buffer-multibyte nil))
		(while (< first last)
		  (setq char (char-after first))
		  (cond ((or (eq char ?\r)
			     (eq char ?\n)))
			((eq char ?=)
			 (setq char (char-after (cl-incf first)))
			 (with-current-buffer work-buffer
			   (insert-char (mod (- char 106) 256) 1)))
			(t
			 (with-current-buffer work-buffer
			   ;;(insert-char (mod (- char 42) 256) 1)
			   (insert-char (aref yenc-decoding-vector char) 1))))
		  (cl-incf first))
		(setq bytes (buffer-size work-buffer))
		(unless (and (= (cdr (assq 'size header-alist)) bytes)
			     (= (cdr (assq 'size footer-alist)) bytes))
		  (message "Warning: Size mismatch while decoding."))
		(goto-char start)
		(delete-region start end)
		(insert-buffer-substring work-buffer)))))
      (and work-buffer (kill-buffer work-buffer)))))