Mercurial > emacs
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 |