X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/8f924df7df019cce90537647de2627581043b5c4..73b0cd50031a714347109169ceb8bacae338612a:/lisp/textmodes/po.el diff --git a/lisp/textmodes/po.el b/lisp/textmodes/po.el index 46e37311ab..7810cc6d57 100644 --- a/lisp/textmodes/po.el +++ b/lisp/textmodes/po.el @@ -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 , ;; Greg McGary , @@ -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 . ;;; Commentary: @@ -40,15 +38,21 @@ 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))))))))