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