Mercurial > emacs
comparison lisp/gnus/yenc.el @ 56927:55fd4f77387a after-merge-gnus-5_10
Revision: miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-523
Merge from emacs--gnus--5.10, gnus--rel--5.10
Patches applied:
* miles@gnu.org--gnu-2004/emacs--gnus--5.10--base-0
tag of miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-464
* miles@gnu.org--gnu-2004/emacs--gnus--5.10--patch-1
Import from CVS branch gnus-5_10-branch
* miles@gnu.org--gnu-2004/emacs--gnus--5.10--patch-2
Merge from lorentey@elte.hu--2004/emacs--multi-tty--0, emacs--cvs-trunk--0
* miles@gnu.org--gnu-2004/emacs--gnus--5.10--patch-3
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2004/emacs--gnus--5.10--patch-4
Merge from gnus--rel--5.10
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-18
Update from CVS
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-19
Remove autoconf-generated files from archive
* miles@gnu.org--gnu-2004/gnus--rel--5.10--patch-20
Update from CVS
author | Miles Bader <miles@gnu.org> |
---|---|
date | Sat, 04 Sep 2004 13:13:48 +0000 |
parents | |
children | 18a818a2ee7c |
comparison
equal
deleted
inserted
replaced
56926:f8e248e9a717 | 56927:55fd4f77387a |
---|---|
1 ;;; yenc.el --- elisp native yenc decoder | |
2 ;; Copyright (c) 2002 Free Software Foundation, Inc. | |
3 | |
4 ;; Author: Jesper Harder <harder@ifa.au.dk> | |
5 ;; Keywords: yenc news | |
6 | |
7 ;; This file is part of GNU Emacs. | |
8 | |
9 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
10 ;; it under the terms of the GNU General Public License as published by | |
11 ;; the Free Software Foundation; either version 2, or (at your option) | |
12 ;; any later version. | |
13 | |
14 ;; GNU Emacs is distributed in the hope that it will be useful, | |
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 ;; GNU General Public License for more details. | |
18 | |
19 ;; You should have received a copy of the GNU General Public License | |
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
22 ;; Boston, MA 02111-1307, USA. | |
23 | |
24 ;;; Commentary: | |
25 | |
26 ;; Functions for decoding yenc encoded messages. | |
27 ;; | |
28 ;; Limitations: | |
29 ;; | |
30 ;; * Does not handle multipart messages. | |
31 ;; * No support for external decoders. | |
32 ;; * Doesn't check the crc32 checksum (if present). | |
33 | |
34 ;;; Code: | |
35 | |
36 (eval-when-compile (require 'cl)) | |
37 | |
38 (defconst yenc-begin-line | |
39 "^=ybegin.*$") | |
40 | |
41 (defconst yenc-decoding-vector | |
42 [214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 | |
43 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 | |
44 248 249 250 251 252 253 254 255 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
45 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
46 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | |
47 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | |
48 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | |
49 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | |
50 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | |
51 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 | |
52 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 | |
53 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | |
54 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 | |
55 208 209 210 211 212 213]) | |
56 | |
57 ;;;###autoload | |
58 (defun yenc-decode-region (start end) | |
59 "Yenc decode region between START and END using an internal decoder." | |
60 (interactive "r") | |
61 (let (work-buffer) | |
62 (unwind-protect | |
63 (save-excursion | |
64 (goto-char start) | |
65 (when (re-search-forward yenc-begin-line end t) | |
66 (let ((first (match-end 0)) | |
67 (header-alist (yenc-parse-line (match-string 0))) | |
68 bytes last footer-alist char) | |
69 (when (re-search-forward "^=ypart.*$" end t) | |
70 (setq first (match-end 0))) | |
71 (when (re-search-forward "^=yend.*$" end t) | |
72 (setq last (match-beginning 0)) | |
73 (setq footer-alist (yenc-parse-line (match-string 0))) | |
74 (let (default-enable-multibyte-characters) | |
75 (setq work-buffer (generate-new-buffer " *yenc-work*"))) | |
76 (while (< first last) | |
77 (setq char (char-after first)) | |
78 (cond ((or (eq char ?\r) | |
79 (eq char ?\n))) | |
80 ((eq char ?=) | |
81 (setq char (char-after (incf first))) | |
82 (with-current-buffer work-buffer | |
83 (insert-char (mod (- char 106) 256) 1))) | |
84 (t | |
85 (with-current-buffer work-buffer | |
86 ;;(insert-char (mod (- char 42) 256) 1) | |
87 (insert-char (aref yenc-decoding-vector char) 1)))) | |
88 (incf first)) | |
89 (setq bytes (buffer-size work-buffer)) | |
90 (unless (and (= (cdr (assq 'size header-alist)) bytes) | |
91 (= (cdr (assq 'size footer-alist)) bytes)) | |
92 (message "Warning: Size mismatch while decoding.")) | |
93 (goto-char start) | |
94 (delete-region start end) | |
95 (insert-buffer-substring work-buffer)))) | |
96 (and work-buffer (kill-buffer work-buffer)))))) | |
97 | |
98 ;;;###autoload | |
99 (defun yenc-extract-filename () | |
100 "Extract file name from an yenc header." | |
101 (save-excursion | |
102 (when (re-search-forward yenc-begin-line nil t) | |
103 (cdr (assoc 'name (yenc-parse-line (match-string 0))))))) | |
104 | |
105 (defun yenc-parse-line (str) | |
106 "Extract file name and size from STR." | |
107 (let (result name) | |
108 (when (string-match "^=y.*size=\\([0-9]+\\)" str) | |
109 (push (cons 'size (string-to-number (match-string 1 str))) result)) | |
110 (when (string-match "^=y.*name=\\(.*\\)$" str) | |
111 (setq name (match-string 1 str)) | |
112 ;; Remove trailing white space | |
113 (when (string-match " +$" name) | |
114 (setq name (substring name 0 (match-beginning 0)))) | |
115 (push (cons 'name name) result)) | |
116 result)) | |
117 | |
118 (provide 'yenc) | |
119 | |
120 ;;; arch-tag: 74df17e8-6fa8-4071-9f7d-54d548d79d9a | |
121 ;;; yenc.el ends here |