comparison src/buffer.c @ 28314:c46e609d887a

(buffer_permanent_local_flags): Make a char array. (max_buffer_local_idx): New variable. (reset_buffer_local_variables, Fbuffer_local_variables): Rewritten for new handling of per-buffer variables. (buffer_slot_type_mismatch): Use new macros for per-buffer vars. (init_buffer_once): Initialize per-buffer vars differently. Set max_buffer_local_idx.
author Gerd Moellmann <gerd@gnu.org>
date Sun, 26 Mar 2000 14:07:30 +0000
parents fd3ece8a61e5
children 986882bafaf1
comparison
equal deleted inserted replaced
28313:cdb964ab44c3 28314:c46e609d887a
71 default values in buffer_defaults. 71 default values in buffer_defaults.
72 Each such slot has a nonzero value in this structure. 72 Each such slot has a nonzero value in this structure.
73 The value has only one nonzero bit. 73 The value has only one nonzero bit.
74 74
75 When a buffer has its own local value for a slot, 75 When a buffer has its own local value for a slot,
76 the bit for that slot (found in the same slot in this structure) 76 the entry for that slot (found in the same slot in this structure)
77 is turned on in the buffer's local_var_flags slot. 77 is turned on in the buffer's local_flags array.
78 78
79 If a slot in this structure is -1, then even though there may 79 If a slot in this structure is -1, then even though there may
80 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it; 80 be a DEFVAR_PER_BUFFER for the slot, there is no default value for it;
81 and the corresponding slot in buffer_defaults is not used. 81 and the corresponding slot in buffer_defaults is not used.
82 82
110 If a slot here contains -1, the corresponding variable is read-only. */ 110 If a slot here contains -1, the corresponding variable is read-only. */
111 struct buffer buffer_local_types; 111 struct buffer buffer_local_types;
112 112
113 /* Flags indicating which built-in buffer-local variables 113 /* Flags indicating which built-in buffer-local variables
114 are permanent locals. */ 114 are permanent locals. */
115 static int buffer_permanent_local_flags; 115 static char buffer_permanent_local_flags[MAX_BUFFER_LOCAL_VARS];
116
117 /* Number of per-buffer variables used. */
118
119 int max_buffer_local_idx;
116 120
117 Lisp_Object Fset_buffer (); 121 Lisp_Object Fset_buffer ();
118 void set_buffer_internal (); 122 void set_buffer_internal ();
119 void set_buffer_internal_1 (); 123 void set_buffer_internal_1 ();
120 static void call_overlay_mod_hooks (); 124 static void call_overlay_mod_hooks ();
554 reset_buffer_local_variables (b, permanent_too) 558 reset_buffer_local_variables (b, permanent_too)
555 register struct buffer *b; 559 register struct buffer *b;
556 int permanent_too; 560 int permanent_too;
557 { 561 {
558 register int offset; 562 register int offset;
559 int dont_reset; 563 int i;
560
561 /* Decide which built-in local variables to reset. */
562 if (permanent_too)
563 dont_reset = 0;
564 else
565 dont_reset = buffer_permanent_local_flags;
566 564
567 /* Reset the major mode to Fundamental, together with all the 565 /* Reset the major mode to Fundamental, together with all the
568 things that depend on the major mode. 566 things that depend on the major mode.
569 default-major-mode is handled at a higher level. 567 default-major-mode is handled at a higher level.
570 We ignore it here. */ 568 We ignore it here. */
595 b->folding_sort_table = XSTRING (Vascii_folding_sort_table); 593 b->folding_sort_table = XSTRING (Vascii_folding_sort_table);
596 #endif /* 0 */ 594 #endif /* 0 */
597 595
598 /* Reset all (or most) per-buffer variables to their defaults. */ 596 /* Reset all (or most) per-buffer variables to their defaults. */
599 b->local_var_alist = Qnil; 597 b->local_var_alist = Qnil;
600 b->local_var_flags &= dont_reset; 598 for (i = 0; i < max_buffer_local_idx; ++i)
599 if (permanent_too || buffer_permanent_local_flags[i] == 0)
600 SET_BUFFER_HAS_LOCAL_VALUE_P (b, i, 0);
601 601
602 /* For each slot that has a default value, 602 /* For each slot that has a default value,
603 copy that into the slot. */ 603 copy that into the slot. */
604 604
605 for (offset = (char *)&buffer_local_flags.name - (char *)&buffer_local_flags; 605 for (offset = BUFFER_LOCAL_VAR_OFFSET (name);
606 offset < sizeof (struct buffer); 606 offset < sizeof *b;
607 offset += sizeof (Lisp_Object)) /* sizeof EMACS_INT == sizeof Lisp_Object */ 607 offset += sizeof (Lisp_Object))
608 { 608 {
609 int flag = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags)); 609 int idx = BUFFER_LOCAL_IDX (offset);
610 if ((flag > 0 610 if ((idx > 0
611 /* Don't reset a permanent local. */ 611 && (permanent_too
612 && ! (dont_reset & flag)) 612 || buffer_permanent_local_flags[idx] == 0))
613 || flag == -2) 613 /* Is -2 used anywhere? */
614 *(Lisp_Object *)(offset + (char *)b) 614 || idx == -2)
615 = *(Lisp_Object *)(offset + (char *)&buffer_defaults); 615 BUFFER_LOCAL_VALUE (b, offset) = BUFFER_LOCAL_DEFAULT_VALUE (offset);
616 } 616 }
617 } 617 }
618 618
619 /* We split this away from generate-new-buffer, because rename-buffer 619 /* We split this away from generate-new-buffer, because rename-buffer
620 and set-visited-file-name ought to be able to use this to really 620 and set-visited-file-name ought to be able to use this to really
755 } 755 }
756 } 756 }
757 757
758 /* Add on all the variables stored in special slots. */ 758 /* Add on all the variables stored in special slots. */
759 { 759 {
760 register int offset, mask; 760 int offset, idx;
761 761
762 for (offset = (char *)&buffer_local_symbols.name - (char *)&buffer_local_symbols; 762 for (offset = BUFFER_LOCAL_VAR_OFFSET (name);
763 offset < sizeof (struct buffer); 763 offset < sizeof (struct buffer);
764 offset += (sizeof (EMACS_INT))) /* sizeof EMACS_INT == sizeof Lisp_Object */ 764 /* sizeof EMACS_INT == sizeof Lisp_Object */
765 offset += (sizeof (EMACS_INT)))
765 { 766 {
766 mask = XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_flags)); 767 idx = BUFFER_LOCAL_IDX (offset);
767 if (mask == -1 || (buf->local_var_flags & mask)) 768 if ((idx == -1 || BUFFER_HAS_LOCAL_VALUE_P (buf, idx))
768 if (SYMBOLP (*(Lisp_Object *)(offset 769 && SYMBOLP (BUFFER_LOCAL_SYMBOL (offset)))
769 + (char *)&buffer_local_symbols))) 770 result = Fcons (Fcons (BUFFER_LOCAL_SYMBOL (offset),
770 result = Fcons (Fcons (*((Lisp_Object *) 771 BUFFER_LOCAL_VALUE (buf, offset)),
771 (offset + (char *)&buffer_local_symbols)), 772 result);
772 *(Lisp_Object *)(offset + (char *)buf)),
773 result);
774 } 773 }
775 } 774 }
776 775
777 return result; 776 return result;
778 } 777 }
3820 buffer_slot_type_mismatch (offset) 3819 buffer_slot_type_mismatch (offset)
3821 int offset; 3820 int offset;
3822 { 3821 {
3823 Lisp_Object sym; 3822 Lisp_Object sym;
3824 char *type_name; 3823 char *type_name;
3825 sym = *(Lisp_Object *)(offset + (char *)&buffer_local_symbols); 3824
3826 switch (XINT (*(Lisp_Object *)(offset + (char *)&buffer_local_types))) 3825 switch (XINT (BUFFER_LOCAL_TYPE (offset)))
3827 { 3826 {
3828 case Lisp_Int: type_name = "integers"; break; 3827 case Lisp_Int:
3829 case Lisp_String: type_name = "strings"; break; 3828 type_name = "integers";
3830 case Lisp_Symbol: type_name = "symbols"; break; 3829 break;
3831 3830
3831 case Lisp_String:
3832 type_name = "strings";
3833 break;
3834
3835 case Lisp_Symbol:
3836 type_name = "symbols";
3837 break;
3838
3832 default: 3839 default:
3833 abort (); 3840 abort ();
3834 } 3841 }
3835 3842
3843 sym = BUFFER_LOCAL_SYMBOL (offset);
3836 error ("Only %s should be stored in the buffer-local variable %s", 3844 error ("Only %s should be stored in the buffer-local variable %s",
3837 type_name, XSYMBOL (sym)->name->data); 3845 type_name, XSYMBOL (sym)->name->data);
3838 } 3846 }
3847
3839 3848
3840 void 3849 void
3841 init_buffer_once () 3850 init_buffer_once ()
3842 { 3851 {
3843 buffer_permanent_local_flags = 0; 3852 int idx;
3853
3854 bzero (buffer_permanent_local_flags, sizeof buffer_permanent_local_flags);
3844 3855
3845 /* Make sure all markable slots in buffer_defaults 3856 /* Make sure all markable slots in buffer_defaults
3846 are initialized reasonably, so mark_buffer won't choke. */ 3857 are initialized reasonably, so mark_buffer won't choke. */
3847 reset_buffer (&buffer_defaults); 3858 reset_buffer (&buffer_defaults);
3848 reset_buffer_local_variables (&buffer_defaults, 1); 3859 reset_buffer_local_variables (&buffer_defaults, 1);
3925 XSETINT (buffer_local_flags.file_format, -1); 3936 XSETINT (buffer_local_flags.file_format, -1);
3926 XSETINT (buffer_local_flags.display_count, -1); 3937 XSETINT (buffer_local_flags.display_count, -1);
3927 XSETINT (buffer_local_flags.display_time, -1); 3938 XSETINT (buffer_local_flags.display_time, -1);
3928 XSETINT (buffer_local_flags.enable_multibyte_characters, -1); 3939 XSETINT (buffer_local_flags.enable_multibyte_characters, -1);
3929 3940
3930 XSETFASTINT (buffer_local_flags.mode_line_format, 1); 3941 idx = 1;
3931 XSETFASTINT (buffer_local_flags.abbrev_mode, 2); 3942 XSETFASTINT (buffer_local_flags.mode_line_format, idx); ++idx;
3932 XSETFASTINT (buffer_local_flags.overwrite_mode, 4); 3943 XSETFASTINT (buffer_local_flags.abbrev_mode, idx); ++idx;
3933 XSETFASTINT (buffer_local_flags.case_fold_search, 8); 3944 XSETFASTINT (buffer_local_flags.overwrite_mode, idx); ++idx;
3934 XSETFASTINT (buffer_local_flags.auto_fill_function, 0x10); 3945 XSETFASTINT (buffer_local_flags.case_fold_search, idx); ++idx;
3935 XSETFASTINT (buffer_local_flags.selective_display, 0x20); 3946 XSETFASTINT (buffer_local_flags.auto_fill_function, idx); ++idx;
3947 XSETFASTINT (buffer_local_flags.selective_display, idx); ++idx;
3936 #ifndef old 3948 #ifndef old
3937 XSETFASTINT (buffer_local_flags.selective_display_ellipses, 0x40); 3949 XSETFASTINT (buffer_local_flags.selective_display_ellipses, idx); ++idx;
3938 #endif 3950 #endif
3939 XSETFASTINT (buffer_local_flags.tab_width, 0x80); 3951 XSETFASTINT (buffer_local_flags.tab_width, idx); ++idx;
3940 XSETFASTINT (buffer_local_flags.truncate_lines, 0x100); 3952 XSETFASTINT (buffer_local_flags.truncate_lines, idx); ++idx;
3941 XSETFASTINT (buffer_local_flags.ctl_arrow, 0x200); 3953 XSETFASTINT (buffer_local_flags.ctl_arrow, idx); ++idx;
3942 XSETFASTINT (buffer_local_flags.fill_column, 0x400); 3954 XSETFASTINT (buffer_local_flags.fill_column, idx); ++idx;
3943 XSETFASTINT (buffer_local_flags.left_margin, 0x800); 3955 XSETFASTINT (buffer_local_flags.left_margin, idx); ++idx;
3944 XSETFASTINT (buffer_local_flags.abbrev_table, 0x1000); 3956 XSETFASTINT (buffer_local_flags.abbrev_table, idx); ++idx;
3945 XSETFASTINT (buffer_local_flags.display_table, 0x2000); 3957 XSETFASTINT (buffer_local_flags.display_table, idx); ++idx;
3946 #ifdef DOS_NT 3958 #ifdef DOS_NT
3947 XSETFASTINT (buffer_local_flags.buffer_file_type, 0x4000); 3959 XSETFASTINT (buffer_local_flags.buffer_file_type, idx);
3948 /* Make this one a permanent local. */ 3960 /* Make this one a permanent local. */
3949 buffer_permanent_local_flags |= 0x4000; 3961 buffer_permanent_local_flags[idx++] = 1;
3950 #endif 3962 #endif
3951 XSETFASTINT (buffer_local_flags.syntax_table, 0x8000); 3963 XSETFASTINT (buffer_local_flags.syntax_table, idx); ++idx;
3952 XSETFASTINT (buffer_local_flags.cache_long_line_scans, 0x10000); 3964 XSETFASTINT (buffer_local_flags.cache_long_line_scans, idx); ++idx;
3953 XSETFASTINT (buffer_local_flags.category_table, 0x20000); 3965 XSETFASTINT (buffer_local_flags.category_table, idx); ++idx;
3954 XSETFASTINT (buffer_local_flags.direction_reversed, 0x40000); 3966 XSETFASTINT (buffer_local_flags.direction_reversed, idx); ++idx;
3955 XSETFASTINT (buffer_local_flags.buffer_file_coding_system, 0x80000); 3967 XSETFASTINT (buffer_local_flags.buffer_file_coding_system, idx);
3956 /* Make this one a permanent local. */ 3968 /* Make this one a permanent local. */
3957 buffer_permanent_local_flags |= 0x80000; 3969 buffer_permanent_local_flags[idx++] = 1;
3958 XSETFASTINT (buffer_local_flags.left_margin_width, 0x100000); 3970 XSETFASTINT (buffer_local_flags.left_margin_width, idx); ++idx;
3959 XSETFASTINT (buffer_local_flags.right_margin_width, 0x200000); 3971 XSETFASTINT (buffer_local_flags.right_margin_width, idx); ++idx;
3960 XSETFASTINT (buffer_local_flags.indicate_empty_lines, 0x400000); 3972 XSETFASTINT (buffer_local_flags.indicate_empty_lines, idx); ++idx;
3961 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, 0x800000); 3973 XSETFASTINT (buffer_local_flags.scroll_up_aggressively, idx); ++idx;
3962 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, 0x1000000); 3974 XSETFASTINT (buffer_local_flags.scroll_down_aggressively, idx); ++idx;
3963 XSETFASTINT (buffer_local_flags.header_line_format, 0x2000000); 3975 XSETFASTINT (buffer_local_flags.header_line_format, idx); ++idx;
3976
3977 /* Need more room? */
3978 if (idx >= MAX_BUFFER_LOCAL_VARS)
3979 abort ();
3980 max_buffer_local_idx = idx;
3964 3981
3965 Vbuffer_alist = Qnil; 3982 Vbuffer_alist = Qnil;
3966 current_buffer = 0; 3983 current_buffer = 0;
3967 all_buffers = 0; 3984 all_buffers = 0;
3968 3985