Function: uudecode-decode-region-internal
uudecode-decode-region-internal is an autoloaded, interactive and
byte-compiled function defined in uudecode.el.gz.
Signature
(uudecode-decode-region-internal START END &optional FILE-NAME)
Documentation
Uudecode region between START and END without using an external program.
If FILE-NAME is non-nil, save the result to FILE-NAME.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/mail/uudecode.el.gz
;;;###autoload
(defun uudecode-decode-region-internal (start end &optional file-name)
"Uudecode region between START and END without using an external program.
If FILE-NAME is non-nil, save the result to FILE-NAME."
(interactive "r\nP")
(let ((done nil)
(counter 0)
(remain 0)
(bits 0)
(lim 0) inputpos result
(non-data-chars (concat "^" uudecode-alphabet)))
(save-excursion
(goto-char start)
(when (re-search-forward uudecode-begin-line nil t)
(cond ((null file-name))
((stringp file-name))
(t
(setq file-name (expand-file-name
(read-file-name "File to Name:"
nil nil nil
(match-string 1))))))
(forward-line 1)
(skip-chars-forward non-data-chars end)
(while (not done)
(setq inputpos (point))
(setq remain 0 bits 0 counter 0)
(cond
((> (skip-chars-forward uudecode-alphabet end) 0)
(setq lim (point))
(setq remain
(logand (- (char-after inputpos) 32)
63))
(setq inputpos (1+ inputpos))
(if (= remain 0) (setq done t))
(while (and (< inputpos lim) (> remain 0))
(setq bits (+ bits
(logand
(-
(char-after inputpos) 32)
63)))
(if (/= counter 0) (setq remain (1- remain)))
(setq counter (1+ counter)
inputpos (1+ inputpos))
(cond ((= counter 4)
(setq result (cons (logand bits 255)
(cons (logand (ash bits -8) 255)
(cons (ash bits -16)
result))))
(setq bits 0 counter 0))
(t (setq bits (ash bits 6)))))))
(cond
(done)
((> 0 remain)
(error "uucode line ends unexpectedly")
(setq done t))
((and (= (point) end) (not done))
;;(error "uucode ends unexpectedly")
(setq done t))
((= counter 3)
(setq result (cons (logand (ash bits -8) 255)
(cons (logand (ash bits -16) 255)
result))))
((= counter 2)
(setq result (cons (logand (ash bits -10) 255)
result))))
(skip-chars-forward non-data-chars end))
(if file-name
(with-temp-file file-name
(set-buffer-multibyte nil)
(apply #'insert (nreverse result)))
(or (markerp end) (setq end (set-marker (make-marker) end)))
(goto-char start)
(apply #'insert
(nreverse
(if enable-multibyte-characters
(mapcar (lambda (ch)
(or (decode-char 'eight-bit ch) ch))
result)
result)))
(delete-region (point) end))))))