annotate src/extents.h @ 733:b1f74adcc1ff

[xemacs-hg @ 2002-01-22 20:40:00 by janv] Fix disabled-command-hook
author janv
date Tue, 22 Jan 2002 20:40:03 +0000
parents fdefd0186b75
children e38acbeb1cae
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 /* Copyright (c) 1994, 1995 Free Software Foundation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (c) 1995 Ben Wing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
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 XEmacs is free software; you can redistribute it and/or modify it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 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
8 Free Software Foundation; either version 2, or (at your option) any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 later version.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 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
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 along with XEmacs; see the file COPYING. If not, write to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 Boston, MA 02111-1307, USA. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
23 #ifndef INCLUDED_extents_h_
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
24 #define INCLUDED_extents_h_
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 DECLARE_LRECORD (extent, struct extent);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 #define XEXTENT(x) XRECORD (x, extent, struct extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 #define XSETEXTENT(x, p) XSETRECORD (x, p, extent)
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 460
diff changeset
29 #define wrap_extent(p) wrap_record (p, extent)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #define EXTENTP(x) RECORDP (x, extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 #define CHECK_EXTENT(x) CHECK_RECORD (x, extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #define CONCHECK_EXTENT(x) CONCHECK_RECORD (x, extent)
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 /* the layouts for glyphs (extent->flags.glyph_layout). Must fit in 2 bits. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 typedef enum glyph_layout
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 GL_TEXT,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 GL_OUTSIDE_MARGIN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 GL_INSIDE_MARGIN,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 GL_WHITESPACE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 } glyph_layout;
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 struct extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 struct lrecord_header lheader;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
47 Membpos start;
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
48 Membpos end;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 Lisp_Object object; /* A buffer, string, Qnil (extent detached from no
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 buffer), Qt (destroyed extent) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 /* Extent properties are conceptually a plist, but the most common
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 props are implemented as bits instead of conses. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 Lisp_Object face;
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 /* These flags are simply an optimization for common boolean properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 which go onto the extent's property list. Any of them would work if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 done in the normal way, but the space savings of doing these in this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 way is significant. Note that if you add a flag, there are numerous
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 places in extents.c that need to know about it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 Another consideration is that some of these properties are accessed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 during redisplay, so it's good for access to them to be fast (a bit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 reference instead of a search down a plist).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 `begin_glyph_layout' and `end_glyph_layout' are unusual in that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 they have 4 states instead of 2.
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 Other special extent properties are stored in an auxiliary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 structure that sits at the beginning of the plist. The has_aux
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 flag indicates whether this structure exists. The has_parent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 flag is an optimization indicating whether the extent has a parent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 (this could also be determined by looking in the aux structure). */
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 enum_field (glyph_layout) begin_glyph_layout :2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 /* 2 text, margins, or whitespace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 enum_field (glyph_layout) end_glyph_layout :2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 /* 4 text, margins, or whitespace */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 unsigned int has_parent :1; /* 5 extent has a parent */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 unsigned int has_aux :1; /* 6 extent has an aux. structure */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 unsigned int start_open :1; /* 7 insertion behavior at start */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 unsigned int end_open :1; /* 8 insertion behavior at end */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 unsigned int unique :1; /* 9 there may be only one attached */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 unsigned int duplicable :1; /* 10 copied to strings by kill/undo */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 unsigned int detachable :1; /* 11 extent detaches if text deleted */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 unsigned int internal :1; /* 12 used by map-extents etc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 unsigned int in_red_event :1; /* 13 An event has been spawned for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 initial redisplay.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 (not exported to lisp) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 unsigned int unused16 :1; /* 16 unused bits */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 /* --- Adding more flags will cause the extent struct to grow by another
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 word. It's not clear that this would make a difference, however,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 because on 32-bit machines things tend to get allocated in chunks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 of 4 bytes. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 } flags;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 /* The plist may have an auxiliary structure as its first element */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 Lisp_Object plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 };
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 /* Basic properties of an extent (not affected by the extent's parent) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 #define extent_object(e) ((e)->object)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 #define extent_start(e) ((e)->start + 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 #define extent_end(e) ((e)->end + 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 #define set_extent_start(e, val) ((void) ((e)->start = (val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 #define set_extent_end(e, val) ((void) ((e)->end = (val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 #define extent_endpoint(e, endp) ((endp) ? extent_end (e) : extent_start (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 #define set_extent_endpoint(e, val, endp) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 ((endp) ? set_extent_end (e, val) : set_extent_start (e, val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 #define extent_detached_p(e) (extent_start (e) < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 /* Additional information that may be present in an extent. The idea is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 that fast access is provided to this information, but since (hopefully)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 most extents won't have this set on them, we usually don't need to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 have this structure around and thus the size of an extent is smaller. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 typedef struct extent_auxiliary extent_auxiliary;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 struct extent_auxiliary
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 struct lcrecord_header header;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 Lisp_Object begin_glyph;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 Lisp_Object end_glyph;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 Lisp_Object parent;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 /* We use a weak list here. Originally I didn't do this and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 depended on having the extent's finalization method remove
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 itself from its parent's children list. This runs into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 lots and lots of problems though because everything is in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 a really really bizarre state when an extent's finalization
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 method is called (it happens in sweep_extents() by way of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 ADDITIONAL_FREE_extent()) and it's extremely difficult to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 avoid getting hosed by just-freed objects. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 Lisp_Object children;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 Lisp_Object invisible;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 Lisp_Object read_only;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 Lisp_Object mouse_face;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 Lisp_Object initial_redisplay_function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 Lisp_Object before_change_functions, after_change_functions;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 int priority;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 };
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 extern struct extent_auxiliary extent_auxiliary_defaults;
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 DECLARE_LRECORD (extent_auxiliary, struct extent_auxiliary);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 #define XEXTENT_AUXILIARY(x) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 XRECORD (x, extent_auxiliary, struct extent_auxiliary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 #define XSETEXTENT_AUXILIARY(x, p) XSETRECORD (x, p, extent_auxiliary)
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 460
diff changeset
149 #define wrap_extent_auxiliary(p) wrap_record (p, extent_auxiliary)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 #define EXTENT_AUXILIARYP(x) RECORDP (x, extent_auxiliary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 #define CHECK_EXTENT_AUXILIARY(x) CHECK_RECORD (x, extent_auxiliary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 #define CONCHECK_EXTENT_AUXILIARY(x) CONCHECK_RECORD (x, extent_auxiliary)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 struct extent_info
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 struct lcrecord_header header;
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 struct extent_list *extents;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 struct stack_of_extents *soe;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 DECLARE_LRECORD (extent_info, struct extent_info);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 #define XEXTENT_INFO(x) XRECORD (x, extent_info, struct extent_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 #define XSETEXTENT_INFO(x, p) XSETRECORD (x, p, extent_info)
617
af57a77cbc92 [xemacs-hg @ 2001-06-18 07:09:50 by ben]
ben
parents: 460
diff changeset
165 #define wrap_extent_info(p) wrap_record (p, extent_info)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 #define EXTENT_INFOP(x) RECORDP (x, extent_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 #define CHECK_EXTENT_INFO(x) CHECK_RECORD (x, extent_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 #define CONCHECK_EXTENT_INFO(x) CONCHECK_RECORD (x, extent_info)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 void flush_cached_extent_info (Lisp_Object extent_info);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 /* A "normal" field is one that is stored in the `struct flags' structure
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 in an extent. an "aux" field is one that is stored in the extent's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 auxiliary structure.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 The functions below that have `extent_no_chase' in their name operate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 on an extent directly (ignoring its parent), and should normally
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 only be used on extents known not to have a parent. The other
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 versions chase down any parent links. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 #define extent_no_chase_normal_field(e, field) ((e)->flags.field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
183 INLINE_HEADER struct extent_auxiliary *extent_aux_or_default (EXTENT e);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
184 INLINE_HEADER struct extent_auxiliary *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 extent_aux_or_default (EXTENT e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 return e->flags.has_aux ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 XEXTENT_AUXILIARY (XCAR (e->plist)) :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 & extent_auxiliary_defaults;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 #define extent_no_chase_aux_field(e, field) (extent_aux_or_default(e)->field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 #define extent_normal_field(e, field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 extent_no_chase_normal_field (extent_ancestor (e), field)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 #define extent_aux_field(e, field) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 extent_no_chase_aux_field (extent_ancestor (e), field)
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 #define set_extent_no_chase_aux_field(e, field, value) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 EXTENT sencaf_e = (e); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 if (! sencaf_e->flags.has_aux) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 allocate_extent_auxiliary (sencaf_e); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 XEXTENT_AUXILIARY (XCAR (sencaf_e->plist))->field = (value);\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 #define set_extent_no_chase_normal_field(e, field, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 extent_no_chase_normal_field (e, field) = (value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 #define set_extent_aux_field(e, field, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 set_extent_no_chase_aux_field (extent_ancestor (e), field, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 #define set_extent_normal_field(e, field, value) \
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
214 set_extent_no_chase_normal_field (extent_ancestor (e), field, value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 /* The `parent' and `children' fields are not affected by any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 parent links. We don't provide any settors for these fields
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 because they need special handling and it's cleaner just to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 do this in the particular functions that need to do this. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 #define extent_parent(e) extent_no_chase_aux_field (e, parent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 #define extent_children(e) extent_no_chase_aux_field (e, children)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 #define extent_begin_glyph(e) extent_aux_field (e, begin_glyph)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 #define extent_end_glyph(e) extent_aux_field (e, end_glyph)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 #define extent_priority(e) extent_aux_field (e, priority)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 #define extent_invisible(e) extent_aux_field (e, invisible)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 #define extent_read_only(e) extent_aux_field (e, read_only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 #define extent_mouse_face(e) extent_aux_field (e, mouse_face)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 #define extent_initial_redisplay_function(e) extent_aux_field (e, initial_redisplay_function)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #define extent_before_change_functions(e) extent_aux_field (e, before_change_functions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 #define extent_after_change_functions(e) extent_aux_field (e, after_change_functions)
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 #define set_extent_begin_glyph(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 set_extent_aux_field (e, begin_glyph, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 #define set_extent_end_glyph(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 set_extent_aux_field (e, end_glyph, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 #define set_extent_priority(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 set_extent_aux_field (e, priority, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 #define set_extent_invisible_1(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 set_extent_aux_field (e, invisible, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #define set_extent_read_only(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 set_extent_aux_field (e, read_only, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 #define set_extent_mouse_face(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 set_extent_aux_field (e, mouse_face, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 /* Use Fset_extent_initial_redisplay_function unless you know what you're doing */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 #define set_extent_initial_redisplay_function(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 set_extent_aux_field (e, initial_redisplay_function, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 #define set_extent_before_change_functions(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 set_extent_aux_field (e, before_change_functions, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 #define set_extent_after_change_functions(e, value) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 set_extent_aux_field (e, after_change_functions, value)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 #define extent_face(e) extent_normal_field (e, face)
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
255 #define extent_begin_glyph_layout(e) ((enum glyph_layout) extent_normal_field (e, begin_glyph_layout))
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
256 #define extent_end_glyph_layout(e) ((enum glyph_layout) extent_normal_field (e, end_glyph_layout))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 #define extent_start_open_p(e) extent_normal_field (e, start_open)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 #define extent_end_open_p(e) extent_normal_field (e, end_open)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 #define extent_unique_p(e) extent_normal_field (e, unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 #define extent_duplicable_p(e) extent_normal_field (e, duplicable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 #define extent_detachable_p(e) extent_normal_field (e, detachable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 #define extent_internal_p(e) extent_normal_field (e, internal)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 #define extent_in_red_event_p(e) extent_normal_field (e, in_red_event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
265 #define set_extent_face(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
266 set_extent_normal_field (e, face, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
267 #define set_extent_begin_glyph_layout(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
268 set_extent_normal_field (e, begin_glyph_layout, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
269 #define set_extent_end_glyph_layout(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
270 set_extent_normal_field (e, end_glyph_layout, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
271 #define set_extent_start_open_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
272 set_extent_normal_field (e, start_open, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
273 #define set_extent_end_open_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
274 set_extent_normal_field (e, end_open, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
275 #define set_extent_unique_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
276 set_extent_normal_field (e, unique, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
277 #define set_extent_duplicable_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
278 set_extent_normal_field (e, duplicable, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
279 #define set_extent_detachable_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
280 set_extent_normal_field (e, detachable, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
281 #define set_extent_internal_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
282 set_extent_normal_field (e, internal, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
283 #define set_extent_in_red_event_p(e, val) \
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
284 set_extent_normal_field (e, in_red_event, val)
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 617
diff changeset
285
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
286 INLINE_HEADER Lisp_Object * extent_no_chase_plist_addr (EXTENT e);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
287 INLINE_HEADER Lisp_Object *
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 extent_no_chase_plist_addr (EXTENT e)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 return e->flags.has_aux ? &XCDR (e->plist) : &e->plist;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 #define extent_no_chase_plist(e) (*extent_no_chase_plist_addr (e))
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 #define extent_plist_addr(e) extent_no_chase_plist_addr (extent_ancestor (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 #define extent_plist_slot(e) extent_no_chase_plist (extent_ancestor (e))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 /* flags for map_extents() and friends */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 #define ME_END_CLOSED (1 << 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 #define ME_START_OPEN (1 << 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 #define ME_ALL_EXTENTS_CLOSED (1 << 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 #define ME_ALL_EXTENTS_OPEN (2 << 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 #define ME_ALL_EXTENTS_CLOSED_OPEN (3 << 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 #define ME_ALL_EXTENTS_OPEN_CLOSED (4 << 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 #define ME_ALL_EXTENTS_MASK (7 << 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 #define ME_START_IN_REGION (1 << 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 #define ME_END_IN_REGION (2 << 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 #define ME_START_AND_END_IN_REGION (3 << 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 #define ME_START_OR_END_IN_REGION (4 << 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 #define ME_IN_REGION_MASK (7 << 5)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 #define ME_NEGATE_IN_REGION (1 << 8)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 /* the following flags are internal-only */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 #define ME_INCLUDE_INTERNAL (1 << 9)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 #define ME_MIGHT_THROW (1 << 10)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 #define ME_MIGHT_MODIFY_TEXT (1 << 11)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 #define ME_MIGHT_MODIFY_EXTENTS (1 << 12)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 #define ME_MIGHT_MOVE_SOE (1 << 13)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 #define ME_MIGHT_CALL_ELISP (ME_MIGHT_THROW | ME_MIGHT_MODIFY_TEXT | \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 ME_MIGHT_MODIFY_EXTENTS | ME_MIGHT_MOVE_SOE)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 #define EXTENT_LIVE_P(e) (!EQ (extent_object (e), Qt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 #define CHECK_LIVE_EXTENT(x) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 CHECK_EXTENT (x); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 if (!EXTENT_LIVE_P (XEXTENT (x))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 dead_wrong_type_argument (Qextent_live_p, (x)); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 #define CONCHECK_LIVE_EXTENT(x) do { \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 CONCHECK_EXTENT (x); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 if (!EXTENT_LIVE_P (XEXTENT (x))) \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 x = wrong_type_argument (Qextent_live_p, (x)); \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 } while (0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 EXFUN (Fdetach_extent, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 EXFUN (Fextent_end_position, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 EXFUN (Fextent_object, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 EXFUN (Fextent_start_position, 1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 EXFUN (Fmake_extent, 3);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 EXFUN (Fprevious_single_property_change, 4);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 EXFUN (Fset_extent_endpoints, 4);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
342 EXFUN (Fnext_extent_change, 2);
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
343 EXFUN (Fprevious_extent_change, 2);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 EXFUN (Fset_extent_parent, 2);
460
223736d75acb Import from CVS: tag r21-2-45
cvs
parents: 442
diff changeset
345 EXFUN (Fget_char_property, 4);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 extern int inside_undo;
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
348 extern int in_modeline_generation;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 struct extent_fragment *extent_fragment_new (Lisp_Object buffer_or_string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 struct frame *frm);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 face_index extent_fragment_update (struct window *w,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 struct extent_fragment *ef,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
354 /* Note this is in Bytebposs */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
355 Bytebpos pos);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 void extent_fragment_delete (struct extent_fragment *ef);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 #ifdef emacs /* things other than emacs want the structs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 /* from alloc.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 struct extent *allocate_extent (void);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 /* from extents.c */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 EXTENT extent_ancestor_1 (EXTENT e);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 /* extent_ancestor() chases all the parent links until there aren't any
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 more. extent_ancestor_1() does the same thing but it a function;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 the following optimizes the most common case. */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
370 INLINE_HEADER EXTENT extent_ancestor (EXTENT e);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
371 INLINE_HEADER EXTENT
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372 extent_ancestor (EXTENT e)
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 return e->flags.has_parent ? extent_ancestor_1 (e) : e;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 void allocate_extent_auxiliary (EXTENT ext);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 void init_buffer_extents (struct buffer *b);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 void uninit_buffer_extents (struct buffer *b);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 typedef int (*map_extents_fun) (EXTENT extent, void *arg);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
381 void map_extents (Charbpos from, Charbpos to, map_extents_fun fn,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 void *arg, Lisp_Object obj, EXTENT after,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 unsigned int flags);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
385 /* Note the following five functions are NOT in Charbpos's */
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
386 void adjust_extents (Lisp_Object object, Membpos from,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
387 Membpos to, int amount);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
388 void adjust_extents_for_deletion (Lisp_Object object, Bytebpos from,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
389 Bytebpos to, int gapsize,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 int numdel, int movegapsize);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
391 void verify_extent_modification (Lisp_Object object, Bytebpos from,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
392 Bytebpos to,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 Lisp_Object inhibit_read_only_value);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 void process_extents_for_insertion (Lisp_Object object,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
395 Bytebpos opoint, Bytecount length);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
396 void process_extents_for_deletion (Lisp_Object object, Bytebpos from,
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
397 Bytebpos to, int destroy_them);
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
398 void report_extent_modification (Lisp_Object, Charbpos, Charbpos, int);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
400 void set_extent_glyph (EXTENT extent, Lisp_Object glyph, int endp,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 glyph_layout layout);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 void add_string_extents (Lisp_Object string, struct buffer *buf,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
404 Bytebpos opoint, Bytecount length);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 void splice_in_string_extents (Lisp_Object string, struct buffer *buf,
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
406 Bytebpos opoint, Bytecount length,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 Bytecount pos);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
408 void copy_string_extents (Lisp_Object new_string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 Lisp_Object old_string,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 Bytecount new_pos, Bytecount old_pos,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 Bytecount length);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 void detach_all_extents (Lisp_Object object);
665
fdefd0186b75 [xemacs-hg @ 2001-09-20 06:28:42 by ben]
ben
parents: 647
diff changeset
414 void set_extent_endpoints (EXTENT extent, Bytebpos s, Bytebpos e,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 Lisp_Object object);
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 #ifdef ERROR_CHECK_EXTENTS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 void sledgehammer_extent_check (Lisp_Object obj);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 #endif
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 #ifdef MEMORY_USAGE_STATS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 int compute_buffer_extent_usage (struct buffer *b,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 struct overhead_stats *ovstats);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 #endif
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 #endif /* emacs */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
428 #endif /* INCLUDED_extents_h_ */