aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.h
diff options
context:
space:
mode:
authorStefan Monnier2022-10-28 17:44:44 -0400
committerStefan Monnier2022-10-28 17:44:44 -0400
commit71589b101ccbec67fa2741856ee0add5752dea72 (patch)
tree63aeb9f5617c3e7e9b87c04f10bfa938f495736c /src/buffer.h
parent69121c33e4a11805bf6438131c8aec72411a0e5d (diff)
parent9d7ba2b1998afc3664c37d9d1b6f6ca2d68356e9 (diff)
downloademacs-71589b101ccbec67fa2741856ee0add5752dea72.tar.gz
emacs-71589b101ccbec67fa2741856ee0add5752dea72.zip
Merge remote-tracking branch 'origin/feature/noverlay'
Diffstat (limited to 'src/buffer.h')
-rw-r--r--src/buffer.h110
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
3Copyright (C) 1985-1986, 1993-1995, 1997-2022 Free Software Foundation, 3Copyright (C) 1985-2022 Free Software Foundation, Inc.
4Inc.
5 4
6This file is part of GNU Emacs. 5This 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
30INLINE_HEADER_BEGIN 30INLINE_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
711struct sortvec
712{
713 Lisp_Object overlay;
714 ptrdiff_t beg, end;
715 EMACS_INT priority;
716 EMACS_INT spriority; /* Secondary priority. */
717};
718
719INLINE bool 719INLINE bool
720BUFFERP (Lisp_Object a) 720BUFFERP (Lisp_Object a)
721{ 721{
@@ -1171,8 +1171,11 @@ extern void delete_all_overlays (struct buffer *);
1171extern void reset_buffer (struct buffer *); 1171extern void reset_buffer (struct buffer *);
1172extern void compact_buffer (struct buffer *); 1172extern void compact_buffer (struct buffer *);
1173extern void evaporate_overlays (ptrdiff_t); 1173extern void evaporate_overlays (ptrdiff_t);
1174extern ptrdiff_t overlays_at (EMACS_INT, bool, Lisp_Object **, 1174extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *);
1175 ptrdiff_t *, ptrdiff_t *, ptrdiff_t *, bool); 1175extern ptrdiff_t overlays_in (ptrdiff_t, ptrdiff_t, bool, Lisp_Object **,
1176 ptrdiff_t *, bool, bool, ptrdiff_t *);
1177extern ptrdiff_t previous_overlay_change (ptrdiff_t);
1178extern ptrdiff_t next_overlay_change (ptrdiff_t);
1176extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); 1179extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *);
1177extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); 1180extern void recenter_overlay_lists (struct buffer *, ptrdiff_t);
1178extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); 1181extern 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);
1186extern void mmap_set_vars (bool); 1189extern void mmap_set_vars (bool);
1187extern void restore_buffer (Lisp_Object); 1190extern void restore_buffer (Lisp_Object);
1188extern void set_buffer_if_live (Lisp_Object); 1191extern void set_buffer_if_live (Lisp_Object);
1192extern 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)
1272INLINE bool 1274INLINE bool
1273buffer_has_overlays (void) 1275buffer_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. */ 1396INLINE ptrdiff_t
1397overlay_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
1404INLINE ptrdiff_t
1405overlay_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. */ 1415INLINE ptrdiff_t
1416OVERLAY_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
1423INLINE ptrdiff_t
1424OVERLAY_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 1431INLINE Lisp_Object
1432OVERLAY_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
1408INLINE ptrdiff_t 1439INLINE struct buffer *
1409OVERLAY_POSITION (Lisp_Object p) 1440OVERLAY_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
1447INLINE bool
1448OVERLAY_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
1455INLINE bool
1456OVERLAY_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
1693INLINE_HEADER_END 1740INLINE_HEADER_END
1694 1741
1742int compare_overlays (const void *v1, const void *v2);
1743void make_sortvec_item (struct sortvec *item, Lisp_Object overlay);
1744
1695#endif /* EMACS_BUFFER_H */ 1745#endif /* EMACS_BUFFER_H */