diff options
| author | Stefan Monnier | 2022-10-28 17:44:44 -0400 |
|---|---|---|
| committer | Stefan Monnier | 2022-10-28 17:44:44 -0400 |
| commit | 71589b101ccbec67fa2741856ee0add5752dea72 (patch) | |
| tree | 63aeb9f5617c3e7e9b87c04f10bfa938f495736c /src/buffer.h | |
| parent | 69121c33e4a11805bf6438131c8aec72411a0e5d (diff) | |
| parent | 9d7ba2b1998afc3664c37d9d1b6f6ca2d68356e9 (diff) | |
| download | emacs-71589b101ccbec67fa2741856ee0add5752dea72.tar.gz emacs-71589b101ccbec67fa2741856ee0add5752dea72.zip | |
Merge remote-tracking branch 'origin/feature/noverlay'
Diffstat (limited to 'src/buffer.h')
| -rw-r--r-- | src/buffer.h | 110 |
1 files changed, 80 insertions, 30 deletions
diff --git a/src/buffer.h b/src/buffer.h index cbdbae798ba..3ea4125645d 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 | ||
| @@ -697,16 +697,8 @@ struct buffer | |||
| 697 | display optimizations must be used. */ | 697 | display optimizations must be used. */ |
| 698 | bool_bf long_line_optimizations_p : 1; | 698 | bool_bf long_line_optimizations_p : 1; |
| 699 | 699 | ||
| 700 | /* List of overlays that end at or before the current center, | 700 | /* The inveral tree containing this buffer's overlays. */ |
| 701 | in order of end-position. */ | 701 | struct itree_tree *overlays; |
| 702 | struct Lisp_Overlay *overlays_before; | ||
| 703 | |||
| 704 | /* List of overlays that end after the current center, | ||
| 705 | in order of start-position. */ | ||
| 706 | struct Lisp_Overlay *overlays_after; | ||
| 707 | |||
| 708 | /* Position where the overlay lists are centered. */ | ||
| 709 | ptrdiff_t overlay_center; | ||
| 710 | 702 | ||
| 711 | /* Changes in the buffer are recorded here for undo, and t means | 703 | /* Changes in the buffer are recorded here for undo, and t means |
| 712 | don't record anything. This information belongs to the base | 704 | don't record anything. This information belongs to the base |
| @@ -716,6 +708,14 @@ struct buffer | |||
| 716 | Lisp_Object undo_list_; | 708 | Lisp_Object undo_list_; |
| 717 | }; | 709 | }; |
| 718 | 710 | ||
| 711 | struct sortvec | ||
| 712 | { | ||
| 713 | Lisp_Object overlay; | ||
| 714 | ptrdiff_t beg, end; | ||
| 715 | EMACS_INT priority; | ||
| 716 | EMACS_INT spriority; /* Secondary priority. */ | ||
| 717 | }; | ||
| 718 | |||
| 719 | INLINE bool | 719 | INLINE bool |
| 720 | BUFFERP (Lisp_Object a) | 720 | BUFFERP (Lisp_Object a) |
| 721 | { | 721 | { |
| @@ -1171,8 +1171,11 @@ extern void delete_all_overlays (struct buffer *); | |||
| 1171 | extern void reset_buffer (struct buffer *); | 1171 | extern void reset_buffer (struct buffer *); |
| 1172 | extern void compact_buffer (struct buffer *); | 1172 | extern void compact_buffer (struct buffer *); |
| 1173 | extern void evaporate_overlays (ptrdiff_t); | 1173 | extern void evaporate_overlays (ptrdiff_t); |
| 1174 | extern ptrdiff_t overlays_at (EMACS_INT, bool, Lisp_Object **, | 1174 | extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *); |
| 1175 | ptrdiff_t *, ptrdiff_t *, ptrdiff_t *, bool); | 1175 | extern ptrdiff_t overlays_in (ptrdiff_t, ptrdiff_t, bool, Lisp_Object **, |
| 1176 | ptrdiff_t *, bool, bool, ptrdiff_t *); | ||
| 1177 | extern ptrdiff_t previous_overlay_change (ptrdiff_t); | ||
| 1178 | extern ptrdiff_t next_overlay_change (ptrdiff_t); | ||
| 1176 | extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); | 1179 | extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); |
| 1177 | extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); | 1180 | extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); |
| 1178 | extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); | 1181 | extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); |
| @@ -1186,6 +1189,7 @@ extern void fix_overlays_before (struct buffer *, ptrdiff_t, ptrdiff_t); | |||
| 1186 | extern void mmap_set_vars (bool); | 1189 | extern void mmap_set_vars (bool); |
| 1187 | extern void restore_buffer (Lisp_Object); | 1190 | extern void restore_buffer (Lisp_Object); |
| 1188 | extern void set_buffer_if_live (Lisp_Object); | 1191 | extern void set_buffer_if_live (Lisp_Object); |
| 1192 | extern Lisp_Object build_overlay (bool, bool, Lisp_Object); | ||
| 1189 | 1193 | ||
| 1190 | /* Return B as a struct buffer pointer, defaulting to the current buffer. */ | 1194 | /* Return B as a struct buffer pointer, defaulting to the current buffer. */ |
| 1191 | 1195 | ||
| @@ -1226,18 +1230,16 @@ record_unwind_current_buffer (void) | |||
| 1226 | This macro might evaluate its args multiple times, | 1230 | This macro might evaluate its args multiple times, |
| 1227 | and it treat some args as lvalues. */ | 1231 | and it treat some args as lvalues. */ |
| 1228 | 1232 | ||
| 1229 | #define GET_OVERLAYS_AT(posn, overlays, noverlays, nextp, chrq) \ | 1233 | #define GET_OVERLAYS_AT(posn, overlays, noverlays, next) \ |
| 1230 | do { \ | 1234 | do { \ |
| 1231 | ptrdiff_t maxlen = 40; \ | 1235 | ptrdiff_t maxlen = 40; \ |
| 1232 | SAFE_NALLOCA (overlays, 1, maxlen); \ | 1236 | SAFE_NALLOCA (overlays, 1, maxlen); \ |
| 1233 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \ | 1237 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, next); \ |
| 1234 | nextp, NULL, chrq); \ | ||
| 1235 | if ((noverlays) > maxlen) \ | 1238 | if ((noverlays) > maxlen) \ |
| 1236 | { \ | 1239 | { \ |
| 1237 | maxlen = noverlays; \ | 1240 | maxlen = noverlays; \ |
| 1238 | SAFE_NALLOCA (overlays, 1, maxlen); \ | 1241 | SAFE_NALLOCA (overlays, 1, maxlen); \ |
| 1239 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, \ | 1242 | (noverlays) = overlays_at (posn, false, &(overlays), &maxlen, next); \ |
| 1240 | nextp, NULL, chrq); \ | ||
| 1241 | } \ | 1243 | } \ |
| 1242 | } while (false) | 1244 | } while (false) |
| 1243 | 1245 | ||
| @@ -1272,7 +1274,8 @@ set_buffer_intervals (struct buffer *b, INTERVAL i) | |||
| 1272 | INLINE bool | 1274 | INLINE bool |
| 1273 | buffer_has_overlays (void) | 1275 | buffer_has_overlays (void) |
| 1274 | { | 1276 | { |
| 1275 | return current_buffer->overlays_before || current_buffer->overlays_after; | 1277 | return current_buffer->overlays |
| 1278 | && (current_buffer->overlays->root != NULL); | ||
| 1276 | } | 1279 | } |
| 1277 | 1280 | ||
| 1278 | /* Functions for accessing a character or byte, | 1281 | /* Functions for accessing a character or byte, |
| @@ -1390,25 +1393,69 @@ buffer_window_count (struct buffer *b) | |||
| 1390 | 1393 | ||
| 1391 | /* Overlays */ | 1394 | /* Overlays */ |
| 1392 | 1395 | ||
| 1393 | /* Return the marker that stands for where OV starts in the buffer. */ | 1396 | INLINE ptrdiff_t |
| 1397 | overlay_start (struct Lisp_Overlay *ov) | ||
| 1398 | { | ||
| 1399 | if (! ov->buffer) | ||
| 1400 | return -1; | ||
| 1401 | return itree_node_begin (ov->buffer->overlays, ov->interval); | ||
| 1402 | } | ||
| 1403 | |||
| 1404 | INLINE ptrdiff_t | ||
| 1405 | overlay_end (struct Lisp_Overlay *ov) | ||
| 1406 | { | ||
| 1407 | if (! ov->buffer) | ||
| 1408 | return -1; | ||
| 1409 | return itree_node_end (ov->buffer->overlays, ov->interval); | ||
| 1410 | } | ||
| 1394 | 1411 | ||
| 1395 | #define OVERLAY_START(OV) XOVERLAY (OV)->start | 1412 | /* Return the start of OV in its buffer, or -1 if OV is not associated |
| 1413 | with any buffer. */ | ||
| 1396 | 1414 | ||
| 1397 | /* Return the marker that stands for where OV ends in the buffer. */ | 1415 | INLINE ptrdiff_t |
| 1416 | OVERLAY_START (Lisp_Object ov) | ||
| 1417 | { | ||
| 1418 | return overlay_start (XOVERLAY (ov)); | ||
| 1419 | } | ||
| 1398 | 1420 | ||
| 1399 | #define OVERLAY_END(OV) XOVERLAY (OV)->end | 1421 | /* Return the end of OV in its buffer, or -1. */ |
| 1422 | |||
| 1423 | INLINE ptrdiff_t | ||
| 1424 | OVERLAY_END (Lisp_Object ov) | ||
| 1425 | { | ||
| 1426 | return overlay_end (XOVERLAY (ov)); | ||
| 1427 | } | ||
| 1400 | 1428 | ||
| 1401 | /* Return the plist of overlay OV. */ | 1429 | /* Return the plist of overlay OV. */ |
| 1402 | 1430 | ||
| 1403 | #define OVERLAY_PLIST(OV) XOVERLAY (OV)->plist | 1431 | INLINE Lisp_Object |
| 1432 | OVERLAY_PLIST (Lisp_Object ov) | ||
| 1433 | { | ||
| 1434 | return XOVERLAY (ov)->plist; | ||
| 1435 | } | ||
| 1404 | 1436 | ||
| 1405 | /* Return the actual buffer position for the marker P. | 1437 | /* Return the buffer of overlay OV. */ |
| 1406 | We assume you know which buffer it's pointing into. */ | ||
| 1407 | 1438 | ||
| 1408 | INLINE ptrdiff_t | 1439 | INLINE struct buffer * |
| 1409 | OVERLAY_POSITION (Lisp_Object p) | 1440 | OVERLAY_BUFFER (Lisp_Object ov) |
| 1410 | { | 1441 | { |
| 1411 | return marker_position (p); | 1442 | return XOVERLAY (ov)->buffer; |
| 1443 | } | ||
| 1444 | |||
| 1445 | /* Return true, if OV's rear-advance is set. */ | ||
| 1446 | |||
| 1447 | INLINE bool | ||
| 1448 | OVERLAY_REAR_ADVANCE_P (Lisp_Object ov) | ||
| 1449 | { | ||
| 1450 | return XOVERLAY (ov)->interval->rear_advance; | ||
| 1451 | } | ||
| 1452 | |||
| 1453 | /* Return true, if OV's front-advance is set. */ | ||
| 1454 | |||
| 1455 | INLINE bool | ||
| 1456 | OVERLAY_FRONT_ADVANCE_P (Lisp_Object ov) | ||
| 1457 | { | ||
| 1458 | return XOVERLAY (ov)->interval->front_advance; | ||
| 1412 | } | 1459 | } |
| 1413 | 1460 | ||
| 1414 | 1461 | ||
| @@ -1692,4 +1739,7 @@ dec_both (ptrdiff_t *charpos, ptrdiff_t *bytepos) | |||
| 1692 | 1739 | ||
| 1693 | INLINE_HEADER_END | 1740 | INLINE_HEADER_END |
| 1694 | 1741 | ||
| 1742 | int compare_overlays (const void *v1, const void *v2); | ||
| 1743 | void make_sortvec_item (struct sortvec *item, Lisp_Object overlay); | ||
| 1744 | |||
| 1695 | #endif /* EMACS_BUFFER_H */ | 1745 | #endif /* EMACS_BUFFER_H */ |