comparison src/buffer.c @ 10314:b5260fe3dfdd

(Fmake_indirect_buffer): New function. (Fbuffer_base_buffer): New function. (syms_of_buffer): defsubr them. (reset_buffer): Don't alter intervals here. (Fget_buffer_create): Use BUF_MARKERS. Init BUF_INTERVALS here. (Fkill_buffer): Use BUF_MARKERS; but don't touch it in indir buf. Likewise BUF_INTERVALS. (init_buffer_once): Set up .text and BUF_INTERVALS in buffer_local_symbols and buffer_defaults. (Fkill_buffer): Don't free the text in indirect buffer. When killing a base buffer, kill its indirect buffers first. (set_buffer_temp): New function. (reset_buffer_local_variables): Initialize buffer_file_type field. (Fget_buffer_create): Initialize pt_marker, begv/zv_marker. (set_buffer_internal): Use and update these markers. Copy undo_list in and out of the base buffer. (Fget_buffer_create): Init save_modiff field here. (reset_buffer): Not here. (Fbuffer_modified_p): Use BUF_SAVE_MODIFF. (Fset_buffer_modified_p): Use SAVE_MODIFF. (Fkill_buffer, list_buffers_1): Use BUF_SAVE_MODIFF. (Fget_buffer_create): Initialize the size and text fields.
author Richard M. Stallman <rms@gnu.org>
date Mon, 02 Jan 1995 21:50:28 +0000
parents 4aa245b5eb83
children 3a50d7d3ae47
comparison
equal deleted inserted replaced
10313:55ce83f36b30 10314:b5260fe3dfdd
253 if (XSTRING (name)->size == 0) 253 if (XSTRING (name)->size == 0)
254 error ("Empty string for buffer name is not allowed"); 254 error ("Empty string for buffer name is not allowed");
255 255
256 b = (struct buffer *) xmalloc (sizeof (struct buffer)); 256 b = (struct buffer *) xmalloc (sizeof (struct buffer));
257 257
258 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
259
260 /* An ordinary buffer uses its own struct buffer_text. */
261 b->text = &b->own_text;
262 b->base_buffer = 0;
263
258 BUF_GAP_SIZE (b) = 20; 264 BUF_GAP_SIZE (b) = 20;
259 BLOCK_INPUT; 265 BLOCK_INPUT;
260 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b)); 266 BUFFER_ALLOC (BUF_BEG_ADDR (b), BUF_GAP_SIZE (b));
261 UNBLOCK_INPUT; 267 UNBLOCK_INPUT;
262 if (! BUF_BEG_ADDR (b)) 268 if (! BUF_BEG_ADDR (b))
266 BUF_GPT (b) = 1; 272 BUF_GPT (b) = 1;
267 BUF_BEGV (b) = 1; 273 BUF_BEGV (b) = 1;
268 BUF_ZV (b) = 1; 274 BUF_ZV (b) = 1;
269 BUF_Z (b) = 1; 275 BUF_Z (b) = 1;
270 BUF_MODIFF (b) = 1; 276 BUF_MODIFF (b) = 1;
277 BUF_SAVE_MODIFF (b) = 1;
278 BUF_INTERVALS (b) = 0;
271 279
272 b->newline_cache = 0; 280 b->newline_cache = 0;
273 b->width_run_cache = 0; 281 b->width_run_cache = 0;
274 b->width_table = Qnil; 282 b->width_table = Qnil;
275 283
276 /* Put this on the chain of all buffers including killed ones. */ 284 /* Put this on the chain of all buffers including killed ones. */
277 b->next = all_buffers; 285 b->next = all_buffers;
278 all_buffers = b; 286 all_buffers = b;
279 287
280 b->mark = Fmake_marker (); 288 /* An ordinary buffer normally doesn't need markers
281 /*b->number = make_number (++buffer_count);*/ 289 to handle BEGV and ZV. */
290 b->pt_marker = Qnil;
291 b->begv_marker = Qnil;
292 b->zv_marker = Qnil;
282 293
283 name = Fcopy_sequence (name); 294 name = Fcopy_sequence (name);
284 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL); 295 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL);
285 b->name = name; 296 b->name = name;
286 297
295 /* Put this in the alist of all live buffers. */ 306 /* Put this in the alist of all live buffers. */
296 XSETBUFFER (buf, b); 307 XSETBUFFER (buf, b);
297 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil)); 308 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
298 309
299 b->mark = Fmake_marker (); 310 b->mark = Fmake_marker ();
300 b->markers = Qnil; 311 BUF_MARKERS (b) = Qnil;
301 b->name = name; 312 b->name = name;
313 return buf;
314 }
315
316 DEFUN ("make-indirect-buffer",
317 Fmake_indirect_buffer, Smake_indirect_buffer, 2, 2,
318 "BMake indirect buffer: \nbIndirect to base buffer: ",
319 "Create and return an indirect buffer named NAME, with base buffer BASE.\n\
320 BASE should be an existing buffer (or buffer name).")
321 (name, base_buffer)
322 register Lisp_Object name, base_buffer;
323 {
324 register Lisp_Object buf;
325 register struct buffer *b;
326
327 buf = Fget_buffer (name);
328 if (!NILP (buf))
329 error ("Buffer name `%s' is in use", XSTRING (name)->data);
330
331 base_buffer = Fget_buffer (base_buffer);
332 if (NILP (base_buffer))
333 error ("No such buffer: `%s'",
334 XSTRING (XBUFFER (base_buffer)->name)->data);
335
336 if (XSTRING (name)->size == 0)
337 error ("Empty string for buffer name is not allowed");
338
339 b = (struct buffer *) xmalloc (sizeof (struct buffer));
340
341 b->size = sizeof (struct buffer) / sizeof (EMACS_INT);
342
343 if (XBUFFER (base_buffer)->base_buffer)
344 b->base_buffer = XBUFFER (base_buffer)->base_buffer;
345 else
346 b->base_buffer = XBUFFER (base_buffer);
347
348 /* Use the base buffer's text object. */
349 b->text = b->base_buffer->text;
350
351 BUF_BEGV (b) = BUF_BEGV (b->base_buffer);
352 BUF_ZV (b) = BUF_ZV (b->base_buffer);
353 BUF_PT (b) = BUF_PT (b->base_buffer);
354
355 b->newline_cache = 0;
356 b->width_run_cache = 0;
357 b->width_table = Qnil;
358
359 /* Put this on the chain of all buffers including killed ones. */
360 b->next = all_buffers;
361 all_buffers = b;
362
363 name = Fcopy_sequence (name);
364 INITIALIZE_INTERVAL (XSTRING (name), NULL_INTERVAL);
365 b->name = name;
366
367 reset_buffer (b);
368 reset_buffer_local_variables (b);
369
370 /* Put this in the alist of all live buffers. */
371 XSETBUFFER (buf, b);
372 Vbuffer_alist = nconc2 (Vbuffer_alist, Fcons (Fcons (name, buf), Qnil));
373
374 b->mark = Fmake_marker ();
375 b->name = name;
376
377 /* Make sure the base buffer has markers for its narrowing. */
378 if (NILP (b->base_buffer->pt_marker))
379 {
380 b->base_buffer->pt_marker = Fmake_marker ();
381 Fset_marker (b->base_buffer->pt_marker,
382 make_number (BUF_PT (b->base_buffer)), base_buffer);
383 }
384 if (NILP (b->base_buffer->begv_marker))
385 {
386 b->base_buffer->begv_marker = Fmake_marker ();
387 Fset_marker (b->base_buffer->begv_marker,
388 make_number (BUF_BEGV (b->base_buffer)), base_buffer);
389 }
390 if (NILP (b->base_buffer->zv_marker))
391 {
392 b->base_buffer->zv_marker = Fmake_marker ();
393 Fset_marker (b->base_buffer->zv_marker,
394 make_number (BUF_ZV (b->base_buffer)), base_buffer);
395 }
396
397 /* Give the indirect buffer markers for its narrowing. */
398 b->pt_marker = Fpoint_marker ();
399 b->begv_marker = Fpoint_min_marker ();
400 b->zv_marker = Fpoint_max_marker ();
401
302 return buf; 402 return buf;
303 } 403 }
304 404
305 /* Reinitialize everything about a buffer except its name and contents 405 /* Reinitialize everything about a buffer except its name and contents
306 and local variables. */ 406 and local variables. */
310 register struct buffer *b; 410 register struct buffer *b;
311 { 411 {
312 b->filename = Qnil; 412 b->filename = Qnil;
313 b->directory = (current_buffer) ? current_buffer->directory : Qnil; 413 b->directory = (current_buffer) ? current_buffer->directory : Qnil;
314 b->modtime = 0; 414 b->modtime = 0;
315 b->save_modified = 1;
316 XSETFASTINT (b->save_length, 0); 415 XSETFASTINT (b->save_length, 0);
317 b->last_window_start = 1; 416 b->last_window_start = 1;
318 b->backed_up = Qnil; 417 b->backed_up = Qnil;
319 b->auto_save_modified = 0; 418 b->auto_save_modified = 0;
320 b->auto_save_failure_time = -1; 419 b->auto_save_failure_time = -1;
322 b->read_only = Qnil; 421 b->read_only = Qnil;
323 b->overlays_before = Qnil; 422 b->overlays_before = Qnil;
324 b->overlays_after = Qnil; 423 b->overlays_after = Qnil;
325 XSETFASTINT (b->overlay_center, 1); 424 XSETFASTINT (b->overlay_center, 1);
326 b->mark_active = Qnil; 425 b->mark_active = Qnil;
327
328 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
329 INITIALIZE_INTERVAL (b, NULL_INTERVAL);
330 } 426 }
331 427
332 /* Reset buffer B's local variables info. 428 /* Reset buffer B's local variables info.
333 Don't use this on a buffer that has already been in use; 429 Don't use this on a buffer that has already been in use;
334 it does not treat permanent locals consistently. 430 it does not treat permanent locals consistently.
350 b->minor_modes = Qnil; 446 b->minor_modes = Qnil;
351 b->downcase_table = Vascii_downcase_table; 447 b->downcase_table = Vascii_downcase_table;
352 b->upcase_table = Vascii_upcase_table; 448 b->upcase_table = Vascii_upcase_table;
353 b->case_canon_table = Vascii_canon_table; 449 b->case_canon_table = Vascii_canon_table;
354 b->case_eqv_table = Vascii_eqv_table; 450 b->case_eqv_table = Vascii_eqv_table;
451 b->buffer_file_type = Qnil;
355 #if 0 452 #if 0
356 b->sort_table = XSTRING (Vascii_sort_table); 453 b->sort_table = XSTRING (Vascii_sort_table);
357 b->folding_sort_table = XSTRING (Vascii_folding_sort_table); 454 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
358 #endif /* 0 */ 455 #endif /* 0 */
359 456
436 { 533 {
437 if (NILP (buffer)) 534 if (NILP (buffer))
438 return current_buffer->filename; 535 return current_buffer->filename;
439 CHECK_BUFFER (buffer, 0); 536 CHECK_BUFFER (buffer, 0);
440 return XBUFFER (buffer)->filename; 537 return XBUFFER (buffer)->filename;
538 }
539
540 DEFUN ("buffer-base-buffer", Fbuffer_base_buffer, Sbuffer_base_buffer,
541 0, 1, 0,
542 "Return the base buffer of indirect buffer BUFFER.\n\
543 If BUFFER is not indirect, return nil.")
544 (buffer)
545 register Lisp_Object buffer;
546 {
547 struct buffer *base;
548 Lisp_Object base_buffer;
549
550 if (NILP (buffer))
551 base = current_buffer->base_buffer;
552 else
553 {
554 CHECK_BUFFER (buffer, 0);
555 base = XBUFFER (buffer)->base_buffer;
556 }
557
558 if (! base)
559 return Qnil;
560 XSETBUFFER (base_buffer, base);
561 return base_buffer;
441 } 562 }
442 563
443 DEFUN ("buffer-local-variables", Fbuffer_local_variables, 564 DEFUN ("buffer-local-variables", Fbuffer_local_variables,
444 Sbuffer_local_variables, 0, 1, 0, 565 Sbuffer_local_variables, 0, 1, 0,
445 "Return an alist of variables that are buffer-local in BUFFER.\n\ 566 "Return an alist of variables that are buffer-local in BUFFER.\n\
527 { 648 {
528 CHECK_BUFFER (buffer, 0); 649 CHECK_BUFFER (buffer, 0);
529 buf = XBUFFER (buffer); 650 buf = XBUFFER (buffer);
530 } 651 }
531 652
532 return buf->save_modified < BUF_MODIFF (buf) ? Qt : Qnil; 653 return BUF_SAVE_MODIFF (buf) < BUF_MODIFF (buf) ? Qt : Qnil;
533 } 654 }
534 655
535 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p, 656 DEFUN ("set-buffer-modified-p", Fset_buffer_modified_p, Sset_buffer_modified_p,
536 1, 1, 0, 657 1, 1, 0,
537 "Mark current buffer as modified or unmodified according to FLAG.\n\ 658 "Mark current buffer as modified or unmodified according to FLAG.\n\
547 If buffer becoming unmodified, unlock the file. */ 668 If buffer becoming unmodified, unlock the file. */
548 669
549 fn = current_buffer->filename; 670 fn = current_buffer->filename;
550 if (!NILP (fn)) 671 if (!NILP (fn))
551 { 672 {
552 already = current_buffer->save_modified < MODIFF; 673 already = SAVE_MODIFF < MODIFF;
553 if (!already && !NILP (flag)) 674 if (!already && !NILP (flag))
554 lock_file (fn); 675 lock_file (fn);
555 else if (already && NILP (flag)) 676 else if (already && NILP (flag))
556 unlock_file (fn); 677 unlock_file (fn);
557 } 678 }
558 #endif /* CLASH_DETECTION */ 679 #endif /* CLASH_DETECTION */
559 680
560 current_buffer->save_modified = NILP (flag) ? MODIFF : 0; 681 SAVE_MODIFF = NILP (flag) ? MODIFF : 0;
561 update_mode_lines++; 682 update_mode_lines++;
562 return flag; 683 return flag;
563 } 684 }
564 685
565 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick, 686 DEFUN ("buffer-modified-tick", Fbuffer_modified_tick, Sbuffer_modified_tick,
760 881
761 b = XBUFFER (buf); 882 b = XBUFFER (buf);
762 883
763 /* Query if the buffer is still modified. */ 884 /* Query if the buffer is still modified. */
764 if (INTERACTIVE && !NILP (b->filename) 885 if (INTERACTIVE && !NILP (b->filename)
765 && BUF_MODIFF (b) > b->save_modified) 886 && BUF_MODIFF (b) > BUF_SAVE_MODIFF (b))
766 { 887 {
767 GCPRO2 (buf, bufname); 888 GCPRO2 (buf, bufname);
768 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ", 889 tem = do_yes_or_no_p (format1 ("Buffer %s modified; kill anyway? ",
769 XSTRING (b->name)->data)); 890 XSTRING (b->name)->data));
770 UNGCPRO; 891 UNGCPRO;
805 return Qnil; 926 return Qnil;
806 927
807 if (NILP (b->name)) 928 if (NILP (b->name))
808 return Qnil; 929 return Qnil;
809 930
931 /* When we kill a base buffer, kill all its indirect buffers.
932 We do it at this stage so nothing terrible happens if they
933 ask questions or their hooks get errors. */
934 if (! b->base_buffer)
935 {
936 struct buffer *other;
937
938 GCPRO1 (buf);
939
940 for (other = all_buffers; other; other = other->next)
941 if (other->base_buffer == b)
942 {
943 Lisp_Object buf;
944 XSETBUFFER (buf, other);
945 Fkill_buffer (buf);
946 }
947
948 UNGCPRO;
949 }
950
810 /* Make this buffer not be current. 951 /* Make this buffer not be current.
811 In the process, notice if this is the sole visible buffer 952 In the process, notice if this is the sole visible buffer
812 and give up if so. */ 953 and give up if so. */
813 if (b == current_buffer) 954 if (b == current_buffer)
814 { 955 {
841 tem = Fsymbol_value (intern ("delete-auto-save-files")); 982 tem = Fsymbol_value (intern ("delete-auto-save-files"));
842 if (! NILP (tem)) 983 if (! NILP (tem))
843 internal_delete_file (b->auto_save_file_name); 984 internal_delete_file (b->auto_save_file_name);
844 } 985 }
845 986
846 /* Unchain all markers of this buffer 987 if (! b->base_buffer)
847 and leave them pointing nowhere. */ 988 {
848 for (tem = b->markers; !EQ (tem, Qnil); ) 989 /* Unchain all markers of this buffer
849 { 990 and leave them pointing nowhere. */
850 m = XMARKER (tem); 991 for (tem = BUF_MARKERS (b); !EQ (tem, Qnil); )
851 m->buffer = 0; 992 {
852 tem = m->chain; 993 m = XMARKER (tem);
853 m->chain = Qnil; 994 m->buffer = 0;
854 } 995 tem = m->chain;
855 b->markers = Qnil; 996 m->chain = Qnil;
856 997 }
857 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */ 998 BUF_MARKERS (b) = Qnil;
858 INITIALIZE_INTERVAL (b, NULL_INTERVAL); 999
859 /* Perhaps we should explicitly free the interval tree here... */ 1000 #ifdef USE_TEXT_PROPERTIES
1001 BUF_INTERVALS (b) = NULL_INTERVAL;
1002 #endif
1003
1004 /* Perhaps we should explicitly free the interval tree here... */
1005 }
860 1006
861 b->name = Qnil; 1007 b->name = Qnil;
1008
862 BLOCK_INPUT; 1009 BLOCK_INPUT;
863 BUFFER_FREE (BUF_BEG_ADDR (b)); 1010 if (! b->base_buffer)
1011 BUFFER_FREE (BUF_BEG_ADDR (b));
1012
864 if (b->newline_cache) 1013 if (b->newline_cache)
865 { 1014 {
866 free_region_cache (b->newline_cache); 1015 free_region_cache (b->newline_cache);
867 b->newline_cache = 0; 1016 b->newline_cache = 0;
868 } 1017 }
1026 1175
1027 windows_or_buffers_changed = 1; 1176 windows_or_buffers_changed = 1;
1028 old_buf = current_buffer; 1177 old_buf = current_buffer;
1029 current_buffer = b; 1178 current_buffer = b;
1030 last_known_column_point = -1; /* invalidate indentation cache */ 1179 last_known_column_point = -1; /* invalidate indentation cache */
1180
1181 if (old_buf)
1182 {
1183 /* Put the undo list back in the base buffer, so that it appears
1184 that an indirect buffer shares the undo list of its base. */
1185 if (old_buf->base_buffer)
1186 old_buf->base_buffer->undo_list = old_buf->undo_list;
1187
1188 /* If the old current buffer has markers to record PT, BEGV and ZV
1189 when it is not current, update them now. */
1190 if (! NILP (old_buf->pt_marker))
1191 {
1192 Lisp_Object obuf;
1193 XSETBUFFER (obuf, old_buf);
1194 Fset_marker (old_buf->pt_marker, BUF_PT (old_buf), obuf);
1195 }
1196 if (! NILP (old_buf->begv_marker))
1197 {
1198 Lisp_Object obuf;
1199 XSETBUFFER (obuf, old_buf);
1200 Fset_marker (old_buf->begv_marker, BUF_BEGV (old_buf), obuf);
1201 }
1202 if (! NILP (old_buf->zv_marker))
1203 {
1204 Lisp_Object obuf;
1205 XSETBUFFER (obuf, old_buf);
1206 Fset_marker (old_buf->zv_marker, BUF_ZV (old_buf), obuf);
1207 }
1208 }
1209
1210 /* Get the undo list from the base buffer, so that it appears
1211 that an indirect buffer shares the undo list of its base. */
1212 if (b->base_buffer)
1213 b->undo_list = b->base_buffer->undo_list;
1214
1215 /* If the new current buffer has markers to record PT, BEGV and ZV
1216 when it is not current, fetch them now. */
1217 if (! NILP (b->pt_marker))
1218 BUF_PT (b) = marker_position (b->pt_marker);
1219 if (! NILP (b->begv_marker))
1220 BUF_BEGV (b) = marker_position (b->begv_marker);
1221 if (! NILP (b->zv_marker))
1222 BUF_ZV (b) = marker_position (b->zv_marker);
1031 1223
1032 /* Look down buffer's list of local Lisp variables 1224 /* Look down buffer's list of local Lisp variables
1033 to find and update any that forward into C variables. */ 1225 to find and update any that forward into C variables. */
1034 1226
1035 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr) 1227 for (tail = b->local_var_alist; !NILP (tail); tail = XCONS (tail)->cdr)
1056 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem)))) 1248 (BOOLFWDP (tem) || INTFWDP (tem) || OBJFWDP (tem))))
1057 /* Just reference the variable 1249 /* Just reference the variable
1058 to cause it to become set for this buffer. */ 1250 to cause it to become set for this buffer. */
1059 Fsymbol_value (XCONS (XCONS (tail)->car)->car); 1251 Fsymbol_value (XCONS (XCONS (tail)->car)->car);
1060 } 1252 }
1253 }
1254
1255 /* Switch to buffer B temporarily for redisplay purposes.
1256 This avoids certain things thatdon't need to be done within redisplay. */
1257
1258 void
1259 set_buffer_temp (b)
1260 struct buffer *b;
1261 {
1262 register struct buffer *old_buf;
1263
1264 if (current_buffer == b)
1265 return;
1266
1267 old_buf = current_buffer;
1268 current_buffer = b;
1269
1270 if (old_buf)
1271 {
1272 /* If the old current buffer has markers to record PT, BEGV and ZV
1273 when it is not current, update them now. */
1274 if (! NILP (old_buf->pt_marker))
1275 {
1276 Lisp_Object obuf;
1277 XSETBUFFER (obuf, old_buf);
1278 Fset_marker (old_buf->pt_marker, BUF_PT (old_buf), obuf);
1279 }
1280 if (! NILP (old_buf->begv_marker))
1281 {
1282 Lisp_Object obuf;
1283 XSETBUFFER (obuf, old_buf);
1284 Fset_marker (old_buf->begv_marker, BUF_BEGV (old_buf), obuf);
1285 }
1286 if (! NILP (old_buf->zv_marker))
1287 {
1288 Lisp_Object obuf;
1289 XSETBUFFER (obuf, old_buf);
1290 Fset_marker (old_buf->zv_marker, BUF_ZV (old_buf), obuf);
1291 }
1292 }
1293
1294 /* If the new current buffer has markers to record PT, BEGV and ZV
1295 when it is not current, fetch them now. */
1296 if (! NILP (b->pt_marker))
1297 BUF_PT (b) = marker_position (b->pt_marker);
1298 if (! NILP (b->begv_marker))
1299 BUF_BEGV (b) = marker_position (b->begv_marker);
1300 if (! NILP (b->zv_marker))
1301 BUF_ZV (b) = marker_position (b->zv_marker);
1061 } 1302 }
1062 1303
1063 DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0, 1304 DEFUN ("set-buffer", Fset_buffer, Sset_buffer, 1, 1, 0,
1064 "Make the buffer BUFFER current for editing operations.\n\ 1305 "Make the buffer BUFFER current for editing operations.\n\
1065 BUFFER may be a buffer or the name of an existing buffer.\n\ 1306 BUFFER may be a buffer or the name of an existing buffer.\n\
1205 /* Identify the current buffer. */ 1446 /* Identify the current buffer. */
1206 if (b == old) 1447 if (b == old)
1207 XSETFASTINT (desired_point, PT); 1448 XSETFASTINT (desired_point, PT);
1208 write_string (b == old ? "." : " ", -1); 1449 write_string (b == old ? "." : " ", -1);
1209 /* Identify modified buffers */ 1450 /* Identify modified buffers */
1210 write_string (BUF_MODIFF (b) > b->save_modified ? "*" : " ", -1); 1451 write_string (BUF_MODIFF (b) > BUF_SAVE_MODIFF (b) ? "*" : " ", -1);
1211 /* The current buffer is special-cased to be marked read-only. 1452 /* The current buffer is special-cased to be marked read-only.
1212 It is actually made read-only by the call to 1453 It is actually made read-only by the call to
1213 Buffer-menu-mode, below. */ 1454 Buffer-menu-mode, below. */
1214 write_string ((b != current_buffer && NILP (b->read_only)) 1455 write_string ((b != current_buffer && NILP (b->read_only))
1215 ? " " : "% ", -1); 1456 ? " " : "% ", -1);
2538 are initialized reasonably, so mark_buffer won't choke. */ 2779 are initialized reasonably, so mark_buffer won't choke. */
2539 reset_buffer (&buffer_defaults); 2780 reset_buffer (&buffer_defaults);
2540 reset_buffer_local_variables (&buffer_defaults); 2781 reset_buffer_local_variables (&buffer_defaults);
2541 reset_buffer (&buffer_local_symbols); 2782 reset_buffer (&buffer_local_symbols);
2542 reset_buffer_local_variables (&buffer_local_symbols); 2783 reset_buffer_local_variables (&buffer_local_symbols);
2784 /* Prevent GC from getting confused. */
2785 buffer_defaults.text = &buffer_defaults.own_text;
2786 buffer_local_symbols.text = &buffer_local_symbols.own_text;
2787 #ifdef USE_TEXT_PROPERTIES
2788 BUF_INTERVALS (&buffer_defaults) = 0;
2789 BUF_INTERVALS (&buffer_local_symbols) = 0;
2790 #endif
2543 XSETBUFFER (Vbuffer_defaults, &buffer_defaults); 2791 XSETBUFFER (Vbuffer_defaults, &buffer_defaults);
2544 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols); 2792 XSETBUFFER (Vbuffer_local_symbols, &buffer_local_symbols);
2545 2793
2546 /* Set up the default values of various buffer slots. */ 2794 /* Set up the default values of various buffer slots. */
2547 /* Must do these before making the first buffer! */ 2795 /* Must do these before making the first buffer! */
3122 3370
3123 defsubr (&Sbuffer_list); 3371 defsubr (&Sbuffer_list);
3124 defsubr (&Sget_buffer); 3372 defsubr (&Sget_buffer);
3125 defsubr (&Sget_file_buffer); 3373 defsubr (&Sget_file_buffer);
3126 defsubr (&Sget_buffer_create); 3374 defsubr (&Sget_buffer_create);
3375 defsubr (&Smake_indirect_buffer);
3127 defsubr (&Sgenerate_new_buffer_name); 3376 defsubr (&Sgenerate_new_buffer_name);
3128 defsubr (&Sbuffer_name); 3377 defsubr (&Sbuffer_name);
3129 /*defsubr (&Sbuffer_number);*/ 3378 /*defsubr (&Sbuffer_number);*/
3130 defsubr (&Sbuffer_file_name); 3379 defsubr (&Sbuffer_file_name);
3380 defsubr (&Sbuffer_base_buffer);
3131 defsubr (&Sbuffer_local_variables); 3381 defsubr (&Sbuffer_local_variables);
3132 defsubr (&Sbuffer_modified_p); 3382 defsubr (&Sbuffer_modified_p);
3133 defsubr (&Sset_buffer_modified_p); 3383 defsubr (&Sset_buffer_modified_p);
3134 defsubr (&Sbuffer_modified_tick); 3384 defsubr (&Sbuffer_modified_tick);
3135 defsubr (&Srename_buffer); 3385 defsubr (&Srename_buffer);