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