(imagemagick_load_image): Remove the ping_wand code
[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));
891 Fset_marker (ov->start, Qnil, Qnil);
892 Fset_marker (ov->end, Qnil, Qnil);
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);
e9a9ae03 936 b->modtime = make_emacs_time (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). */)
5842a27b 3837 (Lisp_Object beg, Lisp_Object end, Lisp_Object buffer, Lisp_Object front_advance, Lisp_Object rear_advance)
2eec3b4e
RS
3838{
3839 Lisp_Object overlay;
5c4f68f1 3840 struct buffer *b;
2eec3b4e 3841
5c4f68f1 3842 if (NILP (buffer))
67180c6a 3843 XSETBUFFER (buffer, current_buffer);
883047b9 3844 else
b7826503 3845 CHECK_BUFFER (buffer);
883047b9
JB
3846 if (MARKERP (beg)
3847 && ! EQ (Fmarker_buffer (beg), buffer))
3848 error ("Marker points into wrong buffer");
3849 if (MARKERP (end)
3850 && ! EQ (Fmarker_buffer (end), buffer))
3851 error ("Marker points into wrong buffer");
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
883047b9
JB
3977 if (MARKERP (beg)
3978 && ! EQ (Fmarker_buffer (beg), buffer))
3979 error ("Marker points into wrong buffer");
3980 if (MARKERP (end)
3981 && ! EQ (Fmarker_buffer (end), buffer))
3982 error ("Marker points into wrong buffer");
3983
b7826503
PJ
3984 CHECK_NUMBER_COERCE_MARKER (beg);
3985 CHECK_NUMBER_COERCE_MARKER (end);
d311d28c 3986
471fe23d 3987 if (XINT (beg) > XINT (end))
02481186 3988 {
471fe23d
TN
3989 Lisp_Object temp;
3990 temp = beg; beg = end; end = temp;
02481186
PE
3991 }
3992
9d7608b7
KH
3993 specbind (Qinhibit_quit, Qt);
3994
0a4469c9 3995 obuffer = Fmarker_buffer (OVERLAY_START (overlay));
79cce3f2 3996 b = XBUFFER (buffer);
471fe23d
TN
3997
3998 if (!NILP (obuffer))
3999 {
4000 ob = XBUFFER (obuffer);
4001
4002 o_beg = OVERLAY_POSITION (OVERLAY_START (overlay));
4003 o_end = OVERLAY_POSITION (OVERLAY_END (overlay));
4004
4cb3e6b3 4005 unchain_both (ob, overlay);
471fe23d
TN
4006 }
4007
4008 /* Set the overlay boundaries, which may clip them. */
4009 Fset_marker (OVERLAY_START (overlay), beg, buffer);
4010 Fset_marker (OVERLAY_END (overlay), end, buffer);
4011
4012 n_beg = marker_position (OVERLAY_START (overlay));
4013 n_end = marker_position (OVERLAY_END (overlay));
2eec3b4e 4014
c82ed728 4015 /* If the overlay has changed buffers, do a thorough redisplay. */
0a4469c9 4016 if (!EQ (buffer, obuffer))
50760c4a
RS
4017 {
4018 /* Redisplay where the overlay was. */
471fe23d
TN
4019 if (ob)
4020 modify_overlay (ob, o_beg, o_end);
50760c4a
RS
4021
4022 /* Redisplay where the overlay is going to be. */
79cce3f2 4023 modify_overlay (b, n_beg, n_end);
50760c4a 4024 }
c82ed728
JB
4025 else
4026 /* Redisplay the area the overlay has just left, or just enclosed. */
4027 {
79cce3f2
PE
4028 if (o_beg == n_beg)
4029 modify_overlay (b, o_end, n_end);
4030 else if (o_end == n_end)
4031 modify_overlay (b, o_beg, n_beg);
c82ed728 4032 else
79cce3f2 4033 modify_overlay (b, min (o_beg, n_beg), max (o_end, n_end));
c82ed728 4034 }
b61982dd 4035
471fe23d
TN
4036 /* Delete the overlay if it is empty after clipping and has the
4037 evaporate property. */
4038 if (n_beg == n_end && !NILP (Foverlay_get (overlay, Qevaporate)))
4039 return unbind_to (count, Fdelete_overlay (overlay));
02481186 4040
471fe23d
TN
4041 /* Put the overlay into the new buffer's overlay lists, first on the
4042 wrong list. */
4043 if (n_end < b->overlay_center)
2410d73a 4044 {
fd318b54 4045 XOVERLAY (overlay)->next = b->overlays_after;
0c94c8d6 4046 set_buffer_overlays_after (b, XOVERLAY (overlay));
2410d73a 4047 }
2eec3b4e 4048 else
2410d73a 4049 {
fd318b54 4050 XOVERLAY (overlay)->next = b->overlays_before;
0c94c8d6 4051 set_buffer_overlays_before (b, XOVERLAY (overlay));
2410d73a 4052 }
2eec3b4e
RS
4053
4054 /* This puts it in the right list, and in the right order. */
c2d5b10f 4055 recenter_overlay_lists (b, b->overlay_center);
2eec3b4e 4056
0a4469c9 4057 return unbind_to (count, overlay);
2eec3b4e
RS
4058}
4059
4060DEFUN ("delete-overlay", Fdelete_overlay, Sdelete_overlay, 1, 1, 0,
7ee72033 4061 doc: /* Delete the overlay OVERLAY from its buffer. */)
5842a27b 4062 (Lisp_Object overlay)
2eec3b4e 4063{
0a4469c9 4064 Lisp_Object buffer;
5c4f68f1 4065 struct buffer *b;
d311d28c 4066 ptrdiff_t count = SPECPDL_INDEX ();
5c4f68f1 4067
b7826503 4068 CHECK_OVERLAY (overlay);
52f8ec73 4069
0a4469c9
RS
4070 buffer = Fmarker_buffer (OVERLAY_START (overlay));
4071 if (NILP (buffer))
4072 return Qnil;
4073
4074 b = XBUFFER (buffer);
0a4469c9 4075 specbind (Qinhibit_quit, Qt);
177c0ea7 4076
4cb3e6b3 4077 unchain_both (b, overlay);
041a49a6 4078 drop_overlay (b, XOVERLAY (overlay));
3ece337a 4079
e58c389d 4080 /* When deleting an overlay with before or after strings, turn off
26f545d7
GM
4081 display optimizations for the affected buffer, on the basis that
4082 these strings may contain newlines. This is easier to do than to
4083 check for that situation during redisplay. */
4084 if (!windows_or_buffers_changed
4085 && (!NILP (Foverlay_get (overlay, Qbefore_string))
4086 || !NILP (Foverlay_get (overlay, Qafter_string))))
4087 b->prevent_redisplay_optimizations_p = 1;
4088
0a4469c9 4089 return unbind_to (count, Qnil);
2eec3b4e 4090}
c5e28e39
MR
4091
4092DEFUN ("delete-all-overlays", Fdelete_all_overlays, Sdelete_all_overlays, 0, 1, 0,
4093 doc: /* Delete all overlays of BUFFER.
4094BUFFER omitted or nil means delete all overlays of the current
4095buffer. */)
4096 (Lisp_Object buffer)
4097{
4098 register struct buffer *buf;
4099
4100 if (NILP (buffer))
4101 buf = current_buffer;
4102 else
4103 {
4104 CHECK_BUFFER (buffer);
4105 buf = XBUFFER (buffer);
4106 }
4107
4108 delete_all_overlays (buf);
26d4541d 4109 return Qnil;
c5e28e39 4110}
2eec3b4e 4111\f
8ebafa8d
JB
4112/* Overlay dissection functions. */
4113
a7ca3326 4114DEFUN ("overlay-start", Foverlay_start, Soverlay_start, 1, 1, 0,
7ee72033 4115 doc: /* Return the position at which OVERLAY starts. */)
5842a27b 4116 (Lisp_Object overlay)
8ebafa8d 4117{
b7826503 4118 CHECK_OVERLAY (overlay);
8ebafa8d
JB
4119
4120 return (Fmarker_position (OVERLAY_START (overlay)));
4121}
4122
a7ca3326 4123DEFUN ("overlay-end", Foverlay_end, Soverlay_end, 1, 1, 0,
7ee72033 4124 doc: /* Return the position at which OVERLAY ends. */)
5842a27b 4125 (Lisp_Object overlay)
8ebafa8d 4126{
b7826503 4127 CHECK_OVERLAY (overlay);
8ebafa8d
JB
4128
4129 return (Fmarker_position (OVERLAY_END (overlay)));
4130}
4131
4132DEFUN ("overlay-buffer", Foverlay_buffer, Soverlay_buffer, 1, 1, 0,
563f7128
LK
4133 doc: /* Return the buffer OVERLAY belongs to.
4134Return nil if OVERLAY has been deleted. */)
5842a27b 4135 (Lisp_Object overlay)
8ebafa8d 4136{
b7826503 4137 CHECK_OVERLAY (overlay);
8ebafa8d
JB
4138
4139 return Fmarker_buffer (OVERLAY_START (overlay));
4140}
4141
4142DEFUN ("overlay-properties", Foverlay_properties, Soverlay_properties, 1, 1, 0,
7ee72033 4143 doc: /* Return a list of the properties on OVERLAY.
018ba359 4144This is a copy of OVERLAY's plist; modifying its conses has no effect on
7ee72033 4145OVERLAY. */)
5842a27b 4146 (Lisp_Object overlay)
8ebafa8d 4147{
b7826503 4148 CHECK_OVERLAY (overlay);
8ebafa8d 4149
c644523b 4150 return Fcopy_sequence (XOVERLAY (overlay)->plist);
8ebafa8d
JB
4151}
4152
4153\f
2eec3b4e 4154DEFUN ("overlays-at", Foverlays_at, Soverlays_at, 1, 1, 0,
aabc29c8 4155 doc: /* Return a list of the overlays that contain the character at POS. */)
5842a27b 4156 (Lisp_Object pos)
2eec3b4e 4157{
b081724f 4158 ptrdiff_t len, noverlays;
2eec3b4e 4159 Lisp_Object *overlay_vec;
2eec3b4e
RS
4160 Lisp_Object result;
4161
b7826503 4162 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e
RS
4163
4164 len = 10;
a9800ae8 4165 /* We can't use alloca here because overlays_at can call xrealloc. */
38182d90 4166 overlay_vec = xmalloc (len * sizeof *overlay_vec);
2eec3b4e
RS
4167
4168 /* Put all the overlays we want in a vector in overlay_vec.
4169 Store the length in len. */
2a77a7d7 4170 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
090cf9db 4171 NULL, NULL, 0);
2eec3b4e
RS
4172
4173 /* Make a list of them all. */
4174 result = Flist (noverlays, overlay_vec);
4175
9ac0d9e0 4176 xfree (overlay_vec);
2eec3b4e
RS
4177 return result;
4178}
4179
74514898 4180DEFUN ("overlays-in", Foverlays_in, Soverlays_in, 2, 2, 0,
7ee72033 4181 doc: /* Return a list of the overlays that overlap the region BEG ... END.
018ba359
PJ
4182Overlap means that at least one character is contained within the overlay
4183and also contained within the specified region.
7723e095
MR
4184Empty overlays are included in the result if they are located at BEG,
4185between BEG and END, or at END provided END denotes the position at the
4186end of the buffer. */)
5842a27b 4187 (Lisp_Object beg, Lisp_Object end)
74514898 4188{
21514da7 4189 ptrdiff_t len, noverlays;
74514898 4190 Lisp_Object *overlay_vec;
74514898
RS
4191 Lisp_Object result;
4192
b7826503
PJ
4193 CHECK_NUMBER_COERCE_MARKER (beg);
4194 CHECK_NUMBER_COERCE_MARKER (end);
74514898
RS
4195
4196 len = 10;
38182d90 4197 overlay_vec = xmalloc (len * sizeof *overlay_vec);
74514898
RS
4198
4199 /* Put all the overlays we want in a vector in overlay_vec.
4200 Store the length in len. */
4201 noverlays = overlays_in (XINT (beg), XINT (end), 1, &overlay_vec, &len,
145582a0 4202 NULL, NULL);
74514898
RS
4203
4204 /* Make a list of them all. */
4205 result = Flist (noverlays, overlay_vec);
4206
4207 xfree (overlay_vec);
4208 return result;
4209}
4210
a7ca3326 4211DEFUN ("next-overlay-change", Fnext_overlay_change, Snext_overlay_change,
efc7e75f 4212 1, 1, 0,
7ee72033 4213 doc: /* Return the next position after POS where an overlay starts or ends.
624d2678
RS
4214If there are no overlay boundaries from POS to (point-max),
4215the value is (point-max). */)
5842a27b 4216 (Lisp_Object pos)
2eec3b4e 4217{
b081724f 4218 ptrdiff_t i, len, noverlays;
d311d28c 4219 ptrdiff_t endpos;
2eec3b4e 4220 Lisp_Object *overlay_vec;
2eec3b4e 4221
b7826503 4222 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e
RS
4223
4224 len = 10;
38182d90 4225 overlay_vec = xmalloc (len * sizeof *overlay_vec);
2eec3b4e
RS
4226
4227 /* Put all the overlays we want in a vector in overlay_vec.
4228 Store the length in len.
4229 endpos gets the position where the next overlay starts. */
2a77a7d7 4230 noverlays = overlays_at (XINT (pos), 1, &overlay_vec, &len,
d311d28c 4231 &endpos, 0, 1);
2eec3b4e
RS
4232
4233 /* If any of these overlays ends before endpos,
4234 use its ending point instead. */
4235 for (i = 0; i < noverlays; i++)
4236 {
4237 Lisp_Object oend;
d311d28c 4238 ptrdiff_t oendpos;
2eec3b4e
RS
4239
4240 oend = OVERLAY_END (overlay_vec[i]);
4241 oendpos = OVERLAY_POSITION (oend);
4242 if (oendpos < endpos)
4243 endpos = oendpos;
1ab256cb
RM
4244 }
4245
9ac0d9e0 4246 xfree (overlay_vec);
2eec3b4e
RS
4247 return make_number (endpos);
4248}
239c932b 4249
a7ca3326 4250DEFUN ("previous-overlay-change", Fprevious_overlay_change,
239c932b 4251 Sprevious_overlay_change, 1, 1, 0,
7ee72033 4252 doc: /* Return the previous position before POS where an overlay starts or ends.
624d2678
RS
4253If there are no overlay boundaries from (point-min) to POS,
4254the value is (point-min). */)
5842a27b 4255 (Lisp_Object pos)
239c932b 4256{
d311d28c 4257 ptrdiff_t prevpos;
239c932b 4258 Lisp_Object *overlay_vec;
b081724f 4259 ptrdiff_t len;
239c932b 4260
b7826503 4261 CHECK_NUMBER_COERCE_MARKER (pos);
239c932b 4262
624bbdc4
RS
4263 /* At beginning of buffer, we know the answer;
4264 avoid bug subtracting 1 below. */
4265 if (XINT (pos) == BEGV)
4266 return pos;
4267
017f0539 4268 len = 10;
38182d90 4269 overlay_vec = xmalloc (len * sizeof *overlay_vec);
017f0539 4270
239c932b
RS
4271 /* Put all the overlays we want in a vector in overlay_vec.
4272 Store the length in len.
daa1c109 4273 prevpos gets the position of the previous change. */
328ab8e7 4274 overlays_at (XINT (pos), 1, &overlay_vec, &len,
d311d28c 4275 0, &prevpos, 1);
239c932b 4276
239c932b
RS
4277 xfree (overlay_vec);
4278 return make_number (prevpos);
4279}
2eec3b4e
RS
4280\f
4281/* These functions are for debugging overlays. */
4282
4283DEFUN ("overlay-lists", Foverlay_lists, Soverlay_lists, 0, 0, 0,
7ee72033 4284 doc: /* Return a pair of lists giving all the overlays of the current buffer.
018ba359
PJ
4285The car has all the overlays before the overlay center;
4286the cdr has all the overlays after the overlay center.
4287Recentering overlays moves overlays between these lists.
4288The lists you get are copies, so that changing them has no effect.
7ee72033 4289However, the overlays you get are the real objects that the buffer uses. */)
5842a27b 4290 (void)
2eec3b4e 4291{
2410d73a
SM
4292 struct Lisp_Overlay *ol;
4293 Lisp_Object before = Qnil, after = Qnil, tmp;
4cb3e6b3 4294
fd318b54 4295 for (ol = current_buffer->overlays_before; ol; ol = ol->next)
2410d73a
SM
4296 {
4297 XSETMISC (tmp, ol);
4298 before = Fcons (tmp, before);
4299 }
fd318b54 4300 for (ol = current_buffer->overlays_after; ol; ol = ol->next)
2410d73a
SM
4301 {
4302 XSETMISC (tmp, ol);
4303 after = Fcons (tmp, after);
4304 }
4cb3e6b3 4305
2410d73a 4306 return Fcons (Fnreverse (before), Fnreverse (after));
2eec3b4e
RS
4307}
4308
4309DEFUN ("overlay-recenter", Foverlay_recenter, Soverlay_recenter, 1, 1, 0,
c87426c5
RS
4310 doc: /* Recenter the overlays of the current buffer around position POS.
4311That makes overlay lookup faster for positions near POS (but perhaps slower
4312for positions far away from POS). */)
5842a27b 4313 (Lisp_Object pos)
2eec3b4e 4314{
d311d28c 4315 ptrdiff_t p;
b7826503 4316 CHECK_NUMBER_COERCE_MARKER (pos);
2eec3b4e 4317
d311d28c
PE
4318 p = clip_to_bounds (PTRDIFF_MIN, XINT (pos), PTRDIFF_MAX);
4319 recenter_overlay_lists (current_buffer, p);
2eec3b4e
RS
4320 return Qnil;
4321}
4322\f
a7ca3326 4323DEFUN ("overlay-get", Foverlay_get, Soverlay_get, 2, 2, 0,
7ee72033 4324 doc: /* Get the property of overlay OVERLAY with property name PROP. */)
5842a27b 4325 (Lisp_Object overlay, Lisp_Object prop)
2eec3b4e 4326{
b7826503 4327 CHECK_OVERLAY (overlay);
c644523b 4328 return lookup_char_property (XOVERLAY (overlay)->plist, prop, 0);
2eec3b4e
RS
4329}
4330
4331DEFUN ("overlay-put", Foverlay_put, Soverlay_put, 3, 3, 0,
7c301272
LMI
4332 doc: /* Set one property of overlay OVERLAY: give property PROP value VALUE.
4333VALUE will be returned.*/)
5842a27b 4334 (Lisp_Object overlay, Lisp_Object prop, Lisp_Object value)
2eec3b4e 4335{
48e2e3ba 4336 Lisp_Object tail, buffer;
37ef52bb 4337 bool changed;
2eec3b4e 4338
b7826503 4339 CHECK_OVERLAY (overlay);
b61982dd 4340
274a9425
RS
4341 buffer = Fmarker_buffer (OVERLAY_START (overlay));
4342
c644523b 4343 for (tail = XOVERLAY (overlay)->plist;
7539e11f
KR
4344 CONSP (tail) && CONSP (XCDR (tail));
4345 tail = XCDR (XCDR (tail)))
4346 if (EQ (XCAR (tail), prop))
274a9425 4347 {
7539e11f 4348 changed = !EQ (XCAR (XCDR (tail)), value);
f3fbd155 4349 XSETCAR (XCDR (tail), value);
9d7608b7 4350 goto found;
274a9425 4351 }
9d7608b7
KH
4352 /* It wasn't in the list, so add it to the front. */
4353 changed = !NILP (value);
c644523b
DA
4354 set_overlay_plist
4355 (overlay, Fcons (prop, Fcons (value, XOVERLAY (overlay)->plist)));
9d7608b7
KH
4356 found:
4357 if (! NILP (buffer))
4358 {
4359 if (changed)
876aa27c 4360 modify_overlay (XBUFFER (buffer),
26f545d7
GM
4361 marker_position (OVERLAY_START (overlay)),
4362 marker_position (OVERLAY_END (overlay)));
9d7608b7
KH
4363 if (EQ (prop, Qevaporate) && ! NILP (value)
4364 && (OVERLAY_POSITION (OVERLAY_START (overlay))
4365 == OVERLAY_POSITION (OVERLAY_END (overlay))))
4366 Fdelete_overlay (overlay);
4367 }
7d63db98 4368
2eec3b4e 4369 return value;
1ab256cb
RM
4370}
4371\f
9115729e
KH
4372/* Subroutine of report_overlay_modification. */
4373
4374/* Lisp vector holding overlay hook functions to call.
4375 Vector elements come in pairs.
4376 Each even-index element is a list of hook functions.
4377 The following odd-index element is the overlay they came from.
4378
4379 Before the buffer change, we fill in this vector
4380 as we call overlay hook functions.
4381 After the buffer change, we get the functions to call from this vector.
4382 This way we always call the same functions before and after the change. */
4383static Lisp_Object last_overlay_modification_hooks;
4384
4385/* Number of elements actually used in last_overlay_modification_hooks. */
d311d28c 4386static ptrdiff_t last_overlay_modification_hooks_used;
9115729e
KH
4387
4388/* Add one functionlist/overlay pair
4389 to the end of last_overlay_modification_hooks. */
4390
4391static void
d3da34e0 4392add_overlay_mod_hooklist (Lisp_Object functionlist, Lisp_Object overlay)
9115729e 4393{
d311d28c 4394 ptrdiff_t oldsize = ASIZE (last_overlay_modification_hooks);
9115729e 4395
d311d28c
PE
4396 if (oldsize - 1 <= last_overlay_modification_hooks_used)
4397 last_overlay_modification_hooks =
4398 larger_vector (last_overlay_modification_hooks, 2, -1);
3ae565b3
SM
4399 ASET (last_overlay_modification_hooks, last_overlay_modification_hooks_used,
4400 functionlist); last_overlay_modification_hooks_used++;
4401 ASET (last_overlay_modification_hooks, last_overlay_modification_hooks_used,
4402 overlay); last_overlay_modification_hooks_used++;
9115729e
KH
4403}
4404\f
173f2a64
RS
4405/* Run the modification-hooks of overlays that include
4406 any part of the text in START to END.
9115729e
KH
4407 If this change is an insertion, also
4408 run the insert-before-hooks of overlay starting at END,
930a9140
RS
4409 and the insert-after-hooks of overlay ending at START.
4410
4411 This is called both before and after the modification.
37ef52bb 4412 AFTER is true when we call after the modification.
930a9140 4413
9115729e
KH
4414 ARG1, ARG2, ARG3 are arguments to pass to the hook functions.
4415 When AFTER is nonzero, they are the start position,
4416 the position after the inserted new text,
4417 and the length of deleted or replaced old text. */
173f2a64
RS
4418
4419void
37ef52bb 4420report_overlay_modification (Lisp_Object start, Lisp_Object end, bool after,
d3da34e0 4421 Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
173f2a64 4422{
2410d73a
SM
4423 Lisp_Object prop, overlay;
4424 struct Lisp_Overlay *tail;
37ef52bb
PE
4425 /* True if this change is an insertion. */
4426 bool insertion = (after ? XFASTINT (arg3) == 0 : EQ (start, end));
a615c6dc 4427 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
55b48893
RS
4428
4429 overlay = Qnil;
2410d73a 4430 tail = NULL;
9115729e 4431
27c6b98e
SM
4432 /* We used to run the functions as soon as we found them and only register
4433 them in last_overlay_modification_hooks for the purpose of the `after'
4434 case. But running elisp code as we traverse the list of overlays is
4435 painful because the list can be modified by the elisp code so we had to
4436 copy at several places. We now simply do a read-only traversal that
4437 only collects the functions to run and we run them afterwards. It's
4438 simpler, especially since all the code was already there. -stef */
4439
a615c6dc 4440 if (!after)
173f2a64 4441 {
a615c6dc
SM
4442 /* We are being called before a change.
4443 Scan the overlays to find the functions to call. */
4444 last_overlay_modification_hooks_used = 0;
fd318b54 4445 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
173f2a64 4446 {
d311d28c 4447 ptrdiff_t startpos, endpos;
a615c6dc
SM
4448 Lisp_Object ostart, oend;
4449
2410d73a 4450 XSETMISC (overlay, tail);
a615c6dc
SM
4451
4452 ostart = OVERLAY_START (overlay);
4453 oend = OVERLAY_END (overlay);
4454 endpos = OVERLAY_POSITION (oend);
4455 if (XFASTINT (start) > endpos)
4456 break;
4457 startpos = OVERLAY_POSITION (ostart);
4458 if (insertion && (XFASTINT (start) == startpos
4459 || XFASTINT (end) == startpos))
5fb5aa33 4460 {
a615c6dc
SM
4461 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
4462 if (!NILP (prop))
4463 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4464 }
a615c6dc
SM
4465 if (insertion && (XFASTINT (start) == endpos
4466 || XFASTINT (end) == endpos))
5fb5aa33 4467 {
a615c6dc
SM
4468 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
4469 if (!NILP (prop))
4470 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4471 }
a615c6dc
SM
4472 /* Test for intersecting intervals. This does the right thing
4473 for both insertion and deletion. */
4474 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
5fb5aa33 4475 {
a615c6dc
SM
4476 prop = Foverlay_get (overlay, Qmodification_hooks);
4477 if (!NILP (prop))
4478 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4479 }
173f2a64 4480 }
60ebfdf3 4481
fd318b54 4482 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
173f2a64 4483 {
d311d28c 4484 ptrdiff_t startpos, endpos;
a615c6dc
SM
4485 Lisp_Object ostart, oend;
4486
2410d73a 4487 XSETMISC (overlay, tail);
a615c6dc
SM
4488
4489 ostart = OVERLAY_START (overlay);
4490 oend = OVERLAY_END (overlay);
4491 startpos = OVERLAY_POSITION (ostart);
4492 endpos = OVERLAY_POSITION (oend);
4493 if (XFASTINT (end) < startpos)
4494 break;
4495 if (insertion && (XFASTINT (start) == startpos
4496 || XFASTINT (end) == startpos))
5fb5aa33 4497 {
a615c6dc
SM
4498 prop = Foverlay_get (overlay, Qinsert_in_front_hooks);
4499 if (!NILP (prop))
4500 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4501 }
a615c6dc
SM
4502 if (insertion && (XFASTINT (start) == endpos
4503 || XFASTINT (end) == endpos))
5fb5aa33 4504 {
a615c6dc
SM
4505 prop = Foverlay_get (overlay, Qinsert_behind_hooks);
4506 if (!NILP (prop))
4507 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4508 }
a615c6dc
SM
4509 /* Test for intersecting intervals. This does the right thing
4510 for both insertion and deletion. */
4511 if (XFASTINT (end) > startpos && XFASTINT (start) < endpos)
5fb5aa33 4512 {
a615c6dc
SM
4513 prop = Foverlay_get (overlay, Qmodification_hooks);
4514 if (!NILP (prop))
4515 add_overlay_mod_hooklist (prop, overlay);
5fb5aa33 4516 }
173f2a64
RS
4517 }
4518 }
55b48893 4519
a615c6dc
SM
4520 GCPRO4 (overlay, arg1, arg2, arg3);
4521 {
4522 /* Call the functions recorded in last_overlay_modification_hooks.
4523 First copy the vector contents, in case some of these hooks
4524 do subsequent modification of the buffer. */
d311d28c 4525 ptrdiff_t size = last_overlay_modification_hooks_used;
38182d90 4526 Lisp_Object *copy = alloca (size * sizeof *copy);
d311d28c 4527 ptrdiff_t i;
a615c6dc 4528
72af86bd 4529 memcpy (copy, XVECTOR (last_overlay_modification_hooks)->contents,
663e2b3f 4530 size * word_size);
a615c6dc
SM
4531 gcpro1.var = copy;
4532 gcpro1.nvars = size;
4533
4534 for (i = 0; i < size;)
4535 {
8f54f30a
PE
4536 Lisp_Object prop_i, overlay_i;
4537 prop_i = copy[i++];
4538 overlay_i = copy[i++];
4539 call_overlay_mod_hooks (prop_i, overlay_i, after, arg1, arg2, arg3);
a615c6dc
SM
4540 }
4541 }
55b48893 4542 UNGCPRO;
173f2a64
RS
4543}
4544
4545static void
37ef52bb 4546call_overlay_mod_hooks (Lisp_Object list, Lisp_Object overlay, bool after,
d3da34e0 4547 Lisp_Object arg1, Lisp_Object arg2, Lisp_Object arg3)
173f2a64 4548{
930a9140 4549 struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
9115729e 4550
930a9140 4551 GCPRO4 (list, arg1, arg2, arg3);
9115729e 4552
6d70a280 4553 while (CONSP (list))
173f2a64 4554 {
930a9140 4555 if (NILP (arg3))
6d70a280 4556 call4 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2);
930a9140 4557 else
6d70a280
SM
4558 call5 (XCAR (list), overlay, after ? Qt : Qnil, arg1, arg2, arg3);
4559 list = XCDR (list);
173f2a64
RS
4560 }
4561 UNGCPRO;
4562}
9d7608b7
KH
4563
4564/* Delete any zero-sized overlays at position POS, if the `evaporate'
4565 property is set. */
4566void
d311d28c 4567evaporate_overlays (ptrdiff_t pos)
9d7608b7 4568{
2410d73a
SM
4569 Lisp_Object overlay, hit_list;
4570 struct Lisp_Overlay *tail;
9d7608b7
KH
4571
4572 hit_list = Qnil;
c2d5b10f 4573 if (pos <= current_buffer->overlay_center)
fd318b54 4574 for (tail = current_buffer->overlays_before; tail; tail = tail->next)
9d7608b7 4575 {
d311d28c 4576 ptrdiff_t endpos;
2410d73a 4577 XSETMISC (overlay, tail);
9d7608b7
KH
4578 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
4579 if (endpos < pos)
4580 break;
4581 if (endpos == pos && OVERLAY_POSITION (OVERLAY_START (overlay)) == pos
c3935f9d 4582 && ! NILP (Foverlay_get (overlay, Qevaporate)))
9d7608b7
KH
4583 hit_list = Fcons (overlay, hit_list);
4584 }
4585 else
fd318b54 4586 for (tail = current_buffer->overlays_after; tail; tail = tail->next)
9d7608b7 4587 {
d311d28c 4588 ptrdiff_t startpos;
2410d73a 4589 XSETMISC (overlay, tail);
9d7608b7
KH
4590 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
4591 if (startpos > pos)
4592 break;
4593 if (startpos == pos && OVERLAY_POSITION (OVERLAY_END (overlay)) == pos
c3935f9d 4594 && ! NILP (Foverlay_get (overlay, Qevaporate)))
9d7608b7
KH
4595 hit_list = Fcons (overlay, hit_list);
4596 }
7539e11f
KR
4597 for (; CONSP (hit_list); hit_list = XCDR (hit_list))
4598 Fdelete_overlay (XCAR (hit_list));
9d7608b7 4599}
1bf08baf 4600
b86af064
GM
4601/***********************************************************************
4602 Allocation with mmap
4603 ***********************************************************************/
4604
4605#ifdef USE_MMAP_FOR_BUFFERS
4606
b86af064
GM
4607#include <sys/mman.h>
4608
4609#ifndef MAP_ANON
4610#ifdef MAP_ANONYMOUS
4611#define MAP_ANON MAP_ANONYMOUS
4612#else
4613#define MAP_ANON 0
4614#endif
4615#endif
4616
09dfdf85
GM
4617#ifndef MAP_FAILED
4618#define MAP_FAILED ((void *) -1)
4619#endif
4620
b86af064
GM
4621#if MAP_ANON == 0
4622#include <fcntl.h>
4623#endif
4624
4625#include "coding.h"
4626
4627
4628/* Memory is allocated in regions which are mapped using mmap(2).
4629 The current implementation lets the system select mapped
4630 addresses; we're not using MAP_FIXED in general, except when
4631 trying to enlarge regions.
4632
4633 Each mapped region starts with a mmap_region structure, the user
4634 area starts after that structure, aligned to MEM_ALIGN.
4635
4636 +-----------------------+
4637 | struct mmap_info + |
4638 | padding |
4639 +-----------------------+
4640 | user data |
4641 | |
4642 | |
4643 +-----------------------+ */
4644
4645struct mmap_region
4646{
4647 /* User-specified size. */
4648 size_t nbytes_specified;
177c0ea7 4649
b86af064
GM
4650 /* Number of bytes mapped */
4651 size_t nbytes_mapped;
4652
4653 /* Pointer to the location holding the address of the memory
4654 allocated with the mmap'd block. The variable actually points
4655 after this structure. */
261cb4bb 4656 void **var;
b86af064
GM
4657
4658 /* Next and previous in list of all mmap'd regions. */
4659 struct mmap_region *next, *prev;
4660};
4661
4662/* Doubly-linked list of mmap'd regions. */
4663
4664static struct mmap_region *mmap_regions;
4665
4666/* File descriptor for mmap. If we don't have anonymous mapping,
4667 /dev/zero will be opened on it. */
4668
4669static int mmap_fd;
4670
4671/* Temporary storage for mmap_set_vars, see there. */
4672
4673static struct mmap_region *mmap_regions_1;
4674static int mmap_fd_1;
4675
4676/* Page size on this system. */
4677
4678static int mmap_page_size;
4679
cd1181db 4680/* 1 means mmap has been initialized. */
b86af064 4681
37ef52bb 4682static bool mmap_initialized_p;
b86af064
GM
4683
4684/* Value is X rounded up to the next multiple of N. */
4685
4686#define ROUND(X, N) (((X) + (N) - 1) / (N) * (N))
4687
4688/* Size of mmap_region structure plus padding. */
4689
4690#define MMAP_REGION_STRUCT_SIZE \
4691 ROUND (sizeof (struct mmap_region), MEM_ALIGN)
4692
4693/* Given a pointer P to the start of the user-visible part of a mapped
4694 region, return a pointer to the start of the region. */
4695
4696#define MMAP_REGION(P) \
4697 ((struct mmap_region *) ((char *) (P) - MMAP_REGION_STRUCT_SIZE))
4698
4699/* Given a pointer P to the start of a mapped region, return a pointer
4700 to the start of the user-visible part of the region. */
4701
4702#define MMAP_USER_AREA(P) \
261cb4bb 4703 ((void *) ((char *) (P) + MMAP_REGION_STRUCT_SIZE))
b86af064
GM
4704
4705#define MEM_ALIGN sizeof (double)
4706
7273faa1
DL
4707/* Predicate returning true if part of the address range [START .. END]
4708 is currently mapped. Used to prevent overwriting an existing
08327b22
GM
4709 memory mapping.
4710
da6062e6 4711 Default is to conservatively assume the address range is occupied by
08327b22
GM
4712 something else. This can be overridden by system configuration
4713 files if system-specific means to determine this exists. */
4714
4715#ifndef MMAP_ALLOCATED_P
4716#define MMAP_ALLOCATED_P(start, end) 1
4717#endif
4718
53964682 4719/* Perform necessary initializations for the use of mmap. */
b86af064 4720
1dae0f0a
AS
4721static void
4722mmap_init (void)
4723{
4724#if MAP_ANON == 0
4725 /* The value of mmap_fd is initially 0 in temacs, and -1
4726 in a dumped Emacs. */
4727 if (mmap_fd <= 0)
4728 {
4729 /* No anonymous mmap -- we need the file descriptor. */
406af475 4730 mmap_fd = emacs_open ("/dev/zero", O_RDONLY, 0);
1dae0f0a
AS
4731 if (mmap_fd == -1)
4732 fatal ("Cannot open /dev/zero: %s", emacs_strerror (errno));
4733 }
4734#endif /* MAP_ANON == 0 */
4735
4736 if (mmap_initialized_p)
4737 return;
4738 mmap_initialized_p = 1;
b86af064 4739
1dae0f0a
AS
4740#if MAP_ANON != 0
4741 mmap_fd = -1;
4742#endif
4743
4744 mmap_page_size = getpagesize ();
4745}
b86af064
GM
4746
4747/* Return a region overlapping address range START...END, or null if
4748 none. END is not including, i.e. the last byte in the range
4749 is at END - 1. */
4750
4751static struct mmap_region *
261cb4bb 4752mmap_find (void *start, void *end)
b86af064
GM
4753{
4754 struct mmap_region *r;
7d652d97 4755 char *s = start, *e = end;
177c0ea7 4756
b86af064
GM
4757 for (r = mmap_regions; r; r = r->next)
4758 {
4759 char *rstart = (char *) r;
4760 char *rend = rstart + r->nbytes_mapped;
4761
4762 if (/* First byte of range, i.e. START, in this region? */
4763 (s >= rstart && s < rend)
4764 /* Last byte of range, i.e. END - 1, in this region? */
4765 || (e > rstart && e <= rend)
4766 /* First byte of this region in the range? */
4767 || (rstart >= s && rstart < e)
4768 /* Last byte of this region in the range? */
4769 || (rend > s && rend <= e))
4770 break;
4771 }
4772
4773 return r;
4774}
4775
4776
4777/* Unmap a region. P is a pointer to the start of the user-araa of
37ef52bb 4778 the region. */
b86af064 4779
37ef52bb 4780static void
1dae0f0a 4781mmap_free_1 (struct mmap_region *r)
b86af064
GM
4782{
4783 if (r->next)
4784 r->next->prev = r->prev;
4785 if (r->prev)
4786 r->prev->next = r->next;
4787 else
4788 mmap_regions = r->next;
177c0ea7 4789
261cb4bb 4790 if (munmap (r, r->nbytes_mapped) == -1)
37ef52bb 4791 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
b86af064
GM
4792}
4793
4794
4795/* Enlarge region R by NPAGES pages. NPAGES < 0 means shrink R.
37ef52bb 4796 Value is true if successful. */
b86af064 4797
37ef52bb 4798static bool
1dae0f0a 4799mmap_enlarge (struct mmap_region *r, int npages)
b86af064
GM
4800{
4801 char *region_end = (char *) r + r->nbytes_mapped;
4802 size_t nbytes;
37ef52bb 4803 bool success = 0;
b86af064
GM
4804
4805 if (npages < 0)
4806 {
4807 /* Unmap pages at the end of the region. */
4808 nbytes = - npages * mmap_page_size;
4809 if (munmap (region_end - nbytes, nbytes) == -1)
4810 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
4811 else
4812 {
4813 r->nbytes_mapped -= nbytes;
4814 success = 1;
4815 }
4816 }
4817 else if (npages > 0)
4818 {
b86af064 4819 nbytes = npages * mmap_page_size;
177c0ea7 4820
b86af064
GM
4821 /* Try to map additional pages at the end of the region. We
4822 cannot do this if the address range is already occupied by
4823 something else because mmap deletes any previous mapping.
4824 I'm not sure this is worth doing, let's see. */
08327b22 4825 if (!MMAP_ALLOCATED_P (region_end, region_end + nbytes))
b86af064 4826 {
261cb4bb 4827 void *p;
177c0ea7 4828
b86af064
GM
4829 p = mmap (region_end, nbytes, PROT_READ | PROT_WRITE,
4830 MAP_ANON | MAP_PRIVATE | MAP_FIXED, mmap_fd, 0);
4831 if (p == MAP_FAILED)
edaa9aed 4832 ; /* fprintf (stderr, "mmap: %s\n", emacs_strerror (errno)); */
261cb4bb 4833 else if (p != region_end)
b86af064
GM
4834 {
4835 /* Kernels are free to choose a different address. In
4836 that case, unmap what we've mapped above; we have
4837 no use for it. */
4838 if (munmap (p, nbytes) == -1)
4839 fprintf (stderr, "munmap: %s\n", emacs_strerror (errno));
4840 }
4841 else
4842 {
4843 r->nbytes_mapped += nbytes;
4844 success = 1;
4845 }
4846 }
4847 }
4848
4849 return success;
4850}
4851
4852
37ef52bb
PE
4853/* Set or reset variables holding references to mapped regions.
4854 If not RESTORE_P, set all variables to null. If RESTORE_P, set all
4855 variables to the start of the user-areas of mapped regions.
b86af064
GM
4856
4857 This function is called from Fdump_emacs to ensure that the dumped
4858 Emacs doesn't contain references to memory that won't be mapped
4859 when Emacs starts. */
4860
4861void
37ef52bb 4862mmap_set_vars (bool restore_p)
b86af064
GM
4863{
4864 struct mmap_region *r;
4865
4866 if (restore_p)
4867 {
4868 mmap_regions = mmap_regions_1;
4869 mmap_fd = mmap_fd_1;
4870 for (r = mmap_regions; r; r = r->next)
4871 *r->var = MMAP_USER_AREA (r);
4872 }
4873 else
4874 {
4875 for (r = mmap_regions; r; r = r->next)
4876 *r->var = NULL;
4877 mmap_regions_1 = mmap_regions;
4878 mmap_regions = NULL;
4879 mmap_fd_1 = mmap_fd;
4880 mmap_fd = -1;
4881 }
4882}
4883
4884
4885/* Allocate a block of storage large enough to hold NBYTES bytes of
4886 data. A pointer to the data is returned in *VAR. VAR is thus the
4887 address of some variable which will use the data area.
4888
4889 The allocation of 0 bytes is valid.
4890
4891 If we can't allocate the necessary memory, set *VAR to null, and
4892 return null. */
4893
261cb4bb
PE
4894static void *
4895mmap_alloc (void **var, size_t nbytes)
b86af064
GM
4896{
4897 void *p;
4898 size_t map;
4899
4900 mmap_init ();
4901
4902 map = ROUND (nbytes + MMAP_REGION_STRUCT_SIZE, mmap_page_size);
4903 p = mmap (NULL, map, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
4904 mmap_fd, 0);
177c0ea7 4905
b86af064
GM
4906 if (p == MAP_FAILED)
4907 {
4908 if (errno != ENOMEM)
4909 fprintf (stderr, "mmap: %s\n", emacs_strerror (errno));
4910 p = NULL;
4911 }
4912 else
4913 {
7d652d97 4914 struct mmap_region *r = p;
177c0ea7 4915
b86af064
GM
4916 r->nbytes_specified = nbytes;
4917 r->nbytes_mapped = map;
4918 r->var = var;
4919 r->prev = NULL;
4920 r->next = mmap_regions;
4921 if (r->next)
4922 r->next->prev = r;
4923 mmap_regions = r;
177c0ea7 4924
b86af064
GM
4925 p = MMAP_USER_AREA (p);
4926 }
177c0ea7 4927
b86af064
GM
4928 return *var = p;
4929}
4930
4931
1dae0f0a
AS
4932/* Free a block of relocatable storage whose data is pointed to by
4933 PTR. Store 0 in *PTR to show there's no block allocated. */
4934
4935static void
261cb4bb 4936mmap_free (void **var)
1dae0f0a
AS
4937{
4938 mmap_init ();
4939
4940 if (*var)
4941 {
4942 mmap_free_1 (MMAP_REGION (*var));
4943 *var = NULL;
4944 }
4945}
4946
4947
b86af064
GM
4948/* Given a pointer at address VAR to data allocated with mmap_alloc,
4949 resize it to size NBYTES. Change *VAR to reflect the new block,
4950 and return this value. If more memory cannot be allocated, then
4951 leave *VAR unchanged, and return null. */
4952
261cb4bb
PE
4953static void *
4954mmap_realloc (void **var, size_t nbytes)
b86af064 4955{
261cb4bb 4956 void *result;
177c0ea7 4957
b86af064
GM
4958 mmap_init ();
4959
4960 if (*var == NULL)
4961 result = mmap_alloc (var, nbytes);
177c0ea7 4962 else if (nbytes == 0)
b86af064
GM
4963 {
4964 mmap_free (var);
4965 result = mmap_alloc (var, nbytes);
4966 }
4967 else
4968 {
4969 struct mmap_region *r = MMAP_REGION (*var);
4970 size_t room = r->nbytes_mapped - MMAP_REGION_STRUCT_SIZE;
177c0ea7 4971
b86af064
GM
4972 if (room < nbytes)
4973 {
4974 /* Must enlarge. */
261cb4bb 4975 void *old_ptr = *var;
b86af064
GM
4976
4977 /* Try to map additional pages at the end of the region.
4978 If that fails, allocate a new region, copy data
4979 from the old region, then free it. */
4980 if (mmap_enlarge (r, (ROUND (nbytes - room, mmap_page_size)
4981 / mmap_page_size)))
4982 {
4983 r->nbytes_specified = nbytes;
4984 *var = result = old_ptr;
4985 }
4986 else if (mmap_alloc (var, nbytes))
4987 {
72af86bd 4988 memcpy (*var, old_ptr, r->nbytes_specified);
b86af064
GM
4989 mmap_free_1 (MMAP_REGION (old_ptr));
4990 result = *var;
4991 r = MMAP_REGION (result);
4992 r->nbytes_specified = nbytes;
4993 }
4994 else
4995 {
4996 *var = old_ptr;
4997 result = NULL;
4998 }
4999 }
5000 else if (room - nbytes >= mmap_page_size)
5001 {
5002 /* Shrinking by at least a page. Let's give some
6bcdeb8c
KR
5003 memory back to the system.
5004
5005 The extra parens are to make the division happens first,
5006 on positive values, so we know it will round towards
5007 zero. */
bb63c5c9 5008 mmap_enlarge (r, - ((room - nbytes) / mmap_page_size));
b86af064
GM
5009 result = *var;
5010 r->nbytes_specified = nbytes;
5011 }
5012 else
5013 {
5014 /* Leave it alone. */
5015 result = *var;
5016 r->nbytes_specified = nbytes;
5017 }
5018 }
5019
5020 return result;
5021}
5022
5023
b86af064
GM
5024#endif /* USE_MMAP_FOR_BUFFERS */
5025
5026
5027\f
5028/***********************************************************************
5029 Buffer-text Allocation
5030 ***********************************************************************/
5031
b86af064
GM
5032/* Allocate NBYTES bytes for buffer B's text buffer. */
5033
5034static void
fd05c7e9 5035alloc_buffer_text (struct buffer *b, ptrdiff_t nbytes)
b86af064 5036{
261cb4bb 5037 void *p;
177c0ea7 5038
4d7e6e51 5039 block_input ();
b86af064 5040#if defined USE_MMAP_FOR_BUFFERS
261cb4bb 5041 p = mmap_alloc ((void **) &b->text->beg, nbytes);
b86af064 5042#elif defined REL_ALLOC
261cb4bb 5043 p = r_alloc ((void **) &b->text->beg, nbytes);
b86af064 5044#else
815add84 5045 p = xmalloc (nbytes);
b86af064 5046#endif
177c0ea7 5047
b86af064
GM
5048 if (p == NULL)
5049 {
4d7e6e51 5050 unblock_input ();
531b0165 5051 memory_full (nbytes);
b86af064
GM
5052 }
5053
7d652d97 5054 b->text->beg = p;
4d7e6e51 5055 unblock_input ();
b86af064
GM
5056}
5057
5058/* Enlarge buffer B's text buffer by DELTA bytes. DELTA < 0 means
5059 shrink it. */
5060
5061void
d311d28c 5062enlarge_buffer_text (struct buffer *b, ptrdiff_t delta)
b86af064 5063{
261cb4bb 5064 void *p;
fd05c7e9
PE
5065 ptrdiff_t nbytes = (BUF_Z_BYTE (b) - BUF_BEG_BYTE (b) + BUF_GAP_SIZE (b) + 1
5066 + delta);
4d7e6e51 5067 block_input ();
b86af064 5068#if defined USE_MMAP_FOR_BUFFERS
261cb4bb 5069 p = mmap_realloc ((void **) &b->text->beg, nbytes);
b86af064 5070#elif defined REL_ALLOC
261cb4bb 5071 p = r_re_alloc ((void **) &b->text->beg, nbytes);
b86af064
GM
5072#else
5073 p = xrealloc (b->text->beg, nbytes);
5074#endif
177c0ea7 5075
b86af064
GM
5076 if (p == NULL)
5077 {
4d7e6e51 5078 unblock_input ();
531b0165 5079 memory_full (nbytes);
b86af064
GM
5080 }
5081
7d652d97 5082 BUF_BEG_ADDR (b) = p;
4d7e6e51 5083 unblock_input ();
b86af064
GM
5084}
5085
5086
5087/* Free buffer B's text buffer. */
5088
5089static void
d3da34e0 5090free_buffer_text (struct buffer *b)
b86af064 5091{
4d7e6e51 5092 block_input ();
b86af064
GM
5093
5094#if defined USE_MMAP_FOR_BUFFERS
261cb4bb 5095 mmap_free ((void **) &b->text->beg);
b86af064 5096#elif defined REL_ALLOC
261cb4bb 5097 r_alloc_free ((void **) &b->text->beg);
b86af064
GM
5098#else
5099 xfree (b->text->beg);
5100#endif
177c0ea7 5101
b86af064 5102 BUF_BEG_ADDR (b) = NULL;
4d7e6e51 5103 unblock_input ();
b86af064
GM
5104}
5105
5106
5107\f
5108/***********************************************************************
5109 Initialization
5110 ***********************************************************************/
5111
dfcf069d 5112void
d3da34e0 5113init_buffer_once (void)
1ab256cb 5114{
7c02e886
GM
5115 int idx;
5116
72af86bd 5117 memset (buffer_permanent_local_flags, 0, sizeof buffer_permanent_local_flags);
13de9290 5118
1ab256cb
RM
5119 /* Make sure all markable slots in buffer_defaults
5120 are initialized reasonably, so mark_buffer won't choke. */
5121 reset_buffer (&buffer_defaults);
4b4deea2 5122 eassert (EQ (BVAR (&buffer_defaults, name), make_number (0)));
13de9290 5123 reset_buffer_local_variables (&buffer_defaults, 1);
4b4deea2 5124 eassert (EQ (BVAR (&buffer_local_symbols, name), make_number (0)));
1ab256cb 5125 reset_buffer (&buffer_local_symbols);
13de9290 5126 reset_buffer_local_variables (&buffer_local_symbols, 1);
336cd056
RS
5127 /* Prevent GC from getting confused. */
5128 buffer_defaults.text = &buffer_defaults.own_text;
5129 buffer_local_symbols.text = &buffer_local_symbols.own_text;
04e9897c
DA
5130 /* No one will share the text with these buffers, but let's play it safe. */
5131 buffer_defaults.indirections = 0;
5132 buffer_local_symbols.indirections = 0;
98a07056
DA
5133 /* Likewise no one will display them. */
5134 buffer_defaults.window_count = 0;
5135 buffer_local_symbols.window_count = 0;
0c94c8d6
PE
5136 set_buffer_intervals (&buffer_defaults, NULL);
5137 set_buffer_intervals (&buffer_local_symbols, NULL);
c752cfa9
DA
5138 /* This is not strictly necessary, but let's make them initialized. */
5139 bset_name (&buffer_defaults, build_pure_c_string (" *buffer-defaults*"));
5140 bset_name (&buffer_local_symbols, build_pure_c_string (" *buffer-local-symbols*"));
914adc42
DA
5141 BUFFER_PVEC_INIT (&buffer_defaults);
5142 BUFFER_PVEC_INIT (&buffer_local_symbols);
1ab256cb
RM
5143
5144 /* Set up the default values of various buffer slots. */
5145 /* Must do these before making the first buffer! */
5146
f532dca0 5147 /* real setup is done in bindings.el */
39eb03f1
PE
5148 bset_mode_line_format (&buffer_defaults, build_pure_c_string ("%-"));
5149 bset_header_line_format (&buffer_defaults, Qnil);
5150 bset_abbrev_mode (&buffer_defaults, Qnil);
5151 bset_overwrite_mode (&buffer_defaults, Qnil);
5152 bset_case_fold_search (&buffer_defaults, Qt);
5153 bset_auto_fill_function (&buffer_defaults, Qnil);
5154 bset_selective_display (&buffer_defaults, Qnil);
5155 bset_selective_display_ellipses (&buffer_defaults, Qt);
5156 bset_abbrev_table (&buffer_defaults, Qnil);
5157 bset_display_table (&buffer_defaults, Qnil);
5158 bset_undo_list (&buffer_defaults, Qnil);
5159 bset_mark_active (&buffer_defaults, Qnil);
5160 bset_file_format (&buffer_defaults, Qnil);
5161 bset_auto_save_file_format (&buffer_defaults, Qt);
0c94c8d6
PE
5162 set_buffer_overlays_before (&buffer_defaults, NULL);
5163 set_buffer_overlays_after (&buffer_defaults, NULL);
c2d5b10f 5164 buffer_defaults.overlay_center = BEG;
1ab256cb 5165
4b4deea2 5166 XSETFASTINT (BVAR (&buffer_defaults, tab_width), 8);
39eb03f1
PE
5167 bset_truncate_lines (&buffer_defaults, Qnil);
5168 bset_word_wrap (&buffer_defaults, Qnil);
5169 bset_ctl_arrow (&buffer_defaults, Qt);
5170 bset_bidi_display_reordering (&buffer_defaults, Qt);
5171 bset_bidi_paragraph_direction (&buffer_defaults, Qnil);
5172 bset_cursor_type (&buffer_defaults, Qt);
5173 bset_extra_line_spacing (&buffer_defaults, Qnil);
5174 bset_cursor_in_non_selected_windows (&buffer_defaults, Qt);
5175
5176 bset_enable_multibyte_characters (&buffer_defaults, Qt);
5177 bset_buffer_file_coding_system (&buffer_defaults, Qnil);
4b4deea2
TT
5178 XSETFASTINT (BVAR (&buffer_defaults, fill_column), 70);
5179 XSETFASTINT (BVAR (&buffer_defaults, left_margin), 0);
e30b79c1 5180 bset_cache_long_scans (&buffer_defaults, Qnil);
39eb03f1 5181 bset_file_truename (&buffer_defaults, Qnil);
4b4deea2
TT
5182 XSETFASTINT (BVAR (&buffer_defaults, display_count), 0);
5183 XSETFASTINT (BVAR (&buffer_defaults, left_margin_cols), 0);
5184 XSETFASTINT (BVAR (&buffer_defaults, right_margin_cols), 0);
39eb03f1
PE
5185 bset_left_fringe_width (&buffer_defaults, Qnil);
5186 bset_right_fringe_width (&buffer_defaults, Qnil);
5187 bset_fringes_outside_margins (&buffer_defaults, Qnil);
5188 bset_scroll_bar_width (&buffer_defaults, Qnil);
5189 bset_vertical_scroll_bar_type (&buffer_defaults, Qt);
5190 bset_indicate_empty_lines (&buffer_defaults, Qnil);
5191 bset_indicate_buffer_boundaries (&buffer_defaults, Qnil);
5192 bset_fringe_indicator_alist (&buffer_defaults, Qnil);
5193 bset_fringe_cursor_alist (&buffer_defaults, Qnil);
5194 bset_scroll_up_aggressively (&buffer_defaults, Qnil);
5195 bset_scroll_down_aggressively (&buffer_defaults, Qnil);
5196 bset_display_time (&buffer_defaults, Qnil);
1ab256cb
RM
5197
5198 /* Assign the local-flags to the slots that have default values.
5199 The local flag is a bit that is used in the buffer
5200 to say that it has its own local value for the slot.
5201 The local flag bits are in the local_var_flags slot of the buffer. */
5202
5203 /* Nothing can work if this isn't true */
663e2b3f 5204 { verify (sizeof (EMACS_INT) == word_size); }
1ab256cb
RM
5205
5206 /* 0 means not a lisp var, -1 means always local, else mask */
72af86bd 5207 memset (&buffer_local_flags, 0, sizeof buffer_local_flags);
39eb03f1
PE
5208 bset_filename (&buffer_local_flags, make_number (-1));
5209 bset_directory (&buffer_local_flags, make_number (-1));
5210 bset_backed_up (&buffer_local_flags, make_number (-1));
5211 bset_save_length (&buffer_local_flags, make_number (-1));
5212 bset_auto_save_file_name (&buffer_local_flags, make_number (-1));
5213 bset_read_only (&buffer_local_flags, make_number (-1));
5214 bset_major_mode (&buffer_local_flags, make_number (-1));
5215 bset_mode_name (&buffer_local_flags, make_number (-1));
5216 bset_undo_list (&buffer_local_flags, make_number (-1));
5217 bset_mark_active (&buffer_local_flags, make_number (-1));
5218 bset_point_before_scroll (&buffer_local_flags, make_number (-1));
5219 bset_file_truename (&buffer_local_flags, make_number (-1));
5220 bset_invisibility_spec (&buffer_local_flags, make_number (-1));
5221 bset_file_format (&buffer_local_flags, make_number (-1));
5222 bset_auto_save_file_format (&buffer_local_flags, make_number (-1));
5223 bset_display_count (&buffer_local_flags, make_number (-1));
5224 bset_display_time (&buffer_local_flags, make_number (-1));
5225 bset_enable_multibyte_characters (&buffer_local_flags, make_number (-1));
8d7a4592 5226
7c02e886 5227 idx = 1;
4b4deea2
TT
5228 XSETFASTINT (BVAR (&buffer_local_flags, mode_line_format), idx); ++idx;
5229 XSETFASTINT (BVAR (&buffer_local_flags, abbrev_mode), idx); ++idx;
5230 XSETFASTINT (BVAR (&buffer_local_flags, overwrite_mode), idx); ++idx;
5231 XSETFASTINT (BVAR (&buffer_local_flags, case_fold_search), idx); ++idx;
5232 XSETFASTINT (BVAR (&buffer_local_flags, auto_fill_function), idx); ++idx;
5233 XSETFASTINT (BVAR (&buffer_local_flags, selective_display), idx); ++idx;
4b4deea2 5234 XSETFASTINT (BVAR (&buffer_local_flags, selective_display_ellipses), idx); ++idx;
4b4deea2
TT
5235 XSETFASTINT (BVAR (&buffer_local_flags, tab_width), idx); ++idx;
5236 XSETFASTINT (BVAR (&buffer_local_flags, truncate_lines), idx); ++idx;
5237 XSETFASTINT (BVAR (&buffer_local_flags, word_wrap), idx); ++idx;
5238 XSETFASTINT (BVAR (&buffer_local_flags, ctl_arrow), idx); ++idx;
5239 XSETFASTINT (BVAR (&buffer_local_flags, fill_column), idx); ++idx;
5240 XSETFASTINT (BVAR (&buffer_local_flags, left_margin), idx); ++idx;
5241 XSETFASTINT (BVAR (&buffer_local_flags, abbrev_table), idx); ++idx;
5242 XSETFASTINT (BVAR (&buffer_local_flags, display_table), idx); ++idx;
4b4deea2 5243 XSETFASTINT (BVAR (&buffer_local_flags, syntax_table), idx); ++idx;
e30b79c1 5244 XSETFASTINT (BVAR (&buffer_local_flags, cache_long_scans), idx); ++idx;
4b4deea2
TT
5245 XSETFASTINT (BVAR (&buffer_local_flags, category_table), idx); ++idx;
5246 XSETFASTINT (BVAR (&buffer_local_flags, bidi_display_reordering), idx); ++idx;
5247 XSETFASTINT (BVAR (&buffer_local_flags, bidi_paragraph_direction), idx); ++idx;
5248 XSETFASTINT (BVAR (&buffer_local_flags, buffer_file_coding_system), idx);
a1a17b61 5249 /* Make this one a permanent local. */
7c02e886 5250 buffer_permanent_local_flags[idx++] = 1;
4b4deea2
TT
5251 XSETFASTINT (BVAR (&buffer_local_flags, left_margin_cols), idx); ++idx;
5252 XSETFASTINT (BVAR (&buffer_local_flags, right_margin_cols), idx); ++idx;
5253 XSETFASTINT (BVAR (&buffer_local_flags, left_fringe_width), idx); ++idx;
5254 XSETFASTINT (BVAR (&buffer_local_flags, right_fringe_width), idx); ++idx;
5255 XSETFASTINT (BVAR (&buffer_local_flags, fringes_outside_margins), idx); ++idx;
5256 XSETFASTINT (BVAR (&buffer_local_flags, scroll_bar_width), idx); ++idx;
5257 XSETFASTINT (BVAR (&buffer_local_flags, vertical_scroll_bar_type), idx); ++idx;
5258 XSETFASTINT (BVAR (&buffer_local_flags, indicate_empty_lines), idx); ++idx;
5259 XSETFASTINT (BVAR (&buffer_local_flags, indicate_buffer_boundaries), idx); ++idx;
5260 XSETFASTINT (BVAR (&buffer_local_flags, fringe_indicator_alist), idx); ++idx;
5261 XSETFASTINT (BVAR (&buffer_local_flags, fringe_cursor_alist), idx); ++idx;
5262 XSETFASTINT (BVAR (&buffer_local_flags, scroll_up_aggressively), idx); ++idx;
5263 XSETFASTINT (BVAR (&buffer_local_flags, scroll_down_aggressively), idx); ++idx;
5264 XSETFASTINT (BVAR (&buffer_local_flags, header_line_format), idx); ++idx;
5265 XSETFASTINT (BVAR (&buffer_local_flags, cursor_type), idx); ++idx;
5266 XSETFASTINT (BVAR (&buffer_local_flags, extra_line_spacing), idx); ++idx;
5267 XSETFASTINT (BVAR (&buffer_local_flags, cursor_in_non_selected_windows), idx); ++idx;
7c02e886
GM
5268
5269 /* Need more room? */
7313acd0 5270 if (idx >= MAX_PER_BUFFER_VARS)
1088b922 5271 emacs_abort ();
7313acd0 5272 last_per_buffer_idx = idx;
177c0ea7 5273
1ab256cb
RM
5274 Vbuffer_alist = Qnil;
5275 current_buffer = 0;
5276 all_buffers = 0;
5277
2a0213a6 5278 QSFundamental = build_pure_c_string ("Fundamental");
1ab256cb 5279
d67b4f80 5280 Qfundamental_mode = intern_c_string ("fundamental-mode");
39eb03f1 5281 bset_major_mode (&buffer_defaults, Qfundamental_mode);
1ab256cb 5282
d67b4f80 5283 Qmode_class = intern_c_string ("mode-class");
1ab256cb 5284
d67b4f80 5285 Qprotected_field = intern_c_string ("protected-field");
1ab256cb 5286
d67b4f80 5287 Qpermanent_local = intern_c_string ("permanent-local");
1ab256cb 5288
d67b4f80 5289 Qkill_buffer_hook = intern_c_string ("kill-buffer-hook");
fd6cfe11 5290 Fput (Qkill_buffer_hook, Qpermanent_local, Qt);
1ab256cb 5291
1ab256cb 5292 /* super-magic invisible buffer */
2a0213a6 5293 Vprin1_to_string_buffer = Fget_buffer_create (build_pure_c_string (" prin1"));
1ab256cb
RM
5294 Vbuffer_alist = Qnil;
5295
2a0213a6 5296 Fset_buffer (Fget_buffer_create (build_pure_c_string ("*scratch*")));
7775635d
KH
5297
5298 inhibit_modification_hooks = 0;
1ab256cb
RM
5299}
5300
dfcf069d 5301void
d3da34e0 5302init_buffer (void)
1ab256cb 5303{
2381d133 5304 char *pwd;
136351b7 5305 Lisp_Object temp;
965d34eb 5306 ptrdiff_t len;
1ab256cb 5307
b86af064 5308#ifdef USE_MMAP_FOR_BUFFERS
93c27ef1
GM
5309 {
5310 /* When using the ralloc implementation based on mmap(2), buffer
5311 text pointers will have been set to null in the dumped Emacs.
5312 Map new memory. */
5313 struct buffer *b;
177c0ea7 5314
52b852c7 5315 FOR_EACH_BUFFER (b)
93c27ef1 5316 if (b->text->beg == NULL)
b86af064 5317 enlarge_buffer_text (b, 0);
93c27ef1 5318 }
b86af064 5319#endif /* USE_MMAP_FOR_BUFFERS */
177c0ea7 5320
1ab256cb 5321 Fset_buffer (Fget_buffer_create (build_string ("*scratch*")));
4b4deea2 5322 if (NILP (BVAR (&buffer_defaults, enable_multibyte_characters)))
3d871c85 5323 Fset_buffer_multibyte (Qnil);
2381d133 5324
01537133 5325 pwd = get_current_dir_name ();
a17b5ed1 5326
156bdb41 5327 if (!pwd)
a17b5ed1 5328 fatal ("`get_current_dir_name' failed: %s\n", strerror (errno));
1ab256cb 5329
1ab256cb
RM
5330 /* Maybe this should really use some standard subroutine
5331 whose definition is filename syntax dependent. */
b639c9be
RF
5332 len = strlen (pwd);
5333 if (!(IS_DIRECTORY_SEP (pwd[len - 1])))
f7975d07 5334 {
156bdb41 5335 /* Grow buffer to add directory separator and '\0'. */
38182d90 5336 pwd = realloc (pwd, len + 2);
8b146312
AS
5337 if (!pwd)
5338 fatal ("`get_current_dir_name' failed: %s\n", strerror (errno));
b639c9be
RF
5339 pwd[len] = DIRECTORY_SEP;
5340 pwd[len + 1] = '\0';
cb1caeaf 5341 len++;
f7975d07 5342 }
0995fa35 5343
39eb03f1 5344 bset_directory (current_buffer, make_unibyte_string (pwd, len));
4b4deea2 5345 if (! NILP (BVAR (&buffer_defaults, enable_multibyte_characters)))
f9962371 5346 /* At this moment, we still don't know how to decode the
156bdb41 5347 directory name. So, we keep the bytes in multibyte form so
dcd74c5f 5348 that ENCODE_FILE correctly gets the original bytes. */
39eb03f1
PE
5349 bset_directory
5350 (current_buffer, string_to_multibyte (BVAR (current_buffer, directory)));
136351b7 5351
0995fa35
RS
5352 /* Add /: to the front of the name
5353 if it would otherwise be treated as magic. */
4b4deea2 5354 temp = Ffind_file_name_handler (BVAR (current_buffer, directory), Qt);
81ab2e07
KH
5355 if (! NILP (temp)
5356 /* If the default dir is just /, TEMP is non-nil
5357 because of the ange-ftp completion handler.
5358 However, it is not necessary to turn / into /:/.
5359 So avoid doing that. */
4b4deea2 5360 && strcmp ("/", SSDATA (BVAR (current_buffer, directory))))
39eb03f1
PE
5361 bset_directory
5362 (current_buffer,
5363 concat2 (build_string ("/:"), BVAR (current_buffer, directory)));
0995fa35 5364
136351b7 5365 temp = get_minibuffer (0);
39eb03f1 5366 bset_directory (XBUFFER (temp), BVAR (current_buffer, directory));
01537133
EZ
5367
5368 free (pwd);
1ab256cb
RM
5369}
5370
58cc0a01
DA
5371/* Similar to defvar_lisp but define a variable whose value is the
5372 Lisp_Object stored in the current buffer. LNAME is the Lisp-level
5373 variable name. VNAME is the name of the buffer slot. PREDICATE
5374 is nil for a general Lisp variable. If PREDICATE is non-nil, then
5375 only Lisp values that satisfies the PREDICATE are allowed (except
5376 that nil is allowed too). DOC is a dummy where you write the doc
5377 string as a comment. */
5378
5379#define DEFVAR_PER_BUFFER(lname, vname, predicate, doc) \
5380 do { \
5381 static struct Lisp_Buffer_Objfwd bo_fwd; \
5382 defvar_per_buffer (&bo_fwd, lname, vname, predicate); \
ce5b453a 5383 } while (0)
d6aa1876
SM
5384
5385static void
8ea90aa3 5386defvar_per_buffer (struct Lisp_Buffer_Objfwd *bo_fwd, const char *namestring,
58cc0a01 5387 Lisp_Object *address, Lisp_Object predicate)
d6aa1876 5388{
ce5b453a 5389 struct Lisp_Symbol *sym;
d6aa1876
SM
5390 int offset;
5391
ce5b453a 5392 sym = XSYMBOL (intern (namestring));
d6aa1876
SM
5393 offset = (char *)address - (char *)current_buffer;
5394
ce5b453a
SM
5395 bo_fwd->type = Lisp_Fwd_Buffer_Obj;
5396 bo_fwd->offset = offset;
58cc0a01 5397 bo_fwd->predicate = predicate;
b9598260 5398 sym->declared_special = 1;
ce5b453a 5399 sym->redirect = SYMBOL_FORWARDED;
7d652d97 5400 SET_SYMBOL_FWD (sym, (union Lisp_Fwd *) bo_fwd);
ce5b453a 5401 XSETSYMBOL (PER_BUFFER_SYMBOL (offset), sym);
d6aa1876
SM
5402
5403 if (PER_BUFFER_IDX (offset) == 0)
5404 /* Did a DEFVAR_PER_BUFFER without initializing the corresponding
5405 slot of buffer_local_flags */
1088b922 5406 emacs_abort ();
d6aa1876
SM
5407}
5408
5409
1ab256cb 5410/* initialize the buffer routines */
dfcf069d 5411void
d3da34e0 5412syms_of_buffer (void)
1ab256cb 5413{
9115729e
KH
5414 staticpro (&last_overlay_modification_hooks);
5415 last_overlay_modification_hooks
5416 = Fmake_vector (make_number (10), Qnil);
5417
1ab256cb
RM
5418 staticpro (&Qfundamental_mode);
5419 staticpro (&Qmode_class);
5420 staticpro (&QSFundamental);
5421 staticpro (&Vbuffer_alist);
5422 staticpro (&Qprotected_field);
5423 staticpro (&Qpermanent_local);
5424 staticpro (&Qkill_buffer_hook);
cd3520a4
JB
5425
5426 DEFSYM (Qpermanent_local_hook, "permanent-local-hook");
5427 DEFSYM (Qoverlayp, "overlayp");
5428 DEFSYM (Qevaporate, "evaporate");
5429 DEFSYM (Qmodification_hooks, "modification-hooks");
5430 DEFSYM (Qinsert_in_front_hooks, "insert-in-front-hooks");
5431 DEFSYM (Qinsert_behind_hooks, "insert-behind-hooks");
5432 DEFSYM (Qget_file_buffer, "get-file-buffer");
5433 DEFSYM (Qpriority, "priority");
5434 DEFSYM (Qbefore_string, "before-string");
5435 DEFSYM (Qafter_string, "after-string");
5436 DEFSYM (Qfirst_change_hook, "first-change-hook");
5437 DEFSYM (Qbefore_change_functions, "before-change-functions");
5438 DEFSYM (Qafter_change_functions, "after-change-functions");
5439 DEFSYM (Qkill_buffer_query_functions, "kill-buffer-query-functions");
5440
1ab256cb 5441 Fput (Qprotected_field, Qerror_conditions,
3438fe21 5442 listn (CONSTYPE_PURE, 2, Qprotected_field, Qerror));
1ab256cb 5443 Fput (Qprotected_field, Qerror_message,
2a0213a6 5444 build_pure_c_string ("Attempt to modify a protected field"));
1ab256cb 5445
422745d0
TT
5446 DEFVAR_BUFFER_DEFAULTS ("default-mode-line-format",
5447 mode_line_format,
5448 doc: /* Default value of `mode-line-format' for buffers that don't override it.
018ba359 5449This is the same as (default-value 'mode-line-format). */);
1ab256cb 5450
422745d0
TT
5451 DEFVAR_BUFFER_DEFAULTS ("default-header-line-format",
5452 header_line_format,
5453 doc: /* Default value of `header-line-format' for buffers that don't override it.
018ba359 5454This is the same as (default-value 'header-line-format). */);
0552666b 5455
422745d0
TT
5456 DEFVAR_BUFFER_DEFAULTS ("default-cursor-type", cursor_type,
5457 doc: /* Default value of `cursor-type' for buffers that don't override it.
018ba359 5458This is the same as (default-value 'cursor-type). */);
bd96bd79 5459
422745d0
TT
5460 DEFVAR_BUFFER_DEFAULTS ("default-line-spacing",
5461 extra_line_spacing,
5462 doc: /* Default value of `line-spacing' for buffers that don't override it.
018ba359 5463This is the same as (default-value 'line-spacing). */);
a3bbced0 5464
422745d0
TT
5465 DEFVAR_BUFFER_DEFAULTS ("default-cursor-in-non-selected-windows",
5466 cursor_in_non_selected_windows,
5467 doc: /* Default value of `cursor-in-non-selected-windows'.
187ccf49
KS
5468This is the same as (default-value 'cursor-in-non-selected-windows). */);
5469
422745d0
TT
5470 DEFVAR_BUFFER_DEFAULTS ("default-abbrev-mode",
5471 abbrev_mode,
5472 doc: /* Default value of `abbrev-mode' for buffers that do not override it.
018ba359 5473This is the same as (default-value 'abbrev-mode). */);
1ab256cb 5474
422745d0
TT
5475 DEFVAR_BUFFER_DEFAULTS ("default-ctl-arrow",
5476 ctl_arrow,
5477 doc: /* Default value of `ctl-arrow' for buffers that do not override it.
018ba359 5478This is the same as (default-value 'ctl-arrow). */);
1ab256cb 5479
422745d0
TT
5480 DEFVAR_BUFFER_DEFAULTS ("default-enable-multibyte-characters",
5481 enable_multibyte_characters,
fb7ada5f 5482 doc: /* Default value of `enable-multibyte-characters' for buffers not overriding it.
018ba359 5483This is the same as (default-value 'enable-multibyte-characters). */);
177c0ea7 5484
422745d0
TT
5485 DEFVAR_BUFFER_DEFAULTS ("default-buffer-file-coding-system",
5486 buffer_file_coding_system,
5487 doc: /* Default value of `buffer-file-coding-system' for buffers not overriding it.
018ba359 5488This is the same as (default-value 'buffer-file-coding-system). */);
177c0ea7 5489
422745d0
TT
5490 DEFVAR_BUFFER_DEFAULTS ("default-truncate-lines",
5491 truncate_lines,
5492 doc: /* Default value of `truncate-lines' for buffers that do not override it.
018ba359 5493This is the same as (default-value 'truncate-lines). */);
1ab256cb 5494
422745d0
TT
5495 DEFVAR_BUFFER_DEFAULTS ("default-fill-column",
5496 fill_column,
5497 doc: /* Default value of `fill-column' for buffers that do not override it.
018ba359 5498This is the same as (default-value 'fill-column). */);
1ab256cb 5499
422745d0
TT
5500 DEFVAR_BUFFER_DEFAULTS ("default-left-margin",
5501 left_margin,
5502 doc: /* Default value of `left-margin' for buffers that do not override it.
018ba359 5503This is the same as (default-value 'left-margin). */);
1ab256cb 5504
422745d0
TT
5505 DEFVAR_BUFFER_DEFAULTS ("default-tab-width",
5506 tab_width,
5507 doc: /* Default value of `tab-width' for buffers that do not override it.
276e8873
SM
5508NOTE: This controls the display width of a TAB character, and not
5509the size of an indentation step.
018ba359 5510This is the same as (default-value 'tab-width). */);
1ab256cb 5511
422745d0
TT
5512 DEFVAR_BUFFER_DEFAULTS ("default-case-fold-search",
5513 case_fold_search,
5514 doc: /* Default value of `case-fold-search' for buffers that don't override it.
018ba359 5515This is the same as (default-value 'case-fold-search). */);
1ab256cb 5516
422745d0
TT
5517 DEFVAR_BUFFER_DEFAULTS ("default-left-margin-width",
5518 left_margin_cols,
5519 doc: /* Default value of `left-margin-width' for buffers that don't override it.
018ba359 5520This is the same as (default-value 'left-margin-width). */);
0552666b 5521
422745d0
TT
5522 DEFVAR_BUFFER_DEFAULTS ("default-right-margin-width",
5523 right_margin_cols,
5524 doc: /* Default value of `right-margin-width' for buffers that don't override it.
018ba359 5525This is the same as (default-value 'right-margin-width). */);
177c0ea7 5526
422745d0
TT
5527 DEFVAR_BUFFER_DEFAULTS ("default-left-fringe-width",
5528 left_fringe_width,
5529 doc: /* Default value of `left-fringe-width' for buffers that don't override it.
2ad8731a
KS
5530This is the same as (default-value 'left-fringe-width). */);
5531
422745d0
TT
5532 DEFVAR_BUFFER_DEFAULTS ("default-right-fringe-width",
5533 right_fringe_width,
5534 doc: /* Default value of `right-fringe-width' for buffers that don't override it.
2ad8731a
KS
5535This is the same as (default-value 'right-fringe-width). */);
5536
422745d0
TT
5537 DEFVAR_BUFFER_DEFAULTS ("default-fringes-outside-margins",
5538 fringes_outside_margins,
5539 doc: /* Default value of `fringes-outside-margins' for buffers that don't override it.
2ad8731a
KS
5540This is the same as (default-value 'fringes-outside-margins). */);
5541
422745d0
TT
5542 DEFVAR_BUFFER_DEFAULTS ("default-scroll-bar-width",
5543 scroll_bar_width,
5544 doc: /* Default value of `scroll-bar-width' for buffers that don't override it.
2ad8731a
KS
5545This is the same as (default-value 'scroll-bar-width). */);
5546
422745d0
TT
5547 DEFVAR_BUFFER_DEFAULTS ("default-vertical-scroll-bar",
5548 vertical_scroll_bar_type,
5549 doc: /* Default value of `vertical-scroll-bar' for buffers that don't override it.
2ad8731a
KS
5550This is the same as (default-value 'vertical-scroll-bar). */);
5551
422745d0
TT
5552 DEFVAR_BUFFER_DEFAULTS ("default-indicate-empty-lines",
5553 indicate_empty_lines,
5554 doc: /* Default value of `indicate-empty-lines' for buffers that don't override it.
018ba359 5555This is the same as (default-value 'indicate-empty-lines). */);
177c0ea7 5556
422745d0
TT
5557 DEFVAR_BUFFER_DEFAULTS ("default-indicate-buffer-boundaries",
5558 indicate_buffer_boundaries,
5559 doc: /* Default value of `indicate-buffer-boundaries' for buffers that don't override it.
6b61353c
KH
5560This is the same as (default-value 'indicate-buffer-boundaries). */);
5561
422745d0
TT
5562 DEFVAR_BUFFER_DEFAULTS ("default-fringe-indicator-alist",
5563 fringe_indicator_alist,
5564 doc: /* Default value of `fringe-indicator-alist' for buffers that don't override it.
c6a46372
KS
5565This is the same as (default-value 'fringe-indicator-alist'). */);
5566
422745d0
TT
5567 DEFVAR_BUFFER_DEFAULTS ("default-fringe-cursor-alist",
5568 fringe_cursor_alist,
5569 doc: /* Default value of `fringe-cursor-alist' for buffers that don't override it.
c6a46372
KS
5570This is the same as (default-value 'fringe-cursor-alist'). */);
5571
422745d0
TT
5572 DEFVAR_BUFFER_DEFAULTS ("default-scroll-up-aggressively",
5573 scroll_up_aggressively,
5574 doc: /* Default value of `scroll-up-aggressively'.
7614d762 5575This value applies in buffers that don't have their own local values.
fc961256 5576This is the same as (default-value 'scroll-up-aggressively). */);
177c0ea7 5577
422745d0
TT
5578 DEFVAR_BUFFER_DEFAULTS ("default-scroll-down-aggressively",
5579 scroll_down_aggressively,
5580 doc: /* Default value of `scroll-down-aggressively'.
7614d762 5581This value applies in buffers that don't have their own local values.
fc961256 5582This is the same as (default-value 'scroll-down-aggressively). */);
177c0ea7 5583
045dee35 5584 DEFVAR_PER_BUFFER ("header-line-format",
4b4deea2 5585 &BVAR (current_buffer, header_line_format),
7ee72033 5586 Qnil,
7614d762
RS
5587 doc: /* Analogous to `mode-line-format', but controls the header line.
5588The header line appears, optionally, at the top of a window;
5589the mode line appears at the bottom. */);
177c0ea7 5590
4b4deea2 5591 DEFVAR_PER_BUFFER ("mode-line-format", &BVAR (current_buffer, mode_line_format),
efc7e75f
PJ
5592 Qnil,
5593 doc: /* Template for displaying mode line for current buffer.
5f2c76c6
CY
5594
5595The value may be nil, a string, a symbol or a list.
5596
018ba359 5597A value of nil means don't display a mode line.
5f2c76c6
CY
5598
5599For any symbol other than t or nil, the symbol's value is processed as
5600 a mode line construct. As a special exception, if that value is a
5601 string, the string is processed verbatim, without handling any
5602 %-constructs (see below). Also, unless the symbol has a non-nil
5603 `risky-local-variable' property, all properties in any strings, as
5604 well as all :eval and :propertize forms in the value, are ignored.
5605
5606A list whose car is a string or list is processed by processing each
5607 of the list elements recursively, as separate mode line constructs,
5608 and concatenating the results.
5609
5610A list of the form `(:eval FORM)' is processed by evaluating FORM and
5611 using the result as a mode line construct. Be careful--FORM should
5612 not load any files, because that can cause an infinite recursion.
5613
5614A list of the form `(:propertize ELT PROPS...)' is processed by
5615 processing ELT as the mode line construct, and adding the text
5616 properties PROPS to the result.
5617
5618A list whose car is a symbol is processed by examining the symbol's
5619 value, and, if that value is non-nil, processing the cadr of the list
5620 recursively; and if that value is nil, processing the caddr of the
5621 list recursively.
5622
5623A list whose car is an integer is processed by processing the cadr of
5624 the list, and padding (if the number is positive) or truncating (if
5625 negative) to the width specified by that number.
5626
018ba359 5627A string is printed verbatim in the mode line except for %-constructs:
018ba359
PJ
5628 %b -- print buffer name. %f -- print visited file name.
5629 %F -- print frame name.
5630 %* -- print %, * or hyphen. %+ -- print *, % or hyphen.
5631 %& is like %*, but ignore read-only-ness.
5632 % means buffer is read-only and * means it is modified.
5633 For a modified read-only buffer, %* gives % and %+ gives *.
5634 %s -- print process status. %l -- print the current line number.
5635 %c -- print the current column number (this makes editing slower).
5636 To make the column number update correctly in all cases,
5637 `column-number-mode' must be non-nil.
6b61353c
KH
5638 %i -- print the size of the buffer.
5639 %I -- like %i, but use k, M, G, etc., to abbreviate.
018ba359
PJ
5640 %p -- print percent of buffer above top of window, or Top, Bot or All.
5641 %P -- print percent of buffer above bottom of window, perhaps plus Top,
5642 or print Bottom or All.
018ba359 5643 %n -- print Narrow if appropriate.
dafbe726 5644 %t -- visited file is text or binary (if OS supports this distinction).
47419860 5645 %z -- print mnemonics of keyboard, terminal, and buffer coding systems.
018ba359 5646 %Z -- like %z, but including the end-of-line format.
dafbe726 5647 %e -- print error message about full memory.
f7165034
NR
5648 %@ -- print @ or hyphen. @ means that default-directory is on a
5649 remote machine.
018ba359
PJ
5650 %[ -- print one [ for each recursive editing level. %] similar.
5651 %% -- print %. %- -- print infinitely many dashes.
5652Decimal digits after the % specify field width to which to pad. */);
5653
422745d0 5654 DEFVAR_BUFFER_DEFAULTS ("default-major-mode", major_mode,
fb7ada5f 5655 doc: /* Value of `major-mode' for new buffers. */);
1ab256cb 5656
4b4deea2 5657 DEFVAR_PER_BUFFER ("major-mode", &BVAR (current_buffer, major_mode),
58cc0a01 5658 Qsymbolp,
5a021dd0
GM
5659 doc: /* Symbol for current buffer's major mode.
5660The default value (normally `fundamental-mode') affects new buffers.
5661A value of nil means to use the current buffer's major mode, provided
5662it is not marked as "special".
5663
5664When a mode is used by default, `find-file' switches to it before it
5665reads the contents into the buffer and before it finishes setting up
5666the buffer. Thus, the mode and its hooks should not expect certain
5667variables such as `buffer-read-only' and `buffer-file-coding-system'
5668to be set up. */);
1ab256cb 5669
4b4deea2 5670 DEFVAR_PER_BUFFER ("mode-name", &BVAR (current_buffer, mode_name),
c01d0677 5671 Qnil,
64a7c220 5672 doc: /* Pretty name of current buffer's major mode.
7cb70974
EZ
5673Usually a string, but can use any of the constructs for `mode-line-format',
5674which see.
5675Format with `format-mode-line' to produce a string value. */);
1ab256cb 5676
4b4deea2 5677 DEFVAR_PER_BUFFER ("local-abbrev-table", &BVAR (current_buffer, abbrev_table), Qnil,
d6aa1876
SM
5678 doc: /* Local (mode-specific) abbrev table of current buffer. */);
5679
4b4deea2 5680 DEFVAR_PER_BUFFER ("abbrev-mode", &BVAR (current_buffer, abbrev_mode), Qnil,
9d794026
GM
5681 doc: /* Non-nil if Abbrev mode is enabled.
5682Use the command `abbrev-mode' to change this variable. */);
1ab256cb 5683
4b4deea2 5684 DEFVAR_PER_BUFFER ("case-fold-search", &BVAR (current_buffer, case_fold_search),
7ee72033 5685 Qnil,
fb7ada5f 5686 doc: /* Non-nil if searches and matches should ignore case. */);
1ab256cb 5687
4b4deea2 5688 DEFVAR_PER_BUFFER ("fill-column", &BVAR (current_buffer, fill_column),
58cc0a01 5689 Qintegerp,
fb7ada5f 5690 doc: /* Column beyond which automatic line-wrapping should happen.
f1ccb329 5691Interactively, you can set the buffer local value using \\[set-fill-column]. */);
1ab256cb 5692
4b4deea2 5693 DEFVAR_PER_BUFFER ("left-margin", &BVAR (current_buffer, left_margin),
58cc0a01 5694 Qintegerp,
fb7ada5f 5695 doc: /* Column for the default `indent-line-function' to indent to.
018ba359 5696Linefeed indents to this column in Fundamental mode. */);
1ab256cb 5697
4b4deea2 5698 DEFVAR_PER_BUFFER ("tab-width", &BVAR (current_buffer, tab_width),
58cc0a01 5699 Qintegerp,
fb7ada5f 5700 doc: /* Distance between tab stops (for display of tab characters), in columns.
276e8873
SM
5701NOTE: This controls the display width of a TAB character, and not
5702the size of an indentation step.
fde4eb86 5703This should be an integer greater than zero. */);
1ab256cb 5704
4b4deea2 5705 DEFVAR_PER_BUFFER ("ctl-arrow", &BVAR (current_buffer, ctl_arrow), Qnil,
fb7ada5f 5706 doc: /* Non-nil means display control chars with uparrow.
018ba359
PJ
5707A value of nil means use backslash and octal digits.
5708This variable does not apply to characters whose display is specified
5709in the current display table (if there is one). */);
1ab256cb 5710
3b06f880 5711 DEFVAR_PER_BUFFER ("enable-multibyte-characters",
4b4deea2 5712 &BVAR (current_buffer, enable_multibyte_characters),
a9b9a780 5713 Qnil,
efc7e75f 5714 doc: /* Non-nil means the buffer contents are regarded as multi-byte characters.
018ba359
PJ
5715Otherwise they are regarded as unibyte. This affects the display,
5716file I/O and the behavior of various editing commands.
5717
5718This variable is buffer-local but you cannot set it directly;
5719use the function `set-buffer-multibyte' to change a buffer's representation.
a66cfb1c 5720See also Info node `(elisp)Text Representations'. */);
d67b4f80 5721 XSYMBOL (intern_c_string ("enable-multibyte-characters"))->constant = 1;
3b06f880 5722
c71b5d9b 5723 DEFVAR_PER_BUFFER ("buffer-file-coding-system",
4b4deea2 5724 &BVAR (current_buffer, buffer_file_coding_system), Qnil,
efc7e75f 5725 doc: /* Coding system to be used for encoding the buffer contents on saving.
018ba359
PJ
5726This variable applies to saving the buffer, and also to `write-region'
5727and other functions that use `write-region'.
5728It does not apply to sending output to subprocesses, however.
5729
5730If this is nil, the buffer is saved without any code conversion
5731unless some coding system is specified in `file-coding-system-alist'
5732for the buffer file.
5733
31a6cb06
EZ
5734If the text to be saved cannot be encoded as specified by this variable,
5735an alternative encoding is selected by `select-safe-coding-system', which see.
5736
018ba359
PJ
5737The variable `coding-system-for-write', if non-nil, overrides this variable.
5738
5739This variable is never applied to a way of decoding a file while reading it. */);
c71b5d9b 5740
f44e260c 5741 DEFVAR_PER_BUFFER ("bidi-display-reordering",
4b4deea2 5742 &BVAR (current_buffer, bidi_display_reordering), Qnil,
938efb77 5743 doc: /* Non-nil means reorder bidirectional text for display in the visual order. */);
3b06f880 5744
6c0cf218 5745 DEFVAR_PER_BUFFER ("bidi-paragraph-direction",
4b4deea2 5746 &BVAR (current_buffer, bidi_paragraph_direction), Qnil,
fb7ada5f 5747 doc: /* If non-nil, forces directionality of text paragraphs in the buffer.
b4bf28b7 5748
b44d9321
EZ
5749If this is nil (the default), the direction of each paragraph is
5750determined by the first strong directional character of its text.
5751The values of `right-to-left' and `left-to-right' override that.
5752Any other value is treated as nil.
b4bf28b7 5753
b44d9321
EZ
5754This variable has no effect unless the buffer's value of
5755\`bidi-display-reordering' is non-nil. */);
5756
4b4deea2 5757 DEFVAR_PER_BUFFER ("truncate-lines", &BVAR (current_buffer, truncate_lines), Qnil,
fb7ada5f 5758 doc: /* Non-nil means do not display continuation lines.
7614d762 5759Instead, give each line of text just one screen line.
018ba359
PJ
5760
5761Note that this is overridden by the variable
5762`truncate-partial-width-windows' if that variable is non-nil
32bbb17c
GM
5763and this buffer is not full-frame width.
5764
5765Minibuffers set this variable to nil. */);
1ab256cb 5766
4b4deea2 5767 DEFVAR_PER_BUFFER ("word-wrap", &BVAR (current_buffer, word_wrap), Qnil,
fb7ada5f 5768 doc: /* Non-nil means to use word-wrapping for continuation lines.
0858cd02
CY
5769When word-wrapping is on, continuation lines are wrapped at the space
5770or tab character nearest to the right window edge.
5771If nil, continuation lines are wrapped at the right screen edge.
5772
5773This variable has no effect if long lines are truncated (see
eb577e27
GM
5774`truncate-lines' and `truncate-partial-width-windows'). If you use
5775word-wrapping, you might want to reduce the value of
5776`truncate-partial-width-windows', since wrapping can make text readable
c5cfcbe0
CY
5777in narrower windows.
5778
5779Instead of setting this variable directly, most users should use
5780Visual Line mode . Visual Line mode, when enabled, sets `word-wrap'
5781to t, and additionally redefines simple editing commands to act on
5782visual lines rather than logical lines. See the documentation of
5783`visual-line-mode'. */);
0858cd02 5784
4b4deea2 5785 DEFVAR_PER_BUFFER ("default-directory", &BVAR (current_buffer, directory),
58cc0a01 5786 Qstringp,
efc7e75f 5787 doc: /* Name of default directory of current buffer. Should end with slash.
018ba359 5788To interactively change the default directory, use command `cd'. */);
1ab256cb 5789
4b4deea2 5790 DEFVAR_PER_BUFFER ("auto-fill-function", &BVAR (current_buffer, auto_fill_function),
7ee72033 5791 Qnil,
efc7e75f 5792 doc: /* Function called (if non-nil) to perform auto-fill.
018ba359
PJ
5793It is called after self-inserting any character specified in
5794the `auto-fill-chars' table.
5795NOTE: This variable is not a hook;
5796its value may not be a list of functions. */);
1ab256cb 5797
4b4deea2 5798 DEFVAR_PER_BUFFER ("buffer-file-name", &BVAR (current_buffer, filename),
58cc0a01 5799 Qstringp,
efc7e75f 5800 doc: /* Name of file visited in current buffer, or nil if not visiting a file. */);
1ab256cb 5801
4b4deea2 5802 DEFVAR_PER_BUFFER ("buffer-file-truename", &BVAR (current_buffer, file_truename),
58cc0a01 5803 Qstringp,
efc7e75f 5804 doc: /* Abbreviated truename of file visited in current buffer, or nil if none.
018ba359
PJ
5805The truename of a file is calculated by `file-truename'
5806and then abbreviated with `abbreviate-file-name'. */);
f6ed2e84 5807
1ab256cb 5808 DEFVAR_PER_BUFFER ("buffer-auto-save-file-name",
4b4deea2 5809 &BVAR (current_buffer, auto_save_file_name),
58cc0a01 5810 Qstringp,
7614d762
RS
5811 doc: /* Name of file for auto-saving current buffer.
5812If it is nil, that means don't auto-save this buffer. */);
1ab256cb 5813
4b4deea2 5814 DEFVAR_PER_BUFFER ("buffer-read-only", &BVAR (current_buffer, read_only), Qnil,
efc7e75f 5815 doc: /* Non-nil if this buffer is read-only. */);
1ab256cb 5816
4b4deea2 5817 DEFVAR_PER_BUFFER ("buffer-backed-up", &BVAR (current_buffer, backed_up), Qnil,
efc7e75f 5818 doc: /* Non-nil if this buffer's file has been backed up.
018ba359 5819Backing up is done before the first time the file is saved. */);
1ab256cb 5820
4b4deea2 5821 DEFVAR_PER_BUFFER ("buffer-saved-size", &BVAR (current_buffer, save_length),
58cc0a01 5822 Qintegerp,
efc7e75f 5823 doc: /* Length of current buffer when last read in, saved or auto-saved.
4be941e3
RS
58240 initially.
5825-1 means auto-saving turned off until next real save.
5826
5827If you set this to -2, that means don't turn off auto-saving in this buffer
5828if its text size shrinks. If you use `buffer-swap-text' on a buffer,
5829you probably should set this to -2 in that buffer. */);
1ab256cb 5830
4b4deea2 5831 DEFVAR_PER_BUFFER ("selective-display", &BVAR (current_buffer, selective_display),
7ee72033 5832 Qnil,
7614d762 5833 doc: /* Non-nil enables selective display.
a66f285a
JB
5834An integer N as value means display only lines
5835that start with less than N columns of space.
7614d762
RS
5836A value of t means that the character ^M makes itself and
5837all the rest of the line invisible; also, when saving the buffer
5838in a file, save the ^M as a newline. */);
1ab256cb 5839
1ab256cb 5840 DEFVAR_PER_BUFFER ("selective-display-ellipses",
4b4deea2 5841 &BVAR (current_buffer, selective_display_ellipses),
7ee72033 5842 Qnil,
3f676284 5843 doc: /* Non-nil means display ... on previous line when a line is invisible. */);
1ab256cb 5844
4b4deea2 5845 DEFVAR_PER_BUFFER ("overwrite-mode", &BVAR (current_buffer, overwrite_mode), Qnil,
efc7e75f 5846 doc: /* Non-nil if self-insertion should replace existing text.
018ba359
PJ
5847The value should be one of `overwrite-mode-textual',
5848`overwrite-mode-binary', or nil.
5849If it is `overwrite-mode-textual', self-insertion still
5850inserts at the end of a line, and inserts when point is before a tab,
5851until the tab is filled in.
5852If `overwrite-mode-binary', self-insertion replaces newlines and tabs too. */);
5853
4b4deea2 5854 DEFVAR_PER_BUFFER ("buffer-display-table", &BVAR (current_buffer, display_table),
7ee72033 5855 Qnil,
efc7e75f 5856 doc: /* Display table that controls display of the contents of current buffer.
018ba359
PJ
5857
5858If this variable is nil, the value of `standard-display-table' is used.
5859Each window can have its own, overriding display table, see
5860`set-window-display-table' and `window-display-table'.
5861
5862The display table is a char-table created with `make-display-table'.
5863A char-table is an array indexed by character codes. Normal array
5864primitives `aref' and `aset' can be used to access elements of a char-table.
5865
5866Each of the char-table elements control how to display the corresponding
5867text character: the element at index C in the table says how to display
5868the character whose code is C. Each element should be a vector of
426a9163
JB
5869characters or nil. The value nil means display the character in the
5870default fashion; otherwise, the characters from the vector are delivered
5871to the screen instead of the original character.
018ba359 5872
5fd11dc8 5873For example, (aset buffer-display-table ?X [?Y]) tells Emacs
adbb3b05 5874to display a capital Y instead of each X character.
018ba359
PJ
5875
5876In addition, a char-table has six extra slots to control the display of:
5877
5878 the end of a truncated screen line (extra-slot 0, a single character);
5879 the end of a continued line (extra-slot 1, a single character);
5880 the escape character used to display character codes in octal
5881 (extra-slot 2, a single character);
5882 the character used as an arrow for control characters (extra-slot 3,
5883 a single character);
5884 the decoration indicating the presence of invisible lines (extra-slot 4,
5885 a vector of characters);
5886 the character used to draw the border between side-by-side windows
5887 (extra-slot 5, a single character).
5888
5889See also the functions `display-table-slot' and `set-display-table-slot'. */);
1ab256cb 5890
4b4deea2 5891 DEFVAR_PER_BUFFER ("left-margin-width", &BVAR (current_buffer, left_margin_cols),
58cc0a01 5892 Qintegerp,
fb7ada5f 5893 doc: /* Width of left marginal area for display of a buffer.
ddd6b685
EZ
5894A value of nil means no marginal area.
5895
5896Setting this variable does not take effect until a new buffer is displayed
5897in a window. To make the change take effect, call `set-window-buffer'. */);
177c0ea7 5898
4b4deea2 5899 DEFVAR_PER_BUFFER ("right-margin-width", &BVAR (current_buffer, right_margin_cols),
58cc0a01 5900 Qintegerp,
fb7ada5f 5901 doc: /* Width of right marginal area for display of a buffer.
ddd6b685
EZ
5902A value of nil means no marginal area.
5903
5904Setting this variable does not take effect until a new buffer is displayed
5905in a window. To make the change take effect, call `set-window-buffer'. */);
177c0ea7 5906
4b4deea2 5907 DEFVAR_PER_BUFFER ("left-fringe-width", &BVAR (current_buffer, left_fringe_width),
58cc0a01 5908 Qintegerp,
fb7ada5f 5909 doc: /* Width of this buffer's left fringe (in pixels).
2ad8731a 5910A value of 0 means no left fringe is shown in this buffer's window.
ddd6b685
EZ
5911A value of nil means to use the left fringe width from the window's frame.
5912
5913Setting this variable does not take effect until a new buffer is displayed
5914in a window. To make the change take effect, call `set-window-buffer'. */);
2ad8731a 5915
4b4deea2 5916 DEFVAR_PER_BUFFER ("right-fringe-width", &BVAR (current_buffer, right_fringe_width),
58cc0a01 5917 Qintegerp,
fb7ada5f 5918 doc: /* Width of this buffer's right fringe (in pixels).
2ad8731a 5919A value of 0 means no right fringe is shown in this buffer's window.
ddd6b685
EZ
5920A value of nil means to use the right fringe width from the window's frame.
5921
5922Setting this variable does not take effect until a new buffer is displayed
5923in a window. To make the change take effect, call `set-window-buffer'. */);
2ad8731a 5924
4b4deea2 5925 DEFVAR_PER_BUFFER ("fringes-outside-margins", &BVAR (current_buffer, fringes_outside_margins),
2ad8731a 5926 Qnil,
fb7ada5f 5927 doc: /* Non-nil means to display fringes outside display margins.
ddd6b685
EZ
5928A value of nil means to display fringes between margins and buffer text.
5929
5930Setting this variable does not take effect until a new buffer is displayed
5931in a window. To make the change take effect, call `set-window-buffer'. */);
2ad8731a 5932
4b4deea2 5933 DEFVAR_PER_BUFFER ("scroll-bar-width", &BVAR (current_buffer, scroll_bar_width),
58cc0a01 5934 Qintegerp,
fb7ada5f 5935 doc: /* Width of this buffer's scroll bars in pixels.
2ad8731a
KS
5936A value of nil means to use the scroll bar width from the window's frame. */);
5937
4b4deea2 5938 DEFVAR_PER_BUFFER ("vertical-scroll-bar", &BVAR (current_buffer, vertical_scroll_bar_type),
2ad8731a 5939 Qnil,
fb7ada5f 5940 doc: /* Position of this buffer's vertical scroll bar.
7c6b2007 5941The value takes effect whenever you tell a window to display this buffer;
188577ce 5942for instance, with `set-window-buffer' or when `display-buffer' displays it.
7c6b2007 5943
fc2c8887
RS
5944A value of `left' or `right' means put the vertical scroll bar at that side
5945of the window; a value of nil means don't show any vertical scroll bars.
5946A value of t (the default) means do whatever the window's frame specifies. */);
2ad8731a 5947
0552666b 5948 DEFVAR_PER_BUFFER ("indicate-empty-lines",
4b4deea2 5949 &BVAR (current_buffer, indicate_empty_lines), Qnil,
fb7ada5f 5950 doc: /* Visually indicate empty lines after the buffer end.
018ba359
PJ
5951If non-nil, a bitmap is displayed in the left fringe of a window on
5952window-systems. */);
177c0ea7 5953
6b61353c 5954 DEFVAR_PER_BUFFER ("indicate-buffer-boundaries",
4b4deea2 5955 &BVAR (current_buffer, indicate_buffer_boundaries), Qnil,
fb7ada5f 5956 doc: /* Visually indicate buffer boundaries and scrolling.
6b61353c
KH
5957If non-nil, the first and last line of the buffer are marked in the fringe
5958of a window on window-systems with angle bitmaps, or if the window can be
5959scrolled, the top and bottom line of the window are marked with up and down
5960arrow bitmaps.
b2229037
KS
5961
5962If value is a symbol `left' or `right', both angle and arrow bitmaps
79e3497d 5963are displayed in the left or right fringe, resp. Any other value
845a78b4 5964that doesn't look like an alist means display the angle bitmaps in
79e3497d 5965the left fringe but no arrows.
b2229037 5966
79e3497d
RS
5967You can exercise more precise control by using an alist as the
5968value. Each alist element (INDICATOR . POSITION) specifies
5969where to show one of the indicators. INDICATOR is one of `top',
b2229037
KS
5970`bottom', `up', `down', or t, which specifies the default position,
5971and POSITION is one of `left', `right', or nil, meaning do not show
5972this indicator.
5973
5974For example, ((top . left) (t . right)) places the top angle bitmap in
5975left fringe, the bottom angle bitmap in right fringe, and both arrow
6b61353c 5976bitmaps in right fringe. To show just the angle bitmaps in the left
b2229037 5977fringe, but no arrow bitmaps, use ((top . left) (bottom . left)). */);
6b61353c 5978
c6a46372 5979 DEFVAR_PER_BUFFER ("fringe-indicator-alist",
4b4deea2 5980 &BVAR (current_buffer, fringe_indicator_alist), Qnil,
fb7ada5f 5981 doc: /* Mapping from logical to physical fringe indicator bitmaps.
c6a46372
KS
5982The value is an alist where each element (INDICATOR . BITMAPS)
5983specifies the fringe bitmaps used to display a specific logical
5984fringe indicator.
5985
5986INDICATOR specifies the logical indicator type which is one of the
5987following symbols: `truncation' , `continuation', `overlay-arrow',
14fb5704 5988`top', `bottom', `top-bottom', `up', `down', empty-line', or `unknown'.
c6a46372 5989
14fb5704 5990BITMAPS is a list of symbols (LEFT RIGHT [LEFT1 RIGHT1]) which specifies
c6a46372
KS
5991the actual bitmap shown in the left or right fringe for the logical
5992indicator. LEFT and RIGHT are the bitmaps shown in the left and/or
5993right fringe for the specific indicator. The LEFT1 or RIGHT1 bitmaps
14fb5704
JB
5994are used only for the `bottom' and `top-bottom' indicators when the
5995last (only) line has no final newline. BITMAPS may also be a single
c6a46372
KS
5996symbol which is used in both left and right fringes. */);
5997
5998 DEFVAR_PER_BUFFER ("fringe-cursor-alist",
4b4deea2 5999 &BVAR (current_buffer, fringe_cursor_alist), Qnil,
fb7ada5f 6000 doc: /* Mapping from logical to physical fringe cursor bitmaps.
c6a46372
KS
6001The value is an alist where each element (CURSOR . BITMAP)
6002specifies the fringe bitmaps used to display a specific logical
6003cursor type in the fringe.
6004
6005CURSOR specifies the logical cursor type which is one of the following
6006symbols: `box' , `hollow', `bar', `hbar', or `hollow-small'. The last
6007one is used to show a hollow cursor on narrow lines display lines
6008where the normal hollow cursor will not fit.
6009
6010BITMAP is the corresponding fringe bitmap shown for the logical
6011cursor type. */);
6012
0552666b 6013 DEFVAR_PER_BUFFER ("scroll-up-aggressively",
58cc0a01 6014 &BVAR (current_buffer, scroll_up_aggressively), Qfloatp,
4e0692c1
RS
6015 doc: /* How far to scroll windows upward.
6016If you move point off the bottom, the window scrolls automatically.
426a9163 6017This variable controls how far it scrolls. The value nil, the default,
4e0692c1
RS
6018means scroll to center point. A fraction means scroll to put point
6019that fraction of the window's height from the bottom of the window.
d765e3a3
JB
6020When the value is 0.0, point goes at the bottom line, which in the
6021simple case that you moved off with C-f means scrolling just one line.
60221.0 means point goes at the top, so that in that simple case, the
6023window scrolls by a full window height. Meaningful values are
175e9712 6024between 0.0 and 1.0, inclusive. */);
177c0ea7 6025
0552666b 6026 DEFVAR_PER_BUFFER ("scroll-down-aggressively",
58cc0a01 6027 &BVAR (current_buffer, scroll_down_aggressively), Qfloatp,
4e0692c1
RS
6028 doc: /* How far to scroll windows downward.
6029If you move point off the top, the window scrolls automatically.
426a9163 6030This variable controls how far it scrolls. The value nil, the default,
4e0692c1
RS
6031means scroll to center point. A fraction means scroll to put point
6032that fraction of the window's height from the top of the window.
d765e3a3
JB
6033When the value is 0.0, point goes at the top line, which in the
6034simple case that you moved off with C-b means scrolling just one line.
60351.0 means point goes at the bottom, so that in that simple case, the
6036window scrolls by a full window height. Meaningful values are
175e9712 6037between 0.0 and 1.0, inclusive. */);
177c0ea7 6038
29208e82 6039 DEFVAR_LISP ("before-change-functions", Vbefore_change_functions,
7ee72033 6040 doc: /* List of functions to call before each text change.
018ba359
PJ
6041Two arguments are passed to each function: the positions of
6042the beginning and end of the range of old text to be changed.
6043\(For an insertion, the beginning and end are at the same place.)
6044No information is given about the length of the text after the change.
6045
6046Buffer changes made while executing the `before-change-functions'
6047don't call any before-change or after-change functions.
7b2bf907 6048That's because `inhibit-modification-hooks' is temporarily set non-nil.
018ba359
PJ
6049
6050If an unhandled error happens in running these functions,
6051the variable's value remains nil. That prevents the error
6052from happening repeatedly and making Emacs nonfunctional. */);
5f079267
RS
6053 Vbefore_change_functions = Qnil;
6054
29208e82 6055 DEFVAR_LISP ("after-change-functions", Vafter_change_functions,
eacdfade 6056 doc: /* List of functions to call after each text change.
018ba359
PJ
6057Three arguments are passed to each function: the positions of
6058the beginning and end of the range of changed text,
6059and the length in bytes of the pre-change text replaced by that range.
6060\(For an insertion, the pre-change length is zero;
6061for a deletion, that length is the number of bytes deleted,
6062and the post-change beginning and end are at the same place.)
6063
6064Buffer changes made while executing the `after-change-functions'
6065don't call any before-change or after-change functions.
7b2bf907 6066That's because `inhibit-modification-hooks' is temporarily set non-nil.
018ba359
PJ
6067
6068If an unhandled error happens in running these functions,
6069the variable's value remains nil. That prevents the error
6070from happening repeatedly and making Emacs nonfunctional. */);
5f079267
RS
6071 Vafter_change_functions = Qnil;
6072
29208e82 6073 DEFVAR_LISP ("first-change-hook", Vfirst_change_hook,
efc7e75f 6074 doc: /* A list of functions to call before changing a buffer which is unmodified.
018ba359 6075The functions are run using the `run-hooks' function. */);
dbc4e1c1 6076 Vfirst_change_hook = Qnil;
1ab256cb 6077
4b4deea2 6078 DEFVAR_PER_BUFFER ("buffer-undo-list", &BVAR (current_buffer, undo_list), Qnil,
7ee72033 6079 doc: /* List of undo entries in current buffer.
018ba359
PJ
6080Recent changes come first; older changes follow newer.
6081
6082An entry (BEG . END) represents an insertion which begins at
6083position BEG and ends at position END.
6084
6085An entry (TEXT . POSITION) represents the deletion of the string TEXT
6086from (abs POSITION). If POSITION is positive, point was at the front
6087of the text being deleted; if negative, point was at the end.
6088
d35af63c
PE
6089An entry (t HIGH LOW USEC PSEC) indicates that the buffer was previously
6090unmodified; (HIGH LOW USEC PSEC) is in the same style as (current-time)
6091and is the visited file's modification time, as of that time. If the
018ba359
PJ
6092modification time of the most recent save is different, this entry is
6093obsolete.
6094
954b166e
PE
6095An entry (t . 0) means means the buffer was previously unmodified but
6096its time stamp was unknown because it was not associated with a file.
6097An entry (t . -1) is similar, except that it means the buffer's visited
6098file did not exist.
6099
018ba359
PJ
6100An entry (nil PROPERTY VALUE BEG . END) indicates that a text property
6101was modified between BEG and END. PROPERTY is the property name,
6102and VALUE is the old value.
6103
7405f386
KS
6104An entry (apply FUN-NAME . ARGS) means undo the change with
6105\(apply FUN-NAME ARGS).
6106
6107An entry (apply DELTA BEG END FUN-NAME . ARGS) supports selective undo
6108in the active region. BEG and END is the range affected by this entry
6109and DELTA is the number of bytes added or deleted in that range by
6110this change.
c6c7dc03 6111
018ba359
PJ
6112An entry (MARKER . DISTANCE) indicates that the marker MARKER
6113was adjusted in position by the offset DISTANCE (an integer).
6114
6115An entry of the form POSITION indicates that point was at the buffer
6116location given by the integer. Undoing an entry of this form places
6117point at POSITION.
6118
b4c4f2f4
JB
6119Entries with value `nil' mark undo boundaries. The undo command treats
6120the changes between two undo boundaries as a single step to be undone.
018ba359
PJ
6121
6122If the value of the variable is t, undo information is not recorded. */);
6123
4b4deea2 6124 DEFVAR_PER_BUFFER ("mark-active", &BVAR (current_buffer, mark_active), Qnil,
7ee72033 6125 doc: /* Non-nil means the mark and region are currently active in this buffer. */);
018ba359 6126
e30b79c1
DA
6127 DEFVAR_PER_BUFFER ("cache-long-scans", &BVAR (current_buffer, cache_long_scans), Qnil,
6128 doc: /* Non-nil means that Emacs should use caches in attempt to speedup buffer scans.
018ba359
PJ
6129
6130Normally, the line-motion functions work by scanning the buffer for
5629f29b
DK
6131newlines. Columnar operations (like `move-to-column' and
6132`compute-motion') also work by scanning the buffer, summing character
018ba359
PJ
6133widths as they go. This works well for ordinary text, but if the
6134buffer's lines are very long (say, more than 500 characters), these
6135motion functions will take longer to execute. Emacs may also take
6136longer to update the display.
6137
e30b79c1 6138If `cache-long-scans' is non-nil, these motion functions cache the
018ba359
PJ
6139results of their scans, and consult the cache to avoid rescanning
6140regions of the buffer until the text is modified. The caches are most
6141beneficial when they prevent the most searching---that is, when the
6142buffer contains long lines and large regions of characters with the
6143same, fixed screen width.
6144
e30b79c1 6145When `cache-long-scans' is non-nil, processing short lines will
018ba359
PJ
6146become slightly slower (because of the overhead of consulting the
6147cache), and the caches will use memory roughly proportional to the
6148number of newlines and characters whose screen width varies.
6149
e30b79c1
DA
6150Bidirectional editing also requires buffer scans to find paragraph
6151separators. If you have large paragraphs or no paragraph separators
6152at all, these scans may be slow. If `cache-long-scans' is non-nil,
6153results of these scans are cached. This doesn't help too much if
6154paragraphs are of the reasonable (few thousands of characters) size.
6155
018ba359
PJ
6156The caches require no explicit maintenance; their accuracy is
6157maintained internally by the Emacs primitives. Enabling or disabling
6158the cache should not affect the behavior of any of the motion
6159functions; it should only affect their performance. */);
6160
4b4deea2 6161 DEFVAR_PER_BUFFER ("point-before-scroll", &BVAR (current_buffer, point_before_scroll), Qnil,
7ee72033 6162 doc: /* Value of point before the last series of scroll operations, or nil. */);
018ba359 6163
4b4deea2 6164 DEFVAR_PER_BUFFER ("buffer-file-format", &BVAR (current_buffer, file_format), Qnil,
7ee72033 6165 doc: /* List of formats to use when saving this buffer.
018ba359 6166Formats are defined by `format-alist'. This variable is
a9b9a780 6167set when a file is visited. */);
be9aafdd 6168
71ed49fa 6169 DEFVAR_PER_BUFFER ("buffer-auto-save-file-format",
4b4deea2 6170 &BVAR (current_buffer, auto_save_file_format), Qnil,
fb7ada5f 6171 doc: /* Format in which to write auto-save files.
71ed49fa
LT
6172Should be a list of symbols naming formats that are defined in `format-alist'.
6173If it is t, which is the default, auto-save files are written in the
6174same format as a regular save would use. */);
6175
3cb719bd 6176 DEFVAR_PER_BUFFER ("buffer-invisibility-spec",
4b4deea2 6177 &BVAR (current_buffer, invisibility_spec), Qnil,
7ee72033 6178 doc: /* Invisibility spec of this buffer.
018ba359
PJ
6179The default is t, which means that text is invisible
6180if it has a non-nil `invisible' property.
6181If the value is a list, a text character is invisible if its `invisible'
b49dd850 6182property is an element in that list (or is a list with members in common).
018ba359
PJ
6183If an element is a cons cell of the form (PROP . ELLIPSIS),
6184then characters with property value PROP are invisible,
6185and they have an ellipsis as well if ELLIPSIS is non-nil. */);
3cb719bd 6186
7962a441 6187 DEFVAR_PER_BUFFER ("buffer-display-count",
58cc0a01 6188 &BVAR (current_buffer, display_count), Qintegerp,
7ee72033 6189 doc: /* A number incremented each time this buffer is displayed in a window.
018ba359 6190The function `set-window-buffer' increments it. */);
3fd364db
RS
6191
6192 DEFVAR_PER_BUFFER ("buffer-display-time",
4b4deea2 6193 &BVAR (current_buffer, display_time), Qnil,
7ee72033 6194 doc: /* Time stamp updated each time this buffer is displayed in a window.
018ba359
PJ
6195The function `set-window-buffer' updates this variable
6196to the value obtained by calling `current-time'.
6197If the buffer has never been shown in a window, the value is nil. */);
6198
29208e82 6199 DEFVAR_LISP ("transient-mark-mode", Vtransient_mark_mode,
9d794026
GM
6200 doc: /* Non-nil if Transient Mark mode is enabled.
6201See the command `transient-mark-mode' for a description of this minor mode.
6202
6203Non-nil also enables highlighting of the region whenever the mark is active.
6204The variable `highlight-nonselected-windows' controls whether to highlight
6205all windows or just the selected window.
6206
f49d1f52 6207Lisp programs may give this variable certain special values:
9d794026 6208
f49d1f52
SM
6209- A value of `lambda' enables Transient Mark mode temporarily.
6210 It is disabled again after any subsequent action that would
6211 normally deactivate the mark (e.g. buffer modification).
6212
6213- A value of (only . OLDVAL) enables Transient Mark mode
6214 temporarily. After any subsequent point motion command that is
6215 not shift-translated, or any other action that would normally
6216 deactivate the mark (e.g. buffer modification), the value of
6217 `transient-mark-mode' is set to OLDVAL. */);
c48f61ef
RS
6218 Vtransient_mark_mode = Qnil;
6219
29208e82 6220 DEFVAR_LISP ("inhibit-read-only", Vinhibit_read_only,
fb7ada5f 6221 doc: /* Non-nil means disregard read-only status of buffers or characters.
018ba359
PJ
6222If the value is t, disregard `buffer-read-only' and all `read-only'
6223text properties. If the value is a list, disregard `buffer-read-only'
6224and disregard a `read-only' text property if the property value
6225is a member of the list. */);
a96b68f1
RS
6226 Vinhibit_read_only = Qnil;
6227
4b4deea2 6228 DEFVAR_PER_BUFFER ("cursor-type", &BVAR (current_buffer, cursor_type), Qnil,
f6e22881 6229 doc: /* Cursor to use when this buffer is in the selected window.
018ba359
PJ
6230Values are interpreted as follows:
6231
0f7b074f
CY
6232 t use the cursor specified for the frame
6233 nil don't display a cursor
6234 box display a filled box cursor
6235 hollow display a hollow box cursor
6236 bar display a vertical bar cursor with default width
6237 (bar . WIDTH) display a vertical bar cursor with width WIDTH
6238 hbar display a horizontal bar cursor with default height
b4234f4c 6239 (hbar . HEIGHT) display a horizontal bar cursor with height HEIGHT
0f7b074f 6240 ANYTHING ELSE display a hollow box cursor
cd8d5236 6241
e08b1705
MR
6242When the buffer is displayed in a non-selected window, the
6243cursor's appearance is instead controlled by the variable
6244`cursor-in-non-selected-windows'. */);
bb2ec976 6245
a3bbced0 6246 DEFVAR_PER_BUFFER ("line-spacing",
58cc0a01 6247 &BVAR (current_buffer, extra_line_spacing), Qnumberp,
7ee72033 6248 doc: /* Additional space to put between lines when displaying a buffer.
3ba010e5
EZ
6249The space is measured in pixels, and put below lines on graphic displays,
6250see `display-graphic-p'.
60ebfdf3 6251If value is a floating point number, it specifies the spacing relative
fc961256 6252to the default frame line height. A value of nil means add no extra space. */);
a3bbced0 6253
0124c5bd 6254 DEFVAR_PER_BUFFER ("cursor-in-non-selected-windows",
4b4deea2 6255 &BVAR (current_buffer, cursor_in_non_selected_windows), Qnil,
fb7ada5f 6256 doc: /* Non-nil means show a cursor in non-selected windows.
66c6abf0
GM
6257If nil, only shows a cursor in the selected window.
6258If t, displays a cursor related to the usual cursor type
6259\(a solid box becomes hollow, a bar becomes a narrower bar).
6260You can also specify the cursor type as in the `cursor-type' variable.
6261Use Custom to set this variable and update the display." */);
0124c5bd 6262
29208e82 6263 DEFVAR_LISP ("kill-buffer-query-functions", Vkill_buffer_query_functions,
f6e22881
JB
6264 doc: /* List of functions called with no args to query before killing a buffer.
6265The buffer being killed will be current while the functions are running.
b7e8d081
MR
6266
6267If any of them returns nil, the buffer is not killed. Functions run by
6268this hook are supposed to not change the current buffer. */);
dcdffbf6
RS
6269 Vkill_buffer_query_functions = Qnil;
6270
29208e82 6271 DEFVAR_LISP ("change-major-mode-hook", Vchange_major_mode_hook,
43ed3b8d
CY
6272 doc: /* Normal hook run before changing the major mode of a buffer.
6273The function `kill-all-local-variables' runs this before doing anything else. */);
6274 Vchange_major_mode_hook = Qnil;
cd3520a4 6275 DEFSYM (Qchange_major_mode_hook, "change-major-mode-hook");
43ed3b8d 6276
9397e56f
MR
6277 DEFVAR_LISP ("buffer-list-update-hook", Vbuffer_list_update_hook,
6278 doc: /* Hook run when the buffer list changes.
6279Functions running this hook are `get-buffer-create',
6280`make-indirect-buffer', `rename-buffer', `kill-buffer',
96a72ee9 6281and `bury-buffer-internal'. */);
9397e56f 6282 Vbuffer_list_update_hook = Qnil;
cd3520a4 6283 DEFSYM (Qbuffer_list_update_hook, "buffer-list-update-hook");
9397e56f 6284
0dc88e60 6285 defsubr (&Sbuffer_live_p);
1ab256cb
RM
6286 defsubr (&Sbuffer_list);
6287 defsubr (&Sget_buffer);
6288 defsubr (&Sget_file_buffer);
6289 defsubr (&Sget_buffer_create);
336cd056 6290 defsubr (&Smake_indirect_buffer);
01050cb5 6291 defsubr (&Sgenerate_new_buffer_name);
1ab256cb 6292 defsubr (&Sbuffer_name);
1ab256cb 6293 defsubr (&Sbuffer_file_name);
336cd056 6294 defsubr (&Sbuffer_base_buffer);
79aa712d 6295 defsubr (&Sbuffer_local_value);
1ab256cb
RM
6296 defsubr (&Sbuffer_local_variables);
6297 defsubr (&Sbuffer_modified_p);
6298 defsubr (&Sset_buffer_modified_p);
6299 defsubr (&Sbuffer_modified_tick);
3e145152 6300 defsubr (&Sbuffer_chars_modified_tick);
1ab256cb
RM
6301 defsubr (&Srename_buffer);
6302 defsubr (&Sother_buffer);
1ab256cb
RM
6303 defsubr (&Sbuffer_enable_undo);
6304 defsubr (&Skill_buffer);
e4ed06f1 6305 defsubr (&Sbury_buffer_internal);
a9ee7a59 6306 defsubr (&Sset_buffer_major_mode);
1ab256cb
RM
6307 defsubr (&Scurrent_buffer);
6308 defsubr (&Sset_buffer);
6309 defsubr (&Sbarf_if_buffer_read_only);
3ac81adb 6310 defsubr (&Serase_buffer);
13cda5f9 6311 defsubr (&Sbuffer_swap_text);
3ac81adb 6312 defsubr (&Sset_buffer_multibyte);
1ab256cb 6313 defsubr (&Skill_all_local_variables);
2eec3b4e 6314
52f8ec73 6315 defsubr (&Soverlayp);
2eec3b4e
RS
6316 defsubr (&Smake_overlay);
6317 defsubr (&Sdelete_overlay);
c5e28e39 6318 defsubr (&Sdelete_all_overlays);
2eec3b4e 6319 defsubr (&Smove_overlay);
8ebafa8d
JB
6320 defsubr (&Soverlay_start);
6321 defsubr (&Soverlay_end);
6322 defsubr (&Soverlay_buffer);
6323 defsubr (&Soverlay_properties);
2eec3b4e 6324 defsubr (&Soverlays_at);
74514898 6325 defsubr (&Soverlays_in);
2eec3b4e 6326 defsubr (&Snext_overlay_change);
239c932b 6327 defsubr (&Sprevious_overlay_change);
2eec3b4e
RS
6328 defsubr (&Soverlay_recenter);
6329 defsubr (&Soverlay_lists);
6330 defsubr (&Soverlay_get);
6331 defsubr (&Soverlay_put);
a8c21b48 6332 defsubr (&Srestore_buffer_modified_p);
1ab256cb
RM
6333}
6334
dfcf069d 6335void
d3da34e0 6336keys_of_buffer (void)
1ab256cb
RM
6337{
6338 initial_define_key (control_x_map, 'b', "switch-to-buffer");
6339 initial_define_key (control_x_map, 'k', "kill-buffer");
4158c17d
RM
6340
6341 /* This must not be in syms_of_buffer, because Qdisabled is not
6342 initialized when that function gets called. */
d67b4f80 6343 Fput (intern_c_string ("erase-buffer"), Qdisabled, Qt);
1ab256cb 6344}