]> code.delx.au - gnu-emacs/blobdiff - lisp/textmodes/po.el
Convert consecutive FSF copyright years to ranges.
[gnu-emacs] / lisp / textmodes / po.el
index 46e37311ab9634741c871d3b9c18ee134c2e51c8..7810cc6d57a73eed69ce20fbbbd1890b0b9c7add 100644 (file)
@@ -1,6 +1,6 @@
 ;;; po.el --- basic support of PO translation files -*- coding: latin-1; -*-
 
-;; Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc.
+;; Copyright (C) 1995-1998, 2000-2011 Free Software Foundation, Inc.
 
 ;; Authors: François Pinard <pinard@iro.umontreal.ca>,
 ;;          Greg McGary <gkm@magilla.cichlid.com>,
@@ -9,10 +9,10 @@
 
 ;; 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
-;; 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
@@ -20,9 +20,7 @@
 ;; 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., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 
 Contains canonical charset names that don't correspond to coding systems.")
 
 (defun po-find-charset (filename)
-  "Return PO charset value for FILENAME."
+  "Return PO charset value for FILENAME.
+If FILENAME is a cons cell, its CDR is a buffer that already contains
+the PO file (but not yet decoded)."
   (let ((charset-regexp
         "^\"Content-Type:[ \t]*text/plain;[ \t]*charset=\\(.*\\)\\\\n\"")
+       (buf (and (consp filename) (cdr filename)))
        (short-read nil))
+    (when buf
+      (set-buffer buf)
+      (goto-char (point-min)))
     ;; Try the first 4096 bytes.  In case we cannot find the charset value
     ;; within the first 4096 bytes (the PO file might start with a long
     ;; comment) try the next 4096 bytes repeatedly until we'll know for sure
     ;; we've checked the empty header entry entirely.
-    (while (not (or short-read (re-search-forward "^msgid" nil t)))
+    (while (not (or short-read (re-search-forward "^msgid" nil t) buf))
       (save-excursion
         (goto-char (point-max))
        (let ((pair (insert-file-contents-literally filename nil
@@ -56,7 +60,7 @@ Contains canonical charset names that don't correspond to coding systems.")
                                                    (1- (+ (point) 4096)))))
          (setq short-read (< (nth 1 pair) 4096)))))
     (cond ((re-search-forward charset-regexp nil t) (match-string 1))
-         (short-read nil)
+         ((or short-read buf) nil)
          ;; We've found the first msgid; maybe, only a part of the msgstr
          ;; value was loaded.  Load the next 1024 bytes; if charset still
          ;; isn't available, give up.
@@ -70,24 +74,28 @@ Contains canonical charset names that don't correspond to coding systems.")
 
 (defun po-find-file-coding-system-guts (operation filename)
   "Return a (DECODING . ENCODING) pair for OPERATION on PO file FILENAME.
-Do so according to FILENAME's declared charset."
+Do so according to FILENAME's declared charset.
+FILENAME may be a cons (NAME . BUFFER).  In that case, detect charset
+in BUFFER."
   (and
    (eq operation 'insert-file-contents)
-   (file-exists-p filename)
+   (or (if (consp filename) (buffer-live-p (cdr filename)))
+       (file-exists-p filename))
    (with-temp-buffer
      (let* ((coding-system-for-read 'no-conversion)
            (charset (or (po-find-charset filename) "ascii"))
            assoc)
        (list (cond
              ((setq assoc
-                    (assoc-ignore-case charset
-                                       po-content-type-charset-alist))
+                    (assoc-string charset
+                                   po-content-type-charset-alist
+                                   t))
               (cdr assoc))
-             ((or (setq assoc (assoc-ignore-case charset coding-system-alist))
+             ((or (setq assoc (assoc-string charset coding-system-alist t))
                   (setq assoc
-                        (assoc-ignore-case (subst-char-in-string ?_ ?-
-                                                                 charset)
-                                           coding-system-alist)))
+                        (assoc-string (subst-char-in-string ?_ ?-
+                                                             charset)
+                                       coding-system-alist t)))
               (intern (car assoc)))
              ;; In principle we should also check the `mime-charset'
              ;; property of everything in the base coding system
@@ -101,10 +109,10 @@ Do so according to FILENAME's declared charset."
               ;; to require it initially?
               (require 'code-pages nil t)
               (if (or
-                   (setq assoc (assoc-ignore-case charset coding-system-alist))
-                   (setq assoc (assoc-ignore-case (subst-char-in-string
-                                                   ?_ ?- charset)
-                                                  coding-system-alist)))
+                   (setq assoc (assoc-string charset coding-system-alist t))
+                   (setq assoc (assoc-string (subst-char-in-string
+                                               ?_ ?- charset)
+                                              coding-system-alist t)))
                   (intern (car assoc))
                 'raw-text))))))))