home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / gnu / lucid / lemacs-19.6 / src / extents.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-03-13  |  7.5 KB  |  231 lines

  1. /* This file is part of GNU Emacs.
  2.  
  3. GNU Emacs is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 1, or (at your option)
  6. any later version.
  7.  
  8. GNU Emacs is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12.  
  13. You should have received a copy of the GNU General Public License
  14. along with GNU Emacs; see the file COPYING.  If not, write to
  15. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  16.  
  17. #ifndef EXTENTS_DEFINED
  18. #define EXTENTS_DEFINED
  19.  
  20. #include "dispextern.h"
  21.  
  22. struct extent
  23. {
  24.   unsigned short flags;
  25.   short attr_index;
  26.   short priority;
  27.   int start;
  28.   int end;
  29.   struct extent *next;
  30.   struct extent *previous;
  31.   struct extent *e_next;
  32.   struct extent *e_previous;
  33.   Lisp_Object buffer;
  34.   GLYPH begin_glyph;
  35.   GLYPH end_glyph;
  36.   Lisp_Object user_data;
  37. };
  38.  
  39.  
  40. typedef struct extent *EXTENT;
  41. #define EXTENT_SIZE (sizeof (struct extent))
  42.  
  43. /* These macros are for dealing with the extent properties. */
  44. #define EXTENT_FLAGS(e) ((e)->flags)
  45. #define EXTENT_FLAG_P(e, flag) (EXTENT_FLAGS (e) & (flag))
  46. #define SET_EXTENT_FLAG(e, flag) {EXTENT_FLAGS (e) |= (flag);}
  47. #define CLEAR_EXTENT_FLAG(e, flag) {EXTENT_FLAGS (e) &= ~(flag);}
  48.  
  49. /* the flags -- remember that we only have 16 of them */
  50. #define EF_INVISIBLE     0x1
  51. #define EF_HIGHLIGHT     0x2
  52. #define EF_WRITE_PROTECT 0x4
  53. #define EF_START_GLYPH   0x8
  54. #define EF_END_GLYPH     0x10
  55. #define EF_MENU          0x20
  56. #define EF_START_OPEN    0x40
  57. #define EF_END_OPEN      0x80
  58.  
  59. #define EF_PROPERTIES    0xff
  60.  
  61. #define EF_WARN_MODIFY   0x100
  62. #define EF_DUPLICABLE    0x200
  63. #define EF_COLUMN        0x400
  64. #define EF_DETACHED      0x800
  65.  
  66. #define EF_SELF_MARKED   0x1000
  67. #define EF_LIST_MARKED   0x2000
  68. #define EF_MARKED_MASK   0x3000
  69.  
  70. #define EF_DESTROYED     0x4000
  71.  
  72. #define EF_ALL           0xffff
  73.  
  74. /* GC flags */
  75. #define MARK_EXTENT(e) SET_EXTENT_FLAG(e, EF_SELF_MARKED)
  76. #define MARK_EXTENT_LIST(e) SET_EXTENT_FLAG(e, EF_LIST_MARKED)
  77. #define EXTENT_MARKED_P(e) EXTENT_FLAG_P(e, EF_MARKED_MASK)
  78. #define EXTENT_LIST_MARKED_P(e) EXTENT_FLAG_P(e, EF_LIST_MARKED)
  79. #define UNMARK_EXTENT(e) CLEAR_EXTENT_FLAG(e, EF_MARKED_MASK)
  80.  
  81. /* detached from parent? */
  82. #define EXTENT_DETACHED_P(e) (EXTENT_FLAG_P(e, EF_DETACHED))
  83.  
  84. /* obliterated? */
  85. #define EXTENT_DESTROYED_P(e) (EXTENT_FLAG_P(e, EF_DESTROYED))
  86.  
  87. /* special graphics attribute meaning "use what anyone else's attributes" */
  88. #define GA_NO_CHANGE 0
  89. /* this number should be bigger than any of the "real" GA's */
  90. #define GA_MAX 0x1000
  91.  
  92. extern Lisp_Object Qextent;
  93. extern Lisp_Object Qextentp;
  94.  
  95. #ifdef emacs    /* things other than emacs want the structs */
  96.  
  97. /* from alloc.c */
  98. extern EXTENT make_extent();
  99.  
  100. extern Lisp_Object Fextentp();
  101. extern Lisp_Object Fextent_length();
  102. extern Lisp_Object Fextent_start_position();
  103. extern Lisp_Object Fextent_end_position();
  104. extern Lisp_Object Fextent_buffer();
  105. extern Lisp_Object Fextent_to_generic_id();
  106. extern Lisp_Object Fmap_extents();
  107. extern Lisp_Object Fhighlight_extent();
  108. extern Lisp_Object Fforce_highlight_extent();
  109. extern Lisp_Object Fextent_flag_set();
  110. extern Lisp_Object Fextent_write_protected_p();
  111. extern Lisp_Object Fset_extent_write_protected();
  112.  
  113. #endif /* emacs */
  114.  
  115. struct extent_replica
  116. {
  117.   int start;
  118.   int end;
  119.   Lisp_Object extent;
  120. };
  121. typedef struct extent_replica *EXTENT_REPLICA;
  122. typedef struct extent_replica *DUP;
  123.  
  124. #define XDUP(obj) XEXTENT_REPLICA(obj)
  125. #define MARK_DUP(dup) {XMARK((dup)->extent);}
  126. #define DUP_MARKED_P(dup) XMARKBIT((dup)->extent)
  127. #define UNMARK_DUP(dup) {XUNMARK((dup)->extent);}
  128.  
  129. #ifdef emacs
  130.  
  131. /* used in concat() and merge_replicas() */
  132. struct merge_replicas_struct
  133. {
  134.   Lisp_Object dup_list;
  135.   int entry_offset;
  136.   int entry_length;
  137. };
  138.  
  139. extern int inside_undo;
  140. extern int in_display;
  141.  
  142. struct extent_fragment
  143. {
  144.   /* buffer and modification event of buffer for this fragment */
  145.   struct buffer *buf;
  146.   int modiff;
  147.   int face_change;
  148.   /* covers buffer positions [from, to-1] */
  149.   int from;
  150.   int to;
  151.   /* these are the buffer array indices of positions from and to */
  152.   int start_index;
  153.   int end_index;
  154.   /* first extent past the stack */
  155.   EXTENT first_extent_past_stack;
  156.   int number_of_extents;
  157.   EXTENT *extents_stack;
  158.   int extents_stack_length;
  159.   struct face *fp;
  160. };
  161.  
  162. typedef struct extent_fragment *EXTENT_FRAGMENT;
  163.  
  164. /* sort of a mini-version of the extents fragment -- each buffer
  165.    with an extents list gets one of these */
  166. struct stack_of_extents
  167. {
  168.   /* an extent "before" those on the stack, or 0 if none is known */
  169.   EXTENT previous_extent;
  170.   /* buf_index over which this stack lies */
  171.   int buf_index;
  172.   EXTENT *stack;
  173.   int stack_length;
  174.   int stack_index;
  175. };
  176.  
  177. typedef int (*emf)(EXTENT extent, void *arg);
  178. typedef int (*elisp_emf)(Lisp_Object extent_obj, void *arg);
  179.  
  180. extern void adjust_extents 
  181. (int old_gap, int new_gap, int gap_size, struct buffer *buf);
  182. extern void verify_extent_modification (struct buffer *buf, int from, int to);
  183. /*extern int extent_endpoint (EXTENT extent, int endp);*/
  184. extern void detach_extent (EXTENT extent);
  185. /* extern void update_extent (EXTENT extent, int from, int to, int set_endpoints, struct buffer *buf); */
  186. extern void map_extents (int from, int to, elisp_emf efn, emf fn, void *arg, 
  187.                          struct buffer *buf, int closed_end);
  188. extern Lisp_Object Fmap_extents 
  189. (Lisp_Object function, Lisp_Object buffer, 
  190.  Lisp_Object from, Lisp_Object to, Lisp_Object maparg, Lisp_Object closed_end);
  191. /*extern int extent_highlightable_p (Lisp_Object extent_obj);*/
  192. extern Lisp_Object Fhighlight_extent (Lisp_Object extent_obj, Lisp_Object flag);
  193. extern Lisp_Object Fforce_highlight_extent (Lisp_Object extent_obj, Lisp_Object flag);
  194. extern Lisp_Object Fextent_start_position (Lisp_Object extent_obj);
  195. extern Lisp_Object Fextent_end_position (Lisp_Object extent_obj);
  196. extern Lisp_Object Fextent_length (Lisp_Object extent_obj);
  197. extern Lisp_Object Fextent_buffer (Lisp_Object extent_obj);
  198. extern Lisp_Object Fextent_to_generic_id (Lisp_Object extent_obj);
  199. extern int glyph_in_column_p (Lisp_Object extent_obj);
  200. extern Lisp_Object Frestore_extent (Lisp_Object extent_obj);
  201. extern void set_point (int position);
  202. extern void set_buffer_point (struct buffer *buffer, int position);
  203. extern int last_visible_position (int opoint, struct buffer *buf);
  204. extern EXTENT extent_at (int pos, struct buffer *buf, int flag);
  205. extern Lisp_Object Fextent_at (Lisp_Object pos, Lisp_Object buffer, 
  206.                                Lisp_Object flag);
  207. extern void free_buffer_cached_stack (struct buffer *b);
  208. extern EXTENT_FRAGMENT buffer_extent_fragment_at 
  209. (int pos, struct buffer *buf, struct screen *s);
  210. extern void process_extents_for_insertion (int opoint, int length, 
  211.                                            struct buffer *buf);
  212. extern void process_extents_for_deletion 
  213. (int from, int to, int start, int end, struct buffer *buf);
  214. extern Lisp_Object replicate_extents (int opoint, int length, 
  215.                                       struct buffer *buf);
  216. extern void splice_in_extent_replicas 
  217. (int opoint, int length, Lisp_Object dup_list, struct buffer *buf);
  218. extern Lisp_Object merge_replicas 
  219. (int number_of_lists, struct merge_replicas_struct *vec);
  220. extern void syms_of_extents (void);
  221.    
  222. extern GLYPH extent_glyph_at (EXTENT extent, int pos, int endp);
  223.  
  224. extern Lisp_Object Vlast_highlighted_extent;
  225. #define EXTENT_BEGIN_GLYPH_AT(extent,pos) extent_glyph_at (extent, pos, 0)
  226. #define EXTENT_END_GLYPH_AT(extent, pos) extent_glyph_at (extent, pos, 1)
  227.  
  228. #endif /* emacs */
  229.  
  230. #endif /* EXTENTS_DEFINED */
  231.