* lisp.h (Lisp_Overlay): New tag.
authorJim Blandy <jimb@redhat.com>
Fri, 14 May 1993 14:43:00 +0000 (14:43 +0000)
committerJim Blandy <jimb@redhat.com>
Fri, 14 May 1993 14:43:00 +0000 (14:43 +0000)
(OVERLAYP): New predicate.
(CHECK_OVERLAY): New type-checker.
(Qoverlayp): New extern declaration.
* buffer.c (Foverlayp): New function.
(Qoverlayp): New atom.
(overlays_at, recenter_overlay_lists): Abort if we encounter an
invalid overlay.
(syms_of_buffer): defsubr Soverlayp; initialize Qoverlayp.
(Fdelete_overlay): Set the overlay's markers to point nowhere.
Use CHECK_OVERLAY instead of signalling a special error.
(Fmove_overlay, Foverlay_put): Use CHECK_OVERLAY instead of
signalling a special error.
(Foverlay_get): Use CHECK_OVERLAY.
* fns.c (internal_equal): Define this for overlays.
* buffer.h (OVERLAY_VALID): Define in terms of OVERLAYP.
* print.c (print): Give overlays their own print syntax.
* alloc.c (mark_object): Treat overlays like conses.

src/alloc.c
src/buffer.h
src/fns.c
src/print.c

index b0c120b..6aaa34d 100644 (file)
@@ -1609,6 +1609,7 @@ mark_object (objptr)
     case Lisp_Cons:
     case Lisp_Buffer_Local_Value:
     case Lisp_Some_Buffer_Local_Value:
+    case Lisp_Overlay:
       {
        register struct Lisp_Cons *ptr = XCONS (obj);
        if (XMARKBIT (ptr->car)) break;
index 34d92fd..3ab666c 100644 (file)
@@ -370,7 +370,7 @@ extern Lisp_Object Vtransient_mark_mode;
    Therefore, we cannot assume that they remain valid--we must check.  */
 
 /* 1 if the OV is a cons cell whose car is a cons cell.  */
-#define OVERLAY_VALID(OV) (CONSP ((OV)) && CONSP (XCONS ((OV))->car))
+#define OVERLAY_VALID(OV) (OVERLAYP (OV))
 
 /* Return the marker that stands for where OV starts in the buffer.  */
 #define OVERLAY_START(OV) (XCONS (XCONS ((OV))->car)->car)
@@ -386,7 +386,6 @@ extern Lisp_Object Vtransient_mark_mode;
  ((MARKERP ((P)) && XMARKER ((P))->buffer == current_buffer)   \
   ? marker_position ((P)) : 0)
 
-
 /* Allocation of buffer text.  */
 
 #ifdef REL_ALLOC
index 7990bf4..328cf98 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -844,7 +844,8 @@ do_cdr:
     }
 #endif
   if (XTYPE (o1) != XTYPE (o2)) return Qnil;
-  if (XTYPE (o1) == Lisp_Cons)
+  if (XTYPE (o1) == Lisp_Cons
+      || XTYPE (o1) == Lisp_Overlay)
     {
       Lisp_Object v1;
       v1 = internal_equal (Fcar (o1), Fcar (o2), depth + 1);
index ba41e46..2390117 100644 (file)
@@ -952,6 +952,23 @@ print (obj, printcharfun, escapeflag)
        }
       PRINTCHAR ('>');
       break;
+
+    case Lisp_Overlay:
+      strout ("#<overlay ", -1, printcharfun);
+      if (!(XMARKER (OVERLAY_START (obj))->buffer))
+       strout ("in no buffer", -1, printcharfun);
+      else
+       {
+         sprintf (buf, "from %d to %d in ",
+                  marker_position (OVERLAY_START (obj)),
+                  marker_position (OVERLAY_END   (obj)));
+         strout (buf, -1, printcharfun);
+         print_string (XMARKER (OVERLAY_START (obj))->buffer->name,
+                       printcharfun);
+       }
+      PRINTCHAR ('>');
+      break;
+
 #endif /* standalone */
 
     case Lisp_Subr: