diff options
| author | Yuan Fu | 2022-11-21 12:54:35 -0800 |
|---|---|---|
| committer | Yuan Fu | 2022-11-21 12:54:35 -0800 |
| commit | aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c (patch) | |
| tree | 67765b95359bfc462e95606043e6b0cea3bb7c49 /src/buffer.h | |
| parent | b2ea38ab03e801859163b74a292aa75008e36541 (diff) | |
| parent | f176a36f4629b56c9fd9e3fc15aebd04a168c4f5 (diff) | |
| download | emacs-aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c.tar.gz emacs-aaeaa310f0391f5a5193e1a3d6e026986c4f2c0c.zip | |
Merge remote-tracking branch 'savannah/master' into feature/tree-sitter
Diffstat (limited to 'src/buffer.h')
| -rw-r--r-- | src/buffer.h | 111 |
1 files changed, 80 insertions, 31 deletions
diff --git a/src/buffer.h b/src/buffer.h index 04792374cd1..dded0cd98c1 100644 --- a/src/buffer.h +++ b/src/buffer.h | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* Header file for the buffer manipulation primitives. | 1 | /* Header file for the buffer manipulation primitives. |
| 2 | 2 | ||
| 3 | Copyright (C) 1985-1986, 1993-1995, 1997-2022 Free Software Foundation, | 3 | Copyright (C) 1985-2022 Free Software Foundation, Inc. |
| 4 | Inc. | ||
| 5 | 4 | ||
| 6 | This file is part of GNU Emacs. | 5 | This file is part of GNU Emacs. |
| 7 | 6 | ||
| @@ -26,6 +25,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */ | |||
| 26 | 25 | ||
| 27 | #include "character.h" | 26 | #include "character.h" |
| 28 | #include "lisp.h" | 27 | #include "lisp.h" |
| 28 | #include "itree.h" | ||
| 29 | 29 | ||
| 30 | INLINE_HEADER_BEGIN | 30 | INLINE_HEADER_BEGIN |
| 31 | 31 | ||
| @@ -701,16 +701,8 @@ struct buffer | |||
| 701 | display optimizations must be used. */ | 701 | display optimizations must be used. */ |
| 702 | bool_bf long_line_optimizations_p : 1; | 702 | bool_bf long_line_optimizations_p : 1; |
| 703 | 703 | ||
| 704 | /* List of overlays that end at or before the current center, | 704 | /* The inveral tree containing this buffer's overlays. */ |
| 705 | in order of end-position. */ | 705 | struct itree_tree *overlays; |
| 706 | struct Lisp_Overlay *overlays_before; | ||
| 707 | |||
| 708 | /* List of overlays that end after the current center, | ||
| 709 | in order of start-position. */ | ||
| 710 | struct Lisp_Overlay *overlays_after; | ||
| 711 | |||
| 712 | /* Position where the overlay lists are centered. */ | ||
| 713 | ptrdiff_t overlay_center; | ||
| 714 | 706 | ||
| 715 | /* Changes in the buffer are recorded here for undo, and t means | 707 | /* Changes in the buffer are recorded here for undo, and t means |
| 716 | don't record anything. This information belongs to the base | 708 | don't record anything. This information belongs to the base |
| @@ -720,6 +712,14 @@ struct buffer | |||
| 720 | Lisp_Object undo_list_; | 712 | Lisp_Object undo_list_; |
| 721 | }; | 713 | }; |
| 722 | 714 | ||
| 715 | struct sortvec | ||
| 716 | { | ||
| 717 | Lisp_Object overlay; | ||
| 718 | ptrdiff_t beg, end; | ||
| 719 | EMACS_INT priority; | ||
| 720 | EMACS_INT spriority; /* Secondary priority. */ | ||
| 721 | }; | ||
| 722 | |||
| 723 | INLINE bool | 723 | INLINE bool |
| 724 | BUFFERP (Lisp_Object a) | 724 | BUFFERP (Lisp_Object a) |
| 725 | { | 725 | { |
| @@ -1174,9 +1174,11 @@ extern EMACS_INT fix_position (Lisp_Object); | |||
| 1174 | extern void delete_all_overlays (struct buffer *); | 1174 | extern void delete_all_overlays (struct buffer *); |
| 1175 | extern void reset_buffer (struct buffer *); | 1175 | extern void reset_buffer (struct buffer *); |
| 1176 | extern void compact_buffer (struct buffer *); | 1176 | extern void compact_buffer (struct buffer *); |
| 1177 | extern void evaporate_overlays (ptrdiff_t); | 1177 | extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *); |
| 1178 | extern ptrdiff_t overlays_at (EMACS_INT, bool, Lisp_Object **, | 1178 | extern ptrdiff_t overlays_in (ptrdiff_t, ptrdiff_t, bool, Lisp_Object **, |
| 1179 | ptrdiff_t *, ptrdiff_t *, ptrdiff_t *, bool); | 1179 | ptrdiff_t *, bool, bool, ptrdiff_t *); |
| 1180 | extern ptrdiff_t previous_overlay_change (ptrdiff_t); | ||
| 1181 | extern ptrdiff_t next_overlay_change (ptrdiff_t); | ||
| 1180 | extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); | 1182 | extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); |
| 1181 | extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); | 1183 | extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); |
| 1182 | extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); | 1184 | extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); |
| @@ -1190,6 +1192,7 @@ extern void fix_overlays_before (struct buffer *, ptrdiff_t, ptrdiff_t); | |||
| 1190 | extern void mmap_set_vars (bool); | 1192 | extern void mmap_set_vars (bool); |
| 1191 | extern void restore_buffer (Lisp_Object); | 1193 | extern void restore_buffer (Lisp_Object); |
| 1192 | extern void set_buffer_if_live (Lisp_Object); | 1194 | extern void set_buffer_if_live (Lisp_Object); |
| 1195 | extern Lisp_Object build_overlay (bool, bool, Lisp_Object); | ||
| 1193 | 1196 | ||
| 1194 | /* Return B as a struct buffer pointer, defaulting to the current buffer. */ | 1197 | /* Return B as a struct buffer pointer, defaulting to the current buffer. */ |
| 1195 | 1198 | ||
| @@ -1230,18 +1233,16 @@ record_unwind_current_buffer (void) | |||
| 1230 | This macro might evaluate its args multiple times, | 1233 | This macro might evaluate its args multiple times, |
| 1231 | and it treat some args as lvalues. */ | 1234 | and it treat some args as lvalues. */ |
| 1232 | 1235 | ||
| 1233 | #define GET_OVERLAYS_AT(posn, overlays, noverlays, nextp, chrq) \ | 1236 | #define GET_OVERLAYS_AT(posn, overlays, noverlays, next) \ |
| 1234 | do { \ | 1237 | do { \ |
| 1235 | ptrdiff_t maxlen = 40; \ | 1238 | ptrdiff_t maxlen = 40; \ |
| 1236 | SAFE_NALLOCA (overlays, 1, maxlen); \ | 1239 | SAFE_NALLOCA (overlays, 1, maxlen); \ |
| 1237 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \ | 1240 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, next); \ |
| 1238 | nextp, NULL, chrq); \ | ||
| 1239 | if ((noverlays) > maxlen) \ | 1241 | if ((noverlays) > maxlen) \ |
| 1240 | { \ | 1242 | { \ |
| 1241 | maxlen = noverlays; \ | 1243 | maxlen = noverlays; \ |
| 1242 | SAFE_NALLOCA (overlays, 1, maxlen); \ | 1244 | SAFE_NALLOCA (overlays, 1, maxlen); \ |
| 1243 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \ | 1245 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, next); \ |
| 1244 | nextp, NULL, chrq); \ | ||
| 1245 | } \ | 1246 | } \ |
| 1246 | } while (false) | 1247 | } while (false) |
| 1247 | 1248 | ||
| @@ -1276,7 +1277,8 @@ set_buffer_intervals (struct buffer *b, INTERVAL i) | |||
| 1276 | INLINE bool | 1277 | INLINE bool |
| 1277 | buffer_has_overlays (void) | 1278 | buffer_has_overlays (void) |
| 1278 | { | 1279 | { |
| 1279 | return current_buffer->overlays_before || current_buffer->overlays_after; | 1280 | return current_buffer->overlays |
| 1281 | && (current_buffer->overlays->root != NULL); | ||
| 1280 | } | 1282 | } |
| 1281 | 1283 | ||
| 1282 | /* Functions for accessing a character or byte, | 1284 | /* Functions for accessing a character or byte, |
| @@ -1394,25 +1396,69 @@ buffer_window_count (struct buffer *b) | |||
| 1394 | 1396 | ||
| 1395 | /* Overlays */ | 1397 | /* Overlays */ |
| 1396 | 1398 | ||
| 1397 | /* Return the marker that stands for where OV starts in the buffer. */ | 1399 | INLINE ptrdiff_t |
| 1400 | overlay_start (struct Lisp_Overlay *ov) | ||
| 1401 | { | ||
| 1402 | if (! ov->buffer) | ||
| 1403 | return -1; | ||
| 1404 | return itree_node_begin (ov->buffer->overlays, ov->interval); | ||
| 1405 | } | ||
| 1406 | |||
| 1407 | INLINE ptrdiff_t | ||
| 1408 | overlay_end (struct Lisp_Overlay *ov) | ||
| 1409 | { | ||
| 1410 | if (! ov->buffer) | ||
| 1411 | return -1; | ||
| 1412 | return itree_node_end (ov->buffer->overlays, ov->interval); | ||
| 1413 | } | ||
| 1398 | 1414 | ||
| 1399 | #define OVERLAY_START(OV) XOVERLAY (OV)->start | 1415 | /* Return the start of OV in its buffer, or -1 if OV is not associated |
| 1416 | with any buffer. */ | ||
| 1400 | 1417 | ||
| 1401 | /* Return the marker that stands for where OV ends in the buffer. */ | 1418 | INLINE ptrdiff_t |
| 1419 | OVERLAY_START (Lisp_Object ov) | ||
| 1420 | { | ||
| 1421 | return overlay_start (XOVERLAY (ov)); | ||
| 1422 | } | ||
| 1402 | 1423 | ||
| 1403 | #define OVERLAY_END(OV) XOVERLAY (OV)->end | 1424 | /* Return the end of OV in its buffer, or -1. */ |
| 1425 | |||
| 1426 | INLINE ptrdiff_t | ||
| 1427 | OVERLAY_END (Lisp_Object ov) | ||
| 1428 | { | ||
| 1429 | return overlay_end (XOVERLAY (ov)); | ||
| 1430 | } | ||
| 1404 | 1431 | ||
| 1405 | /* Return the plist of overlay OV. */ | 1432 | /* Return the plist of overlay OV. */ |
| 1406 | 1433 | ||
| 1407 | #define OVERLAY_PLIST(OV) XOVERLAY (OV)->plist | 1434 | INLINE Lisp_Object |
| 1435 | OVERLAY_PLIST (Lisp_Object ov) | ||
| 1436 | { | ||
| 1437 | return XOVERLAY (ov)->plist; | ||
| 1438 | } | ||
| 1408 | 1439 | ||
| 1409 | /* Return the actual buffer position for the marker P. | 1440 | /* Return the buffer of overlay OV. */ |
| 1410 | We assume you know which buffer it's pointing into. */ | ||
| 1411 | 1441 | ||
| 1412 | INLINE ptrdiff_t | 1442 | INLINE struct buffer * |
| 1413 | OVERLAY_POSITION (Lisp_Object p) | 1443 | OVERLAY_BUFFER (Lisp_Object ov) |
| 1414 | { | 1444 | { |
| 1415 | return marker_position (p); | 1445 | return XOVERLAY (ov)->buffer; |
| 1446 | } | ||
| 1447 | |||
| 1448 | /* Return true, if OV's rear-advance is set. */ | ||
| 1449 | |||
| 1450 | INLINE bool | ||
| 1451 | OVERLAY_REAR_ADVANCE_P (Lisp_Object ov) | ||
| 1452 | { | ||
| 1453 | return XOVERLAY (ov)->interval->rear_advance; | ||
| 1454 | } | ||
| 1455 | |||
| 1456 | /* Return true, if OV's front-advance is set. */ | ||
| 1457 | |||
| 1458 | INLINE bool | ||
| 1459 | OVERLAY_FRONT_ADVANCE_P (Lisp_Object ov) | ||
| 1460 | { | ||
| 1461 | return XOVERLAY (ov)->interval->front_advance; | ||
| 1416 | } | 1462 | } |
| 1417 | 1463 | ||
| 1418 | 1464 | ||
| @@ -1696,4 +1742,7 @@ dec_both (ptrdiff_t *charpos, ptrdiff_t *bytepos) | |||
| 1696 | 1742 | ||
| 1697 | INLINE_HEADER_END | 1743 | INLINE_HEADER_END |
| 1698 | 1744 | ||
| 1745 | int compare_overlays (const void *v1, const void *v2); | ||
| 1746 | void make_sortvec_item (struct sortvec *item, Lisp_Object overlay); | ||
| 1747 | |||
| 1699 | #endif /* EMACS_BUFFER_H */ | 1748 | #endif /* EMACS_BUFFER_H */ |