comparison lisp/url/base64.el @ 0:376386a54a3c r19-14

Import from CVS: tag r19-14
author cvs
date Mon, 13 Aug 2007 08:45:50 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:376386a54a3c
1 ;;; base64.el,v --- Base64 encoding functions
2 ;; Author: wmperry
3 ;; Created: 1996/04/22 15:08:08
4 ;; Version: 1.7
5 ;; Keywords: extensions
6
7 ;;; LCD Archive Entry:
8 ;;; base64.el|William M. Perry|wmperry@spry.com|
9 ;;; Package for encoding/decoding base64 data (MIME)|
10 ;;; 1996/04/22 15:08:08|1.7|Location Undetermined
11 ;;;
12
13 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
14 ;;; Base 64 encoding functions
15 ;;; This code was converted to lisp code by me from the C code in
16 ;;; ftp://cs.utk.edu/pub/MIME/b64encode.c
17 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18
19 (defvar base64-code-string
20 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
21 "Character set used for base64 decoding")
22
23 (defvar base64-decode-vector
24 (let ((vec (make-vector 256 nil))
25 (i 0)
26 (case-fold-search nil))
27 (while (< i 256)
28 (aset vec i (string-match (regexp-quote (char-to-string i))
29 base64-code-string))
30 (setq i (1+ i)))
31 vec))
32
33 (defvar base64-max-line-length 64)
34
35 ;(defun b0 (x) (aref base64-code-string (logand (lsh x -18) 63)))
36 ;(defun b1 (x) (aref base64-code-string (logand (lsh x -12) 63)))
37 ;(defun b2 (x) (aref base64-code-string (logand (lsh x -6) 63)))
38 ;(defun b3 (x) (aref base64-code-string (logand x 63)))
39
40 (defmacro b0 (x) (` (aref base64-code-string (logand (lsh (, x) -18) 63))))
41 (defmacro b1 (x) (` (aref base64-code-string (logand (lsh (, x) -12) 63))))
42 (defmacro b2 (x) (` (aref base64-code-string (logand (lsh (, x) -6) 63))))
43 (defmacro b3 (x) (` (aref base64-code-string (logand (, x) 63))))
44
45 (defun base64-encode (str)
46 "Do base64 encoding on string STR and return the encoded string.
47 This code was converted to lisp code by me from the C code in
48 ftp://cs.utk.edu/pub/MIME/b64encode.c. Returns a string that is
49 broken into `base64-max-line-length' byte lines."
50 (or str (setq str (buffer-string)))
51 (let ((x (base64-encode-internal str))
52 (y ""))
53 (while (> (length x) base64-max-line-length)
54 (setq y (concat y (substring x 0 base64-max-line-length) "\n")
55 x (substring x base64-max-line-length nil)))
56 (setq y (concat y x))
57 y))
58
59 (defun base64-encode-internal (str)
60 "Do base64 encoding on string STR and return the encoded string.
61 This code was converted to lisp code by me from the C code in
62 ftp://cs.utk.edu/pub/MIME/b64encode.c. Returns the entire string,
63 not broken up into `base64-max-line-length' byte lines."
64 (let (
65 (word 0) ; The word to translate
66 w1 w2 w3
67 )
68 (cond
69 ((> (length str) 3)
70 (concat
71 (base64-encode-internal (substring str 0 3))
72 (base64-encode-internal (substring str 3 nil))))
73 ((= (length str) 3)
74 (setq w1 (aref str 0)
75 w2 (aref str 1)
76 w3 (aref str 2)
77 word (logior
78 (lsh (logand w1 255) 16)
79 (lsh (logand w2 255) 8)
80 (logand w3 255)))
81 (format "%c%c%c%c" (b0 word) (b1 word) (b2 word) (b3 word)))
82 ((= (length str) 2)
83 (setq w1 (aref str 0)
84 w2 (aref str 1)
85 word (logior
86 (lsh (logand w1 255) 16)
87 (lsh (logand w2 255) 8)
88 0))
89 (format "%c%c%c=" (b0 word) (b1 word) (b2 word)))
90 ((= (length str) 1)
91 (setq w1 (aref str 0)
92 word (logior
93 (lsh (logand w1 255) 16)
94 0))
95 (format "%c%c==" (b0 word) (b1 word)))
96 (t ""))))
97
98 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99 ;;; Base64 decoding functions
100 ;;; Most of the decoding code is courtesy Francesco Potorti`
101 ;;; <F.Potorti@cnuce.cnr.it>
102 ;;; this is much faster than my original code - thanks!
103 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
104 (defun base64-decode-region (beg end)
105 (interactive "r")
106 (barf-if-buffer-read-only)
107 (let
108 ((exchange (= (point) beg))
109 (endchars 0)
110 (list) (code))
111 (goto-char beg)
112 (while (< (point) end)
113 (setq list (mapcar
114 (function
115 (lambda (c)
116 (cond
117 ((aref base64-decode-vector c))
118 ((char-equal c ?=)
119 (setq endchars (1+ endchars))
120 0)
121 (nil
122 (error
123 "Character %c does not match Mime base64 coding" c)))))
124 (buffer-substring (point) (+ (point) 4))))
125 (setq code (+ (nth 3 list) (lsh (nth 2 list) 6)
126 (lsh (nth 1 list) 12) (lsh (car list) 18)))
127 (delete-char 4)
128 (cond
129 ((zerop endchars)
130 (insert (% (lsh code -16) 256) (% (lsh code -8) 256) (% code 256)))
131 ((= endchars 1)
132 (insert (% (lsh code -16) 256) (% (lsh code -8) 256))
133 (setq end (point)))
134 ((= endchars 2)
135 (insert (% (lsh code -16) 256))
136 (setq end (point))))
137 (if (char-equal (following-char) ?\n)
138 (progn (delete-char 1)
139 (setq end (- end 2)))
140 (setq end (1- end))))
141 ))
142 ; (if exchange
143 ; (exchange-point-and-mark))))
144
145 (defun base64-decode (st &optional nd)
146 "Do base64 decoding on string STR and return the original string.
147 If given buffer positions, destructively decodes that area of the
148 current buffer."
149 (let ((replace-p nil)
150 (retval nil))
151 (if (stringp st)
152 nil
153 (setq st (prog1
154 (buffer-substring st (or nd (point-max)))
155 (delete-region st (or nd (point-max))))
156 replace-p t))
157 (setq retval
158 (save-excursion
159 (set-buffer (get-buffer-create " *b64decode*"))
160 (erase-buffer)
161 (insert st)
162 (goto-char (point-min))
163 (while (re-search-forward "\r*\n" nil t)
164 (replace-match ""))
165 (goto-char (point-min))
166 (base64-decode-region (point-min) (point-max))
167 (buffer-string)))
168 (if replace-p (insert retval))
169 retval))
170
171 (provide 'base64)