aboutsummaryrefslogtreecommitdiffstats
path: root/lisp
diff options
context:
space:
mode:
authorMiles Bader2004-07-11 22:08:06 +0000
committerMiles Bader2004-07-11 22:08:06 +0000
commit89f3c0c9fda25756ee311a6d0467a97bac203eb5 (patch)
treebe9d2244f2ba1e7ecd4d680e92e5fdffca58ab03 /lisp
parent094194de121c8b93c7b183182cb0853ec54fe1aa (diff)
parentda38045d0a9949d46814683391e094a3612b6b41 (diff)
downloademacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.tar.gz
emacs-89f3c0c9fda25756ee311a6d0467a97bac203eb5.zip
Revision: miles@gnu.org--gnu-2004/emacs--unicode--0--patch-23
Merge from emacs--cvs-trunk--0 Patches applied: * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-442 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-444 Update from CVS * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-445 Tweak permissions * miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-446 - miles@gnu.org--gnu-2004/emacs--cvs-trunk--0--patch-450 Update from CVS
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog76
-rw-r--r--lisp/ediff-mult.el2
-rw-r--r--lisp/emacs-lisp/re-builder.el3
-rw-r--r--lisp/files.el7
-rw-r--r--lisp/mouse.el3
-rw-r--r--lisp/printing.el218
-rw-r--r--lisp/progmodes/cperl-mode.el2
-rw-r--r--lisp/replace.el3
-rw-r--r--lisp/simple.el3
-rw-r--r--lisp/term/mac-win.el13
-rw-r--r--lisp/wid-edit.el2
-rw-r--r--lisp/window.el41
-rw-r--r--lisp/xml.el400
13 files changed, 541 insertions, 232 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 92552debee2..68fe5246458 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,79 @@
12004-07-10 Luc Teirlinck <teirllm@auburn.edu>
2
3 * files.el (switch-to-buffer-other-window): Doc fix.
4
5 * window.el (save-selected-window, one-window-p)
6 (split-window-keep-point, split-window-vertically)
7 (split-window-horizontally): Doc fixes.
8
92004-07-10 Vinicius Jose Latorre <viniciusjl@ig.com.br>
10
11 * printing.el: Doc fix. Now it uses call-process instead of
12 shell-command for low command execution.
13 (pr-version): New version number (6.8).
14 (pr-shell-file-name): Option removed.
15 (pr-shell-command): Fun removed.
16 (pr-call-process): New fun. Replace pr-shell-command.
17 (pr-standard-path, pr-remove-nil-from-list): New funs.
18 (zmacs-region-stays, current-mouse-event, current-menubar): New var.
19 (pr-ps-file-preview, pr-ps-file-using-ghostscript, pr-ps-file-print)
20 (pr-setup, pr-ps-set-printer, pr-txt-set-printer)
21 (pr-ps-utility-process, pr-txt-print): Code fix.
22
232004-07-10 Stephan Stahl <stahl@eos.franken.de> (tiny change)
24
25 * ediff-mult.el (ediff-meta-truncate-filenames): Change type to
26 boolean.
27
282004-07-09 Lars Hansen <larsh@math.ku.dk>
29
30 * wid-edit.el (widget-field-buffer): Doc fix.
31
322004-07-09 John Paul Wallington <jpw@gnu.org>
33
34 * emacs-lisp/re-builder.el (reb-update-overlays): Distinguish
35 between one and several matches in message.
36
372004-07-09 Richard M. Stallman <rms@gnu.org>
38
39 * mouse.el (mouse-set-region-1): If transient-mark-mode
40 is `identity', change it to `only'.
41
42 * simple.el (current-word): Doc fix.
43
442004-07-09 Mark A. Hershberger <mah@everybody.org>
45
46 * progmodes/cperl-mode.el (cperl-mode): Adapt defun-prompt-regexp
47 so that it is more understanding of whitespace.
48
49 * xml.el (xml-maybe-do-ns, xml-parse-tag): Produce elements in the
50 form
51 (("ns" . "element") (attr-list) children) instead of
52 ((:ns . "element") (attr-list) children) in order to reduce the
53 number of symbols used.
54 (xml-skip-dtd): Change to use xml-parse-dtd but set
55 xml-validating-parsing to nil.
56 (xml-parse-dtd): Parse entity deleclarations in DOCTYPEs.
57 (xml-substitute-entity): Remove in favor of new entity substitution.
58 (xml-substitute-special): Rewrite in to substitute complex
59 entities from DOCTYPE declarations.
60 (xml-parse-fragment): Parse fragments from entity deleclarations.
61 (xml-parse-region, xml-parse-tag, xml-parse-attlist)
62 (xml-parse-dtd, xml-substitute-special): Make validity checks
63 conditioned on xml-validating-parser. Add "Not Well Formed" to
64 error messages about well-formedness.
65
662004-07-08 Steven Tamm <steventamm@mac.com>
67
68 * term/mac-win.el (mac-scroll-ignore-events, mac-scroll-down)
69 (mac-scroll-down-line, mac-scroll-up, mac-scroll-up-line):
70 Do not treat double clicks and triple clicks specially in the
71 scroll bar (preventing strange repositioning problems)
72
732004-07-06 Stefan <monnier@iro.umontreal.ca>
74
75 * replace.el (query-replace-regexp-eval): Fix last change.
76
12004-07-05 Stefan <monnier@iro.umontreal.ca> 772004-07-05 Stefan <monnier@iro.umontreal.ca>
2 78
3 * replace.el (query-replace-descr): New fun. 79 * replace.el (query-replace-descr): New fun.
diff --git a/lisp/ediff-mult.el b/lisp/ediff-mult.el
index f5eff1eb49d..cf6edc2d129 100644
--- a/lisp/ediff-mult.el
+++ b/lisp/ediff-mult.el
@@ -200,7 +200,7 @@ Should be a sexp. For instance (car ediff-filtering-regexp-history) or nil."
200(defcustom ediff-meta-truncate-filenames t 200(defcustom ediff-meta-truncate-filenames t
201 "*If non-nil, truncate long file names in the session group buffers. 201 "*If non-nil, truncate long file names in the session group buffers.
202This can be toggled with `ediff-toggle-filename-truncation'." 202This can be toggled with `ediff-toggle-filename-truncation'."
203 :type 'hook 203 :type 'boolean
204 :group 'ediff-mult) 204 :group 'ediff-mult)
205(defcustom ediff-registry-setup-hook nil 205(defcustom ediff-registry-setup-hook nil
206 "*Hooks run just after the registry control panel is set up." 206 "*Hooks run just after the registry control panel is set up."
diff --git a/lisp/emacs-lisp/re-builder.el b/lisp/emacs-lisp/re-builder.el
index 83d3649006e..c6112c4a105 100644
--- a/lisp/emacs-lisp/re-builder.el
+++ b/lisp/emacs-lisp/re-builder.el
@@ -670,9 +670,10 @@ If SUBEXP is non-nil mark only the corresponding sub-expressions."
670 (overlay-put overlay 'priority i))) 670 (overlay-put overlay 'priority i)))
671 (setq i (1+ i)))))) 671 (setq i (1+ i))))))
672 (let ((count (if subexp submatches matches))) 672 (let ((count (if subexp submatches matches)))
673 (message"%s %smatch(es)%s" 673 (message"%s %smatch%s%s"
674 (if (= 0 count) "No" (int-to-string count)) 674 (if (= 0 count) "No" (int-to-string count))
675 (if subexp "subexpression " "") 675 (if subexp "subexpression " "")
676 (if (= 1 count) "" "es")
676 (if (and reb-auto-match-limit 677 (if (and reb-auto-match-limit
677 (= reb-auto-match-limit count)) 678 (= reb-auto-match-limit count))
678 " (limit reached)" ""))) 679 " (limit reached)" "")))
diff --git a/lisp/files.el b/lisp/files.el
index 1d500379925..30f318fbf69 100644
--- a/lisp/files.el
+++ b/lisp/files.el
@@ -869,8 +869,15 @@ use with M-x."
869 869
870(defun switch-to-buffer-other-window (buffer &optional norecord) 870(defun switch-to-buffer-other-window (buffer &optional norecord)
871 "Select buffer BUFFER in another window. 871 "Select buffer BUFFER in another window.
872If BUFFER does not identify an existing buffer, then this function
873creates a buffer with that name.
874
875When called from Lisp, BUFFER can be a buffer, a string \(a buffer name),
876or nil. If BUFFER is nil, then this function chooses a buffer
877using `other-buffer'.
872Optional second arg NORECORD non-nil means 878Optional second arg NORECORD non-nil means
873do not put this buffer at the front of the list of recently selected ones. 879do not put this buffer at the front of the list of recently selected ones.
880This function returns the buffer it switched to.
874 881
875This uses the function `display-buffer' as a subroutine; see its 882This uses the function `display-buffer' as a subroutine; see its
876documentation for additional customization information." 883documentation for additional customization information."
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 7f9d080478a..b73967b99dc 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -625,7 +625,8 @@ This should be bound to a mouse drag event."
625 625
626(defun mouse-set-region-1 () 626(defun mouse-set-region-1 ()
627 ;; Set transient-mark-mode for a little while. 627 ;; Set transient-mark-mode for a little while.
628 (setq transient-mark-mode (or transient-mark-mode 'only)) 628 (if (memq transient-mark-mode '(nil identity))
629 (setq transient-mark-mode 'only))
629 (setq mouse-last-region-beg (region-beginning)) 630 (setq mouse-last-region-beg (region-beginning))
630 (setq mouse-last-region-end (region-end)) 631 (setq mouse-last-region-end (region-end))
631 (setq mouse-last-region-tick (buffer-modified-tick))) 632 (setq mouse-last-region-tick (buffer-modified-tick)))
diff --git a/lisp/printing.el b/lisp/printing.el
index 57dd0691f99..351d6b64e85 100644
--- a/lisp/printing.el
+++ b/lisp/printing.el
@@ -3,18 +3,18 @@
3;; Copyright (C) 2000, 2001, 2002, 2003, 2004 3;; Copyright (C) 2000, 2001, 2002, 2003, 2004
4;; Free Software Foundation, Inc. 4;; Free Software Foundation, Inc.
5 5
6;; Author: Vinicius Jose Latorre <vinicius@cpqd.com.br> 6;; Author: Vinicius Jose Latorre <viniciusjl@ig.com.br>
7;; Maintainer: Vinicius Jose Latorre <vinicius@cpqd.com.br> 7;; Maintainer: Vinicius Jose Latorre <viniciusjl@ig.com.br>
8;; Time-stamp: <2004/04/05 23:41:49 vinicius> 8;; Time-stamp: <2004/07/10 18:48:24 vinicius>
9;; Keywords: wp, print, PostScript 9;; Keywords: wp, print, PostScript
10;; Version: 6.7.4 10;; Version: 6.8
11;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/ 11;; X-URL: http://www.cpqd.com.br/~vinicius/emacs/
12 12
13(defconst pr-version "6.7.4" 13(defconst pr-version "6.8"
14 "printing.el, v 6.7.4 <2004/03/31 vinicius> 14 "printing.el, v 6.8 <2004/07/10 vinicius>
15 15
16Please send all bug fixes and enhancements to 16Please send all bug fixes and enhancements to
17 Vinicius Jose Latorre <vinicius@cpqd.com.br> 17 Vinicius Jose Latorre <viniciusjl@ig.com.br>
18") 18")
19 19
20;; This file is part of GNU Emacs. 20;; This file is part of GNU Emacs.
@@ -40,10 +40,23 @@ Please send all bug fixes and enhancements to
40;; Introduction 40;; Introduction
41;; ------------ 41;; ------------
42;; 42;;
43;; This package provides some printing utilities that includes 43;; This package provides an user interface to some printing utilities that
44;; previewing/printing a PostScript file, printing a text file and 44;; includes previewing/printing a PostScript file, printing a text file and
45;; previewing/printing some major modes (like mh-folder-mode, 45;; previewing/printing some major modes (like mh-folder-mode,
46;; rmail-summary-mode, gnus-summary-mode, etc). 46;; rmail-summary-mode, gnus-summary-mode, etc). It also includes a
47;; PostScript/text printer database.
48;;
49;; Indeed, there are two user interfaces:
50;;
51;; * one is via menubar:
52;; When `printing' is loaded, the menubar is modified to use `printing'
53;; menu instead of the print options in menubar.
54;; This is the default user interface.
55;;
56;; * other is via buffer interface:
57;; It is an option of `printing' menu, but it can be binded into another
58;; key, so user can activate the buffer interface directly without using
59;; a menu. See `pr-interface' command.
47;; 60;;
48;; `printing' was inspired on: 61;; `printing' was inspired on:
49;; 62;;
@@ -172,7 +185,7 @@ Please send all bug fixes and enhancements to
172;; Tips 185;; Tips
173;; ---- 186;; ----
174;; 187;;
175;; 1. If your have a local printer, that is, a printer which is connected 188;; 1. If you have a local printer, that is, a printer which is connected
176;; directly to your computer, don't forget to connect the printer to your 189;; directly to your computer, don't forget to connect the printer to your
177;; computer before printing. 190;; computer before printing.
178;; 191;;
@@ -187,16 +200,26 @@ Please send all bug fixes and enhancements to
187;; another buffer and, then, print the file or the new static buffer. 200;; another buffer and, then, print the file or the new static buffer.
188;; An example of dynamic buffer is the *Messages* buffer. 201;; An example of dynamic buffer is the *Messages* buffer.
189;; 202;;
190;; 4. When running Emacs on Windows with cygwin, check if the 203;; 4. When running Emacs on Windows (with or without cygwin), check if your
191;; `pr-shell-file-name' variable is set to the proper shell. This shell 204;; printer is a text printer or not by typing in a DOS window:
192;; will execute the commands to preview/print the buffer, file or directory. 205;;
193;; Also check the setting of `pr-path-style' variable. 206;; print /D:\\host\printer somefile.txt
194;; Probably, you should use: 207;;
208;; Where, `host' is the machine where your printer is directly connected,
209;; `printer' is the printer name and `somefile.txt' is a text file.
195;; 210;;
196;; (setq pr-shell-file-name "bash") 211;; If the printer `\\host\printer' doesn't print the content of
197;; (setq pr-path-style 'unix) 212;; `somefile.txt' or, instead, it returns the following message:
198;; 213;;
199;; And use / instead of \ when specifying a directory. 214;; PostScript Error Handler
215;; Offending Command = CCC
216;; Stack =
217;;
218;; Where `CCC' is whatever is at the beginning of the text to be printed.
219;;
220;; Therefore, the printer `\\host\printer' is not a text printer, but a
221;; PostScript printer. So, please, don't include this printer in
222;; `pr-txt-printer-alist' (which see).
200;; 223;;
201;; 224;;
202;; Using `printing' 225;; Using `printing'
@@ -479,9 +502,6 @@ Please send all bug fixes and enhancements to
479;; `pr-buffer-verbose' Non-nil means to be verbose when editing a 502;; `pr-buffer-verbose' Non-nil means to be verbose when editing a
480;; field in interface buffer. 503;; field in interface buffer.
481;; 504;;
482;; `pr-shell-file-name' Specify file name to load inferior shells
483;; from.
484;;
485;; To set the above options you may: 505;; To set the above options you may:
486;; 506;;
487;; a) insert the code in your ~/.emacs, like: 507;; a) insert the code in your ~/.emacs, like:
@@ -912,8 +932,8 @@ Please send all bug fixes and enhancements to
912(require 'ps-print) 932(require 'ps-print)
913 933
914 934
915(and (string< ps-print-version "6.5.7") 935(and (string< ps-print-version "6.6.4")
916 (error "`printing' requires `ps-print' package version 6.5.7 or later.")) 936 (error "`printing' requires `ps-print' package version 6.6.4 or later."))
917 937
918 938
919(eval-and-compile 939(eval-and-compile
@@ -1064,6 +1084,15 @@ Valid values are:
1064 path)) 1084 path))
1065 1085
1066 1086
1087(defun pr-standard-path (path)
1088 "Ensure the proper directory separator depending on the OS.
1089That is, if Emacs is running on DOS/Windows, ensure dos/windows-style directory
1090separator; otherwise, ensure unix-style directory separator."
1091 (if (or pr-cygwin-system ps-windows-system)
1092 (subst-char-in-string ?/ ?\\ path)
1093 (subst-char-in-string ?\\ ?/ path)))
1094
1095
1067;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1096;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1068;; User Interface (II) 1097;; User Interface (II)
1069 1098
@@ -2314,16 +2343,6 @@ It's used by `pr-interface'."
2314 :group 'printing) 2343 :group 'printing)
2315 2344
2316 2345
2317(defcustom pr-shell-file-name
2318 (if (and (not pr-cygwin-system)
2319 ps-windows-system)
2320 "cmdproxy.exe"
2321 shell-file-name)
2322 "*Specify file name to load inferior shells from."
2323 :type 'string
2324 :group 'printing)
2325
2326
2327;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 2346;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2328;; Internal Variables 2347;; Internal Variables
2329 2348
@@ -2410,6 +2429,7 @@ See `pr-ps-printer-alist'.")
2410 (and pr-auto-region transient-mark-mode mark-active))) 2429 (and pr-auto-region transient-mark-mode mark-active)))
2411 2430
2412 ((eq ps-print-emacs-type 'xemacs) ; XEmacs 2431 ((eq ps-print-emacs-type 'xemacs) ; XEmacs
2432 (defvar zmacs-region-stays nil) ; to avoid compilation gripes
2413 (defsubst pr-region-active-p () 2433 (defsubst pr-region-active-p ()
2414 (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p))))) 2434 (and pr-auto-region (not zmacs-region-stays) (ps-mark-active-p)))))
2415 2435
@@ -3792,9 +3812,7 @@ image in a file with that name."
3792 "Preview PostScript file FILENAME." 3812 "Preview PostScript file FILENAME."
3793 (interactive (list (pr-ps-infile-preprint "Preview "))) 3813 (interactive (list (pr-ps-infile-preprint "Preview ")))
3794 (and (stringp filename) (file-exists-p filename) 3814 (and (stringp filename) (file-exists-p filename)
3795 (let ((shell-file-name pr-shell-file-name)) 3815 (pr-call-process pr-gv-command filename)))
3796 (start-process-shell-command "PREVIEW" "*Messages*"
3797 (pr-command pr-gv-command) filename))))
3798 3816
3799 3817
3800;;;###autoload 3818;;;###autoload
@@ -3815,12 +3833,13 @@ image in a file with that name."
3815 (let* ((file (pr-expand-file-name filename)) 3833 (let* ((file (pr-expand-file-name filename))
3816 (tempfile (pr-dosify-path (make-temp-name file)))) 3834 (tempfile (pr-dosify-path (make-temp-name file))))
3817 ;; gs use 3835 ;; gs use
3818 (pr-shell-command 3836 (pr-call-process pr-gs-command
3819 (concat (pr-command pr-gs-command) 3837 (format "-sDEVICE=%s" pr-gs-device)
3820 " -sDEVICE=" pr-gs-device 3838 (format "-r%d" pr-gs-resolution)
3821 " -r" (int-to-string pr-gs-resolution) 3839 (pr-switches-string pr-gs-switches "pr-gs-switches")
3822 " " (pr-switches-string pr-gs-switches "pr-gs-switches") 3840 (format "-sOutputFile=\"%s\"" tempfile)
3823 " -sOutputFile=" tempfile " " file " -c quit")) 3841 file
3842 "-c quit")
3824 ;; printing 3843 ;; printing
3825 (pr-ps-file-print tempfile) 3844 (pr-ps-file-print tempfile)
3826 ;; deleting 3845 ;; deleting
@@ -3841,16 +3860,16 @@ image in a file with that name."
3841 (erase-buffer) 3860 (erase-buffer)
3842 (insert-file-contents-literally file)) 3861 (insert-file-contents-literally file))
3843 (pr-despool-print)) 3862 (pr-despool-print))
3844 (pr-shell-command 3863 (apply 'pr-call-process
3845 (concat (pr-command pr-ps-command) " " 3864 pr-ps-command
3846 (pr-switches-string pr-ps-switches "pr-gs-switches") " " 3865 (pr-switches-string pr-ps-switches "pr-gs-switches")
3847 (if (string-match "cp" pr-ps-command) 3866 (if (string-match "cp" pr-ps-command)
3848 ;; for "cp" (cmd in out) 3867 ;; for "cp" (cmd in out)
3849 (concat "\"" file "\" " 3868 (list file
3850 pr-ps-printer-switch pr-ps-printer) 3869 (concat pr-ps-printer-switch pr-ps-printer))
3851 ;; else, for others (cmd out in) 3870 ;; else, for others (cmd out in)
3852 (concat pr-ps-printer-switch pr-ps-printer 3871 (list (concat pr-ps-printer-switch pr-ps-printer)
3853 " \"" file "\"")))))))) 3872 file)))))))
3854 3873
3855 3874
3856;;;###autoload 3875;;;###autoload
@@ -4252,9 +4271,22 @@ Or choose the menu option Printing/Show Settings/printing."
4252 #'ps-print-quote 4271 #'ps-print-quote
4253 (list 4272 (list
4254 (concat "\n;;; printing.el version " pr-version "\n") 4273 (concat "\n;;; printing.el version " pr-version "\n")
4255 '(19 . pr-shell-file-name) 4274 ";; internal vars"
4256 '(19 . pr-path-style) 4275 (ps-comment-string "pr-txt-command " pr-txt-command)
4257 '(19 . pr-path-alist) 4276 (ps-comment-string "pr-txt-switches "
4277 (pr-switches-string pr-txt-switches "pr-txt-switches"))
4278 (ps-comment-string "pr-txt-printer " pr-txt-printer)
4279 (ps-comment-string "pr-ps-command " pr-ps-command)
4280 (ps-comment-string "pr-ps-switches "
4281 (pr-switches-string pr-ps-switches "pr-ps-switches"))
4282 (ps-comment-string "pr-ps-printer-switch" pr-ps-printer-switch)
4283 (ps-comment-string "pr-ps-printer " pr-ps-printer)
4284 (ps-comment-string "pr-cygwin-system " pr-cygwin-system)
4285 (ps-comment-string "ps-windows-system " ps-windows-system)
4286 (ps-comment-string "ps-lp-system " ps-lp-system)
4287 nil
4288 '(14 . pr-path-style)
4289 '(14 . pr-path-alist)
4258 nil 4290 nil
4259 '(21 . pr-txt-name) 4291 '(21 . pr-txt-name)
4260 '(21 . pr-txt-printer-alist) 4292 '(21 . pr-txt-printer-alist)
@@ -4570,6 +4602,7 @@ See `pr-visible-entry-alist'.")
4570 (cond 4602 (cond
4571 ((eq ps-print-emacs-type 'xemacs) 4603 ((eq ps-print-emacs-type 'xemacs)
4572 ;; XEmacs 4604 ;; XEmacs
4605 (defvar current-mouse-event nil) ; to avoid compilation gripes
4573 (defun pr-menu-position (entry index horizontal) 4606 (defun pr-menu-position (entry index horizontal)
4574 (pr-x-make-event 4607 (pr-x-make-event
4575 'button-release 4608 'button-release
@@ -4633,6 +4666,7 @@ See `pr-visible-entry-alist'.")
4633 4666
4634 ((eq ps-print-emacs-type 'xemacs) 4667 ((eq ps-print-emacs-type 'xemacs)
4635 ;; XEmacs 4668 ;; XEmacs
4669 (defvar current-menubar nil) ; to avoid compilation gripes
4636 (defun pr-menu-lookup (path) 4670 (defun pr-menu-lookup (path)
4637 (car (pr-x-find-menu-item current-menubar (cons "Printing" path)))) 4671 (car (pr-x-find-menu-item current-menubar (cons "Printing" path))))
4638 4672
@@ -4973,7 +5007,7 @@ non-nil."
4973 pr-ps-command (pr-dosify-path (nth 0 ps)) 5007 pr-ps-command (pr-dosify-path (nth 0 ps))
4974 pr-ps-switches (nth 1 ps) 5008 pr-ps-switches (nth 1 ps)
4975 pr-ps-printer-switch (nth 2 ps) 5009 pr-ps-printer-switch (nth 2 ps)
4976 pr-ps-printer (pr-dosify-path (nth 3 ps))) 5010 pr-ps-printer (nth 3 ps))
4977 (or (stringp pr-ps-command) 5011 (or (stringp pr-ps-command)
4978 (setq pr-ps-command 5012 (setq pr-ps-command
4979 (cond (ps-windows-system "print") 5013 (cond (ps-windows-system "print")
@@ -4998,7 +5032,7 @@ non-nil."
4998 (setq pr-txt-name value 5032 (setq pr-txt-name value
4999 pr-txt-command (pr-dosify-path (nth 0 txt)) 5033 pr-txt-command (pr-dosify-path (nth 0 txt))
5000 pr-txt-switches (nth 1 txt) 5034 pr-txt-switches (nth 1 txt)
5001 pr-txt-printer (pr-dosify-path (nth 2 txt)))) 5035 pr-txt-printer (nth 2 txt)))
5002 (or (stringp pr-txt-command) 5036 (or (stringp pr-txt-command)
5003 (setq pr-txt-command 5037 (setq pr-txt-command
5004 (cond (ps-windows-system "print") 5038 (cond (ps-windows-system "print")
@@ -5211,32 +5245,54 @@ non-nil."
5211 (let (item) 5245 (let (item)
5212 (and (stringp infile) (file-exists-p infile) 5246 (and (stringp infile) (file-exists-p infile)
5213 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist))) 5247 (setq item (cdr (assq pr-ps-utility pr-ps-utility-alist)))
5214 (pr-shell-command 5248 (pr-call-process (nth 0 item)
5215 (concat (pr-command (nth 0 item)) " " 5249 (pr-switches-string (nth 1 item)
5216 (pr-switches-string (nth 1 item) 5250 "pr-ps-utility-alist entry")
5217 "pr-ps-utility-alist entry") 5251 (pr-switches-string (nth 8 item)
5218 " " 5252 "pr-ps-utility-alist entry")
5219 (pr-switches-string (nth 8 item) 5253 (and (nth 2 item)
5220 "pr-ps-utility-alist entry") 5254 (format (nth 2 item) ps-paper-type))
5221 " " 5255 (format (nth 3 item) n-up)
5222 (and (nth 2 item) 5256 (and pr-file-landscape (nth 4 item))
5223 (format (nth 2 item) ps-paper-type)) 5257 (and pr-file-duplex (nth 5 item))
5224 " " (format (nth 3 item) n-up) " " 5258 (and pr-file-tumble (nth 6 item))
5225 (and pr-file-landscape (nth 4 item)) " " 5259 (pr-expand-file-name infile)
5226 (and pr-file-duplex (nth 5 item)) " " 5260 (nth 7 item)
5227 (and pr-file-tumble (nth 6 item)) 5261 (pr-expand-file-name outfile)))))
5228 " \"" (pr-expand-file-name infile) "\" " 5262
5229 (nth 7 item) 5263
5230 " \"" (pr-expand-file-name outfile) "\""))))) 5264(defun pr-remove-nil-from-list (lst)
5231 5265 (while (and lst (null (car lst)))
5232 5266 (setq lst (cdr lst)))
5233(defun pr-shell-command (command) 5267 (let ((b lst)
5234 (let ((shell-file-name pr-shell-file-name)) 5268 (l (cdr lst)))
5235 (shell-command command))) 5269 (while l
5270 (if (car l)
5271 (setq b l
5272 l (cdr l))
5273 (setq l (cdr l))
5274 (setcdr b l))))
5275 lst)
5276
5277
5278(defun pr-call-process (command &rest args)
5279 (let ((buffer (get-buffer-create "*Printing Command Output*"))
5280 (cmd (pr-command command))
5281 status)
5282 (setq args (pr-remove-nil-from-list args))
5283 (save-excursion
5284 (set-buffer buffer)
5285 (goto-char (point-max))
5286 (insert (format "%s %S\n" cmd args)))
5287 (setq status (apply 'call-process cmd nil buffer nil args))
5288 (save-excursion
5289 (set-buffer buffer)
5290 (goto-char (point-max))
5291 (insert (format "Exit status: %s\n" status)))))
5236 5292
5237 5293
5238(defun pr-txt-print (from to) 5294(defun pr-txt-print (from to)
5239 (let ((lpr-command (pr-command pr-txt-command)) 5295 (let ((lpr-command (pr-standard-path (pr-command pr-txt-command)))
5240 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches")) 5296 (lpr-switches (pr-switches pr-txt-switches "pr-txt-switches"))
5241 (printer-name pr-txt-printer)) 5297 (printer-name pr-txt-printer))
5242 (lpr-region from to))) 5298 (lpr-region from to)))
diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el
index c651e06b899..e679a48d642 100644
--- a/lisp/progmodes/cperl-mode.el
+++ b/lisp/progmodes/cperl-mode.el
@@ -1472,7 +1472,7 @@ or as help on variables `cperl-tips', `cperl-problems',
1472 (make-local-variable 'comment-start-skip) 1472 (make-local-variable 'comment-start-skip)
1473 (setq comment-start-skip "#+ *") 1473 (setq comment-start-skip "#+ *")
1474 (make-local-variable 'defun-prompt-regexp) 1474 (make-local-variable 'defun-prompt-regexp)
1475 (setq defun-prompt-regexp "^[ \t]*sub[ \t]+\\([^ \t\n{(;]+\\)\\([ \t]*([^()]*)[ \t]*\\)?[ \t]*") 1475 (setq defun-prompt-regexp "^[ \t]*sub[ \t\n]+\\([^ \t\n{(;]+\\)\\([ \t\n]*([^()]*)[ \t\n]*\\)?[ \t\n]*)")
1476 (make-local-variable 'comment-indent-function) 1476 (make-local-variable 'comment-indent-function)
1477 (setq comment-indent-function 'cperl-comment-indent) 1477 (setq comment-indent-function 'cperl-comment-indent)
1478 (make-local-variable 'parse-sexp-ignore-comments) 1478 (make-local-variable 'parse-sexp-ignore-comments)
diff --git a/lisp/replace.el b/lisp/replace.el
index a7c8b859402..60c28d6c48a 100644
--- a/lisp/replace.el
+++ b/lisp/replace.el
@@ -287,6 +287,7 @@ Third arg DELIMITED (prefix arg if interactive), if non-nil, means replace
287only matches that are surrounded by word boundaries. 287only matches that are surrounded by word boundaries.
288Fourth and fifth arg START and END specify the region to operate on." 288Fourth and fifth arg START and END specify the region to operate on."
289 (interactive 289 (interactive
290 (progn
290 (barf-if-buffer-read-only) 291 (barf-if-buffer-read-only)
291 (let* ((from 292 (let* ((from
292 ;; Let-bind the history var to disable the "foo -> bar" default. 293 ;; Let-bind the history var to disable the "foo -> bar" default.
@@ -305,7 +306,7 @@ Fourth and fifth arg START and END specify the region to operate on."
305 (if (and transient-mark-mode mark-active) 306 (if (and transient-mark-mode mark-active)
306 (region-beginning)) 307 (region-beginning))
307 (if (and transient-mark-mode mark-active) 308 (if (and transient-mark-mode mark-active)
308 (region-end))))) 309 (region-end))))))
309 (perform-replace regexp (cons 'replace-eval-replacement to-expr) 310 (perform-replace regexp (cons 'replace-eval-replacement to-expr)
310 t 'literal delimited nil nil start end)) 311 t 'literal delimited nil nil start end))
311 312
diff --git a/lisp/simple.el b/lisp/simple.el
index 8da9e8028f0..c45437fb123 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -3364,7 +3364,8 @@ With argument, do this that many times."
3364 "Return the symbol or word that point is on (or a nearby one) as a string. 3364 "Return the symbol or word that point is on (or a nearby one) as a string.
3365The return value includes no text properties. 3365The return value includes no text properties.
3366If optional arg STRICT is non-nil, return nil unless point is within 3366If optional arg STRICT is non-nil, return nil unless point is within
3367or adjacent to a symbol or word. 3367or adjacent to a symbol or word. In all cases the value can be nil
3368if there is no word nearby.
3368The function, belying its name, normally finds a symbol. 3369The function, belying its name, normally finds a symbol.
3369If optional arg REALLY-WORD is non-nil, it finds just a word." 3370If optional arg REALLY-WORD is non-nil, it finds just a word."
3370 (save-excursion 3371 (save-excursion
diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el
index 1220c046cb7..15e813c53d3 100644
--- a/lisp/term/mac-win.el
+++ b/lisp/term/mac-win.el
@@ -68,24 +68,29 @@
68 (goto-char (window-start window)) 68 (goto-char (window-start window))
69 (mac-scroll-up-line))))) 69 (mac-scroll-up-line)))))
70 70
71(defun mac-scroll-ignore-events ()
72 ;; Ignore confusing non-mouse events
73 (while (not (memq (car-safe (read-event))
74 '(mouse-1 double-mouse-1 triple-mouse-1))) nil))
75
71(defun mac-scroll-down () 76(defun mac-scroll-down ()
72 (track-mouse 77 (track-mouse
73 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 78 (mac-scroll-ignore-events)
74 (scroll-down))) 79 (scroll-down)))
75 80
76(defun mac-scroll-down-line () 81(defun mac-scroll-down-line ()
77 (track-mouse 82 (track-mouse
78 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 83 (mac-scroll-ignore-events)
79 (scroll-down 1))) 84 (scroll-down 1)))
80 85
81(defun mac-scroll-up () 86(defun mac-scroll-up ()
82 (track-mouse 87 (track-mouse
83 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 88 (mac-scroll-ignore-events)
84 (scroll-up))) 89 (scroll-up)))
85 90
86(defun mac-scroll-up-line () 91(defun mac-scroll-up-line ()
87 (track-mouse 92 (track-mouse
88 (while (not (eq (car-safe (read-event)) 'mouse-1)) nil) 93 (mac-scroll-ignore-events)
89 (scroll-up 1))) 94 (scroll-up 1)))
90 95
91(defun xw-defined-colors (&optional frame) 96(defun xw-defined-colors (&optional frame)
diff --git a/lisp/wid-edit.el b/lisp/wid-edit.el
index e6ce5ae71db..bdbe607317d 100644
--- a/lisp/wid-edit.el
+++ b/lisp/wid-edit.el
@@ -1144,7 +1144,7 @@ When not inside a field, move to the previous button or field."
1144 field))) 1144 field)))
1145 1145
1146(defun widget-field-buffer (widget) 1146(defun widget-field-buffer (widget)
1147 "Return the start of WIDGET's editing field." 1147 "Return the buffer of WIDGET's editing field."
1148 (let ((overlay (widget-get widget :field-overlay))) 1148 (let ((overlay (widget-get widget :field-overlay)))
1149 (cond ((overlayp overlay) 1149 (cond ((overlayp overlay)
1150 (overlay-buffer overlay)) 1150 (overlay-buffer overlay))
diff --git a/lisp/window.el b/lisp/window.el
index 188b3acf311..96bfc8b5581 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -34,7 +34,8 @@
34Also restore the selected window of each frame as it was at the start 34Also restore the selected window of each frame as it was at the start
35of this construct. 35of this construct.
36However, if a window has become dead, don't get an error, 36However, if a window has become dead, don't get an error,
37just refrain from reselecting it." 37just refrain from reselecting it.
38Return the value of the last form in BODY."
38 `(let ((save-selected-window-window (selected-window)) 39 `(let ((save-selected-window-window (selected-window))
39 ;; It is necessary to save all of these, because calling 40 ;; It is necessary to save all of these, because calling
40 ;; select-window changes frame-selected-window for whatever 41 ;; select-window changes frame-selected-window for whatever
@@ -63,15 +64,17 @@ This does not include the mode line (if any) or the header line (if any)."
63 (if header-line-format 1 0)))))) 64 (if header-line-format 1 0))))))
64 65
65(defun one-window-p (&optional nomini all-frames) 66(defun one-window-p (&optional nomini all-frames)
66 "Return non-nil if the selected window is the only window (in its frame). 67 "Return non-nil if the selected window is the only window.
67Optional arg NOMINI non-nil means don't count the minibuffer 68Optional arg NOMINI non-nil means don't count the minibuffer
68even if it is active. 69even if it is active. Otherwise, the minibuffer is counted
70when it is active.
69 71
70The optional arg ALL-FRAMES t means count windows on all frames. 72The optional arg ALL-FRAMES t means count windows on all frames.
71If it is `visible', count windows on all visible frames. 73If it is `visible', count windows on all visible frames.
72ALL-FRAMES nil or omitted means count only the selected frame, 74ALL-FRAMES nil or omitted means count only the selected frame,
73plus the minibuffer it uses (which may be on another frame). 75plus the minibuffer it uses (which may be on another frame).
74If ALL-FRAMES is neither nil nor t, count only the selected frame." 76ALL-FRAMES 0 means count all windows in all visible or iconified frames.
77If ALL-FRAMES is anything else, count only the selected frame."
75 (let ((base-window (selected-window))) 78 (let ((base-window (selected-window)))
76 (if (and nomini (eq base-window (minibuffer-window))) 79 (if (and nomini (eq base-window (minibuffer-window)))
77 (setq base-window (next-window base-window))) 80 (setq base-window (next-window base-window)))
@@ -87,7 +90,7 @@ bars (top, bottom, or nil)."
87 (let ((vert (nth 2 (window-scroll-bars window))) 90 (let ((vert (nth 2 (window-scroll-bars window)))
88 (hor nil)) 91 (hor nil))
89 (when (or (eq vert t) (eq hor t)) 92 (when (or (eq vert t) (eq hor t))
90 (let ((fcsb (frame-current-scroll-bars 93 (let ((fcsb (frame-current-scroll-bars
91 (window-frame (or window (selected-window)))))) 94 (window-frame (or window (selected-window))))))
92 (if (eq vert t) 95 (if (eq vert t)
93 (setq vert (car fcsb))) 96 (setq vert (car fcsb)))
@@ -268,29 +271,38 @@ If WINDOW is nil or omitted, it defaults to the currently selected window."
268 271
269;; I think this should be the default; I think people will prefer it--rms. 272;; I think this should be the default; I think people will prefer it--rms.
270(defcustom split-window-keep-point t 273(defcustom split-window-keep-point t
271 "*If non-nil, split windows keeps the original point in both children. 274 "*If non-nil, \\[split-window-vertically] keeps the original point \
275in both children.
272This is often more convenient for editing. 276This is often more convenient for editing.
273If nil, adjust point in each of the two windows to minimize redisplay. 277If nil, adjust point in each of the two windows to minimize redisplay.
274This is convenient on slow terminals, but point can move strangely." 278This is convenient on slow terminals, but point can move strangely.
279
280This option applies only to `split-window-vertically' and
281functions that call it. `split-window' always keeps the original
282point in both children,"
275 :type 'boolean 283 :type 'boolean
276 :group 'windows) 284 :group 'windows)
277 285
278(defun split-window-vertically (&optional arg) 286(defun split-window-vertically (&optional arg)
279 "Split current window into two windows, one above the other. 287 "Split current window into two windows, one above the other.
280The uppermost window gets ARG lines and the other gets the rest. 288The uppermost window gets ARG lines and the other gets the rest.
281Negative arg means select the size of the lowermost window instead. 289Negative ARG means select the size of the lowermost window instead.
282With no argument, split equally or close to it. 290With no argument, split equally or close to it.
283Both windows display the same buffer now current. 291Both windows display the same buffer now current.
284 292
285If the variable `split-window-keep-point' is non-nil, both new windows 293If the variable `split-window-keep-point' is non-nil, both new windows
286will get the same value of point as the current window. This is often 294will get the same value of point as the current window. This is often
287more convenient for editing. 295more convenient for editing. The upper window is the selected window.
288 296
289Otherwise, we chose window starts so as to minimize the amount of 297Otherwise, we choose window starts so as to minimize the amount of
290redisplay; this is convenient on slow terminals. The new selected 298redisplay; this is convenient on slow terminals. The new selected
291window is the one that the current value of point appears in. The 299window is the one that the current value of point appears in. The
292value of point can change if the text around point is hidden by the 300value of point can change if the text around point is hidden by the
293new mode line." 301new mode line.
302
303Regardless of the value of `split-window-keep-point', the upper
304window is the original one and the return value is the new, lower
305window."
294 (interactive "P") 306 (interactive "P")
295 (let ((old-w (selected-window)) 307 (let ((old-w (selected-window))
296 (old-point (point)) 308 (old-point (point))
@@ -338,10 +350,13 @@ new mode line."
338(defun split-window-horizontally (&optional arg) 350(defun split-window-horizontally (&optional arg)
339 "Split current window into two windows side by side. 351 "Split current window into two windows side by side.
340This window becomes the leftmost of the two, and gets ARG columns. 352This window becomes the leftmost of the two, and gets ARG columns.
341Negative arg means select the size of the rightmost window instead. 353Negative ARG means select the size of the rightmost window instead.
342The argument includes the width of the window's scroll bar; if there 354The argument includes the width of the window's scroll bar; if there
343are no scroll bars, it includes the width of the divider column 355are no scroll bars, it includes the width of the divider column
344to the window's right, if any. No arg means split equally." 356to the window's right, if any. No ARG means split equally.
357
358The original, leftmost window remains selected.
359The return value is the new, rightmost window."
345 (interactive "P") 360 (interactive "P")
346 (let ((old-w (selected-window)) 361 (let ((old-w (selected-window))
347 (size (and arg (prefix-numeric-value arg)))) 362 (size (and arg (prefix-numeric-value arg))))
diff --git a/lisp/xml.el b/lisp/xml.el
index 03ef6346c70..993ef59b276 100644
--- a/lisp/xml.el
+++ b/lisp/xml.el
@@ -84,6 +84,20 @@
84;;** 84;;**
85;;******************************************************************* 85;;*******************************************************************
86 86
87(defvar xml-entity-alist
88 '(("lt" . "<")
89 ("gt" . ">")
90 ("apos" . "'")
91 ("quot" . "\"")
92 ("amp" . "&"))
93 "The defined entities. Entities are added to this when the DTD is parsed.")
94
95(defvar xml-sub-parser nil
96 "Dynamically set this to a non-nil value if you want to parse an XML fragment.")
97
98(defvar xml-validating-parser nil
99 "Set to non-nil to get validity checking.")
100
87(defsubst xml-node-name (node) 101(defsubst xml-node-name (node)
88 "Return the tag associated with NODE. 102 "Return the tag associated with NODE.
89Without namespace-aware parsing, the tag is a symbol. 103Without namespace-aware parsing, the tag is a symbol.
@@ -164,6 +178,48 @@ If PARSE-NS is non-nil, then QNAMES are expanded."
164 (kill-buffer (current-buffer))) 178 (kill-buffer (current-buffer)))
165 xml))) 179 xml)))
166 180
181
182(let* ((start-chars (concat ":[:alpha:]_"))
183 (name-chars (concat "-[:digit:]." start-chars))
184;;[3] S ::= (#x20 | #x9 | #xD | #xA)+
185 (whitespace "[ \t\n\r]"))
186;;[4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6]
187;; | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF]
188;; | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF]
189;; | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
190 (defvar xml-name-start-char-re (concat "[" start-chars "]"))
191;;[4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
192 (defvar xml-name-char-re (concat "[" name-chars "]"))
193;;[5] Name ::= NameStartChar (NameChar)*
194 (defvar xml-name-re (concat xml-name-start-char-re xml-name-char-re "*"))
195;;[6] Names ::= Name (#x20 Name)*
196 (defvar xml-names-re (concat xml-name-re "\\(?: " xml-name-re "\\)*"))
197;;[7] Nmtoken ::= (NameChar)+
198 (defvar xml-nmtoken-re (concat xml-name-char-re "+"))
199;;[8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*
200 (defvar xml-nmtokens-re (concat xml-nmtoken-re "\\(?: " xml-name-re "\\)*"))
201;;[66] CharRef ::= '&#' [0-9]+ ';' | '&#x' [0-9a-fA-F]+ ';'
202 (defvar xml-char-ref-re "\\(?:&#[0-9]+;\\|&#x[0-9a-fA-F]+;\\)")
203;;[68] EntityRef ::= '&' Name ';'
204 (defvar xml-entity-ref (concat "&" xml-name-re ";"))
205;;[69] PEReference ::= '%' Name ';'
206 (defvar xml-pe-reference-re (concat "%" xml-name-re ";"))
207;;[67] Reference ::= EntityRef | CharRef
208 (defvar xml-reference-re (concat "\\(?:" xml-entity-ref "\\|" xml-char-ref-re "\\)"))
209;;[9] EntityValue ::= '"' ([^%&"] | PEReference | Reference)* '"'
210;; | "'" ([^%&'] | PEReference | Reference)* "'"
211 (defvar xml-entity-value-re (concat "\\(?:\"\\(?:[^%&\"]\\|" xml-pe-reference-re
212 "\\|" xml-reference-re "\\)*\"\\|'\\(?:[^%&']\\|"
213 xml-pe-reference-re "\\|" xml-reference-re "\\)*'\\)")))
214;;[75] ExternalID ::= 'SYSTEM' S SystemLiteral
215;; | 'PUBLIC' S PubidLiteral S SystemLiteral
216;;[76] NDataDecl ::= S 'NDATA' S
217;;[73] EntityDef ::= EntityValue| (ExternalID NDataDecl?)
218;;[71] GEDecl ::= '<!ENTITY' S Name S EntityDef S? '>'
219;;[74] PEDef ::= EntityValue | ExternalID
220;;[72] PEDecl ::= '<!ENTITY' S '%' S Name S PEDef S? '>'
221;;[70] EntityDecl ::= GEDecl | PEDecl
222
167;; Note that this is setup so that we can do whitespace-skipping with 223;; Note that this is setup so that we can do whitespace-skipping with
168;; `(skip-syntax-forward " ")', inter alia. Previously this was slow 224;; `(skip-syntax-forward " ")', inter alia. Previously this was slow
169;; compared with `re-search-forward', but that has been fixed. Also 225;; compared with `re-search-forward', but that has been fixed. Also
@@ -229,9 +285,9 @@ If PARSE-NS is non-nil, then QNAMES are expanded."
229 (progn 285 (progn
230 (forward-char -1) 286 (forward-char -1)
231 (setq result (xml-parse-tag parse-dtd parse-ns)) 287 (setq result (xml-parse-tag parse-dtd parse-ns))
232 (if (and xml result) 288 (if (and xml result (not xml-sub-parser))
233 ;; translation of rule [1] of XML specifications 289 ;; translation of rule [1] of XML specifications
234 (error "XML files can have only one toplevel tag") 290 (error "XML: (Not Well-Formed) Only one root tag allowed")
235 (cond 291 (cond
236 ((null result)) 292 ((null result))
237 ((and (listp (car result)) 293 ((and (listp (car result))
@@ -265,10 +321,24 @@ specify that the name shouldn't be given a namespace."
265 ;; matching cons in xml-ns. In which case we 321 ;; matching cons in xml-ns. In which case we
266 (ns (or (cdr (assoc (if special "xmlns" prefix) 322 (ns (or (cdr (assoc (if special "xmlns" prefix)
267 xml-ns)) 323 xml-ns))
268 :))) 324 "")))
269 (cons ns (if special "" lname))) 325 (cons ns (if special "" lname)))
270 (intern name))) 326 (intern name)))
271 327
328(defun xml-parse-fragment (&optional parse-dtd parse-ns)
329 "Parse xml-like fragments."
330 (let ((xml-sub-parser t)
331 children)
332 (while (not (eobp))
333 (let ((bit (xml-parse-tag
334 parse-dtd parse-ns)))
335 (if children
336 (setq children (append (list bit) children))
337 (if (stringp bit)
338 (setq children (list bit))
339 (setq children bit)))))
340 (reverse children)))
341
272(defun xml-parse-tag (&optional parse-dtd parse-ns) 342(defun xml-parse-tag (&optional parse-dtd parse-ns)
273 "Parse the tag at point. 343 "Parse the tag at point.
274If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and 344If PARSE-DTD is non-nil, the DTD of the document, if any, is parsed and
@@ -278,16 +348,17 @@ Returns one of:
278 - a list : the matching node 348 - a list : the matching node
279 - nil : the point is not looking at a tag. 349 - nil : the point is not looking at a tag.
280 - a pair : the first element is the DTD, the second is the node." 350 - a pair : the first element is the DTD, the second is the node."
281 (let ((xml-ns (if (consp parse-ns) 351 (let ((xml-validating-parser (or parse-dtd xml-validating-parser))
352 (xml-ns (if (consp parse-ns)
282 parse-ns 353 parse-ns
283 (if parse-ns 354 (if parse-ns
284 (list 355 (list
285 ;; Default for empty prefix is no namespace 356 ;; Default for empty prefix is no namespace
286 (cons "" :) 357 (cons "" "")
287 ;; "xml" namespace 358 ;; "xml" namespace
288 (cons "xml" :http://www.w3.org/XML/1998/namespace) 359 (cons "xml" "http://www.w3.org/XML/1998/namespace")
289 ;; We need to seed the xmlns namespace 360 ;; We need to seed the xmlns namespace
290 (cons "xmlns" :http://www.w3.org/2000/xmlns/)))))) 361 (cons "xmlns" "http://www.w3.org/2000/xmlns/"))))))
291 (cond 362 (cond
292 ;; Processing instructions (like the <?xml version="1.0"?> tag at the 363 ;; Processing instructions (like the <?xml version="1.0"?> tag at the
293 ;; beginning of a document). 364 ;; beginning of a document).
@@ -299,18 +370,15 @@ Returns one of:
299 ((looking-at "<!\\[CDATA\\[") 370 ((looking-at "<!\\[CDATA\\[")
300 (let ((pos (match-end 0))) 371 (let ((pos (match-end 0)))
301 (unless (search-forward "]]>" nil t) 372 (unless (search-forward "]]>" nil t)
302 (error "CDATA section does not end anywhere in the document")) 373 (error "XML: (Not Well Formed) CDATA section does not end anywhere in the document"))
303 (buffer-substring pos (match-beginning 0)))) 374 (buffer-substring pos (match-beginning 0))))
304 ;; DTD for the document 375 ;; DTD for the document
305 ((looking-at "<!DOCTYPE") 376 ((looking-at "<!DOCTYPE")
306 (let (dtd) 377 (let ((dtd (xml-parse-dtd parse-ns)))
307 (if parse-dtd 378 (skip-syntax-forward " ")
308 (setq dtd (xml-parse-dtd)) 379 (if xml-validating-parser
309 (xml-skip-dtd)) 380 (cons dtd (xml-parse-tag nil xml-ns))
310 (skip-syntax-forward " ") 381 (xml-parse-tag nil xml-ns))))
311 (if dtd
312 (cons dtd (xml-parse-tag nil xml-ns))
313 (xml-parse-tag nil xml-ns))))
314 ;; skip comments 382 ;; skip comments
315 ((looking-at "<!--") 383 ((looking-at "<!--")
316 (search-forward "-->") 384 (search-forward "-->")
@@ -332,65 +400,76 @@ Returns one of:
332 (when (consp xml-ns) 400 (when (consp xml-ns)
333 (dolist (attr attrs) 401 (dolist (attr attrs)
334 (when (and (consp (car attr)) 402 (when (and (consp (car attr))
335 (eq :http://www.w3.org/2000/xmlns/ 403 (equal "http://www.w3.org/2000/xmlns/"
336 (caar attr))) 404 (caar attr)))
337 (push (cons (cdar attr) (intern (concat ":" (cdr attr)))) 405 (push (cons (cdar attr) (cdr attr))
338 xml-ns)))) 406 xml-ns))))
339 407
340 (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns))) 408 (setq children (list attrs (xml-maybe-do-ns node-name "" xml-ns)))
341 409
342 ;; is this an empty element ? 410 ;; is this an empty element ?
343 (if (looking-at "/>") 411 (if (looking-at "/>")
344 (progn
345 (forward-char 2)
346 (nreverse children))
347
348 ;; is this a valid start tag ?
349 (if (eq (char-after) ?>)
350 (progn 412 (progn
351 (forward-char 1) 413 (forward-char 2)
352 ;; Now check that we have the right end-tag. Note that this
353 ;; one might contain spaces after the tag name
354 (let ((end (concat "</" node-name "\\s-*>")))
355 (while (not (looking-at end))
356 (cond
357 ((looking-at "</")
358 (error "XML: Invalid end tag (expecting %s) at pos %d"
359 node-name (point)))
360 ((= (char-after) ?<)
361 (let ((tag (xml-parse-tag nil xml-ns)))
362 (when tag
363 (push tag children))))
364 (t
365 (setq pos (point))
366 (search-forward "<")
367 (forward-char -1)
368 (let ((string (buffer-substring pos (point)))
369 (pos 0))
370
371 ;; Clean up the string. As per XML
372 ;; specifications, the XML processor should
373 ;; always pass the whole string to the
374 ;; application. But \r's should be replaced:
375 ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends
376 (while (string-match "\r\n?" string pos)
377 (setq string (replace-match "\n" t t string))
378 (setq pos (1+ (match-beginning 0))))
379
380 (setq string (xml-substitute-special string))
381 (setq children
382 (if (stringp (car children))
383 ;; The two strings were separated by a comment.
384 (cons (concat (car children) string)
385 (cdr children))
386 (cons string children))))))))
387
388 (goto-char (match-end 0))
389 (nreverse children)) 414 (nreverse children))
390 ;; This was an invalid start tag 415
391 (error "XML: Invalid attribute list"))))) 416 ;; is this a valid start tag ?
392 (t ;; This is not a tag. 417 (if (eq (char-after) ?>)
393 (error "XML: Invalid character"))))) 418 (progn
419 (forward-char 1)
420 ;; Now check that we have the right end-tag. Note that this
421 ;; one might contain spaces after the tag name
422 (let ((end (concat "</" node-name "\\s-*>")))
423 (while (not (looking-at end))
424 (cond
425 ((looking-at "</")
426 (error "XML: (Not Well-Formed) Invalid end tag (expecting %s) at pos %d"
427 node-name (point)))
428 ((= (char-after) ?<)
429 (let ((tag (xml-parse-tag nil xml-ns)))
430 (when tag
431 (push tag children))))
432 (t
433 (let ((expansion (xml-parse-string)))
434 (setq children
435 (if (stringp expansion)
436 (if (stringp (car children))
437 ;; The two strings were separated by a comment.
438 (setq children (append (concat (car children) expansion)
439 (cdr children)))
440 (setq children (append (list expansion) children)))
441 (setq children (append expansion children))))))))
442
443 (goto-char (match-end 0))
444 (nreverse children)))
445 ;; This was an invalid start tag (Expected ">", but didn't see it.)
446 (error "XML: (Well-Formed) Couldn't parse tag: %s"
447 (buffer-substring (- (point) 10) (+ (point) 1)))))))
448 (t ;; (Not one of PI, CDATA, Comment, End tag, or Start tag)
449 (unless xml-sub-parser ; Usually, we error out.
450 (error "XML: (Well-Formed) Invalid character"))
451
452 ;; However, if we're parsing incrementally, then we need to deal
453 ;; with stray CDATA.
454 (xml-parse-string)))))
455
456(defun xml-parse-string ()
457 "Parse the next whatever. Could be a string, or an element."
458 (let* ((pos (point))
459 (string (progn (if (search-forward "<" nil t)
460 (forward-char -1)
461 (goto-char (point-max)))
462 (buffer-substring pos (point)))))
463 ;; Clean up the string. As per XML specifications, the XML
464 ;; processor should always pass the whole string to the
465 ;; application. But \r's should be replaced:
466 ;; http://www.w3.org/TR/2000/REC-xml-20001006#sec-line-ends
467 (setq pos 0)
468 (while (string-match "\r\n?" string pos)
469 (setq string (replace-match "\n" t t string))
470 (setq pos (1+ (match-beginning 0))))
471
472 (xml-substitute-special string)))
394 473
395(defun xml-parse-attlist (&optional xml-ns) 474(defun xml-parse-attlist (&optional xml-ns)
396 "Return the attribute-list after point. 475 "Return the attribute-list after point.
@@ -412,18 +491,23 @@ Leave point at the first non-blank character after the tag."
412 (setq end-pos (match-end 0)) 491 (setq end-pos (match-end 0))
413 (if (looking-at "'\\([^']*\\)'") 492 (if (looking-at "'\\([^']*\\)'")
414 (setq end-pos (match-end 0)) 493 (setq end-pos (match-end 0))
415 (error "XML: Attribute values must be given between quotes"))) 494 (error "XML: (Not Well-Formed) Attribute values must be given between quotes")))
416 495
417 ;; Each attribute must be unique within a given element 496 ;; Each attribute must be unique within a given element
418 (if (assoc name attlist) 497 (if (assoc name attlist)
419 (error "XML: each attribute must be unique within an element")) 498 (error "XML: (Not Well-Formed) Each attribute must be unique within an element"))
420 499
421 ;; Multiple whitespace characters should be replaced with a single one 500 ;; Multiple whitespace characters should be replaced with a single one
422 ;; in the attributes 501 ;; in the attributes
423 (let ((string (match-string 1)) 502 (let ((string (match-string 1))
424 (pos 0)) 503 (pos 0))
425 (replace-regexp-in-string "\\s-\\{2,\\}" " " string) 504 (replace-regexp-in-string "\\s-\\{2,\\}" " " string)
426 (push (cons name (xml-substitute-special string)) attlist)) 505 (let ((expansion (xml-substitute-special string)))
506 (unless (stringp expansion)
507 ; We say this is the constraint. It is acctually that
508 ; external entities nor "<" can be in an attribute value.
509 (error "XML: (Not Well-Formed) Entities in attributes cannot expand into elements"))
510 (push (cons name expansion) attlist)))
427 511
428 (goto-char end-pos) 512 (goto-char end-pos)
429 (skip-syntax-forward " ")) 513 (skip-syntax-forward " "))
@@ -442,24 +526,16 @@ Leave point at the first non-blank character after the tag."
442(defun xml-skip-dtd () 526(defun xml-skip-dtd ()
443 "Skip the DTD at point. 527 "Skip the DTD at point.
444This follows the rule [28] in the XML specifications." 528This follows the rule [28] in the XML specifications."
445 (forward-char (length "<!DOCTYPE")) 529 (let ((xml-validating-parser nil))
446 (if (looking-at "\\s-*>") 530 (xml-parse-dtd)))
447 (error "XML: invalid DTD (excepting name of the document)"))
448 (condition-case nil
449 (progn
450 (forward-sexp)
451 (skip-syntax-forward " ")
452 (if (looking-at "\\[")
453 (re-search-forward "]\\s-*>")
454 (search-forward ">")))
455 (error (error "XML: No end to the DTD"))))
456 531
457(defun xml-parse-dtd () 532(defun xml-parse-dtd (&optional parse-ns)
458 "Parse the DTD at point." 533 "Parse the DTD at point."
459 (forward-char (eval-when-compile (length "<!DOCTYPE"))) 534 (forward-char (eval-when-compile (length "<!DOCTYPE")))
460 (skip-syntax-forward " ") 535 (skip-syntax-forward " ")
461 (if (looking-at ">") 536 (if (and (looking-at ">")
462 (error "XML: invalid DTD (excepting name of the document)")) 537 xml-validating-parser)
538 (error "XML: (Validity) Invalid DTD (expecting name of the document)"))
463 539
464 ;; Get the name of the document 540 ;; Get the name of the document
465 (looking-at xml-name-regexp) 541 (looking-at xml-name-regexp)
@@ -477,27 +553,27 @@ This follows the rule [28] in the XML specifications."
477 (re-search-forward 553 (re-search-forward
478 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'" 554 "\\='\\([[:space:][:alnum:]-()+,./:=?;!*#@$_%]*\\)'"
479 nil t)) 555 nil t))
480 (error "XML: missing public id")) 556 (error "XML: Missing Public ID"))
481 (let ((pubid (match-string 1))) 557 (let ((pubid (match-string 1)))
558 (skip-syntax-forward " ")
482 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) 559 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
483 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) 560 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t))
484 (error "XML: missing system id")) 561 (error "XML: Missing System ID"))
485 (push (list pubid (match-string 1) 'public) dtd))) 562 (push (list pubid (match-string 1) 'public) dtd)))
486 ((looking-at "SYSTEM\\s-+") 563 ((looking-at "SYSTEM\\s-+")
487 (goto-char (match-end 0)) 564 (goto-char (match-end 0))
488 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t) 565 (unless (or (re-search-forward "\\='\\([^']*\\)'" nil t)
489 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t)) 566 (re-search-forward "\\=\"\\([^\"]*\\)\"" nil t))
490 (error "XML: missing system id")) 567 (error "XML: Missing System ID"))
491 (push (list (match-string 1) 'system) dtd))) 568 (push (list (match-string 1) 'system) dtd)))
492 (skip-syntax-forward " ") 569 (skip-syntax-forward " ")
493 (if (eq ?> (char-after)) 570 (if (eq ?> (char-after))
494 (forward-char) 571 (forward-char)
495 (skip-syntax-forward " ")
496 (if (not (eq (char-after) ?\[)) 572 (if (not (eq (char-after) ?\[))
497 (error "XML: bad DTD") 573 (error "XML: Bad DTD")
498 (forward-char) 574 (forward-char)
499 ;; Parse the rest of the DTD 575 ;; Parse the rest of the DTD
500 ;; Fixme: Deal with ENTITY, ATTLIST, NOTATION, PIs. 576 ;; Fixme: Deal with ATTLIST, NOTATION, PIs.
501 (while (not (looking-at "\\s-*\\]")) 577 (while (not (looking-at "\\s-*\\]"))
502 (skip-syntax-forward " ") 578 (skip-syntax-forward " ")
503 (cond 579 (cond
@@ -521,11 +597,13 @@ This follows the rule [28] in the XML specifications."
521 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution 597 ((string-match "^%[^;]+;[ \t\n\r]*$" type) ;; substitution
522 nil) 598 nil)
523 (t 599 (t
524 (error "XML: Invalid element type in the DTD"))) 600 (if xml-validating-parser
601 error "XML: (Validity) Invalid element type in the DTD")))
525 602
526 ;; rule [45]: the element declaration must be unique 603 ;; rule [45]: the element declaration must be unique
527 (if (assoc element dtd) 604 (if (and (assoc element dtd)
528 (error "XML: element declarations must be unique in a DTD (<%s>)" 605 xml-validating-parser)
606 (error "XML: (Validity) Element declarations must be unique in a DTD (<%s>)"
529 element)) 607 element))
530 608
531 ;; Store the element in the DTD 609 ;; Store the element in the DTD
@@ -533,12 +611,49 @@ This follows the rule [28] in the XML specifications."
533 (goto-char end-pos)) 611 (goto-char end-pos))
534 ((looking-at "<!--") 612 ((looking-at "<!--")
535 (search-forward "-->")) 613 (search-forward "-->"))
536 614 ((looking-at (concat "<!ENTITY[ \t\n\r]*\\(" xml-name-re
615 "\\)[ \t\n\r]*\\(" xml-entity-value-re
616 "\\)[ \t\n\r]*>"))
617 (let ((name (buffer-substring (nth 2 (match-data))
618 (nth 3 (match-data))))
619 (value (buffer-substring (+ (nth 4 (match-data)) 1)
620 (- (nth 5 (match-data)) 1))))
621 (goto-char (nth 1 (match-data)))
622 (setq xml-entity-alist
623 (append xml-entity-alist
624 (list (cons name
625 (with-temp-buffer
626 (insert value)
627 (goto-char (point-min))
628 (xml-parse-fragment
629 xml-validating-parser
630 parse-ns))))))))
631 ((or (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re
632 "\\)[ \t\n\r]+SYSTEM[ \t\n\r]+"
633 "\\(\"[^\"]*\"\\|'[^']*'\\)[ \t\n\r]*>"))
634 (looking-at (concat "<!ENTITY[ \t\n\r]+\\(" xml-name-re
635 "\\)[ \t\n\r]+PUBLIC[ \t\n\r]+"
636 "\"[- \r\na-zA-Z0-9'()+,./:=?;!*#@$_%]*\""
637 "\\|'[- \r\na-zA-Z0-9()+,./:=?;!*#@$_%]*'"
638 "[ \t\n\r]+\\(\"[^\"]*\"\\|'[^']*'\\)"
639 "[ \t\n\r]*>")))
640 (let ((name (buffer-substring (nth 2 (match-data))
641 (nth 3 (match-data))))
642 (file (buffer-substring (+ (nth 4 (match-data)) 1)
643 (- (nth 5 (match-data)) 1))))
644 (goto-char (nth 1 (match-data)))
645 (setq xml-entity-alist
646 (append xml-entity-alist
647 (list (cons name (with-temp-buffer
648 (insert-file-contents file)
649 (goto-char (point-min))
650 (xml-parse-fragment
651 xml-validating-parser
652 parse-ns))))))))
537 (t 653 (t
538 (error "XML: Invalid DTD item"))) 654 (error "XML: (Validity) Invalid DTD item")))))
539 655 (if (looking-at "\\s-*]>")
540 ;; Skip the end of the DTD 656 (goto-char (nth 1 (match-data)))))
541 (search-forward ">"))))
542 (nreverse dtd))) 657 (nreverse dtd)))
543 658
544(defun xml-parse-elem-type (string) 659(defun xml-parse-elem-type (string)
@@ -580,41 +695,72 @@ This follows the rule [28] in the XML specifications."
580;;** 695;;**
581;;******************************************************************* 696;;*******************************************************************
582 697
583(eval-when-compile
584 (defvar str)) ; dynamic from replace-regexp-in-string
585
586;; Fixme: Take declared entities from the DTD when they're available.
587(defun xml-substitute-entity (match)
588 "Subroutine of `xml-substitute-special'."
589 (save-match-data
590 (let ((match1 (match-string 1 str)))
591 (cond ((string= match1 "lt") "<")
592 ((string= match1 "gt") ">")
593 ((string= match1 "apos") "'")
594 ((string= match1 "quot") "\"")
595 ((string= match1 "amp") "&")
596 ((and (string-match "#\\([0-9]+\\)" match1)
597 (let ((c (decode-char
598 'ucs
599 (string-to-number (match-string 1 match1)))))
600 (if c (string c))))) ; else unrepresentable
601 ((and (string-match "#x\\([[:xdigit:]]+\\)" match1)
602 (let ((c (decode-char
603 'ucs
604 (string-to-number (match-string 1 match1) 16))))
605 (if c (string c)))))
606 ;; Default to asis. Arguably, unrepresentable code points
607 ;; might be best replaced with U+FFFD.
608 (t match)))))
609
610(defun xml-substitute-special (string) 698(defun xml-substitute-special (string)
611 "Return STRING, after subsituting entity references." 699 "Return STRING, after subsituting entity references."
612 ;; This originally made repeated passes through the string from the 700 ;; This originally made repeated passes through the string from the
613 ;; beginning, which isn't correct, since then either "&amp;amp;" or 701 ;; beginning, which isn't correct, since then either "&amp;amp;" or
614 ;; "&#38;amp;" won't DTRT. 702 ;; "&#38;amp;" won't DTRT.
615 (replace-regexp-in-string "&\\([^;]+\\);"
616 #'xml-substitute-entity string t t))
617 703
704 (let ((point 0)
705 children end-point)
706 (while (string-match "&\\([^;]+\\);" string point)
707 (setq end-point (match-end 0))
708 (let* ((this-part (match-string 1 string))
709 (prev-part (substring string point (match-beginning 0)))
710 (entity (assoc this-part xml-entity-alist))
711 (expansion
712 (cond ((string-match "#\\([0-9]+\\)" this-part)
713 (let ((c (decode-char
714 'ucs
715 (string-to-number (match-string 1 this-part)))))
716 (if c (string c))))
717 ((string-match "#x\\([[:xdigit:]]+\\)" this-part)
718 (let ((c (decode-char
719 'ucs
720 (string-to-number (match-string 1 this-part) 16))))
721 (if c (string c))))
722 (entity
723 (cdr entity))
724 (t
725 (if xml-validating-parser
726 (error "XML: (Validity) Undefined entity `%s'"
727 (match-string 1 this-part)))))))
728
729 (cond ((null children)
730 (if (stringp expansion)
731 (setq children (concat prev-part expansion))
732 (if (stringp (car (last expansion)))
733 (progn
734 (setq children
735 (list (concat prev-part (car expansion))
736 (cdr expansion))))
737 (setq children (append expansion prev-part)))))
738 ((stringp children)
739 (if (stringp expansion)
740 (setq children (concat children prev-part expansion))
741 (setq children (list expansion (concat prev-part children)))))
742 ((and (stringp expansion)
743 (stringp (car children)))
744 (setcar children (concat prev-part expansion (car children))))
745 ((stringp expansion)
746 (setq children (append (concat prev-part expansion)
747 children)))
748 ((stringp (car children))
749 (setcar children (concat (car children) prev-part))
750 (setq children (append expansion children)))
751 (t
752 (setq children (list expansion
753 prev-part
754 children))))
755 (setq point end-point)))
756 (cond ((stringp children)
757 (concat children (substring string point)))
758 ((stringp (car (last children)))
759 (concat (car children) (substring string point)))
760 ((null children)
761 string)
762 (t
763 (nreverse children)))))
618;;******************************************************************* 764;;*******************************************************************
619;;** 765;;**
620;;** Printing a tree. 766;;** Printing a tree.