aboutsummaryrefslogtreecommitdiffstats
path: root/src/buffer.h
diff options
context:
space:
mode:
authorYuan Fu2022-11-21 12:54:35 -0800
committerYuan Fu2022-11-21 12:54:35 -0800
commitaaeaa310f0391f5a5193e1a3d6e026986c4f2c0c (patch)
tree67765b95359bfc462e95606043e6b0cea3bb7c49 /src/buffer.h
parentb2ea38ab03e801859163b74a292aa75008e36541 (diff)
parentf176a36f4629b56c9fd9e3fc15aebd04a168c4f5 (diff)
downloademacs-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.h111
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
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
@@ -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
715struct sortvec
716{
717 Lisp_Object overlay;
718 ptrdiff_t beg, end;
719 EMACS_INT priority;
720 EMACS_INT spriority; /* Secondary priority. */
721};
722
723INLINE bool 723INLINE bool
724BUFFERP (Lisp_Object a) 724BUFFERP (Lisp_Object a)
725{ 725{
@@ -1174,9 +1174,11 @@ extern EMACS_INT fix_position (Lisp_Object);
1174extern void delete_all_overlays (struct buffer *); 1174extern void delete_all_overlays (struct buffer *);
1175extern void reset_buffer (struct buffer *); 1175extern void reset_buffer (struct buffer *);
1176extern void compact_buffer (struct buffer *); 1176extern void compact_buffer (struct buffer *);
1177extern void evaporate_overlays (ptrdiff_t); 1177extern ptrdiff_t overlays_at (ptrdiff_t, bool, Lisp_Object **, ptrdiff_t *, ptrdiff_t *);
1178extern ptrdiff_t overlays_at (EMACS_INT, bool, Lisp_Object **, 1178extern 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 *);
1180extern ptrdiff_t previous_overlay_change (ptrdiff_t);
1181extern ptrdiff_t next_overlay_change (ptrdiff_t);
1180extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *); 1182extern ptrdiff_t sort_overlays (Lisp_Object *, ptrdiff_t, struct window *);
1181extern void recenter_overlay_lists (struct buffer *, ptrdiff_t); 1183extern void recenter_overlay_lists (struct buffer *, ptrdiff_t);
1182extern ptrdiff_t overlay_strings (ptrdiff_t, struct window *, unsigned char **); 1184extern 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);
1190extern void mmap_set_vars (bool); 1192extern void mmap_set_vars (bool);
1191extern void restore_buffer (Lisp_Object); 1193extern void restore_buffer (Lisp_Object);
1192extern void set_buffer_if_live (Lisp_Object); 1194extern void set_buffer_if_live (Lisp_Object);
1195extern 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)
1276INLINE bool 1277INLINE bool
1277buffer_has_overlays (void) 1278buffer_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. */ 1399INLINE ptrdiff_t
1400overlay_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
1407INLINE ptrdiff_t
1408overlay_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. */ 1418INLINE ptrdiff_t
1419OVERLAY_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
1426INLINE ptrdiff_t
1427OVERLAY_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 1434INLINE Lisp_Object
1435OVERLAY_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
1412INLINE ptrdiff_t 1442INLINE struct buffer *
1413OVERLAY_POSITION (Lisp_Object p) 1443OVERLAY_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
1450INLINE bool
1451OVERLAY_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
1458INLINE bool
1459OVERLAY_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
1697INLINE_HEADER_END 1743INLINE_HEADER_END
1698 1744
1745int compare_overlays (const void *v1, const void *v2);
1746void make_sortvec_item (struct sortvec *item, Lisp_Object overlay);
1747
1699#endif /* EMACS_BUFFER_H */ 1748#endif /* EMACS_BUFFER_H */