diff options
Diffstat (limited to 'src/scroll.c')
| -rw-r--r-- | src/scroll.c | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/scroll.c b/src/scroll.c index 6c559663f80..7cb683c4577 100644 --- a/src/scroll.c +++ b/src/scroll.c | |||
| @@ -245,18 +245,20 @@ do_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 245 | { | 245 | { |
| 246 | struct matrix_elt *p; | 246 | struct matrix_elt *p; |
| 247 | int i, j, k; | 247 | int i, j, k; |
| 248 | USE_SAFE_ALLOCA; | ||
| 248 | 249 | ||
| 249 | /* True if we have set a terminal window with set_terminal_window. */ | 250 | /* True if we have set a terminal window with set_terminal_window. */ |
| 250 | bool terminal_window_p = 0; | 251 | bool terminal_window_p = 0; |
| 251 | 252 | ||
| 252 | /* A queue for line insertions to be done. */ | 253 | /* A queue for line insertions to be done. */ |
| 253 | struct queue { int count, pos; }; | 254 | struct queue { int count, pos; }; |
| 254 | struct queue *queue_start | 255 | struct queue *queue_start; |
| 255 | = alloca (current_matrix->nrows * sizeof *queue_start); | 256 | SAFE_NALLOCA (queue_start, 1, current_matrix->nrows); |
| 256 | struct queue *queue = queue_start; | 257 | struct queue *queue = queue_start; |
| 257 | 258 | ||
| 258 | char *retained_p = alloca (window_size * sizeof *retained_p); | 259 | char *retained_p = SAFE_ALLOCA (window_size); |
| 259 | int *copy_from = alloca (window_size * sizeof *copy_from); | 260 | int *copy_from; |
| 261 | SAFE_NALLOCA (copy_from, 1, window_size); | ||
| 260 | 262 | ||
| 261 | /* Zero means line is empty. */ | 263 | /* Zero means line is empty. */ |
| 262 | memset (retained_p, 0, window_size * sizeof (char)); | 264 | memset (retained_p, 0, window_size * sizeof (char)); |
| @@ -378,6 +380,7 @@ do_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 378 | 380 | ||
| 379 | if (terminal_window_p) | 381 | if (terminal_window_p) |
| 380 | set_terminal_window (frame, 0); | 382 | set_terminal_window (frame, 0); |
| 383 | SAFE_FREE (); | ||
| 381 | } | 384 | } |
| 382 | 385 | ||
| 383 | 386 | ||
| @@ -649,10 +652,12 @@ do_direct_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 649 | { | 652 | { |
| 650 | struct matrix_elt *p; | 653 | struct matrix_elt *p; |
| 651 | int i, j; | 654 | int i, j; |
| 655 | USE_SAFE_ALLOCA; | ||
| 652 | 656 | ||
| 653 | /* A queue of deletions and insertions to be performed. */ | 657 | /* A queue of deletions and insertions to be performed. */ |
| 654 | struct alt_queue { int count, pos, window; }; | 658 | struct alt_queue { int count, pos, window; }; |
| 655 | struct alt_queue *queue_start = alloca (window_size * sizeof *queue_start); | 659 | struct alt_queue *queue_start; |
| 660 | SAFE_NALLOCA (queue_start, 1, window_size); | ||
| 656 | struct alt_queue *queue = queue_start; | 661 | struct alt_queue *queue = queue_start; |
| 657 | 662 | ||
| 658 | /* True if a terminal window has been set with set_terminal_window. */ | 663 | /* True if a terminal window has been set with set_terminal_window. */ |
| @@ -667,11 +672,12 @@ do_direct_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 667 | bool write_follows_p = 1; | 672 | bool write_follows_p = 1; |
| 668 | 673 | ||
| 669 | /* For each row in the new matrix what row of the old matrix it is. */ | 674 | /* For each row in the new matrix what row of the old matrix it is. */ |
| 670 | int *copy_from = alloca (window_size * sizeof *copy_from); | 675 | int *copy_from; |
| 676 | SAFE_NALLOCA (copy_from, 1, window_size); | ||
| 671 | 677 | ||
| 672 | /* Non-zero for each row in the new matrix that is retained from the | 678 | /* Non-zero for each row in the new matrix that is retained from the |
| 673 | old matrix. Lines not retained are empty. */ | 679 | old matrix. Lines not retained are empty. */ |
| 674 | char *retained_p = alloca (window_size * sizeof *retained_p); | 680 | char *retained_p = SAFE_ALLOCA (window_size); |
| 675 | 681 | ||
| 676 | memset (retained_p, 0, window_size * sizeof (char)); | 682 | memset (retained_p, 0, window_size * sizeof (char)); |
| 677 | 683 | ||
| @@ -787,6 +793,7 @@ do_direct_scrolling (struct frame *frame, struct glyph_matrix *current_matrix, | |||
| 787 | 793 | ||
| 788 | if (terminal_window_p) | 794 | if (terminal_window_p) |
| 789 | set_terminal_window (frame, 0); | 795 | set_terminal_window (frame, 0); |
| 796 | SAFE_FREE (); | ||
| 790 | } | 797 | } |
| 791 | 798 | ||
| 792 | 799 | ||
| @@ -796,8 +803,9 @@ scrolling_1 (struct frame *frame, int window_size, int unchanged_at_top, | |||
| 796 | int unchanged_at_bottom, int *draw_cost, int *old_draw_cost, | 803 | int unchanged_at_bottom, int *draw_cost, int *old_draw_cost, |
| 797 | unsigned *old_hash, unsigned *new_hash, int free_at_end) | 804 | unsigned *old_hash, unsigned *new_hash, int free_at_end) |
| 798 | { | 805 | { |
| 799 | struct matrix_elt *matrix | 806 | USE_SAFE_ALLOCA; |
| 800 | = alloca ((window_size + 1) * (window_size + 1) * sizeof *matrix); | 807 | struct matrix_elt *matrix; |
| 808 | SAFE_NALLOCA (matrix, window_size + 1, window_size + 1); | ||
| 801 | 809 | ||
| 802 | if (FRAME_SCROLL_REGION_OK (frame)) | 810 | if (FRAME_SCROLL_REGION_OK (frame)) |
| 803 | { | 811 | { |
| @@ -817,6 +825,8 @@ scrolling_1 (struct frame *frame, int window_size, int unchanged_at_top, | |||
| 817 | frame->current_matrix, matrix, window_size, | 825 | frame->current_matrix, matrix, window_size, |
| 818 | unchanged_at_top); | 826 | unchanged_at_top); |
| 819 | } | 827 | } |
| 828 | |||
| 829 | SAFE_FREE (); | ||
| 820 | } | 830 | } |
| 821 | 831 | ||
| 822 | 832 | ||