annotate src/specifier.c @ 793:e38acbeb1cae

[xemacs-hg @ 2002-03-29 04:46:17 by ben] lots o' fixes etc/ChangeLog: New file. Separated out all entries for etc/ into their own ChangeLog. Includes entries for the following files: etc/BABYL, etc/BETA, etc/CHARSETS, etc/DISTRIB, etc/Emacs.ad, etc/FTP, etc/GNUS-NEWS, etc/GOATS, etc/HELLO, etc/INSTALL, etc/MACHINES, etc/MAILINGLISTS, etc/MSDOS, etc/MYTHOLOGY, etc/NEWS, etc/OXYMORONS, etc/PACKAGES, etc/README, etc/TUTORIAL, etc/TUTORIAL.de, etc/TUTORIAL.ja, etc/TUTORIAL.ko, etc/TUTORIAL.se, etc/aliases.ksh, etc/altrasoft-logo.xpm, etc/check_cygwin_setup.sh, etc/custom/example-themes/europe-theme.el, etc/custom/example-themes/ex-custom-file, etc/custom/example-themes/example-theme.el, etc/e/eterm.ti, etc/edt-user.doc, etc/enriched.doc, etc/etags.1, etc/gnuserv.1, etc/gnuserv.README, etc/package-index.LATEST.gpg, etc/package-index.LATEST.pgp, etc/photos/jan.png, etc/recycle.xpm, etc/refcard.tex, etc/sample.Xdefaults, etc/sample.emacs, etc/sgml/CATALOG, etc/sgml/HTML32.dtd, etc/skk/SKK.tut.E, etc/smilies/Face_ase.xbm, etc/smilies/Face_ase2.xbm, etc/smilies/Face_ase3.xbm, etc/smilies/Face_smile.xbm, etc/smilies/Face_weep.xbm, etc/sounds, etc/toolbar, etc/toolbar/workshop-cap-up.xpm, etc/xemacs-ja.1, etc/xemacs.1, etc/yow.lines, etc\BETA, etc\NEWS, etc\README, etc\TUTORIAL, etc\TUTORIAL.de, etc\check_cygwin_setup.sh, etc\sample.init.el, etc\unicode\README, etc\unicode\mule-ucs\*, etc\unicode\other\* unicode/unicode-consortium/8859-16.TXT: New file. mule/english.el: Define this charset now, since a bug was fixed that formerly prevented it. mule/ethio-util.el: Fix compile errors involving Unicode `characters', which should be integers. Makefile.in.in: Always include gui.c, to fix compile error when TTY-only. EmacsFrame.c, abbrev.c, alloc.c, buffer.c, buffer.h, bytecode.c, bytecode.h, callint.c, callproc.c, casetab.c, casetab.h, charset.h, chartab.c, chartab.h, cmds.c, console-msw.c, console-msw.h, console-tty.c, console-x.c, console-x.h, console.c, console.h, data.c, database.c, device-gtk.c, device-msw.c, device-x.c, device.c, device.h, dialog-msw.c, doc.c, doprnt.c, dumper.c, dynarr.c, editfns.c, eldap.c, eldap.h, elhash.c, elhash.h, emacs.c, eval.c, event-Xt.c, event-gtk.c, event-msw.c, event-stream.c, event-tty.c, event-unixoid.c, events.c, events.h, extents.c, extents.h, faces.c, faces.h, file-coding.c, file-coding.h, fileio.c, filelock.c, fns.c, frame-gtk.c, frame-msw.c, frame-tty.c, frame-x.c, frame.c, frame.h, free-hook.c, general-slots.h, glyphs-eimage.c, glyphs-gtk.c, glyphs-msw.c, glyphs-widget.c, glyphs-x.c, glyphs.c, glyphs.h, gpmevent.c, gtk-xemacs.c, gui-msw.c, gui-x.c, gui-x.h, gui.c, gui.h, gutter.c, gutter.h, indent.c, input-method-xlib.c, insdel.c, keymap.c, keymap.h, lisp-disunion.h, lisp-union.h, lisp.h, lread.c, lrecord.h, lstream.c, lstream.h, marker.c, menubar-gtk.c, menubar-msw.c, menubar-x.c, menubar.c, minibuf.c, mule-canna.c, mule-ccl.c, mule-charset.c, mule-wnnfns.c, native-gtk-toolbar.c, objects-msw.c, objects-tty.c, objects-x.c, objects.c, objects.h, opaque.c, opaque.h, postgresql.c, postgresql.h, print.c, process-unix.c, process.c, process.h, rangetab.c, rangetab.h, redisplay-gtk.c, redisplay-msw.c, redisplay-output.c, redisplay-tty.c, redisplay-x.c, redisplay.c, scrollbar-gtk.c, scrollbar-msw.c, scrollbar-x.c, scrollbar.c, scrollbar.h, search.c, select-gtk.c, select-x.c, sound.c, specifier.c, specifier.h, strftime.c, symbols.c, symeval.h, syntax.h, text.c, text.h, toolbar-common.c, toolbar-msw.c, toolbar.c, toolbar.h, tooltalk.c, tooltalk.h, ui-gtk.c, ui-gtk.h, undo.c, vm-limit.c, window.c, window.h: Eliminate XSETFOO. Replace all usages with wrap_foo(). Make symbol->name a Lisp_Object, not Lisp_String *. Eliminate nearly all uses of Lisp_String * in favor of Lisp_Object, and correct macros so most of them favor Lisp_Object. Create new error-behavior ERROR_ME_DEBUG_WARN -- output warnings, but at level `debug' (usually ignored). Use it when instantiating specifiers, so problems can be debugged. Move log-warning-minimum-level into C so that we can optimize ERROR_ME_DEBUG_WARN. Fix warning levels consistent with new definitions. Add default_ and parent fields to char table; not yet implemented. New fun Dynarr_verify(); use for further error checking on Dynarrs. Rearrange code at top of lisp.h in conjunction with dynarr changes. Fix eifree(). Use Eistrings in various places (format_event_object(), where_is_to_char(), and callers thereof) to avoid fixed-size strings buffers. New fun write_eistring(). Reindent and fix GPM code to follow standards. Set default MS Windows font to Lucida Console (same size as Courier New but less interline spacing, so more lines fit). Increase default frame size on Windows to 50 lines. (If that's too big for the workspace, the frame will be shrunk as necessary.) Fix problem with text files with no newlines (). (Change `convert-eol' coding system to use `nil' for autodetect, consistent with make-coding-system.) Correct compile warnings in vm-limit.c. Fix handling of reverse-direction charsets to avoid errors when opening (e.g.) mule-ucs/lisp/reldata/uiso8859-6.el. Recode some object printing methods to use write_fmt_string() instead of a fixed buffer and sprintf. Turn on display of png comments as warnings (level `info'), now that they're unobtrusive. Revamped the sound documentation. Fixed bug in redisplay w.r.t. hscroll/truncation/continuation glyphs causing jumping up and down of the lines, since they're bigger than the line size. (It was seen most obviously when there's a horizontal scroll bar, e.g. do C-h a glyph or something like that.) The problem was that the glyph-contrib-p setting on glyphs was ignored even if it was set properly, which it wasn't until now.
author ben
date Fri, 29 Mar 2002 04:49:13 +0000
parents 943eaba38521
children a5954632b187
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 /* Specifier implementation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1994, 1995 Board of Trustees, University of Illinois.
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
3 Copyright (C) 1995, 1996, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 Copyright (C) 1995 Sun Microsystems, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 /* Design by Ben Wing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 Original version by Chuck Thompson;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 rewritten by Ben Wing;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 Magic specifiers by Kirill Katsnelson;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 */
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 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #include "lisp.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #include "buffer.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #include "device.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #include "frame.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 #include "opaque.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 #include "specifier.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 #include "window.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 #include "chartab.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 #include "rangetab.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 Lisp_Object Qspecifierp;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
44 Lisp_Object Qremove_tag_set_prepend, Qremove_tag_set_append;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
45 Lisp_Object Qremove_locale, Qremove_locale_type;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 Lisp_Object Qconsole_type, Qdevice_class;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 static Lisp_Object Vuser_defined_tags;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 typedef struct specifier_type_entry specifier_type_entry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 struct specifier_type_entry
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 Lisp_Object symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 struct specifier_methods *meths;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 typedef struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 Dynarr_declare (specifier_type_entry);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 } specifier_type_entry_dynarr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 static specifier_type_entry_dynarr *the_specifier_type_entry_dynarr;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 static const struct lrecord_description ste_description_1[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
66 { XD_LISP_OBJECT, offsetof (specifier_type_entry, symbol) },
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
67 { XD_STRUCT_PTR, offsetof (specifier_type_entry, meths), 1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
68 &specifier_methods_description },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 static const struct struct_description ste_description = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
73 sizeof (specifier_type_entry),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 ste_description_1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 static const struct lrecord_description sted_description_1[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
78 XD_DYNARR_DESC (specifier_type_entry_dynarr, &ste_description),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 static const struct struct_description sted_description = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
83 sizeof (specifier_type_entry_dynarr),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 sted_description_1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 static Lisp_Object Vspecifier_type_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 static Lisp_Object Vcached_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 /* Do NOT mark through this, or specifiers will never be GC'd. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 static Lisp_Object Vall_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 static Lisp_Object Vunlock_ghost_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 /* #### The purpose of this is to check for inheritance loops
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 in specifiers that can inherit from other specifiers, but it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 not yet implemented.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 #### Look into this for 19.14. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 /* static Lisp_Object_dynarr current_specifiers; */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 static void recompute_cached_specifier_everywhere (Lisp_Object specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 EXFUN (Fspecifier_specs, 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 EXFUN (Fremove_specifier, 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 /* Specifier object methods */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 /* Remove dead objects from the specified assoc list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 cleanup_assoc_list (Lisp_Object list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 Lisp_Object loop, prev, retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 loop = retval = list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 prev = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 while (!NILP (loop))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 Lisp_Object entry = XCAR (loop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Lisp_Object key = XCAR (entry);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 /* remember, dead windows can become alive again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 if (!WINDOWP (key) && object_dead_p (key))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 if (NILP (prev))
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 /* Removing the head. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 retval = XCDR (retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Fsetcdr (prev, XCDR (loop));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 prev = loop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 loop = XCDR (loop);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 /* Remove dead objects from the various lists so that they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 don't keep getting marked as long as this specifier exists and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 therefore wasting memory. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 cleanup_specifiers (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 for (rest = Vall_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 !NILP (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 rest = XSPECIFIER (rest)->next_specifier)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
162 Lisp_Specifier *sp = XSPECIFIER (rest);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 /* This effectively changes the specifier specs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 However, there's no need to call
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 recompute_cached_specifier_everywhere() or the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 after-change methods because the only specs we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 are removing are for dead objects, and they can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 never have any effect on the specifier values:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 specifiers can only be instantiated over live
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 objects, and you can't derive a dead object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 from a live one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 sp->device_specs = cleanup_assoc_list (sp->device_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 sp->frame_specs = cleanup_assoc_list (sp->frame_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 sp->buffer_specs = cleanup_assoc_list (sp->buffer_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 /* windows are handled specially because dead windows
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 can be resurrected */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 kill_specifier_buffer_locals (Lisp_Object buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 for (rest = Vall_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 !NILP (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 rest = XSPECIFIER (rest)->next_specifier)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
189 Lisp_Specifier *sp = XSPECIFIER (rest);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 /* Make sure we're actually going to be changing something.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 Fremove_specifier() always calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 recompute_cached_specifier_everywhere() (#### but should
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 be smarter about this). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 if (!NILP (assq_no_quit (buffer, sp->buffer_specs)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 Fremove_specifier (rest, buffer, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 mark_specifier (Lisp_Object obj)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
203 Lisp_Specifier *specifier = XSPECIFIER (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 mark_object (specifier->global_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 mark_object (specifier->device_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 mark_object (specifier->frame_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 mark_object (specifier->window_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 mark_object (specifier->buffer_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 mark_object (specifier->magic_parent);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 mark_object (specifier->fallback);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 if (!GHOST_SPECIFIER_P (XSPECIFIER (obj)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 MAYBE_SPECMETH (specifier, mark, (obj));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 return Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 /* The idea here is that the specifier specs point to locales
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (windows, buffers, frames, and devices), and we want to make sure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 that the specs disappear automatically when the associated locale
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 is no longer in use. For all but windows, "no longer in use"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 corresponds exactly to when the object is deleted (non-deleted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 objects are always held permanently in special lists, and deleted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 objects are never on these lists and never reusable). To handle
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 this, we just have cleanup_specifiers() called periodically
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 (at the beginning of garbage collection); it removes all dead
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 objects.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 For windows, however, it's trickier because dead objects can be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 converted to live ones again if the dead object is in a window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 configuration. Therefore, for windows, "no longer in use"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 corresponds to when the window object is garbage-collected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 We now use weak lists for this purpose.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 prune_specifiers (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 Lisp_Object rest, prev = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 for (rest = Vall_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 !NILP (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 rest = XSPECIFIER (rest)->next_specifier)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 if (! marked_p (rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
247 Lisp_Specifier* sp = XSPECIFIER (rest);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 /* A bit of assertion that we're removing both parts of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 magic one altogether */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 assert (!MAGIC_SPECIFIER_P(sp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 || (BODILY_SPECIFIER_P(sp) && marked_p (sp->fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 || (GHOST_SPECIFIER_P(sp) && marked_p (sp->magic_parent)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 /* This specifier is garbage. Remove it from the list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 if (NILP (prev))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 Vall_specifiers = sp->next_specifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 XSPECIFIER (prev)->next_specifier = sp->next_specifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 prev = rest;
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 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 print_specifier (Lisp_Object obj, Lisp_Object printcharfun, int escapeflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
267 Lisp_Specifier *sp = XSPECIFIER (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 char buf[100];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 int count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 Lisp_Object the_specs;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 if (print_readably)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
273 printing_unreadable_object ("#<%s-specifier 0x%x>",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
274 sp->methods->name, sp->header.uid);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 sprintf (buf, "#<%s-specifier global=", sp->methods->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 write_c_string (buf, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 specbind (Qprint_string_length, make_int (100));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 specbind (Qprint_length, make_int (5));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 the_specs = Fspecifier_specs (obj, Qglobal, Qnil, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 if (NILP (the_specs))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 /* there are no global specs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 write_c_string ("<unspecified>", printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 print_internal (the_specs, printcharfun, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 if (!NILP (sp->fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 write_c_string (" fallback=", printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 print_internal (sp->fallback, printcharfun, escapeflag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 }
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
291 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 sprintf (buf, " 0x%x>", sp->header.uid);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 write_c_string (buf, printcharfun);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 finalize_specifier (void *header, int for_disksave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
299 Lisp_Specifier *sp = (Lisp_Specifier *) header;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 /* don't be snafued by the disksave finalization. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 if (!for_disksave && !GHOST_SPECIFIER_P(sp) && sp->caching)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 xfree (sp->caching);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 sp->caching = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 specifier_equal (Lisp_Object obj1, Lisp_Object obj2, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
311 Lisp_Specifier *s1 = XSPECIFIER (obj1);
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
312 Lisp_Specifier *s2 = XSPECIFIER (obj2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 int retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 Lisp_Object old_inhibit_quit = Vinhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 /* This function can be called from within redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 internal_equal can trigger a quit. That leads to Bad Things. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 Vinhibit_quit = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 depth++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 retval =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (s1->methods == s2->methods &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 internal_equal (s1->global_specs, s2->global_specs, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 internal_equal (s1->device_specs, s2->device_specs, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 internal_equal (s1->frame_specs, s2->frame_specs, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 internal_equal (s1->window_specs, s2->window_specs, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 internal_equal (s1->buffer_specs, s2->buffer_specs, depth) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 internal_equal (s1->fallback, s2->fallback, depth));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 if (retval && HAS_SPECMETH_P (s1, equal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 retval = SPECMETH (s1, equal, (obj1, obj2, depth - 1));
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 Vinhibit_quit = old_inhibit_quit;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 static unsigned long
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 specifier_hash (Lisp_Object obj, int depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
340 Lisp_Specifier *s = XSPECIFIER (obj);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 /* specifier hashing is a bit problematic because there are so
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 many places where data can be stored. We pick what are perhaps
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 the most likely places where interesting stuff will be. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 return HASH5 ((HAS_SPECMETH_P (s, hash) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 SPECMETH (s, hash, (obj, depth)) : 0),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 (unsigned long) s->methods,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 internal_hash (s->global_specs, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 internal_hash (s->frame_specs, depth + 1),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 internal_hash (s->buffer_specs, depth + 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
353 inline static Bytecount
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
354 aligned_sizeof_specifier (Bytecount specifier_type_specific_size)
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
355 {
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
356 return ALIGN_SIZE (offsetof (Lisp_Specifier, data)
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
357 + specifier_type_specific_size,
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
358 ALIGNOF (max_align_t));
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
359 }
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
360
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
361 static Bytecount
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
362 sizeof_specifier (const void *header)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 {
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
364 const Lisp_Specifier *p = (const Lisp_Specifier *) header;
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
365 return aligned_sizeof_specifier (GHOST_SPECIFIER_P (p)
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
366 ? 0
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
367 : p->methods->extra_data_size);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 static const struct lrecord_description specifier_methods_description_1[] = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
371 { XD_LISP_OBJECT, offsetof (struct specifier_methods, predicate_symbol) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 const struct struct_description specifier_methods_description = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
376 sizeof (struct specifier_methods),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 specifier_methods_description_1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 static const struct lrecord_description specifier_caching_description_1[] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 static const struct struct_description specifier_caching_description = {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
385 sizeof (struct specifier_caching),
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 specifier_caching_description_1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 static const struct lrecord_description specifier_description[] = {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
390 { XD_STRUCT_PTR, offsetof (Lisp_Specifier, methods), 1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
391 &specifier_methods_description },
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
392 { XD_LO_LINK, offsetof (Lisp_Specifier, next_specifier) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
393 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, global_specs) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
394 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, device_specs) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
395 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, frame_specs) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
396 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, window_specs) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
397 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, buffer_specs) },
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
398 { XD_STRUCT_PTR, offsetof (Lisp_Specifier, caching), 1,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
399 &specifier_caching_description },
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
400 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, magic_parent) },
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
401 { XD_LISP_OBJECT, offsetof (Lisp_Specifier, fallback) },
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 { XD_SPECIFIER_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 const struct lrecord_description specifier_empty_extra_description[] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 { XD_END }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 DEFINE_LRECORD_SEQUENCE_IMPLEMENTATION ("specifier", specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 mark_specifier, print_specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 finalize_specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 specifier_equal, specifier_hash,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 specifier_description,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 sizeof_specifier,
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
415 Lisp_Specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 /* Creating specifiers */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 static struct specifier_methods *
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
422 decode_specifier_type (Lisp_Object type, Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 int i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 for (i = 0; i < Dynarr_length (the_specifier_type_entry_dynarr); i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 if (EQ (type, Dynarr_at (the_specifier_type_entry_dynarr, i).symbol))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 return Dynarr_at (the_specifier_type_entry_dynarr, i).meths;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
432 maybe_invalid_argument ("Invalid specifier type",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
433 type, Qspecifier, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 valid_specifier_type_p (Lisp_Object type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 return decode_specifier_type (type, ERROR_ME_NOT) != 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 DEFUN ("valid-specifier-type-p", Fvalid_specifier_type_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 Given a SPECIFIER-TYPE, return non-nil if it is valid.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 Valid types are 'generic, 'integer, boolean, 'color, 'font, 'image,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 'face-boolean, and 'toolbar.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (specifier_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 return valid_specifier_type_p (specifier_type) ? Qt : Qnil;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 DEFUN ("specifier-type-list", Fspecifier_type_list, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 Return a list of valid specifier types.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 return Fcopy_sequence (Vspecifier_type_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 add_entry_to_specifier_type_list (Lisp_Object symbol,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 struct specifier_methods *meths)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 struct specifier_type_entry entry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 entry.symbol = symbol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 entry.meths = meths;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 Dynarr_add (the_specifier_type_entry_dynarr, entry);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 Vspecifier_type_list = Fcons (symbol, Vspecifier_type_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 make_specifier_internal (struct specifier_methods *spec_meths,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
476 Bytecount data_size, int call_create_meth)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 Lisp_Object specifier;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
479 Lisp_Specifier *sp = (Lisp_Specifier *)
456
e7ef97881643 Import from CVS: tag r21-2-43
cvs
parents: 452
diff changeset
480 alloc_lcrecord (aligned_sizeof_specifier (data_size), &lrecord_specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 sp->methods = spec_meths;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 sp->global_specs = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 sp->device_specs = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 sp->frame_specs = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 sp->window_specs = make_weak_list (WEAK_LIST_KEY_ASSOC);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 sp->buffer_specs = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 sp->fallback = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 sp->magic_parent = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 sp->caching = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 sp->next_specifier = Vall_specifiers;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
493 specifier = wrap_specifier (sp);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 Vall_specifiers = specifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 if (call_create_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 GCPRO1 (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 MAYBE_SPECMETH (XSPECIFIER (specifier), create, (specifier));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 return specifier;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 make_specifier (struct specifier_methods *meths)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 return make_specifier_internal (meths, meths->extra_data_size, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 make_magic_specifier (Lisp_Object type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 /* This function can GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 Lisp_Object bodily, ghost;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 bodily = make_specifier (meths);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 GCPRO1 (bodily);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 ghost = make_specifier_internal (meths, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 /* Connect guys together */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 XSPECIFIER(bodily)->magic_parent = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 XSPECIFIER(bodily)->fallback = ghost;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 XSPECIFIER(ghost)->magic_parent = bodily;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 return bodily;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 DEFUN ("make-specifier", Fmake_specifier, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 Return a new specifier object of type TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 A specifier is an object that can be used to keep track of a property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 whose value can be per-buffer, per-window, per-frame, or per-device,
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
538 and can further be restricted to a particular console-type or
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
539 device-class. Specifiers are used, for example, for the various
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
540 built-in properties of a face; this allows a face to have different
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
541 values in different frames, buffers, etc.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
542
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
543 When speaking of the value of a specifier, it is important to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
544 distinguish between the *setting* of a specifier, called an
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
545 \"instantiator\", and the *actual value*, called an \"instance\". You
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
546 put various possible instantiators (i.e. settings) into a specifier
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
547 and associate them with particular locales (buffer, window, frame,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
548 device, global), and then the instance (i.e. actual value) is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
549 retrieved in a specific domain (window, frame, device) by looking
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
550 through the possible instantiators (i.e. settings). This process is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
551 called \"instantiation\".
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
552
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
553 To put settings into a specifier, use `set-specifier', or the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
554 lower-level functions `add-spec-to-specifier' and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
555 `add-spec-list-to-specifier'. You can also temporarily bind a setting
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
556 to a specifier using `let-specifier'. To retrieve settings, use
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
557 `specifier-specs', or its lower-level counterpart
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
558 `specifier-spec-list'. To determine the actual value, use
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
559 `specifier-instance'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
560
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
561 For more information, see `set-specifier', `specifier-instance',
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 `specifier-specs', and `add-spec-to-specifier'; or, for a detailed
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
563 description of specifiers, including how exactly the instantiation
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
564 process works, see the chapter on specifiers in the XEmacs Lisp
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
565 Reference Manual.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 TYPE specifies the particular type of specifier, and should be one of
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
568 the symbols 'generic, 'integer, 'natnum, 'boolean, 'color, 'font,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
569 'image, 'face-boolean, 'display-table, 'gutter, 'gutter-size,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
570 'gutter-visible or 'toolbar.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
571
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
572 For more information on particular types of specifiers, see the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
573 functions `make-generic-specifier', `make-integer-specifier',
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
574 `make-natnum-specifier', `make-boolean-specifier',
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
575 `make-color-specifier', `make-font-specifier', `make-image-specifier',
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
576 `make-face-boolean-specifier', `make-gutter-size-specifier',
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
577 `make-gutter-visible-specifier', `default-toolbar', `default-gutter',
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
578 and `current-display-table'.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 (type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 /* This function can GC */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
583 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 return make_specifier (meths);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 DEFUN ("specifierp", Fspecifierp, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 Return t if OBJECT is a specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 A specifier is an object that can be used to keep track of a property
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 whose value can be per-buffer, per-window, per-frame, or per-device,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 and can further be restricted to a particular console-type or device-class.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 See `make-specifier'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 return SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 DEFUN ("specifier-type", Fspecifier_type, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 Return the type of SPECIFIER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (specifier))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 return intern (XSPECIFIER (specifier)->methods->name);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 /* Locales and domains */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 DEFUN ("valid-specifier-locale-p", Fvalid_specifier_locale_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 Return t if LOCALE is a valid specifier locale.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 Valid locales are devices, frames, windows, buffers, and 'global.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 \(nil is not valid.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 return ((DEVICEP (locale) && DEVICE_LIVE_P (XDEVICE (locale))) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (FRAMEP (locale) && FRAME_LIVE_P (XFRAME (locale))) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (BUFFERP (locale) && BUFFER_LIVE_P (XBUFFER (locale))) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 /* dead windows are allowed because they may become live
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 windows again when a window configuration is restored */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 WINDOWP (locale) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 EQ (locale, Qglobal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 DEFUN ("valid-specifier-domain-p", Fvalid_specifier_domain_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 Return t if DOMAIN is a valid specifier domain.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 A domain is used to instance a specifier (i.e. determine the specifier's
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
636 value in that domain). Valid domains are image instances, windows, frames,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
637 and devices. \(nil is not valid.) image instances are pseudo-domains since
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
638 instantiation will actually occur in the window the image instance itself is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
639 instantiated in.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 return ((DEVICEP (domain) && DEVICE_LIVE_P (XDEVICE (domain))) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 (FRAMEP (domain) && FRAME_LIVE_P (XFRAME (domain))) ||
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
646 (WINDOWP (domain) && WINDOW_LIVE_P (XWINDOW (domain))) ||
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
647 /* #### get image instances out of domains! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
648 IMAGE_INSTANCEP (domain))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
652 DEFUN ("valid-specifier-locale-type-p", Fvalid_specifier_locale_type_p, 1, 1, 0,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
653 /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 Given a specifier LOCALE-TYPE, return non-nil if it is valid.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 Valid locale types are 'global, 'device, 'frame, 'window, and 'buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 \(Note, however, that in functions that accept either a locale or a locale
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 type, 'global is considered an individual locale.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (locale_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 return (EQ (locale_type, Qglobal) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 EQ (locale_type, Qdevice) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 EQ (locale_type, Qframe) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 EQ (locale_type, Qwindow) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 EQ (locale_type, Qbuffer)) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 check_valid_locale_or_locale_type (Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 if (EQ (locale, Qall) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 !NILP (Fvalid_specifier_locale_p (locale)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 !NILP (Fvalid_specifier_locale_type_p (locale)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 return;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
677 invalid_argument ("Invalid specifier locale or locale type", locale);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 DEFUN ("specifier-locale-type-from-locale", Fspecifier_locale_type_from_locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 Given a specifier LOCALE, return its type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 if (NILP (Fvalid_specifier_locale_p (locale)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
688 invalid_argument ("Invalid specifier locale",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
689 locale);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 if (DEVICEP (locale)) return Qdevice;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 if (FRAMEP (locale)) return Qframe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 if (WINDOWP (locale)) return Qwindow;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 if (BUFFERP (locale)) return Qbuffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 assert (EQ (locale, Qglobal));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695 return Qglobal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 decode_locale (Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
700 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 if (NILP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 return Qglobal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 else if (!NILP (Fvalid_specifier_locale_p (locale)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 return locale;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 else
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
707 invalid_argument ("Invalid specifier locale",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
708 locale);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 static enum spec_locale_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 decode_locale_type (Lisp_Object locale_type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 if (EQ (locale_type, Qglobal)) return LOCALE_GLOBAL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 if (EQ (locale_type, Qdevice)) return LOCALE_DEVICE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 if (EQ (locale_type, Qframe)) return LOCALE_FRAME;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 if (EQ (locale_type, Qwindow)) return LOCALE_WINDOW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 if (EQ (locale_type, Qbuffer)) return LOCALE_BUFFER;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
723 invalid_argument ("Invalid specifier locale type",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
724 locale_type);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 return LOCALE_GLOBAL; /* not reached */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 decode_locale_list (Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 /* This cannot GC. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 /* The return value of this function must be GCPRO'd. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 if (NILP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 return list1 (Qall);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 else if (CONSP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 EXTERNAL_LIST_LOOP_2 (elt, locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 check_valid_locale_or_locale_type (elt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 return locale;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 check_valid_locale_or_locale_type (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 return list1 (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 static enum spec_locale_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 locale_type_from_locale (Lisp_Object locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 return decode_locale_type (Fspecifier_locale_type_from_locale (locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 check_valid_domain (Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 if (NILP (Fvalid_specifier_domain_p (domain)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
760 invalid_argument ("Invalid specifier domain",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
761 domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
764 Lisp_Object
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 decode_domain (Lisp_Object domain)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 if (NILP (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 return Fselected_window (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 check_valid_domain (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 return domain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 /* Tags */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 DEFUN ("valid-specifier-tag-p", Fvalid_specifier_tag_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 Return non-nil if TAG is a valid specifier tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 See also `valid-specifier-tag-set-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 (tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 return (valid_console_type_p (tag) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 valid_device_class_p (tag) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 !NILP (assq_no_quit (tag, Vuser_defined_tags))) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 DEFUN ("valid-specifier-tag-set-p", Fvalid_specifier_tag_set_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 Return non-nil if TAG-SET is a valid specifier tag set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 A specifier tag set is an entity that is attached to an instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 and can be used to restrict the scope of that instantiator to a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 particular device class or device type and/or to mark instantiators
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 added by a particular package so that they can be later removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 A specifier tag set consists of a list of zero of more specifier tags,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 each of which is a symbol that is recognized by XEmacs as a tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 \(The valid device types and device classes are always tags, as are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 any tags defined by `define-specifier-tag'.) It is called a "tag set"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 \(as opposed to a list) because the order of the tags or the number of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 times a particular tag occurs does not matter.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 Each tag has a predicate associated with it, which specifies whether
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 that tag applies to a particular device. The tags which are device types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 and classes match devices of that type or class. User-defined tags can
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 have any predicate, or none (meaning that all devices match). When
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 attempting to instance a specifier, a particular instantiator is only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 considered if the device of the domain being instanced over matches
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 all tags in the tag set attached to that instantiator.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 Most of the time, a tag set is not specified, and the instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 gets a null tag set, which matches all devices.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 (tag_set))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 for (rest = tag_set; !NILP (rest); rest = XCDR (rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821 if (!CONSP (rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 if (NILP (Fvalid_specifier_tag_p (XCAR (rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 QUIT;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 decode_specifier_tag_set (Lisp_Object tag_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 /* The return value of this function must be GCPRO'd. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 if (!NILP (Fvalid_specifier_tag_p (tag_set)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 return list1 (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 if (NILP (Fvalid_specifier_tag_set_p (tag_set)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
837 invalid_argument ("Invalid specifier tag-set",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
838 tag_set);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
839 return tag_set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
840 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 canonicalize_tag_set (Lisp_Object tag_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 int len = XINT (Flength (tag_set));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 Lisp_Object *tags, rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 int i, j;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 /* We assume in this function that the tag_set has already been
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 validated, so there are no surprises. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 if (len == 0 || len == 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 /* most common case */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 return tag_set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 tags = alloca_array (Lisp_Object, len);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 i = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 LIST_LOOP (rest, tag_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 tags[i++] = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 /* Sort the list of tags. We use a bubble sort here (copied from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 extent_fragment_update()) -- reduces the function call overhead,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864 and is the fastest sort for small numbers of items. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866 for (i = 1; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 j = i - 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 while (j >= 0 &&
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
870 qxestrcmp (XSTRING_DATA (XSYMBOL (tags[j])->name),
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
871 XSTRING_DATA (XSYMBOL (tags[j+1])->name)) > 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 Lisp_Object tmp = tags[j];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 tags[j] = tags[j+1];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 tags[j+1] = tmp;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 j--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 /* Now eliminate duplicates. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 for (i = 1, j = 1; i < len; i++)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 /* j holds the destination, i the source. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 if (!EQ (tags[i], tags[i-1]))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 tags[j++] = tags[i];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 return Flist (j, tags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 DEFUN ("canonicalize-tag-set", Fcanonicalize_tag_set, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 Canonicalize the given tag set.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 Two canonicalized tag sets can be compared with `equal' to see if they
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 represent the same tag set. (Specifically, canonicalizing involves
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 sorting by symbol name and removing duplicates.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (tag_set))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 if (NILP (Fvalid_specifier_tag_set_p (tag_set)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
901 invalid_argument ("Invalid tag set", tag_set);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 return canonicalize_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 device_matches_specifier_tag_set_p (Lisp_Object device, Lisp_Object tag_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 Lisp_Object devtype, devclass, rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 struct device *d = XDEVICE (device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 devtype = DEVICE_TYPE (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 devclass = DEVICE_CLASS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 LIST_LOOP (rest, tag_set)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 Lisp_Object tag = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 Lisp_Object assoc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 if (EQ (tag, devtype) || EQ (tag, devclass))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 continue;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 assoc = assq_no_quit (tag, DEVICE_USER_DEFINED_TAGS (d));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 /* other built-in tags (device types/classes) are not in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 the user-defined-tags list. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 if (NILP (assoc) || NILP (XCDR (assoc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
931 DEFUN ("device-matches-specifier-tag-set-p",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
932 Fdevice_matches_specifier_tag_set_p, 2, 2, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 Return non-nil if DEVICE matches specifier tag set TAG-SET.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 This means that DEVICE matches each tag in the tag set. (Every
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 tag recognized by XEmacs has a predicate associated with it that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 specifies which devices match it.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 (device, tag_set))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 CHECK_LIVE_DEVICE (device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 if (NILP (Fvalid_specifier_tag_set_p (tag_set)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
943 invalid_argument ("Invalid tag set", tag_set);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 return device_matches_specifier_tag_set_p (device, tag_set) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 DEFUN ("define-specifier-tag", Fdefine_specifier_tag, 1, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 Define a new specifier tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 If PREDICATE is specified, it should be a function of one argument
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951 \(a device) that specifies whether the tag matches that particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 device. If PREDICATE is omitted, the tag matches all devices.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 You can redefine an existing user-defined specifier tag. However,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 you cannot redefine the built-in specifier tags (the device types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 and classes) or the symbols nil, t, 'all, or 'global.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 (tag, predicate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 Lisp_Object assoc, devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 int recompute = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 CHECK_SYMBOL (tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 if (valid_device_class_p (tag) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 valid_console_type_p (tag))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
966 invalid_change ("Cannot redefine built-in specifier tags", tag);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 /* Try to prevent common instantiators and locales from being
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 redefined, to reduce ambiguity */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 if (NILP (tag) || EQ (tag, Qt) || EQ (tag, Qall) || EQ (tag, Qglobal))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
970 invalid_change ("Cannot define nil, t, 'all, or 'global", tag);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 assoc = assq_no_quit (tag, Vuser_defined_tags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 if (NILP (assoc))
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 recompute = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 Vuser_defined_tags = Fcons (Fcons (tag, predicate), Vuser_defined_tags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 DEVICE_LOOP_NO_BREAK (devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 struct device *d = XDEVICE (XCAR (devcons));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 /* Initially set the value to t in case of error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980 in predicate */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 DEVICE_USER_DEFINED_TAGS (d) =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 Fcons (Fcons (tag, Qt), DEVICE_USER_DEFINED_TAGS (d));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985 else if (!NILP (predicate) && !NILP (XCDR (assoc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987 recompute = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 XCDR (assoc) = predicate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 /* recompute the tag values for all devices. However, in the special
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 case where both the old and new predicates are nil, we know that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 we don't have to do this. (It's probably common for people to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 call (define-specifier-tag) more than once on the same tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995 and the most common case is where PREDICATE is not specified.) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 if (recompute)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 DEVICE_LOOP_NO_BREAK (devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 Lisp_Object device = XCAR (devcons);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 assoc = assq_no_quit (tag,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 DEVICE_USER_DEFINED_TAGS (XDEVICE (device)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 assert (CONSP (assoc));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 if (NILP (predicate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 XCDR (assoc) = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 XCDR (assoc) = !NILP (call1 (predicate, device)) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 /* Called at device-creation time to initialize the user-defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 tag values for the newly-created device. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 setup_device_initial_specifier_tags (struct device *d)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 Lisp_Object rest, rest2;
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1022 Lisp_Object device = wrap_device (d);
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
1023
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 DEVICE_USER_DEFINED_TAGS (d) = Fcopy_alist (Vuser_defined_tags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 /* Now set up the initial values */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 LIST_LOOP (rest, DEVICE_USER_DEFINED_TAGS (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 XCDR (XCAR (rest)) = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 for (rest = Vuser_defined_tags, rest2 = DEVICE_USER_DEFINED_TAGS (d);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 !NILP (rest); rest = XCDR (rest), rest2 = XCDR (rest2))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 Lisp_Object predicate = XCDR (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 if (NILP (predicate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 XCDR (XCAR (rest2)) = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 XCDR (XCAR (rest2)) = !NILP (call1 (predicate, device)) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1039 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1040 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1041
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1042 DEFUN ("device-matching-specifier-tag-list",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1043 Fdevice_matching_specifier_tag_list,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 0, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 Return a list of all specifier tags matching DEVICE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1046 DEVICE defaults to the selected device if omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1047 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (device))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1050 struct device *d = decode_device (device);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 Lisp_Object rest, list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 GCPRO1 (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 LIST_LOOP (rest, DEVICE_USER_DEFINED_TAGS (d))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 if (!NILP (XCDR (XCAR (rest))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 list = Fcons (XCAR (XCAR (rest)), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 list = Fnreverse (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 list = Fcons (DEVICE_CLASS (d), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 list = Fcons (DEVICE_TYPE (d), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 RETURN_UNGCPRO (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069 DEFUN ("specifier-tag-list", Fspecifier_tag_list, 0, 0, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 Return a list of all currently-defined specifier tags.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 This includes the built-in ones (the device types and classes).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 ())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1075 Lisp_Object list = Qnil, rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1076 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1077
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1078 GCPRO1 (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1080 LIST_LOOP (rest, Vuser_defined_tags)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081 list = Fcons (XCAR (XCAR (rest)), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 list = Fnreverse (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 list = nconc2 (Fcopy_sequence (Vdevice_class_list), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 list = nconc2 (Fcopy_sequence (Vconsole_type_list), list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 RETURN_UNGCPRO (list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 DEFUN ("specifier-tag-predicate", Fspecifier_tag_predicate, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 Return the predicate for the given specifier tag.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 (tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 /* The return value of this function must be GCPRO'd. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 CHECK_SYMBOL (tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 if (NILP (Fvalid_specifier_tag_p (tag)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1099 invalid_argument ("Invalid specifier tag",
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1100 tag);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 /* Make up some predicates for the built-in types */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 if (valid_console_type_p (tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 return list3 (Qlambda, list1 (Qdevice),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 list3 (Qeq, list2 (Qquote, tag),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 list2 (Qconsole_type, Qdevice)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 if (valid_device_class_p (tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 return list3 (Qlambda, list1 (Qdevice),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 list3 (Qeq, list2 (Qquote, tag),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 list2 (Qdevice_class, Qdevice)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 return XCDR (assq_no_quit (tag, Vuser_defined_tags));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 /* Return true if A "matches" B. If EXACT_P is 0, A must be a subset of B.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 Otherwise, A must be `equal' to B. The sets must be canonicalized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 tag_sets_match_p (Lisp_Object a, Lisp_Object b, int exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 if (!exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 while (!NILP (a) && !NILP (b))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 if (EQ (XCAR (a), XCAR (b)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 a = XCDR (a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 b = XCDR (b);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 return NILP (a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 while (!NILP (a) && !NILP (b))
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 if (!EQ (XCAR (a), XCAR (b)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 a = XCDR (a);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 b = XCDR (b);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 return NILP (a) && NILP (b);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 }
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
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 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 /* Spec-lists and inst-lists */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 call_validate_method (Lisp_Object boxed_method, Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 ((void (*)(Lisp_Object)) get_opaque_ptr (boxed_method)) (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 check_valid_instantiator (Lisp_Object instantiator,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 struct specifier_methods *meths,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
1162 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 if (meths->validate_method)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 Lisp_Object retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170 (meths->validate_method) (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171 retval = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175 Lisp_Object opaque = make_opaque_ptr ((void *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 meths->validate_method);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 GCPRO1 (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180 retval = call_with_suspended_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 ((lisp_fn_t) call_validate_method,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 Qnil, Qspecifier, errb, 2, opaque, instantiator);
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 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 DEFUN ("check-valid-instantiator", Fcheck_valid_instantiator, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 Signal an error if INSTANTIATOR is invalid for SPECIFIER-TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196 (instantiator, specifier_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 struct specifier_methods *meths = decode_specifier_type (specifier_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 return check_valid_instantiator (instantiator, meths, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1204 DEFUN ("valid-instantiator-p", Fvalid_instantiator_p, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1205 Return non-nil if INSTANTIATOR is valid for SPECIFIER-TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1206 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 (instantiator, specifier_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 struct specifier_methods *meths = decode_specifier_type (specifier_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 ERROR_ME);
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 return check_valid_instantiator (instantiator, meths, ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 check_valid_inst_list (Lisp_Object inst_list, struct specifier_methods *meths,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
1217 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 LIST_LOOP (rest, inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 Lisp_Object inst_pair, tag_set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 if (!CONSP (rest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1227 maybe_sferror (
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1228 "Invalid instantiator list", inst_list,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 if (!CONSP (inst_pair = XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1234 maybe_sferror (
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1235 "Invalid instantiator pair", inst_pair,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 if (NILP (Fvalid_specifier_tag_set_p (tag_set = XCAR (inst_pair))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1241 maybe_invalid_argument (
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1242 "Invalid specifier tag", tag_set,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 if (NILP (check_valid_instantiator (XCDR (inst_pair), meths, errb)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1254 DEFUN ("check-valid-inst-list", Fcheck_valid_inst_list, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1255 Signal an error if INST-LIST is invalid for specifier type TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1256 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 (inst_list, type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 return check_valid_inst_list (inst_list, meths, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 DEFUN ("valid-inst-list-p", Fvalid_inst_list_p, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 Return non-nil if INST-LIST is valid for specifier type TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 (inst_list, type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 return check_valid_inst_list (inst_list, meths, ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 check_valid_spec_list (Lisp_Object spec_list, struct specifier_methods *meths,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
1276 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1279
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1280 LIST_LOOP (rest, spec_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1281 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1282 Lisp_Object spec, locale;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1283 if (!CONSP (rest) || !CONSP (spec = XCAR (rest)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1284 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1285 maybe_sferror (
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1286 "Invalid specification list", spec_list,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1287 Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1289 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1290 if (NILP (Fvalid_specifier_locale_p (locale = XCAR (spec))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1291 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1292 maybe_invalid_argument (
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1293 "Invalid specifier locale", locale,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 if (NILP (check_valid_inst_list (XCDR (spec), meths, errb)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1301
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 DEFUN ("check-valid-spec-list", Fcheck_valid_spec_list, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 Signal an error if SPEC-LIST is invalid for specifier type TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 (spec_list, type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 return check_valid_spec_list (spec_list, meths, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 DEFUN ("valid-spec-list-p", Fvalid_spec_list_p, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316 Return non-nil if SPEC-LIST is valid for specifier type TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 (spec_list, type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 struct specifier_methods *meths = decode_specifier_type (type, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 return check_valid_spec_list (spec_list, meths, ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 enum spec_add_meth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 decode_how_to_add_specification (Lisp_Object how_to_add)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 if (NILP (how_to_add) || EQ (Qremove_tag_set_prepend, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 return SPEC_REMOVE_TAG_SET_PREPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 if (EQ (Qremove_tag_set_append, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 return SPEC_REMOVE_TAG_SET_APPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332 if (EQ (Qappend, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 return SPEC_APPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 if (EQ (Qprepend, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 return SPEC_PREPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 if (EQ (Qremove_locale, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337 return SPEC_REMOVE_LOCALE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338 if (EQ (Qremove_locale_type, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 return SPEC_REMOVE_LOCALE_TYPE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 if (EQ (Qremove_all, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 return SPEC_REMOVE_ALL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1343 invalid_constant ("Invalid `how-to-add' flag", how_to_add);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1344
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1345 return SPEC_PREPEND; /* not reached */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1346 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1347
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1348 /* Given a specifier object SPEC, return bodily specifier if SPEC is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1349 ghost specifier, otherwise return the object itself
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1350 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 bodily_specifier (Lisp_Object spec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 return (GHOST_SPECIFIER_P (XSPECIFIER (spec))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 ? XSPECIFIER(spec)->magic_parent : spec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 /* Signal error if (specifier SPEC is read-only.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1359 Read only are ghost specifiers unless Vunlock_ghost_specifiers is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1360 non-nil. All other specifiers are read-write.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1362 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 check_modifiable_specifier (Lisp_Object spec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1365 if (NILP (Vunlock_ghost_specifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1366 && GHOST_SPECIFIER_P (XSPECIFIER (spec)))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1367 signal_error (Qsetting_constant,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1368 "Attempt to modify read-only specifier",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
1369 spec);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 /* Helper function which unwind protects the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 Vunlock_ghost_specifiers, then sets it to non-nil value */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1374 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375 restore_unlock_value (Lisp_Object val)
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 Vunlock_ghost_specifiers = val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1380
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1381 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1382 unlock_ghost_specifiers_protected (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1383 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1384 int depth = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385 record_unwind_protect (restore_unlock_value,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 Vunlock_ghost_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 Vunlock_ghost_specifiers = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388 return depth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1391 /* This gets hit so much that the function call overhead had a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 measurable impact (according to Quantify). #### We should figure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 out the frequency with which this is called with the various types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 and reorder the check accordingly. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 #define SPECIFIER_GET_SPEC_LIST(specifier, type) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1396 (type == LOCALE_GLOBAL ? &(XSPECIFIER (specifier)->global_specs) : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397 type == LOCALE_DEVICE ? &(XSPECIFIER (specifier)->device_specs) : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1398 type == LOCALE_FRAME ? &(XSPECIFIER (specifier)->frame_specs) : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 type == LOCALE_WINDOW ? &(XWEAK_LIST_LIST \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1400 (XSPECIFIER (specifier)->window_specs)) : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 type == LOCALE_BUFFER ? &(XSPECIFIER (specifier)->buffer_specs) : \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1402 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1404 static Lisp_Object *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 specifier_get_inst_list (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1406 enum spec_locale_type type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 Lisp_Object *spec_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1409 Lisp_Object specification;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1410
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1411 if (type == LOCALE_GLOBAL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1412 return spec_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413 /* Calling assq_no_quit when it is just going to return nil anyhow
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1414 is extremely expensive. So sayeth Quantify. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 if (!CONSP (*spec_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 specification = assq_no_quit (locale, *spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1418 if (NILP (specification))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1419 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1420 return &XCDR (specification);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1421 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 /* For the given INST_LIST, return a new INST_LIST containing all elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 where TAG-SET matches the element's tag set. EXACT_P indicates whether
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 the match must be exact (as opposed to a subset). SHORT_P indicates
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 that the short form (for `specifier-specs') should be returned if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1427 possible. If COPY_TREE_P, `copy-tree' is used to ensure that no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1428 elements of the new list are shared with the initial list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1429 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1430
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 specifier_process_inst_list (Lisp_Object inst_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1433 Lisp_Object tag_set, int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1434 int short_p, int copy_tree_p)
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 Lisp_Object retval = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 GCPRO1 (retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 LIST_LOOP (rest, inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1443 Lisp_Object tagged_inst = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 Lisp_Object tagged_inst_tag = XCAR (tagged_inst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 if (tag_sets_match_p (tag_set, tagged_inst_tag, exact_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 if (short_p && NILP (tagged_inst_tag))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 retval = Fcons (copy_tree_p ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 Fcopy_tree (XCDR (tagged_inst), Qt) :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 XCDR (tagged_inst),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1453 retval = Fcons (copy_tree_p ? Fcopy_tree (tagged_inst, Qt) :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1454 tagged_inst, retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1455 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1456 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1457 retval = Fnreverse (retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1458 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 /* If there is a single instantiator and the short form is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 requested, return just the instantiator (rather than a one-element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 list of it) unless it is nil (so that it can be distinguished from
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 no instantiators at all). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 if (short_p && CONSP (retval) && !NILP (XCAR (retval)) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 NILP (XCDR (retval)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 return XCAR (retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1466 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 specifier_get_external_inst_list (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472 enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1473 Lisp_Object tag_set, int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 int short_p, int copy_tree_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 Lisp_Object *inst_list = specifier_get_inst_list (specifier, locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1478 if (!inst_list || NILP (*inst_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1479 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480 /* nil for *inst_list should only occur in 'global */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481 assert (!inst_list || EQ (locale, Qglobal));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 return specifier_process_inst_list (*inst_list, tag_set, exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 short_p, copy_tree_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 specifier_get_external_spec_list (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 Lisp_Object tag_set, int exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 Lisp_Object *spec_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 Lisp_Object retval = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 assert (type != LOCALE_GLOBAL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 /* We're about to let stuff go external; make sure there aren't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 any dead objects */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 *spec_list = cleanup_assoc_list (*spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 GCPRO1 (retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505 LIST_LOOP (rest, *spec_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1506 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1507 Lisp_Object spec = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1508 Lisp_Object inst_list =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1509 specifier_process_inst_list (XCDR (spec), tag_set, exact_p, 0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1510 if (!NILP (inst_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1511 retval = Fcons (Fcons (XCAR (spec), inst_list), retval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1513 RETURN_UNGCPRO (Fnreverse (retval));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1514 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1515
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1516 static Lisp_Object *
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1517 specifier_new_spec (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1518 enum spec_locale_type type)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1519 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1520 Lisp_Object *spec_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1521 Lisp_Object new_spec = Fcons (locale, Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1522 assert (type != LOCALE_GLOBAL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1523 *spec_list = Fcons (new_spec, *spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1524 return &XCDR (new_spec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 /* For the given INST_LIST, return a new list comprised of elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 where TAG_SET does not match the element's tag set. This operation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 is destructive. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 specifier_process_remove_inst_list (Lisp_Object inst_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 Lisp_Object tag_set, int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 int *was_removed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 Lisp_Object prev = Qnil, rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 *was_removed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 LIST_LOOP (rest, inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 if (tag_sets_match_p (tag_set, XCAR (XCAR (rest)), exact_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 /* time to remove. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 *was_removed = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 if (NILP (prev))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 inst_list = XCDR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 XCDR (prev) = XCDR (rest);
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 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 prev = rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 return inst_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 }
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 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 specifier_remove_spec (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 Lisp_Object tag_set, int exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1563 Lisp_Object *spec_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1564 Lisp_Object assoc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1565 int was_removed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 if (type == LOCALE_GLOBAL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 *spec_list = specifier_process_remove_inst_list (*spec_list, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 exact_p, &was_removed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 assoc = assq_no_quit (locale, *spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 if (NILP (assoc))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 /* this locale is not found. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 XCDR (assoc) = specifier_process_remove_inst_list (XCDR (assoc),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 tag_set, exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 &was_removed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 if (NILP (XCDR (assoc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580 /* no inst-pairs left; remove this locale entirely. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 *spec_list = remassq_no_quit (locale, *spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 if (was_removed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 MAYBE_SPECMETH (XSPECIFIER (specifier), after_change,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 (bodily_specifier (specifier), locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 specifier_remove_locale_type (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 Lisp_Object tag_set, int exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 Lisp_Object *spec_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 Lisp_Object prev = Qnil, rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 assert (type != LOCALE_GLOBAL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 LIST_LOOP (rest, *spec_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 int was_removed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 int remove_spec = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 Lisp_Object spec = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 /* There may be dead objects floating around */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 /* remember, dead windows can become alive again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 if (!WINDOWP (XCAR (spec)) && object_dead_p (XCAR (spec)))
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 remove_spec = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 was_removed = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1613 XCDR (spec) = specifier_process_remove_inst_list (XCDR (spec),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 tag_set, exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 &was_removed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 if (NILP (XCDR (spec)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 remove_spec = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1619
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1620 if (remove_spec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1621 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 if (NILP (prev))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1623 *spec_list = XCDR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1624 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1625 XCDR (prev) = XCDR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1626 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1627 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1628 prev = rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1629
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1630 if (was_removed)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1631 MAYBE_SPECMETH (XSPECIFIER (specifier), after_change,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1632 (bodily_specifier (specifier), XCAR (spec)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1633 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1634 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1635
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1636 /* NEW_LIST is going to be added to INST_LIST, with add method ADD_METH.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1637 Frob INST_LIST according to ADD_METH. No need to call an after-change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1638 function; the calling function will do this. Return either SPEC_PREPEND
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1639 or SPEC_APPEND, indicating whether to prepend or append the NEW_LIST. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1640
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1641 static enum spec_add_meth
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1642 handle_multiple_add_insts (Lisp_Object *inst_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1643 Lisp_Object new_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1644 enum spec_add_meth add_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1645 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1646 switch (add_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1647 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1648 case SPEC_REMOVE_TAG_SET_APPEND:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1649 add_meth = SPEC_APPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1650 goto remove_tag_set;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1651 case SPEC_REMOVE_TAG_SET_PREPEND:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1652 add_meth = SPEC_PREPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1653 remove_tag_set:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1654 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1655 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1656
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1657 LIST_LOOP (rest, new_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1658 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1659 Lisp_Object canontag = canonicalize_tag_set (XCAR (XCAR (rest)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1660 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1661
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662 GCPRO1 (canontag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 /* pull out all elements from the existing list with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 same tag as any tags in NEW_LIST. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 *inst_list = remassoc_no_quit (canontag, *inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 return add_meth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1670 case SPEC_REMOVE_LOCALE:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 *inst_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 return SPEC_PREPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 case SPEC_APPEND:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 return add_meth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 return SPEC_PREPEND;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1677 }
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 /* Given a LOCALE and INST_LIST that is going to be added to SPECIFIER,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 copy, canonicalize, and call the going_to_add methods as necessary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 to produce a new list that is the one that really will be added
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1683 to the specifier. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1684
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1686 build_up_processed_list (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1687 Lisp_Object inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1688 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1689 /* The return value of this function must be GCPRO'd. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1690 Lisp_Object rest, list_to_build_up = Qnil;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1691 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 GCPRO1 (list_to_build_up);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 LIST_LOOP (rest, inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 Lisp_Object tag_set = XCAR (XCAR (rest));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 Lisp_Object sub_inst_list = Qnil;
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1699 Lisp_Object instantiator;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 struct gcpro ngcpro1, ngcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1702 if (HAS_SPECMETH_P (sp, copy_instantiator))
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1703 instantiator = SPECMETH (sp, copy_instantiator,
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1704 (XCDR (XCAR (rest))));
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1705 else
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1706 instantiator = Fcopy_tree (XCDR (XCAR (rest)), Qt);
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
1707
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 NGCPRO2 (instantiator, sub_inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 /* call the will-add method; it may GC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 sub_inst_list = HAS_SPECMETH_P (sp, going_to_add) ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 SPECMETH (sp, going_to_add,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 (bodily_specifier (specifier), locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 tag_set, instantiator)) :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1714 Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1715 if (EQ (sub_inst_list, Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1716 /* no change here. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717 sub_inst_list = list1 (Fcons (canonicalize_tag_set (tag_set),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718 instantiator));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 /* now canonicalize all the tag sets in the new objects */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 Lisp_Object rest2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 LIST_LOOP (rest2, sub_inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 XCAR (XCAR (rest2)) = canonicalize_tag_set (XCAR (XCAR (rest2)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1726
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1727 list_to_build_up = nconc2 (sub_inst_list, list_to_build_up);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 NUNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 RETURN_UNGCPRO (Fnreverse (list_to_build_up));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 /* Add a specification (locale and instantiator list) to a specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 ADD_METH specifies what to do with existing specifications in the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 specifier, and is an enum that corresponds to the values in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 `add-spec-to-specifier'. The calling routine is responsible for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 validating LOCALE and INST-LIST, but the tag-sets in INST-LIST
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 do not need to be canonicalized. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1741 /* #### I really need to rethink the after-change
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1742 functions to make them easier to use and more efficient. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1745 specifier_add_spec (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1746 Lisp_Object inst_list, enum spec_add_meth add_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
1748 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 enum spec_locale_type type = locale_type_from_locale (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 Lisp_Object *orig_inst_list, tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 Lisp_Object list_to_build_up = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 GCPRO1 (list_to_build_up);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 list_to_build_up = build_up_processed_list (specifier, locale, inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 /* Now handle REMOVE_LOCALE_TYPE and REMOVE_ALL. These are the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 add-meth types that affect locales other than this one. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 if (add_meth == SPEC_REMOVE_LOCALE_TYPE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 specifier_remove_locale_type (specifier, type, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 else if (add_meth == SPEC_REMOVE_ALL)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 specifier_remove_locale_type (specifier, LOCALE_BUFFER, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 specifier_remove_locale_type (specifier, LOCALE_WINDOW, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 specifier_remove_locale_type (specifier, LOCALE_FRAME, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1765 specifier_remove_locale_type (specifier, LOCALE_DEVICE, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1766 specifier_remove_spec (specifier, Qglobal, LOCALE_GLOBAL, Qnil, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1768
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 orig_inst_list = specifier_get_inst_list (specifier, locale, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 if (!orig_inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1771 orig_inst_list = specifier_new_spec (specifier, locale, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 add_meth = handle_multiple_add_insts (orig_inst_list, list_to_build_up,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 if (add_meth == SPEC_PREPEND)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 tem = nconc2 (list_to_build_up, *orig_inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 else if (add_meth == SPEC_APPEND)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 tem = nconc2 (*orig_inst_list, list_to_build_up);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1780 {
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1781 abort ();
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1782 tem = Qnil;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1783 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 *orig_inst_list = tem;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 /* call the after-change method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 MAYBE_SPECMETH (sp, after_change,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 (bodily_specifier (specifier), locale));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 specifier_copy_spec (Lisp_Object specifier, Lisp_Object dest,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 Lisp_Object locale, enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 Lisp_Object tag_set, int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 enum spec_add_meth add_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 Lisp_Object inst_list =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 specifier_get_external_inst_list (specifier, locale, type, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 exact_p, 0, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 specifier_add_spec (dest, locale, inst_list, add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 specifier_copy_locale_type (Lisp_Object specifier, Lisp_Object dest,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 enum spec_locale_type type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 Lisp_Object tag_set, int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 enum spec_add_meth add_meth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812 Lisp_Object *src_list = SPECIFIER_GET_SPEC_LIST (specifier, type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 /* This algorithm is O(n^2) in running time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 It's certainly possible to implement an O(n log n) algorithm,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 but I doubt there's any need to. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819 LIST_LOOP (rest, *src_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 Lisp_Object spec = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 /* There may be dead objects floating around */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 /* remember, dead windows can become alive again. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 if (WINDOWP (XCAR (spec)) || !object_dead_p (XCAR (spec)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 specifier_add_spec
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 (dest, XCAR (spec),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 specifier_process_inst_list (XCDR (spec), tag_set, exact_p, 0, 0),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1830 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1831
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1832 /* map MAPFUN over the locales in SPECIFIER that are given in LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 CLOSURE is passed unchanged to MAPFUN. LOCALE can be one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 -- nil (same as 'all)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 -- a single locale, locale type, or 'all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 -- a list of locales, locale types, and/or 'all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 MAPFUN is called for each locale and locale type given; for 'all,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 it is called for the locale 'global and for the four possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 locale types. In each invocation, either LOCALE will be a locale
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 and LOCALE_TYPE will be the locale type of this locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 or LOCALE will be nil and LOCALE_TYPE will be a locale type.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 If MAPFUN ever returns non-zero, the mapping is halted and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 value returned is returned from map_specifier(). Otherwise, the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 mapping proceeds to the end and map_specifier() returns 0.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 map_specifier (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 int (*mapfun) (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 enum spec_locale_type locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854 Lisp_Object tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 void *closure),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 Lisp_Object tag_set, Lisp_Object exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 void *closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 int retval = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1861 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 GCPRO2 (tag_set, locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1865 locale = decode_locale_list (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 tag_set = decode_specifier_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 tag_set = canonicalize_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 LIST_LOOP (rest, locale)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 Lisp_Object theloc = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 if (!NILP (Fvalid_specifier_locale_p (theloc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 retval = (*mapfun) (specifier, theloc,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 locale_type_from_locale (theloc),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 tag_set, !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 else if (!NILP (Fvalid_specifier_locale_type_p (theloc)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 retval = (*mapfun) (specifier, Qnil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 decode_locale_type (theloc), tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 assert (EQ (theloc, Qall));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 retval = (*mapfun) (specifier, Qnil, LOCALE_BUFFER, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 retval = (*mapfun) (specifier, Qnil, LOCALE_WINDOW, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899 retval = (*mapfun) (specifier, Qnil, LOCALE_FRAME, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 retval = (*mapfun) (specifier, Qnil, LOCALE_DEVICE, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 retval = (*mapfun) (specifier, Qglobal, LOCALE_GLOBAL, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 !NILP (exact_p), closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 if (retval)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 DEFUN ("add-spec-to-specifier", Fadd_spec_to_specifier, 2, 5, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919 Add a specification to SPECIFIER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 The specification maps from LOCALE (which should be a window, buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 frame, device, or 'global, and defaults to 'global) to INSTANTIATOR,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 whose allowed values depend on the type of the specifier. Optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 argument TAG-SET limits the instantiator to apply only to the specified
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 tag set, which should be a list of tags all of which must match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 device being instantiated over (tags are a device type, a device class,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 or tags defined with `define-specifier-tag'). Specifying a single
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 symbol for TAG-SET is equivalent to specifying a one-element list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928 containing that symbol. Optional argument HOW-TO-ADD specifies what to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1929 do if there are already specifications in the specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1930 It should be one of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1931
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1932 'prepend Put at the beginning of the current list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1933 instantiators for LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1934 'append Add to the end of the current list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1935 instantiators for LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1936 'remove-tag-set-prepend (this is the default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1937 Remove any existing instantiators whose tag set is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1938 the same as TAG-SET; then put the new instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1939 at the beginning of the current list. ("Same tag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1940 set" means that they contain the same elements.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 The order may be different.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 'remove-tag-set-append
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 Remove any existing instantiators whose tag set is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 the same as TAG-SET; then put the new instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1945 at the end of the current list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1946 'remove-locale Remove all previous instantiators for this locale
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1947 before adding the new spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1948 'remove-locale-type Remove all specifications for all locales of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 same type as LOCALE (this includes LOCALE itself)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 before adding the new spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 'remove-all Remove all specifications from the specifier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 before adding the new spec.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1954 You can retrieve the specifications for a particular locale or locale type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1955 with the function `specifier-spec-list' or `specifier-specs'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 (specifier, instantiator, locale, tag_set, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 enum spec_add_meth add_meth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 Lisp_Object inst_list;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1961 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1963 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1964 check_modifiable_specifier (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 locale = decode_locale (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 check_valid_instantiator (instantiator,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 decode_specifier_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 (Fspecifier_type (specifier), ERROR_ME),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1970 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1971 /* tag_set might be newly-created material, but it's part of inst_list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972 so is properly GC-protected. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 tag_set = decode_specifier_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 add_meth = decode_how_to_add_specification (how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 inst_list = list1 (Fcons (tag_set, instantiator));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1977 GCPRO1 (inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1978 specifier_add_spec (specifier, locale, inst_list, add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 RETURN_UNGCPRO (Qnil);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1981 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 DEFUN ("add-spec-list-to-specifier", Fadd_spec_list_to_specifier, 2, 3, 0, /*
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1984 Add SPEC-LIST (a list of specifications) to SPECIFIER.
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1985 The format of SPEC-LIST is
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 ((LOCALE (TAG-SET . INSTANTIATOR) ...) ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 where
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1990 LOCALE := a window, a buffer, a frame, a device, or 'global
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 TAG-SET := an unordered list of zero or more TAGS, each of which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 is a symbol
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 TAG := a device class (see `valid-device-class-p'), a device type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1994 (see `valid-console-type-p'), or a tag defined with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 `define-specifier-tag'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 INSTANTIATOR := format determined by the type of specifier
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1998 The pair (TAG-SET . INSTANTIATOR) is called an `inst-pair'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1999 A list of inst-pairs is called an `inst-list'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2000 The pair (LOCALE . INST-LIST) is called a `specification' or `spec'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 A spec-list, then, can be viewed as a list of specifications.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2002
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2003 HOW-TO-ADD specifies how to combine the new specifications with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2004 the existing ones, and has the same semantics as for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 `add-spec-to-specifier'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2007 In many circumstances, the higher-level function `set-specifier' is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2008 more convenient and should be used instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 (specifier, spec_list, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2011 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2012 enum spec_add_meth add_meth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2016 check_modifiable_specifier (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2017
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2018 check_valid_spec_list (spec_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2019 decode_specifier_type
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 (Fspecifier_type (specifier), ERROR_ME),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 add_meth = decode_how_to_add_specification (how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 LIST_LOOP (rest, spec_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2026 /* Placating the GCC god. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 Lisp_Object specification = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 Lisp_Object locale = XCAR (specification);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2029 Lisp_Object inst_list = XCDR (specification);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2030
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2031 specifier_add_spec (specifier, locale, inst_list, add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2032 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2033 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2034 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2035 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2036
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2037 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2038 add_spec_to_ghost_specifier (Lisp_Object specifier, Lisp_Object instantiator,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2039 Lisp_Object locale, Lisp_Object tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2040 Lisp_Object how_to_add)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2041 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2042 int depth = unlock_ghost_specifiers_protected ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2043 Fadd_spec_to_specifier (XSPECIFIER(specifier)->fallback,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2044 instantiator, locale, tag_set, how_to_add);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2045 unbind_to (depth);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2046 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2047
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2048 struct specifier_spec_list_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2049 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2050 Lisp_Object head, tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2051 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2053 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2054 specifier_spec_list_mapfun (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2055 Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2056 enum spec_locale_type locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2057 Lisp_Object tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2058 int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2059 void *closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2061 struct specifier_spec_list_closure *cl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2062 (struct specifier_spec_list_closure *) closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2063 Lisp_Object partial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2065 if (NILP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2066 partial = specifier_get_external_spec_list (specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2067 locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2068 tag_set, exact_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2069 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2070 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2071 partial = specifier_get_external_inst_list (specifier, locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2072 locale_type, tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2073 exact_p, 0, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2074 if (!NILP (partial))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2075 partial = list1 (Fcons (locale, partial));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2076 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2077 if (NILP (partial))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2078 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2079
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2080 /* tack on the new list */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2081 if (NILP (cl->tail))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2082 cl->head = cl->tail = partial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2083 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2084 XCDR (cl->tail) = partial;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2085 /* find the new tail */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2086 while (CONSP (XCDR (cl->tail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2087 cl->tail = XCDR (cl->tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2088 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2089 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2090
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2091 /* For the given SPECIFIER create and return a list of all specs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2092 contained within it, subject to LOCALE. If LOCALE is a locale, only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2093 specs in that locale will be returned. If LOCALE is a locale type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2094 all specs in all locales of that type will be returned. If LOCALE is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2095 nil, all specs will be returned. This always copies lists and never
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 returns the actual lists, because we do not want someone manipulating
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 the actual objects. This may cause a slight loss of potential
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 functionality but if we were to allow it then a user could manage to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2099 violate our assertion that the specs contained in the actual
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 specifier lists are all valid. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 DEFUN ("specifier-spec-list", Fspecifier_spec_list, 1, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 Return the spec-list of specifications for SPECIFIER in LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 If LOCALE is a particular locale (a buffer, window, frame, device,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 or 'global), a spec-list consisting of the specification for that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 locale will be returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2109 If LOCALE is a locale type (i.e. 'buffer, 'window, 'frame, or 'device),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2110 a spec-list of the specifications for all locales of that type will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2111 returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2113 If LOCALE is nil or 'all, a spec-list of all specifications in SPECIFIER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2114 will be returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2116 LOCALE can also be a list of locales, locale types, and/or 'all; the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2117 result is as if `specifier-spec-list' were called on each element of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 list and the results concatenated together.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2120 Only instantiators where TAG-SET (a list of zero or more tags) is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2121 subset of (or possibly equal to) the instantiator's tag set are returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122 \(The default value of nil is a subset of all tag sets, so in this case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 no instantiators will be screened out.) If EXACT-P is non-nil, however,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 TAG-SET must be equal to an instantiator's tag set for the instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 to be returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 (specifier, locale, tag_set, exact_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2128 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129 struct specifier_spec_list_closure cl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 cl.head = cl.tail = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 GCPRO2 (cl.head, cl.tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 map_specifier (specifier, locale, specifier_spec_list_mapfun,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2136 tag_set, exact_p, &cl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 return cl.head;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 DEFUN ("specifier-specs", Fspecifier_specs, 1, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 Return the specification(s) for SPECIFIER in LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 If LOCALE is a single locale or is a list of one element containing a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 single locale, then a "short form" of the instantiators for that locale
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 will be returned. Otherwise, this function is identical to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 `specifier-spec-list'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 The "short form" is designed for readability and not for ease of use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 in Lisp programs, and is as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153 1. If there is only one instantiator, then an inst-pair (i.e. cons of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 tag and instantiator) will be returned; otherwise a list of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 inst-pairs will be returned.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 2. For each inst-pair returned, if the instantiator's tag is 'any,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 the tag will be removed and the instantiator itself will be returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2158 instead of the inst-pair.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 3. If there is only one instantiator, its value is nil, and its tag is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 'any, a one-element list containing nil will be returned rather
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 than just nil, to distinguish this case from there being no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 instantiators at all.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164 (specifier, locale, tag_set, exact_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 if (!NILP (Fvalid_specifier_locale_p (locale)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 (CONSP (locale) && !NILP (Fvalid_specifier_locale_p (XCAR (locale))) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 NILP (XCDR (locale))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 if (CONSP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 locale = XCAR (locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 GCPRO1 (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 tag_set = decode_specifier_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 tag_set = canonicalize_tag_set (tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 RETURN_UNGCPRO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 (specifier_get_external_inst_list (specifier, locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180 locale_type_from_locale (locale),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 tag_set, !NILP (exact_p), 1, 1));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 return Fspecifier_spec_list (specifier, locale, tag_set, exact_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 remove_specifier_mapfun (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190 enum spec_locale_type locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2191 Lisp_Object tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2192 int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2193 void *ignored_closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2194 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2195 if (NILP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2196 specifier_remove_locale_type (specifier, locale_type, tag_set, exact_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2197 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2198 specifier_remove_spec (specifier, locale, locale_type, tag_set, exact_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2199 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2200 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2201
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2202 DEFUN ("remove-specifier", Fremove_specifier, 1, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2203 Remove specification(s) for SPECIFIER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2204
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2205 If LOCALE is a particular locale (a window, buffer, frame, device,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2206 or 'global), the specification for that locale will be removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2207
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2208 If instead, LOCALE is a locale type (i.e. 'window, 'buffer, 'frame,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2209 or 'device), the specifications for all locales of that type will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2210 removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2211
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2212 If LOCALE is nil or 'all, all specifications will be removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2213
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2214 LOCALE can also be a list of locales, locale types, and/or 'all; this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2215 is equivalent to calling `remove-specifier' for each of the elements
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2216 in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2217
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2218 Only instantiators where TAG-SET (a list of zero or more tags) is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2219 subset of (or possibly equal to) the instantiator's tag set are removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2220 The default value of nil is a subset of all tag sets, so in this case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2221 no instantiators will be screened out. If EXACT-P is non-nil, however,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2222 TAG-SET must be equal to an instantiator's tag set for the instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2223 to be removed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2224 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2225 (specifier, locale, tag_set, exact_p))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2226 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2227 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2228 check_modifiable_specifier (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2229
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2230 map_specifier (specifier, locale, remove_specifier_mapfun,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2231 tag_set, exact_p, 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2232 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2233 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2234 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2236 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2237 remove_ghost_specifier (Lisp_Object specifier, Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2238 Lisp_Object tag_set, Lisp_Object exact_p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2239 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2240 int depth = unlock_ghost_specifiers_protected ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2241 Fremove_specifier (XSPECIFIER(specifier)->fallback,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2242 locale, tag_set, exact_p);
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2243 unbind_to (depth);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2244 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2246 struct copy_specifier_closure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2247 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2248 Lisp_Object dest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2249 enum spec_add_meth add_meth;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2250 int add_meth_is_nil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2251 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2252
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2253 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2254 copy_specifier_mapfun (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2255 Lisp_Object locale,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2256 enum spec_locale_type locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2257 Lisp_Object tag_set,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2258 int exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2259 void *closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2260 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2261 struct copy_specifier_closure *cl =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2262 (struct copy_specifier_closure *) closure;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2264 if (NILP (locale))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2265 specifier_copy_locale_type (specifier, cl->dest, locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2266 tag_set, exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2267 cl->add_meth_is_nil ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2268 SPEC_REMOVE_LOCALE_TYPE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2269 cl->add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2270 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2271 specifier_copy_spec (specifier, cl->dest, locale, locale_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2272 tag_set, exact_p,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2273 cl->add_meth_is_nil ? SPEC_REMOVE_LOCALE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2274 cl->add_meth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2275 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2276 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2277
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2278 DEFUN ("copy-specifier", Fcopy_specifier, 1, 6, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2279 Copy SPECIFIER to DEST, or create a new one if DEST is nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2281 If DEST is nil or omitted, a new specifier will be created and the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2282 specifications copied into it. Otherwise, the specifications will be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2283 copied into the existing specifier in DEST.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2285 If LOCALE is nil or 'all, all specifications will be copied. If LOCALE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2286 is a particular locale, the specification for that particular locale will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2287 be copied. If LOCALE is a locale type, the specifications for all locales
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2288 of that type will be copied. LOCALE can also be a list of locales,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2289 locale types, and/or 'all; this is equivalent to calling `copy-specifier'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2290 for each of the elements of the list. See `specifier-spec-list' for more
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2291 information about LOCALE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 Only instantiators where TAG-SET (a list of zero or more tags) is a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2294 subset of (or possibly equal to) the instantiator's tag set are copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2295 The default value of nil is a subset of all tag sets, so in this case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2296 no instantiators will be screened out. If EXACT-P is non-nil, however,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2297 TAG-SET must be equal to an instantiator's tag set for the instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2298 to be copied.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2299
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2300 Optional argument HOW-TO-ADD specifies what to do with existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2301 specifications in DEST. If nil, then whichever locales or locale types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2302 are copied will first be completely erased in DEST. Otherwise, it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2303 the same as in `add-spec-to-specifier'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2304 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2305 (specifier, dest, locale, tag_set, exact_p, how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2306 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2307 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2308 struct copy_specifier_closure cl;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2309
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2310 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2311 if (NILP (how_to_add))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2312 cl.add_meth_is_nil = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2313 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2314 cl.add_meth_is_nil = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2315 cl.add_meth = decode_how_to_add_specification (how_to_add);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2316 if (NILP (dest))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2317 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2318 /* #### What about copying the extra data? */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2319 dest = make_specifier (XSPECIFIER (specifier)->methods);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2320 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2321 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2322 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2323 CHECK_SPECIFIER (dest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2324 check_modifiable_specifier (dest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2325 if (XSPECIFIER (dest)->methods != XSPECIFIER (specifier)->methods)
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
2326 invalid_argument ("Specifiers not of same type", Qunbound);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2329 cl.dest = dest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2330 GCPRO1 (dest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2331 map_specifier (specifier, locale, copy_specifier_mapfun,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2332 tag_set, exact_p, &cl);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2333 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2334 recompute_cached_specifier_everywhere (dest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2335 return dest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2336 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2339 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2340 /* Instancing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2341 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2342
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2343 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2344 call_validate_matchspec_method (Lisp_Object boxed_method,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2345 Lisp_Object matchspec)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2346 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2347 ((void (*)(Lisp_Object)) get_opaque_ptr (boxed_method)) (matchspec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2348 return Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2349 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2350
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2351 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2352 check_valid_specifier_matchspec (Lisp_Object matchspec,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2353 struct specifier_methods *meths,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2354 Error_Behavior errb)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2355 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2356 if (meths->validate_matchspec_method)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2357 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2358 Lisp_Object retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2359
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2360 if (ERRB_EQ (errb, ERROR_ME))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2361 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2362 (meths->validate_matchspec_method) (matchspec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2363 retval = Qt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2364 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2365 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2366 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2367 Lisp_Object opaque =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2368 make_opaque_ptr ((void *) meths->validate_matchspec_method);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2369 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2370
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2371 GCPRO1 (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2372 retval = call_with_suspended_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2373 ((lisp_fn_t) call_validate_matchspec_method,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2374 Qnil, Qspecifier, errb, 2, opaque, matchspec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2375
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2376 free_opaque_ptr (opaque);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2377 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2378 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2380 return retval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2381 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2382 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2383 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
2384 maybe_sferror
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2385 ("Matchspecs not allowed for this specifier type",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2386 intern (meths->name), Qspecifier, errb);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2387 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2388 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2389 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2390
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2391 DEFUN ("check-valid-specifier-matchspec", Fcheck_valid_specifier_matchspec, 2,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2392 2, 0, /*
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2393 Signal an error if MATCHSPEC is invalid for SPECIFIER-TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2394 See `specifier-matching-instance' for a description of matchspecs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2395 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2396 (matchspec, specifier_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2397 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2398 struct specifier_methods *meths = decode_specifier_type (specifier_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2399 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2400
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2401 return check_valid_specifier_matchspec (matchspec, meths, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2402 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2404 DEFUN ("valid-specifier-matchspec-p", Fvalid_specifier_matchspec_p, 2, 2, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2405 Return non-nil if MATCHSPEC is valid for SPECIFIER-TYPE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2406 See `specifier-matching-instance' for a description of matchspecs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2407 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2408 (matchspec, specifier_type))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2409 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2410 struct specifier_methods *meths = decode_specifier_type (specifier_type,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2411 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2413 return check_valid_specifier_matchspec (matchspec, meths, ERROR_ME_NOT);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2414 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2415
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2416 /* This function is purposely not callable from Lisp. If a Lisp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2417 caller wants to set a fallback, they should just set the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2418 global value. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2419
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2420 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2421 set_specifier_fallback (Lisp_Object specifier, Lisp_Object fallback)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2422 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2423 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2424 assert (SPECIFIERP (fallback) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2425 !NILP (Fvalid_inst_list_p (fallback, Fspecifier_type (specifier))));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2426 if (SPECIFIERP (fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2427 assert (EQ (Fspecifier_type (specifier), Fspecifier_type (fallback)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2428 if (BODILY_SPECIFIER_P (sp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2429 GHOST_SPECIFIER(sp)->fallback = fallback;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2430 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2431 sp->fallback = fallback;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2432 /* call the after-change method */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2433 MAYBE_SPECMETH (sp, after_change,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2434 (bodily_specifier (specifier), Qfallback));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2435 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2436 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2437
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2438 DEFUN ("specifier-fallback", Fspecifier_fallback, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2439 Return the fallback value for SPECIFIER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2440 Fallback values are provided by the C code for certain built-in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2441 specifiers to make sure that instancing won't fail even if all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2442 specs are removed from the specifier, or to implement simple
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2443 inheritance behavior (e.g. this method is used to ensure that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2444 faces other than 'default inherit their attributes from 'default).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2445 By design, you cannot change the fallback value, and specifiers
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2446 created with `make-specifier' will never have a fallback (although
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2447 a similar, Lisp-accessible capability may be provided in the future
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2448 to allow for inheritance).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2449
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2450 The fallback value will be an inst-list that is instanced like
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2451 any other inst-list, a specifier of the same type as SPECIFIER
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2452 \(results in inheritance), or nil for no fallback.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2453
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2454 When you instance a specifier, you can explicitly request that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2455 fallback not be consulted. (The C code does this, for example, when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2456 merging faces.) See `specifier-instance'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2457 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2458 (specifier))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2459 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2460 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2461 return Fcopy_tree (XSPECIFIER (specifier)->fallback, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2462 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2464 static Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2465 specifier_instance_from_inst_list (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2466 Lisp_Object matchspec,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2467 Lisp_Object domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2468 Lisp_Object inst_list,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2469 Error_Behavior errb, int no_quit,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2470 Lisp_Object depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2471 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2472 /* This function can GC */
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2473 Lisp_Specifier *sp;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2474 Lisp_Object device;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2475 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2476 int count = specpdl_depth ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2477 struct gcpro gcpro1, gcpro2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2478
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2479 GCPRO2 (specifier, inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2481 sp = XSPECIFIER (specifier);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2482 device = DOMAIN_DEVICE (domain);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2484 if (no_quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2485 /* The instantiate method is allowed to call eval. Since it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2486 is quite common for this function to get called from somewhere in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2487 redisplay we need to make sure that quits are ignored. Otherwise
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2488 Fsignal will abort. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2489 specbind (Qinhibit_quit, Qt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2490
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2491 LIST_LOOP (rest, inst_list)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2492 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2493 Lisp_Object tagged_inst = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2494 Lisp_Object tag_set = XCAR (tagged_inst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2496 if (device_matches_specifier_tag_set_p (device, tag_set))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2497 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2498 Lisp_Object val = XCDR (tagged_inst);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2499
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2500 if (HAS_SPECMETH_P (sp, instantiate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2501 val = call_with_suspended_errors
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2502 ((lisp_fn_t) RAW_SPECMETH (sp, instantiate),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2503 Qunbound, Qspecifier, errb, 5, specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2504 matchspec, domain, val, depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2505
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2506 if (!UNBOUNDP (val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2507 {
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2508 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2509 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2510 return val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2511 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2512 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2514
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 665
diff changeset
2515 unbind_to (count);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2516 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2517 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2518 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2519
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2520 /* Given a SPECIFIER and a DOMAIN, return a specific instance for that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2521 specifier. Try to find one by checking the specifier types from most
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2522 specific (buffer) to most general (global). If we find an instance,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2523 return it. Otherwise return Qunbound. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2524
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2525 #define CHECK_INSTANCE_ENTRY(key, matchspec, type) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2526 Lisp_Object *CIE_inst_list = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2527 specifier_get_inst_list (specifier, key, type); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2528 if (CIE_inst_list) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2529 { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2530 Lisp_Object CIE_val = \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2531 specifier_instance_from_inst_list (specifier, matchspec, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2532 domain, *CIE_inst_list, \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2533 errb, no_quit, depth); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2534 if (!UNBOUNDP (CIE_val)) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2535 return CIE_val; \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2536 } \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2537 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2538
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2539 /* We accept any window, frame or device domain and do our checking
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2540 starting from as specific a locale type as we can determine from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2541 domain we are passed and going on up through as many other locale types
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2542 as we can determine. In practice, when called from redisplay the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2543 arg will usually be a window and occasionally a frame. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2544 triggered by a user call, who knows what it will usually be. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2545 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2546 specifier_instance (Lisp_Object specifier, Lisp_Object matchspec,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2547 Lisp_Object domain, Error_Behavior errb, int no_quit,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2548 int no_fallback, Lisp_Object depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2549 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2550 Lisp_Object buffer = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2551 Lisp_Object window = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2552 Lisp_Object frame = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2553 Lisp_Object device = Qnil;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2554 Lisp_Object tag = Qnil; /* #### currently unused */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2555 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2556
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2557 /* Attempt to determine buffer, window, frame, and device from the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2558 domain. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2559 /* #### get image instances out of domains! */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2560 if (IMAGE_INSTANCEP (domain))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2561 window = DOMAIN_WINDOW (domain);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2562 else if (WINDOWP (domain))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2563 window = domain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2564 else if (FRAMEP (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2565 frame = domain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2566 else if (DEVICEP (domain))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2567 device = domain;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2568 else
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2569 /* dmoore writes: [dammit, this should just signal an error or something
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2570 shouldn't it?]
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2571
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2572 No. Errors are handled in Lisp primitives implementation.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2573 Invalid domain is a design error here - kkm. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2574 abort ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2575
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2576 if (NILP (buffer) && !NILP (window))
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2577 buffer = WINDOW_BUFFER (XWINDOW (window));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2578 if (NILP (frame) && !NILP (window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2579 frame = XWINDOW (window)->frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2580 if (NILP (device))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2581 /* frame had better exist; if device is undeterminable, something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2582 really went wrong. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2583 device = FRAME_DEVICE (XFRAME (frame));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2584
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2585 /* device had better be determined by now; abort if not. */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2586 tag = DEVICE_CLASS (XDEVICE (device));
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2588 depth = make_int (1 + XINT (depth));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2589 if (XINT (depth) > 20)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2590 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
2591 maybe_signal_error (Qstack_overflow,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
2592 "Apparent loop in specifier inheritance",
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
2593 Qunbound, Qspecifier, errb);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2594 /* The specification is fucked; at least try the fallback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2595 (which better not be fucked, because it's not changeable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2596 from Lisp). */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2597 depth = Qzero;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2598 goto do_fallback;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2599 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2600
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2601 retry:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2602 /* First see if we can generate one from the window specifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2603 if (!NILP (window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2604 CHECK_INSTANCE_ENTRY (window, matchspec, LOCALE_WINDOW);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2605
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2606 /* Next see if we can generate one from the buffer specifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2607 if (!NILP (buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2608 CHECK_INSTANCE_ENTRY (buffer, matchspec, LOCALE_BUFFER);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2609
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2610 /* Next see if we can generate one from the frame specifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2611 if (!NILP (frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2612 CHECK_INSTANCE_ENTRY (frame, matchspec, LOCALE_FRAME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2613
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2614 /* If we still haven't succeeded try with the device specifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2615 CHECK_INSTANCE_ENTRY (device, matchspec, LOCALE_DEVICE);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2617 /* Last and least try the global specifiers. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2618 CHECK_INSTANCE_ENTRY (Qglobal, matchspec, LOCALE_GLOBAL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2619
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 428
diff changeset
2620 do_fallback:
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2621 /* We're out of specifiers and we still haven't generated an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2622 instance. At least try the fallback ... If this fails,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2623 then we just return Qunbound. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2625 if (no_fallback || NILP (sp->fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2626 /* I said, I don't want the fallbacks. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2627 return Qunbound;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2628
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2629 if (SPECIFIERP (sp->fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2630 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2631 /* If you introduced loops in the default specifier chain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2632 then you're fucked, so you better not do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2633 specifier = sp->fallback;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2634 sp = XSPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2635 goto retry;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2636 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2637
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2638 assert (CONSP (sp->fallback));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2639 return specifier_instance_from_inst_list (specifier, matchspec, domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2640 sp->fallback, errb, no_quit,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2641 depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2642 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2643 #undef CHECK_INSTANCE_ENTRY
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2644
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2645 Lisp_Object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2646 specifier_instance_no_quit (Lisp_Object specifier, Lisp_Object matchspec,
578
190b164ddcac [xemacs-hg @ 2001-05-25 11:26:50 by ben]
ben
parents: 563
diff changeset
2647 Lisp_Object domain, Error_Behavior errb,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2648 int no_fallback, Lisp_Object depth)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2649 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2650 return specifier_instance (specifier, matchspec, domain, errb,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2651 1, no_fallback, depth);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2652 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2653
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2654 DEFUN ("specifier-instance", Fspecifier_instance, 1, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2655 Instantiate SPECIFIER (return its value) in DOMAIN.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2656 If no instance can be generated for this domain, return DEFAULT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2658 DOMAIN should be a window, frame, or device. Other values that are legal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2659 as a locale (e.g. a buffer) are not valid as a domain because they do not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2660 provide enough information to identify a particular device (see
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2661 `valid-specifier-domain-p'). DOMAIN defaults to the selected window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2662 if omitted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2663
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2664 "Instantiating" a specifier in a particular domain means determining
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2665 the specifier's "value" in that domain. This is accomplished by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2666 searching through the specifications in the specifier that correspond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2667 to all locales that can be derived from the given domain, from specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2668 to general. In most cases, the domain is an Emacs window. In that case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2669 specifications are searched for as follows:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2670
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2671 1. A specification whose locale is the window itself;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2672 2. A specification whose locale is the window's buffer;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2673 3. A specification whose locale is the window's frame;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2674 4. A specification whose locale is the window's frame's device;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2675 5. A specification whose locale is 'global.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2676
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2677 If all of those fail, then the C-code-provided fallback value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2678 this specifier is consulted (see `specifier-fallback'). If it is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2679 an inst-list, then this function attempts to instantiate that list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2680 just as when a specification is located in the first five steps above.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2681 If the fallback is a specifier, `specifier-instance' is called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2682 recursively on this specifier and the return value used. Note,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2683 however, that if the optional argument NO-FALLBACK is non-nil,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2684 the fallback value will not be consulted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2685
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2686 Note that there may be more than one specification matching a particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2687 locale; all such specifications are considered before looking for any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2688 specifications for more general locales. Any particular specification
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2689 that is found may be rejected because its tag set does not match the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2690 device being instantiated over, or because the specification is not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2691 valid for the device of the given domain (e.g. the font or color name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2692 does not exist for this particular X server).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2693
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2694 NOTE: When errors occur in the process of trying a particular instantiator,
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2695 and the instantiator is thus skipped, warnings will be issued at level
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2696 `debug'. Normally, such warnings are ignored entirely, but you can change
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2697 this by setting `log-warning-minimum-level'. This is useful if you're
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2698 trying to debug why particular instantiators are not being processed.
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2699
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2700 The returned value is dependent on the type of specifier. For example,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2701 for a font specifier (as returned by the `face-font' function), the returned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2702 value will be a font-instance object. For glyphs, the returned value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2703 will be a string, pixmap, or subwindow.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2704
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2705 See also `specifier-matching-instance'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2706 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2707 (specifier, domain, default_, no_fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2708 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2709 Lisp_Object instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2710
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2711 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2712 domain = decode_domain (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2713
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2714 instance = specifier_instance (specifier, Qunbound, domain, ERROR_ME, 0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2715 !NILP (no_fallback), Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2716 return UNBOUNDP (instance) ? default_ : instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2717 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2719 DEFUN ("specifier-matching-instance", Fspecifier_matching_instance, 2, 5, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2720 Return an instance for SPECIFIER in DOMAIN that matches MATCHSPEC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2721 If no instance can be generated for this domain, return DEFAULT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2722
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2723 This function is identical to `specifier-instance' except that a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2724 specification will only be considered if it matches MATCHSPEC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2725 The definition of "match", and allowed values for MATCHSPEC, are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2726 dependent on the particular type of specifier. Here are some examples:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2728 -- For chartable (e.g. display table) specifiers, MATCHSPEC should be a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2729 character, and the specification (a chartable) must give a value for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2730 that character in order to be considered. This allows you to specify,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2731 e.g., a buffer-local display table that only gives values for particular
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2732 characters. All other characters are handled as if the buffer-local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2733 display table is not there. (Chartable specifiers are not yet
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2734 implemented.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2736 -- For font specifiers, MATCHSPEC should be a charset, and the specification
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2737 (a font string) must have a registry that matches the charset's registry.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2738 (This only makes sense with Mule support.) This makes it easy to choose a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2739 font that can display a particular character. (This is what redisplay
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2740 does, in fact.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2741 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2742 (specifier, matchspec, domain, default_, no_fallback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2743 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2744 Lisp_Object instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2745
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2746 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2747 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2748 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2749 domain = decode_domain (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2750
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2751 instance = specifier_instance (specifier, matchspec, domain, ERROR_ME,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2752 0, !NILP (no_fallback), Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2753 return UNBOUNDP (instance) ? default_ : instance;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2754 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2755
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2756 DEFUN ("specifier-instance-from-inst-list", Fspecifier_instance_from_inst_list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2757 3, 4, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2758 Attempt to convert a particular inst-list into an instance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2759 This attempts to instantiate INST-LIST in the given DOMAIN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2760 as if INST-LIST existed in a specification in SPECIFIER. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2761 the instantiation fails, DEFAULT is returned. In most circumstances,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2762 you should not use this function; use `specifier-instance' instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2763 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2764 (specifier, domain, inst_list, default_))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2765 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2766 Lisp_Object val = Qunbound;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2767 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2768 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2769 Lisp_Object built_up_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2770
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2771 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2772 check_valid_domain (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2773 check_valid_inst_list (inst_list, sp->methods, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2774 GCPRO1 (built_up_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2775 built_up_list = build_up_processed_list (specifier, domain, inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2776 if (!NILP (built_up_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2777 val = specifier_instance_from_inst_list (specifier, Qunbound, domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2778 built_up_list, ERROR_ME,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2779 0, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2780 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2781 return UNBOUNDP (val) ? default_ : val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2782 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2783
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2784 DEFUN ("specifier-matching-instance-from-inst-list",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2785 Fspecifier_matching_instance_from_inst_list,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2786 4, 5, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2787 Attempt to convert a particular inst-list into an instance.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2788 This attempts to instantiate INST-LIST in the given DOMAIN
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2789 \(as if INST-LIST existed in a specification in SPECIFIER),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2790 matching the specifications against MATCHSPEC.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2791
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2792 This function is analogous to `specifier-instance-from-inst-list'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2793 but allows for specification-matching as in `specifier-matching-instance'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2794 See that function for a description of exactly how the matching process
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2795 works.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2796 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2797 (specifier, matchspec, domain, inst_list, default_))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2798 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2799 Lisp_Object val = Qunbound;
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2800 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2801 struct gcpro gcpro1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2802 Lisp_Object built_up_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2803
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2804 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2805 check_valid_specifier_matchspec (matchspec, XSPECIFIER (specifier)->methods,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2806 ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2807 check_valid_domain (domain);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2808 check_valid_inst_list (inst_list, sp->methods, ERROR_ME);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2809 GCPRO1 (built_up_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2810 built_up_list = build_up_processed_list (specifier, domain, inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2811 if (!NILP (built_up_list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2812 val = specifier_instance_from_inst_list (specifier, matchspec, domain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2813 built_up_list, ERROR_ME,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2814 0, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2815 UNGCPRO;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2816 return UNBOUNDP (val) ? default_ : val;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2817 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2818
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2819
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2820 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2821 /* Caching in the struct window or frame */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2822 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2823
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2824 /* Either STRUCT_WINDOW_OFFSET or STRUCT_FRAME_OFFSET can be 0 to indicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2825 no caching in that sort of object. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2826
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2827 /* #### It would be nice if the specifier caching automatically knew
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2828 about specifier fallbacks, so we didn't have to do it ourselves. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2829
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2830 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2831 set_specifier_caching (Lisp_Object specifier, int struct_window_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2832 void (*value_changed_in_window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2833 (Lisp_Object specifier, struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2834 Lisp_Object oldval),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2835 int struct_frame_offset,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2836 void (*value_changed_in_frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2837 (Lisp_Object specifier, struct frame *f,
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2838 Lisp_Object oldval),
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2839 int always_recompute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2840 {
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 434
diff changeset
2841 Lisp_Specifier *sp = XSPECIFIER (specifier);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2842 assert (!GHOST_SPECIFIER_P (sp));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2843
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2844 if (!sp->caching)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2845 sp->caching = xnew_and_zero (struct specifier_caching);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2846 sp->caching->offset_into_struct_window = struct_window_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2847 sp->caching->value_changed_in_window = value_changed_in_window;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2848 sp->caching->offset_into_struct_frame = struct_frame_offset;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2849 sp->caching->value_changed_in_frame = value_changed_in_frame;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2850 sp->caching->always_recompute = always_recompute;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2851 Vcached_specifiers = Fcons (specifier, Vcached_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2852 if (BODILY_SPECIFIER_P (sp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2853 GHOST_SPECIFIER(sp)->caching = sp->caching;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2854 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2855 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2856
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2857 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2858 recompute_one_cached_specifier_in_window (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2859 struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2860 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2861 Lisp_Object window;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2862 Lisp_Object newval, *location, oldval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2863
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2864 assert (!GHOST_SPECIFIER_P (XSPECIFIER (specifier)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2865
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2866 window = wrap_window (w);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2868 newval = specifier_instance (specifier, Qunbound, window, ERROR_ME_WARN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2869 0, 0, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2870 /* If newval ended up Qunbound, then the calling functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2871 better be able to deal. If not, set a default so this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2872 never happens or correct it in the value_changed_in_window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2873 method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2874 location = (Lisp_Object *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2875 ((char *) w + XSPECIFIER (specifier)->caching->offset_into_struct_window);
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2876 /* #### What's the point of this check, other than to optimize image
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2877 instance instantiation? Unless you specify a caching instantiate
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2878 method the instantiation that specifier_instance will do will
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2879 always create a new copy. Thus EQ will always fail. Unfortunately
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2880 calling equal is no good either as this doesn't take into account
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2881 things attached to the specifier - for instance strings on
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2882 extents. --andyp */
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2883 if (!EQ (newval, *location) || XSPECIFIER (specifier)->caching->always_recompute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2884 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2885 oldval = *location;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2886 *location = newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2887 (XSPECIFIER (specifier)->caching->value_changed_in_window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2888 (specifier, w, oldval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2889 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2890 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2891
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2892 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2893 recompute_one_cached_specifier_in_frame (Lisp_Object specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2894 struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2895 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2896 Lisp_Object frame;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2897 Lisp_Object newval, *location, oldval;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2898
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2899 assert (!GHOST_SPECIFIER_P (XSPECIFIER (specifier)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2900
793
e38acbeb1cae [xemacs-hg @ 2002-03-29 04:46:17 by ben]
ben
parents: 771
diff changeset
2901 frame = wrap_frame (f);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2902
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2903 newval = specifier_instance (specifier, Qunbound, frame, ERROR_ME_WARN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2904 0, 0, Qzero);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2905 /* If newval ended up Qunbound, then the calling functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2906 better be able to deal. If not, set a default so this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2907 never happens or correct it in the value_changed_in_frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2908 method. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2909 location = (Lisp_Object *)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2910 ((char *) f + XSPECIFIER (specifier)->caching->offset_into_struct_frame);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2911 if (!EQ (newval, *location) || XSPECIFIER (specifier)->caching->always_recompute)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2912 {
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
2913 oldval = *location;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2914 *location = newval;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2915 (XSPECIFIER (specifier)->caching->value_changed_in_frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2916 (specifier, f, oldval);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2917 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2918 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2920 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2921 recompute_all_cached_specifiers_in_window (struct window *w)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2922 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2923 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2924
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2925 LIST_LOOP (rest, Vcached_specifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2926 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2927 Lisp_Object specifier = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2928 if (XSPECIFIER (specifier)->caching->offset_into_struct_window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2929 recompute_one_cached_specifier_in_window (specifier, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2930 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2931 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2932
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2933 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2934 recompute_all_cached_specifiers_in_frame (struct frame *f)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2935 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2936 Lisp_Object rest;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2937
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2938 LIST_LOOP (rest, Vcached_specifiers)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2939 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2940 Lisp_Object specifier = XCAR (rest);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2941 if (XSPECIFIER (specifier)->caching->offset_into_struct_frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2942 recompute_one_cached_specifier_in_frame (specifier, f);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2943 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2944 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2945
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2946 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2947 recompute_cached_specifier_everywhere_mapfun (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2948 void *closure)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2949 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2950 Lisp_Object specifier = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2952 VOID_TO_LISP (specifier, closure);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2953 recompute_one_cached_specifier_in_window (specifier, w);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2954 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2955 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2957 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2958 recompute_cached_specifier_everywhere (Lisp_Object specifier)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2959 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2960 Lisp_Object frmcons, devcons, concons;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2961
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2962 specifier = bodily_specifier (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2963
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2964 if (!XSPECIFIER (specifier)->caching)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2965 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2966
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2967 if (XSPECIFIER (specifier)->caching->offset_into_struct_window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2968 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2969 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2970 map_windows (XFRAME (XCAR (frmcons)),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2971 recompute_cached_specifier_everywhere_mapfun,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2972 LISP_TO_VOID (specifier));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2973 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2974
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2975 if (XSPECIFIER (specifier)->caching->offset_into_struct_frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2976 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2977 FRAME_LOOP_NO_BREAK (frmcons, devcons, concons)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2978 recompute_one_cached_specifier_in_frame (specifier,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2979 XFRAME (XCAR (frmcons)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2980 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2981 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2982
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2983 DEFUN ("set-specifier-dirty-flag", Fset_specifier_dirty_flag, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2984 Force recomputation of any caches associated with SPECIFIER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2985 Note that this automatically happens whenever you change a specification
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2986 in SPECIFIER; you do not have to call this function then.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2987 One example of where this function is useful is when you have a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2988 toolbar button whose `active-p' field is an expression to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2989 evaluated. Calling `set-specifier-dirty-flag' on the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2990 toolbar specifier will force the `active-p' fields to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2991 recomputed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2992 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2993 (specifier))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2994 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2995 CHECK_SPECIFIER (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2996 recompute_cached_specifier_everywhere (specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2997 return Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2998 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3001 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3002 /* Generic specifier type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3003 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3004
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3005 DEFINE_SPECIFIER_TYPE (generic);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3006
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3007 #if 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3008
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3009 /* This is the string that used to be in `generic-specifier-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3010 The idea is good, but it doesn't quite work in the form it's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3011 in. (One major problem is that validating an instantiator
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3012 is supposed to require only that the specifier type is passed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3013 while with this approach the actual specifier is needed.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3014
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3015 What really needs to be done is to write a function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3016 `make-specifier-type' that creates new specifier types.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3017
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3018 #### [I'll look into this for 19.14.] Well, sometime. (Currently
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3019 May 2000, 21.2 is in development. 19.14 was released in June 1996.) */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3020
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3021 "A generic specifier is a generalized kind of specifier with user-defined\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3022 "semantics. The instantiator can be any kind of Lisp object, and the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3023 "instance computed from it is likewise any kind of Lisp object. The\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3024 "SPECIFIER-DATA should be an alist of methods governing how the specifier\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3025 "works. All methods are optional, and reasonable default methods will be\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3026 "provided. Currently there are two defined methods: 'instantiate and\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3027 "'validate.\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3028 "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3029 "'instantiate specifies how to do the instantiation; if omitted, the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3030 "instantiator itself is simply returned as the instance. The method\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3031 "should be a function that accepts three parameters (a specifier, the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3032 "instantiator that matched the domain being instantiated over, and that\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3033 "domain), and should return a one-element list containing the instance,\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3034 "or nil if no instance exists. Note that the domain passed to this function\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3035 "is the domain being instantiated over, which may not be the same as the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3036 "locale contained in the specification corresponding to the instantiator\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3037 "(for example, the domain being instantiated over could be a window, but\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3038 "the locale corresponding to the passed instantiator could be the window's\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3039 "buffer or frame).\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3040 "\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3041 "'validate specifies whether a given instantiator is valid; if omitted,\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3042 "all instantiators are considered valid. It should be a function of\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3043 "two arguments: an instantiator and a flag CAN-SIGNAL-ERROR. If this\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3044 "flag is false, the function must simply return t or nil indicating\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3045 "whether the instantiator is valid. If this flag is true, the function\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3046 "is free to signal an error if it encounters an invalid instantiator\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3047 "(this can be useful for issuing a specific error about exactly why the\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3048 "instantiator is valid). It can also return nil to indicate an invalid\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3049 "instantiator; in this case, a general error will be signalled."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3050
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3051 #endif /* 0 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3052
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3053 DEFUN ("generic-specifier-p", Fgeneric_specifier_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3054 Return non-nil if OBJECT is a generic specifier.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3055
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3056 See `make-generic-specifier' for a description of possible generic
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3057 instantiators.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3058 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3059 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3060 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3061 return GENERIC_SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3062 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3063
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3064
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3065 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3066 /* Integer specifier type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3067 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3068
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3069 DEFINE_SPECIFIER_TYPE (integer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3070
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3071 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3072 integer_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3073 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3074 CHECK_INT (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3075 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3076
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3077 DEFUN ("integer-specifier-p", Finteger_specifier_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3078 Return non-nil if OBJECT is an integer specifier.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3079
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3080 See `make-integer-specifier' for a description of possible integer
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3081 instantiators.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3082 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3083 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3084 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3085 return INTEGER_SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3086 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3087
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3088 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3089 /* Non-negative-integer specifier type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3090 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3091
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3092 DEFINE_SPECIFIER_TYPE (natnum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3093
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3094 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3095 natnum_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3096 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3097 CHECK_NATNUM (instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3098 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3099
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3100 DEFUN ("natnum-specifier-p", Fnatnum_specifier_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3101 Return non-nil if OBJECT is a natnum (non-negative-integer) specifier.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3102
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3103 See `make-natnum-specifier' for a description of possible natnum
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3104 instantiators.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3105 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3106 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3107 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3108 return NATNUM_SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3109 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3111 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3112 /* Boolean specifier type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3113 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3114
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3115 DEFINE_SPECIFIER_TYPE (boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3117 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3118 boolean_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3119 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3120 if (!EQ (instantiator, Qt) && !EQ (instantiator, Qnil))
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 456
diff changeset
3121 invalid_constant ("Must be t or nil", instantiator);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3122 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3124 DEFUN ("boolean-specifier-p", Fboolean_specifier_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3125 Return non-nil if OBJECT is a boolean specifier.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3126
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3127 See `make-boolean-specifier' for a description of possible boolean
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3128 instantiators.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3129 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3130 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3132 return BOOLEAN_SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3135 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3136 /* Display table specifier type */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3137 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3138
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3139 DEFINE_SPECIFIER_TYPE (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3140
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3141 #define VALID_SINGLE_DISPTABLE_INSTANTIATOR_P(instantiator) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3142 (VECTORP (instantiator) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3143 || (CHAR_TABLEP (instantiator) \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3144 && (XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_CHAR \
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3145 || XCHAR_TABLE_TYPE (instantiator) == CHAR_TABLE_TYPE_GENERIC)) \
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3146 || RANGE_TABLEP (instantiator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3147
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3148 static void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3149 display_table_validate (Lisp_Object instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3150 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3151 if (NILP (instantiator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3152 /* OK */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3153 ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3154 else if (CONSP (instantiator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3155 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3156 Lisp_Object tail;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3157 EXTERNAL_LIST_LOOP (tail, instantiator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3158 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3159 Lisp_Object car = XCAR (tail);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3160 if (!VALID_SINGLE_DISPTABLE_INSTANTIATOR_P (car))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3161 goto lose;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3162 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3163 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3164 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3165 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3166 if (!VALID_SINGLE_DISPTABLE_INSTANTIATOR_P (instantiator))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3167 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3168 lose:
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3169 dead_wrong_type_argument
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3170 (display_table_specifier_methods->predicate_symbol,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3171 instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3172 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3173 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3174 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3176 DEFUN ("display-table-specifier-p", Fdisplay_table_specifier_p, 1, 1, 0, /*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3177 Return non-nil if OBJECT is a display-table specifier.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3178
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3179 See `current-display-table' for a description of possible display-table
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3180 instantiators.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3181 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3182 (object))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3183 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3184 return DISPLAYTABLE_SPECIFIERP (object) ? Qt : Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3185 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3186
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3187
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3188 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3189 /* Initialization */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3190 /************************************************************************/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3192 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3193 syms_of_specifier (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3194 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3195 INIT_LRECORD_IMPLEMENTATION (specifier);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3196
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3197 DEFSYMBOL (Qspecifierp);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3198
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3199 DEFSYMBOL (Qconsole_type);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3200 DEFSYMBOL (Qdevice_class);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3201
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3202 /* specifier types defined in general.c. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3204 DEFSUBR (Fvalid_specifier_type_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3205 DEFSUBR (Fspecifier_type_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3206 DEFSUBR (Fmake_specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3207 DEFSUBR (Fspecifierp);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3208 DEFSUBR (Fspecifier_type);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3210 DEFSUBR (Fvalid_specifier_locale_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3211 DEFSUBR (Fvalid_specifier_domain_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3212 DEFSUBR (Fvalid_specifier_locale_type_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3213 DEFSUBR (Fspecifier_locale_type_from_locale);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3214
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3215 DEFSUBR (Fvalid_specifier_tag_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3216 DEFSUBR (Fvalid_specifier_tag_set_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3217 DEFSUBR (Fcanonicalize_tag_set);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3218 DEFSUBR (Fdevice_matches_specifier_tag_set_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3219 DEFSUBR (Fdefine_specifier_tag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3220 DEFSUBR (Fdevice_matching_specifier_tag_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3221 DEFSUBR (Fspecifier_tag_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3222 DEFSUBR (Fspecifier_tag_predicate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3224 DEFSUBR (Fcheck_valid_instantiator);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3225 DEFSUBR (Fvalid_instantiator_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3226 DEFSUBR (Fcheck_valid_inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3227 DEFSUBR (Fvalid_inst_list_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3228 DEFSUBR (Fcheck_valid_spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3229 DEFSUBR (Fvalid_spec_list_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3230 DEFSUBR (Fadd_spec_to_specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3231 DEFSUBR (Fadd_spec_list_to_specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3232 DEFSUBR (Fspecifier_spec_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3233 DEFSUBR (Fspecifier_specs);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3234 DEFSUBR (Fremove_specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3235 DEFSUBR (Fcopy_specifier);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3237 DEFSUBR (Fcheck_valid_specifier_matchspec);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3238 DEFSUBR (Fvalid_specifier_matchspec_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3239 DEFSUBR (Fspecifier_fallback);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3240 DEFSUBR (Fspecifier_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3241 DEFSUBR (Fspecifier_matching_instance);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3242 DEFSUBR (Fspecifier_instance_from_inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3243 DEFSUBR (Fspecifier_matching_instance_from_inst_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3244 DEFSUBR (Fset_specifier_dirty_flag);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3246 DEFSUBR (Fgeneric_specifier_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3247 DEFSUBR (Finteger_specifier_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3248 DEFSUBR (Fnatnum_specifier_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3249 DEFSUBR (Fboolean_specifier_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3250 DEFSUBR (Fdisplay_table_specifier_p);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3252 /* Symbols pertaining to specifier creation. Specifiers are created
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3253 in the syms_of() functions. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3254
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3255 /* locales are defined in general.c. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3256
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3257 /* some how-to-add flags in general.c. */
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3258 DEFSYMBOL (Qremove_tag_set_prepend);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3259 DEFSYMBOL (Qremove_tag_set_append);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3260 DEFSYMBOL (Qremove_locale);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3261 DEFSYMBOL (Qremove_locale_type);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3264 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3265 specifier_type_create (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3266 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3267 the_specifier_type_entry_dynarr = Dynarr_new (specifier_type_entry);
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
3268 dump_add_root_struct_ptr (&the_specifier_type_entry_dynarr, &sted_description);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3269
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3270 Vspecifier_type_list = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3271 staticpro (&Vspecifier_type_list);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3273 INITIALIZE_SPECIFIER_TYPE (generic, "generic", "generic-specifier-p");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3275 INITIALIZE_SPECIFIER_TYPE (integer, "integer", "integer-specifier-p");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3276
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3277 SPECIFIER_HAS_METHOD (integer, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3278
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3279 INITIALIZE_SPECIFIER_TYPE (natnum, "natnum", "natnum-specifier-p");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3281 SPECIFIER_HAS_METHOD (natnum, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3282
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3283 INITIALIZE_SPECIFIER_TYPE (boolean, "boolean", "boolean-specifier-p");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3284
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3285 SPECIFIER_HAS_METHOD (boolean, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3286
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3287 INITIALIZE_SPECIFIER_TYPE (display_table, "display-table",
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
3288 "display-table-p");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3289
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3290 SPECIFIER_HAS_METHOD (display_table, validate);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3293 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3294 reinit_specifier_type_create (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3295 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3296 REINITIALIZE_SPECIFIER_TYPE (generic);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3297 REINITIALIZE_SPECIFIER_TYPE (integer);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3298 REINITIALIZE_SPECIFIER_TYPE (natnum);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3299 REINITIALIZE_SPECIFIER_TYPE (boolean);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3300 REINITIALIZE_SPECIFIER_TYPE (display_table);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3301 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3302
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3303 void
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3304 vars_of_specifier (void)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3305 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3306 Vcached_specifiers = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3307 staticpro (&Vcached_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3308
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3309 /* Do NOT mark through this, or specifiers will never be GC'd.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3310 This is the same deal as for weak hash tables. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3311 Vall_specifiers = Qnil;
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
3312 dump_add_weak_object_chain (&Vall_specifiers);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3313
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3314 Vuser_defined_tags = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3315 staticpro (&Vuser_defined_tags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3317 Vunlock_ghost_specifiers = Qnil;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3318 staticpro (&Vunlock_ghost_specifiers);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3319 }