aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.c')
-rw-r--r--src/buffer.c100
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. */
97static char buffer_permanent_local_flags[MAX_PER_BUFFER_VARS]; 104static 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
2519int 2526ptrdiff_t
2520overlays_at (EMACS_INT pos, int extend, Lisp_Object **vec_ptr, int *len_ptr, 2527overlays_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
2658static int 2666static ptrdiff_t
2659overlays_in (EMACS_INT beg, EMACS_INT end, int extend, 2667overlays_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
2855static int 2863static 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. */
2872int 2880ptrdiff_t
2873sort_overlays (Lisp_Object *overlay_vec, int noverlays, struct window *w) 2881sort_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)
2926struct sortstr 2934struct 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
2933struct sortstrlist 2941struct 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
2964static void 2972static void
2965record_overlay_string (struct sortstrlist *ssl, Lisp_Object str, Lisp_Object str2, Lisp_Object pri, int size) 2973record_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
3906end of the buffer. */) 3917end 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),
3936the value is (point-max). */) 3946the 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 {