emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: latexenc-find-file-coding-system is slow.


From: Arne Jørgensen
Subject: Re: latexenc-find-file-coding-system is slow.
Date: Wed, 11 May 2005 19:21:24 +0200
User-agent: Gnus/5.110004 (No Gnus v0.4) Emacs/22.0.50 (gnu/linux)

Lute Kamstra <address@hidden> writes:

> [For some reason, I didn't see your message on emacs-devel.]

Neither did I. It got lost again as most of my mail to @gnu.org
addresses do. This is posted through Gmane instead.

> Arne Jørgensen <address@hidden> writes:

[...]

> I think there a some minor problems with the details of the
> implementation:
>
>> Index: lisp/international/latexenc.el
>> ===================================================================
>> RCS file: /cvsroot/emacs/emacs/lisp/international/latexenc.el,v
>> retrieving revision 1.3
>> diff -u -p -r1.3 latexenc.el
>> --- lisp/international/latexenc.el   1 May 2005 11:01:49 -0000       1.3
>> +++ lisp/international/latexenc.el   4 May 2005 18:12:23 -0000
>> @@ -120,24 +120,33 @@ coding system names is determined from `
>>        (save-excursion
>>          ;; try to find the coding system in this file
>>          (goto-char (point-min))
>> -        (if (or
>> -             (re-search-forward "^[^%\n]*\\\\inputencoding{\\(.*\\)}" nil t)
>> -             (re-search-forward 
>> "^[^%\n]*\\\\usepackage\\[\\(.*\\)\\]{inputenc}" nil t))
>> -            (let* ((match (match-string 1))
>> -                   (sym (intern match)))
>> -              (when (latexenc-inputenc-to-coding-system match)
>> -                (setq sym (latexenc-inputenc-to-coding-system match))
>> -                (when (coding-system-p sym)
>> -              sym
>> -                  (if (and (require 'code-pages nil t) (coding-system-p 
>> sym))
>> -                      sym
>> -                    'undecided))))
>> +    (if (catch 'cs
>> +          (let ((case-fold-search nil))
>> +            (while (search-forward "inputenc" nil t)
>> +              (goto-char (match-beginning 0))
>> +              (beginning-of-line)
>> +              (if (or (looking-at 
>> "[^%\n]*\\\\usepackage\\[\\(.*\\)\\]{\\(.*,\\)?inputenc\\(,.*\\)?}")
>
> That also matches something like:
>
> \usepackage[opt]{package} % don't use {package,inputenc}

Right. I should be fixed now.

>> +                      (looking-at "[^%\n]*\\\\inputencoding{\\(.*\\)}"))
>> +                  (throw 'cs (match-string 1))
>
> Why throw (match-string 1) instead of t?

You're right.

>> +                (goto-char (match-end 0))))))
>> +        (let* ((match (match-string 1))
>> +               (sym (intern match)))
>> +          (when (latexenc-inputenc-to-coding-system match)
>> +            (setq sym (latexenc-inputenc-to-coding-system match)))
>> +          (when (coding-system-p sym)
>> +            sym
>> +            (if (and (require 'code-pages nil t) (coding-system-p sym))
>> +                sym
>> +              'undecided)))
>>            ;; else try to find it in the master/main file
>> -          (let (latexenc-main-file)
>> +          (let (latexenc-main-file
>> +            bound)
>>              ;; is there a TeX-master or tex-main-file in the local variable 
>> section
>>              (unless latexenc-dont-use-TeX-master-flag
>>                (goto-char (point-max))
>> -              (when (re-search-backward "^%+ 
>> *\\(TeX-master\\|tex-main-file\\): *\"\\(.+\\)\"" nil t)
>> +          (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 
>> 'move)
>> +          (setq bound (search-forward "Local Variables:" nil t))
>> +              (when (re-search-forward "^%+ 
>> *\\(TeX-master\\|tex-main-file\\): *\"\\(.+\\)\"" nil t)
>>                  (let ((file (concat (file-name-directory (nth 1 arg-list)) 
>> (match-string 2))))
>>                    (if (file-exists-p file)
>>                        (setq latexenc-main-file file)
>
> You don't seem to use the variable bound.

No. It's gone now. (I was probably tired).

> Could you also write a ChangeLog entry for your patch?

Done.

New patch attached.

Thanks and kind regard,
-- 
Arne Jørgensen <http://arnested.dk/>

Index: lisp/ChangeLog
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.7484
diff -u -p -r1.7484 ChangeLog
--- lisp/ChangeLog      11 May 2005 16:42:40 -0000      1.7484
+++ lisp/ChangeLog      11 May 2005 17:14:03 -0000
@@ -1,3 +1,11 @@
+2005-05-11  Arne J,Ax(Brgensen  <address@hidden>
+
+       * international/latexenc.el (latexenc-find-file-coding-system):
+       Avoid `re-search-forward' when looking for input encoding because
+       of speed and safety. Better regexp's for recognizing input
+       encoding. Limit a search for TeX-master/tex-main-file to the local
+       variable section.
+
 2005-05-11  Stefan Monnier  <address@hidden>
 
        * files.el (executable-find): Move from executable.el. Use locate-file.
Index: lisp/international/latexenc.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/international/latexenc.el,v
retrieving revision 1.3
diff -u -p -r1.3 latexenc.el
--- lisp/international/latexenc.el      1 May 2005 11:01:49 -0000       1.3
+++ lisp/international/latexenc.el      11 May 2005 17:14:03 -0000
@@ -120,24 +120,32 @@ coding system names is determined from `
       (save-excursion
         ;; try to find the coding system in this file
         (goto-char (point-min))
-        (if (or
-             (re-search-forward "^[^%\n]*\\\\inputencoding{\\(.*\\)}" nil t)
-             (re-search-forward 
"^[^%\n]*\\\\usepackage\\[\\(.*\\)\\]{inputenc}" nil t))
-            (let* ((match (match-string 1))
-                   (sym (intern match)))
-              (when (latexenc-inputenc-to-coding-system match)
-                (setq sym (latexenc-inputenc-to-coding-system match))
-                (when (coding-system-p sym)
-                 sym
-                  (if (and (require 'code-pages nil t) (coding-system-p sym))
-                      sym
-                    'undecided))))
+       (if (catch 'cs
+             (let ((case-fold-search nil))
+               (while (search-forward "inputenc" nil t)
+                 (goto-char (match-beginning 0))
+                 (beginning-of-line)
+                 (if (or (looking-at 
"[^%\n]*\\\\usepackage\\[\\([^]]*\\)\\]{\\([^}]*,\\)?inputenc\\(,[^}]*\\)?}")
+                         (looking-at "[^%\n]*\\\\inputencoding{\\([^}]*\\)}"))
+                     (throw 'cs t)
+                   (goto-char (match-end 0))))))
+           (let* ((match (match-string 1))
+                  (sym (intern match)))
+             (when (latexenc-inputenc-to-coding-system match)
+               (setq sym (latexenc-inputenc-to-coding-system match)))
+             (when (coding-system-p sym)
+               sym
+               (if (and (require 'code-pages nil t) (coding-system-p sym))
+                   sym
+                 'undecided)))
           ;; else try to find it in the master/main file
           (let (latexenc-main-file)
             ;; is there a TeX-master or tex-main-file in the local variable 
section
             (unless latexenc-dont-use-TeX-master-flag
               (goto-char (point-max))
-              (when (re-search-backward "^%+ 
*\\(TeX-master\\|tex-main-file\\): *\"\\(.+\\)\"" nil t)
+             (search-backward "\n\^L" (max (- (point-max) 3000) (point-min)) 
'move)
+             (search-forward "Local Variables:" nil t)
+              (when (re-search-forward "^%+ *\\(TeX-master\\|tex-main-file\\): 
*\"\\(.+\\)\"" nil t)
                 (let ((file (concat (file-name-directory (nth 1 arg-list)) 
(match-string 2))))
                   (if (file-exists-p file)
                       (setq latexenc-main-file file)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]