comparison src/buffer.c @ 7520:6cc6328992d6

(fix_overlays_in_range): New function.
author Karl Heuer <kwzh@gnu.org>
date Tue, 17 May 1994 03:30:40 +0000
parents 4ba64e05dad6
children b3be53811505
comparison
equal deleted inserted replaced
7519:987ab382275c 7520:6cc6328992d6
1632 tail = prev; 1632 tail = prev;
1633 } 1633 }
1634 } 1634 }
1635 1635
1636 XFASTINT (buf->overlay_center) = pos; 1636 XFASTINT (buf->overlay_center) = pos;
1637 }
1638
1639 /* Fix up overlays that were garbled as a result of permuting markers
1640 in the range START through END. Any overlay with at least one
1641 endpoint in this range will need to be unlinked from the overlay
1642 list and reinserted in its proper place.
1643 Such an overlay might even have negative size at this point.
1644 If so, we'll reverse the endpoints. Can you think of anything
1645 better to do in this situation? */
1646 void
1647 fix_overlays_in_range (start, end)
1648 register int start, end;
1649 {
1650 Lisp_Object tem, overlay;
1651 Lisp_Object before_list, after_list;
1652 Lisp_Object *ptail, *pbefore = &before_list, *pafter = &after_list;
1653 int startpos, endpos;
1654
1655 /* This algorithm shifts links around instead of consing and GCing.
1656 The loop invariant is that before_list (resp. after_list) is a
1657 well-formed list except that its last element, the one that
1658 *pbefore (resp. *pafter) points to, is still uninitialized.
1659 So it's not a bug that before_list isn't initialized, although
1660 it may look strange. */
1661 for (ptail = &current_buffer->overlays_before; CONSP (*ptail);)
1662 {
1663 overlay = XCONS (*ptail)->car;
1664 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
1665 if (endpos < start)
1666 break;
1667 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
1668 if (endpos < end
1669 || (startpos >= start && startpos < end))
1670 {
1671 /* If the overlay is backwards, fix that now. */
1672 if (startpos > endpos)
1673 {
1674 int tem;
1675 Fset_marker (OVERLAY_START (overlay), endpos, Qnil);
1676 Fset_marker (OVERLAY_END (overlay), startpos, Qnil);
1677 tem = startpos; startpos = endpos; endpos = tem;
1678 }
1679 /* Add it to the end of the wrong list. Later on,
1680 recenter_overlay_lists will move it to the right place. */
1681 if (endpos < XINT (current_buffer->overlay_center))
1682 {
1683 *pafter = *ptail;
1684 pafter = &XCONS (*ptail)->cdr;
1685 }
1686 else
1687 {
1688 *pbefore = *ptail;
1689 pbefore = &XCONS (*ptail)->cdr;
1690 }
1691 *ptail = XCONS (*ptail)->cdr;
1692 }
1693 else
1694 ptail = &XCONS (*ptail)->cdr;
1695 }
1696 for (ptail = &current_buffer->overlays_after; CONSP (*ptail);)
1697 {
1698 overlay = XCONS (*ptail)->car;
1699 startpos = OVERLAY_POSITION (OVERLAY_START (overlay));
1700 if (startpos >= end)
1701 break;
1702 endpos = OVERLAY_POSITION (OVERLAY_END (overlay));
1703 if (startpos >= start
1704 || (endpos >= start && endpos < end))
1705 {
1706 if (startpos > endpos)
1707 {
1708 int tem;
1709 Fset_marker (OVERLAY_START (overlay), endpos, Qnil);
1710 Fset_marker (OVERLAY_END (overlay), startpos, Qnil);
1711 tem = startpos; startpos = endpos; endpos = tem;
1712 }
1713 if (endpos < XINT (current_buffer->overlay_center))
1714 {
1715 *pafter = *ptail;
1716 pafter = &XCONS (*ptail)->cdr;
1717 }
1718 else
1719 {
1720 *pbefore = *ptail;
1721 pbefore = &XCONS (*ptail)->cdr;
1722 }
1723 *ptail = XCONS (*ptail)->cdr;
1724 }
1725 else
1726 ptail = &XCONS (*ptail)->cdr;
1727 }
1728
1729 /* Splice the constructed (wrong) lists into the buffer's lists,
1730 and let the recenter function make it sane again. */
1731 *pbefore = current_buffer->overlays_before;
1732 current_buffer->overlays_before = before_list;
1733 recenter_overlay_lists (current_buffer,
1734 XINT (current_buffer->overlay_center));
1735
1736 *pafter = current_buffer->overlays_after;
1737 current_buffer->overlays_after = after_list;
1738 recenter_overlay_lists (current_buffer,
1739 XINT (current_buffer->overlay_center));
1637 } 1740 }
1638 1741
1639 DEFUN ("overlayp", Foverlayp, Soverlayp, 1, 1, 0, 1742 DEFUN ("overlayp", Foverlayp, Soverlayp, 1, 1, 0,
1640 "Return t if OBJECT is an overlay.") 1743 "Return t if OBJECT is an overlay.")
1641 (object) 1744 (object)