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