(mm-add-meta-html-tag): Fix regexp matching meta tag.
[gnus] / lisp / rfc2231.el
index 756a7fd..bb38c02 100644 (file)
@@ -1,25 +1,23 @@
 ;;; rfc2231.el --- Functions for decoding rfc2231 headers
 
 ;;; rfc2231.el --- Functions for decoding rfc2231 headers
 
-;; Copyright (C) 1998, 1999, 2000, 2002, 2003, 2004, 2005,
-;;   2006 Free Software Foundation, Inc.
+;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
+;;   2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
 
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 2, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
-;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.         See the
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 
 ;;; Commentary:
 
@@ -162,22 +160,18 @@ must never cause a Lisp error."
                          (buffer-substring
                           (point)
                           (progn
                          (buffer-substring
                           (point)
                           (progn
-                            (forward-sexp)
-                            ;; We might not have reached at the end of
-                            ;; the value because of non-ascii chars,
-                            ;; so we should jump over them if any.
-                            (while (and (not (eobp))
-                                        (> (char-after) ?\177))
+                            ;; Jump over asterisk, non-ASCII
+                            ;; and non-boundary characters.
+                            (while (and c
+                                        (or (eq c ?*)
+                                            (> c ?\177)
+                                            (not (eq (char-syntax c) ? ))))
                               (forward-char 1)
                               (forward-char 1)
-                              (forward-sexp))
+                              (setq c (char-after)))
                             (point)))))
                   (t
                    (error "Invalid header: %s" string)))
                             (point)))))
                   (t
                    (error "Invalid header: %s" string)))
-                 (push (list attribute
-                             (if encoded
-                                 (rfc2231-decode-encoded-string value)
-                               value)
-                             number)
+                 (push (list attribute value number encoded)
                        parameters))))
          (error
           (setq parameters nil)
                        parameters))))
          (error
           (setq parameters nil)
@@ -187,13 +181,23 @@ must never cause a Lisp error."
        ;; Now collect and concatenate continuation parameters.
        (let ((cparams nil)
              elem)
        ;; Now collect and concatenate continuation parameters.
        (let ((cparams nil)
              elem)
-         (loop for (attribute value part) in (nreverse parameters)
+         (loop for (attribute value part encoded)
+               in (sort parameters (lambda (e1 e2)
+                                     (< (or (caddr e1) 0)
+                                        (or (caddr e2) 0))))
                do (if (or (not (setq elem (assq attribute cparams)))
                           (and (numberp part)
                                (zerop part)))
                do (if (or (not (setq elem (assq attribute cparams)))
                           (and (numberp part)
                                (zerop part)))
-                      (push (cons attribute value) cparams)
-                    (setcdr elem (concat (cdr elem) value))))
-         (cons type (nreverse cparams)))))))
+                      (push (list attribute value encoded) cparams)
+                    (setcar (cdr elem) (concat (cadr elem) value))))
+         ;; Finally decode encoded values.
+         (cons type (mapcar
+                     (lambda (elem)
+                       (cons (car elem)
+                             (if (nth 2 elem)
+                                 (rfc2231-decode-encoded-string (nth 1 elem))
+                               (nth 1 elem))))
+                     (nreverse cparams))))))))
 
 (defun rfc2231-decode-encoded-string (string)
   "Decode an RFC2231-encoded string.
 
 (defun rfc2231-decode-encoded-string (string)
   "Decode an RFC2231-encoded string.
@@ -210,11 +214,11 @@ These look like:
     (mm-with-unibyte-buffer
       (insert value)
       (goto-char (point-min))
     (mm-with-unibyte-buffer
       (insert value)
       (goto-char (point-min))
-      (while (search-forward "%" nil t)
+      (while (re-search-forward "%\\([0-9A-Fa-f][0-9A-Fa-f]\\)" nil t)
        (insert
         (prog1
        (insert
         (prog1
-            (string-to-number (buffer-substring (point) (+ (point) 2)) 16)
-          (delete-region (1- (point)) (+ (point) 2)))))
+            (string-to-number (match-string 1) 16)
+          (delete-region (match-beginning 0) (match-end 0)))))
       ;; Decode using the charset, if any.
       (if (memq coding-system '(nil ascii))
          (buffer-string)
       ;; Decode using the charset, if any.
       (if (memq coding-system '(nil ascii))
          (buffer-string)
@@ -292,5 +296,5 @@ the result of this function."
 
 (provide 'rfc2231)
 
 
 (provide 'rfc2231)
 
-;;; arch-tag: c3ab751d-d108-406a-b301-68882ad8cd63
+;; arch-tag: c3ab751d-d108-406a-b301-68882ad8cd63
 ;;; rfc2231.el ends here
 ;;; rfc2231.el ends here