annotate lisp/subr.el @ 5518:3cc7470ea71c

gnuclient: if TMPDIR was set and connect failed, try again with /tmp 2011-06-03 Aidan Kehoe <kehoea@parhasard.net> * gnuslib.c (connect_to_unix_server): Retry with /tmp as a directory in which to search for Unix sockets if an attempt to connect with some other directory failed (which may be because gnuclient and gnuserv don't share an environment value for TMPDIR, or because gnuserv was compiled with USE_TMPDIR turned off).
author Aidan Kehoe <kehoea@parhasard.net>
date Fri, 03 Jun 2011 18:40:57 +0100
parents b0d87f92e60b
children 544e6336d37c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; subr.el --- basic lisp subroutines for XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
2525
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
3 ;; Copyright (C) 1985, 86, 92, 94, 95, 99, 2000, 2001, 2002, 2003
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
4 ;; Free Software Foundation, Inc.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ;; Copyright (C) 1995 Tinker Systems and INS Engineering Corp.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Copyright (C) 1995 Sun Microsystems.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
7 ;; Copyright (C) 2000, 2001, 2002, 2003 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; Maintainer: XEmacs Development Team
2525
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
10 ;; Keywords: extensions, dumped, internal
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
14 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
15 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
16 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
17 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
19 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
20 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
21 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
22 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5220
diff changeset
25 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
27 ;;; Synched up with: FSF 19.34. Some things synched up with later versions.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ;; There's not a whole lot in common now with the FSF version,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; be wary when applying differences. I've left in a number of lines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ;; of commentary just to give diff(1) something to synch itself with to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; provide useful context diffs. -sb
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
38 ;; BEGIN SYNCHED WITH FSF 21.2
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
39
5284
d27c1ee1943b Make the order of preloaded-file-list more sane.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5281
diff changeset
40 ;; XEmacs; no need for custom-declare-variable-list, preloaded-file-list is
d27c1ee1943b Make the order of preloaded-file-list more sane.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5281
diff changeset
41 ;; ordered to make it unnecessary.
5281
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
42
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
43 ;; XEmacs; this is here because we use it in backquote.el, so it needs to be
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
44 ;; available the first time a `(...) form is expanded.
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
45 (defun list* (first &rest rest) ; See compiler macro in cl-macs.el
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
46 "Return a new list with specified args as elements, cons'd to last arg.
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
47 Thus, `(list* A B C D)' is equivalent to `(nconc (list A B C) D)', or to
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
48 `(cons A (cons B (cons C D)))'."
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
49 (cond ((not rest) first)
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
50 ((not (cdr rest)) (cons first (car rest)))
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
51 (t (let* ((n (length rest))
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
52 (copy (copy-sequence rest))
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
53 (last (nthcdr (- n 2) copy)))
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
54 (setcdr last (car (cdr last)))
aa20a889ff14 Remove a couple of redundant functions, backquote.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 5220
diff changeset
55 (cons first copy)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 ;;;; Lisp language features.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (defmacro lambda (&rest cdr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 "Return a lambda expression.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 A call of the form (lambda ARGS DOCSTRING INTERACTIVE BODY) is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 self-quoting; the result of evaluating the lambda expression is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 expression itself. The lambda expression may then be treated as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 function, i.e., stored as the function value of a symbol, passed to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 funcall or mapcar, etc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 ARGS should take the same form as an argument list for a `defun'.
3842
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
68 Optional DOCSTRING is a documentation string.
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
69 If present, it should describe how to call the function. Docstrings are
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
70 rarely useful unless the lambda will be named, eg, using `fset'.
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
71 Optional INTERACTIVE should be a call to the function `interactive'.
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
72 BODY should be a list of lisp expressions.
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
73
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
74 The byte-compiler treats lambda expressions specially. If the lambda
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
75 expression is syntactically a function to be called, it will be compiled
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
76 unless protected by `quote'. Conversely, quoting a lambda expression with
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
77 `function' hints to the byte-compiler that it should compile the expression.
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
78 \(The byte-compiler may or may not actually compile it; for example it will
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
79 never compile lambdas nested in a data structure: `'(#'(lambda (x) x))').
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
80
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
81 The byte-compiler will warn about common problems such as the form
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
82 `(fset 'f '(lambda (x) x))' (the lambda cannot be byte-compiled; probably
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
83 the programmer intended `#'', although leaving the lambda unquoted will
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
84 normally suffice), but in general is it the programmer's responsibility to
1c2a46ea1f78 [xemacs-hg @ 2007-02-22 16:53:20 by stephent]
stephent
parents: 3555
diff changeset
85 quote lambda expressions appropriately."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 `(function (lambda ,@cdr)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
88 ;; FSF 21.2 has various basic macros here. We don't because they're either
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
89 ;; in cl*.el (which we dump and hence is always available) or built-in.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
90
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
91 ;; More powerful versions in cl.el.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
92 ;(defmacro push (newelt listname)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
93 ;(defmacro pop (listname)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
94
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
95 ;; Built-in.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
96 ;(defmacro when (cond &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
97 ;(defmacro unless (cond &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
98
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
99 ;; More powerful versions in cl-macs.el.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
100 ;(defmacro dolist (spec &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
101 ;(defmacro dotimes (spec &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
102
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
103 ;; In cl.el. Ours are defun, but cl arranges for them to be inlined anyway.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
104 ;(defsubst caar (x)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
105 ;(defsubst cadr (x)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
106 ;(defsubst cdar (x)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
107 ;(defsubst cddr (x)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
108
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
109 ;; Built-in. Our `last' is more powerful in that it handles circularity.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
110 ;(defun last (x &optional n)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
111 ;(defun butlast (x &optional n)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
112 ;(defun nbutlast (x &optional n)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
113
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
114 ;; In cl-seq.el.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
115 ;(defun remove (elt seq)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
116 ;(defun remq (elt list)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
117
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (defmacro defun-when-void (&rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 "Define a function, just like `defun', unless it's already defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 Used for compatibility among different emacs variants."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 `(if (fboundp ',(car args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 (defun ,@args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (defmacro define-function-when-void (&rest args)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 "Define a function, just like `define-function', unless it's already defined.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 Used for compatibility among different emacs variants."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 `(if (fboundp ,(car args))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (define-function ,@args)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132
5338
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
133 (defun delete (item sequence)
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
134 "Delete by side effect any occurrences of ITEM as a member of SEQUENCE.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
135
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
136 The modified SEQUENCE is returned. Comparison is done with `equal'.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
137
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
138 If the first member of a list SEQUENCE is ITEM, there is no way to remove it
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
139 by side effect; therefore, write `(setq foo (delete element foo))' to be
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
140 sure of changing the value of `foo'. Also see: `remove'."
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
141 (delete* item sequence :test #'equal))
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
142
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
143 (defun delq (item sequence)
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
144 "Delete by side effect any occurrences of ITEM as a member of SEQUENCE.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
145
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
146 The modified SEQUENCE is returned. Comparison is done with `eq'. If
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
147 SEQUENCE is a list and its first member is ITEM, there is no way to remove
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
148 it by side effect; therefore, write `(setq foo (delq element foo))' to be
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
149 sure of changing the value of `foo'."
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
150 (delete* item sequence :test #'eq))
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
151
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
152 (defun remove (item sequence)
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
153 "Remove all occurrences of ITEM in SEQUENCE, testing with `equal'.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
154
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
155 This is a non-destructive function; it makes a copy of SEQUENCE if necessary
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
156 to avoid corrupting the original SEQUENCE.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
157 Also see: `remove*', `delete', `delete*'"
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
158 (remove* item sequence :test #'equal))
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
159
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
160 (defun remq (item sequence)
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
161 "Remove all occurrences of ITEM in SEQUENCE, comparing with `eq'.
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
162
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
163 This is a non-destructive function; it makes a copy of SEQUENCE to avoid
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
164 corrupting the original SEQUENCE. See also the more general `remove*'."
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
165 (remove* item sequence :test #'eq))
8608eadee6ba Move #'delq, #'delete to Lisp, adding support for sequences.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5327
diff changeset
166
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
167 (defun assoc-default (key alist &optional test default)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
168 "Find object KEY in a pseudo-alist ALIST.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
169 ALIST is a list of conses or objects. Each element (or the element's car,
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
170 if it is a cons) is compared with KEY by evaluating (TEST (car elt) KEY).
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
171 If that is non-nil, the element matches;
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
172 then `assoc-default' returns the element's cdr, if it is a cons,
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
173 or DEFAULT if the element is not a cons.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
174
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
175 If no element matches, the value is nil.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
176 If TEST is omitted or nil, `equal' is used."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
177 (let (found (tail alist) value)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
178 (while (and tail (not found))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
179 (let ((elt (car tail)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
180 (when (funcall (or test 'equal) (if (consp elt) (car elt) elt) key)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
181 (setq found t value (if (consp elt) (cdr elt) default))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
182 (setq tail (cdr tail)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
183 value))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
184
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
185 (defun assoc-ignore-case (key alist)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
186 "Like `assoc', but ignores differences in case and text representation.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
187 KEY must be a string. Upper-case and lower-case letters are treated as equal."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
188 (let (element)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
189 (while (and alist (not element))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
190 (if (eq t (compare-strings key 0 nil (car (car alist)) 0 nil t))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
191 (setq element (car alist)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
192 (setq alist (cdr alist)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
193 element))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
194
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
195 (defun assoc-ignore-representation (key alist)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
196 "Like `assoc', but ignores differences in text representation.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
197 KEY must be a string."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
198 (let (element)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
199 (while (and alist (not element))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
200 (if (eq t (compare-strings key 0 nil (car (car alist)) 0 nil))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
201 (setq element (car alist)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
202 (setq alist (cdr alist)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
203 element))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
204
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
205 (defun member-ignore-case (elt list)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
206 "Like `member', but ignores differences in case and text representation.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
207 ELT must be a string. Upper-case and lower-case letters are treated as equal."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
208 (while (and list (not (eq t (compare-strings elt 0 nil (car list) 0 nil t))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
209 (setq list (cdr list)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
210 list)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
211
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
212
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ;;;; Keymap support.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 ;; XEmacs: removed to keymap.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 ;;;; The global keymap tree.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 ;;; global-map, esc-map, and ctl-x-map have their values set up in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 ;;; keymap.c; we just give them docstrings here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 ;;;; Event manipulation functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 ;; XEmacs: This stuff is done in C Code.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
225 ;;;; Obsolescent names for functions generally appear elsewhere, in
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
226 ;;;; obsolete.el or in the files they are related do. Many very old
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
227 ;;;; obsolete stuff has been removed entirely (e.g. anything with `dot' in
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
228 ;;;; place of `point').
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
229
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
230 ; alternate names (not obsolete)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
231 (if (not (fboundp 'mod)) (define-function 'mod '%))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
232 (define-function 'move-marker 'set-marker)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
233 (define-function 'beep 'ding) ; preserve lingual purity
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
234 (define-function 'indent-to-column 'indent-to)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
235 (define-function 'backward-delete-char 'delete-backward-char)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
236 (define-function 'search-forward-regexp (symbol-function 're-search-forward))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
237 (define-function 'search-backward-regexp (symbol-function 're-search-backward))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
238 (define-function 'remove-directory 'delete-directory)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
239 (define-function 'set-match-data 'store-match-data)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
240 (define-function 'send-string-to-terminal 'external-debugging-output)
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4817
diff changeset
241 (define-function 'special-form-p 'special-operator-p)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5004
diff changeset
243 ;; XEmacs; this is in Lisp, its bytecode now taken by subseq.
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5004
diff changeset
244 (define-function 'substring 'subseq)
5327
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
245
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
246 (define-function 'sort 'sort*)
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
247 (define-function 'fillarray 'fill)
5089
99f8ebc082d9 Make #'substring an alias of #'subseq; give the latter the byte code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5004
diff changeset
248
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 ;; XEmacs:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (defun local-variable-if-set-p (sym buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 "Return t if SYM would be local to BUFFER after it is set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 A nil value for BUFFER is *not* the same as (current-buffer), but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 can be used to determine whether `make-variable-buffer-local' has been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 called on SYM."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (local-variable-p sym buffer t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 ;;;; Hook manipulation functions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ;; (defconst run-hooks 'run-hooks ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (defun make-local-hook (hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 "Make the hook HOOK local to the current buffer.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
264 The return value is HOOK.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
265
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
266 You never need to call this function now that `add-hook' does it for you
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
267 if its LOCAL argument is non-nil.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
268
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 When a hook is local, its local and global values
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 work in concert: running the hook actually runs all the hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 functions listed in *either* the local value *or* the global value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 of the hook variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 This function works by making `t' a member of the buffer-local value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 which acts as a flag to run the hook functions in the default value as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 well. This works for all normal hooks, but does not work for most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 non-normal hooks yet. We will be changing the callers of non-normal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 hooks so that they can handle localness; this has to be done one by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 This function does nothing if HOOK is already local in the current
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
284 Do not use `make-local-variable' to make a hook variable buffer-local."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 (if (local-variable-p hook (current-buffer)) ; XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 (or (boundp hook) (set hook nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 (make-local-variable hook)
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
289 (set hook (list t)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
290 hook)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 (defun add-hook (hook function &optional append local)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 "Add to the value of HOOK the function FUNCTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 FUNCTION is not added if already present.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 FUNCTION is added (if necessary) at the beginning of the hook list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 unless the optional argument APPEND is non-nil, in which case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 FUNCTION is added at the end.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 The optional fourth argument, LOCAL, if non-nil, says to modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 the hook's buffer-local value rather than its default value.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
301 This makes the hook buffer-local if needed.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 To make a hook variable buffer-local, always use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 `make-local-hook', not `make-local-variable'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 HOOK should be a symbol, and FUNCTION may be any valid function. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 HOOK is void, it is first set to nil. If HOOK's value is a single
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
307 function, it is changed to a list of functions.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
308
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
309 You can remove this hook yourself using `remove-hook'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
310
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
311 See also `add-one-shot-hook'."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (or (boundp hook) (set hook nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (or (default-boundp hook) (set-default hook nil))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
314 (if local (unless (local-variable-if-set-p hook (current-buffer)) ; XEmacs
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
315 (make-local-hook hook))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
316 ;; Detect the case where make-local-variable was used on a hook
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
317 ;; and do what we used to do.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
318 (unless (and (consp (symbol-value hook)) (memq t (symbol-value hook)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
319 (setq local t)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
320 (let ((hook-value (if local (symbol-value hook) (default-value hook))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
321 ;; If the hook value is a single function, turn it into a list.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
322 (when (or (not (listp hook-value)) (eq (car hook-value) 'lambda))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
323 (setq hook-value (list hook-value)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
324 ;; Do the actual addition if necessary
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
325 (unless (member function hook-value)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
326 (setq hook-value
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
327 (if append
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
328 (append hook-value (list function))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
329 (cons function hook-value))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
330 ;; Set the actual variable
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
331 (if local (set hook hook-value) (set-default hook hook-value))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 (defun remove-hook (hook function &optional local)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 "Remove from the value of HOOK the function FUNCTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 HOOK should be a symbol, and FUNCTION may be any valid function. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 FUNCTION isn't the value of HOOK, or, if FUNCTION doesn't appear in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 list of hooks to run in HOOK, then nothing is done. See `add-hook'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 The optional third argument, LOCAL, if non-nil, says to modify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 the hook's buffer-local value rather than its default value.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
341 This makes the hook buffer-local if needed.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 To make a hook variable buffer-local, always use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 `make-local-hook', not `make-local-variable'."
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
344 (or (boundp hook) (set hook nil))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
345 (or (default-boundp hook) (set-default hook nil))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
346 (if local (unless (local-variable-if-set-p hook (current-buffer)) ; XEmacs
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
347 (make-local-hook hook))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
348 ;; Detect the case where make-local-variable was used on a hook
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
349 ;; and do what we used to do.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
350 (unless (and (consp (symbol-value hook)) (memq t (symbol-value hook)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
351 (setq local t)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
352 (let ((hook-value (if local (symbol-value hook) (default-value hook))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
353 ;; Remove the function, for both the list and the non-list cases.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
354 ;; XEmacs: add hook-test, for handling one-shot hooks.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
355 (flet ((hook-test
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
356 (fn hel)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
357 (or (equal fn hel)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
358 (and (symbolp hel)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
359 (equal fn
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
360 (get hel 'one-shot-hook-fun))))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
361 (if (or (not (listp hook-value)) (eq (car hook-value) 'lambda))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
362 (if (equal hook-value function) (setq hook-value nil))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
363 (setq hook-value (delete* function (copy-sequence hook-value)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
364 :test 'hook-test)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
365 ;; If the function is on the global hook, we need to shadow it locally
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
366 ;;(when (and local (member* function (default-value hook)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
367 ;; :test 'hook-test)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
368 ;; (not (member* (cons 'not function) hook-value
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
369 ;; :test 'hook-test)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
370 ;; (push (cons 'not function) hook-value))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
371 ;; Set the actual variable
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
372 (if local (set hook hook-value) (set-default hook hook-value)))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
373
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
374 ;; XEmacs addition
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
375 ;; #### we need a coherent scheme for indicating compatibility info,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
376 ;; so that it can be programmatically retrieved.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
377 (defun add-local-hook (hook function &optional append)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
378 "Add to the local value of HOOK the function FUNCTION.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
379 You don't need this any more. It's equivalent to specifying the LOCAL
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
380 argument to `add-hook'."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
381 (add-hook hook function append t))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
382
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
383 ;; XEmacs addition
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
384 (defun remove-local-hook (hook function)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
385 "Remove from the local value of HOOK the function FUNCTION.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
386 You don't need this any more. It's equivalent to specifying the LOCAL
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
387 argument to `remove-hook'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
388 (remove-hook hook function t))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
389
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
390 (defun add-one-shot-hook (hook function &optional append local)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
391 "Add to the value of HOOK the one-shot function FUNCTION.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
392 FUNCTION will automatically be removed from the hook the first time
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
393 after it runs (whether to completion or to an error).
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
394 FUNCTION is not added if already present.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
395 FUNCTION is added (if necessary) at the beginning of the hook list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
396 unless the optional argument APPEND is non-nil, in which case
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
397 FUNCTION is added at the end.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
398
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
399 HOOK should be a symbol, and FUNCTION may be any valid function. If
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
400 HOOK is void, it is first set to nil. If HOOK's value is a single
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
401 function, it is changed to a list of functions.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
402
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
403 You can remove this hook yourself using `remove-hook'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
404
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
405 See also `add-hook'."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
406 (let ((sym (gensym)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
407 (fset sym `(lambda (&rest args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
408 (unwind-protect
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
409 (apply ',function args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
410 (remove-hook ',hook ',sym ',local))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
411 (put sym 'one-shot-hook-fun function)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
412 (add-hook hook sym append local)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
413
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
414 (defun add-local-one-shot-hook (hook function &optional append)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
415 "Add to the local value of HOOK the one-shot function FUNCTION.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
416 You don't need this any more. It's equivalent to specifying the LOCAL
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
417 argument to `add-one-shot-hook'."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
418 (add-one-shot-hook hook function append t))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419
4461
42fad34efb3f Support COMPARE-FN in add-to-list; thank you Brian Palmer.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4369
diff changeset
420 (defun add-to-list (list-var element &optional append compare-fn)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 "Add to the value of LIST-VAR the element ELEMENT if it isn't there yet.
4461
42fad34efb3f Support COMPARE-FN in add-to-list; thank you Brian Palmer.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4369
diff changeset
422 The test for presence of ELEMENT is done with COMPARE-FN; if
42fad34efb3f Support COMPARE-FN in add-to-list; thank you Brian Palmer.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4369
diff changeset
423 COMPARE-FN is nil, then it defaults to `equal'. If ELEMENT is added,
42fad34efb3f Support COMPARE-FN in add-to-list; thank you Brian Palmer.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4369
diff changeset
424 it is added at the beginning of the list, unless the optional argument
42fad34efb3f Support COMPARE-FN in add-to-list; thank you Brian Palmer.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4369
diff changeset
425 APPEND is non-nil, in which case ELEMENT is added at the end.
878
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
426
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 If you want to use `add-to-list' on a variable that is not defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 until a certain package is loaded, you should put the call to `add-to-list'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 into a hook function that will be run only after loading the package.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 `eval-after-load' provides one way to do this. In some cases
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 other hooks, such as major mode hooks, can do the job."
4463
5c651a4e8ed3 Fix add-to-list.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4462
diff changeset
432 (if (member* element (symbol-value list-var) :test (or compare-fn #'equal))
878
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
433 (symbol-value list-var)
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
434 (set list-var
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
435 (if append
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
436 (append (symbol-value list-var) (list element))
64f38afaab2d [xemacs-hg @ 2002-06-23 22:03:32 by youngs]
youngs
parents: 872
diff changeset
437 (cons element (symbol-value list-var))))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
439 ;; END SYNCHED WITH FSF 21.2
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
440
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 ;; XEmacs additions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 ;; called by Fkill_buffer()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (defvar kill-buffer-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 "Function or functions to be called when a buffer is killed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 The value of this variable may be buffer-local.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 The buffer about to be killed is current when this hook is run.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 ;; in C in FSFmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (defvar kill-emacs-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 "Function or functions to be called when `kill-emacs' is called,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 just before emacs is actually killed.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 ;; not obsolete.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 ;; #### These are a bad idea, because the CL RPLACA and RPLACD
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 ;; return the cons cell, not the new CAR/CDR. -hniksic
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 ;; The proper definition would be:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 ;; (defun rplaca (conscell newcar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 ;; (setcar conscell newcar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 ;; conscell)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 ;; ...and analogously for RPLACD.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 (define-function 'rplaca 'setcar)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (define-function 'rplacd 'setcdr)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (defun copy-symbol (symbol &optional copy-properties)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 "Return a new uninterned symbol with the same name as SYMBOL.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 If COPY-PROPERTIES is non-nil, the new symbol will have a copy of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 SYMBOL's value, function, and property lists."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (let ((new (make-symbol (symbol-name symbol))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 (when copy-properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 ;; This will not copy SYMBOL's chain of forwarding objects, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 ;; I think that's OK. Callers should not expect such magic to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 ;; keep working in the copy in the first place.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 (and (boundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (set new (symbol-value symbol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (and (fboundp symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (fset new (symbol-function symbol)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (setplist new (copy-list (symbol-plist symbol))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 new))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
480 (defun set-symbol-value-in-buffer (sym val buffer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
481 "Set the value of SYM to VAL in BUFFER. Useful with buffer-local variables.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
482 If SYM has a buffer-local value in BUFFER, or will have one if set, this
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
483 function allows you to set the local value.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
484
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
485 NOTE: At some point, this will be moved into C and will be very fast."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
486 (with-current-buffer buffer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
487 (set sym val)))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
488
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
489
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
490 ;; BEGIN SYNCHED WITH FSF 21.2
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
491
5504
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
492 (defun split-path (path)
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
493 "Explode a search path into a list of strings.
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
494 The path components are separated with the characters specified
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
495 with `path-separator'."
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
496 (while (or (not (stringp path-separator))
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
497 (/= (length path-separator) 1))
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
498 (setq path-separator (signal 'error (list "\
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
499 `path-separator' should be set to a single-character string"
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
500 path-separator))))
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
501 (split-string-by-char path (aref path-separator 0)))
d3e0482c7899 Move #'split-path to subr.el, as was always the intention.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5488
diff changeset
502
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
503 ; "Explode a search path into a list of strings.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
504 ;The path components are separated with the characters specified
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
505 ;with `path-separator'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
506
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
507 (defmacro with-current-buffer (buffer &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
508 "Temporarily make BUFFER the current buffer and execute the forms in BODY.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
509 The value returned is the value of the last form in BODY.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
510 See also `with-temp-buffer'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
511 `(save-current-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
512 (set-buffer ,buffer)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
513 ,@body))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
514
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
515 (defmacro with-temp-file (filename &rest forms)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
516 "Create a new buffer, evaluate FORMS there, and write the buffer to FILENAME.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
517 The value of the last form in FORMS is returned, like `progn'.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
518 See also `with-temp-buffer'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
519 (let ((temp-file (make-symbol "temp-file"))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
520 (temp-buffer (make-symbol "temp-buffer")))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
521 `(let ((,temp-file ,filename)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
522 (,temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
523 (get-buffer-create (generate-new-buffer-name " *temp file*"))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
524 (unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
525 (prog1
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
526 (with-current-buffer ,temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
527 ,@forms)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
528 (with-current-buffer ,temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
529 (widen)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
530 (write-region (point-min) (point-max) ,temp-file nil 0)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
531 (and (buffer-name ,temp-buffer)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
532 (kill-buffer ,temp-buffer))))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
533
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
534 ;; FSF compatibility
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
535 (defmacro with-temp-message (message &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
536 "Display MESSAGE temporarily while BODY is evaluated.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
537 The original message is restored to the echo area after BODY has finished.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
538 The value returned is the value of the last form in BODY.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
539 If MESSAGE is nil, the echo area and message log buffer are unchanged.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
540 Use a MESSAGE of \"\" to temporarily clear the echo area.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
542 Note that this function exists for FSF compatibility purposes. A better way
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
543 under XEmacs is to give the message a particular label (see `display-message');
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
544 then, the old message is automatically restored when you clear your message
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
545 with `clear-message'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
546 ;; FSF additional doc string from 21.2:
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
547 ;; MESSAGE is written to the message log buffer if `message-log-max' is non-nil.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
548 (let ((current-message (make-symbol "current-message"))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
549 (temp-message (make-symbol "with-temp-message")))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
550 `(let ((,temp-message ,message)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
551 (,current-message))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
552 (unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
553 (progn
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
554 (when ,temp-message
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
555 (setq ,current-message (current-message))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
556 (message "%s" ,temp-message))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
557 ,@body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
558 (and ,temp-message ,current-message
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
559 (message "%s" ,current-message))))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
560
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
561 (defmacro with-temp-buffer (&rest forms)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
562 "Create a temporary buffer, and evaluate FORMS there like `progn'.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
563 See also `with-temp-file' and `with-output-to-string'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
564 (let ((temp-buffer (make-symbol "temp-buffer")))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
565 `(let ((,temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
566 (get-buffer-create (generate-new-buffer-name " *temp*"))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
567 (unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
568 (with-current-buffer ,temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
569 ,@forms)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
570 (and (buffer-name ,temp-buffer)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
571 (kill-buffer ,temp-buffer))))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
572
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
573 (defmacro with-output-to-string (&rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
574 "Execute BODY, return the text it sent to `standard-output', as a string."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
575 `(let ((standard-output
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
576 (get-buffer-create (generate-new-buffer-name " *string-output*"))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
577 (let ((standard-output standard-output))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
578 ,@body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
579 (with-current-buffer standard-output
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
580 (prog1
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
581 (buffer-string)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
582 (kill-buffer nil)))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
583
2135
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
584 (defmacro with-local-quit (&rest body)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
585 "Execute BODY with `inhibit-quit' temporarily bound to nil."
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
586 `(condition-case nil
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
587 (let ((inhibit-quit nil))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
588 ,@body)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
589 (quit (setq quit-flag t))))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
590
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
591 ;; FSF 21.3.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
592
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
593 ; (defmacro combine-after-change-calls (&rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
594 ; "Execute BODY, but don't call the after-change functions till the end.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
595 ; If BODY makes changes in the buffer, they are recorded
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
596 ; and the functions on `after-change-functions' are called several times
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
597 ; when BODY is finished.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
598 ; The return value is the value of the last form in BODY.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
599
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
600 ; If `before-change-functions' is non-nil, then calls to the after-change
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
601 ; functions can't be deferred, so in that case this macro has no effect.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
602
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
603 ; Do not alter `after-change-functions' or `before-change-functions'
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
604 ; in BODY."
2135
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
605 ; (declare (indent 0) (debug t))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
606 ; `(unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
607 ; (let ((combine-after-change-calls t))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
608 ; . ,body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
609 ; (combine-after-change-execute)))
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 793
diff changeset
610
4369
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
611 (defmacro with-case-table (table &rest body)
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
612 "Execute the forms in BODY with TABLE as the current case table.
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
613 The value returned is the value of the last form in BODY."
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
614 (declare (indent 1) (debug t))
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
615 (let ((old-case-table (make-symbol "table"))
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
616 (old-buffer (make-symbol "buffer")))
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
617 `(let ((,old-case-table (current-case-table))
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
618 (,old-buffer (current-buffer)))
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
619 (unwind-protect
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
620 (progn (set-case-table ,table)
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
621 ,@body)
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
622 (with-current-buffer ,old-buffer
ef9eb714f0e4 Add ascii-case-table, #'with-case-table; make iso8859-1.el more comprehensible.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4329
diff changeset
623 (set-case-table ,old-case-table))))))
2135
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
624
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
625 (defvar delay-mode-hooks nil
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
626 "If non-nil, `run-mode-hooks' should delay running the hooks.")
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
627 (defvar delayed-mode-hooks nil
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
628 "List of delayed mode hooks waiting to be run.")
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
629 (make-variable-buffer-local 'delayed-mode-hooks)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
630 (put 'delay-mode-hooks 'permanent-local t)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
631
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
632 (defun run-mode-hooks (&rest hooks)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
633 "Run mode hooks `delayed-mode-hooks' and HOOKS, or delay HOOKS.
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
634 Execution is delayed if `delay-mode-hooks' is non-nil.
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
635 Major mode functions should use this."
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
636 (if delay-mode-hooks
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
637 ;; Delaying case.
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
638 (dolist (hook hooks)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
639 (push hook delayed-mode-hooks))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
640 ;; Normal case, just run the hook as before plus any delayed hooks.
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
641 (setq hooks (nconc (nreverse delayed-mode-hooks) hooks))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
642 (setq delayed-mode-hooks nil)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
643 (apply 'run-hooks hooks)))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
644
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
645 (defmacro delay-mode-hooks (&rest body)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
646 "Execute BODY, but delay any `run-mode-hooks'.
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
647 Only affects hooks run in the current buffer."
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
648 `(progn
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
649 (make-local-variable 'delay-mode-hooks)
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
650 (let ((delay-mode-hooks t))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
651 ,@body)))
e6d43c299b9c [xemacs-hg @ 2004-06-17 03:01:10 by james]
james
parents: 1899
diff changeset
652
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
653 (defmacro with-syntax-table (table &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
654 "Evaluate BODY with syntax table of current buffer set to a copy of TABLE.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
655 The syntax table of the current buffer is saved, BODY is evaluated, and the
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
656 saved table is restored, even in case of an abnormal exit.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
657 Value is what BODY returns."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
658 (let ((old-table (make-symbol "table"))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
659 (old-buffer (make-symbol "buffer")))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
660 `(let ((,old-table (syntax-table))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
661 (,old-buffer (current-buffer)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
662 (unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
663 (progn
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
664 (set-syntax-table (copy-syntax-table ,table))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
665 ,@body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
666 (save-current-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
667 (set-buffer ,old-buffer)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
668 (set-syntax-table ,old-table))))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
669
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
670 (put 'with-syntax-table 'lisp-indent-function 1)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
671 (put 'with-syntax-table 'edebug-form-spec '(form body))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
672
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
673
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
674 ;; Moved from mule-coding.el.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
675 (defmacro with-string-as-buffer-contents (str &rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
676 "With the contents of the current buffer being STR, run BODY.
4516
e96f3aca4d63 Document initial position of point in `with-string-as-buffer-contents'.
Stephen J. Turnbull <stephen@xemacs.org>
parents: 4504
diff changeset
677 Point starts positioned to end of buffer.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
678 Returns the new contents of the buffer, as modified by BODY.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
679 The original current buffer is restored afterwards."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
680 `(with-temp-buffer
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
681 (insert ,str)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
682 ,@body
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
683 (buffer-string)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
684
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
685
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
686 (defmacro save-match-data (&rest body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
687 "Execute BODY forms, restoring the global value of the match data."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
688 (let ((original (make-symbol "match-data")))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
689 (list 'let (list (list original '(match-data)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
690 (list 'unwind-protect
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
691 (cons 'progn body)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
692 (list 'store-match-data original)))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
693
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
694
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
695 (defun match-string (num &optional string)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
696 "Return string of text matched by last search.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
697 NUM specifies which parenthesized expression in the last regexp.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
698 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
699 Zero means the entire text matched by the whole regexp or whole string.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
700 STRING should be given if the last search was by `string-match' on STRING."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
701 (if (match-beginning num)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
702 (if string
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
703 (substring string (match-beginning num) (match-end num))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
704 (buffer-substring (match-beginning num) (match-end num)))))
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 793
diff changeset
705
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
706 (defun match-string-no-properties (num &optional string)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
707 "Return string of text matched by last search, without text properties.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
708 NUM specifies which parenthesized expression in the last regexp.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
709 Value is nil if NUMth pair didn't match, or there were less than NUM pairs.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
710 Zero means the entire text matched by the whole regexp or whole string.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
711 STRING should be given if the last search was by `string-match' on STRING."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
712 (if (match-beginning num)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
713 (if string
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
714 (let ((result
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
715 (substring string (match-beginning num) (match-end num))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
716 (set-text-properties 0 (length result) nil result)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
717 result)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
718 (buffer-substring-no-properties (match-beginning num)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
719 (match-end num)))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
720
5488
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
721 ;; Imported from GNU Emacs 23.3.1 -- dvl
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
722 (defun looking-back (regexp &optional limit greedy)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
723 "Return non-nil if text before point matches regular expression REGEXP.
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
724 Like `looking-at' except matches before point, and is slower.
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
725 LIMIT if non-nil speeds up the search by specifying a minimum
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
726 starting position, to avoid checking matches that would start
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
727 before LIMIT.
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
728
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
729 If GREEDY is non-nil, extend the match backwards as far as
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
730 possible, stopping when a single additional previous character
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
731 cannot be part of a match for REGEXP. When the match is
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
732 extended, its starting position is allowed to occur before
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
733 LIMIT."
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
734 (let ((start (point))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
735 (pos
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
736 (save-excursion
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
737 (and (re-search-backward (concat "\\(?:" regexp "\\)\\=") limit t)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
738 (point)))))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
739 (if (and greedy pos)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
740 (save-restriction
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
741 (narrow-to-region (point-min) start)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
742 (while (and (> pos (point-min))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
743 (save-excursion
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
744 (goto-char pos)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
745 (backward-char 1)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
746 (looking-at (concat "\\(?:" regexp "\\)\\'"))))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
747 (setq pos (1- pos)))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
748 (save-excursion
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
749 (goto-char pos)
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
750 (looking-at (concat "\\(?:" regexp "\\)\\'")))))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
751 (not (null pos))))
1e544fd7be12 Import looking-back from GNU Emacs.
Didier Verna <didier@lrde.epita.fr>
parents: 5473
diff changeset
752
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
753 (defconst split-string-default-separators "[ \f\t\n\r\v]+"
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
754 "The default value of separators for `split-string'.
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
755
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
756 A regexp matching strings of whitespace. May be locale-dependent
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
757 \(as yet unimplemented). Should not match non-breaking spaces.
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
758
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
759 Warning: binding this to a different value and using it as default is
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
760 likely to have undesired semantics.")
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
761
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
762 ;; specification for `split-string' agreed with rms 2003-04-23
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
763 ;; xemacs design <87vfx5vor0.fsf@tleepslib.sk.tsukuba.ac.jp>
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
764
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
765 ;; The specification says that if both SEPARATORS and OMIT-NULLS are
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
766 ;; defaulted, OMIT-NULLS should be treated as t. Simplifying the logical
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
767 ;; expression leads to the equivalent implementation that if SEPARATORS
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
768 ;; is defaulted, OMIT-NULLS is treated as t.
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
769
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
770 (defun split-string (string &optional separators omit-nulls)
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
771 "Splits STRING into substrings bounded by matches for SEPARATORS.
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
772
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
773 The beginning and end of STRING, and each match for SEPARATORS, are
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
774 splitting points. The substrings matching SEPARATORS are removed, and
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
775 the substrings between the splitting points are collected as a list,
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
776 which is returned.
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
777
2138
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
778 If SEPARATORS is non-`nil', it should be a regular expression matching text
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
779 which separates, but is not part of, the substrings. If `nil' it defaults to
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
780 `split-string-default-separators', normally \"[ \\f\\t\\n\\r\\v]+\", and
2138
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
781 OMIT-NULLS is forced to `t'.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
782
2138
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
783 If OMIT-NULLS is `t', zero-length substrings are omitted from the list \(so
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
784 that for the default value of SEPARATORS leading and trailing whitespace
2138
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
785 are effectively trimmed). If `nil', all zero-length substrings are retained,
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
786 which correctly parses CSV format, for example.
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
787
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
788 Note that the effect of `(split-string STRING)' is the same as
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
789 `(split-string STRING split-string-default-separators t)'). In the rare
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
790 case that you wish to retain zero-length substrings when splitting on
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
791 whitespace, use `(split-string STRING split-string-default-separators nil)'.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
792
2138
2f37290328b0 [xemacs-hg @ 2004-06-17 11:29:37 by stephent]
stephent
parents: 2135
diff changeset
793 Modifies the match data when successful; use `save-match-data' if necessary."
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
794
1495
c3cf7db99b98 [xemacs-hg @ 2003-05-22 07:41:20 by stephent]
stephent
parents: 1425
diff changeset
795 (let ((keep-nulls (not (if separators omit-nulls t)))
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
796 (rexp (or separators split-string-default-separators))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
797 (start 0)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
798 notfirst
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
799 (list nil))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
800 (while (and (string-match rexp string
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
801 (if (and notfirst
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
802 (= start (match-beginning 0))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
803 (< start (length string)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
804 (1+ start) start))
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
805 (< start (length string)))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
806 (setq notfirst t)
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
807 (if (or keep-nulls (< start (match-beginning 0)))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
808 (setq list
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
809 (cons (substring string start (match-beginning 0))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
810 list)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
811 (setq start (match-end 0)))
1425
74cb069b8417 [xemacs-hg @ 2003-04-23 15:42:44 by stephent]
stephent
parents: 1336
diff changeset
812 (if (or keep-nulls (< start (length string)))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
813 (setq list
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
814 (cons (substring string start)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
815 list)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
816 (nreverse list)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
817
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
818 (defun subst-char-in-string (fromchar tochar string &optional inplace)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
819 "Replace FROMCHAR with TOCHAR in STRING each time it occurs.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
820 Unless optional argument INPLACE is non-nil, return a new string."
5321
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
821 (funcall (if inplace #'nsubstitute #'substitute) tochar fromchar
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
822 (the string string) :test #'eq))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
823
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
824 ;; XEmacs addition:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (defun replace-in-string (str regexp newtext &optional literal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 "Replace all matches in STR for REGEXP with NEWTEXT string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 and returns the new string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 Optional LITERAL non-nil means do a literal replacement.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
829 Otherwise treat `\\' in NEWTEXT as special:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
830 `\\&' in NEWTEXT means substitute original matched text.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
831 `\\N' means substitute what matched the Nth `\\(...\\)'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
832 If Nth parens didn't match, substitute nothing.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
833 `\\\\' means insert one `\\'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
834 `\\u' means upcase the next character.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
835 `\\l' means downcase the next character.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
836 `\\U' means begin upcasing all following characters.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
837 `\\L' means begin downcasing all following characters.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
838 `\\E' means terminate the effect of any `\\U' or `\\L'."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 (check-argument-type 'stringp str)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 (check-argument-type 'stringp newtext)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
841 (if (> (length str) 50)
924
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
842 (let ((cfs case-fold-search))
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
843 (with-temp-buffer
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
844 (setq case-fold-search cfs)
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
845 (insert str)
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
846 (goto-char 1)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
847 (while (re-search-forward regexp nil t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
848 (replace-match newtext t literal))
924
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
849 (buffer-string)))
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
850 (let ((start 0) newstr)
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
851 (while (string-match regexp str start)
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
852 (setq newstr (replace-match newtext t literal str)
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
853 start (+ (match-end 0) (- (length newstr) (length str)))
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
854 str newstr))
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
855 str)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
857 (defun replace-regexp-in-string (regexp rep string &optional
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
858 fixedcase literal subexp start)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
859 "Replace all matches for REGEXP with REP in STRING.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
860
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
861 Return a new string containing the replacements.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
862
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
863 Optional arguments FIXEDCASE and LITERAL are like the arguments with
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
864 the same names of function `replace-match'. If START is non-nil,
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
865 start replacements at that index in STRING.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
866
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
867 For compatibility with old XEmacs code and with recent GNU Emacs, the
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
868 interpretation of SUBEXP is somewhat complicated. If SUBEXP is a
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
869 buffer, it is interpreted as the buffer which provides syntax tables
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
870 and case tables for the match and replacement. If it is not a buffer,
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
871 the current buffer is used. If SUBEXP is an integer, it is the index
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
872 of the subexpression of REGEXP which is to be replaced.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
874 REP is either a string used as the NEWTEXT arg of `replace-match' or a
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
875 function. If it is a function it is applied to each match to generate
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
876 the replacement passed to `replace-match'; the match-data at this
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
877 point are such that `(match-string SUBEXP STRING)' is the function's
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
878 argument if SUBEXP is an integer \(otherwise the whole match is passed
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
879 and replaced).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
881 To replace only the first match (if any), make REGEXP match up to \\'
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
882 and replace a sub-expression, e.g.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
883 (replace-regexp-in-string \"\\(foo\\).*\\'\" \"bar\" \" foo foo\" nil nil 1)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
884 => \" bar foo\"
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
885
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
886 Signals `invalid-argument' if SUBEXP is not an integer, buffer, or nil;
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
887 or is an integer, but the indicated subexpression was not matched.
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
888 Signals `invalid-argument' if STRING is nil but the last text matched was a string,
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
889 or if STRING is a string but the last text matched was a buffer."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
891 ;; To avoid excessive consing from multiple matches in long strings,
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
892 ;; don't just call `replace-match' continually. Walk down the
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
893 ;; string looking for matches of REGEXP and building up a (reversed)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
894 ;; list MATCHES. This comprises segments of STRING which weren't
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
895 ;; matched interspersed with replacements for segments that were.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
896 ;; [For a `large' number of replacments it's more efficient to
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
897 ;; operate in a temporary buffer; we can't tell from the function's
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
898 ;; args whether to choose the buffer-based implementation, though it
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
899 ;; might be reasonable to do so for long enough STRING.]
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
900 (let ((l (length string))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
901 (start (or start 0))
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
902 (expndx (if (integerp subexp) subexp 0))
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
903 matches str mb me)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
904 (save-match-data
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
905 (while (and (< start l) (string-match regexp string start))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
906 (setq mb (match-beginning 0)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
907 me (match-end 0))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
908 ;; If we matched the empty string, make sure we advance by one char
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
909 (when (= me mb) (setq me (min l (1+ mb))))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
910 ;; Generate a replacement for the matched substring.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
911 ;; Operate only on the substring to minimize string consing.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
912 ;; Set up match data for the substring for replacement;
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
913 ;; presumably this is likely to be faster than munging the
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
914 ;; match data directly in Lisp.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
915 (string-match regexp (setq str (substring string mb me)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
916 (setq matches
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
917 (cons (replace-match (if (stringp rep)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
918 rep
4199
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
919 (funcall rep (match-string expndx str)))
3660d327399f [xemacs-hg @ 2007-10-01 08:07:39 by stephent]
stephent
parents: 4103
diff changeset
920 ;; no, this subexp shouldn't be expndx
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
921 fixedcase literal str subexp)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
922 (cons (substring string start mb) ; unmatched prefix
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
923 matches)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
924 (setq start me))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
925 ;; Reconstruct a string from the pieces.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
926 (setq matches (cons (substring string start l) matches)) ; leftover
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
927 (apply #'concat (nreverse matches)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
929 ;; END SYNCHED WITH FSF 21.2
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
930
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
931
1899
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
932 ;; BEGIN SYNCHED WITH FSF 21.3
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
933
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
934 (defun add-to-invisibility-spec (arg)
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
935 "Add elements to `buffer-invisibility-spec'.
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
936 See documentation for `buffer-invisibility-spec' for the kind of elements
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
937 that can be added."
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
938 (if (eq buffer-invisibility-spec t)
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
939 (setq buffer-invisibility-spec (list t)))
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
940 (setq buffer-invisibility-spec
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
941 (cons arg buffer-invisibility-spec)))
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
942
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
943 (defun remove-from-invisibility-spec (arg)
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
944 "Remove elements from `buffer-invisibility-spec'."
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
945 (if (consp buffer-invisibility-spec)
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
946 (setq buffer-invisibility-spec (delete arg buffer-invisibility-spec))))
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
947
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
948 ;; END SYNCHED WITH FSF 21.3
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
949
124ce9dc008b [xemacs-hg @ 2004-02-05 16:54:57 by james]
james
parents: 1495
diff changeset
950
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
951 ;;; Basic string functions
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
952
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
953 ;; XEmacs
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
954 (defun string-equal-ignore-case (str1 str2)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
955 "Return t if two strings have identical contents, ignoring case differences.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
956 Case is not significant. Text properties and extents are ignored.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
957 Symbols are also allowed; their print names are used instead.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
959 See also `equalp'."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
960 (if (symbolp str1)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
961 (setq str1 (symbol-name str1)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
962 (if (symbolp str2)
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
963 (setq str2 (symbol-name str2)))
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
964 (eq t (compare-strings str1 nil nil str2 nil nil t)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 (defun insert-face (string face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 "Insert STRING and highlight with FACE. Return the extent created."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 (let ((p (point)) ext)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 (insert string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 (setq ext (make-extent p (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 (set-extent-face ext face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 ext))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 ;; not obsolete.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 (define-function 'string= 'string-equal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 (define-function 'string< 'string-lessp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 (define-function 'int-to-string 'number-to-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 (define-function 'string-to-int 'string-to-number)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 ;; These two names are a bit awkward, as they conflict with the normal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 ;; foo-to-bar naming scheme, but CLtL2 has them, so they stay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 (define-function 'char-int 'char-to-int)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 (define-function 'int-char 'int-to-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984
4329
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
985 ;; XEmacs addition.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
986 (defun integer-to-bit-vector (integer &optional minlength)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
987 "Return INTEGER converted to a bit vector.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
988 Optional argument MINLENGTH gives a minimum length for the returned vector.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
989 If MINLENGTH is not given, zero high-order bits will be ignored."
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
990 (check-argument-type #'integerp integer)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
991 (setq minlength (or minlength 0))
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
992 (check-nonnegative-number minlength)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
993 (read (format (format "#*%%0%db" minlength) integer)))
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
994
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
995 ;; XEmacs addition.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
996 (defun bit-vector-to-integer (bit-vector)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
997 "Return BIT-VECTOR converted to an integer.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
998 If bignum support is available, BIT-VECTOR's length is unlimited.
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
999 Otherwise the limit is the number of value bits in an Lisp integer. "
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
1000 (check-argument-type #'bit-vector-p bit-vector)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
1001 (setq bit-vector (prin1-to-string bit-vector))
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
1002 (aset bit-vector 1 ?b)
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
1003 (read bit-vector))
d9eb5ea14f65 Provide %b in #'format; use it for converting between ints and bit vectors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4267
diff changeset
1004
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1005 (defun string-width (string)
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1006 "Return number of columns STRING occupies when displayed.
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1007 With international (Mule) support, uses the charset-columns attribute of
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1008 the characters in STRING, which may not accurately represent the actual
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1009 display width when using a window system. With no international support,
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1010 simply returns the length of the string."
5321
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
1011 (reduce #'+ (the string string) :initial-value 0 :key #'char-width))
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 563
diff changeset
1012
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1013 (defun char-width (character)
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1014 "Return number of columns a CHARACTER occupies when displayed."
5321
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
1015 (charset-width (char-charset character)))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1016
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1017 ;; The following several functions are useful in GNU Emacs 20 because
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1018 ;; of the multibyte "characters" the internal representation of which
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1019 ;; leaks into Lisp. In XEmacs/Mule they are trivial and unnecessary.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1020 ;; We provide them for compatibility reasons solely.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1021
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1022 (defun string-to-sequence (string type)
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1023 "Convert STRING to a sequence of TYPE which contains characters in STRING.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1024 TYPE should be `list' or `vector'."
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1025 (ecase type
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1026 (list
4267
66e2714696bd [xemacs-hg @ 2007-11-14 19:25:39 by aidan]
aidan
parents: 4266
diff changeset
1027 (append string nil))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1028 (vector
4267
66e2714696bd [xemacs-hg @ 2007-11-14 19:25:39 by aidan]
aidan
parents: 4266
diff changeset
1029 (vconcat string))))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1030
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1031 (defun string-to-list (string)
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1032 "Return a list of characters in STRING."
4267
66e2714696bd [xemacs-hg @ 2007-11-14 19:25:39 by aidan]
aidan
parents: 4266
diff changeset
1033 (append string nil))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1034
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1035 (defun string-to-vector (string)
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1036 "Return a vector of characters in STRING."
4267
66e2714696bd [xemacs-hg @ 2007-11-14 19:25:39 by aidan]
aidan
parents: 4266
diff changeset
1037 (vconcat string))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1038
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1039 (defun store-substring (string idx obj)
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1040 "Embed OBJ (string or character) at index IDX of STRING."
5321
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
1041 (if (stringp obj)
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
1042 (replace (the string string) obj :start1 idx)
57a64ab2ae45 Implement some basic Lisp functions in terms of Common Lisp builtins.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5284
diff changeset
1043 (prog1 string (aset string idx obj))))
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1044
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1045 ;; From FSF 21.1; ELLIPSES is XEmacs addition.
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1046
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1047 (defun truncate-string-to-width (str end-column &optional start-column padding
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1048 ellipses)
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1049 "Truncate string STR to end at column END-COLUMN.
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1050 The optional 3rd arg START-COLUMN, if non-nil, specifies
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1051 the starting column; that means to return the characters occupying
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1052 columns START-COLUMN ... END-COLUMN of STR.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1053
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1054 The optional 4th arg PADDING, if non-nil, specifies a padding character
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1055 to add at the end of the result if STR doesn't reach column END-COLUMN,
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1056 or if END-COLUMN comes in the middle of a character in STR.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1057 PADDING is also added at the beginning of the result
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1058 if column START-COLUMN appears in the middle of a character in STR.
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1059
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1060 If PADDING is nil, no padding is added in these cases, so
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1061 the resulting string may be narrower than END-COLUMN.
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1062
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1063 BUG: Currently assumes that the padding character is of width one. You
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1064 will get weird results if not.
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1065
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1066 If ELLIPSES is non-nil, add ellipses (specified by ELLIPSES if a string,
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1067 else `...') if STR extends past END-COLUMN. The ellipses will be added in
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1068 such a way that the total string occupies no more than END-COLUMN columns
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1069 -- i.e. if the string goes past END-COLUMN, it will be truncated somewhere
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1070 short of END-COLUMN so that, with the ellipses added (and padding, if the
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1071 proper place to truncate the string would be in the middle of a character),
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1072 the string occupies exactly END-COLUMN columns."
777
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1073 (or start-column
e65d9cf16707 [xemacs-hg @ 2002-03-15 11:00:28 by ben]
ben
parents: 772
diff changeset
1074 (setq start-column 0))
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1075 (let ((len (length str))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1076 (idx 0)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1077 (column 0)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1078 (head-padding "") (tail-padding "")
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1079 ch last-column last-idx from-idx)
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1080
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1081 ;; find the index of START-COLUMN; bail out if end of string reached.
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1082 (condition-case nil
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1083 (while (< column start-column)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1084 (setq ch (aref str idx)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1085 column (+ column (char-width ch))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1086 idx (1+ idx)))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1087 (args-out-of-range (setq idx len)))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1088 (if (< column start-column)
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1089 ;; if string ends before START-COLUMN, return either a blank string
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1090 ;; or a string entirely padded.
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1091 (if padding (make-string (- end-column start-column) padding) "")
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1092 (if (and padding (> column start-column))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1093 (setq head-padding (make-string (- column start-column) padding)))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1094 (setq from-idx idx)
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1095 ;; If END-COLUMN is before START-COLUMN, then bail out.
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1096 (if (< end-column column)
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1097 (setq idx from-idx ellipses "")
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1098
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1099 ;; handle ELLIPSES
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1100 (cond ((null ellipses) (setq ellipses ""))
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1101 ((if (<= (string-width str) end-column)
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1102 ;; string fits, no ellipses
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1103 (setq ellipses "")))
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1104 (t
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1105 ;; else, insert default value and ...
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1106 (or (stringp ellipses) (setq ellipses "..."))
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1107 ;; ... take away the width of the ellipses from the
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1108 ;; destination. do all computations with new, shorter
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1109 ;; width. the padding computed will get us exactly up to
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1110 ;; the shorted width, which is right -- it just gets added
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1111 ;; to the right of the ellipses.
924
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
1112 (setq end-column (- end-column (string-width ellipses)))))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1113
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1114 ;; find the index of END-COLUMN; bail out if end of string reached.
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1115 (condition-case nil
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1116 (while (< column end-column)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1117 (setq last-column column
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1118 last-idx idx
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1119 ch (aref str idx)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1120 column (+ column (char-width ch))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1121 idx (1+ idx)))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1122 (args-out-of-range (setq idx len)))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1123 ;; if we went too far (stopped in middle of character), back up.
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1124 (if (> column end-column)
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1125 (setq column last-column idx last-idx))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1126 ;; compute remaining padding
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1127 (if (and padding (< column end-column))
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1128 (setq tail-padding (make-string (- end-column column) padding))))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1129 ;; get substring ...
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1130 (setq str (substring str from-idx idx))
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1131 ;; and construct result
814
a634e3b7acc8 [xemacs-hg @ 2002-04-14 12:41:59 by ben]
ben
parents: 801
diff changeset
1132 (if padding
851
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1133 (concat head-padding str tail-padding ellipses)
e7ee5f8bde58 [xemacs-hg @ 2002-05-23 11:46:08 by ben]
ben
parents: 814
diff changeset
1134 (concat str ellipses)))))
801
2b676dc88c66 [xemacs-hg @ 2002-04-01 03:58:02 by ben]
ben
parents: 793
diff changeset
1135
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 ;; alist/plist functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 (defun plist-to-alist (plist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 "Convert property list PLIST into the equivalent association-list form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 The alist is returned. This converts from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 \(a 1 b 2 c 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 \((a . 1) (b . 2) (c . 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 The original plist is not modified. See also `destructive-plist-to-alist'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 (let (alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 (while plist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 (setq alist (cons (cons (car plist) (cadr plist)) alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 (setq plist (cddr plist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 (nreverse alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1155 ((macro
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1156 . (lambda (map-plist-definition)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1157 "Replace the variable names in MAP-PLIST-DEFINITION with uninterned
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1158 symbols, avoiding the risk of interference with variables in other functions
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1159 introduced by dynamic scope."
5327
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1160 (nsublis '((mp-function . #:function)
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1161 (plist . #:plist)
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1162 (result . #:result))
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1163 ;; Need to specify #'eq as the test, otherwise we have a
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1164 ;; bootstrap issue, since #'eql is in cl.el, loaded after
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1165 ;; this file.
d1b17a33450b Move the heavy lifting from cl-seq.el to C.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5321
diff changeset
1166 map-plist-definition :test #'eq)))
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1167 (defun map-plist (mp-function plist)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1168 "Map FUNCTION (a function of two args) over each key/value pair in PLIST.
783
6fadd0a2230b [xemacs-hg @ 2002-03-19 02:38:51 by ben]
ben
parents: 777
diff changeset
1169 Return a list of the results."
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1170 (let (result)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1171 (while plist
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1172 (push (funcall mp-function (car plist) (cadr plist)) result)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1173 (setq plist (cddr plist)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1174 (nreverse result))))
783
6fadd0a2230b [xemacs-hg @ 2002-03-19 02:38:51 by ben]
ben
parents: 777
diff changeset
1175
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 (defun destructive-plist-to-alist (plist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 "Convert property list PLIST into the equivalent association-list form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 The alist is returned. This converts from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 \(a 1 b 2 c 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 \((a . 1) (b . 2) (c . 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 The original plist is destroyed in the process of constructing the alist.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 See also `plist-to-alist'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 (let ((head plist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 (while plist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 ;; remember the next plist pair.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 (setq next (cddr plist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 ;; make the cons holding the property value into the alist element.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 (setcdr (cdr plist) (cadr plist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 (setcar (cdr plist) (car plist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 ;; reattach into alist form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 (setcar plist (cdr plist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 (setcdr plist next)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 (setq plist next))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 head))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 (defun alist-to-plist (alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 "Convert association list ALIST into the equivalent property-list form.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 The plist is returned. This converts from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 \((a . 1) (b . 2) (c . 3))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 \(a 1 b 2 c 3)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 The original alist is not modified. See also `destructive-alist-to-plist'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 (let (plist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 (while alist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 (let ((el (car alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 (setq plist (cons (cdr el) (cons (car el) plist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 (setq alist (cdr alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 (nreverse plist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 ;; getf, remf in cl*.el.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1222 (defmacro putf (plist property value)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1223 "Add property PROPERTY to plist PLIST with value VALUE.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1224 Analogous to (setq PLIST (plist-put PLIST PROPERTY VALUE))."
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1225 `(setq ,plist (plist-put ,plist ,property ,value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1227 (defmacro laxputf (lax-plist property value)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1228 "Add property PROPERTY to lax plist LAX-PLIST with value VALUE.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1229 Analogous to (setq LAX-PLIST (lax-plist-put LAX-PLIST PROPERTY VALUE))."
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1230 `(setq ,lax-plist (lax-plist-put ,lax-plist ,property ,value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1232 (defmacro laxremf (lax-plist property)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1233 "Remove property PROPERTY from lax plist LAX-PLIST.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1234 Analogous to (setq LAX-PLIST (lax-plist-remprop LAX-PLIST PROPERTY))."
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1235 `(setq ,lax-plist (lax-plist-remprop ,lax-plist ,property)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 ;;; Error functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1239 (defun error (datum &rest args)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1240 "Signal a non-continuable error.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1241 DATUM should normally be an error symbol, i.e. a symbol defined using
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1242 `define-error'. ARGS will be made into a list, and DATUM and ARGS passed
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1243 as the two arguments to `signal', the most basic error handling function.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1244
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 This error is not continuable: you cannot continue execution after the
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1246 error using the debugger `r' command. See also `cerror'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1247
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1248 The correct semantics of ARGS varies from error to error, but for most
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1249 errors that need to be generated in Lisp code, the first argument
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1250 should be a string describing the *context* of the error (i.e. the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1251 exact operation being performed and what went wrong), and the remaining
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1252 arguments or \"frobs\" (most often, there is one) specify the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1253 offending object(s) and/or provide additional details such as the exact
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1254 error when a file error occurred, e.g.:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1255
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1256 -- the buffer in which an editing error occurred.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1257 -- an invalid value that was encountered. (In such cases, the string
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1258 should describe the purpose or \"semantics\" of the value [e.g. if the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1259 value is an argument to a function, the name of the argument; if the value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1260 is the value corresponding to a keyword, the name of the keyword; if the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1261 value is supposed to be a list length, say this and say what the purpose
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1262 of the list is; etc.] as well as specifying why the value is invalid, if
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1263 that's not self-evident.)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1264 -- the file in which an error occurred. (In such cases, there should be a
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1265 second frob, probably a string, specifying the exact error that occurred.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1266 This does not occur in the string that precedes the first frob, because
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1267 that frob describes the exact operation that was happening.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1268
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1269 For historical compatibility, DATUM can also be a string. In this case,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1270 DATUM and ARGS are passed together as the arguments to `format', and then
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1271 an error is signalled using the error symbol `error' and formatted string.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1272 Although this usage of `error' is very common, it is deprecated because it
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1273 totally defeats the purpose of having structured errors. There is now
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1274 a rich set of defined errors you can use:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1275
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1276 quit
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1277
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1278 error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1279 invalid-argument
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1280 syntax-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1281 invalid-read-syntax
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1282 invalid-regexp
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1283 structure-formation-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1284 list-formation-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1285 malformed-list
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1286 malformed-property-list
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1287 circular-list
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1288 circular-property-list
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1289 invalid-function
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1290 no-catch
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1291 undefined-keystroke-sequence
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1292 invalid-constant
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1293 wrong-type-argument
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1294 args-out-of-range
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1295 wrong-number-of-arguments
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1297 invalid-state
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1298 void-function
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1299 cyclic-function-indirection
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1300 void-variable
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1301 cyclic-variable-indirection
509
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1302 invalid-byte-code
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1303 stack-overflow
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1304 out-of-memory
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1305 invalid-key-binding
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1306 internal-error
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1307
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1308 invalid-operation
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1309 invalid-change
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1310 setting-constant
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1311 protected-field
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1312 editing-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1313 beginning-of-buffer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1314 end-of-buffer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1315 buffer-read-only
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1316 io-error
509
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1317 file-error
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1318 file-already-exists
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1319 file-locked
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1320 file-supersession
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1321 end-of-file
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1322 process-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1323 network-error
509
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1324 tooltalk-error
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1325 gui-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1326 dialog-box-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1327 sound-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1328 conversion-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1329 text-conversion-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1330 image-conversion-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1331 base64-conversion-error
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1332 selection-conversion-error
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1333 arith-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1334 range-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1335 domain-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1336 singularity-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1337 overflow-error
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1338 underflow-error
509
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1339 search-failed
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1340 printing-unreadable-object
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1341 unimplemented
509
68eb53e4b7e5 [xemacs-hg @ 2001-05-05 10:53:29 by ben]
ben
parents: 444
diff changeset
1342
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1343 Note the semantic differences between some of the more common errors:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1344
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1345 -- `invalid-argument' is for all cases where a bad value is encountered.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1346 -- `invalid-constant' is for arguments where only a specific set of values
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1347 is allowed.
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1348 -- `syntax-error' is when complex structures (parsed strings, lists,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1349 and the like) are badly formed. If the problem is just a single bad
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1350 value inside the structure, you should probably be using something else,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1351 e.g. `invalid-constant', `wrong-type-argument', or `invalid-argument'.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1352 -- `invalid-state' means that some settings have been changed in such a way
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1353 that their current state is unallowable. More and more, code is being
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1354 written more carefully, and catches the error when the settings are being
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1355 changed, rather than afterwards. This leads us to the next error:
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1356 -- `invalid-change' means that an attempt is being made to change some settings
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1357 into an invalid state. `invalid-change' is a type of `invalid-operation'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1358 -- `invalid-operation' refers to all cases where code is trying to do something
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1359 that's disallowed, or when an error occurred during an operation. (These
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1360 two concepts are merged because there's no clear distinction between them.)
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1361 -- `io-error' refers to errors involving interaction with any external
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 510
diff changeset
1362 components (files, other programs, the operating system, etc).
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1363
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1364 See also `cerror', `signal', and `signal-error'."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1365 (while t (apply
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1366 'cerror datum args)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1367
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1368 (defun cerror (datum &rest args)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1369 "Like `error' but signals a continuable error."
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1370 (cond ((stringp datum)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1371 (signal 'error (list (apply 'format datum args))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1372 ((defined-error-p datum)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1373 (signal datum args))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1374 (t
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1375 (error 'invalid-argument "datum not string or error symbol" datum))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 (defmacro check-argument-type (predicate argument)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 "Check that ARGUMENT satisfies PREDICATE.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1379 This is a macro, and ARGUMENT is not evaluated. If ARGUMENT is an lvalue,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1380 this function signals a continuable `wrong-type-argument' error until the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1381 returned value satisfies PREDICATE, and assigns the returned value
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1382 to ARGUMENT. Otherwise, this function signals a non-continuable
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1383 `wrong-type-argument' error if the returned value does not satisfy PREDICATE."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1384 (if (symbolp argument)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1385 `(if (not (,(eval predicate) ,argument))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1386 (setq ,argument
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1387 (wrong-type-argument ,predicate ,argument)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1388 `(if (not (,(eval predicate) ,argument))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1389 (signal-error 'wrong-type-argument (list ,predicate ,argument)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1391 (defun args-out-of-range (value min max)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1392 "Signal an error until the correct in-range value is given by the user.
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1393 This function loops, signalling a continuable `args-out-of-range' error
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1394 with VALUE, MIN and MAX as the data associated with the error and then
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1395 checking the returned value to make sure it's not outside the given
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1396 boundaries \(nil for either means no boundary on that side). At that
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1397 point, the gotten value is returned."
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1398 (loop
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1399 for newval = (signal 'args-out-of-range (list value min max))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1400 do (setq value newval)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1401 finally return value
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1402 while (not (argument-in-range-p value min max))))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1403
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1404 (defun argument-in-range-p (argument min max)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1405 "Return true if ARGUMENT is within the range of [MIN, MAX].
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1406 This includes boundaries. nil for either value means no limit on that side."
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1407 (and (or (not min) (<= min argument))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1408 (or (not max) (<= argument max))))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1409
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1410 (defmacro check-argument-range (argument min max)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1411 "Check that ARGUMENT is within the range [MIN, MAX].
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1412 This is a macro, and ARGUMENT is not evaluated. If ARGUMENT is an lvalue,
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1413 this function signals a continuable `args-out-of-range' error until the
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1414 returned value is within range, and assigns the returned value
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1415 to ARGUMENT. Otherwise, this function signals a non-continuable
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1416 `args-out-of-range' error if the returned value is out of range."
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1417 (if (symbolp argument)
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1418 `(if (not (argument-in-range-p ,argument ,min ,max))
924
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
1419 (setq ,argument
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
1420 (args-out-of-range ,argument ,min ,max)))
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1421 (let ((newsym (gensym)))
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1422 `(let ((,newsym ,argument))
924
1b114504fa80 [xemacs-hg @ 2002-07-16 08:18:35 by didierv]
didierv
parents: 883
diff changeset
1423 (if (not (argument-in-range-p ,newsym ,min ,max))
4103
b4f4e0cc90f1 [xemacs-hg @ 2007-08-07 23:08:47 by aidan]
aidan
parents: 3842
diff changeset
1424 (signal-error 'args-out-of-range (list ,newsym ,min ,max)))))))
872
79c6ff3eef26 [xemacs-hg @ 2002-06-20 21:18:01 by ben]
ben
parents: 851
diff changeset
1425
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 (defun signal-error (error-symbol data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 "Signal a non-continuable error. Args are ERROR-SYMBOL, and associated DATA.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 An error symbol is a symbol defined using `define-error'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 DATA should be a list. Its elements are printed as part of the error message.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430 If the signal is handled, DATA is made available to the handler.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 See also `signal', and the functions to handle errors: `condition-case'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 and `call-with-condition-handler'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 (while t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 (signal error-symbol data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1435
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1436 (defun define-error (error-sym doc-string &optional inherits-from)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 "Define a new error, denoted by ERROR-SYM.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 DOC-STRING is an informative message explaining the error, and will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 printed out when an unhandled error occurs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 ERROR-SYM is a sub-error of INHERITS-FROM (which defaults to `error').
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 \[`define-error' internally works by putting on ERROR-SYM an `error-message'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 property whose value is DOC-STRING, and an `error-conditions' property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 that is a list of ERROR-SYM followed by each of its super-errors, up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 to and including `error'. You will sometimes see code that sets this up
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 directly rather than calling `define-error', but you should *not* do this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 yourself.]"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 (check-argument-type 'symbolp error-sym)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 (check-argument-type 'stringp doc-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (put error-sym 'error-message doc-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 (or inherits-from (setq inherits-from 'error))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 (let ((conds (get inherits-from 'error-conditions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 (or conds (signal-error 'error (list "Not an error symbol" error-sym)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 (put error-sym 'error-conditions (cons error-sym conds))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1456 (defun defined-error-p (sym)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1457 "Returns non-nil if SYM names a currently-defined error."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1458 (and (symbolp sym) (not (null (get sym 'error-conditions)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1459
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1460 (defun backtrace-in-condition-handler-eliminating-handler (handler-arg-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1461 "Return a backtrace inside of a condition handler, eliminating the handler.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1462 This is for use in the condition handler inside of call-with-condition-handler,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1463 when written like this:
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1464
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1465 \(call-with-condition-handler
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1466 #'(lambda (__some_weird_arg__)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1467 do the handling ...)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1468 #'(lambda ()
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1469 do the stuff that might cause an error))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1470
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1471 Pass in the name (a symbol) of the argument used in the lambda function
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1472 that specifies the handler, and make sure the argument name is unique, and
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1473 this function generates a backtrace and strips off the part above where the
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1474 error occurred (i.e. the handler itself)."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1475 (let* ((bt (with-output-to-string (backtrace nil t)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1476 (bt (save-match-data
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1477 ;; Try to eliminate the part of the backtrace
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1478 ;; above where the error occurred.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1479 (if (string-match
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1480 (concat "bind (\\(?:.* \\)?" (symbol-name handler-arg-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1481 "\\(?:.* \\)?)[ \t\n]*\\(?:(lambda \\|#<compiled-function \\)("
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1482 (symbol-name handler-arg-name)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1483 ").*\n\\(\\(?:.\\|\n\\)*\\)$")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1484 bt) (match-string 1 bt) bt))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1485 bt))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1486
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1487 (put 'with-trapping-errors 'lisp-indent-function 0)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1488 (defmacro with-trapping-errors (&rest keys-body)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1489 "Trap errors in BODY, outputting a warning and a backtrace.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1490 Usage looks like
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1491
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1492 \(with-trapping-errors
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1493 [:operation OPERATION]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1494 [:error-form ERROR-FORM]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1495 [:no-backtrace NO-BACKTRACE]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1496 [:class CLASS]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1497 [:level LEVEL]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1498 [:resignal RESIGNAL]
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1499 BODY)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1500
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1501 Return value without error is whatever BODY returns. With error, return
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1502 result of ERROR-FORM (which will be evaluated only when the error actually
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1503 occurs), which defaults to nil. OPERATION is given in the warning message.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1504 CLASS and LEVEL are the warning class and level (default to class
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1505 `general', level `warning'). If NO-BACKTRACE is given, no backtrace is
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1506 displayed. If RESIGNAL is given, the error is resignaled after the warning
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1507 is displayed and the ERROR-FORM is executed."
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1508 (let ((operation "unknown")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1509 (error-form nil)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1510 (no-backtrace nil)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1511 (class ''general)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1512 (level ''warning)
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1513 (resignal nil)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1514 (cte-cc-var '#:cte-cc-var)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1515 (call-trapping-errors-arg '#:call-trapping-errors-Ldc9FC5Hr))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1516 (let* ((keys '(operation error-form no-backtrace class level resignal))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1517 (keys-with-colon
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1518 (mapcar #'(lambda (sym)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1519 (intern (concat ":" (symbol-name sym)))) keys)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1520 (while (memq (car keys-body) keys-with-colon)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1521 (let* ((key-with-colon (pop keys-body))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1522 (key (intern (substring (symbol-name key-with-colon) 1))))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1523 (set key (pop keys-body)))))
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1524 `(condition-case ,(if resignal cte-cc-var nil)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1525 (call-with-condition-handler
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1526 #'(lambda (,call-trapping-errors-arg)
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1527 (let ((errstr (error-message-string
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1528 ,call-trapping-errors-arg)))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1529 ,(if no-backtrace
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1530 `(lwarn ,class ,level
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1531 (if (warning-level-<
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1532 ,level
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1533 display-warning-minimum-level)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1534 "Error in %s: %s"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1535 "Error in %s:\n%s\n")
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1536 ,operation errstr)
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1537 `(lwarn ,class ,level
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1538 "Error in %s: %s\n\nBacktrace follows:\n\n%s"
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1539 ,operation errstr
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1540 (backtrace-in-condition-handler-eliminating-handler
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4575
diff changeset
1541 ',call-trapping-errors-arg)))))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1542 #'(lambda ()
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1543 (progn ,@keys-body)))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1544 (error
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1545 ,error-form
4817
0142cb4d1049 Fix a bug I introduced in #'with-trapping-errors.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1546 ,@(if resignal `((signal (car ,cte-cc-var) (cdr ,cte-cc-var)))))
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1547 )))
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 783
diff changeset
1548
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 ;;;; Miscellanea.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 ;; This is now in C.
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1552 ;(defun buffer-substring-no-properties (start end)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1553 ; "Return the text from START to END, without text properties, as a string."
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1554 ; (let ((string (buffer-substring start end)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 ; (set-text-properties 0 (length string) nil string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 ; string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 (defun get-buffer-window-list (&optional buffer minibuf frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 "Return windows currently displaying BUFFER, or nil if none.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 See `walk-windows' for the meaning of MINIBUF and FRAME."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 (cond ((null buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 (setq buffer (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 ((not (bufferp buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 (setq buffer (get-buffer buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 (let (windows)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 (walk-windows (lambda (window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 (if (eq (window-buffer window) buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 (push window windows)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 minibuf frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 windows))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 (defun ignore (&rest ignore)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 "Do nothing and return nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 This function accepts any number of arguments, but ignores them."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578
883
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1579 ;; defined in lisp/bindings.el in GNU Emacs.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1580 (defmacro bound-and-true-p (var)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1581 "Return the value of symbol VAR if it is bound, else nil."
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1582 `(and (boundp (quote ,var)) ,var))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1583
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1584 ;; `propertize' is a builtin in GNU Emacs 21.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1585 (defun propertize (string &rest properties)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1586 "Return a copy of STRING with text properties added.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1587 First argument is the string to copy.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1588 Remaining arguments form a sequence of PROPERTY VALUE pairs for text
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1589 properties to add to the result."
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1590 (let ((str (copy-sequence string)))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1591 (add-text-properties 0 (length str)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1592 properties
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1593 str)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1594 str))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1595
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1596 ;; `delete-and-extract-region' is a builtin in GNU Emacs 21.
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1597 (defun delete-and-extract-region (start end)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1598 "Delete the text between START and END and return it."
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1599 (let ((region (buffer-substring start end)))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1600 (delete-region start end)
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1601 region))
1e9272790fe0 [xemacs-hg @ 2002-06-26 00:11:15 by youngs]
youngs
parents: 878
diff changeset
1602
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 (define-function 'eval-in-buffer 'with-current-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 (make-obsolete 'eval-in-buffer 'with-current-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 ;;; `functionp' has been moved into C.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 ;;(defun functionp (object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 ;; "Non-nil if OBJECT can be called as a function."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 ;; (or (and (symbolp object) (fboundp object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 ;; (subrp object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 ;; (compiled-function-p object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 ;; (eq (car-safe object) 'lambda)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 (defun function-interactive (function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 "Return the interactive specification of FUNCTION.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 FUNCTION can be any funcallable object.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 The specification will be returned as the list of the symbol `interactive'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619 and the specs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 If FUNCTION is not interactive, nil will be returned."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 (setq function (indirect-function function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 (cond ((compiled-function-p function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 (compiled-function-interactive function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 ((subrp function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 (subr-interactive function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 ((eq (car-safe function) 'lambda)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 (let ((spec (if (stringp (nth 2 function))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 (nth 3 function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629 (nth 2 function))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 (and (eq (car-safe spec) 'interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 spec)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 (error "Non-funcallable object: %s" function))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1635 (defun function-allows-args (function n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1636 "Return whether FUNCTION can be called with N arguments."
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1637 (and (<= (function-min-args function) n)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1638 (or (null (function-max-args function))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1639 (<= n (function-max-args function)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
1640
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 ;; This function used to be an alias to `buffer-substring', except
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 ;; that FSF Emacs 20.4 added a BUFFER argument in an incompatible way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 ;; The new FSF's semantics makes more sense, but we try to support
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 ;; both for backward compatibility.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 (defun buffer-string (&optional buffer old-end old-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 "Return the contents of the current buffer as a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 If narrowing is in effect, this function returns only the visible part
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 of the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 If BUFFER is specified, the contents of that buffer are returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 The arguments OLD-END and OLD-BUFFER are supported for backward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 compatibility with pre-21.2 XEmacsen times when arguments to this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 function were (buffer-string &optional START END BUFFER)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656 ((or (stringp buffer) (bufferp buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 ;; Most definitely the new way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 (buffer-substring nil nil buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 ((or (stringp old-buffer) (bufferp old-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 (natnump buffer) (natnump old-end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661 ;; Definitely the old way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 (buffer-substring buffer old-end old-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 ;; Probably the old way.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 (buffer-substring buffer old-end old-buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1667 ;; BEGIN SYNC WITH FSF 21.2
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1668
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 ;; This was not present before. I think Jamie had some objections
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 ;; to this, so I'm leaving this undefined for now. --ben
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 ;;; The objection is this: there is more than one way to load the same file.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 ;;; "foo", "foo.elc", "foo.el", and "/some/path/foo.elc" are all different
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 ;;; ways to load the exact same code. `eval-after-load' is too stupid to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 ;;; deal with this sort of thing. If this sort of feature is desired, then
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 ;;; it should work off of a hook on `provide'. Features are unique and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 ;;; the arguments to (load) are not. --Stig
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1678
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1679 ;; We provide this for FSFmacs compatibility, at least until we devise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 ;; something better.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 ;;;; Specifying things to do after certain files are loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684 (defun eval-after-load (file form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 "Arrange that, if FILE is ever loaded, FORM will be run at that time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 This makes or adds to an entry on `after-load-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 If FILE is already loaded, evaluate FORM right now.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 It does nothing if FORM is already on the list for FILE.
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1689 FILE must match exactly. Normally FILE is the name of a library,
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1690 with no directory or extension specified, since that is how `load'
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1691 is normally called."
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1692 ;; Make sure `load-history' contains the files dumped with Emacs
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1693 ;; for the case that FILE is one of the files dumped with Emacs.
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1694 (if-fboundp 'load-symbol-file-load-history
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1695 (load-symbol-file-load-history))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 ;; Make sure there is an element for FILE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 (or (assoc file after-load-alist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 (setq after-load-alist (cons (list file) after-load-alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 ;; Add FORM to the element if it isn't there.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 (let ((elt (assoc file after-load-alist)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 (or (member form (cdr elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 (nconc elt (list form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 ;; If the file has been loaded already, run FORM right away.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 (and (assoc file load-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 (eval form)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 form)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 (make-compatible 'eval-after-load "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 (defun eval-next-after-load (file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 "Read the following input sexp, and run it whenever FILE is loaded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 This makes or adds to an entry on `after-load-alist'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 FILE should be the name of a library, with no directory name."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 (eval-after-load file (read)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 (make-compatible 'eval-next-after-load "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716
1333
1b0339b048ce [xemacs-hg @ 2003-03-02 09:38:37 by ben]
ben
parents: 1037
diff changeset
1717 ;; END SYNC WITH FSF 21.2
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718
3000
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1719 ;; BEGIN SYNC WITH FSF 22.0.50.1 (CVS)
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1720 (defun delete-dups (list)
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1721 "Destructively remove `equal' duplicates from LIST.
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1722 Store the result in LIST and return it. LIST must be a proper list.
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1723 Of several `equal' occurrences of an element in LIST, the first
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1724 one is kept."
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1725 (let ((tail list))
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1726 (while tail
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1727 (setcdr tail (delete (car tail) (cdr tail)))
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1728 (setq tail (cdr tail))))
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1729 list)
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1730
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1731 ;; END SYNC WITH FSF 22.0.50.1 (CVS)
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2525
diff changeset
1732
2525
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1733 ;; (defun shell-quote-argument (argument) in process.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1734
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1735 ;; (defun make-syntax-table (&optional oldtable) in syntax.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1736
4575
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1737 ;; (defun syntax-after (pos) in syntax.el.
2525
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1738
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1739 ;; global-set-key, local-set-key, global-unset-key, local-unset-key in
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1740 ;; keymap.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1741
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1742 ;; frame-configuration-p is in frame.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1743
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1744 ;; functionp is built-in.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1745
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1746 ;; interactive-form in obsolete.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1747
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1748 ;; assq-del-all in obsolete.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1749
4266
c5a2b80bc4fa [xemacs-hg @ 2007-11-14 18:51:20 by aidan]
aidan
parents: 4199
diff changeset
1750 ;; make-temp-file in files.el.
2525
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1751
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1752 ;; add-minor-mode in modeline.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1753
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1754 ;; text-clone stuff #### doesn't exist; should go in text-props.el and
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1755 ;; requires changes to extents.c (modification hooks).
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1756
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1757 ;; play-sound is built-in.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1758
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1759 ;; define-mail-user-agent is in simple.el.
52f00344a629 [xemacs-hg @ 2005-01-28 02:05:03 by ben]
ben
parents: 2138
diff changeset
1760
4501
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1761 ;; XEmacs; added.
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1762 (defun skip-chars-quote (string)
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1763 "Return a string that means all characters in STRING will be skipped,
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1764 if passed to `skip-chars-forward' or `skip-chars-backward'.
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1765
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1766 Ranges and carets are not treated specially. This implementation is
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1767 in Lisp; do not use it in performance-critical code."
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1768 (let ((list (delete-duplicates (string-to-list string) :test #'=)))
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5338
diff changeset
1769 (when (not (eql 1 (length list))) ;; No quoting needed in a string of
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5338
diff changeset
1770 ;; length 1.
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5338
diff changeset
1771 (when (eql ?^ (car list))
4504
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1772 (setq list (nconc (cdr list) '(?^))))
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1773 (when (memq ?\\ list)
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1774 (setq list (delq ?\\ list)
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1775 list (nconc (list ?\\ ?\\) list)))
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1776 (when (memq ?- list)
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1777 (setq list (delq ?- list)
b82fdf7305ee Correct the implementation, add a few basic tests for #'skip-chars-quote.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4501
diff changeset
1778 list (nconc list '(?\\ ?-)))))
4501
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1779 (apply #'string list)))
c4fd85dd95bd Add #'skip-chars-quote to subr.el
Aidan Kehoe <kehoea@parhasard.net>
parents: 4463
diff changeset
1780
4575
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1781 ;; XEmacs addition to subr.el; docstring and API taken initially from GNU's
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1782 ;; data.c, revision 1.275, GPLv2.
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1783 (defun subr-arity (subr)
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1784 "Return minimum and maximum number of args allowed for SUBR.
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1785 SUBR must be a built-in function (not just a symbol that refers to one).
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1786 The returned value is a pair (MIN . MAX). MIN is the minimum number
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1787 of args. MAX is the maximum number or the symbol `many', for a
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4817
diff changeset
1788 function with `&rest' args, or `unevalled' for a special operator.
4575
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1789
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4817
diff changeset
1790 See also `special-operator-p', `subr-min-args', `subr-max-args',
4575
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1791 `function-allows-args'. "
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1792 (check-argument-type #'subrp subr)
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1793 (cons (subr-min-args subr)
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1794 (cond
4905
755ae5b97edb Change "special form" to "special operator" in our sources.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4817
diff changeset
1795 ((special-operator-p subr)
4575
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1796 'unevalled)
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1797 ((null (subr-max-args subr))
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1798 'many)
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1799 (t (subr-max-args subr)))))
eecd28508f4a Add #'subr-arity, API taken from GNU, implementation our own.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4516
diff changeset
1800
5004
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1801 ;; XEmacs; move these here from C. Would be nice to drop them entirely, but
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1802 ;; they're used reasonably often, since they've been around for a long time
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1803 ;; and they're portable to GNU.
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1804
5182
2e528066e2fc Move #'sort*, #'fill, #'merge to C from cl-seq.el.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5089
diff changeset
1805 ;; No longer used in C, now list_merge() accepts a KEY argument.
5004
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1806 (defun car-less-than-car (a b)
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1807 "Return t if the car of A is numerically less than the car of B."
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1808 (< (car a) (car b)))
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1809
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1810 ;; Used in packages.
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1811 (defun cdr-less-than-cdr (a b)
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1812 "Return t if (cdr A) is numerically less than (cdr B)."
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1813 (< (cdr a) (cdr b)))
788c38f20376 Do not assume #'format-decode exists in fileio.c.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4905
diff changeset
1814
5220
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1815 ;; XEmacs; this is in editfns.c in GNU.
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1816 (defun float-time (&optional specified-time)
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1817 "Convert time value SPECIFIED-TIME to a floating point number.
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1818
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1819 See `current-time'. Since the result is a floating-point number, this may
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1820 not have the same accuracy as does the result of `current-time'.
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1821
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1822 If not supplied, SPECIFIED-TIME defaults to the result of `current-time'."
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1823 (or specified-time (setq specified-time (current-time)))
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1824 (+ (* (pop specified-time) (+ #x10000 0.0))
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1825 (if (consp specified-time)
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1826 (pop specified-time)
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1827 (prog1
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1828 specified-time
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1829 (setq specified-time nil)))
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1830 (or (and specified-time
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1831 (/ (car specified-time) 1000000.0))
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1832 0.0)))
2157ecaedc1d Add `float-time', implemented in Lisp.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5182
diff changeset
1833
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 ;;; subr.el ends here