Update FSF's address in the preamble.
[bpt/emacs.git] / src / intervals.h
index 6635ed7..9b778c1 100644 (file)
@@ -1,11 +1,11 @@
 /* Definitions and global variables for intervals.
-   Copyright (C) 1990, 1992 Free Software Foundation, Inc.
+   Copyright (C) 1993, 1994 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
@@ -15,10 +15,13 @@ GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
 along with GNU Emacs; see the file COPYING.  If not, write to
-the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
 
 #ifdef USE_TEXT_PROPERTIES
+#ifndef NORMAL_FACE
 #include "dispextern.h"
+#endif
 
 #define NULL_INTERVAL 0
 #define INTERVAL_DEFAULT NULL_INTERVAL
@@ -33,25 +36,25 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* True if an interval pointer is null, or is a Lisp_Buffer or
    Lisp_String pointer (meaning it points to the owner of this
-   interval tree.) */
-#define NULL_INTERVAL_P(i) ((i) == NULL_INTERVAL ||                    \
-                           XTYPE ((Lisp_Object)(i)) == Lisp_Buffer || \
-                           XTYPE ((Lisp_Object)(i)) == Lisp_String)
+   interval tree). */
+#define NULL_INTERVAL_P(i) ((i) == NULL_INTERVAL           \
+                           || BUFFERP ((Lisp_Object)(i)) \
+                           || STRINGP ((Lisp_Object)(i)))
 
 /* True if this interval has no right child. */
-#define NULL_RIGHT_CHILD(i) (NULL_INTERVAL_P((i)->right))
+#define NULL_RIGHT_CHILD(i) ((i)->right == NULL_INTERVAL)
 
 /* True if this interval has no left child. */
-#define NULL_LEFT_CHILD(i) (NULL_INTERVAL_P((i)->left))
+#define NULL_LEFT_CHILD(i) ((i)->left == NULL_INTERVAL)
 
 /* True if this interval has no parent. */
-#define NULL_PARENT(i) (NULL_INTERVAL_P((i)->parent))
+#define NULL_PARENT(i) (NULL_INTERVAL_P ((i)->parent))
 
 /* True if this interval is the left child of some other interval. */
 #define AM_LEFT_CHILD(i) (! NULL_INTERVAL_P ((i)->parent) \
                          && (i)->parent->left == (i))
 
-/* True if this interval is the right ehild of some other interval. */
+/* True if this interval is the right child of some other interval. */
 #define AM_RIGHT_CHILD(i) (! NULL_INTERVAL_P ((i)->parent) \
                           && (i)->parent->right == (i))
 
@@ -63,7 +66,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define ROOT_INTERVAL_P(i) (NULL_PARENT (i))
 
 /* True if this interval is the only interval in the interval tree. */
-#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P((i)) && LEAF_INTERVAL_P ((i)))
+#define ONLY_INTERVAL_P(i) (ROOT_INTERVAL_P ((i)) && LEAF_INTERVAL_P ((i)))
 
 /* True if this interval has both left and right children. */
 #define BOTH_KIDS_P(i) ((i)->left != NULL_INTERVAL     \
@@ -78,9 +81,9 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                                               - TOTAL_LENGTH ((i)->right) \
                                               - TOTAL_LENGTH ((i)->left)))
 
-/* The absolute index of the last character belonging to I.  Note that
+/* The position of the character just past the end of I.  Note that
    the position cache i->position must be valid for this to work. */
-#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)) - 1)
+#define INTERVAL_LAST_POS(i) ((i)->position + LENGTH ((i)))
 
 /* The total size of the left subtree of this interval. */
 #define LEFT_TOTAL_LENGTH(i) ((i)->left ? (i)->left->total_length : 0)
@@ -96,15 +99,16 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #define DEFAULT_INTERVAL_P(i) (NULL_INTERVAL_P (i) || EQ ((i)->plist, Qnil))
 
 /* Reset this interval to its vanilla, or no-property state. */
-#define RESET_INTERVAL(i) { \
-                             (i)->total_length = (i)->position = 0;    \
-                             (i)->left = (i)->right = NULL_INTERVAL;   \
-                             (i)->parent = NULL_INTERVAL;              \
-                             (i)->write_protect = 0;                   \
-                             (i)->visible = 0;                         \
-                             (i)->front_sticky = (i)->rear_sticky = 0; \
-                             (i)->plist = Qnil;         \
-                         }
+#define RESET_INTERVAL(i) \
+{ \
+    (i)->total_length = (i)->position = 0;    \
+    (i)->left = (i)->right = NULL_INTERVAL;   \
+    (i)->parent = NULL_INTERVAL;              \
+    (i)->write_protect = 0;                   \
+    (i)->visible = 0;                         \
+    (i)->front_sticky = (i)->rear_sticky = 0; \
+    (i)->plist = Qnil;                               \
+}
 
 /* Copy the cached property values of interval FROM to interval TO. */
 #define COPY_INTERVAL_CACHE(from,to) \
@@ -127,7 +131,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 /* Macro determining whether the properties of an interval being
    inserted should be merged with the properties of the text where
    they are being inserted. */
-#define MERGE_INSERTIONS(i) 0
+#define MERGE_INSERTIONS(i) 1
 
 /* Macro determining if an invisible interval should be displayed
    as a special glyph, or not at all. */
@@ -135,17 +139,44 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
 
 /* Is this interval visible?  Replace later with cache access */
 #define INTERVAL_VISIBLE_P(i) \
-  (! NULL_INTERVAL_P (i) && ! NILP (Fmemq (Qinvisible, (i)->plist)))
+  (! NULL_INTERVAL_P (i) && NILP (textget ((i)->plist, Qinvisible)))
 
 /* Is this interval writable?  Replace later with cache access */
-#define INTERVAL_WRITABLE_P(i) \
-  (! NULL_INTERVAL_P (i) && NILP (Fmemq (Qread_only, (i)->plist)))
+#define INTERVAL_WRITABLE_P(i)                                 \
+  (! NULL_INTERVAL_P (i)                                       \
+   && (NILP (textget ((i)->plist, Qread_only))                 \
+       || ((CONSP (Vinhibit_read_only)                         \
+           ? !NILP (Fmemq (textget ((i)->plist, Qread_only),   \
+                           Vinhibit_read_only))                \
+           : !NILP (Vinhibit_read_only)))))                    \
 
 /* Macros to tell whether insertions before or after this interval
    should stick to it. */
-#define FRONT_STICKY_P(i) ((i)->front_sticky != 0)
-#define END_STICKY_P(i) ((i)->rear_sticky != 0)
+/* Replace later with cache access */
+/*#define FRONT_STICKY_P(i) ((i)->front_sticky != 0)
+  #define END_STICKY_P(i) ((i)->rear_sticky != 0)*/
+#define FRONT_STICKY_P(i) \
+  (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qfront_sticky)))
+#define END_NONSTICKY_P(i) \
+  (! NULL_INTERVAL_P (i) && ! NILP (textget ((i)->plist, Qrear_nonsticky)))
+
+
+/* If PROP is the `invisible' property of a character,
+   this is 1 if the character should be treated as invisible.  */
+
+#define TEXT_PROP_MEANS_INVISIBLE(prop)                                \
+  (EQ (current_buffer->invisibility_spec, Qt)                  \
+   ? ! NILP (prop)                                             \
+   : invisible_p (prop, current_buffer->invisibility_spec))
 
+/* If PROP is the `invisible' property of a character,
+   this is 1 if the character should be treated as invisible
+   and should have an ellipsis.  */
+
+#define TEXT_PROP_MEANS_INVISIBLE_WITH_ELLIPSIS(prop)          \
+  (EQ (current_buffer->invisibility_spec, Qt)                  \
+   ? 0                                                         \
+   : invisible_ellipsis_p (prop, current_buffer->invisibility_spec))
 
 /* Declared in alloc.c */
 
@@ -153,8 +184,6 @@ extern INTERVAL make_interval ();
 
 /* Declared in intervals.c */
 
-extern Lisp_Object interval_balance_threshold;
-
 extern INTERVAL create_root_interval ();
 extern void copy_properties ();
 extern int intervals_equal ();
@@ -172,6 +201,8 @@ extern void verify_interval_modification ();
 extern INTERVAL balance_intervals ();
 extern INLINE void copy_intervals_to_string ();
 extern INTERVAL copy_intervals ();
+extern Lisp_Object textget ();
+extern Lisp_Object get_local_map ();
 
 /* Declared in textprop.c */
 
@@ -180,16 +211,27 @@ extern Lisp_Object Qmouse_left;
 extern Lisp_Object Qmouse_entered;
 extern Lisp_Object Qpoint_left;
 extern Lisp_Object Qpoint_entered;
-extern Lisp_Object Qmodification;
+extern Lisp_Object Qmodification_hooks;
+extern Lisp_Object Qcategory;
+extern Lisp_Object Qlocal_map;
 
 /* Visual properties text (including strings) may have. */
 extern Lisp_Object Qforeground, Qbackground, Qfont, Qunderline, Qstipple;
-extern Lisp_Object Qinvisible, Qread_only;
+extern Lisp_Object Qinvisible, Qintangible, Qread_only;
+
+extern Lisp_Object Vinhibit_point_motion_hooks;
+extern Lisp_Object Vdefault_text_properties;
+
+/* Sticky properties */
+extern Lisp_Object Qfront_sticky, Qrear_nonsticky;
 
+extern Lisp_Object Fget_char_property (), Fget_text_property ();
 extern Lisp_Object Ftext_properties_at ();
 extern Lisp_Object Fnext_property_change (), Fprevious_property_change ();
 extern Lisp_Object Fadd_text_properties (), Fset_text_properties ();
 extern Lisp_Object Fremove_text_properties (), Ferase_text_properties ();
+extern Lisp_Object Ftext_property_any (), Ftext_property_not_all ();
+extern Lisp_Object copy_text_properties ();
 
 extern void syms_of_textprop ();