Typo.
[bpt/emacs.git] / src / buffer.c
CommitLineData
1ab256cb 1/* Buffer manipulation primitives for GNU Emacs.
0b5538bd
TTN
2 Copyright (C) 1985, 1986, 1987, 1988, 1989, 1993, 1994,
3 1995, 1997, 1998, 1999, 2000, 2001, 2002,
4e6835db 4 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
1ab256cb
RM
5
6This file is part of GNU Emacs.
7
8GNU Emacs is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
684d6f5b 10the Free Software Foundation; either version 3, or (at your option)
1ab256cb
RM
11any later version.
12
13GNU Emacs is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with GNU Emacs; see the file COPYING. If not, write to
4fc5845f
LK
20the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21Boston, MA 02110-1301, USA. */
1ab256cb 22
68c45bf0 23#include <config.h>
1ab256cb 24
2381d133
JB
25#include <sys/types.h>
26#include <sys/stat.h>
1ab256cb 27#include <sys/param.h>
9dde47f5 28#include <errno.h>
15e7873a 29#include <stdio.h>
9dde47f5 30
2538fae4 31#ifndef USE_CRT_DLL
9dde47f5 32extern int errno;
2538fae4 33#endif
1ab256cb 34
1ab256cb 35
dfcf069d
AS
36#ifdef HAVE_UNISTD_H
37#include <unistd.h>
38#endif
7ee72033 39
1ab256cb 40#include "lisp.h"
21cf4cf8 41#include "intervals.h"
1ab256cb
RM
42#include "window.h"
43#include "commands.h"
44#include "buffer.h"
3b06f880 45#include "charset.h"
28e969dd 46#include "region-cache.h"
1ab256cb 47#include "indent.h"
d014bf88 48#include "blockinput.h"
2538fae4 49#include "keyboard.h"
e35f6ff7 50#include "keymap.h"
08460cd4 51#include "frame.h"
1ab256cb
RM
52
53struct buffer *current_buffer; /* the current buffer */
54
55/* First buffer in chain of all buffers (in reverse order of creation).
56 Threaded through ->next. */
57
58struct buffer *all_buffers;
59
60/* This structure holds the default values of the buffer-local variables
61 defined with DEFVAR_PER_BUFFER, that have special slots in each buffer.
62 The default value occupies the same slot in this structure
63 as an individual buffer's value occupies in that buffer.
64 Setting the default value also goes through the alist of buffers
65 and stores into each buffer that does not say it has a local value. */
66
d4f8198b 67DECL_ALIGN (struct buffer, buffer_defaults);
1ab256cb
RM
68
69/* A Lisp_Object pointer to the above, used for staticpro */
70
71static Lisp_Object Vbuffer_defaults;
72
73/* This structure marks which slots in a buffer have corresponding
74 default values in buffer_defaults.
75 Each such slot has a nonzero value in this structure.
76 The value has only one nonzero bit.
77
78 When a buffer has its own local value for a slot,
7c02e886
GM
79 the entry for that slot (found in the same slot in this structure)
80 is turned on in the buffer's local_flags array.
1ab256cb
RM
81
82 If a slot in this structure is -1, then even though there may
83 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
84 and the corresponding slot in buffer_defaults is not used.
85
86 If a slot is -2, then there is no DEFVAR_PER_BUFFER for it,
87 but there is a default value which is copied into each buffer.
88
1ab256cb
RM
89 If a slot in this structure corresponding to a DEFVAR_PER_BUFFER is
90 zero, that is a bug */
91
92struct buffer buffer_local_flags;
93
94/* This structure holds the names of symbols whose values may be
95 buffer-local. It is indexed and accessed in the same way as the above. */
96
d4f8198b
SM
97DECL_ALIGN (struct buffer, buffer_local_symbols);
98
1ab256cb
RM
99/* A Lisp_Object pointer to the above, used for staticpro */
100static Lisp_Object Vbuffer_local_symbols;
101
0fa3ba92
JB
102/* This structure holds the required types for the values in the
103 buffer-local slots. If a slot contains Qnil, then the
104 corresponding buffer slot may contain a value of any type. If a
105 slot contains an integer, then prospective values' tags must be
1bf08baf
KH
106 equal to that integer (except nil is always allowed).
107 When a tag does not match, the function
108 buffer_slot_type_mismatch will signal an error.
109
110 If a slot here contains -1, the corresponding variable is read-only. */
0fa3ba92
JB
111struct buffer buffer_local_types;
112
13de9290
RS
113/* Flags indicating which built-in buffer-local variables
114 are permanent locals. */
7313acd0 115static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS];
7c02e886
GM
116
117/* Number of per-buffer variables used. */
118
7313acd0 119int last_per_buffer_idx;
13de9290 120
1ab256cb 121Lisp_Object Fset_buffer ();
01050cb5 122void set_buffer_internal ();
c7aa5005 123void set_buffer_internal_1 ();
173f2a64 124static void call_overlay_mod_hooks ();
2f3f993b 125static void swap_out_buffer_local_variables ();
13de9290 126static void reset_buffer_local_variables ();
1ab256cb
RM
127
128/* Alist of all buffer names vs the buffers. */
129/* This used to be a variable, but is no longer,
130 to prevent lossage due to user rplac'ing this alist or its elements. */
131Lisp_Object Vbuffer_alist;
132
133/* Functions to call before and after each text change. */
5f079267
RS
134Lisp_Object Vbefore_change_functions;
135Lisp_Object Vafter_change_functions;
1ab256cb 136
c48f61ef
RS
137Lisp_Object Vtransient_mark_mode;
138
a96b68f1
RS
139/* t means ignore all read-only text properties.
140 A list means ignore such a property if its value is a member of the list.
141 Any non-nil value means ignore buffer-read-only. */
142Lisp_Object Vinhibit_read_only;
143
dcdffbf6
RS
144/* List of functions to call that can query about killing a buffer.
145 If any of these functions returns nil, we don't kill it. */
146Lisp_Object Vkill_buffer_query_functions;
5b20caf0 147Lisp_Object Qkill_buffer_query_functions;
dcdffbf6 148
43ed3b8d
CY
149/* Hook run before changing a major mode. */
150Lisp_Object Vchange_major_mode_hook, Qchange_major_mode_hook;
151
dbc4e1c1
JB
152/* List of functions to call before changing an unmodified buffer. */
153Lisp_Object Vfirst_change_hook;
22378665 154
dbc4e1c1 155Lisp_Object Qfirst_change_hook;
22378665
RS
156Lisp_Object Qbefore_change_functions;
157Lisp_Object Qafter_change_functions;
48265e61 158Lisp_Object Qucs_set_table_for_input;
1ab256cb 159
7775635d
KH
160/* If nonzero, all modification hooks are suppressed. */
161int inhibit_modification_hooks;
162
1ab256cb
RM
163Lisp_Object Qfundamental_mode, Qmode_class, Qpermanent_local;
164
165Lisp_Object Qprotected_field;
166
167Lisp_Object QSFundamental; /* A string "Fundamental" */
168
169Lisp_Object Qkill_buffer_hook;
170
5fe0b67e
RS
171Lisp_Object Qget_file_buffer;
172
52f8ec73
JB
173Lisp_Object Qoverlayp;
174
bbbe9545 175Lisp_Object Qpriority, Qwindow, Qevaporate, Qbefore_string, Qafter_string;
5985d248 176
294d215f
RS
177Lisp_Object Qmodification_hooks;
178Lisp_Object Qinsert_in_front_hooks;
179Lisp_Object Qinsert_behind_hooks;
180
b86af064
GM
181static void alloc_buffer_text P_ ((struct buffer *, size_t));
182static void free_buffer_text P_ ((struct buffer *b));
2410d73a 183static struct Lisp_Overlay * copy_overlays P_ ((struct buffer *, struct Lisp_Overlay *));
2e293742 184static void modify_overlay P_ ((struct buffer *, EMACS_INT, EMACS_INT));
e1688f54 185static Lisp_Object buffer_lisp_local_variables P_ ((struct buffer *));
b86af064
GM
186
187
1ab256cb
RM
188/* For debugging; temporary. See set_buffer_internal. */
189/* Lisp_Object Qlisp_mode, Vcheck_symbol; */
190
01136e9b 191void
1ab256cb
RM
192nsberror (spec)
193 Lisp_Object spec;
194{
a7a60ce9 195 if (STRINGP (spec))
d5db4077 196 error ("No buffer named %s", SDATA (spec));
1ab256cb
RM
197 error ("Invalid buffer argument");
198}
199\f
0dc88e60 200DEFUN ("buffer-live-p", Fbuffer_live_p, Sbuffer_live_p, 1, 1, 0,
7ee72033
MB
201 doc: /* Return non-nil if OBJECT is a buffer which has not been killed.
202Value is nil if OBJECT is not a buffer or if it has been killed. */)
203 (object)
0dc88e60
RS
204 Lisp_Object object;
205{
206 return ((BUFFERP (object) && ! NILP (XBUFFER (object)->name))
207 ? Qt : Qnil);
208}
209
08460cd4 210DEFUN ("buffer-list", Fbuffer_list, Sbuffer_list, 0, 1, 0,
7ee72033 211 doc: /* Return a list of all existing live buffers.
aef466d5
RS
212If the optional arg FRAME is a frame, we return the buffer list
213in the proper order for that frame: the buffers in FRAME's `buffer-list'
214frame parameter come first, followed by the rest of the buffers. */)
7ee72033 215 (frame)
08460cd4 216 Lisp_Object frame;
1ab256cb 217{
08460cd4
RS
218 Lisp_Object framelist, general;
219 general = Fmapcar (Qcdr, Vbuffer_alist);
220
221 if (FRAMEP (frame))
222 {
223 Lisp_Object tail;
224
b7826503 225 CHECK_FRAME (frame);
08460cd4
RS
226
227 framelist = Fcopy_sequence (XFRAME (frame)->buffer_list);
228
229 /* Remove from GENERAL any buffer that duplicates one in FRAMELIST. */
230 tail = framelist;
231 while (! NILP (tail))
232 {
7539e11f
KR
233 general = Fdelq (XCAR (tail), general);
234 tail = XCDR (tail);
08460cd4
RS
235 }
236 return nconc2 (framelist, general);
237 }
238
239 return general;
1ab256cb
RM
240}
241
04ae1b48
RS
242/* Like Fassoc, but use Fstring_equal to compare
243 (which ignores text properties),
244 and don't ever QUIT. */
245
246static Lisp_Object
247assoc_ignore_text_properties (key, list)
248 register Lisp_Object key;
249 Lisp_Object list;
250{
251 register Lisp_Object tail;
6d70a280 252 for (tail = list; CONSP (tail); tail = XCDR (tail))
04ae1b48
RS
253 {
254 register Lisp_Object elt, tem;
6d70a280 255 elt = XCAR (tail);
04ae1b48
RS
256 tem = Fstring_equal (Fcar (elt), key);
257 if (!NILP (tem))
258 return elt;
259 }
260 return Qnil;
261}
262
1ab256cb 263DEFUN ("get-buffer", Fget_buffer, Sget_buffer, 1, 1, 0,
7ee72033 264 doc: /* Return the buffer named NAME (a string).
018ba359 265If there is no live buffer named NAME, return nil.
7ee72033
MB
266NAME may also be a buffer; if so, the value is that buffer. */)
267 (name)
1ab256cb
RM
268 register Lisp_Object name;
269{
a7a60ce9 270 if (BUFFERP (name))
1ab256cb 271 return name;
b7826503 272 CHECK_STRING (name);
1ab256cb 273
04ae1b48 274 return Fcdr (assoc_ignore_text_properties (name, Vbuffer_alist));
1ab256cb
RM
275}
276
277DEFUN ("get-file-buffer", Fget_file_buffer, Sget_file_buffer, 1, 1, 0,
7ee72033 278 doc: /* Return the buffer visiting file FILENAME (a string).
018ba359
PJ
279The buffer's `buffer-file-name' must match exactly the expansion of FILENAME.
280If there is no such live buffer, return nil.
7ee72033
MB
281See also `find-buffer-visiting'. */)
282 (filename)
1ab256cb
RM
283 register Lisp_Object filename;
284{
285 register Lisp_Object tail, buf, tem;
5fe0b67e
RS
286 Lisp_Object handler;
287
b7826503 288 CHECK_STRING (filename);
1ab256cb
RM
289 filename = Fexpand_file_name (filename, Qnil);
290
5fe0b67e
RS
291 /* If the file name has special constructs in it,
292 call the corresponding file handler. */
a617e913 293 handler = Ffind_file_name_handler (filename, Qget_file_buffer);
5fe0b67e
RS
294 if (!NILP (handler))
295 return call2 (handler, Qget_file_buffer, filename);
296
7539e11f 297 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
1ab256cb 298 {
7539e11f 299 buf = Fcdr (XCAR (tail));
a7a60ce9
KH
300 if (!BUFFERP (buf)) continue;
301 if (!STRINGP (XBUFFER (buf)->filename)) continue;
1ab256cb 302 tem = Fstring_equal (XBUFFER (buf)->filename, filename);
265a9e55 303 if (!NILP (tem))
1ab256cb
RM
304 return buf;
305 }
306 return Qnil;
307}
308
52e01189
RS
309Lisp_Object
310get_truename_buffer (filename)
311 register Lisp_Object filename;
312{
313 register Lisp_Object tail, buf, tem;
314
7539e11f 315 for (tail = Vbuffer_alist; CONSP (tail); tail = XCDR (tail))
52e01189 316 {
7539e11f 317 buf = Fcdr (XCAR (tail));
52e01189
RS
318 if (!BUFFERP (buf)) continue;
319 if (!STRINGP (XBUFFER (buf)->file_truename)) continue;
320 tem = Fstring_equal (XBUFFER (buf)->file_truename, filename);
321 if (!NILP (tem))
322 return buf;
323 }
324 return Qnil;
325}
326
1ab256cb
RM
327/* Incremented for each buffer created, to assign the buffer number. */
328int buffer_count;
329
330DEFUN ("get-buffer-create", Fget_buffer_create, Sget_buffer_create, 1, 1, 0,
7ee72033 331 doc: /* Return the buffer named NAME, or create such a buffer and return it.
018ba359
PJ
332A new buffer is created if there is no live buffer named NAME.
333If NAME starts with a space, the new buffer does not keep undo information.
334If NAME is a buffer instead of a string, then it is the value returned.
7ee72033
MB
335The value is never nil. */)
336 (name)
1ab256cb
RM
337 register Lisp_Object name;
338{
a9ee7a59 339 register Lisp_Object buf;
1ab256cb
RM
340 register struct buffer *b;
341
342 buf = Fget_buffer (name);
265a9e55 343 if (!NILP (buf))
1ab256cb
RM
344 return buf;
345
d5db4077 346 if (SCHARS (name) == 0)
31cd83e9
KH
347 error ("Empty string for buffer name is not allowed");
348
a21260d9 349 b = (struct buffer *) allocate_buffer ();
1ab256cb 350
336cd056
RS
351 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
352
353 /* An ordinary buffer uses its own struct buffer_text. */
354 b->text = &b->own_text;
355 b->base_buffer = 0;
356
1ab256cb 357 BUF_GAP_SIZE (b) = 20;
9ac0d9e0 358 BLOCK_INPUT;
3b06f880
KH
359 /* We allocate extra 1-byte at the tail and keep it always '\0' for
360 anchoring a search. */
b86af064 361 alloc_buffer_text (b, BUF_GAP_SIZE (b) + 1);
9ac0d9e0 362 UNBLOCK_INPUT;
1ab256cb 363 if (! BUF_BEG_ADDR (b))
81841847 364 buffer_memory_full ();
1ab256cb 365
6d70a280
SM
366 BUF_PT (b) = BEG;
367 BUF_GPT (b) = BEG;
368 BUF_BEGV (b) = BEG;
369 BUF_ZV (b) = BEG;
370 BUF_Z (b) = BEG;
371 BUF_PT_BYTE (b) = BEG_BYTE;
372 BUF_GPT_BYTE (b) = BEG_BYTE;
373 BUF_BEGV_BYTE (b) = BEG_BYTE;
374 BUF_ZV_BYTE (b) = BEG_BYTE;
375 BUF_Z_BYTE (b) = BEG_BYTE;
1ab256cb 376 BUF_MODIFF (b) = 1;
3e145152 377 BUF_CHARS_MODIFF (b) = 1;
2509d356 378 BUF_OVERLAY_MODIFF (b) = 1;
336cd056
RS
379 BUF_SAVE_MODIFF (b) = 1;
380 BUF_INTERVALS (b) = 0;
b5a225b4
GM
381 BUF_UNCHANGED_MODIFIED (b) = 1;
382 BUF_OVERLAY_UNCHANGED_MODIFIED (b) = 1;
383 BUF_END_UNCHANGED (b) = 0;
384 BUF_BEG_UNCHANGED (b) = 0;
3b06f880 385 *(BUF_GPT_ADDR (b)) = *(BUF_Z_ADDR (b)) = 0; /* Put an anchor '\0'. */
1ab256cb 386
28e969dd
JB
387 b->newline_cache = 0;
388 b->width_run_cache = 0;
389 b->width_table = Qnil;
b5a225b4 390 b->prevent_redisplay_optimizations_p = 1;
28e969dd 391
1ab256cb
RM
392 /* Put this on the chain of all buffers including killed ones. */
393 b->next = all_buffers;
394 all_buffers = b;
395
336cd056
RS
396 /* An ordinary buffer normally doesn't need markers
397 to handle BEGV and ZV. */
398 b->pt_marker = Qnil;
399 b->begv_marker = Qnil;
400 b->zv_marker = Qnil;
04ae1b48
RS
401
402 name = Fcopy_sequence (name);
ab77f05c 403 STRING_SET_INTERVALS (name, NULL_INTERVAL);
1ab256cb 404 b->name = name;
04ae1b48 405
d5db4077 406 if (SREF (name, 0) != ' ')
1ab256cb
RM
407 b->undo_list = Qnil;
408 else
409 b->undo_list = Qt;
410
411 reset_buffer (b);
13de9290 412 reset_buffer_local_variables (b, 1);
1ab256cb 413
1f57cb74 414 b->mark = Fmake_marker ();
65745fad 415 BUF_MARKERS (b) = NULL;
1f57cb74
RS
416 b->name = name;
417
1ab256cb 418 /* Put this in the alist of all live buffers. */
67180c6a 419 XSETBUFFER (buf, b);
1ab256cb
RM
420 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
421
2f064abf 422 /* An error in calling the function here (should someone redefine it)
d36b182f
DL
423 can lead to infinite regress until you run out of stack. rms
424 says that's not worth protecting against. */
48265e61 425 if (!NILP (Ffboundp (Qucs_set_table_for_input)))
d36b182f 426 /* buf is on buffer-alist, so no gcpro. */
48265e61
DL
427 call1 (Qucs_set_table_for_input, buf);
428
336cd056
RS
429 return buf;
430}
431
7e9d5818 432
04e4cb3a
GM
433/* Return a list of overlays which is a copy of the overlay list
434 LIST, but for buffer B. */
435
2410d73a 436static struct Lisp_Overlay *
04e4cb3a
GM
437copy_overlays (b, list)
438 struct buffer *b;
2410d73a 439 struct Lisp_Overlay *list;
04e4cb3a 440{
2410d73a
SM
441 Lisp_Object buffer;
442 struct Lisp_Overlay *result = NULL, *tail = NULL;
04e4cb3a
GM
443
444 XSETBUFFER (buffer, b);
445
2410d73a 446 for (; list; list = list->next)
04e4cb3a
GM
447 {
448 Lisp_Object overlay, start, end, old_overlay;
27c6b98e 449 EMACS_INT charpos;
04e4cb3a 450
2410d73a 451 XSETMISC (old_overlay, list);
04e4cb3a
GM
452 charpos = marker_position (OVERLAY_START (old_overlay));
453 start = Fmake_marker ();
db3a49a6 454 Fset_marker (start, make_number (charpos), buffer);
04e4cb3a
GM
455 XMARKER (start)->insertion_type
456 = XMARKER (OVERLAY_START (old_overlay))->insertion_type;
457
458 charpos = marker_position (OVERLAY_END (old_overlay));
459 end = Fmake_marker ();
db3a49a6 460 Fset_marker (end, make_number (charpos), buffer);
04e4cb3a
GM
461 XMARKER (end)->insertion_type
462 = XMARKER (OVERLAY_END (old_overlay))->insertion_type;
463
464 overlay = allocate_misc ();
465 XMISCTYPE (overlay) = Lisp_Misc_Overlay;
466 OVERLAY_START (overlay) = start;
467 OVERLAY_END (overlay) = end;
468 OVERLAY_PLIST (overlay) = Fcopy_sequence (OVERLAY_PLIST (old_overlay));
2410d73a 469 XOVERLAY (overlay)->next = NULL;
177c0ea7 470
2410d73a
SM
471 if (tail)
472 tail = tail->next = XOVERLAY (overlay);
473 else
474 result = tail = XOVERLAY (overlay);
04e4cb3a
GM
475 }
476
2410d73a 477 return result;
04e4cb3a 478}
177c0ea7 479
04e4cb3a 480
7e9d5818
GM
481/* Clone per-buffer values of buffer FROM.
482
483 Buffer TO gets the same per-buffer values as FROM, with the
484 following exceptions: (1) TO's name is left untouched, (2) markers
485 are copied and made to refer to TO, and (3) overlay lists are
486 copied. */
487
488static void
489clone_per_buffer_values (from, to)
490 struct buffer *from, *to;
491{
54622f33 492 Lisp_Object to_buffer;
7e9d5818
GM
493 int offset;
494
495 XSETBUFFER (to_buffer, to);
177c0ea7 496
7e9d5818
GM
497 for (offset = PER_BUFFER_VAR_OFFSET (name) + sizeof (Lisp_Object);
498 offset < sizeof *to;
499 offset += sizeof (Lisp_Object))
500 {
501 Lisp_Object obj;
502
503 obj = PER_BUFFER_VALUE (from, offset);
504 if (MARKERP (obj))
505 {
506 struct Lisp_Marker *m = XMARKER (obj);
507 obj = Fmake_marker ();
508 XMARKER (obj)->insertion_type = m->insertion_type;
509 set_marker_both (obj, to_buffer, m->charpos, m->bytepos);
510 }
511
512 PER_BUFFER_VALUE (to, offset) = obj;
513 }
514
7e9d5818 515 bcopy (from->local_flags, to->local_flags, sizeof to->local_flags);
177c0ea7 516
04e4cb3a
GM
517 to->overlays_before = copy_overlays (to, from->overlays_before);
518 to->overlays_after = copy_overlays (to, from->overlays_after);
02f28bbd 519
e1688f54
RS
520 /* Get (a copy of) the alist of Lisp-level local variables of FROM
521 and install that in TO. */
522 to->local_var_alist = buffer_lisp_local_variables (from);
7e9d5818
GM
523}
524
7e9d5818
GM
525DEFUN ("make-indirect-buffer", Fmake_indirect_buffer, Smake_indirect_buffer,
526 2, 3,
193c3837 527 "bMake indirect buffer (to buffer): \nBName of indirect buffer: ",
7ee72033 528 doc: /* Create and return an indirect buffer for buffer BASE-BUFFER, named NAME.
c9aac8e6 529BASE-BUFFER should be a live buffer, or the name of an existing buffer.
018ba359
PJ
530NAME should be a string which is not the name of an existing buffer.
531Optional argument CLONE non-nil means preserve BASE-BUFFER's state,
532such as major and minor modes, in the indirect buffer.
7ee72033
MB
533CLONE nil means the indirect buffer's state is reset to default values. */)
534 (base_buffer, name, clone)
7e9d5818 535 Lisp_Object base_buffer, name, clone;
336cd056 536{
c9aac8e6 537 Lisp_Object buf, tem;
7e9d5818 538 struct buffer *b;
336cd056 539
ab53e065 540 CHECK_STRING (name);
336cd056
RS
541 buf = Fget_buffer (name);
542 if (!NILP (buf))
d5db4077 543 error ("Buffer name `%s' is in use", SDATA (name));
336cd056 544
c9aac8e6 545 tem = base_buffer;
336cd056
RS
546 base_buffer = Fget_buffer (base_buffer);
547 if (NILP (base_buffer))
c9aac8e6
LT
548 error ("No such buffer: `%s'", SDATA (tem));
549 if (NILP (XBUFFER (base_buffer)->name))
550 error ("Base buffer has been killed");
336cd056 551
d5db4077 552 if (SCHARS (name) == 0)
336cd056
RS
553 error ("Empty string for buffer name is not allowed");
554
a21260d9 555 b = (struct buffer *) allocate_buffer ();
336cd056
RS
556 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
557
558 if (XBUFFER (base_buffer)->base_buffer)
559 b->base_buffer = XBUFFER (base_buffer)->base_buffer;
560 else
561 b->base_buffer = XBUFFER (base_buffer);
562
563 /* Use the base buffer's text object. */
564 b->text = b->base_buffer->text;
565
566 BUF_BEGV (b) = BUF_BEGV (b->base_buffer);
567 BUF_ZV (b) = BUF_ZV (b->base_buffer);
568 BUF_PT (b) = BUF_PT (b->base_buffer);
3f236a40
RS
569 BUF_BEGV_BYTE (b) = BUF_BEGV_BYTE (b->base_buffer);
570 BUF_ZV_BYTE (b) = BUF_ZV_BYTE (b->base_buffer);
571 BUF_PT_BYTE (b) = BUF_PT_BYTE (b->base_buffer);
336cd056
RS
572
573 b->newline_cache = 0;
574 b->width_run_cache = 0;
575 b->width_table = Qnil;
576
577 /* Put this on the chain of all buffers including killed ones. */
578 b->next = all_buffers;
579 all_buffers = b;
580
581 name = Fcopy_sequence (name);
ab77f05c 582 STRING_SET_INTERVALS (name, NULL_INTERVAL);
336cd056
RS
583 b->name = name;
584
585 reset_buffer (b);
13de9290 586 reset_buffer_local_variables (b, 1);
336cd056
RS
587
588 /* Put this in the alist of all live buffers. */
589 XSETBUFFER (buf, b);
590 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
591
592 b->mark = Fmake_marker ();
1ab256cb 593 b->name = name;
336cd056 594
abc9d959
RS
595 /* The multibyte status belongs to the base buffer. */
596 b->enable_multibyte_characters = b->base_buffer->enable_multibyte_characters;
597
336cd056
RS
598 /* Make sure the base buffer has markers for its narrowing. */
599 if (NILP (b->base_buffer->pt_marker))
600 {
601 b->base_buffer->pt_marker = Fmake_marker ();
3f236a40
RS
602 set_marker_both (b->base_buffer->pt_marker, base_buffer,
603 BUF_PT (b->base_buffer),
604 BUF_PT_BYTE (b->base_buffer));
336cd056
RS
605 }
606 if (NILP (b->base_buffer->begv_marker))
607 {
608 b->base_buffer->begv_marker = Fmake_marker ();
3f236a40
RS
609 set_marker_both (b->base_buffer->begv_marker, base_buffer,
610 BUF_BEGV (b->base_buffer),
611 BUF_BEGV_BYTE (b->base_buffer));
336cd056
RS
612 }
613 if (NILP (b->base_buffer->zv_marker))
614 {
615 b->base_buffer->zv_marker = Fmake_marker ();
3f236a40
RS
616 set_marker_both (b->base_buffer->zv_marker, base_buffer,
617 BUF_ZV (b->base_buffer),
618 BUF_ZV_BYTE (b->base_buffer));
26d84681 619 XMARKER (b->base_buffer->zv_marker)->insertion_type = 1;
336cd056
RS
620 }
621
7e9d5818
GM
622 if (NILP (clone))
623 {
624 /* Give the indirect buffer markers for its narrowing. */
625 b->pt_marker = Fmake_marker ();
626 set_marker_both (b->pt_marker, buf, BUF_PT (b), BUF_PT_BYTE (b));
627 b->begv_marker = Fmake_marker ();
628 set_marker_both (b->begv_marker, buf, BUF_BEGV (b), BUF_BEGV_BYTE (b));
629 b->zv_marker = Fmake_marker ();
630 set_marker_both (b->zv_marker, buf, BUF_ZV (b), BUF_ZV_BYTE (b));
631 XMARKER (b->zv_marker)->insertion_type = 1;
632 }
633 else
7fa57e45
RS
634 {
635 struct buffer *old_b = current_buffer;
636
637 clone_per_buffer_values (b->base_buffer, b);
638 b->filename = Qnil;
639 b->file_truename = Qnil;
640 b->display_count = make_number (0);
641 b->backed_up = Qnil;
642 b->auto_save_file_name = Qnil;
643 set_buffer_internal_1 (b);
644 Fset (intern ("buffer-save-without-query"), Qnil);
645 Fset (intern ("buffer-file-number"), Qnil);
646 Fset (intern ("buffer-stale-function"), Qnil);
647 set_buffer_internal_1 (old_b);
648 }
336cd056 649
a9ee7a59 650 return buf;
1ab256cb
RM
651}
652
d4f5719a
SM
653void
654delete_all_overlays (b)
655 struct buffer *b;
656{
657 Lisp_Object overlay;
658
659 /* `reset_buffer' blindly sets the list of overlays to NULL, so we
660 have to empty the list, otherwise we end up with overlays that
661 think they belong to this buffer while the buffer doesn't know about
662 them any more. */
663 while (b->overlays_before)
664 {
665 XSETMISC (overlay, b->overlays_before);
666 Fdelete_overlay (overlay);
667 }
668 while (b->overlays_after)
669 {
670 XSETMISC (overlay, b->overlays_after);
671 Fdelete_overlay (overlay);
672 }
673 eassert (b->overlays_before == NULL);
674 eassert (b->overlays_after == NULL);
675}
676
bcd40520 677/* Reinitialize everything about a buffer except its name and contents
c9aac8e6 678 and local variables.
d4f5719a
SM
679 If called on an already-initialized buffer, the list of overlays
680 should be deleted before calling this function, otherwise we end up
681 with overlays that claim to belong to the buffer but the buffer
682 claims it doesn't belong to it. */
1ab256cb
RM
683
684void
685reset_buffer (b)
686 register struct buffer *b;
687{
688 b->filename = Qnil;
f6ed2e84 689 b->file_truename = Qnil;
1ab256cb
RM
690 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
691 b->modtime = 0;
8d7a4592 692 XSETFASTINT (b->save_length, 0);
1ab256cb 693 b->last_window_start = 1;
8b264726 694 /* It is more conservative to start out "changed" than "unchanged". */
b5a225b4
GM
695 b->clip_changed = 0;
696 b->prevent_redisplay_optimizations_p = 1;
1ab256cb
RM
697 b->backed_up = Qnil;
698 b->auto_save_modified = 0;
84f6bcba 699 b->auto_save_failure_time = -1;
1ab256cb
RM
700 b->auto_save_file_name = Qnil;
701 b->read_only = Qnil;
2410d73a
SM
702 b->overlays_before = NULL;
703 b->overlays_after = NULL;
c2d5b10f 704 b->overlay_center = BEG;
dfda7a7f 705 b->mark_active = Qnil;
943e065b 706 b->point_before_scroll = Qnil;
be9aafdd 707 b->file_format = Qnil;
71ed49fa 708 b->auto_save_file_format = Qt;
0dc6f165 709 b->last_selected_window = Qnil;
7962a441 710 XSETINT (b->display_count, 0);
3fd364db 711 b->display_time = Qnil;
1bf08baf 712 b->enable_multibyte_characters = buffer_defaults.enable_multibyte_characters;
bb2ec976 713 b->cursor_type = buffer_defaults.cursor_type;
a3bbced0 714 b->extra_line_spacing = buffer_defaults.extra_line_spacing;
0522997d
RS
715
716 b->display_error_modiff = 0;
1ab256cb
RM
717}
718
bcd40520
RS
719/* Reset buffer B's local variables info.
720 Don't use this on a buffer that has already been in use;
721 it does not treat permanent locals consistently.
13de9290
RS
722 Instead, use Fkill_all_local_variables.
723
724 If PERMANENT_TOO is 1, then we reset permanent built-in
725 buffer-local variables. If PERMANENT_TOO is 0,
726 we preserve those. */
bcd40520 727
13de9290
RS
728static void
729reset_buffer_local_variables (b, permanent_too)
1ab256cb 730 register struct buffer *b;
13de9290 731 int permanent_too;
1ab256cb
RM
732{
733 register int offset;
7c02e886 734 int i;
1ab256cb
RM
735
736 /* Reset the major mode to Fundamental, together with all the
737 things that depend on the major mode.
738 default-major-mode is handled at a higher level.
739 We ignore it here. */
740 b->major_mode = Qfundamental_mode;
741 b->keymap = Qnil;
1ab256cb
RM
742 b->mode_name = QSFundamental;
743 b->minor_modes = Qnil;
3446af9c
RS
744
745 /* If the standard case table has been altered and invalidated,
746 fix up its insides first. */
747 if (! (CHAR_TABLE_P (XCHAR_TABLE (Vascii_downcase_table)->extras[0])
748 && CHAR_TABLE_P (XCHAR_TABLE (Vascii_downcase_table)->extras[1])
749 && CHAR_TABLE_P (XCHAR_TABLE (Vascii_downcase_table)->extras[2])))
750 Fset_standard_case_table (Vascii_downcase_table);
751
1ab256cb 752 b->downcase_table = Vascii_downcase_table;
1e9b6335
RS
753 b->upcase_table = XCHAR_TABLE (Vascii_downcase_table)->extras[0];
754 b->case_canon_table = XCHAR_TABLE (Vascii_downcase_table)->extras[1];
755 b->case_eqv_table = XCHAR_TABLE (Vascii_downcase_table)->extras[2];
3cb719bd 756 b->invisibility_spec = Qt;
2e716096
RS
757#ifndef DOS_NT
758 b->buffer_file_type = Qnil;
759#endif
3cb719bd 760
13de9290 761 /* Reset all (or most) per-buffer variables to their defaults. */
1ab256cb 762 b->local_var_alist = Qnil;
7313acd0 763 for (i = 0; i < last_per_buffer_idx; ++i)
7c02e886 764 if (permanent_too || buffer_permanent_local_flags[i] == 0)
7313acd0 765 SET_PER_BUFFER_VALUE_P (b, i, 0);
1ab256cb
RM
766
767 /* For each slot that has a default value,
768 copy that into the slot. */
769
7313acd0 770 for (offset = PER_BUFFER_VAR_OFFSET (name);
7c02e886
GM
771 offset < sizeof *b;
772 offset += sizeof (Lisp_Object))
aab80822 773 {
7313acd0 774 int idx = PER_BUFFER_IDX (offset);
7c02e886
GM
775 if ((idx > 0
776 && (permanent_too
777 || buffer_permanent_local_flags[idx] == 0))
778 /* Is -2 used anywhere? */
779 || idx == -2)
7313acd0 780 PER_BUFFER_VALUE (b, offset) = PER_BUFFER_DEFAULT (offset);
aab80822 781 }
1ab256cb
RM
782}
783
01050cb5
RM
784/* We split this away from generate-new-buffer, because rename-buffer
785 and set-visited-file-name ought to be able to use this to really
786 rename the buffer properly. */
787
788DEFUN ("generate-new-buffer-name", Fgenerate_new_buffer_name, Sgenerate_new_buffer_name,
efc7e75f 789 1, 2, 0,
7ee72033 790 doc: /* Return a string that is the name of no existing buffer based on NAME.
018ba359
PJ
791If there is no live buffer named NAME, then return NAME.
792Otherwise modify name by appending `<NUMBER>', incrementing NUMBER
54dffe35 793\(starting at 2) until an unused name is found, and then return that name.
2f064abf
JB
794Optional second argument IGNORE specifies a name that is okay to use (if
795it is in the sequence to be tried) even if a buffer with that name exists. */)
7ee72033 796 (name, ignore)
c273e647 797 register Lisp_Object name, ignore;
1ab256cb
RM
798{
799 register Lisp_Object gentemp, tem;
800 int count;
801 char number[10];
802
b7826503 803 CHECK_STRING (name);
1ab256cb 804
54dffe35
LT
805 tem = Fstring_equal (name, ignore);
806 if (!NILP (tem))
807 return name;
1ab256cb 808 tem = Fget_buffer (name);
265a9e55 809 if (NILP (tem))
01050cb5 810 return name;
1ab256cb
RM
811
812 count = 1;
813 while (1)
814 {
815 sprintf (number, "<%d>", ++count);
816 gentemp = concat2 (name, build_string (number));
638e4fc3 817 tem = Fstring_equal (gentemp, ignore);
c273e647
RS
818 if (!NILP (tem))
819 return gentemp;
1ab256cb 820 tem = Fget_buffer (gentemp);
265a9e55 821 if (NILP (tem))
01050cb5 822 return gentemp;
1ab256cb
RM
823 }
824}
825
826\f
827DEFUN ("buffer-name", Fbuffer_name, Sbuffer_name, 0, 1, 0,
7ee72033
MB
828 doc: /* Return the name of BUFFER, as a string.
829With no argument or nil as argument, return the name of the current buffer. */)
830 (buffer)
1ab256cb
RM
831 register Lisp_Object buffer;
832{
265a9e55 833 if (NILP (buffer))
1ab256cb 834 return current_buffer->name;
b7826503 835 CHECK_BUFFER (buffer);
1ab256cb
RM
836 return XBUFFER (buffer)->name;
837}
838
839DEFUN ("buffer-file-name", Fbuffer_file_name, Sbuffer_file_name, 0, 1, 0,
7ee72033
MB
840 doc: /* Return name of file BUFFER is visiting, or nil if none.
841No argument or nil as argument means use the current buffer. */)
842 (buffer)
1ab256cb
RM
843 register Lisp_Object buffer;
844{
265a9e55 845 if (NILP (buffer))
1ab256cb 846 return current_buffer->filename;
b7826503 847 CHECK_BUFFER (buffer);
1ab256cb
RM
848 return XBUFFER (buffer)->filename;
849}
850
336cd056
RS
851DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer,
852 0, 1, 0,
7ee72033 853 doc: /* Return the base buffer of indirect buffer BUFFER.
5a72efd4
LT
854If BUFFER is not indirect, return nil.
855BUFFER defaults to the current buffer. */)
7ee72033 856 (buffer)
336cd056
RS
857 register Lisp_Object buffer;
858{
859 struct buffer *base;
860 Lisp_Object base_buffer;
861
862 if (NILP (buffer))
863 base = current_buffer->base_buffer;
864 else
865 {
b7826503 866 CHECK_BUFFER (buffer);
336cd056
RS
867 base = XBUFFER (buffer)->base_buffer;
868 }
869
870 if (! base)
871 return Qnil;
872 XSETBUFFER (base_buffer, base);
873 return base_buffer;
874}
875
79aa712d 876DEFUN ("buffer-local-value", Fbuffer_local_value,
177c0ea7 877 Sbuffer_local_value, 2, 2, 0,
79aa712d
RS
878 doc: /* Return the value of VARIABLE in BUFFER.
879If VARIABLE does not have a buffer-local binding in BUFFER, the value
5e2ad10b
JB
880is the default binding of the variable. */)
881 (variable, buffer)
882 register Lisp_Object variable;
79aa712d
RS
883 register Lisp_Object buffer;
884{
885 register struct buffer *buf;
886 register Lisp_Object result;
887
5e2ad10b 888 CHECK_SYMBOL (variable);
ae69175b 889 CHECK_BUFFER (buffer);
79aa712d
RS
890 buf = XBUFFER (buffer);
891
0e4d0c9a
RS
892 if (SYMBOLP (variable))
893 variable = indirect_variable (variable);
894
79aa712d 895 /* Look in local_var_list */
5e2ad10b 896 result = Fassoc (variable, buf->local_var_alist);
177c0ea7 897 if (NILP (result))
79aa712d
RS
898 {
899 int offset, idx;
900 int found = 0;
901
902 /* Look in special slots */
903 for (offset = PER_BUFFER_VAR_OFFSET (name);
904 offset < sizeof (struct buffer);
905 /* sizeof EMACS_INT == sizeof Lisp_Object */
906 offset += (sizeof (EMACS_INT)))
907 {
908 idx = PER_BUFFER_IDX (offset);
909 if ((idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
177c0ea7 910 && SYMBOLP (PER_BUFFER_SYMBOL (offset))
5e2ad10b 911 && EQ (PER_BUFFER_SYMBOL (offset), variable))
79aa712d
RS
912 {
913 result = PER_BUFFER_VALUE (buf, offset);
914 found = 1;
915 break;
916 }
917 }
918
919 if (!found)
5e2ad10b 920 result = Fdefault_value (variable);
79aa712d
RS
921 }
922 else
f0bac7de
RS
923 {
924 Lisp_Object valcontents;
925 Lisp_Object current_alist_element;
926
927 /* What binding is loaded right now? */
5e2ad10b 928 valcontents = SYMBOL_VALUE (variable);
f0bac7de
RS
929 current_alist_element
930 = XCAR (XBUFFER_LOCAL_VALUE (valcontents)->cdr);
931
932 /* The value of the currently loaded binding is not
933 stored in it, but rather in the realvalue slot.
934 Store that value into the binding it belongs to
935 in case that is the one we are about to use. */
936
937 Fsetcdr (current_alist_element,
938 do_symval_forwarding (XBUFFER_LOCAL_VALUE (valcontents)->realvalue));
939
940 /* Now get the (perhaps updated) value out of the binding. */
941 result = XCDR (result);
942 }
79aa712d 943
4c4dc0b0
KS
944 if (!EQ (result, Qunbound))
945 return result;
79aa712d 946
4c4dc0b0 947 xsignal1 (Qvoid_variable, variable);
79aa712d
RS
948}
949
e1688f54 950/* Return an alist of the Lisp-level buffer-local bindings of
7fa57e45 951 buffer BUF. That is, don't include the variables maintained
e1688f54
RS
952 in special slots in the buffer object. */
953
954static Lisp_Object
955buffer_lisp_local_variables (buf)
956 struct buffer *buf;
957{
958 Lisp_Object result = Qnil;
959 register Lisp_Object tail;
960 for (tail = buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
961 {
962 Lisp_Object val, elt;
963
964 elt = XCAR (tail);
965
966 /* Reference each variable in the alist in buf.
967 If inquiring about the current buffer, this gets the current values,
968 so store them into the alist so the alist is up to date.
969 If inquiring about some other buffer, this swaps out any values
970 for that buffer, making the alist up to date automatically. */
971 val = find_symbol_value (XCAR (elt));
972 /* Use the current buffer value only if buf is the current buffer. */
973 if (buf != current_buffer)
974 val = XCDR (elt);
975
976 /* If symbol is unbound, put just the symbol in the list. */
977 if (EQ (val, Qunbound))
978 result = Fcons (XCAR (elt), result);
979 /* Otherwise, put (symbol . value) in the list. */
980 else
981 result = Fcons (Fcons (XCAR (elt), val), result);
982 }
983
984 return result;
985}
986
1ab256cb 987DEFUN ("buffer-local-variables", Fbuffer_local_variables,
efc7e75f 988 Sbuffer_local_variables, 0, 1, 0,
7ee72033 989 doc: /* Return an alist of variables that are buffer-local in BUFFER.
018ba359
PJ
990Most elements look like (SYMBOL . VALUE), describing one variable.
991For a symbol that is locally unbound, just the symbol appears in the value.
992Note that storing new VALUEs in these elements doesn't change the variables.
7ee72033
MB
993No argument or nil as argument means use current buffer as BUFFER. */)
994 (buffer)
1ab256cb
RM
995 register Lisp_Object buffer;
996{
997 register struct buffer *buf;
553defa4 998 register Lisp_Object result;
1ab256cb 999
265a9e55 1000 if (NILP (buffer))
1ab256cb
RM
1001 buf = current_buffer;
1002 else
1003 {
b7826503 1004 CHECK_BUFFER (buffer);
1ab256cb
RM
1005 buf = XBUFFER (buffer);
1006 }
1007
e1688f54 1008 result = buffer_lisp_local_variables (buf);
1ab256cb 1009
1ab256cb
RM
1010 /* Add on all the variables stored in special slots. */
1011 {
7c02e886 1012 int offset, idx;
1ab256cb 1013
7313acd0 1014 for (offset = PER_BUFFER_VAR_OFFSET (name);
1ab256cb 1015 offset < sizeof (struct buffer);
7c02e886
GM
1016 /* sizeof EMACS_INT == sizeof Lisp_Object */
1017 offset += (sizeof (EMACS_INT)))
1ab256cb 1018 {
7313acd0
GM
1019 idx = PER_BUFFER_IDX (offset);
1020 if ((idx == -1 || PER_BUFFER_VALUE_P (buf, idx))
1021 && SYMBOLP (PER_BUFFER_SYMBOL (offset)))
1022 result = Fcons (Fcons (PER_BUFFER_SYMBOL (offset),
1023 PER_BUFFER_VALUE (buf, offset)),
7c02e886 1024 result);
1ab256cb
RM
1025 }
1026 }
553defa4
RS
1027
1028 return result;
1ab256cb 1029}
1ab256cb
RM
1030\f
1031DEFUN ("buffer-modified-p", Fbuffer_modified_p, Sbuffer_modified_p,
efc7e75f 1032 0, 1, 0,
7ee72033
MB
1033 doc: /* Return t if BUFFER was modified since its file was last read or saved.
1034No argument or nil as argument means use current buffer as BUFFER. */)
1035 (buffer)
1ab256cb
RM
1036 register Lisp_Object buffer;
1037{
1038 register struct buffer *buf;
265a9e55 1039 if (NILP (buffer))
1ab256cb
RM
1040 buf = current_buffer;
1041 else
1042 {
b7826503 1043 CHECK_BUFFER (buffer);
1ab256cb
RM
1044 buf = XBUFFER (buffer);
1045 }
1046
336cd056 1047 return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil;
1ab256cb
RM
1048}
1049
1050DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
efc7e75f 1051 1, 1, 0,
7ee72033
MB
1052 doc: /* Mark current buffer as modified or unmodified according to FLAG.
1053A non-nil FLAG means mark the buffer modified. */)
1054 (flag)
1ab256cb
RM
1055 register Lisp_Object flag;
1056{
1057 register int already;
1058 register Lisp_Object fn;
8ec01c70 1059 Lisp_Object buffer, window;
1ab256cb
RM
1060
1061#ifdef CLASH_DETECTION
1062 /* If buffer becoming modified, lock the file.
1063 If buffer becoming unmodified, unlock the file. */
1064
60f4dd23 1065 fn = current_buffer->file_truename;
90d456d2
KH
1066 /* Test buffer-file-name so that binding it to nil is effective. */
1067 if (!NILP (fn) && ! NILP (current_buffer->filename))
1ab256cb 1068 {
336cd056 1069 already = SAVE_MODIFF < MODIFF;
265a9e55 1070 if (!already && !NILP (flag))
1ab256cb 1071 lock_file (fn);
265a9e55 1072 else if (already && NILP (flag))
1ab256cb
RM
1073 unlock_file (fn);
1074 }
1075#endif /* CLASH_DETECTION */
1076
336cd056 1077 SAVE_MODIFF = NILP (flag) ? MODIFF : 0;
177c0ea7 1078
8ec01c70
GM
1079 /* Set update_mode_lines only if buffer is displayed in some window.
1080 Packages like jit-lock or lazy-lock preserve a buffer's modified
1081 state by recording/restoring the state around blocks of code.
1082 Setting update_mode_lines makes redisplay consider all windows
1083 (on all frames). Stealth fontification of buffers not displayed
1084 would incur additional redisplay costs if we'd set
1085 update_modes_lines unconditionally.
1086
1087 Ideally, I think there should be another mechanism for fontifying
1088 buffers without "modifying" buffers, or redisplay should be
1089 smarter about updating the `*' in mode lines. --gerd */
1090 XSETBUFFER (buffer, current_buffer);
1091 window = Fget_buffer_window (buffer, Qt);
1092 if (WINDOWP (window))
d57b83b3
GM
1093 {
1094 ++update_mode_lines;
1095 current_buffer->prevent_redisplay_optimizations_p = 1;
1096 }
177c0ea7 1097
1ab256cb
RM
1098 return flag;
1099}
1100
a8c21b48
GM
1101DEFUN ("restore-buffer-modified-p", Frestore_buffer_modified_p,
1102 Srestore_buffer_modified_p, 1, 1, 0,
42f47086 1103 doc: /* Like `set-buffer-modified-p', with a difference concerning redisplay.
018ba359 1104It is not ensured that mode lines will be updated to show the modified
7ee72033
MB
1105state of the current buffer. Use with care. */)
1106 (flag)
a8c21b48
GM
1107 Lisp_Object flag;
1108{
1109#ifdef CLASH_DETECTION
1110 Lisp_Object fn;
177c0ea7 1111
a8c21b48
GM
1112 /* If buffer becoming modified, lock the file.
1113 If buffer becoming unmodified, unlock the file. */
1114
1115 fn = current_buffer->file_truename;
1116 /* Test buffer-file-name so that binding it to nil is effective. */
1117 if (!NILP (fn) && ! NILP (current_buffer->filename))
1118 {
1119 int already = SAVE_MODIFF < MODIFF;
1120 if (!already && !NILP (flag))
1121 lock_file (fn);
1122 else if (already && NILP (flag))
1123 unlock_file (fn);
1124 }
1125#endif /* CLASH_DETECTION */
177c0ea7 1126
a8c21b48
GM
1127 SAVE_MODIFF = NILP (flag) ? MODIFF : 0;
1128 return flag;
1129}
1130
1ab256cb 1131DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
efc7e75f 1132 0, 1, 0,
7ee72033 1133 doc: /* Return BUFFER's tick counter, incremented for each change in text.
2f064abf
JB
1134Each buffer has a tick counter which is incremented each time the
1135text in that buffer is changed. It wraps around occasionally.
7ee72033
MB
1136No argument or nil as argument means use current buffer as BUFFER. */)
1137 (buffer)
1ab256cb
RM
1138 register Lisp_Object buffer;
1139{
1140 register struct buffer *buf;
265a9e55 1141 if (NILP (buffer))
1ab256cb
RM
1142 buf = current_buffer;
1143 else
1144 {
b7826503 1145 CHECK_BUFFER (buffer);
1ab256cb
RM
1146 buf = XBUFFER (buffer);
1147 }
1148
1149 return make_number (BUF_MODIFF (buf));
1150}
3e145152
CY
1151
1152DEFUN ("buffer-chars-modified-tick", Fbuffer_chars_modified_tick,
1153 Sbuffer_chars_modified_tick, 0, 1, 0,
1154 doc: /* Return BUFFER's character-change tick counter.
1155Each buffer has a character-change tick counter, which is set to the
1156value of the buffer's tick counter \(see `buffer-modified-tick'), each
1157time text in that buffer is inserted or deleted. By comparing the
12bd42be 1158values returned by two individual calls of `buffer-chars-modified-tick',
3e145152
CY
1159you can tell whether a character change occurred in that buffer in
1160between these calls. No argument or nil as argument means use current
1161buffer as BUFFER. */)
1162 (buffer)
1163 register Lisp_Object buffer;
1164{
1165 register struct buffer *buf;
1166 if (NILP (buffer))
1167 buf = current_buffer;
1168 else
1169 {
1170 CHECK_BUFFER (buffer);
1171 buf = XBUFFER (buffer);
1172 }
1173
1174 return make_number (BUF_CHARS_MODIFF (buf));
1175}
1ab256cb 1176\f
01050cb5 1177DEFUN ("rename-buffer", Frename_buffer, Srename_buffer, 1, 2,
4c7e5f09 1178 "sRename buffer (to new name): \nP",
7ee72033 1179 doc: /* Change current buffer's name to NEWNAME (a string).
018ba359
PJ
1180If second arg UNIQUE is nil or omitted, it is an error if a
1181buffer named NEWNAME already exists.
1182If UNIQUE is non-nil, come up with a new name using
1183`generate-new-buffer-name'.
1184Interactively, you can set UNIQUE with a prefix argument.
1185We return the name we actually gave the buffer.
7ee72033
MB
1186This does not change the name of the visited file (if any). */)
1187 (newname, unique)
489c043a 1188 register Lisp_Object newname, unique;
1ab256cb
RM
1189{
1190 register Lisp_Object tem, buf;
1191
b7826503 1192 CHECK_STRING (newname);
d59698c4 1193
d5db4077 1194 if (SCHARS (newname) == 0)
d59698c4
RS
1195 error ("Empty string is invalid as a buffer name");
1196
489c043a 1197 tem = Fget_buffer (newname);
265a9e55 1198 if (!NILP (tem))
01050cb5 1199 {
8801a864
KR
1200 /* Don't short-circuit if UNIQUE is t. That is a useful way to
1201 rename the buffer automatically so you can create another
1202 with the original name. It makes UNIQUE equivalent to
1203 (rename-buffer (generate-new-buffer-name NEWNAME)). */
1204 if (NILP (unique) && XBUFFER (tem) == current_buffer)
1205 return current_buffer->name;
3bd779aa 1206 if (!NILP (unique))
489c043a 1207 newname = Fgenerate_new_buffer_name (newname, current_buffer->name);
01050cb5 1208 else
d5db4077 1209 error ("Buffer name `%s' is in use", SDATA (newname));
01050cb5 1210 }
1ab256cb 1211
489c043a 1212 current_buffer->name = newname;
76f590d7
JB
1213
1214 /* Catch redisplay's attention. Unless we do this, the mode lines for
1215 any windows displaying current_buffer will stay unchanged. */
1216 update_mode_lines++;
1217
67180c6a 1218 XSETBUFFER (buf, current_buffer);
489c043a 1219 Fsetcar (Frassq (buf, Vbuffer_alist), newname);
cf058e49
KH
1220 if (NILP (current_buffer->filename)
1221 && !NILP (current_buffer->auto_save_file_name))
1ab256cb 1222 call0 (intern ("rename-auto-save-file"));
fb5eba9c
RS
1223 /* Refetch since that last call may have done GC. */
1224 return current_buffer->name;
1ab256cb
RM
1225}
1226
773fbdb9 1227DEFUN ("other-buffer", Fother_buffer, Sother_buffer, 0, 3, 0,
7ee72033 1228 doc: /* Return most recently selected buffer other than BUFFER.
018ba359
PJ
1229Buffers not visible in windows are preferred to visible buffers,
1230unless optional second argument VISIBLE-OK is non-nil.
1231If the optional third argument FRAME is non-nil, use that frame's
1232buffer list instead of the selected frame's buffer list.
1233If no other buffer exists, the buffer `*scratch*' is returned.
7ee72033
MB
1234If BUFFER is omitted or nil, some interesting buffer is returned. */)
1235 (buffer, visible_ok, frame)
773fbdb9 1236 register Lisp_Object buffer, visible_ok, frame;
1ab256cb 1237{
89132f25 1238 Lisp_Object Fset_buffer_major_mode ();
7962a441 1239 register Lisp_Object tail, buf, notsogood, tem, pred, add_ons;
1ab256cb
RM
1240 notsogood = Qnil;
1241
773fbdb9 1242 if (NILP (frame))
9ba9623d 1243 frame = selected_frame;
773fbdb9 1244
7962a441 1245 tail = Vbuffer_alist;
773fbdb9 1246 pred = frame_buffer_predicate (frame);
7962a441
RS
1247
1248 /* Consider buffers that have been seen in the selected frame
1249 before other buffers. */
177c0ea7 1250
773fbdb9 1251 tem = frame_buffer_list (frame);
7962a441
RS
1252 add_ons = Qnil;
1253 while (CONSP (tem))
1254 {
7539e11f
KR
1255 if (BUFFERP (XCAR (tem)))
1256 add_ons = Fcons (Fcons (Qnil, XCAR (tem)), add_ons);
1257 tem = XCDR (tem);
7962a441
RS
1258 }
1259 tail = nconc2 (Fnreverse (add_ons), tail);
1260
6d70a280 1261 for (; CONSP (tail); tail = XCDR (tail))
1ab256cb 1262 {
6d70a280 1263 buf = Fcdr (XCAR (tail));
1ab256cb
RM
1264 if (EQ (buf, buffer))
1265 continue;
d674d13e
RS
1266 if (NILP (buf))
1267 continue;
1268 if (NILP (XBUFFER (buf)->name))
1269 continue;
10ceceb8 1270 if (SREF (XBUFFER (buf)->name, 0) == ' ')
1ab256cb 1271 continue;
04ae1b48
RS
1272 /* If the selected frame has a buffer_predicate,
1273 disregard buffers that don't fit the predicate. */
7962a441 1274 if (!NILP (pred))
04ae1b48 1275 {
7962a441 1276 tem = call1 (pred, buf);
04ae1b48
RS
1277 if (NILP (tem))
1278 continue;
1279 }
04ae1b48 1280
a0ebb746 1281 if (NILP (visible_ok))
66ffe51c 1282 tem = Fget_buffer_window (buf, Qvisible);
a0ebb746
JB
1283 else
1284 tem = Qnil;
265a9e55 1285 if (NILP (tem))
1ab256cb 1286 return buf;
265a9e55 1287 if (NILP (notsogood))
1ab256cb
RM
1288 notsogood = buf;
1289 }
265a9e55 1290 if (!NILP (notsogood))
1ab256cb 1291 return notsogood;
dba1a30a
GM
1292 buf = Fget_buffer (build_string ("*scratch*"));
1293 if (NILP (buf))
1294 {
1295 buf = Fget_buffer_create (build_string ("*scratch*"));
1296 Fset_buffer_major_mode (buf);
1297 }
89132f25 1298 return buf;
1ab256cb
RM
1299}
1300\f
1ab256cb
RM
1301DEFUN ("buffer-enable-undo", Fbuffer_enable_undo, Sbuffer_enable_undo,
1302 0, 1, "",
7ee72033
MB
1303 doc: /* Start keeping undo information for buffer BUFFER.
1304No argument or nil as argument means do this for the current buffer. */)
1305 (buffer)
ffd56f97 1306 register Lisp_Object buffer;
1ab256cb 1307{
ffd56f97 1308 Lisp_Object real_buffer;
1ab256cb 1309
ffd56f97 1310 if (NILP (buffer))
67180c6a 1311 XSETBUFFER (real_buffer, current_buffer);
1ab256cb
RM
1312 else
1313 {
ffd56f97
JB
1314 real_buffer = Fget_buffer (buffer);
1315 if (NILP (real_buffer))
1316 nsberror (buffer);
1ab256cb
RM
1317 }
1318
ffd56f97
JB
1319 if (EQ (XBUFFER (real_buffer)->undo_list, Qt))
1320 XBUFFER (real_buffer)->undo_list = Qnil;
1ab256cb
RM
1321
1322 return Qnil;
1323}
1324
1325/*
1326 DEFVAR_LISP ("kill-buffer-hook", no_cell, "\
1327Hook to be run (by `run-hooks', which see) when a buffer is killed.\n\
1328The buffer being killed will be current while the hook is running.\n\
1329See `kill-buffer'."
1330 */
1331DEFUN ("kill-buffer", Fkill_buffer, Skill_buffer, 1, 1, "bKill buffer: ",
7ee72033 1332 doc: /* Kill the buffer BUFFER.
f6e22881
JB
1333The argument may be a buffer or the name of a buffer.
1334With a nil argument, kill the current buffer.
018ba359 1335
f6e22881 1336Value is t if the buffer is actually killed, nil otherwise.
018ba359 1337
f6e22881
JB
1338The functions in `kill-buffer-query-functions' are called with BUFFER as
1339the current buffer. If any of them returns nil, the buffer is not killed.
1340
1341The hook `kill-buffer-hook' is run before the buffer is actually killed.
1342The buffer being killed will be current while the hook is running.
018ba359
PJ
1343
1344Any processes that have this buffer as the `process-buffer' are killed
7ee72033
MB
1345with SIGHUP. */)
1346 (buffer)
a25f13ae 1347 Lisp_Object buffer;
1ab256cb
RM
1348{
1349 Lisp_Object buf;
1350 register struct buffer *b;
1351 register Lisp_Object tem;
1352 register struct Lisp_Marker *m;
6af718a4 1353 struct gcpro gcpro1;
1ab256cb 1354
a25f13ae 1355 if (NILP (buffer))
1ab256cb
RM
1356 buf = Fcurrent_buffer ();
1357 else
a25f13ae 1358 buf = Fget_buffer (buffer);
265a9e55 1359 if (NILP (buf))
a25f13ae 1360 nsberror (buffer);
1ab256cb
RM
1361
1362 b = XBUFFER (buf);
1363
4a4a9db5
KH
1364 /* Avoid trouble for buffer already dead. */
1365 if (NILP (b->name))
1366 return Qnil;
1367
1ab256cb 1368 /* Query if the buffer is still modified. */
265a9e55 1369 if (INTERACTIVE && !NILP (b->filename)
336cd056 1370 && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
1ab256cb 1371 {
a25f13ae 1372 GCPRO1 (buf);
5c4930b0
RS
1373 tem = do_yes_or_no_p (format2 ("Buffer %s modified; kill anyway? ",
1374 b->name, make_number (0)));
1ab256cb 1375 UNGCPRO;
265a9e55 1376 if (NILP (tem))
1ab256cb
RM
1377 return Qnil;
1378 }
1379
dcdffbf6 1380 /* Run hooks with the buffer to be killed the current buffer. */
1ab256cb 1381 {
aed13378 1382 int count = SPECPDL_INDEX ();
5b20caf0 1383 Lisp_Object arglist[1];
1ab256cb
RM
1384
1385 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1386 set_buffer_internal (b);
dcdffbf6
RS
1387
1388 /* First run the query functions; if any query is answered no,
1389 don't kill the buffer. */
5b20caf0 1390 arglist[0] = Qkill_buffer_query_functions;
09706e1f
KR
1391 tem = Frun_hook_with_args_until_failure (1, arglist);
1392 if (NILP (tem))
5b20caf0 1393 return unbind_to (count, Qnil);
dcdffbf6
RS
1394
1395 /* Then run the hooks. */
f1597a3a 1396 Frun_hooks (1, &Qkill_buffer_hook);
1ab256cb
RM
1397 unbind_to (count, Qnil);
1398 }
1399
1400 /* We have no more questions to ask. Verify that it is valid
1401 to kill the buffer. This must be done after the questions
1402 since anything can happen within do_yes_or_no_p. */
1403
1404 /* Don't kill the minibuffer now current. */
1405 if (EQ (buf, XWINDOW (minibuf_window)->buffer))
1406 return Qnil;
1407
265a9e55 1408 if (NILP (b->name))
1ab256cb
RM
1409 return Qnil;
1410
336cd056
RS
1411 /* When we kill a base buffer, kill all its indirect buffers.
1412 We do it at this stage so nothing terrible happens if they
1413 ask questions or their hooks get errors. */
1414 if (! b->base_buffer)
1415 {
1416 struct buffer *other;
1417
1418 GCPRO1 (buf);
1419
1420 for (other = all_buffers; other; other = other->next)
4a4a9db5
KH
1421 /* all_buffers contains dead buffers too;
1422 don't re-kill them. */
1423 if (other->base_buffer == b && !NILP (other->name))
336cd056
RS
1424 {
1425 Lisp_Object buf;
1426 XSETBUFFER (buf, other);
1427 Fkill_buffer (buf);
1428 }
1429
1430 UNGCPRO;
1431 }
177c0ea7 1432
1ab256cb
RM
1433 /* Make this buffer not be current.
1434 In the process, notice if this is the sole visible buffer
1435 and give up if so. */
1436 if (b == current_buffer)
1437 {
773fbdb9 1438 tem = Fother_buffer (buf, Qnil, Qnil);
1ab256cb
RM
1439 Fset_buffer (tem);
1440 if (b == current_buffer)
1441 return Qnil;
1442 }
1443
77270fac
GM
1444 /* Notice if the buffer to kill is the sole visible buffer
1445 when we're currently in the mini-buffer, and give up if so. */
1446 XSETBUFFER (tem, current_buffer);
1447 if (EQ (tem, XWINDOW (minibuf_window)->buffer))
1448 {
1449 tem = Fother_buffer (buf, Qnil, Qnil);
77270fac
GM
1450 if (EQ (buf, tem))
1451 return Qnil;
1452 }
1453
1ab256cb
RM
1454 /* Now there is no question: we can kill the buffer. */
1455
1456#ifdef CLASH_DETECTION
1457 /* Unlock this buffer's file, if it is locked. */
1458 unlock_buffer (b);
1459#endif /* CLASH_DETECTION */
1460
49da74e6 1461 GCPRO1 (buf);
1ab256cb 1462 kill_buffer_processes (buf);
49da74e6
KS
1463 UNGCPRO;
1464
1465 /* Killing buffer processes may run sentinels which may
1466 have called kill-buffer. */
1467
1468 if (NILP (b->name))
1469 return Qnil;
1470
b93fb365 1471 clear_charpos_cache (b);
1ab256cb
RM
1472
1473 tem = Vinhibit_quit;
1474 Vinhibit_quit = Qt;
00550f94 1475 replace_buffer_in_all_windows (buf);
b26dd9cb 1476 Vbuffer_alist = Fdelq (Frassq (buf, Vbuffer_alist), Vbuffer_alist);
7962a441 1477 frames_discard_buffer (buf);
1ab256cb
RM
1478 Vinhibit_quit = tem;
1479
9cf712eb
RS
1480 /* Delete any auto-save file, if we saved it in this session.
1481 But not if the buffer is modified. */
a7a60ce9 1482 if (STRINGP (b->auto_save_file_name)
e95a0b39 1483 && b->auto_save_modified != 0
9cf712eb 1484 && BUF_SAVE_MODIFF (b) < b->auto_save_modified
d674d13e
RS
1485 && BUF_SAVE_MODIFF (b) < BUF_MODIFF (b)
1486 && NILP (Fsymbol_value (intern ("auto-save-visited-file-name"))))
1ab256cb
RM
1487 {
1488 Lisp_Object tem;
1489 tem = Fsymbol_value (intern ("delete-auto-save-files"));
265a9e55 1490 if (! NILP (tem))
cbb6a418 1491 internal_delete_file (b->auto_save_file_name);
1ab256cb
RM
1492 }
1493
4a4a9db5
KH
1494 if (b->base_buffer)
1495 {
1496 /* Unchain all markers that belong to this indirect buffer.
1497 Don't unchain the markers that belong to the base buffer
1498 or its other indirect buffers. */
65745fad 1499 for (m = BUF_MARKERS (b); m; )
4a4a9db5 1500 {
65745fad 1501 struct Lisp_Marker *next = m->next;
4a4a9db5 1502 if (m->buffer == b)
65745fad
SM
1503 unchain_marker (m);
1504 m = next;
4a4a9db5
KH
1505 }
1506 }
1507 else
1ab256cb 1508 {
4a4a9db5 1509 /* Unchain all markers of this buffer and its indirect buffers.
336cd056 1510 and leave them pointing nowhere. */
65745fad 1511 for (m = BUF_MARKERS (b); m; )
336cd056 1512 {
65745fad 1513 struct Lisp_Marker *next = m->next;
336cd056 1514 m->buffer = 0;
65745fad
SM
1515 m->next = NULL;
1516 m = next;
336cd056 1517 }
65745fad 1518 BUF_MARKERS (b) = NULL;
336cd056 1519 BUF_INTERVALS (b) = NULL_INTERVAL;
336cd056
RS
1520
1521 /* Perhaps we should explicitly free the interval tree here... */
1522 }
33f7013e 1523
2f3f993b
RS
1524 /* Reset the local variables, so that this buffer's local values
1525 won't be protected from GC. They would be protected
1526 if they happened to remain encached in their symbols.
1527 This gets rid of them for certain. */
1528 swap_out_buffer_local_variables (b);
13de9290 1529 reset_buffer_local_variables (b, 1);
2f3f993b 1530
1ab256cb 1531 b->name = Qnil;
336cd056 1532
9ac0d9e0 1533 BLOCK_INPUT;
336cd056 1534 if (! b->base_buffer)
b86af064 1535 free_buffer_text (b);
336cd056 1536
28e969dd
JB
1537 if (b->newline_cache)
1538 {
1539 free_region_cache (b->newline_cache);
1540 b->newline_cache = 0;
1541 }
1542 if (b->width_run_cache)
1543 {
1544 free_region_cache (b->width_run_cache);
1545 b->width_run_cache = 0;
1546 }
1547 b->width_table = Qnil;
9ac0d9e0 1548 UNBLOCK_INPUT;
1ab256cb
RM
1549 b->undo_list = Qnil;
1550
1551 return Qt;
1552}
1553\f
36a8c287
JB
1554/* Move the assoc for buffer BUF to the front of buffer-alist. Since
1555 we do this each time BUF is selected visibly, the more recently
1556 selected buffers are always closer to the front of the list. This
1557 means that other_buffer is more likely to choose a relevant buffer. */
1ab256cb 1558
01136e9b 1559void
1ab256cb
RM
1560record_buffer (buf)
1561 Lisp_Object buf;
1562{
1563 register Lisp_Object link, prev;
773fbdb9 1564 Lisp_Object frame;
9ba9623d 1565 frame = selected_frame;
1ab256cb
RM
1566
1567 prev = Qnil;
7539e11f 1568 for (link = Vbuffer_alist; CONSP (link); link = XCDR (link))
1ab256cb 1569 {
7539e11f 1570 if (EQ (XCDR (XCAR (link)), buf))
1ab256cb
RM
1571 break;
1572 prev = link;
1573 }
1574
36a8c287
JB
1575 /* Effectively do Vbuffer_alist = Fdelq (link, Vbuffer_alist);
1576 we cannot use Fdelq itself here because it allows quitting. */
1ab256cb 1577
265a9e55 1578 if (NILP (prev))
7539e11f 1579 Vbuffer_alist = XCDR (Vbuffer_alist);
1ab256cb 1580 else
f3fbd155 1581 XSETCDR (prev, XCDR (XCDR (prev)));
177c0ea7 1582
f3fbd155 1583 XSETCDR (link, Vbuffer_alist);
1ab256cb 1584 Vbuffer_alist = link;
7962a441
RS
1585
1586 /* Now move this buffer to the front of frame_buffer_list also. */
1587
1588 prev = Qnil;
773fbdb9 1589 for (link = frame_buffer_list (frame); CONSP (link);
7539e11f 1590 link = XCDR (link))
7962a441 1591 {
7539e11f 1592 if (EQ (XCAR (link), buf))
7962a441
RS
1593 break;
1594 prev = link;
1595 }
1596
1597 /* Effectively do delq. */
1598
1599 if (CONSP (link))
1600 {
1601 if (NILP (prev))
773fbdb9 1602 set_frame_buffer_list (frame,
7539e11f 1603 XCDR (frame_buffer_list (frame)));
7962a441 1604 else
f3fbd155 1605 XSETCDR (prev, XCDR (XCDR (prev)));
177c0ea7 1606
f3fbd155 1607 XSETCDR (link, frame_buffer_list (frame));
773fbdb9 1608 set_frame_buffer_list (frame, link);
7962a441
RS
1609 }
1610 else
773fbdb9 1611 set_frame_buffer_list (frame, Fcons (buf, frame_buffer_list (frame)));
1ab256cb
RM
1612}
1613
a9ee7a59 1614DEFUN ("set-buffer-major-mode", Fset_buffer_major_mode, Sset_buffer_major_mode, 1, 1, 0,
7ee72033 1615 doc: /* Set an appropriate major mode for BUFFER.
864b90c9 1616For the *scratch* buffer, use `initial-major-mode', otherwise choose a mode
71a0f2c6 1617according to `default-major-mode'.
018ba359 1618Use this function before selecting the buffer, since it may need to inspect
7ee72033
MB
1619the current buffer's major mode. */)
1620 (buffer)
a2428fa2 1621 Lisp_Object buffer;
a9ee7a59
KH
1622{
1623 int count;
1624 Lisp_Object function;
1625
ea4fddd8
JB
1626 CHECK_BUFFER (buffer);
1627
71a0f2c6 1628 if (STRINGP (XBUFFER (buffer)->name)
d5db4077 1629 && strcmp (SDATA (XBUFFER (buffer)->name), "*scratch*") == 0)
71a0f2c6
GM
1630 function = find_symbol_value (intern ("initial-major-mode"));
1631 else
1632 {
1633 function = buffer_defaults.major_mode;
1634 if (NILP (function)
1635 && NILP (Fget (current_buffer->major_mode, Qmode_class)))
1636 function = current_buffer->major_mode;
1637 }
177c0ea7 1638
48265e61
DL
1639 if (NILP (function) || EQ (function, Qfundamental_mode))
1640 return Qnil;
1641
aed13378 1642 count = SPECPDL_INDEX ();
a9ee7a59 1643
48265e61
DL
1644 /* To select a nonfundamental mode,
1645 select the buffer temporarily and then call the mode function. */
a9ee7a59
KH
1646
1647 record_unwind_protect (save_excursion_restore, save_excursion_save ());
1648
a2428fa2 1649 Fset_buffer (buffer);
48265e61 1650 call0 (function);
a9ee7a59
KH
1651
1652 return unbind_to (count, Qnil);
1653}
1654
2594e0fd
RS
1655/* If switching buffers in WINDOW would be an error, return
1656 a C string saying what the error would be. */
1657
1658char *
1659no_switch_window (window)
1660 Lisp_Object window;
1ab256cb 1661{
1ab256cb 1662 Lisp_Object tem;
2594e0fd
RS
1663 if (EQ (minibuf_window, window))
1664 return "Cannot switch buffers in minibuffer window";
1665 tem = Fwindow_dedicated_p (window);
c01d0677 1666 if (EQ (tem, Qt))
2594e0fd
RS
1667 return "Cannot switch buffers in a dedicated window";
1668 return NULL;
1669}
1670
1671/* Switch to buffer BUFFER in the selected window.
1672 If NORECORD is non-nil, don't call record_buffer. */
1673
1674Lisp_Object
1675switch_to_buffer_1 (buffer, norecord)
1676 Lisp_Object buffer, norecord;
1677{
1678 register Lisp_Object buf;
1ab256cb 1679
a25f13ae 1680 if (NILP (buffer))
773fbdb9 1681 buf = Fother_buffer (Fcurrent_buffer (), Qnil, Qnil);
1ab256cb 1682 else
a9ee7a59 1683 {
a25f13ae 1684 buf = Fget_buffer (buffer);
a9ee7a59
KH
1685 if (NILP (buf))
1686 {
a25f13ae 1687 buf = Fget_buffer_create (buffer);
a9ee7a59
KH
1688 Fset_buffer_major_mode (buf);
1689 }
1690 }
1ab256cb 1691 Fset_buffer (buf);
265a9e55 1692 if (NILP (norecord))
1ab256cb
RM
1693 record_buffer (buf);
1694
1695 Fset_window_buffer (EQ (selected_window, minibuf_window)
5fcd022d
JB
1696 ? Fnext_window (minibuf_window, Qnil, Qnil)
1697 : selected_window,
2ad8731a 1698 buf, Qnil);
1ab256cb 1699
cd0c235a 1700 return buf;
1ab256cb
RM
1701}
1702
2594e0fd 1703DEFUN ("switch-to-buffer", Fswitch_to_buffer, Sswitch_to_buffer, 1, 2, "BSwitch to buffer: ",
7ee72033 1704 doc: /* Select buffer BUFFER in the current window.
a6dced2a
LT
1705If BUFFER does not identify an existing buffer,
1706then this function creates a buffer with that name.
1707
1708When called from Lisp, BUFFER may be a buffer, a string \(a buffer name),
1709or nil. If BUFFER is nil, then this function chooses a buffer
1710using `other-buffer'.
018ba359
PJ
1711Optional second arg NORECORD non-nil means
1712do not put this buffer at the front of the list of recently selected ones.
a6dced2a 1713This function returns the buffer it switched to.
018ba359
PJ
1714
1715WARNING: This is NOT the way to work on another buffer temporarily
1716within a Lisp program! Use `set-buffer' instead. That avoids messing with
7ee72033
MB
1717the window-buffer correspondences. */)
1718 (buffer, norecord)
2594e0fd
RS
1719 Lisp_Object buffer, norecord;
1720{
1721 char *err;
1722
27c6b98e 1723 if (EQ (buffer, Fwindow_buffer (selected_window)))
fab45703 1724 {
611ac521
RS
1725 /* Basically a NOP. Avoid signalling an error in the case where
1726 the selected window is dedicated, or a minibuffer. */
1727
1728 /* But do put this buffer at the front of the buffer list,
1729 unless that has been inhibited. Note that even if
1730 BUFFER is at the front of the main buffer-list already,
1731 we still want to move it to the front of the frame's buffer list. */
1732 if (NILP (norecord))
fab45703 1733 record_buffer (buffer);
fab45703
NR
1734 return Fset_buffer (buffer);
1735 }
27c6b98e 1736
2594e0fd
RS
1737 err = no_switch_window (selected_window);
1738 if (err) error (err);
1739
1740 return switch_to_buffer_1 (buffer, norecord);
1741}
1742
cd0c235a 1743DEFUN ("pop-to-buffer", Fpop_to_buffer, Spop_to_buffer, 1, 3, 0,
7ee72033 1744 doc: /* Select buffer BUFFER in some window, preferably a different one.
a6dced2a
LT
1745BUFFER may be a buffer, a string \(a buffer name), or nil.
1746If BUFFER is a string which is not the name of an existing buffer,
1747then this function creates a buffer with that name.
1748If BUFFER is nil, then it chooses some other buffer.
018ba359 1749If `pop-up-windows' is non-nil, windows can be split to do this.
e198ba87 1750If optional second arg OTHER-WINDOW is non-nil, insist on finding another
ae47339f
RS
1751window even if BUFFER is already visible in the selected window,
1752and ignore `same-window-regexps' and `same-window-buffer-names'.
a6dced2a 1753This function returns the buffer it switched to.
018ba359
PJ
1754This uses the function `display-buffer' as a subroutine; see the documentation
1755of `display-buffer' for additional customization information.
1756
1757Optional third arg NORECORD non-nil means
7ee72033
MB
1758do not put this buffer at the front of the list of recently selected ones. */)
1759 (buffer, other_window, norecord)
6d12711f 1760 Lisp_Object buffer, other_window, norecord;
1ab256cb
RM
1761{
1762 register Lisp_Object buf;
a25f13ae 1763 if (NILP (buffer))
773fbdb9 1764 buf = Fother_buffer (Fcurrent_buffer (), Qnil, Qnil);
1ab256cb 1765 else
7c2087ee 1766 {
a25f13ae 1767 buf = Fget_buffer (buffer);
7c2087ee
RS
1768 if (NILP (buf))
1769 {
a25f13ae 1770 buf = Fget_buffer_create (buffer);
7c2087ee
RS
1771 Fset_buffer_major_mode (buf);
1772 }
1773 }
1ab256cb 1774 Fset_buffer (buf);
f1321dc3 1775 Fselect_window (Fdisplay_buffer (buf, other_window, Qnil), norecord);
e8b3a22d 1776 return buf;
1ab256cb
RM
1777}
1778
1779DEFUN ("current-buffer", Fcurrent_buffer, Scurrent_buffer, 0, 0, 0,
7ee72033
MB
1780 doc: /* Return the current buffer as a Lisp object. */)
1781 ()
1ab256cb
RM
1782{
1783 register Lisp_Object buf;
67180c6a 1784 XSETBUFFER (buf, current_buffer);
1ab256cb
RM
1785 return buf;
1786}
1787\f
7ec44ec6
GM
1788/* Set the current buffer to B.
1789
1790 We previously set windows_or_buffers_changed here to invalidate
1791 global unchanged information in beg_unchanged and end_unchanged.
1792 This is no longer necessary because we now compute unchanged
1793 information on a buffer-basis. Every action affecting other
1794 windows than the selected one requires a select_window at some
1795 time, and that increments windows_or_buffers_changed. */
1ab256cb
RM
1796
1797void
1798set_buffer_internal (b)
1799 register struct buffer *b;
1800{
b5a225b4 1801 if (current_buffer != b)
7ec44ec6 1802 set_buffer_internal_1 (b);
c7aa5005
KH
1803}
1804
1805/* Set the current buffer to B, and do not set windows_or_buffers_changed.
1806 This is used by redisplay. */
1807
1808void
1809set_buffer_internal_1 (b)
1810 register struct buffer *b;
1811{
1812 register struct buffer *old_buf;
1813 register Lisp_Object tail, valcontents;
1814 Lisp_Object tem;
1815
b86af064 1816#ifdef USE_MMAP_FOR_BUFFERS
684b01ee 1817 if (b->text->beg == NULL)
b86af064
GM
1818 enlarge_buffer_text (b, 0);
1819#endif /* USE_MMAP_FOR_BUFFERS */
177c0ea7 1820
c7aa5005
KH
1821 if (current_buffer == b)
1822 return;
1823
1ab256cb
RM
1824 old_buf = current_buffer;
1825 current_buffer = b;
1826 last_known_column_point = -1; /* invalidate indentation cache */
1827
336cd056
RS
1828 if (old_buf)
1829 {
1830 /* Put the undo list back in the base buffer, so that it appears
1831 that an indirect buffer shares the undo list of its base. */
1832 if (old_buf->base_buffer)
1833 old_buf->base_buffer->undo_list = old_buf->undo_list;
1834
1835 /* If the old current buffer has markers to record PT, BEGV and ZV
1836 when it is not current, update them now. */
1837 if (! NILP (old_buf->pt_marker))
1838 {
1839 Lisp_Object obuf;
1840 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1841 set_marker_both (old_buf->pt_marker, obuf,
1842 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
336cd056
RS
1843 }
1844 if (! NILP (old_buf->begv_marker))
1845 {
1846 Lisp_Object obuf;
1847 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1848 set_marker_both (old_buf->begv_marker, obuf,
1849 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
336cd056
RS
1850 }
1851 if (! NILP (old_buf->zv_marker))
1852 {
1853 Lisp_Object obuf;
1854 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1855 set_marker_both (old_buf->zv_marker, obuf,
1856 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
336cd056
RS
1857 }
1858 }
1859
1860 /* Get the undo list from the base buffer, so that it appears
1861 that an indirect buffer shares the undo list of its base. */
1862 if (b->base_buffer)
1863 b->undo_list = b->base_buffer->undo_list;
1864
1865 /* If the new current buffer has markers to record PT, BEGV and ZV
1866 when it is not current, fetch them now. */
1867 if (! NILP (b->pt_marker))
3f236a40
RS
1868 {
1869 BUF_PT (b) = marker_position (b->pt_marker);
1870 BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker);
1871 }
336cd056 1872 if (! NILP (b->begv_marker))
3f236a40
RS
1873 {
1874 BUF_BEGV (b) = marker_position (b->begv_marker);
1875 BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker);
1876 }
336cd056 1877 if (! NILP (b->zv_marker))
3f236a40
RS
1878 {
1879 BUF_ZV (b) = marker_position (b->zv_marker);
1880 BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker);
1881 }
336cd056 1882
1ab256cb
RM
1883 /* Look down buffer's list of local Lisp variables
1884 to find and update any that forward into C variables. */
1885
65745fad 1886 for (tail = b->local_var_alist; CONSP (tail); tail = XCDR (tail))
1ab256cb 1887 {
f5c1dd0d 1888 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail)));
a7a60ce9
KH
1889 if ((BUFFER_LOCAL_VALUEP (valcontents)
1890 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
3d871c85 1891 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
a7a60ce9 1892 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1ab256cb
RM
1893 /* Just reference the variable
1894 to cause it to become set for this buffer. */
7539e11f 1895 Fsymbol_value (XCAR (XCAR (tail)));
1ab256cb
RM
1896 }
1897
1898 /* Do the same with any others that were local to the previous buffer */
1899
1900 if (old_buf)
65745fad 1901 for (tail = old_buf->local_var_alist; CONSP (tail); tail = XCDR (tail))
1ab256cb 1902 {
f5c1dd0d 1903 valcontents = SYMBOL_VALUE (XCAR (XCAR (tail)));
a7a60ce9
KH
1904 if ((BUFFER_LOCAL_VALUEP (valcontents)
1905 || SOME_BUFFER_LOCAL_VALUEP (valcontents))
3d871c85 1906 && (tem = XBUFFER_LOCAL_VALUE (valcontents)->realvalue,
a7a60ce9 1907 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1ab256cb
RM
1908 /* Just reference the variable
1909 to cause it to become set for this buffer. */
7539e11f 1910 Fsymbol_value (XCAR (XCAR (tail)));
1ab256cb
RM
1911 }
1912}
1913
336cd056 1914/* Switch to buffer B temporarily for redisplay purposes.
bbbe9545 1915 This avoids certain things that don't need to be done within redisplay. */
336cd056
RS
1916
1917void
1918set_buffer_temp (b)
1919 struct buffer *b;
1920{
1921 register struct buffer *old_buf;
1922
1923 if (current_buffer == b)
1924 return;
1925
1926 old_buf = current_buffer;
1927 current_buffer = b;
1928
1929 if (old_buf)
1930 {
1931 /* If the old current buffer has markers to record PT, BEGV and ZV
1932 when it is not current, update them now. */
1933 if (! NILP (old_buf->pt_marker))
1934 {
1935 Lisp_Object obuf;
1936 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1937 set_marker_both (old_buf->pt_marker, obuf,
1938 BUF_PT (old_buf), BUF_PT_BYTE (old_buf));
336cd056
RS
1939 }
1940 if (! NILP (old_buf->begv_marker))
1941 {
1942 Lisp_Object obuf;
1943 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1944 set_marker_both (old_buf->begv_marker, obuf,
1945 BUF_BEGV (old_buf), BUF_BEGV_BYTE (old_buf));
336cd056
RS
1946 }
1947 if (! NILP (old_buf->zv_marker))
1948 {
1949 Lisp_Object obuf;
1950 XSETBUFFER (obuf, old_buf);
3f236a40
RS
1951 set_marker_both (old_buf->zv_marker, obuf,
1952 BUF_ZV (old_buf), BUF_ZV_BYTE (old_buf));
336cd056
RS
1953 }
1954 }
1955
1956 /* If the new current buffer has markers to record PT, BEGV and ZV
1957 when it is not current, fetch them now. */
1958 if (! NILP (b->pt_marker))
3f236a40
RS
1959 {
1960 BUF_PT (b) = marker_position (b->pt_marker);
1961 BUF_PT_BYTE (b) = marker_byte_position (b->pt_marker);
1962 }
336cd056 1963 if (! NILP (b->begv_marker))
3f236a40
RS
1964 {
1965 BUF_BEGV (b) = marker_position (b->begv_marker);
1966 BUF_BEGV_BYTE (b) = marker_byte_position (b->begv_marker);
1967 }
336cd056 1968 if (! NILP (b->zv_marker))
3f236a40
RS
1969 {
1970 BUF_ZV (b) = marker_position (b->zv_marker);
1971 BUF_ZV_BYTE (b) = marker_byte_position (b->zv_marker);
1972 }
336cd056
RS
1973}
1974
1ab256cb 1975DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
7ee72033 1976 doc: /* Make the buffer BUFFER current for editing operations.
018ba359
PJ
1977BUFFER may be a buffer or the name of an existing buffer.
1978See also `save-excursion' when you want to make a buffer current temporarily.
1979This function does not display the buffer, so its effect ends
1980when the current command terminates.
7ee72033
MB
1981Use `switch-to-buffer' or `pop-to-buffer' to switch buffers permanently. */)
1982 (buffer)
a25f13ae 1983 register Lisp_Object buffer;
1ab256cb 1984{
a25f13ae
KH
1985 register Lisp_Object buf;
1986 buf = Fget_buffer (buffer);
1987 if (NILP (buf))
1988 nsberror (buffer);
1989 if (NILP (XBUFFER (buf)->name))
1ab256cb 1990 error ("Selecting deleted buffer");
a25f13ae
KH
1991 set_buffer_internal (XBUFFER (buf));
1992 return buf;
1ab256cb 1993}
d0628b06
RS
1994
1995/* Set the current buffer to BUFFER provided it is alive. */
1996
1997Lisp_Object
1998set_buffer_if_live (buffer)
1999 Lisp_Object buffer;
2000{
2001 if (! NILP (XBUFFER (buffer)->name))
2002 Fset_buffer (buffer);
2003 return Qnil;
2004}
1ab256cb
RM
2005\f
2006DEFUN ("barf-if-buffer-read-only", Fbarf_if_buffer_read_only,
2007 Sbarf_if_buffer_read_only, 0, 0, 0,
7ee72033
MB
2008 doc: /* Signal a `buffer-read-only' error if the current buffer is read-only. */)
2009 ()
1ab256cb 2010{
a96b68f1
RS
2011 if (!NILP (current_buffer->read_only)
2012 && NILP (Vinhibit_read_only))
4c4dc0b0 2013 xsignal1 (Qbuffer_read_only, Fcurrent_buffer ());
1ab256cb
RM
2014 return Qnil;
2015}
2016
2017DEFUN ("bury-buffer", Fbury_buffer, Sbury_buffer, 0, 1, "",
7ee72033 2018 doc: /* Put BUFFER at the end of the list of all buffers.
018ba359
PJ
2019There it is the least likely candidate for `other-buffer' to return;
2020thus, the least likely buffer for \\[switch-to-buffer] to select by default.
39971188 2021You can specify a buffer name as BUFFER, or an actual buffer object.
018ba359
PJ
2022If BUFFER is nil or omitted, bury the current buffer.
2023Also, if BUFFER is nil or omitted, remove the current buffer from the
7ee72033
MB
2024selected window if it is displayed there. */)
2025 (buffer)
a2428fa2 2026 register Lisp_Object buffer;
1ab256cb 2027{
b271272a 2028 /* Figure out what buffer we're going to bury. */
a2428fa2 2029 if (NILP (buffer))
a5611885 2030 {
c58dab63 2031 Lisp_Object tem;
a2428fa2 2032 XSETBUFFER (buffer, current_buffer);
0a63b212 2033
c58dab63 2034 tem = Fwindow_buffer (selected_window);
0a63b212 2035 /* If we're burying the current buffer, unshow it. */
c58dab63 2036 if (EQ (buffer, tem))
a78e0303
PJ
2037 {
2038 if (NILP (Fwindow_dedicated_p (selected_window)))
2039 Fswitch_to_buffer (Fother_buffer (buffer, Qnil, Qnil), Qnil);
2040 else if (NILP (XWINDOW (selected_window)->parent))
2041 Ficonify_frame (Fwindow_frame (selected_window));
2042 else
2043 Fdelete_window (selected_window);
2044 }
a5611885 2045 }
1ab256cb
RM
2046 else
2047 {
2048 Lisp_Object buf1;
177c0ea7 2049
a2428fa2 2050 buf1 = Fget_buffer (buffer);
265a9e55 2051 if (NILP (buf1))
a2428fa2
EN
2052 nsberror (buffer);
2053 buffer = buf1;
b271272a
JB
2054 }
2055
a1a8b28e
GM
2056 /* Move buffer to the end of the buffer list. Do nothing if the
2057 buffer is killed. */
2058 if (!NILP (XBUFFER (buffer)->name))
2059 {
2060 Lisp_Object aelt, link;
b271272a 2061
a1a8b28e
GM
2062 aelt = Frassq (buffer, Vbuffer_alist);
2063 link = Fmemq (aelt, Vbuffer_alist);
2064 Vbuffer_alist = Fdelq (aelt, Vbuffer_alist);
f3fbd155 2065 XSETCDR (link, Qnil);
a1a8b28e 2066 Vbuffer_alist = nconc2 (Vbuffer_alist, link);
1ab256cb 2067
6c488ddb
RS
2068 /* Removing BUFFER from frame-specific lists
2069 has the effect of putting BUFFER at the end
2070 of the combined list in each frame. */
2071 frames_discard_buffer (buffer);
a1a8b28e 2072 }
dec989eb 2073
1ab256cb
RM
2074 return Qnil;
2075}
2076\f
c922bc55 2077DEFUN ("erase-buffer", Ferase_buffer, Serase_buffer, 0, 0, "*",
7ee72033 2078 doc: /* Delete the entire contents of the current buffer.
018ba359 2079Any narrowing restriction in effect (see `narrow-to-region') is removed,
7ee72033
MB
2080so the buffer is truly empty after this. */)
2081 ()
1ab256cb
RM
2082{
2083 Fwiden ();
c0d9a0c3
GM
2084
2085 del_range (BEG, Z);
c280bc6a 2086
1ab256cb
RM
2087 current_buffer->last_window_start = 1;
2088 /* Prevent warnings, or suspension of auto saving, that would happen
2089 if future size is less than past size. Use of erase-buffer
2090 implies that the future text is not really related to the past text. */
8d7a4592 2091 XSETFASTINT (current_buffer->save_length, 0);
1ab256cb
RM
2092 return Qnil;
2093}
2094
01136e9b 2095void
1ab256cb
RM
2096validate_region (b, e)
2097 register Lisp_Object *b, *e;
2098{
b7826503
PJ
2099 CHECK_NUMBER_COERCE_MARKER (*b);
2100 CHECK_NUMBER_COERCE_MARKER (*e);
1ab256cb
RM
2101
2102 if (XINT (*b) > XINT (*e))
2103 {
03192067
KH
2104 Lisp_Object tem;
2105 tem = *b; *b = *e; *e = tem;
1ab256cb
RM
2106 }
2107
2108 if (!(BEGV <= XINT (*b) && XINT (*b) <= XINT (*e)
2109 && XINT (*e) <= ZV))
2110 args_out_of_range (*b, *e);
2111}
2112\f
b05525fa
RS
2113/* Advance BYTE_POS up to a character boundary
2114 and return the adjusted position. */
2115
2116static int
2117advance_to_char_boundary (byte_pos)
2118 int byte_pos;
2119{
f8449323 2120 int c;
b05525fa 2121
f8449323
RS
2122 if (byte_pos == BEG)
2123 /* Beginning of buffer is always a character boundary. */
6d70a280 2124 return BEG;
f8449323
RS
2125
2126 c = FETCH_BYTE (byte_pos);
2127 if (! CHAR_HEAD_P (c))
b05525fa 2128 {
1be6387d 2129 /* We should advance BYTE_POS only when C is a constituent of a
f8449323 2130 multibyte sequence. */
a9bcded1
KH
2131 int orig_byte_pos = byte_pos;
2132
2133 do
2134 {
2135 byte_pos--;
2136 c = FETCH_BYTE (byte_pos);
2137 }
2138 while (! CHAR_HEAD_P (c) && byte_pos > BEG);
f8449323 2139 INC_POS (byte_pos);
a9bcded1
KH
2140 if (byte_pos < orig_byte_pos)
2141 byte_pos = orig_byte_pos;
f8449323
RS
2142 /* If C is a constituent of a multibyte sequence, BYTE_POS was
2143 surely advance to the correct character boundary. If C is
2144 not, BYTE_POS was unchanged. */
b05525fa
RS
2145 }
2146
20773569 2147 return byte_pos;
b05525fa
RS
2148}
2149
3ac81adb
RS
2150DEFUN ("set-buffer-multibyte", Fset_buffer_multibyte, Sset_buffer_multibyte,
2151 1, 1, 0,
7ee72033 2152 doc: /* Set the multibyte flag of the current buffer to FLAG.
018ba359
PJ
2153If FLAG is t, this makes the buffer a multibyte buffer.
2154If FLAG is nil, this makes the buffer a single-byte buffer.
2155The buffer contents remain unchanged as a sequence of bytes
fc1d15f6
KH
2156but the contents viewed as characters do change.
2157If the multibyte flag was really changed, undo information of the
2158current buffer is cleared. */)
7ee72033 2159 (flag)
3ac81adb
RS
2160 Lisp_Object flag;
2161{
65745fad 2162 struct Lisp_Marker *tail, *markers;
abc9d959 2163 struct buffer *other;
458c8af4 2164 int begv, zv;
8d1203ea 2165 int narrowed = (BEG != BEGV || Z != ZV);
ed00559d 2166 int modified_p = !NILP (Fbuffer_modified_p (Qnil));
38babc07
KS
2167 Lisp_Object old_undo = current_buffer->undo_list;
2168 struct gcpro gcpro1;
3ac81adb 2169
6e553d5e
RS
2170 if (current_buffer->base_buffer)
2171 error ("Cannot do `set-buffer-multibyte' on an indirect buffer");
2172
70e77119
AS
2173 /* Do nothing if nothing actually changes. */
2174 if (NILP (flag) == NILP (current_buffer->enable_multibyte_characters))
2175 return flag;
2176
38babc07
KS
2177 GCPRO1 (old_undo);
2178
2179 /* Don't record these buffer changes. We will put a special undo entry
2180 instead. */
2181 current_buffer->undo_list = Qt;
b05525fa 2182
3ac81adb
RS
2183 /* If the cached position is for this buffer, clear it out. */
2184 clear_charpos_cache (current_buffer);
2185
458c8af4
KH
2186 if (NILP (flag))
2187 begv = BEGV_BYTE, zv = ZV_BYTE;
2188 else
2189 begv = BEGV, zv = ZV;
2190
a9bcded1
KH
2191 if (narrowed)
2192 Fwiden ();
2193
3ac81adb
RS
2194 if (NILP (flag))
2195 {
a9bcded1
KH
2196 int pos, stop;
2197 unsigned char *p;
2198
3ac81adb
RS
2199 /* Do this first, so it can use CHAR_TO_BYTE
2200 to calculate the old correspondences. */
2201 set_intervals_multibyte (0);
2202
2203 current_buffer->enable_multibyte_characters = Qnil;
2204
2205 Z = Z_BYTE;
2206 BEGV = BEGV_BYTE;
2207 ZV = ZV_BYTE;
2208 GPT = GPT_BYTE;
2209 TEMP_SET_PT_BOTH (PT_BYTE, PT_BYTE);
2210
60ebfdf3 2211
65745fad
SM
2212 for (tail = BUF_MARKERS (current_buffer); tail; tail = tail->next)
2213 tail->charpos = tail->bytepos;
a9bcded1
KH
2214
2215 /* Convert multibyte form of 8-bit characters to unibyte. */
2216 pos = BEG;
2217 stop = GPT;
2218 p = BEG_ADDR;
2219 while (1)
2220 {
2221 int c, bytes;
2222
2223 if (pos == stop)
2224 {
2225 if (pos == Z)
2226 break;
2227 p = GAP_END_ADDR;
2228 stop = Z;
2229 }
2230 if (MULTIBYTE_STR_AS_UNIBYTE_P (p, bytes))
2231 p += bytes, pos += bytes;
2232 else
2233 {
2234 c = STRING_CHAR (p, stop - pos);
2235 /* Delete all bytes for this 8-bit character but the
2236 last one, and change the last one to the charcter
2237 code. */
2238 bytes--;
2239 del_range_2 (pos, pos, pos + bytes, pos + bytes, 0);
2240 p = GAP_END_ADDR;
2241 *p++ = c;
2242 pos++;
2243 if (begv > pos)
2244 begv -= bytes;
2245 if (zv > pos)
2246 zv -= bytes;
2247 stop = Z;
2248 }
2249 }
2250 if (narrowed)
2251 Fnarrow_to_region (make_number (begv), make_number (zv));
3ac81adb
RS
2252 }
2253 else
2254 {
a9bcded1
KH
2255 int pt = PT;
2256 int pos, stop;
2257 unsigned char *p;
2258
673c57d2 2259 /* Be sure not to have a multibyte sequence striding over the GAP.
a9bcded1
KH
2260 Ex: We change this: "...abc\201 _GAP_ \241def..."
2261 to: "...abc _GAP_ \201\241def..." */
673c57d2
KH
2262
2263 if (GPT_BYTE > 1 && GPT_BYTE < Z_BYTE
2264 && ! CHAR_HEAD_P (*(GAP_END_ADDR)))
2265 {
2266 unsigned char *p = GPT_ADDR - 1;
2267
2268 while (! CHAR_HEAD_P (*p) && p > BEG_ADDR) p--;
2269 if (BASE_LEADING_CODE_P (*p))
2270 {
2271 int new_gpt = GPT_BYTE - (GPT_ADDR - p);
2272
2273 move_gap_both (new_gpt, new_gpt);
2274 }
2275 }
2276
a9bcded1
KH
2277 /* Make the buffer contents valid as multibyte by converting
2278 8-bit characters to multibyte form. */
2279 pos = BEG;
2280 stop = GPT;
2281 p = BEG_ADDR;
2282 while (1)
2283 {
2284 int bytes;
2285
2286 if (pos == stop)
2287 {
2288 if (pos == Z)
2289 break;
2290 p = GAP_END_ADDR;
2291 stop = Z;
2292 }
177c0ea7 2293
a9bcded1
KH
2294 if (UNIBYTE_STR_AS_MULTIBYTE_P (p, stop - pos, bytes))
2295 p += bytes, pos += bytes;
2296 else
2297 {
2298 unsigned char tmp[MAX_MULTIBYTE_LENGTH];
2299
2300 bytes = CHAR_STRING (*p, tmp);
2301 *p = tmp[0];
2302 TEMP_SET_PT_BOTH (pos + 1, pos + 1);
2303 bytes--;
2304 insert_1_both (tmp + 1, bytes, bytes, 1, 0, 0);
2305 /* Now the gap is after the just inserted data. */
2306 pos = GPT;
2307 p = GAP_END_ADDR;
2308 if (pos <= begv)
2309 begv += bytes;
2310 if (pos <= zv)
2311 zv += bytes;
2312 if (pos <= pt)
2313 pt += bytes;
2314 stop = Z;
2315 }
2316 }
2317
2318 if (pt != PT)
2319 TEMP_SET_PT (pt);
2320
2321 if (narrowed)
2322 Fnarrow_to_region (make_number (begv), make_number (zv));
2323
3ac81adb
RS
2324 /* Do this first, so that chars_in_text asks the right question.
2325 set_intervals_multibyte needs it too. */
2326 current_buffer->enable_multibyte_characters = Qt;
2327
b05525fa 2328 GPT_BYTE = advance_to_char_boundary (GPT_BYTE);
3ac81adb 2329 GPT = chars_in_text (BEG_ADDR, GPT_BYTE - BEG_BYTE) + BEG;
b05525fa 2330
673c57d2 2331 Z = chars_in_text (GAP_END_ADDR, Z_BYTE - GPT_BYTE) + GPT;
b05525fa
RS
2332
2333 BEGV_BYTE = advance_to_char_boundary (BEGV_BYTE);
3ac81adb 2334 if (BEGV_BYTE > GPT_BYTE)
673c57d2 2335 BEGV = chars_in_text (GAP_END_ADDR, BEGV_BYTE - GPT_BYTE) + GPT;
3ac81adb
RS
2336 else
2337 BEGV = chars_in_text (BEG_ADDR, BEGV_BYTE - BEG_BYTE) + BEG;
b05525fa
RS
2338
2339 ZV_BYTE = advance_to_char_boundary (ZV_BYTE);
3ac81adb 2340 if (ZV_BYTE > GPT_BYTE)
673c57d2 2341 ZV = chars_in_text (GAP_END_ADDR, ZV_BYTE - GPT_BYTE) + GPT;
3ac81adb
RS
2342 else
2343 ZV = chars_in_text (BEG_ADDR, ZV_BYTE - BEG_BYTE) + BEG;
b05525fa
RS
2344
2345 {
2346 int pt_byte = advance_to_char_boundary (PT_BYTE);
2347 int pt;
2348
2349 if (pt_byte > GPT_BYTE)
673c57d2 2350 pt = chars_in_text (GAP_END_ADDR, pt_byte - GPT_BYTE) + GPT;
b05525fa
RS
2351 else
2352 pt = chars_in_text (BEG_ADDR, pt_byte - BEG_BYTE) + BEG;
2353 TEMP_SET_PT_BOTH (pt, pt_byte);
2354 }
3ac81adb
RS
2355
2356 tail = markers = BUF_MARKERS (current_buffer);
95fb069b
RS
2357
2358 /* This prevents BYTE_TO_CHAR (that is, buf_bytepos_to_charpos) from
2359 getting confused by the markers that have not yet been updated.
2360 It is also a signal that it should never create a marker. */
65745fad 2361 BUF_MARKERS (current_buffer) = NULL;
3ac81adb 2362
65745fad 2363 for (; tail; tail = tail->next)
3ac81adb 2364 {
65745fad
SM
2365 tail->bytepos = advance_to_char_boundary (tail->bytepos);
2366 tail->charpos = BYTE_TO_CHAR (tail->bytepos);
3ac81adb 2367 }
b69f9797
RS
2368
2369 /* Make sure no markers were put on the chain
2370 while the chain value was incorrect. */
65745fad 2371 if (BUF_MARKERS (current_buffer))
b69f9797
RS
2372 abort ();
2373
3ac81adb
RS
2374 BUF_MARKERS (current_buffer) = markers;
2375
2376 /* Do this last, so it can calculate the new correspondences
2377 between chars and bytes. */
2378 set_intervals_multibyte (1);
2379 }
2380
38babc07
KS
2381 if (!EQ (old_undo, Qt))
2382 {
2383 /* Represent all the above changes by a special undo entry. */
2384 extern Lisp_Object Qapply;
8929fd87
KS
2385 current_buffer->undo_list = Fcons (list3 (Qapply,
2386 intern ("set-buffer-multibyte"),
2387 NILP (flag) ? Qt : Qnil),
2388 old_undo);
38babc07
KS
2389 }
2390
2391 UNGCPRO;
a9bcded1 2392
724b203f
GM
2393 /* Changing the multibyteness of a buffer means that all windows
2394 showing that buffer must be updated thoroughly. */
2395 current_buffer->prevent_redisplay_optimizations_p = 1;
2396 ++windows_or_buffers_changed;
2397
abc9d959
RS
2398 /* Copy this buffer's new multibyte status
2399 into all of its indirect buffers. */
2400 for (other = all_buffers; other; other = other->next)
2401 if (other->base_buffer == current_buffer && !NILP (other->name))
724b203f
GM
2402 {
2403 other->enable_multibyte_characters
2404 = current_buffer->enable_multibyte_characters;
2405 other->prevent_redisplay_optimizations_p = 1;
2406 }
abc9d959 2407
ed00559d
KH
2408 /* Restore the modifiedness of the buffer. */
2409 if (!modified_p && !NILP (Fbuffer_modified_p (Qnil)))
2410 Fset_buffer_modified_p (Qnil);
2411
2a2b50a9 2412#ifdef subprocesses
172f9454
KH
2413 /* Update coding systems of this buffer's process (if any). */
2414 {
2415 Lisp_Object process;
2416
2417 process = Fget_buffer_process (Fcurrent_buffer ());
2418 if (PROCESSP (process))
2419 setup_process_coding_systems (process);
2420 }
2a2b50a9 2421#endif /* subprocesses */
172f9454 2422
3ac81adb
RS
2423 return flag;
2424}
2425\f
1ab256cb 2426DEFUN ("kill-all-local-variables", Fkill_all_local_variables, Skill_all_local_variables,
efc7e75f 2427 0, 0, 0,
7ee72033 2428 doc: /* Switch to Fundamental mode by killing current buffer's local variables.
018ba359
PJ
2429Most local variable bindings are eliminated so that the default values
2430become effective once more. Also, the syntax table is set from
2431`standard-syntax-table', the local keymap is set to nil,
2432and the abbrev table from `fundamental-mode-abbrev-table'.
2433This function also forces redisplay of the mode line.
2434
2435Every function to select a new major mode starts by
2436calling this function.
2437
2438As a special exception, local variables whose names have
2439a non-nil `permanent-local' property are not eliminated by this function.
2440
2441The first thing this function does is run
7ee72033
MB
2442the normal hook `change-major-mode-hook'. */)
2443 ()
1ab256cb
RM
2444{
2445 register Lisp_Object alist, sym, tem;
2446 Lisp_Object oalist;
7410477a 2447
fd186f07 2448 if (!NILP (Vrun_hooks))
43ed3b8d 2449 call1 (Vrun_hooks, Qchange_major_mode_hook);
1ab256cb
RM
2450 oalist = current_buffer->local_var_alist;
2451
2f3f993b
RS
2452 /* Make sure none of the bindings in oalist
2453 remain swapped in, in their symbols. */
1ab256cb 2454
2f3f993b 2455 swap_out_buffer_local_variables (current_buffer);
1ab256cb
RM
2456
2457 /* Actually eliminate all local bindings of this buffer. */
2458
13de9290 2459 reset_buffer_local_variables (current_buffer, 0);
1ab256cb 2460
1ab256cb
RM
2461 /* Any which are supposed to be permanent,
2462 make local again, with the same values they had. */
177c0ea7 2463
7539e11f 2464 for (alist = oalist; !NILP (alist); alist = XCDR (alist))
1ab256cb 2465 {
7539e11f 2466 sym = XCAR (XCAR (alist));
1ab256cb 2467 tem = Fget (sym, Qpermanent_local);
265a9e55 2468 if (! NILP (tem))
01050cb5
RM
2469 {
2470 Fmake_local_variable (sym);
7539e11f 2471 Fset (sym, XCDR (XCAR (alist)));
01050cb5 2472 }
1ab256cb
RM
2473 }
2474
2475 /* Force mode-line redisplay. Useful here because all major mode
2476 commands call this function. */
2477 update_mode_lines++;
2478
2479 return Qnil;
2480}
2f3f993b
RS
2481
2482/* Make sure no local variables remain set up with buffer B
2483 for their current values. */
2484
2485static void
2486swap_out_buffer_local_variables (b)
2487 struct buffer *b;
2488{
2489 Lisp_Object oalist, alist, sym, tem, buffer;
2490
2491 XSETBUFFER (buffer, b);
2492 oalist = b->local_var_alist;
2493
7539e11f 2494 for (alist = oalist; !NILP (alist); alist = XCDR (alist))
2f3f993b 2495 {
7539e11f 2496 sym = XCAR (XCAR (alist));
2f3f993b
RS
2497
2498 /* Need not do anything if some other buffer's binding is now encached. */
f5c1dd0d 2499 tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer;
8801a864 2500 if (BUFFERP (tem) && XBUFFER (tem) == current_buffer)
2f3f993b
RS
2501 {
2502 /* Symbol is set up for this buffer's old local value.
2503 Set it up for the current buffer with the default value. */
2504
f5c1dd0d 2505 tem = XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->cdr;
2f3f993b
RS
2506 /* Store the symbol's current value into the alist entry
2507 it is currently set up for. This is so that, if the
2508 local is marked permanent, and we make it local again
2509 later in Fkill_all_local_variables, we don't lose the value. */
f3fbd155
KR
2510 XSETCDR (XCAR (tem),
2511 do_symval_forwarding (XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue));
2f3f993b 2512 /* Switch to the symbol's default-value alist entry. */
f3fbd155 2513 XSETCAR (tem, tem);
2f3f993b 2514 /* Mark it as current for buffer B. */
f5c1dd0d 2515 XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->buffer = buffer;
2f3f993b 2516 /* Store the current value into any forwarding in the symbol. */
3d871c85 2517 store_symval_forwarding (sym,
f5c1dd0d 2518 XBUFFER_LOCAL_VALUE (SYMBOL_VALUE (sym))->realvalue,
9b3a7dad 2519 XCDR (tem), NULL);
2f3f993b
RS
2520 }
2521 }
2522}
1ab256cb 2523\f
2eec3b4e 2524/* Find all the overlays in the current buffer that contain position POS.
177c0ea7 2525 Return the number found, and store them in a vector in *VEC_PTR.
2eec3b4e 2526 Store in *LEN_PTR the size allocated for the vector.
52f8ec73 2527 Store in *NEXT_PTR the next position after POS where an overlay starts,
624d2678 2528 or ZV if there are no more overlays between POS and ZV.
bbbe9545 2529 Store in *PREV_PTR the previous position before POS where an overlay ends,
413e06a4 2530 or where an overlay starts which ends at or after POS;
624d2678 2531 or BEGV if there are no such overlays from BEGV to POS.
239c932b 2532 NEXT_PTR and/or PREV_PTR may be 0, meaning don't store that info.
2eec3b4e
RS
2533
2534 *VEC_PTR and *LEN_PTR should contain a valid vector and size
61d54cd5
RS
2535 when this function is called.
2536
2537 If EXTEND is non-zero, we make the vector bigger if necessary.
2538 If EXTEND is zero, we never extend the vector,
2539 and we store only as many overlays as will fit.
ac869cf7
MB
2540 But we still return the total number of overlays.
2541
2542 If CHANGE_REQ is true, then any position written into *PREV_PTR or
2543 *NEXT_PTR is guaranteed to be not equal to POS, unless it is the
2544 default (BEGV or ZV). */
2eec3b4e
RS
2545
2546int
ac869cf7 2547overlays_at (pos, extend, vec_ptr, len_ptr, next_ptr, prev_ptr, change_req)
c2d5b10f 2548 EMACS_INT pos;
61d54cd5 2549 int extend;
2eec3b4e
RS
2550 Lisp_Object **vec_ptr;
2551 int *len_ptr;
2552 int *next_ptr;
239c932b 2553 int *prev_ptr;
ac869cf7 2554 int change_req;
1ab256cb 2555{
2410d73a
SM
2556 Lisp_Object overlay, start, end;
2557 struct Lisp_Overlay *tail;
2eec3b4e
RS
2558 int idx = 0;
2559 int len = *len_ptr;
2560 Lisp_Object *vec = *vec_ptr;
2561 int next = ZV;
239c932b 2562 int prev = BEGV;
61d54cd5
RS
2563 int inhibit_storing = 0;
2564
2410d73a 2565 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
2eec3b4e 2566 {
239c932b 2567 int startpos, endpos;
52f8ec73 2568
2410d73a 2569 XSETMISC (overlay, tail);
1ab256cb 2570
2eec3b4e
RS
2571 start = OVERLAY_START (overlay);
2572 end = OVERLAY_END (overlay);
239c932b
RS
2573 endpos = OVERLAY_POSITION (end);
2574 if (endpos < pos)
2575 {
2576 if (prev < endpos)
2577 prev = endpos;
2578 break;
2579 }
413e06a4
RS
2580 startpos = OVERLAY_POSITION (start);
2581 /* This one ends at or after POS
daa1c109 2582 so its start counts for PREV_PTR if it's before POS. */
413e06a4
RS
2583 if (prev < startpos && startpos < pos)
2584 prev = startpos;
239c932b
RS
2585 if (endpos == pos)
2586 continue;
2eec3b4e
RS
2587 if (startpos <= pos)
2588 {
2589 if (idx == len)
2590 {
61d54cd5
RS
2591 /* The supplied vector is full.
2592 Either make it bigger, or don't store any more in it. */
2593 if (extend)
2594 {
0552666b
GM
2595 /* Make it work with an initial len == 0. */
2596 len *= 2;
2597 if (len == 0)
2598 len = 4;
2599 *len_ptr = len;
61d54cd5
RS
2600 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
2601 *vec_ptr = vec;
2602 }
2603 else
2604 inhibit_storing = 1;
2eec3b4e 2605 }
61d54cd5
RS
2606
2607 if (!inhibit_storing)
2608 vec[idx] = overlay;
2609 /* Keep counting overlays even if we can't return them all. */
2610 idx++;
2eec3b4e
RS
2611 }
2612 else if (startpos < next)
2613 next = startpos;
2614 }
2615
2410d73a 2616 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
1ab256cb 2617 {
239c932b 2618 int startpos, endpos;
52f8ec73 2619
2410d73a 2620 XSETMISC (overlay, tail);
2eec3b4e
RS
2621
2622 start = OVERLAY_START (overlay);
2623 end = OVERLAY_END (overlay);
2624 startpos = OVERLAY_POSITION (start);
52f8ec73 2625 if (pos < startpos)
2eec3b4e
RS
2626 {
2627 if (startpos < next)
2628 next = startpos;
2629 break;
2630 }
239c932b
RS
2631 endpos = OVERLAY_POSITION (end);
2632 if (pos < endpos)
2eec3b4e
RS
2633 {
2634 if (idx == len)
2635 {
61d54cd5
RS
2636 if (extend)
2637 {
4b0e44fc
RS
2638 /* Make it work with an initial len == 0. */
2639 len *= 2;
0552666b 2640 if (len == 0)
4b0e44fc
RS
2641 len = 4;
2642 *len_ptr = len;
61d54cd5
RS
2643 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
2644 *vec_ptr = vec;
2645 }
2646 else
2647 inhibit_storing = 1;
2eec3b4e 2648 }
61d54cd5
RS
2649
2650 if (!inhibit_storing)
2651 vec[idx] = overlay;
2652 idx++;
413e06a4
RS
2653
2654 if (startpos < pos && startpos > prev)
2655 prev = startpos;
2eec3b4e 2656 }
239c932b
RS
2657 else if (endpos < pos && endpos > prev)
2658 prev = endpos;
1d5f4c1d
MB
2659 else if (endpos == pos && startpos > prev
2660 && (!change_req || startpos < pos))
413e06a4 2661 prev = startpos;
1ab256cb
RM
2662 }
2663
239c932b
RS
2664 if (next_ptr)
2665 *next_ptr = next;
2666 if (prev_ptr)
2667 *prev_ptr = prev;
2eec3b4e
RS
2668 return idx;
2669}
74514898
RS
2670\f
2671/* Find all the overlays in the current buffer that overlap the range BEG-END
2a3eeee7
RS
2672 or are empty at BEG.
2673
177c0ea7 2674 Return the number found, and store them in a vector in *VEC_PTR.
74514898
RS
2675 Store in *LEN_PTR the size allocated for the vector.
2676 Store in *NEXT_PTR the next position after POS where an overlay starts,
2677 or ZV if there are no more overlays.
2678 Store in *PREV_PTR the previous position before POS where an overlay ends,
2679 or BEGV if there are no previous overlays.
2680 NEXT_PTR and/or PREV_PTR may be 0, meaning don't store that info.
2681
2682 *VEC_PTR and *LEN_PTR should contain a valid vector and size
2683 when this function is called.
2684
2685 If EXTEND is non-zero, we make the vector bigger if necessary.
2686 If EXTEND is zero, we never extend the vector,
2687 and we store only as many overlays as will fit.
2688 But we still return the total number of overlays. */
2689
a9b9a780 2690static int
74514898
RS
2691overlays_in (beg, end, extend, vec_ptr, len_ptr, next_ptr, prev_ptr)
2692 int beg, end;
2693 int extend;
2694 Lisp_Object **vec_ptr;
2695 int *len_ptr;
2696 int *next_ptr;
2697 int *prev_ptr;
2698{
2410d73a
SM
2699 Lisp_Object overlay, ostart, oend;
2700 struct Lisp_Overlay *tail;
74514898
RS
2701 int idx = 0;
2702 int len = *len_ptr;
2703 Lisp_Object *vec = *vec_ptr;
2704 int next = ZV;
2705 int prev = BEGV;
2706 int inhibit_storing = 0;
2707
2410d73a 2708 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
74514898
RS
2709 {
2710 int startpos, endpos;
2711
2410d73a 2712 XSETMISC (overlay, tail);
74514898
RS
2713
2714 ostart = OVERLAY_START (overlay);
2715 oend = OVERLAY_END (overlay);
2716 endpos = OVERLAY_POSITION (oend);
2717 if (endpos < beg)
2718 {
2719 if (prev < endpos)
2720 prev = endpos;
2721 break;
2722 }
2723 startpos = OVERLAY_POSITION (ostart);
2724 /* Count an interval if it either overlaps the range
2a3eeee7 2725 or is empty at the start of the range. */
74514898 2726 if ((beg < endpos && startpos < end)
2a3eeee7 2727 || (startpos == endpos && beg == endpos))
74514898
RS
2728 {
2729 if (idx == len)
2730 {
2731 /* The supplied vector is full.
2732 Either make it bigger, or don't store any more in it. */
2733 if (extend)
2734 {
4b0e44fc
RS
2735 /* Make it work with an initial len == 0. */
2736 len *= 2;
2737 if (len == 0)
2738 len = 4;
2739 *len_ptr = len;
74514898
RS
2740 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
2741 *vec_ptr = vec;
2742 }
2743 else
2744 inhibit_storing = 1;
2745 }
2746
2747 if (!inhibit_storing)
2748 vec[idx] = overlay;
2749 /* Keep counting overlays even if we can't return them all. */
2750 idx++;
2751 }
2752 else if (startpos < next)
2753 next = startpos;
2754 }
2755
2410d73a 2756 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
74514898
RS
2757 {
2758 int startpos, endpos;
2759
2410d73a 2760 XSETMISC (overlay, tail);
74514898
RS
2761
2762 ostart = OVERLAY_START (overlay);
2763 oend = OVERLAY_END (overlay);
2764 startpos = OVERLAY_POSITION (ostart);
2765 if (end < startpos)
2766 {
2767 if (startpos < next)
2768 next = startpos;
2769 break;
2770 }
2771 endpos = OVERLAY_POSITION (oend);
2a3eeee7
RS
2772 /* Count an interval if it either overlaps the range
2773 or is empty at the start of the range. */
74514898 2774 if ((beg < endpos && startpos < end)
2a3eeee7 2775 || (startpos == endpos && beg == endpos))
74514898
RS
2776 {
2777 if (idx == len)
2778 {
2779 if (extend)
2780 {
4b0e44fc
RS
2781 /* Make it work with an initial len == 0. */
2782 len *= 2;
2783 if (len == 0)
2784 len = 4;
2785 *len_ptr = len;
74514898
RS
2786 vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object));
2787 *vec_ptr = vec;
2788 }
2789 else
2790 inhibit_storing = 1;
2791 }
2792
2793 if (!inhibit_storing)
2794 vec[idx] = overlay;
2795 idx++;
2796 }
2797 else if (endpos < beg && endpos > prev)
2798 prev = endpos;
2799 }
fc04fa47 2800
74514898
RS
2801 if (next_ptr)
2802 *next_ptr = next;
2803 if (prev_ptr)
2804 *prev_ptr = prev;
2805 return idx;
2806}
09a22085
GM
2807
2808
2809/* Return non-zero if there exists an overlay with a non-nil
2810 `mouse-face' property overlapping OVERLAY. */
2811
2812int
2813mouse_face_overlay_overlaps (overlay)
2814 Lisp_Object overlay;
2815{
2816 int start = OVERLAY_POSITION (OVERLAY_START (overlay));
2817 int end = OVERLAY_POSITION (OVERLAY_END (overlay));
bfd8410f 2818 int n, i, size;
09a22085 2819 Lisp_Object *v, tem;
177c0ea7 2820
bfd8410f
GM
2821 size = 10;
2822 v = (Lisp_Object *) alloca (size * sizeof *v);
2823 n = overlays_in (start, end, 0, &v, &size, NULL, NULL);
2824 if (n > size)
09a22085 2825 {
09a22085
GM
2826 v = (Lisp_Object *) alloca (n * sizeof *v);
2827 overlays_in (start, end, 0, &v, &n, NULL, NULL);
2828 }
2829
2830 for (i = 0; i < n; ++i)
2831 if (!EQ (v[i], overlay)
2832 && (tem = Foverlay_get (overlay, Qmouse_face),
2833 !NILP (tem)))
2834 break;
2835
2836 return i < n;
2837}
2838
2839
74514898 2840\f
fc04fa47
KH
2841/* Fast function to just test if we're at an overlay boundary. */
2842int
2843overlay_touches_p (pos)
2844 int pos;
2845{
2410d73a
SM
2846 Lisp_Object overlay;
2847 struct Lisp_Overlay *tail;
fc04fa47 2848
2410d73a 2849 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
fc04fa47
KH
2850 {
2851 int endpos;
2852
2410d73a 2853 XSETMISC (overlay ,tail);
fc04fa47
KH
2854 if (!GC_OVERLAYP (overlay))
2855 abort ();
2856
2857 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
2858 if (endpos < pos)
2859 break;
2860 if (endpos == pos || OVERLAY_POSITION (OVERLAY_START (overlay)) == pos)
2861 return 1;
2862 }
2863
2410d73a 2864 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
fc04fa47
KH
2865 {
2866 int startpos;
2867
2410d73a 2868 XSETMISC (overlay, tail);
fc04fa47
KH
2869 if (!GC_OVERLAYP (overlay))
2870 abort ();
2871
2872 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
2873 if (pos < startpos)
2874 break;
2875 if (startpos == pos || OVERLAY_POSITION (OVERLAY_END (overlay)) == pos)
2876 return 1;
2877 }
2878 return 0;
2879}
2eec3b4e 2880\f
5985d248
KH
2881struct sortvec
2882{
2883 Lisp_Object overlay;
2884 int beg, end;
2885 int priority;
2886};
2887
2888static int
dfcf069d
AS
2889compare_overlays (v1, v2)
2890 const void *v1, *v2;
5985d248 2891{
dfcf069d
AS
2892 const struct sortvec *s1 = (const struct sortvec *) v1;
2893 const struct sortvec *s2 = (const struct sortvec *) v2;
5985d248
KH
2894 if (s1->priority != s2->priority)
2895 return s1->priority - s2->priority;
2896 if (s1->beg != s2->beg)
2897 return s1->beg - s2->beg;
2898 if (s1->end != s2->end)
2899 return s2->end - s1->end;
2900 return 0;
2901}
2902
2903/* Sort an array of overlays by priority. The array is modified in place.
2904 The return value is the new size; this may be smaller than the original
2905 size if some of the overlays were invalid or were window-specific. */
2906int
2907sort_overlays (overlay_vec, noverlays, w)
2908 Lisp_Object *overlay_vec;
2909 int noverlays;
2910 struct window *w;
2911{
2912 int i, j;
2913 struct sortvec *sortvec;
2914 sortvec = (struct sortvec *) alloca (noverlays * sizeof (struct sortvec));
2915
2916 /* Put the valid and relevant overlays into sortvec. */
2917
2918 for (i = 0, j = 0; i < noverlays; i++)
2919 {
0fa767e7 2920 Lisp_Object tem;
c99fc30f 2921 Lisp_Object overlay;
5985d248 2922
c99fc30f 2923 overlay = overlay_vec[i];
5985d248
KH
2924 if (OVERLAY_VALID (overlay)
2925 && OVERLAY_POSITION (OVERLAY_START (overlay)) > 0
2926 && OVERLAY_POSITION (OVERLAY_END (overlay)) > 0)
2927 {
0fa767e7
KH
2928 /* If we're interested in a specific window, then ignore
2929 overlays that are limited to some other window. */
2930 if (w)
5985d248 2931 {
0fa767e7
KH
2932 Lisp_Object window;
2933
2934 window = Foverlay_get (overlay, Qwindow);
a7a60ce9 2935 if (WINDOWP (window) && XWINDOW (window) != w)
0fa767e7 2936 continue;
5985d248 2937 }
0fa767e7
KH
2938
2939 /* This overlay is good and counts: put it into sortvec. */
2940 sortvec[j].overlay = overlay;
2941 sortvec[j].beg = OVERLAY_POSITION (OVERLAY_START (overlay));
2942 sortvec[j].end = OVERLAY_POSITION (OVERLAY_END (overlay));
2943 tem = Foverlay_get (overlay, Qpriority);
2944 if (INTEGERP (tem))
2945 sortvec[j].priority = XINT (tem);
2946 else
2947 sortvec[j].priority = 0;
2948 j++;
5985d248
KH
2949 }
2950 }
2951 noverlays = j;
2952
2953 /* Sort the overlays into the proper order: increasing priority. */
2954
2955 if (noverlays > 1)
2956 qsort (sortvec, noverlays, sizeof (struct sortvec), compare_overlays);
2957
2958 for (i = 0; i < noverlays; i++)
2959 overlay_vec[i] = sortvec[i].overlay;
2960 return (noverlays);
2961}
2962\f
bbbe9545
KH
2963struct sortstr
2964{
cb26008f 2965 Lisp_Object string, string2;
bbbe9545
KH
2966 int size;
2967 int priority;
2968};
2969
e8185fa8
KH
2970struct sortstrlist
2971{
2972 struct sortstr *buf; /* An array that expands as needed; never freed. */
2973 int size; /* Allocated length of that array. */
2974 int used; /* How much of the array is currently in use. */
2975 int bytes; /* Total length of the strings in buf. */
2976};
2977
2978/* Buffers for storing information about the overlays touching a given
2979 position. These could be automatic variables in overlay_strings, but
2980 it's more efficient to hold onto the memory instead of repeatedly
2981 allocating and freeing it. */
2982static struct sortstrlist overlay_heads, overlay_tails;
9492daf2 2983static unsigned char *overlay_str_buf;
e8185fa8
KH
2984
2985/* Allocated length of overlay_str_buf. */
2986static int overlay_str_len;
2987
bbbe9545
KH
2988/* A comparison function suitable for passing to qsort. */
2989static int
2990cmp_for_strings (as1, as2)
2991 char *as1, *as2;
2992{
2993 struct sortstr *s1 = (struct sortstr *)as1;
2994 struct sortstr *s2 = (struct sortstr *)as2;
2995 if (s1->size != s2->size)
2996 return s2->size - s1->size;
2997 if (s1->priority != s2->priority)
2998 return s1->priority - s2->priority;
2999 return 0;
3000}
3001
e8185fa8 3002static void
cb26008f 3003record_overlay_string (ssl, str, str2, pri, size)
e8185fa8 3004 struct sortstrlist *ssl;
cb26008f 3005 Lisp_Object str, str2, pri;
e8185fa8
KH
3006 int size;
3007{
43d27a72
RS
3008 int nbytes;
3009
e8185fa8
KH
3010 if (ssl->used == ssl->size)
3011 {
3012 if (ssl->buf)
3013 ssl->size *= 2;
3014 else
3015 ssl->size = 5;
3016 ssl->buf = ((struct sortstr *)
3017 xrealloc (ssl->buf, ssl->size * sizeof (struct sortstr)));
3018 }
3019 ssl->buf[ssl->used].string = str;
cb26008f 3020 ssl->buf[ssl->used].string2 = str2;
e8185fa8
KH
3021 ssl->buf[ssl->used].size = size;
3022 ssl->buf[ssl->used].priority = (INTEGERP (pri) ? XINT (pri) : 0);
3023 ssl->used++;
43d27a72
RS
3024
3025 if (NILP (current_buffer->enable_multibyte_characters))
d5db4077 3026 nbytes = SCHARS (str);
43d27a72 3027 else if (! STRING_MULTIBYTE (str))
d5db4077
KR
3028 nbytes = count_size_as_multibyte (SDATA (str),
3029 SBYTES (str));
43d27a72 3030 else
d5db4077 3031 nbytes = SBYTES (str);
43d27a72
RS
3032
3033 ssl->bytes += nbytes;
3034
cb26008f 3035 if (STRINGP (str2))
43d27a72
RS
3036 {
3037 if (NILP (current_buffer->enable_multibyte_characters))
d5db4077 3038 nbytes = SCHARS (str2);
43d27a72 3039 else if (! STRING_MULTIBYTE (str2))
d5db4077
KR
3040 nbytes = count_size_as_multibyte (SDATA (str2),
3041 SBYTES (str2));
43d27a72 3042 else
d5db4077 3043 nbytes = SBYTES (str2);
43d27a72
RS
3044
3045 ssl->bytes += nbytes;
3046 }
e8185fa8 3047}
bbbe9545
KH
3048
3049/* Return the concatenation of the strings associated with overlays that
3050 begin or end at POS, ignoring overlays that are specific to a window
3051 other than W. The strings are concatenated in the appropriate order:
3052 shorter overlays nest inside longer ones, and higher priority inside
cb26008f
KH
3053 lower. Normally all of the after-strings come first, but zero-sized
3054 overlays have their after-strings ride along with the before-strings
3055 because it would look strange to print them inside-out.
3056
3057 Returns the string length, and stores the contents indirectly through
3058 PSTR, if that variable is non-null. The string may be overwritten by
3059 subsequent calls. */
6b5d3b89 3060
bbbe9545
KH
3061int
3062overlay_strings (pos, w, pstr)
c2d5b10f 3063 EMACS_INT pos;
bbbe9545 3064 struct window *w;
6b5d3b89 3065 unsigned char **pstr;
bbbe9545 3066{
2410d73a
SM
3067 Lisp_Object overlay, window, str;
3068 struct Lisp_Overlay *ov;
bbbe9545 3069 int startpos, endpos;
43d27a72 3070 int multibyte = ! NILP (current_buffer->enable_multibyte_characters);
bbbe9545 3071
e8185fa8
KH
3072 overlay_heads.used = overlay_heads.bytes = 0;
3073 overlay_tails.used = overlay_tails.bytes = 0;
2410d73a 3074 for (ov = current_buffer->overlays_before; ov; ov = ov->next)
bbbe9545 3075 {
2410d73a 3076 XSETMISC (overlay, ov);
c2d5b10f 3077 eassert (OVERLAYP (overlay));
bbbe9545
KH
3078
3079 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
3080 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
3081 if (endpos < pos)
3082 break;
3083 if (endpos != pos && startpos != pos)
3084 continue;
3085 window = Foverlay_get (overlay, Qwindow);
3086 if (WINDOWP (window) && XWINDOW (window) != w)
3087 continue;
e8185fa8
KH
3088 if (startpos == pos
3089 && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)))
3090 record_overlay_string (&overlay_heads, str,
cb26008f
KH
3091 (startpos == endpos
3092 ? Foverlay_get (overlay, Qafter_string)
3093 : Qnil),
3094 Foverlay_get (overlay, Qpriority),
3095 endpos - startpos);
3096 else if (endpos == pos
3097 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str)))
3098 record_overlay_string (&overlay_tails, str, Qnil,
e8185fa8
KH
3099 Foverlay_get (overlay, Qpriority),
3100 endpos - startpos);
bbbe9545 3101 }
2410d73a 3102 for (ov = current_buffer->overlays_after; ov; ov = ov->next)
bbbe9545 3103 {
2410d73a
SM
3104 XSETMISC (overlay, ov);
3105 eassert (OVERLAYP (overlay));
bbbe9545
KH
3106
3107 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
3108 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
3109 if (startpos > pos)
3110 break;
e8185fa8
KH
3111 if (endpos != pos && startpos != pos)
3112 continue;
3113 window = Foverlay_get (overlay, Qwindow);
3114 if (WINDOWP (window) && XWINDOW (window) != w)
3115 continue;
e8185fa8
KH
3116 if (startpos == pos
3117 && (str = Foverlay_get (overlay, Qbefore_string), STRINGP (str)))
3118 record_overlay_string (&overlay_heads, str,
cb26008f
KH
3119 (startpos == endpos
3120 ? Foverlay_get (overlay, Qafter_string)
3121 : Qnil),
3122 Foverlay_get (overlay, Qpriority),
3123 endpos - startpos);
3124 else if (endpos == pos
3125 && (str = Foverlay_get (overlay, Qafter_string), STRINGP (str)))
3126 record_overlay_string (&overlay_tails, str, Qnil,
e8185fa8
KH
3127 Foverlay_get (overlay, Qpriority),
3128 endpos - startpos);
bbbe9545 3129 }
e8185fa8
KH
3130 if (overlay_tails.used > 1)
3131 qsort (overlay_tails.buf, overlay_tails.used, sizeof (struct sortstr),
3132 cmp_for_strings);
3133 if (overlay_heads.used > 1)
3134 qsort (overlay_heads.buf, overlay_heads.used, sizeof (struct sortstr),
3135 cmp_for_strings);
3136 if (overlay_heads.bytes || overlay_tails.bytes)
bbbe9545 3137 {
e8185fa8 3138 Lisp_Object tem;
bbbe9545 3139 int i;
9f4d7cde 3140 unsigned char *p;
e8185fa8 3141 int total = overlay_heads.bytes + overlay_tails.bytes;
bbbe9545
KH
3142
3143 if (total > overlay_str_len)
9f4d7cde
RS
3144 {
3145 overlay_str_len = total;
3146 overlay_str_buf = (unsigned char *)xrealloc (overlay_str_buf,
3147 total);
3148 }
bbbe9545 3149 p = overlay_str_buf;
e8185fa8 3150 for (i = overlay_tails.used; --i >= 0;)
bbbe9545 3151 {
43d27a72 3152 int nbytes;
e8185fa8 3153 tem = overlay_tails.buf[i].string;
d5db4077
KR
3154 nbytes = copy_text (SDATA (tem), p,
3155 SBYTES (tem),
43d27a72
RS
3156 STRING_MULTIBYTE (tem), multibyte);
3157 p += nbytes;
bbbe9545 3158 }
e8185fa8 3159 for (i = 0; i < overlay_heads.used; ++i)
bbbe9545 3160 {
43d27a72 3161 int nbytes;
e8185fa8 3162 tem = overlay_heads.buf[i].string;
d5db4077
KR
3163 nbytes = copy_text (SDATA (tem), p,
3164 SBYTES (tem),
43d27a72
RS
3165 STRING_MULTIBYTE (tem), multibyte);
3166 p += nbytes;
cb26008f
KH
3167 tem = overlay_heads.buf[i].string2;
3168 if (STRINGP (tem))
3169 {
d5db4077
KR
3170 nbytes = copy_text (SDATA (tem), p,
3171 SBYTES (tem),
43d27a72
RS
3172 STRING_MULTIBYTE (tem), multibyte);
3173 p += nbytes;
cb26008f 3174 }
bbbe9545 3175 }
cb26008f
KH
3176 if (p != overlay_str_buf + total)
3177 abort ();
bbbe9545
KH
3178 if (pstr)
3179 *pstr = overlay_str_buf;
e8185fa8 3180 return total;
bbbe9545 3181 }
e8185fa8 3182 return 0;
bbbe9545
KH
3183}
3184\f
5c4f68f1 3185/* Shift overlays in BUF's overlay lists, to center the lists at POS. */
1ab256cb 3186
2eec3b4e 3187void
5c4f68f1
JB
3188recenter_overlay_lists (buf, pos)
3189 struct buffer *buf;
c2d5b10f 3190 EMACS_INT pos;
2eec3b4e 3191{
2410d73a
SM
3192 Lisp_Object overlay, beg, end;
3193 struct Lisp_Overlay *prev, *tail, *next;
2eec3b4e
RS
3194
3195 /* See if anything in overlays_before should move to overlays_after. */
3196
3197 /* We don't strictly need prev in this loop; it should always be nil.
3198 But we use it for symmetry and in case that should cease to be true
3199 with some future change. */
2410d73a
SM
3200 prev = NULL;
3201 for (tail = buf->overlays_before; tail; prev = tail, tail = next)
1ab256cb 3202 {
2410d73a
SM
3203 next = tail->next;
3204 XSETMISC (overlay, tail);
2eec3b4e
RS
3205
3206 /* If the overlay is not valid, get rid of it. */
3207 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
3208#if 1
3209 abort ();
3210#else
2eec3b4e
RS
3211 {
3212 /* Splice the cons cell TAIL out of overlays_before. */
3213 if (!NILP (prev))
7539e11f 3214 XCDR (prev) = next;
2eec3b4e 3215 else
5c4f68f1 3216 buf->overlays_before = next;
2eec3b4e
RS
3217 tail = prev;
3218 continue;
3219 }
52f8ec73 3220#endif
1ab256cb 3221
2eec3b4e
RS
3222 beg = OVERLAY_START (overlay);
3223 end = OVERLAY_END (overlay);
1ab256cb 3224
2eec3b4e 3225 if (OVERLAY_POSITION (end) > pos)
1ab256cb 3226 {
2eec3b4e
RS
3227 /* OVERLAY needs to be moved. */
3228 int where = OVERLAY_POSITION (beg);
2410d73a 3229 struct Lisp_Overlay *other, *other_prev;
2eec3b4e
RS
3230
3231 /* Splice the cons cell TAIL out of overlays_before. */
2410d73a
SM
3232 if (prev)
3233 prev->next = next;
2eec3b4e 3234 else
5c4f68f1 3235 buf->overlays_before = next;
2eec3b4e
RS
3236
3237 /* Search thru overlays_after for where to put it. */
2410d73a
SM
3238 other_prev = NULL;
3239 for (other = buf->overlays_after; other;
3240 other_prev = other, other = other->next)
1ab256cb 3241 {
6af718a4 3242 Lisp_Object otherbeg, otheroverlay;
2eec3b4e 3243
2410d73a
SM
3244 XSETMISC (otheroverlay, other);
3245 eassert (OVERLAY_VALID (otheroverlay));
2eec3b4e
RS
3246
3247 otherbeg = OVERLAY_START (otheroverlay);
3248 if (OVERLAY_POSITION (otherbeg) >= where)
3249 break;
1ab256cb 3250 }
2eec3b4e
RS
3251
3252 /* Add TAIL to overlays_after before OTHER. */
2410d73a
SM
3253 tail->next = other;
3254 if (other_prev)
3255 other_prev->next = tail;
1ab256cb 3256 else
5c4f68f1 3257 buf->overlays_after = tail;
2eec3b4e 3258 tail = prev;
1ab256cb 3259 }
2eec3b4e
RS
3260 else
3261 /* We've reached the things that should stay in overlays_before.
3262 All the rest of overlays_before must end even earlier,
3263 so stop now. */
3264 break;
3265 }
3266
3267 /* See if anything in overlays_after should be in overlays_before. */
2410d73a
SM
3268 prev = NULL;
3269 for (tail = buf->overlays_after; tail; prev = tail, tail = next)
2eec3b4e 3270 {
2410d73a
SM
3271 next = tail->next;
3272 XSETMISC (overlay, tail);
2eec3b4e
RS
3273
3274 /* If the overlay is not valid, get rid of it. */
3275 if (!OVERLAY_VALID (overlay))
52f8ec73
JB
3276#if 1
3277 abort ();
3278#else
2eec3b4e
RS
3279 {
3280 /* Splice the cons cell TAIL out of overlays_after. */
3281 if (!NILP (prev))
7539e11f 3282 XCDR (prev) = next;
2eec3b4e 3283 else
5c4f68f1 3284 buf->overlays_after = next;
2eec3b4e
RS
3285 tail = prev;
3286 continue;
3287 }
52f8ec73 3288#endif
2eec3b4e
RS
3289
3290 beg = OVERLAY_START (overlay);
3291 end = OVERLAY_END (overlay);
3292
3293 /* Stop looking, when we know that nothing further
3294 can possibly end before POS. */
3295 if (OVERLAY_POSITION (beg) > pos)
3296 break;
3297
3298 if (OVERLAY_POSITION (end) <= pos)
3299 {
3300 /* OVERLAY needs to be moved. */
3301 int where = OVERLAY_POSITION (end);
2410d73a 3302 struct Lisp_Overlay *other, *other_prev;
2eec3b4e
RS
3303
3304 /* Splice the cons cell TAIL out of overlays_after. */
2410d73a
SM
3305 if (prev)
3306 prev->next = next;
2eec3b4e 3307 else
5c4f68f1 3308 buf->overlays_after = next;
2eec3b4e
RS
3309
3310 /* Search thru overlays_before for where to put it. */
2410d73a
SM
3311 other_prev = NULL;
3312 for (other = buf->overlays_before; other;
3313 other_prev = other, other = other->next)
2eec3b4e
RS
3314 {
3315 Lisp_Object otherend, otheroverlay;
2eec3b4e 3316
2410d73a
SM
3317 XSETMISC (otheroverlay, other);
3318 eassert (OVERLAY_VALID (otheroverlay));
2eec3b4e
RS
3319
3320 otherend = OVERLAY_END (otheroverlay);
3321 if (OVERLAY_POSITION (otherend) <= where)
3322 break;
3323 }
3324
3325 /* Add TAIL to overlays_before before OTHER. */
2410d73a
SM
3326 tail->next = other;
3327 if (other_prev)
3328 other_prev->next = tail;
2eec3b4e 3329 else
5c4f68f1 3330 buf->overlays_before = tail;
2eec3b4e
RS
3331 tail = prev;
3332 }
3333 }
3334
c2d5b10f 3335 buf->overlay_center = pos;
2eec3b4e 3336}
2b1bdf65 3337
423cdb46
KH
3338void
3339adjust_overlays_for_insert (pos, length)
c2d5b10f
SM
3340 EMACS_INT pos;
3341 EMACS_INT length;
423cdb46
KH
3342{
3343 /* After an insertion, the lists are still sorted properly,
3344 but we may need to update the value of the overlay center. */
c2d5b10f
SM
3345 if (current_buffer->overlay_center >= pos)
3346 current_buffer->overlay_center += length;
423cdb46
KH
3347}
3348
3349void
3350adjust_overlays_for_delete (pos, length)
c2d5b10f
SM
3351 EMACS_INT pos;
3352 EMACS_INT length;
423cdb46 3353{
c2d5b10f 3354 if (current_buffer->overlay_center < pos)
423cdb46
KH
3355 /* The deletion was to our right. No change needed; the before- and
3356 after-lists are still consistent. */
3357 ;
c2d5b10f 3358 else if (current_buffer->overlay_center > pos + length)
423cdb46
KH
3359 /* The deletion was to our left. We need to adjust the center value
3360 to account for the change in position, but the lists are consistent
3361 given the new value. */
c2d5b10f 3362 current_buffer->overlay_center -= length;
423cdb46
KH
3363 else
3364 /* We're right in the middle. There might be things on the after-list
3365 that now belong on the before-list. Recentering will move them,
3366 and also update the center point. */
3367 recenter_overlay_lists (current_buffer, pos);
3368}
3369
2b1bdf65
KH
3370/* Fix up overlays that were garbled as a result of permuting markers
3371 in the range START through END. Any overlay with at least one
3372 endpoint in this range will need to be unlinked from the overlay
3373 list and reinserted in its proper place.
3374 Such an overlay might even have negative size at this point.
99a72bdf 3375 If so, we'll make the overlay empty. */
2b1bdf65 3376void
abdb9b83 3377fix_start_end_in_overlays (start, end)
2b1bdf65
KH
3378 register int start, end;
3379{
6af718a4 3380 Lisp_Object overlay;
2410d73a 3381 struct Lisp_Overlay *before_list, *after_list;
1138e742
KR
3382 /* These are either nil, indicating that before_list or after_list
3383 should be assigned, or the cons cell the cdr of which should be
3384 assigned. */
2410d73a 3385 struct Lisp_Overlay *beforep = NULL, *afterp = NULL;
1138e742
KR
3386 /* 'Parent', likewise, indicates a cons cell or
3387 current_buffer->overlays_before or overlays_after, depending
3388 which loop we're in. */
2410d73a 3389 struct Lisp_Overlay *tail, *parent;
2b1bdf65
KH
3390 int startpos, endpos;
3391
3392 /* This algorithm shifts links around instead of consing and GCing.
3393 The loop invariant is that before_list (resp. after_list) is a
1138e742
KR
3394 well-formed list except that its last element, the CDR of beforep
3395 (resp. afterp) if beforep (afterp) isn't nil or before_list
3396 (after_list) if it is, is still uninitialized. So it's not a bug
3397 that before_list isn't initialized, although it may look
3398 strange. */
2410d73a 3399 for (parent = NULL, tail = current_buffer->overlays_before; tail;)
2b1bdf65 3400 {
2410d73a 3401 XSETMISC (overlay, tail);
99a72bdf 3402
2b1bdf65 3403 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
99a72bdf
MY
3404 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
3405
3406 /* If the overlay is backwards, make it empty. */
3407 if (endpos < startpos)
3408 {
3409 startpos = endpos;
3410 Fset_marker (OVERLAY_START (overlay), make_number (startpos),
3411 Qnil);
3412 }
3413
2b1bdf65
KH
3414 if (endpos < start)
3415 break;
60ebfdf3 3416
2b1bdf65
KH
3417 if (endpos < end
3418 || (startpos >= start && startpos < end))
3419 {
2b1bdf65
KH
3420 /* Add it to the end of the wrong list. Later on,
3421 recenter_overlay_lists will move it to the right place. */
c2d5b10f 3422 if (endpos < current_buffer->overlay_center)
2b1bdf65 3423 {
2410d73a 3424 if (!afterp)
1138e742
KR
3425 after_list = tail;
3426 else
2410d73a 3427 afterp->next = tail;
1138e742 3428 afterp = tail;
2b1bdf65
KH
3429 }
3430 else
3431 {
2410d73a 3432 if (!beforep)
1138e742
KR
3433 before_list = tail;
3434 else
2410d73a 3435 beforep->next = tail;
1138e742 3436 beforep = tail;
2b1bdf65 3437 }
2410d73a
SM
3438 if (!parent)
3439 current_buffer->overlays_before = tail->next;
1138e742 3440 else
2410d73a
SM
3441 parent->next = tail->next;
3442 tail = tail->next;
2b1bdf65
KH
3443 }
3444 else
2410d73a 3445 parent = tail, tail = parent->next;
2b1bdf65 3446 }
2410d73a 3447 for (parent = NULL, tail = current_buffer->overlays_after; tail;)
2b1bdf65 3448 {
2410d73a 3449 XSETMISC (overlay, tail);
99a72bdf 3450
2b1bdf65 3451 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
99a72bdf
MY
3452 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
3453
3454 /* If the overlay is backwards, make it empty. */
3455 if (endpos < startpos)
3456 {
3457 startpos = endpos;
3458 Fset_marker (OVERLAY_START (overlay), make_number (startpos),
60ebfdf3 3459 Qnil);
99a72bdf
MY
3460 }
3461
2b1bdf65
KH
3462 if (startpos >= end)
3463 break;
99a72bdf 3464
2b1bdf65
KH
3465 if (startpos >= start
3466 || (endpos >= start && endpos < end))
3467 {
c2d5b10f 3468 if (endpos < current_buffer->overlay_center)
2b1bdf65 3469 {
2410d73a 3470 if (!afterp)
1138e742
KR
3471 after_list = tail;
3472 else
2410d73a 3473 afterp->next = tail;
1138e742 3474 afterp = tail;
2b1bdf65
KH
3475 }
3476 else
3477 {
2410d73a 3478 if (!beforep)
1138e742
KR
3479 before_list = tail;
3480 else
2410d73a 3481 beforep->next = tail;
1138e742 3482 beforep = tail;
2b1bdf65 3483 }
2410d73a
SM
3484 if (!parent)
3485 current_buffer->overlays_after = tail->next;
1138e742 3486 else
2410d73a
SM
3487 parent->next = tail->next;
3488 tail = tail->next;
2b1bdf65
KH
3489 }
3490 else
2410d73a 3491 parent = tail, tail = parent->next;
2b1bdf65
KH
3492 }
3493
3494 /* Splice the constructed (wrong) lists into the buffer's lists,
3495 and let the recenter function make it sane again. */
2410d73a 3496 if (beforep)
1138e742 3497 {
2410d73a 3498 beforep->next = current_buffer->overlays_before;
1138e742
KR
3499 current_buffer->overlays_before = before_list;
3500 }
c2d5b10f 3501 recenter_overlay_lists (current_buffer, current_buffer->overlay_center);
2b1bdf65 3502
2410d73a 3503 if (afterp)
1138e742 3504 {
2410d73a 3505 afterp->next = current_buffer->overlays_after;
1138e742
KR
3506 current_buffer->overlays_after = after_list;
3507 }
c2d5b10f 3508 recenter_overlay_lists (current_buffer, current_buffer->overlay_center);
2b1bdf65 3509}
3b06f880
KH
3510
3511/* We have two types of overlay: the one whose ending marker is
3512 after-insertion-marker (this is the usual case) and the one whose
3513 ending marker is before-insertion-marker. When `overlays_before'
3514 contains overlays of the latter type and the former type in this
3515 order and both overlays end at inserting position, inserting a text
3516 increases only the ending marker of the latter type, which results
3517 in incorrect ordering of `overlays_before'.
3518
3519 This function fixes ordering of overlays in the slot
3520 `overlays_before' of the buffer *BP. Before the insertion, `point'
3521 was at PREV, and now is at POS. */
3522
01136e9b 3523void
3b06f880
KH
3524fix_overlays_before (bp, prev, pos)
3525 struct buffer *bp;
c2d5b10f 3526 EMACS_INT prev, pos;
3b06f880 3527{
2410d73a
SM
3528 /* If parent is nil, replace overlays_before; otherwise, parent->next. */
3529 struct Lisp_Overlay *tail = bp->overlays_before, *parent = NULL, *right_pair;
3530 Lisp_Object tem;
c2d5b10f 3531 EMACS_INT end;
3b06f880
KH
3532
3533 /* After the insertion, the several overlays may be in incorrect
3534 order. The possibility is that, in the list `overlays_before',
3535 an overlay which ends at POS appears after an overlay which ends
3536 at PREV. Since POS is greater than PREV, we must fix the
3537 ordering of these overlays, by moving overlays ends at POS before
3538 the overlays ends at PREV. */
3539
3540 /* At first, find a place where disordered overlays should be linked
3541 in. It is where an overlay which end before POS exists. (i.e. an
3542 overlay whose ending marker is after-insertion-marker if disorder
3543 exists). */
2410d73a
SM
3544 while (tail
3545 && (XSETMISC (tem, tail),
3546 (end = OVERLAY_POSITION (OVERLAY_END (tem))) >= pos))
1138e742
KR
3547 {
3548 parent = tail;
2410d73a 3549 tail = tail->next;
1138e742 3550 }
3b06f880
KH
3551
3552 /* If we don't find such an overlay,
3553 or the found one ends before PREV,
3554 or the found one is the last one in the list,
3555 we don't have to fix anything. */
f93ad4cf 3556 if (!tail || end < prev || !tail->next)
3b06f880
KH
3557 return;
3558
1138e742
KR
3559 right_pair = parent;
3560 parent = tail;
2410d73a 3561 tail = tail->next;
3b06f880 3562
1138e742 3563 /* Now, end position of overlays in the list TAIL should be before
3b06f880 3564 or equal to PREV. In the loop, an overlay which ends at POS is
1138e742
KR
3565 moved ahead to the place indicated by the CDR of RIGHT_PAIR. If
3566 we found an overlay which ends before PREV, the remaining
3567 overlays are in correct order. */
2410d73a 3568 while (tail)
3b06f880 3569 {
2410d73a
SM
3570 XSETMISC (tem, tail);
3571 end = OVERLAY_POSITION (OVERLAY_END (tem));
3b06f880
KH
3572
3573 if (end == pos)
3574 { /* This overlay is disordered. */
2410d73a 3575 struct Lisp_Overlay *found = tail;
3b06f880
KH
3576
3577 /* Unlink the found overlay. */
2410d73a
SM
3578 tail = found->next;
3579 parent->next = tail;
1138e742
KR
3580 /* Move an overlay at RIGHT_PLACE to the next of the found one,
3581 and link it into the right place. */
2410d73a 3582 if (!right_pair)
1138e742 3583 {
2410d73a 3584 found->next = bp->overlays_before;
1138e742
KR
3585 bp->overlays_before = found;
3586 }
3587 else
3588 {
2410d73a
SM
3589 found->next = right_pair->next;
3590 right_pair->next = found;
1138e742 3591 }
3b06f880
KH
3592 }
3593 else if (end == prev)
1138e742
KR
3594 {
3595 parent = tail;
2410d73a 3596 tail = tail->next;
1138e742 3597 }
3b06f880
KH
3598 else /* No more disordered overlay. */
3599 break;
3600 }
3601}
2eec3b4e 3602\f
52f8ec73 3603DEFUN ("overlayp", Foverlayp, Soverlayp, 1, 1, 0,
7ee72033
MB
3604 doc: /* Return t if OBJECT is an overlay. */)
3605 (object)
52f8ec73
JB
3606 Lisp_Object object;
3607{
3608 return (OVERLAYP (object) ? Qt : Qnil);
3609}
3610
acac2700 3611DEFUN ("make-overlay", Fmake_overlay, Smake_overlay, 2, 5, 0,
7ee72033 3612 doc: /* Create a new overlay with range BEG to END in BUFFER.
018ba359
PJ
3613If omitted, BUFFER defaults to the current buffer.
3614BEG and END may be integers or markers.
a625ee20
RS
3615The fourth arg FRONT-ADVANCE, if non-nil, makes the marker
3616for the front of the overlay advance when text is inserted there
63af6055 3617\(which means the text *is not* included in the overlay).
a625ee20
RS
3618The fifth arg REAR-ADVANCE, if non-nil, makes the marker
3619for the rear of the overlay advance when text is inserted there
63af6055 3620\(which means the text *is* included in the overlay). */)
7ee72033 3621 (beg, end, buffer, front_advance, rear_advance)
5c4f68f1 3622 Lisp_Object beg, end, buffer;
acac2700 3623 Lisp_Object front_advance, rear_advance;
2eec3b4e
RS
3624{
3625 Lisp_Object overlay;
5c4f68f1 3626 struct buffer *b;
2eec3b4e 3627
5c4f68f1 3628 if (NILP (buffer))
67180c6a 3629 XSETBUFFER (buffer, current_buffer);
883047b9 3630 else
b7826503 3631 CHECK_BUFFER (buffer);
883047b9
JB
3632 if (MARKERP (beg)
3633 && ! EQ (Fmarker_buffer (beg), buffer))
3634 error ("Marker points into wrong buffer");
3635 if (MARKERP (end)
3636 && ! EQ (Fmarker_buffer (end), buffer))
3637 error ("Marker points into wrong buffer");
2eec3b4e 3638
b7826503
PJ
3639 CHECK_NUMBER_COERCE_MARKER (beg);
3640 CHECK_NUMBER_COERCE_MARKER (end);
5c4f68f1 3641
883047b9 3642 if (XINT (beg) > XINT (end))
5c4f68f1 3643 {
c99fc30f
KH
3644 Lisp_Object temp;
3645 temp = beg; beg = end; end = temp;
5c4f68f1 3646 }
883047b9
JB
3647
3648 b = XBUFFER (buffer);
3649
3650 beg = Fset_marker (Fmake_marker (), beg, buffer);
3651 end = Fset_marker (Fmake_marker (), end, buffer);
5c4f68f1 3652
acac2700
RS
3653 if (!NILP (front_advance))
3654 XMARKER (beg)->insertion_type = 1;
3655 if (!NILP (rear_advance))
3656 XMARKER (end)->insertion_type = 1;
597dd755 3657
48e2e3ba 3658 overlay = allocate_misc ();
89ca3e1b 3659 XMISCTYPE (overlay) = Lisp_Misc_Overlay;
48e2e3ba
KH
3660 XOVERLAY (overlay)->start = beg;
3661 XOVERLAY (overlay)->end = end;
3662 XOVERLAY (overlay)->plist = Qnil;
2410d73a 3663 XOVERLAY (overlay)->next = NULL;
2eec3b4e 3664
177c0ea7 3665 /* Put the new overlay on the wrong list. */
2eec3b4e 3666 end = OVERLAY_END (overlay);
c2d5b10f 3667 if (OVERLAY_POSITION (end) < b->overlay_center)
2410d73a
SM
3668 {
3669 if (b->overlays_after)
3670 XOVERLAY (overlay)->next = b->overlays_after;
3671 b->overlays_after = XOVERLAY (overlay);
3672 }
2eec3b4e 3673 else
2410d73a
SM
3674 {
3675 if (b->overlays_before)
3676 XOVERLAY (overlay)->next = b->overlays_before;
3677 b->overlays_before = XOVERLAY (overlay);
3678 }
2eec3b4e
RS
3679
3680 /* This puts it in the right list, and in the right order. */
c2d5b10f 3681 recenter_overlay_lists (b, b->overlay_center);
2eec3b4e 3682
b61982dd
JB
3683 /* We don't need to redisplay the region covered by the overlay, because
3684 the overlay has no properties at the moment. */
3685
2eec3b4e
RS
3686 return overlay;
3687}
876aa27c
RS
3688\f
3689/* Mark a section of BUF as needing redisplay because of overlays changes. */
3690
3691static void
3692modify_overlay (buf, start, end)
3693 struct buffer *buf;
c2d5b10f 3694 EMACS_INT start, end;
876aa27c 3695{
876aa27c
RS
3696 if (start > end)
3697 {
3698 int temp = start;
26f545d7
GM
3699 start = end;
3700 end = temp;
876aa27c
RS
3701 }
3702
481b5054 3703 BUF_COMPUTE_UNCHANGED (buf, start, end);
177c0ea7 3704
876aa27c
RS
3705 /* If this is a buffer not in the selected window,
3706 we must do other windows. */
3707 if (buf != XBUFFER (XWINDOW (selected_window)->buffer))
3708 windows_or_buffers_changed = 1;
876aa27c
RS
3709 /* If multiple windows show this buffer, we must do other windows. */
3710 else if (buffer_shared > 1)
3711 windows_or_buffers_changed = 1;
18700091
KS
3712 /* If we modify an overlay at the end of the buffer, we cannot
3713 be sure that window end is still valid. */
3714 else if (end >= ZV && start <= ZV)
3715 windows_or_buffers_changed = 1;
876aa27c 3716
d8b9150f 3717 ++BUF_OVERLAY_MODIFF (buf);
876aa27c 3718}
2eec3b4e 3719
018ba359 3720\f
2e34157c
RS
3721Lisp_Object Fdelete_overlay ();
3722
2410d73a
SM
3723static struct Lisp_Overlay *
3724unchain_overlay (list, overlay)
3725 struct Lisp_Overlay *list, *overlay;
3726{
3727 struct Lisp_Overlay *tmp, *prev;
3728 for (tmp = list, prev = NULL; tmp; prev = tmp, tmp = tmp->next)
3729 if (tmp == overlay)
3730 {
3731 if (prev)
3732 prev->next = tmp->next;
3733 else
3734 list = tmp->next;
3735 overlay->next = NULL;
3736 break;
3737 }
3738 return list;
3739}
3740
5c4f68f1 3741DEFUN ("move-overlay", Fmove_overlay, Smove_overlay, 3, 4, 0,
7ee72033 3742 doc: /* Set the endpoints of OVERLAY to BEG and END in BUFFER.
018ba359
PJ
3743If BUFFER is omitted, leave OVERLAY in the same buffer it inhabits now.
3744If BUFFER is omitted, and OVERLAY is in no buffer, put it in the current
7ee72033
MB
3745buffer. */)
3746 (overlay, beg, end, buffer)
5c4f68f1 3747 Lisp_Object overlay, beg, end, buffer;
2eec3b4e 3748{
0a4469c9
RS
3749 struct buffer *b, *ob;
3750 Lisp_Object obuffer;
aed13378 3751 int count = SPECPDL_INDEX ();
5c4f68f1 3752
b7826503 3753 CHECK_OVERLAY (overlay);
5c4f68f1
JB
3754 if (NILP (buffer))
3755 buffer = Fmarker_buffer (OVERLAY_START (overlay));
3ece337a 3756 if (NILP (buffer))
67180c6a 3757 XSETBUFFER (buffer, current_buffer);
b7826503 3758 CHECK_BUFFER (buffer);
883047b9
JB
3759
3760 if (MARKERP (beg)
3761 && ! EQ (Fmarker_buffer (beg), buffer))
3762 error ("Marker points into wrong buffer");
3763 if (MARKERP (end)
3764 && ! EQ (Fmarker_buffer (end), buffer))
3765 error ("Marker points into wrong buffer");
3766
b7826503
PJ
3767 CHECK_NUMBER_COERCE_MARKER (beg);
3768 CHECK_NUMBER_COERCE_MARKER (end);
b61982dd 3769
9d7608b7
KH
3770 if (XINT (beg) == XINT (end) && ! NILP (Foverlay_get (overlay, Qevaporate)))
3771 return Fdelete_overlay (overlay);
0a4469c9 3772
b61982dd
JB
3773 if (XINT (beg) > XINT (end))
3774 {
c99fc30f
KH
3775 Lisp_Object temp;
3776 temp = beg; beg = end; end = temp;
b61982dd
JB
3777 }
3778
9d7608b7
KH
3779 specbind (Qinhibit_quit, Qt);
3780
0a4469c9 3781 obuffer = Fmarker_buffer (OVERLAY_START (overlay));
5c4f68f1 3782 b = XBUFFER (buffer);
8801a864 3783 ob = BUFFERP (obuffer) ? XBUFFER (obuffer) : (struct buffer *) 0;
2eec3b4e 3784
c82ed728 3785 /* If the overlay has changed buffers, do a thorough redisplay. */
0a4469c9 3786 if (!EQ (buffer, obuffer))
50760c4a
RS
3787 {
3788 /* Redisplay where the overlay was. */
3789 if (!NILP (obuffer))
3790 {
2e34157c
RS
3791 int o_beg;
3792 int o_end;
50760c4a 3793
80509f2f
RS
3794 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3795 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
50760c4a 3796
2e34157c 3797 modify_overlay (ob, o_beg, o_end);
50760c4a
RS
3798 }
3799
3800 /* Redisplay where the overlay is going to be. */
876aa27c 3801 modify_overlay (b, XINT (beg), XINT (end));
50760c4a 3802 }
c82ed728
JB
3803 else
3804 /* Redisplay the area the overlay has just left, or just enclosed. */
3805 {
2e34157c 3806 int o_beg, o_end;
c82ed728 3807
80509f2f
RS
3808 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
3809 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
c82ed728 3810
2e34157c
RS
3811 if (o_beg == XINT (beg))
3812 modify_overlay (b, o_end, XINT (end));
3813 else if (o_end == XINT (end))
3814 modify_overlay (b, o_beg, XINT (beg));
c82ed728
JB
3815 else
3816 {
2e34157c
RS
3817 if (XINT (beg) < o_beg) o_beg = XINT (beg);
3818 if (XINT (end) > o_end) o_end = XINT (end);
3819 modify_overlay (b, o_beg, o_end);
c82ed728
JB
3820 }
3821 }
b61982dd 3822
0a4469c9
RS
3823 if (!NILP (obuffer))
3824 {
2410d73a
SM
3825 ob->overlays_before
3826 = unchain_overlay (ob->overlays_before, XOVERLAY (overlay));
3827 ob->overlays_after
3828 = unchain_overlay (ob->overlays_after, XOVERLAY (overlay));
3829 eassert (XOVERLAY (overlay)->next == NULL);
0a4469c9 3830 }
5c4f68f1
JB
3831
3832 Fset_marker (OVERLAY_START (overlay), beg, buffer);
3833 Fset_marker (OVERLAY_END (overlay), end, buffer);
2eec3b4e 3834
177c0ea7 3835 /* Put the overlay on the wrong list. */
2eec3b4e 3836 end = OVERLAY_END (overlay);
c2d5b10f 3837 if (OVERLAY_POSITION (end) < b->overlay_center)
2410d73a 3838 {
2f297815
GM
3839 XOVERLAY (overlay)->next = b->overlays_after;
3840 b->overlays_after = XOVERLAY (overlay);
2410d73a 3841 }
2eec3b4e 3842 else
2410d73a 3843 {
2f297815
GM
3844 XOVERLAY (overlay)->next = b->overlays_before;
3845 b->overlays_before = XOVERLAY (overlay);
2410d73a 3846 }
2eec3b4e
RS
3847
3848 /* This puts it in the right list, and in the right order. */
c2d5b10f 3849 recenter_overlay_lists (b, b->overlay_center);
2eec3b4e 3850
0a4469c9 3851 return unbind_to (count, overlay);
2eec3b4e
RS
3852}
3853
3854DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
7ee72033
MB
3855 doc: /* Delete the overlay OVERLAY from its buffer. */)
3856 (overlay)
5c4f68f1 3857 Lisp_Object overlay;
2eec3b4e 3858{
0a4469c9 3859 Lisp_Object buffer;
5c4f68f1 3860 struct buffer *b;
aed13378 3861 int count = SPECPDL_INDEX ();
5c4f68f1 3862
b7826503 3863 CHECK_OVERLAY (overlay);
52f8ec73 3864
0a4469c9
RS
3865 buffer = Fmarker_buffer (OVERLAY_START (overlay));
3866 if (NILP (buffer))
3867 return Qnil;
3868
3869 b = XBUFFER (buffer);
0a4469c9 3870 specbind (Qinhibit_quit, Qt);
177c0ea7 3871
2410d73a
SM
3872 b->overlays_before = unchain_overlay (b->overlays_before,XOVERLAY (overlay));
3873 b->overlays_after = unchain_overlay (b->overlays_after, XOVERLAY (overlay));
3874 eassert (XOVERLAY (overlay)->next == NULL);
876aa27c 3875 modify_overlay (b,
8231a9aa
RS
3876 marker_position (OVERLAY_START (overlay)),
3877 marker_position (OVERLAY_END (overlay)));
3ece337a
JB
3878 Fset_marker (OVERLAY_START (overlay), Qnil, Qnil);
3879 Fset_marker (OVERLAY_END (overlay), Qnil, Qnil);
3880
e58c389d 3881 /* When deleting an overlay with before or after strings, turn off
26f545d7
GM
3882 display optimizations for the affected buffer, on the basis that
3883 these strings may contain newlines. This is easier to do than to
3884 check for that situation during redisplay. */
3885 if (!windows_or_buffers_changed
3886 && (!NILP (Foverlay_get (overlay, Qbefore_string))
3887 || !NILP (Foverlay_get (overlay, Qafter_string))))
3888 b->prevent_redisplay_optimizations_p = 1;
3889
0a4469c9 3890 return unbind_to (count, Qnil);
2eec3b4e
RS
3891}
3892\f
8ebafa8d
JB
3893/* Overlay dissection functions. */
3894
3895DEFUN ("overlay-start", Foverlay_start, Soverlay_start, 1, 1, 0,
7ee72033
MB
3896 doc: /* Return the position at which OVERLAY starts. */)
3897 (overlay)
8ebafa8d
JB
3898 Lisp_Object overlay;
3899{
b7826503 3900 CHECK_OVERLAY (overlay);
8ebafa8d
JB
3901
3902 return (Fmarker_position (OVERLAY_START (overlay)));
3903}
3904
3905DEFUN ("overlay-end", Foverlay_end, Soverlay_end, 1, 1, 0,
7ee72033
MB
3906 doc: /* Return the position at which OVERLAY ends. */)
3907 (overlay)
8ebafa8d
JB
3908 Lisp_Object overlay;
3909{
b7826503 3910 CHECK_OVERLAY (overlay);
8ebafa8d
JB
3911
3912 return (Fmarker_position (OVERLAY_END (overlay)));
3913}
3914
3915DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0,
563f7128
LK
3916 doc: /* Return the buffer OVERLAY belongs to.
3917Return nil if OVERLAY has been deleted. */)
7ee72033 3918 (overlay)
8ebafa8d
JB
3919 Lisp_Object overlay;
3920{
b7826503 3921 CHECK_OVERLAY (overlay);
8ebafa8d
JB
3922
3923 return Fmarker_buffer (OVERLAY_START (overlay));
3924}
3925
3926DEFUN ("overlay-properties", Foverlay_properties, Soverlay_properties, 1, 1, 0,
7ee72033 3927 doc: /* Return a list of the properties on OVERLAY.
018ba359 3928This is a copy of OVERLAY's plist; modifying its conses has no effect on
7ee72033
MB
3929OVERLAY. */)
3930 (overlay)
8ebafa8d
JB
3931 Lisp_Object overlay;
3932{
b7826503 3933 CHECK_OVERLAY (overlay);
8ebafa8d 3934
48e2e3ba 3935 return Fcopy_sequence (XOVERLAY (overlay)->plist);
8ebafa8d
JB
3936}
3937
3938\f
2eec3b4e 3939DEFUN ("overlays-at", Foverlays_at, Soverlays_at, 1, 1, 0,
7ee72033
MB
3940 doc: /* Return a list of the overlays that contain position POS. */)
3941 (pos)
2eec3b4e
RS
3942 Lisp_Object pos;
3943{
3944 int noverlays;
2eec3b4e
RS
3945 Lisp_Object *overlay_vec;
3946 int len;
3947 Lisp_Object result;
3948
b7826503 3949 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e
RS
3950
3951 len = 10;
a9800ae8 3952 /* We can't use alloca here because overlays_at can call xrealloc. */
2eec3b4e
RS
3953 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
3954
3955 /* Put all the overlays we want in a vector in overlay_vec.
3956 Store the length in len. */
2a77a7d7 3957 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
ac869cf7 3958 (int *) 0, (int *) 0, 0);
2eec3b4e
RS
3959
3960 /* Make a list of them all. */
3961 result = Flist (noverlays, overlay_vec);
3962
9ac0d9e0 3963 xfree (overlay_vec);
2eec3b4e
RS
3964 return result;
3965}
3966
74514898 3967DEFUN ("overlays-in", Foverlays_in, Soverlays_in, 2, 2, 0,
7ee72033 3968 doc: /* Return a list of the overlays that overlap the region BEG ... END.
018ba359
PJ
3969Overlap means that at least one character is contained within the overlay
3970and also contained within the specified region.
3971Empty overlays are included in the result if they are located at BEG
7ee72033
MB
3972or between BEG and END. */)
3973 (beg, end)
74514898
RS
3974 Lisp_Object beg, end;
3975{
3976 int noverlays;
3977 Lisp_Object *overlay_vec;
3978 int len;
3979 Lisp_Object result;
3980
b7826503
PJ
3981 CHECK_NUMBER_COERCE_MARKER (beg);
3982 CHECK_NUMBER_COERCE_MARKER (end);
74514898
RS
3983
3984 len = 10;
3985 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
3986
3987 /* Put all the overlays we want in a vector in overlay_vec.
3988 Store the length in len. */
3989 noverlays = overlays_in (XINT (beg), XINT (end), 1, &overlay_vec, &len,
3990 (int *) 0, (int *) 0);
3991
3992 /* Make a list of them all. */
3993 result = Flist (noverlays, overlay_vec);
3994
3995 xfree (overlay_vec);
3996 return result;
3997}
3998
2eec3b4e 3999DEFUN ("next-overlay-change", Fnext_overlay_change, Snext_overlay_change,
efc7e75f 4000 1, 1, 0,
7ee72033 4001 doc: /* Return the next position after POS where an overlay starts or ends.
624d2678
RS
4002If there are no overlay boundaries from POS to (point-max),
4003the value is (point-max). */)
7ee72033 4004 (pos)
2eec3b4e
RS
4005 Lisp_Object pos;
4006{
4007 int noverlays;
4008 int endpos;
4009 Lisp_Object *overlay_vec;
4010 int len;
2eec3b4e
RS
4011 int i;
4012
b7826503 4013 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e
RS
4014
4015 len = 10;
4016 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
4017
4018 /* Put all the overlays we want in a vector in overlay_vec.
4019 Store the length in len.
4020 endpos gets the position where the next overlay starts. */
2a77a7d7 4021 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
ac869cf7 4022 &endpos, (int *) 0, 1);
2eec3b4e
RS
4023
4024 /* If any of these overlays ends before endpos,
4025 use its ending point instead. */
4026 for (i = 0; i < noverlays; i++)
4027 {
4028 Lisp_Object oend;
4029 int oendpos;
4030
4031 oend = OVERLAY_END (overlay_vec[i]);
4032 oendpos = OVERLAY_POSITION (oend);
4033 if (oendpos < endpos)
4034 endpos = oendpos;
1ab256cb
RM
4035 }
4036
9ac0d9e0 4037 xfree (overlay_vec);
2eec3b4e
RS
4038 return make_number (endpos);
4039}
239c932b
RS
4040
4041DEFUN ("previous-overlay-change", Fprevious_overlay_change,
4042 Sprevious_overlay_change, 1, 1, 0,
7ee72033 4043 doc: /* Return the previous position before POS where an overlay starts or ends.
624d2678
RS
4044If there are no overlay boundaries from (point-min) to POS,
4045the value is (point-min). */)
7ee72033 4046 (pos)
239c932b
RS
4047 Lisp_Object pos;
4048{
4049 int noverlays;
4050 int prevpos;
4051 Lisp_Object *overlay_vec;
4052 int len;
239c932b 4053
b7826503 4054 CHECK_NUMBER_COERCE_MARKER (pos);
239c932b 4055
624bbdc4
RS
4056 /* At beginning of buffer, we know the answer;
4057 avoid bug subtracting 1 below. */
4058 if (XINT (pos) == BEGV)
4059 return pos;
4060
017f0539
GM
4061 len = 10;
4062 overlay_vec = (Lisp_Object *) xmalloc (len * sizeof (Lisp_Object));
4063
239c932b
RS
4064 /* Put all the overlays we want in a vector in overlay_vec.
4065 Store the length in len.
daa1c109 4066 prevpos gets the position of the previous change. */
2a77a7d7 4067 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
ac869cf7 4068 (int *) 0, &prevpos, 1);
239c932b 4069
239c932b
RS
4070 xfree (overlay_vec);
4071 return make_number (prevpos);
4072}
2eec3b4e
RS
4073\f
4074/* These functions are for debugging overlays. */
4075
4076DEFUN ("overlay-lists", Foverlay_lists, Soverlay_lists, 0, 0, 0,
7ee72033 4077 doc: /* Return a pair of lists giving all the overlays of the current buffer.
018ba359
PJ
4078The car has all the overlays before the overlay center;
4079the cdr has all the overlays after the overlay center.
4080Recentering overlays moves overlays between these lists.
4081The lists you get are copies, so that changing them has no effect.
7ee72033
MB
4082However, the overlays you get are the real objects that the buffer uses. */)
4083 ()
2eec3b4e 4084{
2410d73a
SM
4085 struct Lisp_Overlay *ol;
4086 Lisp_Object before = Qnil, after = Qnil, tmp;
4087 for (ol = current_buffer->overlays_before; ol; ol = ol->next)
4088 {
4089 XSETMISC (tmp, ol);
4090 before = Fcons (tmp, before);
4091 }
4092 for (ol = current_buffer->overlays_after; ol; ol = ol->next)
4093 {
4094 XSETMISC (tmp, ol);
4095 after = Fcons (tmp, after);
4096 }
4097 return Fcons (Fnreverse (before), Fnreverse (after));
2eec3b4e
RS
4098}
4099
4100DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0,
c87426c5
RS
4101 doc: /* Recenter the overlays of the current buffer around position POS.
4102That makes overlay lookup faster for positions near POS (but perhaps slower
4103for positions far away from POS). */)
7ee72033 4104 (pos)
2eec3b4e
RS
4105 Lisp_Object pos;
4106{
b7826503 4107 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e 4108
5c4f68f1 4109 recenter_overlay_lists (current_buffer, XINT (pos));
2eec3b4e
RS
4110 return Qnil;
4111}
4112\f
4113DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
7ee72033
MB
4114 doc: /* Get the property of overlay OVERLAY with property name PROP. */)
4115 (overlay, prop)
2eec3b4e
RS
4116 Lisp_Object overlay, prop;
4117{
b7826503 4118 CHECK_OVERLAY (overlay);
9a593927 4119 return lookup_char_property (XOVERLAY (overlay)->plist, prop, 0);
2eec3b4e
RS
4120}
4121
4122DEFUN ("overlay-put", Foverlay_put, Soverlay_put, 3, 3, 0,
7ee72033
MB
4123 doc: /* Set one property of overlay OVERLAY: give property PROP value VALUE. */)
4124 (overlay, prop, value)
2eec3b4e
RS
4125 Lisp_Object overlay, prop, value;
4126{
48e2e3ba 4127 Lisp_Object tail, buffer;
9d7608b7 4128 int changed;
2eec3b4e 4129
b7826503 4130 CHECK_OVERLAY (overlay);
b61982dd 4131
274a9425
RS
4132 buffer = Fmarker_buffer (OVERLAY_START (overlay));
4133
48e2e3ba 4134 for (tail = XOVERLAY (overlay)->plist;
7539e11f
KR
4135 CONSP (tail) && CONSP (XCDR (tail));
4136 tail = XCDR (XCDR (tail)))
4137 if (EQ (XCAR (tail), prop))
274a9425 4138 {
7539e11f 4139 changed = !EQ (XCAR (XCDR (tail)), value);
f3fbd155 4140 XSETCAR (XCDR (tail), value);
9d7608b7 4141 goto found;
274a9425 4142 }
9d7608b7
KH
4143 /* It wasn't in the list, so add it to the front. */
4144 changed = !NILP (value);
48e2e3ba
KH
4145 XOVERLAY (overlay)->plist
4146 = Fcons (prop, Fcons (value, XOVERLAY (overlay)->plist));
9d7608b7
KH
4147 found:
4148 if (! NILP (buffer))
4149 {
4150 if (changed)
876aa27c 4151 modify_overlay (XBUFFER (buffer),
26f545d7
GM
4152 marker_position (OVERLAY_START (overlay)),
4153 marker_position (OVERLAY_END (overlay)));
9d7608b7
KH
4154 if (EQ (prop, Qevaporate) && ! NILP (value)
4155 && (OVERLAY_POSITION (OVERLAY_START (overlay))
4156 == OVERLAY_POSITION (OVERLAY_END (overlay))))
4157 Fdelete_overlay (overlay);
4158 }
7d63db98 4159
2eec3b4e 4160 return value;
1ab256cb
RM
4161}
4162\f
9115729e
KH
4163/* Subroutine of report_overlay_modification. */
4164
4165/* Lisp vector holding overlay hook functions to call.
4166 Vector elements come in pairs.
4167 Each even-index element is a list of hook functions.
4168 The following odd-index element is the overlay they came from.
4169
4170 Before the buffer change, we fill in this vector
4171 as we call overlay hook functions.
4172 After the buffer change, we get the functions to call from this vector.
4173 This way we always call the same functions before and after the change. */
4174static Lisp_Object last_overlay_modification_hooks;
4175
4176/* Number of elements actually used in last_overlay_modification_hooks. */
4177static int last_overlay_modification_hooks_used;
4178
4179/* Add one functionlist/overlay pair
4180 to the end of last_overlay_modification_hooks. */
4181
4182static void
4183add_overlay_mod_hooklist (functionlist, overlay)
4184 Lisp_Object functionlist, overlay;
4185{
4186 int oldsize = XVECTOR (last_overlay_modification_hooks)->size;
4187
4188 if (last_overlay_modification_hooks_used == oldsize)
4189 {
4190 Lisp_Object old;
4191 old = last_overlay_modification_hooks;
4192 last_overlay_modification_hooks
4193 = Fmake_vector (make_number (oldsize * 2), Qnil);
0b1f1b09
RS
4194 bcopy (XVECTOR (old)->contents,
4195 XVECTOR (last_overlay_modification_hooks)->contents,
9115729e
KH
4196 sizeof (Lisp_Object) * oldsize);
4197 }
2410d73a
SM
4198 AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = functionlist;
4199 AREF (last_overlay_modification_hooks, last_overlay_modification_hooks_used++) = overlay;
9115729e
KH
4200}
4201\f
173f2a64
RS
4202/* Run the modification-hooks of overlays that include
4203 any part of the text in START to END.
9115729e
KH
4204 If this change is an insertion, also
4205 run the insert-before-hooks of overlay starting at END,
930a9140
RS
4206 and the insert-after-hooks of overlay ending at START.
4207
4208 This is called both before and after the modification.
4209 AFTER is nonzero when we call after the modification.
4210
9115729e
KH
4211 ARG1, ARG2, ARG3 are arguments to pass to the hook functions.
4212 When AFTER is nonzero, they are the start position,
4213 the position after the inserted new text,
4214 and the length of deleted or replaced old text. */
173f2a64
RS
4215
4216void
930a9140 4217report_overlay_modification (start, end, after, arg1, arg2, arg3)
173f2a64 4218 Lisp_Object start, end;
930a9140
RS
4219 int after;
4220 Lisp_Object arg1, arg2, arg3;
173f2a64 4221{
2410d73a
SM
4222 Lisp_Object prop, overlay;
4223 struct Lisp_Overlay *tail;
9115729e
KH
4224 /* 1 if this change is an insertion. */
4225 int insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end));
a615c6dc 4226 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
55b48893
RS
4227
4228 overlay = Qnil;
2410d73a 4229 tail = NULL;
9115729e 4230
27c6b98e
SM
4231 /* We used to run the functions as soon as we found them and only register
4232 them in last_overlay_modification_hooks for the purpose of the `after'
4233 case. But running elisp code as we traverse the list of overlays is
4234 painful because the list can be modified by the elisp code so we had to
4235 copy at several places. We now simply do a read-only traversal that
4236 only collects the functions to run and we run them afterwards. It's
4237 simpler, especially since all the code was already there. -stef */
4238
a615c6dc 4239 if (!after)
173f2a64 4240 {
a615c6dc
SM
4241 /* We are being called before a change.
4242 Scan the overlays to find the functions to call. */
4243 last_overlay_modification_hooks_used = 0;
2410d73a 4244 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
173f2a64 4245 {
a615c6dc
SM
4246 int startpos, endpos;
4247 Lisp_Object ostart, oend;
4248
2410d73a 4249 XSETMISC (overlay, tail);
a615c6dc
SM
4250
4251 ostart = OVERLAY_START (overlay);
4252 oend = OVERLAY_END (overlay);
4253 endpos = OVERLAY_POSITION (oend);
4254 if (XFASTINT (start) > endpos)
4255 break;
4256 startpos = OVERLAY_POSITION (ostart);
4257 if (insertion && (XFASTINT (start) == startpos
4258 || XFASTINT (end) == startpos))
5fb5aa33 4259 {
a615c6dc
SM
4260 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
4261 if (!NILP (prop))
4262 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4263 }
a615c6dc
SM
4264 if (insertion && (XFASTINT (start) == endpos
4265 || XFASTINT (end) == endpos))
5fb5aa33 4266 {
a615c6dc
SM
4267 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
4268 if (!NILP (prop))
4269 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4270 }
a615c6dc
SM
4271 /* Test for intersecting intervals. This does the right thing
4272 for both insertion and deletion. */
4273 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
5fb5aa33 4274 {
a615c6dc
SM
4275 prop = Foverlay_get (overlay, Qmodification_hooks);
4276 if (!NILP (prop))
4277 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4278 }
173f2a64 4279 }
60ebfdf3 4280
2410d73a 4281 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
173f2a64 4282 {
a615c6dc
SM
4283 int startpos, endpos;
4284 Lisp_Object ostart, oend;
4285
2410d73a 4286 XSETMISC (overlay, tail);
a615c6dc
SM
4287
4288 ostart = OVERLAY_START (overlay);
4289 oend = OVERLAY_END (overlay);
4290 startpos = OVERLAY_POSITION (ostart);
4291 endpos = OVERLAY_POSITION (oend);
4292 if (XFASTINT (end) < startpos)
4293 break;
4294 if (insertion && (XFASTINT (start) == startpos
4295 || XFASTINT (end) == startpos))
5fb5aa33 4296 {
a615c6dc
SM
4297 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
4298 if (!NILP (prop))
4299 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4300 }
a615c6dc
SM
4301 if (insertion && (XFASTINT (start) == endpos
4302 || XFASTINT (end) == endpos))
5fb5aa33 4303 {
a615c6dc
SM
4304 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
4305 if (!NILP (prop))
4306 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4307 }
a615c6dc
SM
4308 /* Test for intersecting intervals. This does the right thing
4309 for both insertion and deletion. */
4310 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
5fb5aa33 4311 {
a615c6dc
SM
4312 prop = Foverlay_get (overlay, Qmodification_hooks);
4313 if (!NILP (prop))
4314 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4315 }
173f2a64
RS
4316 }
4317 }
55b48893 4318
a615c6dc
SM
4319 GCPRO4 (overlay, arg1, arg2, arg3);
4320 {
4321 /* Call the functions recorded in last_overlay_modification_hooks.
4322 First copy the vector contents, in case some of these hooks
4323 do subsequent modification of the buffer. */
4324 int size = last_overlay_modification_hooks_used;
4325 Lisp_Object *copy = (Lisp_Object *) alloca (size * sizeof (Lisp_Object));
4326 int i;
4327
4328 bcopy (XVECTOR (last_overlay_modification_hooks)->contents,
4329 copy, size * sizeof (Lisp_Object));
4330 gcpro1.var = copy;
4331 gcpro1.nvars = size;
4332
4333 for (i = 0; i < size;)
4334 {
4335 Lisp_Object prop, overlay;
4336 prop = copy[i++];
4337 overlay = copy[i++];
4338 call_overlay_mod_hooks (prop, overlay, after, arg1, arg2, arg3);
4339 }
4340 }
55b48893 4341 UNGCPRO;
173f2a64
RS
4342}
4343
4344static void
930a9140
RS
4345call_overlay_mod_hooks (list, overlay, after, arg1, arg2, arg3)
4346 Lisp_Object list, overlay;
4347 int after;
4348 Lisp_Object arg1, arg2, arg3;
173f2a64 4349{
930a9140 4350 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
9115729e 4351
930a9140 4352 GCPRO4 (list, arg1, arg2, arg3);
9115729e 4353
6d70a280 4354 while (CONSP (list))
173f2a64 4355 {
930a9140 4356 if (NILP (arg3))
6d70a280 4357 call4 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2);
930a9140 4358 else
6d70a280
SM
4359 call5 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2, arg3);
4360 list = XCDR (list);
173f2a64
RS
4361 }
4362 UNGCPRO;
4363}
9d7608b7
KH
4364
4365/* Delete any zero-sized overlays at position POS, if the `evaporate'
4366 property is set. */
4367void
4368evaporate_overlays (pos)
c2d5b10f 4369 EMACS_INT pos;
9d7608b7 4370{
2410d73a
SM
4371 Lisp_Object overlay, hit_list;
4372 struct Lisp_Overlay *tail;
9d7608b7
KH
4373
4374 hit_list = Qnil;
c2d5b10f 4375 if (pos <= current_buffer->overlay_center)
2410d73a 4376 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
9d7608b7
KH
4377 {
4378 int endpos;
2410d73a 4379 XSETMISC (overlay, tail);
9d7608b7
KH
4380 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
4381 if (endpos < pos)
4382 break;
4383 if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos
c3935f9d 4384 && ! NILP (Foverlay_get (overlay, Qevaporate)))
9d7608b7
KH
4385 hit_list = Fcons (overlay, hit_list);
4386 }
4387 else
2410d73a 4388 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
9d7608b7
KH
4389 {
4390 int startpos;
2410d73a 4391 XSETMISC (overlay, tail);
9d7608b7
KH
4392 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
4393 if (startpos > pos)
4394 break;
4395 if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos
c3935f9d 4396 && ! NILP (Foverlay_get (overlay, Qevaporate)))
9d7608b7
KH
4397 hit_list = Fcons (overlay, hit_list);
4398 }
7539e11f
KR
4399 for (; CONSP (hit_list); hit_list = XCDR (hit_list))
4400 Fdelete_overlay (XCAR (hit_list));
9d7608b7 4401}
173f2a64 4402\f
54dfdeb0 4403/* Somebody has tried to store a value with an unacceptable type
1bf08baf
KH
4404 in the slot with offset OFFSET. */
4405
0fa3ba92 4406void
54dfdeb0
KH
4407buffer_slot_type_mismatch (offset)
4408 int offset;
0fa3ba92 4409{
54dfdeb0 4410 Lisp_Object sym;
0fa3ba92 4411 char *type_name;
177c0ea7 4412
7313acd0 4413 switch (XINT (PER_BUFFER_TYPE (offset)))
0fa3ba92 4414 {
7c02e886
GM
4415 case Lisp_Int:
4416 type_name = "integers";
4417 break;
177c0ea7 4418
7c02e886
GM
4419 case Lisp_String:
4420 type_name = "strings";
4421 break;
177c0ea7 4422
7c02e886
GM
4423 case Lisp_Symbol:
4424 type_name = "symbols";
4425 break;
177c0ea7 4426
0fa3ba92
JB
4427 default:
4428 abort ();
4429 }
4430
7313acd0 4431 sym = PER_BUFFER_SYMBOL (offset);
1bf08baf 4432 error ("Only %s should be stored in the buffer-local variable %s",
d5db4077 4433 type_name, SDATA (SYMBOL_NAME (sym)));
0fa3ba92 4434}
7c02e886 4435
0fa3ba92 4436\f
b86af064
GM
4437/***********************************************************************
4438 Allocation with mmap
4439 ***********************************************************************/
4440
4441#ifdef USE_MMAP_FOR_BUFFERS
4442
4443#include <sys/types.h>
4444#include <sys/mman.h>
4445
4446#ifndef MAP_ANON
4447#ifdef MAP_ANONYMOUS
4448#define MAP_ANON MAP_ANONYMOUS
4449#else
4450#define MAP_ANON 0
4451#endif
4452#endif
4453
09dfdf85
GM
4454#ifndef MAP_FAILED
4455#define MAP_FAILED ((void *) -1)
4456#endif
4457
b86af064
GM
4458#include <stdio.h>
4459#include <errno.h>
4460
4461#if MAP_ANON == 0
4462#include <fcntl.h>
4463#endif
4464
4465#include "coding.h"
4466
4467
4468/* Memory is allocated in regions which are mapped using mmap(2).
4469 The current implementation lets the system select mapped
4470 addresses; we're not using MAP_FIXED in general, except when
4471 trying to enlarge regions.
4472
4473 Each mapped region starts with a mmap_region structure, the user
4474 area starts after that structure, aligned to MEM_ALIGN.
4475
4476 +-----------------------+
4477 | struct mmap_info + |
4478 | padding |
4479 +-----------------------+
4480 | user data |
4481 | |
4482 | |
4483 +-----------------------+ */
4484
4485struct mmap_region
4486{
4487 /* User-specified size. */
4488 size_t nbytes_specified;
177c0ea7 4489
b86af064
GM
4490 /* Number of bytes mapped */
4491 size_t nbytes_mapped;
4492
4493 /* Pointer to the location holding the address of the memory
4494 allocated with the mmap'd block. The variable actually points
4495 after this structure. */
4496 POINTER_TYPE **var;
4497
4498 /* Next and previous in list of all mmap'd regions. */
4499 struct mmap_region *next, *prev;
4500};
4501
4502/* Doubly-linked list of mmap'd regions. */
4503
4504static struct mmap_region *mmap_regions;
4505
4506/* File descriptor for mmap. If we don't have anonymous mapping,
4507 /dev/zero will be opened on it. */
4508
4509static int mmap_fd;
4510
4511/* Temporary storage for mmap_set_vars, see there. */
4512
4513static struct mmap_region *mmap_regions_1;
4514static int mmap_fd_1;
4515
4516/* Page size on this system. */
4517
4518static int mmap_page_size;
4519
4520/* 1 means mmap has been intialized. */
4521
4522static int mmap_initialized_p;
4523
4524/* Value is X rounded up to the next multiple of N. */
4525
4526#define ROUND(X, N) (((X) + (N) - 1) / (N) * (N))
4527
4528/* Size of mmap_region structure plus padding. */
4529
4530#define MMAP_REGION_STRUCT_SIZE \
4531 ROUND (sizeof (struct mmap_region), MEM_ALIGN)
4532
4533/* Given a pointer P to the start of the user-visible part of a mapped
4534 region, return a pointer to the start of the region. */
4535
4536#define MMAP_REGION(P) \
4537 ((struct mmap_region *) ((char *) (P) - MMAP_REGION_STRUCT_SIZE))
4538
4539/* Given a pointer P to the start of a mapped region, return a pointer
4540 to the start of the user-visible part of the region. */
4541
4542#define MMAP_USER_AREA(P) \
4543 ((POINTER_TYPE *) ((char *) (P) + MMAP_REGION_STRUCT_SIZE))
4544
4545#define MEM_ALIGN sizeof (double)
4546
7273faa1
DL
4547/* Predicate returning true if part of the address range [START .. END]
4548 is currently mapped. Used to prevent overwriting an existing
08327b22
GM
4549 memory mapping.
4550
4551 Default is to conservativly assume the address range is occupied by
4552 something else. This can be overridden by system configuration
4553 files if system-specific means to determine this exists. */
4554
4555#ifndef MMAP_ALLOCATED_P
4556#define MMAP_ALLOCATED_P(start, end) 1
4557#endif
4558
b86af064
GM
4559/* Function prototypes. */
4560
4561static int mmap_free_1 P_ ((struct mmap_region *));
4562static int mmap_enlarge P_ ((struct mmap_region *, int));
4563static struct mmap_region *mmap_find P_ ((POINTER_TYPE *, POINTER_TYPE *));
4564static POINTER_TYPE *mmap_alloc P_ ((POINTER_TYPE **, size_t));
4565static POINTER_TYPE *mmap_realloc P_ ((POINTER_TYPE **, size_t));
4566static void mmap_free P_ ((POINTER_TYPE **ptr));
4567static void mmap_init P_ ((void));
4568
4569
4570/* Return a region overlapping address range START...END, or null if
4571 none. END is not including, i.e. the last byte in the range
4572 is at END - 1. */
4573
4574static struct mmap_region *
4575mmap_find (start, end)
4576 POINTER_TYPE *start, *end;
4577{
4578 struct mmap_region *r;
4579 char *s = (char *) start, *e = (char *) end;
177c0ea7 4580
b86af064
GM
4581 for (r = mmap_regions; r; r = r->next)
4582 {
4583 char *rstart = (char *) r;
4584 char *rend = rstart + r->nbytes_mapped;
4585
4586 if (/* First byte of range, i.e. START, in this region? */
4587 (s >= rstart && s < rend)
4588 /* Last byte of range, i.e. END - 1, in this region? */
4589 || (e > rstart && e <= rend)
4590 /* First byte of this region in the range? */
4591 || (rstart >= s && rstart < e)
4592 /* Last byte of this region in the range? */
4593 || (rend > s && rend <= e))
4594 break;
4595 }
4596
4597 return r;
4598}
4599
4600
4601/* Unmap a region. P is a pointer to the start of the user-araa of
4602 the region. Value is non-zero if successful. */
4603
4604static int
4605mmap_free_1 (r)
4606 struct mmap_region *r;
4607{
4608 if (r->next)
4609 r->next->prev = r->prev;
4610 if (r->prev)
4611 r->prev->next = r->next;
4612 else
4613 mmap_regions = r->next;
177c0ea7 4614
1a15cca0 4615 if (munmap ((POINTER_TYPE *) r, r->nbytes_mapped) == -1)
b86af064
GM
4616 {
4617 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
4618 return 0;
4619 }
4620
4621 return 1;
4622}
4623
4624
4625/* Enlarge region R by NPAGES pages. NPAGES < 0 means shrink R.
4626 Value is non-zero if successful. */
4627
4628static int
4629mmap_enlarge (r, npages)
4630 struct mmap_region *r;
4631 int npages;
4632{
4633 char *region_end = (char *) r + r->nbytes_mapped;
4634 size_t nbytes;
4635 int success = 0;
4636
4637 if (npages < 0)
4638 {
4639 /* Unmap pages at the end of the region. */
4640 nbytes = - npages * mmap_page_size;
4641 if (munmap (region_end - nbytes, nbytes) == -1)
4642 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
4643 else
4644 {
4645 r->nbytes_mapped -= nbytes;
4646 success = 1;
4647 }
4648 }
4649 else if (npages > 0)
4650 {
b86af064 4651 nbytes = npages * mmap_page_size;
177c0ea7 4652
b86af064
GM
4653 /* Try to map additional pages at the end of the region. We
4654 cannot do this if the address range is already occupied by
4655 something else because mmap deletes any previous mapping.
4656 I'm not sure this is worth doing, let's see. */
08327b22 4657 if (!MMAP_ALLOCATED_P (region_end, region_end + nbytes))
b86af064
GM
4658 {
4659 POINTER_TYPE *p;
177c0ea7 4660
b86af064
GM
4661 p = mmap (region_end, nbytes, PROT_READ | PROT_WRITE,
4662 MAP_ANON | MAP_PRIVATE | MAP_FIXED, mmap_fd, 0);
4663 if (p == MAP_FAILED)
edaa9aed 4664 ; /* fprintf (stderr, "mmap: %s\n", emacs_strerror (errno)); */
b86af064
GM
4665 else if (p != (POINTER_TYPE *) region_end)
4666 {
4667 /* Kernels are free to choose a different address. In
4668 that case, unmap what we've mapped above; we have
4669 no use for it. */
4670 if (munmap (p, nbytes) == -1)
4671 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
4672 }
4673 else
4674 {
4675 r->nbytes_mapped += nbytes;
4676 success = 1;
4677 }
4678 }
4679 }
4680
4681 return success;
4682}
4683
4684
4685/* Set or reset variables holding references to mapped regions. If
4686 RESTORE_P is zero, set all variables to null. If RESTORE_P is
4687 non-zero, set all variables to the start of the user-areas
4688 of mapped regions.
4689
4690 This function is called from Fdump_emacs to ensure that the dumped
4691 Emacs doesn't contain references to memory that won't be mapped
4692 when Emacs starts. */
4693
4694void
4695mmap_set_vars (restore_p)
4696 int restore_p;
4697{
4698 struct mmap_region *r;
4699
4700 if (restore_p)
4701 {
4702 mmap_regions = mmap_regions_1;
4703 mmap_fd = mmap_fd_1;
4704 for (r = mmap_regions; r; r = r->next)
4705 *r->var = MMAP_USER_AREA (r);
4706 }
4707 else
4708 {
4709 for (r = mmap_regions; r; r = r->next)
4710 *r->var = NULL;
4711 mmap_regions_1 = mmap_regions;
4712 mmap_regions = NULL;
4713 mmap_fd_1 = mmap_fd;
4714 mmap_fd = -1;
4715 }
4716}
4717
4718
4719/* Allocate a block of storage large enough to hold NBYTES bytes of
4720 data. A pointer to the data is returned in *VAR. VAR is thus the
4721 address of some variable which will use the data area.
4722
4723 The allocation of 0 bytes is valid.
4724
4725 If we can't allocate the necessary memory, set *VAR to null, and
4726 return null. */
4727
4728static POINTER_TYPE *
4729mmap_alloc (var, nbytes)
4730 POINTER_TYPE **var;
4731 size_t nbytes;
4732{
4733 void *p;
4734 size_t map;
4735
4736 mmap_init ();
4737
4738 map = ROUND (nbytes + MMAP_REGION_STRUCT_SIZE, mmap_page_size);
4739 p = mmap (NULL, map, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
4740 mmap_fd, 0);
177c0ea7 4741
b86af064
GM
4742 if (p == MAP_FAILED)
4743 {
4744 if (errno != ENOMEM)
4745 fprintf (stderr, "mmap: %s\n", emacs_strerror (errno));
4746 p = NULL;
4747 }
4748 else
4749 {
4750 struct mmap_region *r = (struct mmap_region *) p;
177c0ea7 4751
b86af064
GM
4752 r->nbytes_specified = nbytes;
4753 r->nbytes_mapped = map;
4754 r->var = var;
4755 r->prev = NULL;
4756 r->next = mmap_regions;
4757 if (r->next)
4758 r->next->prev = r;
4759 mmap_regions = r;
177c0ea7 4760
b86af064
GM
4761 p = MMAP_USER_AREA (p);
4762 }
177c0ea7 4763
b86af064
GM
4764 return *var = p;
4765}
4766
4767
4768/* Given a pointer at address VAR to data allocated with mmap_alloc,
4769 resize it to size NBYTES. Change *VAR to reflect the new block,
4770 and return this value. If more memory cannot be allocated, then
4771 leave *VAR unchanged, and return null. */
4772
4773static POINTER_TYPE *
4774mmap_realloc (var, nbytes)
4775 POINTER_TYPE **var;
4776 size_t nbytes;
4777{
4778 POINTER_TYPE *result;
177c0ea7 4779
b86af064
GM
4780 mmap_init ();
4781
4782 if (*var == NULL)
4783 result = mmap_alloc (var, nbytes);
177c0ea7 4784 else if (nbytes == 0)
b86af064
GM
4785 {
4786 mmap_free (var);
4787 result = mmap_alloc (var, nbytes);
4788 }
4789 else
4790 {
4791 struct mmap_region *r = MMAP_REGION (*var);
4792 size_t room = r->nbytes_mapped - MMAP_REGION_STRUCT_SIZE;
177c0ea7 4793
b86af064
GM
4794 if (room < nbytes)
4795 {
4796 /* Must enlarge. */
4797 POINTER_TYPE *old_ptr = *var;
4798
4799 /* Try to map additional pages at the end of the region.
4800 If that fails, allocate a new region, copy data
4801 from the old region, then free it. */
4802 if (mmap_enlarge (r, (ROUND (nbytes - room, mmap_page_size)
4803 / mmap_page_size)))
4804 {
4805 r->nbytes_specified = nbytes;
4806 *var = result = old_ptr;
4807 }
4808 else if (mmap_alloc (var, nbytes))
4809 {
4810 bcopy (old_ptr, *var, r->nbytes_specified);
4811 mmap_free_1 (MMAP_REGION (old_ptr));
4812 result = *var;
4813 r = MMAP_REGION (result);
4814 r->nbytes_specified = nbytes;
4815 }
4816 else
4817 {
4818 *var = old_ptr;
4819 result = NULL;
4820 }
4821 }
4822 else if (room - nbytes >= mmap_page_size)
4823 {
4824 /* Shrinking by at least a page. Let's give some
6bcdeb8c
KR
4825 memory back to the system.
4826
4827 The extra parens are to make the division happens first,
4828 on positive values, so we know it will round towards
4829 zero. */
bb63c5c9 4830 mmap_enlarge (r, - ((room - nbytes) / mmap_page_size));
b86af064
GM
4831 result = *var;
4832 r->nbytes_specified = nbytes;
4833 }
4834 else
4835 {
4836 /* Leave it alone. */
4837 result = *var;
4838 r->nbytes_specified = nbytes;
4839 }
4840 }
4841
4842 return result;
4843}
4844
4845
4846/* Free a block of relocatable storage whose data is pointed to by
4847 PTR. Store 0 in *PTR to show there's no block allocated. */
4848
4849static void
4850mmap_free (var)
4851 POINTER_TYPE **var;
4852{
4853 mmap_init ();
177c0ea7 4854
b86af064
GM
4855 if (*var)
4856 {
4857 mmap_free_1 (MMAP_REGION (*var));
4858 *var = NULL;
4859 }
4860}
4861
4862
4863/* Perform necessary intializations for the use of mmap. */
4864
4865static void
4866mmap_init ()
4867{
4868#if MAP_ANON == 0
4869 /* The value of mmap_fd is initially 0 in temacs, and -1
4870 in a dumped Emacs. */
4871 if (mmap_fd <= 0)
4872 {
4873 /* No anonymous mmap -- we need the file descriptor. */
4874 mmap_fd = open ("/dev/zero", O_RDONLY);
4875 if (mmap_fd == -1)
4876 fatal ("Cannot open /dev/zero: %s", emacs_strerror (errno));
4877 }
4878#endif /* MAP_ANON == 0 */
4879
4880 if (mmap_initialized_p)
4881 return;
4882 mmap_initialized_p = 1;
177c0ea7 4883
b86af064
GM
4884#if MAP_ANON != 0
4885 mmap_fd = -1;
4886#endif
177c0ea7 4887
b86af064
GM
4888 mmap_page_size = getpagesize ();
4889}
4890
4891#endif /* USE_MMAP_FOR_BUFFERS */
4892
4893
4894\f
4895/***********************************************************************
4896 Buffer-text Allocation
4897 ***********************************************************************/
4898
4899#ifdef REL_ALLOC
4900extern POINTER_TYPE *r_alloc P_ ((POINTER_TYPE **, size_t));
4901extern POINTER_TYPE *r_re_alloc P_ ((POINTER_TYPE **, size_t));
4902extern void r_alloc_free P_ ((POINTER_TYPE **ptr));
4903#endif /* REL_ALLOC */
4904
4905
4906/* Allocate NBYTES bytes for buffer B's text buffer. */
4907
4908static void
4909alloc_buffer_text (b, nbytes)
4910 struct buffer *b;
4911 size_t nbytes;
4912{
4913 POINTER_TYPE *p;
177c0ea7 4914
b86af064
GM
4915 BLOCK_INPUT;
4916#if defined USE_MMAP_FOR_BUFFERS
4917 p = mmap_alloc ((POINTER_TYPE **) &b->text->beg, nbytes);
4918#elif defined REL_ALLOC
4919 p = r_alloc ((POINTER_TYPE **) &b->text->beg, nbytes);
4920#else
815add84 4921 p = xmalloc (nbytes);
b86af064 4922#endif
177c0ea7 4923
b86af064
GM
4924 if (p == NULL)
4925 {
4926 UNBLOCK_INPUT;
4927 memory_full ();
4928 }
4929
4930 b->text->beg = (unsigned char *) p;
4931 UNBLOCK_INPUT;
4932}
4933
4934/* Enlarge buffer B's text buffer by DELTA bytes. DELTA < 0 means
4935 shrink it. */
4936
4937void
4938enlarge_buffer_text (b, delta)
4939 struct buffer *b;
4940 int delta;
4941{
4942 POINTER_TYPE *p;
4943 size_t nbytes = (BUF_Z_BYTE (b) - BUF_BEG_BYTE (b) + BUF_GAP_SIZE (b) + 1
4944 + delta);
4945 BLOCK_INPUT;
4946#if defined USE_MMAP_FOR_BUFFERS
4947 p = mmap_realloc ((POINTER_TYPE **) &b->text->beg, nbytes);
4948#elif defined REL_ALLOC
4949 p = r_re_alloc ((POINTER_TYPE **) &b->text->beg, nbytes);
4950#else
4951 p = xrealloc (b->text->beg, nbytes);
4952#endif
177c0ea7 4953
b86af064
GM
4954 if (p == NULL)
4955 {
4956 UNBLOCK_INPUT;
4957 memory_full ();
4958 }
4959
4960 BUF_BEG_ADDR (b) = (unsigned char *) p;
4961 UNBLOCK_INPUT;
4962}
4963
4964
4965/* Free buffer B's text buffer. */
4966
4967static void
4968free_buffer_text (b)
4969 struct buffer *b;
4970{
4971 BLOCK_INPUT;
4972
4973#if defined USE_MMAP_FOR_BUFFERS
4974 mmap_free ((POINTER_TYPE **) &b->text->beg);
4975#elif defined REL_ALLOC
4976 r_alloc_free ((POINTER_TYPE **) &b->text->beg);
4977#else
4978 xfree (b->text->beg);
4979#endif
177c0ea7 4980
b86af064
GM
4981 BUF_BEG_ADDR (b) = NULL;
4982 UNBLOCK_INPUT;
4983}
4984
4985
4986\f
4987/***********************************************************************
4988 Initialization
4989 ***********************************************************************/
4990
dfcf069d 4991void
1ab256cb
RM
4992init_buffer_once ()
4993{
7c02e886
GM
4994 int idx;
4995
4996 bzero (buffer_permanent_local_flags, sizeof buffer_permanent_local_flags);
13de9290 4997
1ab256cb
RM
4998 /* Make sure all markable slots in buffer_defaults
4999 are initialized reasonably, so mark_buffer won't choke. */
5000 reset_buffer (&buffer_defaults);
13de9290 5001 reset_buffer_local_variables (&buffer_defaults, 1);
1ab256cb 5002 reset_buffer (&buffer_local_symbols);
13de9290 5003 reset_buffer_local_variables (&buffer_local_symbols, 1);
336cd056
RS
5004 /* Prevent GC from getting confused. */
5005 buffer_defaults.text = &buffer_defaults.own_text;
5006 buffer_local_symbols.text = &buffer_local_symbols.own_text;
336cd056
RS
5007 BUF_INTERVALS (&buffer_defaults) = 0;
5008 BUF_INTERVALS (&buffer_local_symbols) = 0;
67180c6a
KH
5009 XSETBUFFER (Vbuffer_defaults, &buffer_defaults);
5010 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols);
1ab256cb
RM
5011
5012 /* Set up the default values of various buffer slots. */
5013 /* Must do these before making the first buffer! */
5014
f532dca0 5015 /* real setup is done in bindings.el */
1ab256cb 5016 buffer_defaults.mode_line_format = build_string ("%-");
045dee35 5017 buffer_defaults.header_line_format = Qnil;
1ab256cb
RM
5018 buffer_defaults.abbrev_mode = Qnil;
5019 buffer_defaults.overwrite_mode = Qnil;
5020 buffer_defaults.case_fold_search = Qt;
5021 buffer_defaults.auto_fill_function = Qnil;
5022 buffer_defaults.selective_display = Qnil;
5023#ifndef old
5024 buffer_defaults.selective_display_ellipses = Qt;
5025#endif
5026 buffer_defaults.abbrev_table = Qnil;
5027 buffer_defaults.display_table = Qnil;
1ab256cb 5028 buffer_defaults.undo_list = Qnil;
c48f61ef 5029 buffer_defaults.mark_active = Qnil;
be9aafdd 5030 buffer_defaults.file_format = Qnil;
71ed49fa 5031 buffer_defaults.auto_save_file_format = Qt;
2410d73a
SM
5032 buffer_defaults.overlays_before = NULL;
5033 buffer_defaults.overlays_after = NULL;
c2d5b10f 5034 buffer_defaults.overlay_center = BEG;
1ab256cb 5035
8d7a4592 5036 XSETFASTINT (buffer_defaults.tab_width, 8);
1ab256cb
RM
5037 buffer_defaults.truncate_lines = Qnil;
5038 buffer_defaults.ctl_arrow = Qt;
3b06f880 5039 buffer_defaults.direction_reversed = Qnil;
bb2ec976 5040 buffer_defaults.cursor_type = Qt;
a3bbced0 5041 buffer_defaults.extra_line_spacing = Qnil;
187ccf49 5042 buffer_defaults.cursor_in_non_selected_windows = Qt;
1ab256cb 5043
f7975d07 5044#ifdef DOS_NT
0776cb1b 5045 buffer_defaults.buffer_file_type = Qnil; /* TEXT */
54ad07d3 5046#endif
a1a17b61 5047 buffer_defaults.enable_multibyte_characters = Qt;
c71b5d9b 5048 buffer_defaults.buffer_file_coding_system = Qnil;
8d7a4592
KH
5049 XSETFASTINT (buffer_defaults.fill_column, 70);
5050 XSETFASTINT (buffer_defaults.left_margin, 0);
28e969dd 5051 buffer_defaults.cache_long_line_scans = Qnil;
f6ed2e84 5052 buffer_defaults.file_truename = Qnil;
7962a441 5053 XSETFASTINT (buffer_defaults.display_count, 0);
2ad8731a
KS
5054 XSETFASTINT (buffer_defaults.left_margin_cols, 0);
5055 XSETFASTINT (buffer_defaults.right_margin_cols, 0);
5056 buffer_defaults.left_fringe_width = Qnil;
5057 buffer_defaults.right_fringe_width = Qnil;
5058 buffer_defaults.fringes_outside_margins = Qnil;
5059 buffer_defaults.scroll_bar_width = Qnil;
5060 buffer_defaults.vertical_scroll_bar_type = Qt;
0552666b 5061 buffer_defaults.indicate_empty_lines = Qnil;
8e8767f8 5062 buffer_defaults.indicate_buffer_boundaries = Qnil;
c6a46372
KS
5063 buffer_defaults.fringe_indicator_alist = Qnil;
5064 buffer_defaults.fringe_cursor_alist = Qnil;
0552666b
GM
5065 buffer_defaults.scroll_up_aggressively = Qnil;
5066 buffer_defaults.scroll_down_aggressively = Qnil;
3fd364db 5067 buffer_defaults.display_time = Qnil;
1ab256cb
RM
5068
5069 /* Assign the local-flags to the slots that have default values.
5070 The local flag is a bit that is used in the buffer
5071 to say that it has its own local value for the slot.
5072 The local flag bits are in the local_var_flags slot of the buffer. */
5073
5074 /* Nothing can work if this isn't true */
4d2f1389 5075 if (sizeof (EMACS_INT) != sizeof (Lisp_Object)) abort ();
1ab256cb
RM
5076
5077 /* 0 means not a lisp var, -1 means always local, else mask */
5078 bzero (&buffer_local_flags, sizeof buffer_local_flags);
aab80822
KH
5079 XSETINT (buffer_local_flags.filename, -1);
5080 XSETINT (buffer_local_flags.directory, -1);
5081 XSETINT (buffer_local_flags.backed_up, -1);
5082 XSETINT (buffer_local_flags.save_length, -1);
5083 XSETINT (buffer_local_flags.auto_save_file_name, -1);
5084 XSETINT (buffer_local_flags.read_only, -1);
5085 XSETINT (buffer_local_flags.major_mode, -1);
5086 XSETINT (buffer_local_flags.mode_name, -1);
5087 XSETINT (buffer_local_flags.undo_list, -1);
5088 XSETINT (buffer_local_flags.mark_active, -1);
943e065b 5089 XSETINT (buffer_local_flags.point_before_scroll, -1);
f6ed2e84 5090 XSETINT (buffer_local_flags.file_truename, -1);
3cb719bd 5091 XSETINT (buffer_local_flags.invisibility_spec, -1);
55ac8536 5092 XSETINT (buffer_local_flags.file_format, -1);
71ed49fa 5093 XSETINT (buffer_local_flags.auto_save_file_format, -1);
7962a441 5094 XSETINT (buffer_local_flags.display_count, -1);
3fd364db 5095 XSETINT (buffer_local_flags.display_time, -1);
1bf08baf 5096 XSETINT (buffer_local_flags.enable_multibyte_characters, -1);
8d7a4592 5097
7c02e886
GM
5098 idx = 1;
5099 XSETFASTINT (buffer_local_flags.mode_line_format, idx); ++idx;
5100 XSETFASTINT (buffer_local_flags.abbrev_mode, idx); ++idx;
5101 XSETFASTINT (buffer_local_flags.overwrite_mode, idx); ++idx;
5102 XSETFASTINT (buffer_local_flags.case_fold_search, idx); ++idx;
5103 XSETFASTINT (buffer_local_flags.auto_fill_function, idx); ++idx;
5104 XSETFASTINT (buffer_local_flags.selective_display, idx); ++idx;
1ab256cb 5105#ifndef old
7c02e886 5106 XSETFASTINT (buffer_local_flags.selective_display_ellipses, idx); ++idx;
1ab256cb 5107#endif
7c02e886
GM
5108 XSETFASTINT (buffer_local_flags.tab_width, idx); ++idx;
5109 XSETFASTINT (buffer_local_flags.truncate_lines, idx); ++idx;
5110 XSETFASTINT (buffer_local_flags.ctl_arrow, idx); ++idx;
5111 XSETFASTINT (buffer_local_flags.fill_column, idx); ++idx;
5112 XSETFASTINT (buffer_local_flags.left_margin, idx); ++idx;
5113 XSETFASTINT (buffer_local_flags.abbrev_table, idx); ++idx;
5114 XSETFASTINT (buffer_local_flags.display_table, idx); ++idx;
f7975d07 5115#ifdef DOS_NT
7c02e886 5116 XSETFASTINT (buffer_local_flags.buffer_file_type, idx);
13de9290 5117 /* Make this one a permanent local. */
7c02e886 5118 buffer_permanent_local_flags[idx++] = 1;
54ad07d3 5119#endif
7c02e886
GM
5120 XSETFASTINT (buffer_local_flags.syntax_table, idx); ++idx;
5121 XSETFASTINT (buffer_local_flags.cache_long_line_scans, idx); ++idx;
5122 XSETFASTINT (buffer_local_flags.category_table, idx); ++idx;
5123 XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx;
177c0ea7 5124 XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx);
a1a17b61 5125 /* Make this one a permanent local. */
7c02e886 5126 buffer_permanent_local_flags[idx++] = 1;
2ad8731a
KS
5127 XSETFASTINT (buffer_local_flags.left_margin_cols, idx); ++idx;
5128 XSETFASTINT (buffer_local_flags.right_margin_cols, idx); ++idx;
5129 XSETFASTINT (buffer_local_flags.left_fringe_width, idx); ++idx;
5130 XSETFASTINT (buffer_local_flags.right_fringe_width, idx); ++idx;
5131 XSETFASTINT (buffer_local_flags.fringes_outside_margins, idx); ++idx;
5132 XSETFASTINT (buffer_local_flags.scroll_bar_width, idx); ++idx;
5133 XSETFASTINT (buffer_local_flags.vertical_scroll_bar_type, idx); ++idx;
7c02e886 5134 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx;
8e8767f8 5135 XSETFASTINT (buffer_local_flags.indicate_buffer_boundaries, idx); ++idx;
c6a46372
KS
5136 XSETFASTINT (buffer_local_flags.fringe_indicator_alist, idx); ++idx;
5137 XSETFASTINT (buffer_local_flags.fringe_cursor_alist, idx); ++idx;
7c02e886
GM
5138 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx;
5139 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx;
5140 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx;
bd96bd79 5141 XSETFASTINT (buffer_local_flags.cursor_type, idx); ++idx;
a3bbced0 5142 XSETFASTINT (buffer_local_flags.extra_line_spacing, idx); ++idx;
0124c5bd 5143 XSETFASTINT (buffer_local_flags.cursor_in_non_selected_windows, idx); ++idx;
7c02e886
GM
5144
5145 /* Need more room? */
7313acd0 5146 if (idx >= MAX_PER_BUFFER_VARS)
7c02e886 5147 abort ();
7313acd0 5148 last_per_buffer_idx = idx;
177c0ea7 5149
1ab256cb
RM
5150 Vbuffer_alist = Qnil;
5151 current_buffer = 0;
5152 all_buffers = 0;
5153
5154 QSFundamental = build_string ("Fundamental");
5155
5156 Qfundamental_mode = intern ("fundamental-mode");
5157 buffer_defaults.major_mode = Qfundamental_mode;
5158
5159 Qmode_class = intern ("mode-class");
5160
5161 Qprotected_field = intern ("protected-field");
5162
5163 Qpermanent_local = intern ("permanent-local");
5164
5165 Qkill_buffer_hook = intern ("kill-buffer-hook");
fd6cfe11 5166 Fput (Qkill_buffer_hook, Qpermanent_local, Qt);
1ab256cb 5167
48265e61
DL
5168 Qucs_set_table_for_input = intern ("ucs-set-table-for-input");
5169
1ab256cb 5170 Vprin1_to_string_buffer = Fget_buffer_create (build_string (" prin1"));
000f8083 5171
1ab256cb
RM
5172 /* super-magic invisible buffer */
5173 Vbuffer_alist = Qnil;
5174
ffd56f97 5175 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
7775635d
KH
5176
5177 inhibit_modification_hooks = 0;
1ab256cb
RM
5178}
5179
dfcf069d 5180void
1ab256cb
RM
5181init_buffer ()
5182{
2381d133 5183 char *pwd;
136351b7 5184 Lisp_Object temp;
b639c9be 5185 int len;
1ab256cb 5186
b86af064 5187#ifdef USE_MMAP_FOR_BUFFERS
93c27ef1
GM
5188 {
5189 /* When using the ralloc implementation based on mmap(2), buffer
5190 text pointers will have been set to null in the dumped Emacs.
5191 Map new memory. */
5192 struct buffer *b;
177c0ea7 5193
93c27ef1
GM
5194 for (b = all_buffers; b; b = b->next)
5195 if (b->text->beg == NULL)
b86af064 5196 enlarge_buffer_text (b, 0);
93c27ef1 5197 }
b86af064 5198#endif /* USE_MMAP_FOR_BUFFERS */
177c0ea7 5199
1ab256cb 5200 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
3d871c85
RS
5201 if (NILP (buffer_defaults.enable_multibyte_characters))
5202 Fset_buffer_multibyte (Qnil);
2381d133 5203
01537133 5204 pwd = get_current_dir_name ();
a17b5ed1 5205
156bdb41 5206 if (!pwd)
a17b5ed1 5207 fatal ("`get_current_dir_name' failed: %s\n", strerror (errno));
1ab256cb
RM
5208
5209#ifndef VMS
5210 /* Maybe this should really use some standard subroutine
5211 whose definition is filename syntax dependent. */
b639c9be
RF
5212 len = strlen (pwd);
5213 if (!(IS_DIRECTORY_SEP (pwd[len - 1])))
f7975d07 5214 {
156bdb41 5215 /* Grow buffer to add directory separator and '\0'. */
b639c9be
RF
5216 pwd = (char *) xrealloc (pwd, len + 2);
5217 pwd[len] = DIRECTORY_SEP;
5218 pwd[len + 1] = '\0';
f7975d07 5219 }
1ab256cb 5220#endif /* not VMS */
0995fa35 5221
01537133 5222 current_buffer->directory = make_unibyte_string (pwd, strlen (pwd));
dcd74c5f 5223 if (! NILP (buffer_defaults.enable_multibyte_characters))
f9962371 5224 /* At this moment, we still don't know how to decode the
156bdb41 5225 directory name. So, we keep the bytes in multibyte form so
dcd74c5f
KH
5226 that ENCODE_FILE correctly gets the original bytes. */
5227 current_buffer->directory
5228 = string_to_multibyte (current_buffer->directory);
136351b7 5229
0995fa35
RS
5230 /* Add /: to the front of the name
5231 if it would otherwise be treated as magic. */
5232 temp = Ffind_file_name_handler (current_buffer->directory, Qt);
81ab2e07
KH
5233 if (! NILP (temp)
5234 /* If the default dir is just /, TEMP is non-nil
5235 because of the ange-ftp completion handler.
5236 However, it is not necessary to turn / into /:/.
5237 So avoid doing that. */
d5db4077 5238 && strcmp ("/", SDATA (current_buffer->directory)))
0995fa35
RS
5239 current_buffer->directory
5240 = concat2 (build_string ("/:"), current_buffer->directory);
5241
136351b7
RS
5242 temp = get_minibuffer (0);
5243 XBUFFER (temp)->directory = current_buffer->directory;
01537133
EZ
5244
5245 free (pwd);
1ab256cb
RM
5246}
5247
5248/* initialize the buffer routines */
dfcf069d 5249void
1ab256cb
RM
5250syms_of_buffer ()
5251{
9115729e
KH
5252 staticpro (&last_overlay_modification_hooks);
5253 last_overlay_modification_hooks
5254 = Fmake_vector (make_number (10), Qnil);
5255
1ab256cb
RM
5256 staticpro (&Vbuffer_defaults);
5257 staticpro (&Vbuffer_local_symbols);
5258 staticpro (&Qfundamental_mode);
5259 staticpro (&Qmode_class);
5260 staticpro (&QSFundamental);
5261 staticpro (&Vbuffer_alist);
5262 staticpro (&Qprotected_field);
5263 staticpro (&Qpermanent_local);
5264 staticpro (&Qkill_buffer_hook);
22378665 5265 Qoverlayp = intern ("overlayp");
52f8ec73 5266 staticpro (&Qoverlayp);
9d7608b7
KH
5267 Qevaporate = intern ("evaporate");
5268 staticpro (&Qevaporate);
294d215f 5269 Qmodification_hooks = intern ("modification-hooks");
22378665 5270 staticpro (&Qmodification_hooks);
294d215f 5271 Qinsert_in_front_hooks = intern ("insert-in-front-hooks");
22378665 5272 staticpro (&Qinsert_in_front_hooks);
294d215f 5273 Qinsert_behind_hooks = intern ("insert-behind-hooks");
22378665 5274 staticpro (&Qinsert_behind_hooks);
5fe0b67e 5275 Qget_file_buffer = intern ("get-file-buffer");
22378665 5276 staticpro (&Qget_file_buffer);
5985d248
KH
5277 Qpriority = intern ("priority");
5278 staticpro (&Qpriority);
5279 Qwindow = intern ("window");
5280 staticpro (&Qwindow);
bbbe9545
KH
5281 Qbefore_string = intern ("before-string");
5282 staticpro (&Qbefore_string);
5283 Qafter_string = intern ("after-string");
5284 staticpro (&Qafter_string);
22378665
RS
5285 Qfirst_change_hook = intern ("first-change-hook");
5286 staticpro (&Qfirst_change_hook);
5287 Qbefore_change_functions = intern ("before-change-functions");
5288 staticpro (&Qbefore_change_functions);
5289 Qafter_change_functions = intern ("after-change-functions");
5290 staticpro (&Qafter_change_functions);
48265e61 5291 staticpro (&Qucs_set_table_for_input);
1ab256cb 5292
5b20caf0
RS
5293 Qkill_buffer_query_functions = intern ("kill-buffer-query-functions");
5294 staticpro (&Qkill_buffer_query_functions);
5295
1ab256cb
RM
5296 Fput (Qprotected_field, Qerror_conditions,
5297 Fcons (Qprotected_field, Fcons (Qerror, Qnil)));
5298 Fput (Qprotected_field, Qerror_message,
5299 build_string ("Attempt to modify a protected field"));
5300
5301 /* All these use DEFVAR_LISP_NOPRO because the slots in
5302 buffer_defaults will all be marked via Vbuffer_defaults. */
5303
5304 DEFVAR_LISP_NOPRO ("default-mode-line-format",
7ee72033
MB
5305 &buffer_defaults.mode_line_format,
5306 doc: /* Default value of `mode-line-format' for buffers that don't override it.
018ba359 5307This is the same as (default-value 'mode-line-format). */);
1ab256cb 5308
045dee35 5309 DEFVAR_LISP_NOPRO ("default-header-line-format",
7ee72033
MB
5310 &buffer_defaults.header_line_format,
5311 doc: /* Default value of `header-line-format' for buffers that don't override it.
018ba359 5312This is the same as (default-value 'header-line-format). */);
0552666b 5313
7ee72033
MB
5314 DEFVAR_LISP_NOPRO ("default-cursor-type", &buffer_defaults.cursor_type,
5315 doc: /* Default value of `cursor-type' for buffers that don't override it.
018ba359 5316This is the same as (default-value 'cursor-type). */);
bd96bd79 5317
a3bbced0 5318 DEFVAR_LISP_NOPRO ("default-line-spacing",
7ee72033
MB
5319 &buffer_defaults.extra_line_spacing,
5320 doc: /* Default value of `line-spacing' for buffers that don't override it.
018ba359 5321This is the same as (default-value 'line-spacing). */);
a3bbced0 5322
187ccf49
KS
5323 DEFVAR_LISP_NOPRO ("default-cursor-in-non-selected-windows",
5324 &buffer_defaults.cursor_in_non_selected_windows,
5325 doc: /* Default value of `cursor-in-non-selected-windows'.
5326This is the same as (default-value 'cursor-in-non-selected-windows). */);
5327
1ab256cb 5328 DEFVAR_LISP_NOPRO ("default-abbrev-mode",
efc7e75f 5329 &buffer_defaults.abbrev_mode,
7ee72033 5330 doc: /* Default value of `abbrev-mode' for buffers that do not override it.
018ba359 5331This is the same as (default-value 'abbrev-mode). */);
1ab256cb
RM
5332
5333 DEFVAR_LISP_NOPRO ("default-ctl-arrow",
efc7e75f 5334 &buffer_defaults.ctl_arrow,
7ee72033 5335 doc: /* Default value of `ctl-arrow' for buffers that do not override it.
018ba359 5336This is the same as (default-value 'ctl-arrow). */);
1ab256cb 5337
5e2ad10b
JB
5338 DEFVAR_LISP_NOPRO ("default-direction-reversed",
5339 &buffer_defaults.direction_reversed,
5340 doc: /* Default value of `direction-reversed' for buffers that do not override it.
018ba359 5341This is the same as (default-value 'direction-reversed). */);
177c0ea7 5342
5e2ad10b
JB
5343 DEFVAR_LISP_NOPRO ("default-enable-multibyte-characters",
5344 &buffer_defaults.enable_multibyte_characters,
5345 doc: /* *Default value of `enable-multibyte-characters' for buffers not overriding it.
018ba359 5346This is the same as (default-value 'enable-multibyte-characters). */);
177c0ea7 5347
5e2ad10b
JB
5348 DEFVAR_LISP_NOPRO ("default-buffer-file-coding-system",
5349 &buffer_defaults.buffer_file_coding_system,
5350 doc: /* Default value of `buffer-file-coding-system' for buffers not overriding it.
018ba359 5351This is the same as (default-value 'buffer-file-coding-system). */);
177c0ea7 5352
1ab256cb 5353 DEFVAR_LISP_NOPRO ("default-truncate-lines",
efc7e75f
PJ
5354 &buffer_defaults.truncate_lines,
5355 doc: /* Default value of `truncate-lines' for buffers that do not override it.
018ba359 5356This is the same as (default-value 'truncate-lines). */);
1ab256cb
RM
5357
5358 DEFVAR_LISP_NOPRO ("default-fill-column",
efc7e75f
PJ
5359 &buffer_defaults.fill_column,
5360 doc: /* Default value of `fill-column' for buffers that do not override it.
018ba359 5361This is the same as (default-value 'fill-column). */);
1ab256cb
RM
5362
5363 DEFVAR_LISP_NOPRO ("default-left-margin",
efc7e75f
PJ
5364 &buffer_defaults.left_margin,
5365 doc: /* Default value of `left-margin' for buffers that do not override it.
018ba359 5366This is the same as (default-value 'left-margin). */);
1ab256cb
RM
5367
5368 DEFVAR_LISP_NOPRO ("default-tab-width",
bc0ede35 5369 &buffer_defaults.tab_width,
23625946 5370 doc: /* Default value of `tab-width' for buffers that do not override it.
018ba359 5371This is the same as (default-value 'tab-width). */);
1ab256cb
RM
5372
5373 DEFVAR_LISP_NOPRO ("default-case-fold-search",
efc7e75f
PJ
5374 &buffer_defaults.case_fold_search,
5375 doc: /* Default value of `case-fold-search' for buffers that don't override it.
018ba359 5376This is the same as (default-value 'case-fold-search). */);
1ab256cb 5377
f7975d07 5378#ifdef DOS_NT
177c0ea7 5379 DEFVAR_LISP_NOPRO ("default-buffer-file-type",
7ee72033 5380 &buffer_defaults.buffer_file_type,
efc7e75f 5381 doc: /* Default file type for buffers that do not override it.
018ba359
PJ
5382This is the same as (default-value 'buffer-file-type).
5383The file type is nil for text, t for binary. */);
54ad07d3
RS
5384#endif
5385
0552666b 5386 DEFVAR_LISP_NOPRO ("default-left-margin-width",
2ad8731a 5387 &buffer_defaults.left_margin_cols,
efc7e75f 5388 doc: /* Default value of `left-margin-width' for buffers that don't override it.
018ba359 5389This is the same as (default-value 'left-margin-width). */);
0552666b
GM
5390
5391 DEFVAR_LISP_NOPRO ("default-right-margin-width",
2ad8731a
KS
5392 &buffer_defaults.right_margin_cols,
5393 doc: /* Default value of `right-margin-width' for buffers that don't override it.
018ba359 5394This is the same as (default-value 'right-margin-width). */);
177c0ea7 5395
2ad8731a
KS
5396 DEFVAR_LISP_NOPRO ("default-left-fringe-width",
5397 &buffer_defaults.left_fringe_width,
5398 doc: /* Default value of `left-fringe-width' for buffers that don't override it.
5399This is the same as (default-value 'left-fringe-width). */);
5400
5401 DEFVAR_LISP_NOPRO ("default-right-fringe-width",
5402 &buffer_defaults.right_fringe_width,
5403 doc: /* Default value of `right-fringe-width' for buffers that don't override it.
5404This is the same as (default-value 'right-fringe-width). */);
5405
5406 DEFVAR_LISP_NOPRO ("default-fringes-outside-margins",
5407 &buffer_defaults.fringes_outside_margins,
5408 doc: /* Default value of `fringes-outside-margins' for buffers that don't override it.
5409This is the same as (default-value 'fringes-outside-margins). */);
5410
5411 DEFVAR_LISP_NOPRO ("default-scroll-bar-width",
5412 &buffer_defaults.scroll_bar_width,
5413 doc: /* Default value of `scroll-bar-width' for buffers that don't override it.
5414This is the same as (default-value 'scroll-bar-width). */);
5415
5416 DEFVAR_LISP_NOPRO ("default-vertical-scroll-bar",
5417 &buffer_defaults.vertical_scroll_bar_type,
5418 doc: /* Default value of `vertical-scroll-bar' for buffers that don't override it.
5419This is the same as (default-value 'vertical-scroll-bar). */);
5420
0552666b 5421 DEFVAR_LISP_NOPRO ("default-indicate-empty-lines",
efc7e75f
PJ
5422 &buffer_defaults.indicate_empty_lines,
5423 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it.
018ba359 5424This is the same as (default-value 'indicate-empty-lines). */);
177c0ea7 5425
8e8767f8
KS
5426 DEFVAR_LISP_NOPRO ("default-indicate-buffer-boundaries",
5427 &buffer_defaults.indicate_buffer_boundaries,
5428 doc: /* Default value of `indicate-buffer-boundaries' for buffers that don't override it.
5429This is the same as (default-value 'indicate-buffer-boundaries). */);
5430
c6a46372
KS
5431 DEFVAR_LISP_NOPRO ("default-fringe-indicator-alist",
5432 &buffer_defaults.fringe_indicator_alist,
5433 doc: /* Default value of `fringe-indicator-alist' for buffers that don't override it.
5434This is the same as (default-value 'fringe-indicator-alist'). */);
5435
5436 DEFVAR_LISP_NOPRO ("default-fringe-cursor-alist",
5437 &buffer_defaults.fringe_cursor_alist,
5438 doc: /* Default value of `fringe-cursor-alist' for buffers that don't override it.
5439This is the same as (default-value 'fringe-cursor-alist'). */);
5440
0552666b 5441 DEFVAR_LISP_NOPRO ("default-scroll-up-aggressively",
efc7e75f 5442 &buffer_defaults.scroll_up_aggressively,
7614d762
RS
5443 doc: /* Default value of `scroll-up-aggressively'.
5444This value applies in buffers that don't have their own local values.
fc961256 5445This is the same as (default-value 'scroll-up-aggressively). */);
177c0ea7 5446
0552666b 5447 DEFVAR_LISP_NOPRO ("default-scroll-down-aggressively",
efc7e75f 5448 &buffer_defaults.scroll_down_aggressively,
7614d762
RS
5449 doc: /* Default value of `scroll-down-aggressively'.
5450This value applies in buffers that don't have their own local values.
fc961256 5451This is the same as (default-value 'scroll-down-aggressively). */);
177c0ea7 5452
045dee35 5453 DEFVAR_PER_BUFFER ("header-line-format",
018ba359 5454 &current_buffer->header_line_format,
7ee72033 5455 Qnil,
7614d762
RS
5456 doc: /* Analogous to `mode-line-format', but controls the header line.
5457The header line appears, optionally, at the top of a window;
5458the mode line appears at the bottom. */);
177c0ea7 5459
1ab256cb 5460 DEFVAR_PER_BUFFER ("mode-line-format", &current_buffer->mode_line_format,
efc7e75f
PJ
5461 Qnil,
5462 doc: /* Template for displaying mode line for current buffer.
018ba359
PJ
5463Each buffer has its own value of this variable.
5464Value may be nil, a string, a symbol or a list or cons cell.
5465A value of nil means don't display a mode line.
5466For a symbol, its value is used (but it is ignored if t or nil).
5467 A string appearing directly as the value of a symbol is processed verbatim
5468 in that the %-constructs below are not recognized.
ed463255 5469 Note that unless the symbol is marked as a `risky-local-variable', all
177c0ea7 5470 properties in any strings, as well as all :eval and :propertize forms
ed463255 5471 in the value of that symbol will be ignored.
018ba359 5472For a list of the form `(:eval FORM)', FORM is evaluated and the result
9c3eecf3
RS
5473 is used as a mode line element. Be careful--FORM should not load any files,
5474 because that can cause an infinite recursion.
ed463255
KS
5475For a list of the form `(:propertize ELT PROPS...)', ELT is displayed
5476 with the specified properties PROPS applied.
018ba359
PJ
5477For a list whose car is a symbol, the symbol's value is taken,
5478 and if that is non-nil, the cadr of the list is processed recursively.
5479 Otherwise, the caddr of the list (if there is one) is processed.
5480For a list whose car is a string or list, each element is processed
5481 recursively and the results are effectively concatenated.
5482For a list whose car is an integer, the cdr of the list is processed
5483 and padded (if the number is positive) or truncated (if negative)
5484 to the width specified by that number.
5485A string is printed verbatim in the mode line except for %-constructs:
5486 (%-constructs are allowed when the string is the entire mode-line-format
5487 or when it is found in a cons-cell or a list)
5488 %b -- print buffer name. %f -- print visited file name.
5489 %F -- print frame name.
5490 %* -- print %, * or hyphen. %+ -- print *, % or hyphen.
5491 %& is like %*, but ignore read-only-ness.
5492 % means buffer is read-only and * means it is modified.
5493 For a modified read-only buffer, %* gives % and %+ gives *.
5494 %s -- print process status. %l -- print the current line number.
5495 %c -- print the current column number (this makes editing slower).
5496 To make the column number update correctly in all cases,
5497 `column-number-mode' must be non-nil.
77d31fb4
LK
5498 %i -- print the size of the buffer.
5499 %I -- like %i, but use k, M, G, etc., to abbreviate.
018ba359
PJ
5500 %p -- print percent of buffer above top of window, or Top, Bot or All.
5501 %P -- print percent of buffer above bottom of window, perhaps plus Top,
5502 or print Bottom or All.
018ba359 5503 %n -- print Narrow if appropriate.
dafbe726 5504 %t -- visited file is text or binary (if OS supports this distinction).
47419860 5505 %z -- print mnemonics of keyboard, terminal, and buffer coding systems.
018ba359 5506 %Z -- like %z, but including the end-of-line format.
dafbe726 5507 %e -- print error message about full memory.
018ba359
PJ
5508 %[ -- print one [ for each recursive editing level. %] similar.
5509 %% -- print %. %- -- print infinitely many dashes.
5510Decimal digits after the % specify field width to which to pad. */);
5511
7ee72033 5512 DEFVAR_LISP_NOPRO ("default-major-mode", &buffer_defaults.major_mode,
efc7e75f 5513 doc: /* *Major mode for new buffers. Defaults to `fundamental-mode'.
0493af6f
JB
5514A value of nil means use current buffer's major mode,
5515provided it is not marked as "special".
557ca2c1
RS
5516
5517When a mode is used by default, `find-file' switches to it
5518before it reads the contents into the buffer and before
5519it finishes setting up the buffer. Thus, the mode and
5520its hooks should not expect certain variables such as
5521`buffer-read-only' and `buffer-file-coding-system' to be set up. */);
1ab256cb
RM
5522
5523 DEFVAR_PER_BUFFER ("major-mode", &current_buffer->major_mode,
7ee72033 5524 make_number (Lisp_Symbol),
efc7e75f 5525 doc: /* Symbol for current buffer's major mode. */);
1ab256cb
RM
5526
5527 DEFVAR_PER_BUFFER ("mode-name", &current_buffer->mode_name,
c01d0677 5528 Qnil,
efc7e75f 5529 doc: /* Pretty name of current buffer's major mode (a string). */);
1ab256cb 5530
7ee72033 5531 DEFVAR_PER_BUFFER ("abbrev-mode", &current_buffer->abbrev_mode, Qnil,
efc7e75f 5532 doc: /* Non-nil turns on automatic expansion of abbrevs as they are inserted. */);
1ab256cb
RM
5533
5534 DEFVAR_PER_BUFFER ("case-fold-search", &current_buffer->case_fold_search,
7ee72033 5535 Qnil,
efc7e75f 5536 doc: /* *Non-nil if searches and matches should ignore case. */);
1ab256cb
RM
5537
5538 DEFVAR_PER_BUFFER ("fill-column", &current_buffer->fill_column,
7ee72033 5539 make_number (Lisp_Int),
1ac5826d 5540 doc: /* *Column beyond which automatic line-wrapping should happen.
f1ccb329 5541Interactively, you can set the buffer local value using \\[set-fill-column]. */);
1ab256cb
RM
5542
5543 DEFVAR_PER_BUFFER ("left-margin", &current_buffer->left_margin,
7ee72033 5544 make_number (Lisp_Int),
fc961256 5545 doc: /* *Column for the default `indent-line-function' to indent to.
018ba359 5546Linefeed indents to this column in Fundamental mode. */);
1ab256cb
RM
5547
5548 DEFVAR_PER_BUFFER ("tab-width", &current_buffer->tab_width,
7ee72033 5549 make_number (Lisp_Int),
efc7e75f 5550 doc: /* *Distance between tab stops (for display of tab characters), in columns. */);
1ab256cb 5551
7ee72033 5552 DEFVAR_PER_BUFFER ("ctl-arrow", &current_buffer->ctl_arrow, Qnil,
efc7e75f 5553 doc: /* *Non-nil means display control chars with uparrow.
018ba359
PJ
5554A value of nil means use backslash and octal digits.
5555This variable does not apply to characters whose display is specified
5556in the current display table (if there is one). */);
1ab256cb 5557
3b06f880 5558 DEFVAR_PER_BUFFER ("enable-multibyte-characters",
1bf08baf 5559 &current_buffer->enable_multibyte_characters,
a9b9a780 5560 Qnil,
efc7e75f 5561 doc: /* Non-nil means the buffer contents are regarded as multi-byte characters.
018ba359
PJ
5562Otherwise they are regarded as unibyte. This affects the display,
5563file I/O and the behavior of various editing commands.
5564
5565This variable is buffer-local but you cannot set it directly;
5566use the function `set-buffer-multibyte' to change a buffer's representation.
5567Changing its default value with `setq-default' is supported.
5568See also variable `default-enable-multibyte-characters' and Info node
5569`(elisp)Text Representations'. */);
a9b9a780 5570 XSYMBOL (intern ("enable-multibyte-characters"))->constant = 1;
3b06f880 5571
c71b5d9b 5572 DEFVAR_PER_BUFFER ("buffer-file-coding-system",
7ee72033 5573 &current_buffer->buffer_file_coding_system, Qnil,
efc7e75f 5574 doc: /* Coding system to be used for encoding the buffer contents on saving.
018ba359
PJ
5575This variable applies to saving the buffer, and also to `write-region'
5576and other functions that use `write-region'.
5577It does not apply to sending output to subprocesses, however.
5578
5579If this is nil, the buffer is saved without any code conversion
5580unless some coding system is specified in `file-coding-system-alist'
5581for the buffer file.
5582
31a6cb06
EZ
5583If the text to be saved cannot be encoded as specified by this variable,
5584an alternative encoding is selected by `select-safe-coding-system', which see.
5585
018ba359
PJ
5586The variable `coding-system-for-write', if non-nil, overrides this variable.
5587
5588This variable is never applied to a way of decoding a file while reading it. */);
c71b5d9b 5589
3b06f880 5590 DEFVAR_PER_BUFFER ("direction-reversed", &current_buffer->direction_reversed,
7ee72033 5591 Qnil,
efc7e75f 5592 doc: /* *Non-nil means lines in the buffer are displayed right to left. */);
3b06f880 5593
7ee72033 5594 DEFVAR_PER_BUFFER ("truncate-lines", &current_buffer->truncate_lines, Qnil,
7614d762
RS
5595 doc: /* *Non-nil means do not display continuation lines.
5596Instead, give each line of text just one screen line.
018ba359
PJ
5597
5598Note that this is overridden by the variable
5599`truncate-partial-width-windows' if that variable is non-nil
5600and this buffer is not full-frame width. */);
1ab256cb 5601
f7975d07 5602#ifdef DOS_NT
54ad07d3 5603 DEFVAR_PER_BUFFER ("buffer-file-type", &current_buffer->buffer_file_type,
7ee72033 5604 Qnil,
efc7e75f 5605 doc: /* Non-nil if the visited file is a binary file.
018ba359
PJ
5606This variable is meaningful on MS-DOG and Windows NT.
5607On those systems, it is automatically local in every buffer.
5608On other systems, this variable is normally always nil. */);
54ad07d3
RS
5609#endif
5610
1ab256cb 5611 DEFVAR_PER_BUFFER ("default-directory", &current_buffer->directory,
7ee72033 5612 make_number (Lisp_String),
efc7e75f 5613 doc: /* Name of default directory of current buffer. Should end with slash.
018ba359 5614To interactively change the default directory, use command `cd'. */);
1ab256cb
RM
5615
5616 DEFVAR_PER_BUFFER ("auto-fill-function", &current_buffer->auto_fill_function,
7ee72033 5617 Qnil,
efc7e75f 5618 doc: /* Function called (if non-nil) to perform auto-fill.
018ba359
PJ
5619It is called after self-inserting any character specified in
5620the `auto-fill-chars' table.
5621NOTE: This variable is not a hook;
5622its value may not be a list of functions. */);
1ab256cb
RM
5623
5624 DEFVAR_PER_BUFFER ("buffer-file-name", &current_buffer->filename,
7ee72033 5625 make_number (Lisp_String),
efc7e75f 5626 doc: /* Name of file visited in current buffer, or nil if not visiting a file. */);
1ab256cb 5627
f6ed2e84 5628 DEFVAR_PER_BUFFER ("buffer-file-truename", &current_buffer->file_truename,
7ee72033 5629 make_number (Lisp_String),
efc7e75f 5630 doc: /* Abbreviated truename of file visited in current buffer, or nil if none.
018ba359
PJ
5631The truename of a file is calculated by `file-truename'
5632and then abbreviated with `abbreviate-file-name'. */);
f6ed2e84 5633
1ab256cb 5634 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
3f5fcd47 5635 &current_buffer->auto_save_file_name,
7ee72033 5636 make_number (Lisp_String),
7614d762
RS
5637 doc: /* Name of file for auto-saving current buffer.
5638If it is nil, that means don't auto-save this buffer. */);
1ab256cb 5639
7ee72033 5640 DEFVAR_PER_BUFFER ("buffer-read-only", &current_buffer->read_only, Qnil,
efc7e75f 5641 doc: /* Non-nil if this buffer is read-only. */);
1ab256cb 5642
7ee72033 5643 DEFVAR_PER_BUFFER ("buffer-backed-up", &current_buffer->backed_up, Qnil,
efc7e75f 5644 doc: /* Non-nil if this buffer's file has been backed up.
018ba359 5645Backing up is done before the first time the file is saved. */);
1ab256cb
RM
5646
5647 DEFVAR_PER_BUFFER ("buffer-saved-size", &current_buffer->save_length,
7ee72033 5648 make_number (Lisp_Int),
efc7e75f 5649 doc: /* Length of current buffer when last read in, saved or auto-saved.
018ba359 56500 initially. */);
1ab256cb
RM
5651
5652 DEFVAR_PER_BUFFER ("selective-display", &current_buffer->selective_display,
7ee72033 5653 Qnil,
7614d762 5654 doc: /* Non-nil enables selective display.
251db0f4
JB
5655An integer N as value means display only lines
5656that start with less than N columns of space.
7614d762
RS
5657A value of t means that the character ^M makes itself and
5658all the rest of the line invisible; also, when saving the buffer
5659in a file, save the ^M as a newline. */);
1ab256cb
RM
5660
5661#ifndef old
5662 DEFVAR_PER_BUFFER ("selective-display-ellipses",
5663 &current_buffer->selective_display_ellipses,
7ee72033 5664 Qnil,
3f676284 5665 doc: /* Non-nil means display ... on previous line when a line is invisible. */);
1ab256cb
RM
5666#endif
5667
7ee72033 5668 DEFVAR_PER_BUFFER ("overwrite-mode", &current_buffer->overwrite_mode, Qnil,
efc7e75f 5669 doc: /* Non-nil if self-insertion should replace existing text.
018ba359
PJ
5670The value should be one of `overwrite-mode-textual',
5671`overwrite-mode-binary', or nil.
5672If it is `overwrite-mode-textual', self-insertion still
5673inserts at the end of a line, and inserts when point is before a tab,
5674until the tab is filled in.
5675If `overwrite-mode-binary', self-insertion replaces newlines and tabs too. */);
5676
54939090 5677 DEFVAR_PER_BUFFER ("buffer-display-table", &current_buffer->display_table,
7ee72033 5678 Qnil,
efc7e75f 5679 doc: /* Display table that controls display of the contents of current buffer.
018ba359
PJ
5680
5681If this variable is nil, the value of `standard-display-table' is used.
5682Each window can have its own, overriding display table, see
5683`set-window-display-table' and `window-display-table'.
5684
5685The display table is a char-table created with `make-display-table'.
5686A char-table is an array indexed by character codes. Normal array
5687primitives `aref' and `aset' can be used to access elements of a char-table.
5688
5689Each of the char-table elements control how to display the corresponding
5690text character: the element at index C in the table says how to display
5691the character whose code is C. Each element should be a vector of
426a9163
JB
5692characters or nil. The value nil means display the character in the
5693default fashion; otherwise, the characters from the vector are delivered
5694to the screen instead of the original character.
018ba359 5695
5fd11dc8 5696For example, (aset buffer-display-table ?X [?Y]) tells Emacs
adbb3b05 5697to display a capital Y instead of each X character.
018ba359
PJ
5698
5699In addition, a char-table has six extra slots to control the display of:
5700
5701 the end of a truncated screen line (extra-slot 0, a single character);
5702 the end of a continued line (extra-slot 1, a single character);
5703 the escape character used to display character codes in octal
5704 (extra-slot 2, a single character);
5705 the character used as an arrow for control characters (extra-slot 3,
5706 a single character);
5707 the decoration indicating the presence of invisible lines (extra-slot 4,
5708 a vector of characters);
5709 the character used to draw the border between side-by-side windows
5710 (extra-slot 5, a single character).
5711
5712See also the functions `display-table-slot' and `set-display-table-slot'. */);
1ab256cb 5713
2ad8731a 5714 DEFVAR_PER_BUFFER ("left-margin-width", &current_buffer->left_margin_cols,
7ee72033 5715 Qnil,
efc7e75f 5716 doc: /* *Width of left marginal area for display of a buffer.
018ba359 5717A value of nil means no marginal area. */);
177c0ea7 5718
2ad8731a 5719 DEFVAR_PER_BUFFER ("right-margin-width", &current_buffer->right_margin_cols,
7ee72033 5720 Qnil,
efc7e75f 5721 doc: /* *Width of right marginal area for display of a buffer.
018ba359 5722A value of nil means no marginal area. */);
177c0ea7 5723
2ad8731a
KS
5724 DEFVAR_PER_BUFFER ("left-fringe-width", &current_buffer->left_fringe_width,
5725 Qnil,
5726 doc: /* *Width of this buffer's left fringe (in pixels).
5727A value of 0 means no left fringe is shown in this buffer's window.
5728A value of nil means to use the left fringe width from the window's frame. */);
5729
5730 DEFVAR_PER_BUFFER ("right-fringe-width", &current_buffer->right_fringe_width,
5731 Qnil,
5732 doc: /* *Width of this buffer's right fringe (in pixels).
5733A value of 0 means no right fringe is shown in this buffer's window.
5734A value of nil means to use the right fringe width from the window's frame. */);
5735
5736 DEFVAR_PER_BUFFER ("fringes-outside-margins", &current_buffer->fringes_outside_margins,
5737 Qnil,
5738 doc: /* *Non-nil means to display fringes outside display margins.
5739A value of nil means to display fringes between margins and buffer text. */);
5740
5741 DEFVAR_PER_BUFFER ("scroll-bar-width", &current_buffer->scroll_bar_width,
5742 Qnil,
5743 doc: /* *Width of this buffer's scroll bars in pixels.
5744A value of nil means to use the scroll bar width from the window's frame. */);
5745
5746 DEFVAR_PER_BUFFER ("vertical-scroll-bar", &current_buffer->vertical_scroll_bar_type,
5747 Qnil,
5748 doc: /* *Position of this buffer's vertical scroll bar.
7c6b2007 5749The value takes effect whenever you tell a window to display this buffer;
188577ce 5750for instance, with `set-window-buffer' or when `display-buffer' displays it.
7c6b2007 5751
fc2c8887
RS
5752A value of `left' or `right' means put the vertical scroll bar at that side
5753of the window; a value of nil means don't show any vertical scroll bars.
5754A value of t (the default) means do whatever the window's frame specifies. */);
2ad8731a 5755
0552666b 5756 DEFVAR_PER_BUFFER ("indicate-empty-lines",
7ee72033 5757 &current_buffer->indicate_empty_lines, Qnil,
efc7e75f 5758 doc: /* *Visually indicate empty lines after the buffer end.
018ba359
PJ
5759If non-nil, a bitmap is displayed in the left fringe of a window on
5760window-systems. */);
177c0ea7 5761
8e8767f8
KS
5762 DEFVAR_PER_BUFFER ("indicate-buffer-boundaries",
5763 &current_buffer->indicate_buffer_boundaries, Qnil,
5764 doc: /* *Visually indicate buffer boundaries and scrolling.
ccbc4331
KS
5765If non-nil, the first and last line of the buffer are marked in the fringe
5766of a window on window-systems with angle bitmaps, or if the window can be
5767scrolled, the top and bottom line of the window are marked with up and down
5768arrow bitmaps.
b2229037
KS
5769
5770If value is a symbol `left' or `right', both angle and arrow bitmaps
79e3497d 5771are displayed in the left or right fringe, resp. Any other value
845a78b4 5772that doesn't look like an alist means display the angle bitmaps in
79e3497d 5773the left fringe but no arrows.
b2229037 5774
79e3497d
RS
5775You can exercise more precise control by using an alist as the
5776value. Each alist element (INDICATOR . POSITION) specifies
5777where to show one of the indicators. INDICATOR is one of `top',
b2229037
KS
5778`bottom', `up', `down', or t, which specifies the default position,
5779and POSITION is one of `left', `right', or nil, meaning do not show
5780this indicator.
5781
5782For example, ((top . left) (t . right)) places the top angle bitmap in
5783left fringe, the bottom angle bitmap in right fringe, and both arrow
ccbc4331 5784bitmaps in right fringe. To show just the angle bitmaps in the left
b2229037 5785fringe, but no arrow bitmaps, use ((top . left) (bottom . left)). */);
8e8767f8 5786
c6a46372
KS
5787 DEFVAR_PER_BUFFER ("fringe-indicator-alist",
5788 &current_buffer->fringe_indicator_alist, Qnil,
5789 doc: /* *Mapping from logical to physical fringe indicator bitmaps.
5790The value is an alist where each element (INDICATOR . BITMAPS)
5791specifies the fringe bitmaps used to display a specific logical
5792fringe indicator.
5793
5794INDICATOR specifies the logical indicator type which is one of the
5795following symbols: `truncation' , `continuation', `overlay-arrow',
5796`top', `bottom', `up', `down', `one-line', `empty-line', or `unknown'.
5797
5798BITMAPS is list of symbols (LEFT RIGHT [LEFT1 RIGHT1]) which specifies
5799the actual bitmap shown in the left or right fringe for the logical
5800indicator. LEFT and RIGHT are the bitmaps shown in the left and/or
5801right fringe for the specific indicator. The LEFT1 or RIGHT1 bitmaps
5802are used only for the `bottom' and `one-line' indicators when the last
63af6055 5803\(only) line in has no final newline. BITMAPS may also be a single
c6a46372
KS
5804symbol which is used in both left and right fringes. */);
5805
5806 DEFVAR_PER_BUFFER ("fringe-cursor-alist",
5807 &current_buffer->fringe_cursor_alist, Qnil,
5808 doc: /* *Mapping from logical to physical fringe cursor bitmaps.
5809The value is an alist where each element (CURSOR . BITMAP)
5810specifies the fringe bitmaps used to display a specific logical
5811cursor type in the fringe.
5812
5813CURSOR specifies the logical cursor type which is one of the following
5814symbols: `box' , `hollow', `bar', `hbar', or `hollow-small'. The last
5815one is used to show a hollow cursor on narrow lines display lines
5816where the normal hollow cursor will not fit.
5817
5818BITMAP is the corresponding fringe bitmap shown for the logical
5819cursor type. */);
5820
0552666b 5821 DEFVAR_PER_BUFFER ("scroll-up-aggressively",
7ee72033 5822 &current_buffer->scroll_up_aggressively, Qnil,
4e0692c1
RS
5823 doc: /* How far to scroll windows upward.
5824If you move point off the bottom, the window scrolls automatically.
426a9163 5825This variable controls how far it scrolls. The value nil, the default,
4e0692c1
RS
5826means scroll to center point. A fraction means scroll to put point
5827that fraction of the window's height from the bottom of the window.
5828When the value is 0.0, point goes at the bottom line, which in the simple
5829case that you moved off with C-f means scrolling just one line. 1.0 means
5830point goes at the top, so that in that simple case, the window
e5f95d5c 5831scrolls by a full window height. Meaningful values are
175e9712 5832between 0.0 and 1.0, inclusive. */);
177c0ea7 5833
0552666b 5834 DEFVAR_PER_BUFFER ("scroll-down-aggressively",
7ee72033 5835 &current_buffer->scroll_down_aggressively, Qnil,
4e0692c1
RS
5836 doc: /* How far to scroll windows downward.
5837If you move point off the top, the window scrolls automatically.
426a9163 5838This variable controls how far it scrolls. The value nil, the default,
4e0692c1
RS
5839means scroll to center point. A fraction means scroll to put point
5840that fraction of the window's height from the top of the window.
5841When the value is 0.0, point goes at the top line, which in the simple
5842case that you moved off with C-b means scrolling just one line. 1.0 means
5843point goes at the bottom, so that in that simple case, the window
e5f95d5c 5844scrolls by a full window height. Meaningful values are
175e9712 5845between 0.0 and 1.0, inclusive. */);
177c0ea7 5846
1ab256cb
RM
5847/*DEFVAR_LISP ("debug-check-symbol", &Vcheck_symbol,
5848 "Don't ask.");
5849*/
1ab256cb 5850
7ee72033
MB
5851 DEFVAR_LISP ("before-change-functions", &Vbefore_change_functions,
5852 doc: /* List of functions to call before each text change.
018ba359
PJ
5853Two arguments are passed to each function: the positions of
5854the beginning and end of the range of old text to be changed.
5855\(For an insertion, the beginning and end are at the same place.)
5856No information is given about the length of the text after the change.
5857
5858Buffer changes made while executing the `before-change-functions'
5859don't call any before-change or after-change functions.
5860That's because these variables are temporarily set to nil.
5861As a result, a hook function cannot straightforwardly alter the value of
5862these variables. See the Emacs Lisp manual for a way of
5863accomplishing an equivalent result by using other variables.
5864
5865If an unhandled error happens in running these functions,
5866the variable's value remains nil. That prevents the error
5867from happening repeatedly and making Emacs nonfunctional. */);
5f079267
RS
5868 Vbefore_change_functions = Qnil;
5869
7ee72033 5870 DEFVAR_LISP ("after-change-functions", &Vafter_change_functions,
eacdfade 5871 doc: /* List of functions to call after each text change.
018ba359
PJ
5872Three arguments are passed to each function: the positions of
5873the beginning and end of the range of changed text,
5874and the length in bytes of the pre-change text replaced by that range.
5875\(For an insertion, the pre-change length is zero;
5876for a deletion, that length is the number of bytes deleted,
5877and the post-change beginning and end are at the same place.)
5878
5879Buffer changes made while executing the `after-change-functions'
5880don't call any before-change or after-change functions.
5881That's because these variables are temporarily set to nil.
5882As a result, a hook function cannot straightforwardly alter the value of
5883these variables. See the Emacs Lisp manual for a way of
5884accomplishing an equivalent result by using other variables.
5885
5886If an unhandled error happens in running these functions,
5887the variable's value remains nil. That prevents the error
5888from happening repeatedly and making Emacs nonfunctional. */);
5f079267
RS
5889 Vafter_change_functions = Qnil;
5890
7ee72033 5891 DEFVAR_LISP ("first-change-hook", &Vfirst_change_hook,
efc7e75f 5892 doc: /* A list of functions to call before changing a buffer which is unmodified.
018ba359 5893The functions are run using the `run-hooks' function. */);
dbc4e1c1 5894 Vfirst_change_hook = Qnil;
1ab256cb 5895
7ee72033
MB
5896 DEFVAR_PER_BUFFER ("buffer-undo-list", &current_buffer->undo_list, Qnil,
5897 doc: /* List of undo entries in current buffer.
018ba359
PJ
5898Recent changes come first; older changes follow newer.
5899
5900An entry (BEG . END) represents an insertion which begins at
5901position BEG and ends at position END.
5902
5903An entry (TEXT . POSITION) represents the deletion of the string TEXT
5904from (abs POSITION). If POSITION is positive, point was at the front
5905of the text being deleted; if negative, point was at the end.
5906
5907An entry (t HIGH . LOW) indicates that the buffer previously had
5908\"unmodified\" status. HIGH and LOW are the high and low 16-bit portions
5909of the visited file's modification time, as of that time. If the
5910modification time of the most recent save is different, this entry is
5911obsolete.
5912
5913An entry (nil PROPERTY VALUE BEG . END) indicates that a text property
5914was modified between BEG and END. PROPERTY is the property name,
5915and VALUE is the old value.
5916
7405f386
KS
5917An entry (apply FUN-NAME . ARGS) means undo the change with
5918\(apply FUN-NAME ARGS).
5919
5920An entry (apply DELTA BEG END FUN-NAME . ARGS) supports selective undo
5921in the active region. BEG and END is the range affected by this entry
5922and DELTA is the number of bytes added or deleted in that range by
5923this change.
c6c7dc03 5924
018ba359
PJ
5925An entry (MARKER . DISTANCE) indicates that the marker MARKER
5926was adjusted in position by the offset DISTANCE (an integer).
5927
5928An entry of the form POSITION indicates that point was at the buffer
5929location given by the integer. Undoing an entry of this form places
5930point at POSITION.
5931
b4c4f2f4
JB
5932Entries with value `nil' mark undo boundaries. The undo command treats
5933the changes between two undo boundaries as a single step to be undone.
018ba359
PJ
5934
5935If the value of the variable is t, undo information is not recorded. */);
5936
7ee72033
MB
5937 DEFVAR_PER_BUFFER ("mark-active", &current_buffer->mark_active, Qnil,
5938 doc: /* Non-nil means the mark and region are currently active in this buffer. */);
018ba359 5939
7ee72033
MB
5940 DEFVAR_PER_BUFFER ("cache-long-line-scans", &current_buffer->cache_long_line_scans, Qnil,
5941 doc: /* Non-nil means that Emacs should use caches to handle long lines more quickly.
018ba359
PJ
5942
5943Normally, the line-motion functions work by scanning the buffer for
5629f29b
DK
5944newlines. Columnar operations (like `move-to-column' and
5945`compute-motion') also work by scanning the buffer, summing character
018ba359
PJ
5946widths as they go. This works well for ordinary text, but if the
5947buffer's lines are very long (say, more than 500 characters), these
5948motion functions will take longer to execute. Emacs may also take
5949longer to update the display.
5950
5629f29b 5951If `cache-long-line-scans' is non-nil, these motion functions cache the
018ba359
PJ
5952results of their scans, and consult the cache to avoid rescanning
5953regions of the buffer until the text is modified. The caches are most
5954beneficial when they prevent the most searching---that is, when the
5955buffer contains long lines and large regions of characters with the
5956same, fixed screen width.
5957
5629f29b 5958When `cache-long-line-scans' is non-nil, processing short lines will
018ba359
PJ
5959become slightly slower (because of the overhead of consulting the
5960cache), and the caches will use memory roughly proportional to the
5961number of newlines and characters whose screen width varies.
5962
5963The caches require no explicit maintenance; their accuracy is
5964maintained internally by the Emacs primitives. Enabling or disabling
5965the cache should not affect the behavior of any of the motion
5966functions; it should only affect their performance. */);
5967
7ee72033
MB
5968 DEFVAR_PER_BUFFER ("point-before-scroll", &current_buffer->point_before_scroll, Qnil,
5969 doc: /* Value of point before the last series of scroll operations, or nil. */);
018ba359 5970
7ee72033
MB
5971 DEFVAR_PER_BUFFER ("buffer-file-format", &current_buffer->file_format, Qnil,
5972 doc: /* List of formats to use when saving this buffer.
018ba359 5973Formats are defined by `format-alist'. This variable is
a9b9a780 5974set when a file is visited. */);
be9aafdd 5975
71ed49fa
LT
5976 DEFVAR_PER_BUFFER ("buffer-auto-save-file-format",
5977 &current_buffer->auto_save_file_format, Qnil,
5978 doc: /* *Format in which to write auto-save files.
5979Should be a list of symbols naming formats that are defined in `format-alist'.
5980If it is t, which is the default, auto-save files are written in the
5981same format as a regular save would use. */);
5982
3cb719bd 5983 DEFVAR_PER_BUFFER ("buffer-invisibility-spec",
7ee72033
MB
5984 &current_buffer->invisibility_spec, Qnil,
5985 doc: /* Invisibility spec of this buffer.
018ba359
PJ
5986The default is t, which means that text is invisible
5987if it has a non-nil `invisible' property.
5988If the value is a list, a text character is invisible if its `invisible'
b49dd850 5989property is an element in that list (or is a list with members in common).
018ba359
PJ
5990If an element is a cons cell of the form (PROP . ELLIPSIS),
5991then characters with property value PROP are invisible,
5992and they have an ellipsis as well if ELLIPSIS is non-nil. */);
3cb719bd 5993
7962a441 5994 DEFVAR_PER_BUFFER ("buffer-display-count",
7ee72033
MB
5995 &current_buffer->display_count, Qnil,
5996 doc: /* A number incremented each time this buffer is displayed in a window.
018ba359 5997The function `set-window-buffer' increments it. */);
3fd364db
RS
5998
5999 DEFVAR_PER_BUFFER ("buffer-display-time",
7ee72033
MB
6000 &current_buffer->display_time, Qnil,
6001 doc: /* Time stamp updated each time this buffer is displayed in a window.
018ba359
PJ
6002The function `set-window-buffer' updates this variable
6003to the value obtained by calling `current-time'.
6004If the buffer has never been shown in a window, the value is nil. */);
6005
7ee72033
MB
6006 DEFVAR_LISP ("transient-mark-mode", &Vtransient_mark_mode,
6007 doc: /* *Non-nil means deactivate the mark when the buffer contents change.
018ba359
PJ
6008Non-nil also enables highlighting of the region whenever the mark is active.
6009The variable `highlight-nonselected-windows' controls whether to highlight
5a39b770
RS
6010all windows or just the selected window.
6011
6012If the value is `lambda', that enables Transient Mark mode temporarily
6013until the next buffer modification. If a command sets the value to `only',
b3264fd2
RS
6014that enables Transient Mark mode for the following command only.
6015During that following command, the value of `transient-mark-mode'
6016is `identity'. If it is still `identity' at the end of that command,
6017it changes to nil. */);
c48f61ef
RS
6018 Vtransient_mark_mode = Qnil;
6019
7ee72033
MB
6020 DEFVAR_LISP ("inhibit-read-only", &Vinhibit_read_only,
6021 doc: /* *Non-nil means disregard read-only status of buffers or characters.
018ba359
PJ
6022If the value is t, disregard `buffer-read-only' and all `read-only'
6023text properties. If the value is a list, disregard `buffer-read-only'
6024and disregard a `read-only' text property if the property value
6025is a member of the list. */);
a96b68f1
RS
6026 Vinhibit_read_only = Qnil;
6027
7ee72033 6028 DEFVAR_PER_BUFFER ("cursor-type", &current_buffer->cursor_type, Qnil,
f6e22881 6029 doc: /* Cursor to use when this buffer is in the selected window.
018ba359
PJ
6030Values are interpreted as follows:
6031
b8dc613f
JB
6032 t use the cursor specified for the frame
6033 nil don't display a cursor
6034 box display a filled box cursor
6035 hollow display a hollow box cursor
6036 bar display a vertical bar cursor with default width
6037 (bar . WIDTH) display a vertical bar cursor with width WIDTH
6038 hbar display a horizontal bar cursor with default height
b4234f4c 6039 (hbar . HEIGHT) display a horizontal bar cursor with height HEIGHT
b8dc613f 6040 ANYTHING ELSE display a hollow box cursor
cd8d5236
RS
6041
6042When the buffer is displayed in a nonselected window,
6043this variable has no effect; the cursor appears as a hollow box. */);
bb2ec976 6044
a3bbced0 6045 DEFVAR_PER_BUFFER ("line-spacing",
7ee72033
MB
6046 &current_buffer->extra_line_spacing, Qnil,
6047 doc: /* Additional space to put between lines when displaying a buffer.
60ebfdf3
KS
6048The space is measured in pixels, and put below lines on window systems.
6049If value is a floating point number, it specifies the spacing relative
fc961256 6050to the default frame line height. A value of nil means add no extra space. */);
a3bbced0 6051
0124c5bd 6052 DEFVAR_PER_BUFFER ("cursor-in-non-selected-windows",
187ccf49 6053 &current_buffer->cursor_in_non_selected_windows, Qnil,
f6e22881 6054 doc: /* *Cursor type to display in non-selected windows.
fc961256 6055The value t means to use hollow box cursor. See `cursor-type' for other values. */);
0124c5bd 6056
7ee72033 6057 DEFVAR_LISP ("kill-buffer-query-functions", &Vkill_buffer_query_functions,
f6e22881
JB
6058 doc: /* List of functions called with no args to query before killing a buffer.
6059The buffer being killed will be current while the functions are running.
6060If any of them returns nil, the buffer is not killed. */);
dcdffbf6
RS
6061 Vkill_buffer_query_functions = Qnil;
6062
43ed3b8d
CY
6063 DEFVAR_LISP ("change-major-mode-hook", &Vchange_major_mode_hook,
6064 doc: /* Normal hook run before changing the major mode of a buffer.
6065The function `kill-all-local-variables' runs this before doing anything else. */);
6066 Vchange_major_mode_hook = Qnil;
6067 Qchange_major_mode_hook = intern ("change-major-mode-hook");
6068 staticpro (&Qchange_major_mode_hook);
6069
0dc88e60 6070 defsubr (&Sbuffer_live_p);
1ab256cb
RM
6071 defsubr (&Sbuffer_list);
6072 defsubr (&Sget_buffer);
6073 defsubr (&Sget_file_buffer);
6074 defsubr (&Sget_buffer_create);
336cd056 6075 defsubr (&Smake_indirect_buffer);
01050cb5 6076 defsubr (&Sgenerate_new_buffer_name);
1ab256cb
RM
6077 defsubr (&Sbuffer_name);
6078/*defsubr (&Sbuffer_number);*/
6079 defsubr (&Sbuffer_file_name);
336cd056 6080 defsubr (&Sbuffer_base_buffer);
79aa712d 6081 defsubr (&Sbuffer_local_value);
1ab256cb
RM
6082 defsubr (&Sbuffer_local_variables);
6083 defsubr (&Sbuffer_modified_p);
6084 defsubr (&Sset_buffer_modified_p);
6085 defsubr (&Sbuffer_modified_tick);
3e145152 6086 defsubr (&Sbuffer_chars_modified_tick);
1ab256cb
RM
6087 defsubr (&Srename_buffer);
6088 defsubr (&Sother_buffer);
1ab256cb
RM
6089 defsubr (&Sbuffer_enable_undo);
6090 defsubr (&Skill_buffer);
a9ee7a59 6091 defsubr (&Sset_buffer_major_mode);
1ab256cb
RM
6092 defsubr (&Sswitch_to_buffer);
6093 defsubr (&Spop_to_buffer);
6094 defsubr (&Scurrent_buffer);
6095 defsubr (&Sset_buffer);
6096 defsubr (&Sbarf_if_buffer_read_only);
6097 defsubr (&Sbury_buffer);
3ac81adb
RS
6098 defsubr (&Serase_buffer);
6099 defsubr (&Sset_buffer_multibyte);
1ab256cb 6100 defsubr (&Skill_all_local_variables);
2eec3b4e 6101
52f8ec73 6102 defsubr (&Soverlayp);
2eec3b4e
RS
6103 defsubr (&Smake_overlay);
6104 defsubr (&Sdelete_overlay);
6105 defsubr (&Smove_overlay);
8ebafa8d
JB
6106 defsubr (&Soverlay_start);
6107 defsubr (&Soverlay_end);
6108 defsubr (&Soverlay_buffer);
6109 defsubr (&Soverlay_properties);
2eec3b4e 6110 defsubr (&Soverlays_at);
74514898 6111 defsubr (&Soverlays_in);
2eec3b4e 6112 defsubr (&Snext_overlay_change);
239c932b 6113 defsubr (&Sprevious_overlay_change);
2eec3b4e
RS
6114 defsubr (&Soverlay_recenter);
6115 defsubr (&Soverlay_lists);
6116 defsubr (&Soverlay_get);
6117 defsubr (&Soverlay_put);
a8c21b48 6118 defsubr (&Srestore_buffer_modified_p);
1ab256cb
RM
6119}
6120
dfcf069d 6121void
1ab256cb
RM
6122keys_of_buffer ()
6123{
6124 initial_define_key (control_x_map, 'b', "switch-to-buffer");
6125 initial_define_key (control_x_map, 'k', "kill-buffer");
4158c17d
RM
6126
6127 /* This must not be in syms_of_buffer, because Qdisabled is not
6128 initialized when that function gets called. */
6129 Fput (intern ("erase-buffer"), Qdisabled, Qt);
1ab256cb 6130}
ab5796a9
MB
6131
6132/* arch-tag: e48569bf-69a9-4b65-a23b-8e68769436e1
6133 (do not change this comment) */