diff options
Diffstat (limited to 'src/buffer.c')
| -rw-r--r-- | src/buffer.c | 100 |
1 files changed, 54 insertions, 46 deletions
diff --git a/src/buffer.c b/src/buffer.c index d7adf63c98b..238923a2ba0 100644 --- a/src/buffer.c +++ b/src/buffer.c | |||
| @@ -27,6 +27,8 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 27 | #include <setjmp.h> | 27 | #include <setjmp.h> |
| 28 | #include <unistd.h> | 28 | #include <unistd.h> |
| 29 | 29 | ||
| 30 | #include <verify.h> | ||
| 31 | |||
| 30 | #include "lisp.h" | 32 | #include "lisp.h" |
| 31 | #include "intervals.h" | 33 | #include "intervals.h" |
| 32 | #include "window.h" | 34 | #include "window.h" |
| @@ -92,6 +94,11 @@ static Lisp_Object Vbuffer_local_symbols; | |||
| 92 | #define PER_BUFFER_SYMBOL(OFFSET) \ | 94 | #define PER_BUFFER_SYMBOL(OFFSET) \ |
| 93 | (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_symbols)) | 95 | (*(Lisp_Object *)((OFFSET) + (char *) &buffer_local_symbols)) |
| 94 | 96 | ||
| 97 | /* Maximum length of an overlay vector. */ | ||
| 98 | #define OVERLAY_COUNT_MAX \ | ||
| 99 | ((ptrdiff_t) min (MOST_POSITIVE_FIXNUM, \ | ||
| 100 | min (PTRDIFF_MAX, SIZE_MAX) / sizeof (Lisp_Object))) | ||
| 101 | |||
| 95 | /* Flags indicating which built-in buffer-local variables | 102 | /* Flags indicating which built-in buffer-local variables |
| 96 | are permanent locals. */ | 103 | are permanent locals. */ |
| 97 | static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS]; | 104 | static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS]; |
| @@ -2516,14 +2523,15 @@ swap_out_buffer_local_variables (struct buffer *b) | |||
| 2516 | *NEXT_PTR is guaranteed to be not equal to POS, unless it is the | 2523 | *NEXT_PTR is guaranteed to be not equal to POS, unless it is the |
| 2517 | default (BEGV or ZV). */ | 2524 | default (BEGV or ZV). */ |
| 2518 | 2525 | ||
| 2519 | int | 2526 | ptrdiff_t |
| 2520 | overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, int *len_ptr, | 2527 | overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, |
| 2528 | ptrdiff_t *len_ptr, | ||
| 2521 | EMACS_INT *next_ptr, EMACS_INT *prev_ptr, int change_req) | 2529 | EMACS_INT *next_ptr, EMACS_INT *prev_ptr, int change_req) |
| 2522 | { | 2530 | { |
| 2523 | Lisp_Object overlay, start, end; | 2531 | Lisp_Object overlay, start, end; |
| 2524 | struct Lisp_Overlay *tail; | 2532 | struct Lisp_Overlay *tail; |
| 2525 | int idx = 0; | 2533 | ptrdiff_t idx = 0; |
| 2526 | int len = *len_ptr; | 2534 | ptrdiff_t len = *len_ptr; |
| 2527 | Lisp_Object *vec = *vec_ptr; | 2535 | Lisp_Object *vec = *vec_ptr; |
| 2528 | EMACS_INT next = ZV; | 2536 | EMACS_INT next = ZV; |
| 2529 | EMACS_INT prev = BEGV; | 2537 | EMACS_INT prev = BEGV; |
| @@ -2559,10 +2567,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, int *len_ptr, | |||
| 2559 | Either make it bigger, or don't store any more in it. */ | 2567 | Either make it bigger, or don't store any more in it. */ |
| 2560 | if (extend) | 2568 | if (extend) |
| 2561 | { | 2569 | { |
| 2570 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | ||
| 2571 | memory_full (SIZE_MAX); | ||
| 2562 | /* Make it work with an initial len == 0. */ | 2572 | /* Make it work with an initial len == 0. */ |
| 2563 | len *= 2; | 2573 | len = len * 2 + 4; |
| 2564 | if (len == 0) | ||
| 2565 | len = 4; | ||
| 2566 | *len_ptr = len; | 2574 | *len_ptr = len; |
| 2567 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | 2575 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); |
| 2568 | *vec_ptr = vec; | 2576 | *vec_ptr = vec; |
| @@ -2602,10 +2610,10 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, int *len_ptr, | |||
| 2602 | { | 2610 | { |
| 2603 | if (extend) | 2611 | if (extend) |
| 2604 | { | 2612 | { |
| 2613 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | ||
| 2614 | memory_full (SIZE_MAX); | ||
| 2605 | /* Make it work with an initial len == 0. */ | 2615 | /* Make it work with an initial len == 0. */ |
| 2606 | len *= 2; | 2616 | len = len * 2 + 4; |
| 2607 | if (len == 0) | ||
| 2608 | len = 4; | ||
| 2609 | *len_ptr = len; | 2617 | *len_ptr = len; |
| 2610 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | 2618 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); |
| 2611 | *vec_ptr = vec; | 2619 | *vec_ptr = vec; |
| @@ -2655,15 +2663,15 @@ overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, int *len_ptr, | |||
| 2655 | and we store only as many overlays as will fit. | 2663 | and we store only as many overlays as will fit. |
| 2656 | But we still return the total number of overlays. */ | 2664 | But we still return the total number of overlays. */ |
| 2657 | 2665 | ||
| 2658 | static int | 2666 | static ptrdiff_t |
| 2659 | overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | 2667 | overlays_in (EMACS_INT beg, EMACS_INT end, int extend, |
| 2660 | Lisp_Object **vec_ptr, int *len_ptr, | 2668 | Lisp_Object **vec_ptr, ptrdiff_t *len_ptr, |
| 2661 | EMACS_INT *next_ptr, EMACS_INT *prev_ptr) | 2669 | EMACS_INT *next_ptr, EMACS_INT *prev_ptr) |
| 2662 | { | 2670 | { |
| 2663 | Lisp_Object overlay, ostart, oend; | 2671 | Lisp_Object overlay, ostart, oend; |
| 2664 | struct Lisp_Overlay *tail; | 2672 | struct Lisp_Overlay *tail; |
| 2665 | int idx = 0; | 2673 | ptrdiff_t idx = 0; |
| 2666 | int len = *len_ptr; | 2674 | ptrdiff_t len = *len_ptr; |
| 2667 | Lisp_Object *vec = *vec_ptr; | 2675 | Lisp_Object *vec = *vec_ptr; |
| 2668 | EMACS_INT next = ZV; | 2676 | EMACS_INT next = ZV; |
| 2669 | EMACS_INT prev = BEGV; | 2677 | EMACS_INT prev = BEGV; |
| @@ -2699,10 +2707,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2699 | Either make it bigger, or don't store any more in it. */ | 2707 | Either make it bigger, or don't store any more in it. */ |
| 2700 | if (extend) | 2708 | if (extend) |
| 2701 | { | 2709 | { |
| 2710 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | ||
| 2711 | memory_full (SIZE_MAX); | ||
| 2702 | /* Make it work with an initial len == 0. */ | 2712 | /* Make it work with an initial len == 0. */ |
| 2703 | len *= 2; | 2713 | len = len * 2 + 4; |
| 2704 | if (len == 0) | ||
| 2705 | len = 4; | ||
| 2706 | *len_ptr = len; | 2714 | *len_ptr = len; |
| 2707 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | 2715 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); |
| 2708 | *vec_ptr = vec; | 2716 | *vec_ptr = vec; |
| @@ -2747,10 +2755,10 @@ overlays_in (EMACS_INT beg, EMACS_INT end, int extend, | |||
| 2747 | { | 2755 | { |
| 2748 | if (extend) | 2756 | if (extend) |
| 2749 | { | 2757 | { |
| 2758 | if ((OVERLAY_COUNT_MAX - 4) / 2 < len) | ||
| 2759 | memory_full (SIZE_MAX); | ||
| 2750 | /* Make it work with an initial len == 0. */ | 2760 | /* Make it work with an initial len == 0. */ |
| 2751 | len *= 2; | 2761 | len = len * 2 + 4; |
| 2752 | if (len == 0) | ||
| 2753 | len = 4; | ||
| 2754 | *len_ptr = len; | 2762 | *len_ptr = len; |
| 2755 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); | 2763 | vec = (Lisp_Object *) xrealloc (vec, len * sizeof (Lisp_Object)); |
| 2756 | *vec_ptr = vec; | 2764 | *vec_ptr = vec; |
| @@ -2783,7 +2791,7 @@ mouse_face_overlay_overlaps (Lisp_Object overlay) | |||
| 2783 | { | 2791 | { |
| 2784 | EMACS_INT start = OVERLAY_POSITION (OVERLAY_START (overlay)); | 2792 | EMACS_INT start = OVERLAY_POSITION (OVERLAY_START (overlay)); |
| 2785 | EMACS_INT end = OVERLAY_POSITION (OVERLAY_END (overlay)); | 2793 | EMACS_INT end = OVERLAY_POSITION (OVERLAY_END (overlay)); |
| 2786 | int n, i, size; | 2794 | ptrdiff_t n, i, size; |
| 2787 | Lisp_Object *v, tem; | 2795 | Lisp_Object *v, tem; |
| 2788 | 2796 | ||
| 2789 | size = 10; | 2797 | size = 10; |
| @@ -2849,7 +2857,7 @@ struct sortvec | |||
| 2849 | { | 2857 | { |
| 2850 | Lisp_Object overlay; | 2858 | Lisp_Object overlay; |
| 2851 | EMACS_INT beg, end; | 2859 | EMACS_INT beg, end; |
| 2852 | int priority; | 2860 | EMACS_INT priority; |
| 2853 | }; | 2861 | }; |
| 2854 | 2862 | ||
| 2855 | static int | 2863 | static int |
| @@ -2858,21 +2866,21 @@ compare_overlays (const void *v1, const void *v2) | |||
| 2858 | const struct sortvec *s1 = (const struct sortvec *) v1; | 2866 | const struct sortvec *s1 = (const struct sortvec *) v1; |
| 2859 | const struct sortvec *s2 = (const struct sortvec *) v2; | 2867 | const struct sortvec *s2 = (const struct sortvec *) v2; |
| 2860 | if (s1->priority != s2->priority) | 2868 | if (s1->priority != s2->priority) |
| 2861 | return s1->priority - s2->priority; | 2869 | return s1->priority < s2->priority ? -1 : 1; |
| 2862 | if (s1->beg != s2->beg) | 2870 | if (s1->beg != s2->beg) |
| 2863 | return s1->beg - s2->beg; | 2871 | return s1->beg < s2->beg ? -1 : 1; |
| 2864 | if (s1->end != s2->end) | 2872 | if (s1->end != s2->end) |
| 2865 | return s2->end - s1->end; | 2873 | return s2->end < s1->end ? -1 : 1; |
| 2866 | return 0; | 2874 | return 0; |
| 2867 | } | 2875 | } |
| 2868 | 2876 | ||
| 2869 | /* Sort an array of overlays by priority. The array is modified in place. | 2877 | /* Sort an array of overlays by priority. The array is modified in place. |
| 2870 | The return value is the new size; this may be smaller than the original | 2878 | The return value is the new size; this may be smaller than the original |
| 2871 | size if some of the overlays were invalid or were window-specific. */ | 2879 | size if some of the overlays were invalid or were window-specific. */ |
| 2872 | int | 2880 | ptrdiff_t |
| 2873 | sort_overlays (Lisp_Object *overlay_vec, int noverlays, struct window *w) | 2881 | sort_overlays (Lisp_Object *overlay_vec, ptrdiff_t noverlays, struct window *w) |
| 2874 | { | 2882 | { |
| 2875 | int i, j; | 2883 | ptrdiff_t i, j; |
| 2876 | struct sortvec *sortvec; | 2884 | struct sortvec *sortvec; |
| 2877 | sortvec = (struct sortvec *) alloca (noverlays * sizeof (struct sortvec)); | 2885 | sortvec = (struct sortvec *) alloca (noverlays * sizeof (struct sortvec)); |
| 2878 | 2886 | ||
| @@ -2926,15 +2934,15 @@ sort_overlays (Lisp_Object *overlay_vec, int noverlays, struct window *w) | |||
| 2926 | struct sortstr | 2934 | struct sortstr |
| 2927 | { | 2935 | { |
| 2928 | Lisp_Object string, string2; | 2936 | Lisp_Object string, string2; |
| 2929 | int size; | 2937 | ptrdiff_t size; |
| 2930 | int priority; | 2938 | EMACS_INT priority; |
| 2931 | }; | 2939 | }; |
| 2932 | 2940 | ||
| 2933 | struct sortstrlist | 2941 | struct sortstrlist |
| 2934 | { | 2942 | { |
| 2935 | struct sortstr *buf; /* An array that expands as needed; never freed. */ | 2943 | struct sortstr *buf; /* An array that expands as needed; never freed. */ |
| 2936 | int size; /* Allocated length of that array. */ | 2944 | ptrdiff_t size; /* Allocated length of that array. */ |
| 2937 | int used; /* How much of the array is currently in use. */ | 2945 | ptrdiff_t used; /* How much of the array is currently in use. */ |
| 2938 | EMACS_INT bytes; /* Total length of the strings in buf. */ | 2946 | EMACS_INT bytes; /* Total length of the strings in buf. */ |
| 2939 | }; | 2947 | }; |
| 2940 | 2948 | ||
| @@ -2955,20 +2963,24 @@ cmp_for_strings (const void *as1, const void *as2) | |||
| 2955 | struct sortstr *s1 = (struct sortstr *)as1; | 2963 | struct sortstr *s1 = (struct sortstr *)as1; |
| 2956 | struct sortstr *s2 = (struct sortstr *)as2; | 2964 | struct sortstr *s2 = (struct sortstr *)as2; |
| 2957 | if (s1->size != s2->size) | 2965 | if (s1->size != s2->size) |
| 2958 | return s2->size - s1->size; | 2966 | return s2->size < s1->size ? -1 : 1; |
| 2959 | if (s1->priority != s2->priority) | 2967 | if (s1->priority != s2->priority) |
| 2960 | return s1->priority - s2->priority; | 2968 | return s1->priority < s2->priority ? -1 : 1; |
| 2961 | return 0; | 2969 | return 0; |
| 2962 | } | 2970 | } |
| 2963 | 2971 | ||
| 2964 | static void | 2972 | static void |
| 2965 | record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, Lisp_Object str2, Lisp_Object pri, int size) | 2973 | record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, |
| 2974 | Lisp_Object str2, Lisp_Object pri, ptrdiff_t size) | ||
| 2966 | { | 2975 | { |
| 2967 | EMACS_INT nbytes; | 2976 | EMACS_INT nbytes; |
| 2968 | 2977 | ||
| 2969 | if (ssl->used == ssl->size) | 2978 | if (ssl->used == ssl->size) |
| 2970 | { | 2979 | { |
| 2971 | if (ssl->buf) | 2980 | if (min (PTRDIFF_MAX, SIZE_MAX) / (sizeof (struct sortstr) * 2) |
| 2981 | < ssl->size) | ||
| 2982 | memory_full (SIZE_MAX); | ||
| 2983 | else if (0 < ssl->size) | ||
| 2972 | ssl->size *= 2; | 2984 | ssl->size *= 2; |
| 2973 | else | 2985 | else |
| 2974 | ssl->size = 5; | 2986 | ssl->size = 5; |
| @@ -3874,9 +3886,8 @@ DEFUN ("overlays-at", Foverlays_at, Soverlays_at, 1, 1, 0, | |||
| 3874 | doc: /* Return a list of the overlays that contain the character at POS. */) | 3886 | doc: /* Return a list of the overlays that contain the character at POS. */) |
| 3875 | (Lisp_Object pos) | 3887 | (Lisp_Object pos) |
| 3876 | { | 3888 | { |
| 3877 | int noverlays; | 3889 | ptrdiff_t len, noverlays; |
| 3878 | Lisp_Object *overlay_vec; | 3890 | Lisp_Object *overlay_vec; |
| 3879 | int len; | ||
| 3880 | Lisp_Object result; | 3891 | Lisp_Object result; |
| 3881 | 3892 | ||
| 3882 | CHECK_NUMBER_COERCE_MARKER (pos); | 3893 | CHECK_NUMBER_COERCE_MARKER (pos); |
| @@ -3906,9 +3917,8 @@ between BEG and END, or at END provided END denotes the position at the | |||
| 3906 | end of the buffer. */) | 3917 | end of the buffer. */) |
| 3907 | (Lisp_Object beg, Lisp_Object end) | 3918 | (Lisp_Object beg, Lisp_Object end) |
| 3908 | { | 3919 | { |
| 3909 | int noverlays; | 3920 | ptrdiff_t len, noverlays; |
| 3910 | Lisp_Object *overlay_vec; | 3921 | Lisp_Object *overlay_vec; |
| 3911 | int len; | ||
| 3912 | Lisp_Object result; | 3922 | Lisp_Object result; |
| 3913 | 3923 | ||
| 3914 | CHECK_NUMBER_COERCE_MARKER (beg); | 3924 | CHECK_NUMBER_COERCE_MARKER (beg); |
| @@ -3936,11 +3946,9 @@ If there are no overlay boundaries from POS to (point-max), | |||
| 3936 | the value is (point-max). */) | 3946 | the value is (point-max). */) |
| 3937 | (Lisp_Object pos) | 3947 | (Lisp_Object pos) |
| 3938 | { | 3948 | { |
| 3939 | int noverlays; | 3949 | ptrdiff_t i, len, noverlays; |
| 3940 | EMACS_INT endpos; | 3950 | EMACS_INT endpos; |
| 3941 | Lisp_Object *overlay_vec; | 3951 | Lisp_Object *overlay_vec; |
| 3942 | int len; | ||
| 3943 | int i; | ||
| 3944 | 3952 | ||
| 3945 | CHECK_NUMBER_COERCE_MARKER (pos); | 3953 | CHECK_NUMBER_COERCE_MARKER (pos); |
| 3946 | 3954 | ||
| @@ -3979,7 +3987,7 @@ the value is (point-min). */) | |||
| 3979 | { | 3987 | { |
| 3980 | EMACS_INT prevpos; | 3988 | EMACS_INT prevpos; |
| 3981 | Lisp_Object *overlay_vec; | 3989 | Lisp_Object *overlay_vec; |
| 3982 | int len; | 3990 | ptrdiff_t len; |
| 3983 | 3991 | ||
| 3984 | CHECK_NUMBER_COERCE_MARKER (pos); | 3992 | CHECK_NUMBER_COERCE_MARKER (pos); |
| 3985 | 3993 | ||
| @@ -4971,7 +4979,7 @@ init_buffer_once (void) | |||
| 4971 | The local flag bits are in the local_var_flags slot of the buffer. */ | 4979 | The local flag bits are in the local_var_flags slot of the buffer. */ |
| 4972 | 4980 | ||
| 4973 | /* Nothing can work if this isn't true */ | 4981 | /* Nothing can work if this isn't true */ |
| 4974 | if (sizeof (EMACS_INT) != sizeof (Lisp_Object)) abort (); | 4982 | { verify (sizeof (EMACS_INT) == sizeof (Lisp_Object)); } |
| 4975 | 4983 | ||
| 4976 | /* 0 means not a lisp var, -1 means always local, else mask */ | 4984 | /* 0 means not a lisp var, -1 means always local, else mask */ |
| 4977 | memset (&buffer_local_flags, 0, sizeof buffer_local_flags); | 4985 | memset (&buffer_local_flags, 0, sizeof buffer_local_flags); |
| @@ -5077,7 +5085,7 @@ init_buffer (void) | |||
| 5077 | { | 5085 | { |
| 5078 | char *pwd; | 5086 | char *pwd; |
| 5079 | Lisp_Object temp; | 5087 | Lisp_Object temp; |
| 5080 | int len; | 5088 | ptrdiff_t len; |
| 5081 | 5089 | ||
| 5082 | #ifdef USE_MMAP_FOR_BUFFERS | 5090 | #ifdef USE_MMAP_FOR_BUFFERS |
| 5083 | { | 5091 | { |