diff options
| author | Richard M. Stallman | 2004-11-02 09:14:11 +0000 |
|---|---|---|
| committer | Richard M. Stallman | 2004-11-02 09:14:11 +0000 |
| commit | 085db7de2dc9af0a5d88667aed435ad155ecfa70 (patch) | |
| tree | 6ba110c73bf2ccbc89ac13651ad57a12365eac67 /src | |
| parent | 5d19ee8aa5128eaefd9895a79a5f484a29acf487 (diff) | |
| download | emacs-085db7de2dc9af0a5d88667aed435ad155ecfa70.tar.gz emacs-085db7de2dc9af0a5d88667aed435ad155ecfa70.zip | |
(replace_range_2): New function.
Diffstat (limited to 'src')
| -rw-r--r-- | src/insdel.c | 118 |
1 files changed, 117 insertions, 1 deletions
diff --git a/src/insdel.c b/src/insdel.c index ffe7006a45b..f5f56f0371f 100644 --- a/src/insdel.c +++ b/src/insdel.c | |||
| @@ -1464,7 +1464,7 @@ adjust_after_insert (from, from_byte, to, to_byte, newlen) | |||
| 1464 | Z -= len; Z_BYTE -= len_byte; | 1464 | Z -= len; Z_BYTE -= len_byte; |
| 1465 | adjust_after_replace (from, from_byte, Qnil, newlen, len_byte); | 1465 | adjust_after_replace (from, from_byte, Qnil, newlen, len_byte); |
| 1466 | } | 1466 | } |
| 1467 | 1467 | ||
| 1468 | /* Replace the text from character positions FROM to TO with NEW, | 1468 | /* Replace the text from character positions FROM to TO with NEW, |
| 1469 | If PREPARE is nonzero, call prepare_to_modify_buffer. | 1469 | If PREPARE is nonzero, call prepare_to_modify_buffer. |
| 1470 | If INHERIT, the newly inserted text should inherit text properties | 1470 | If INHERIT, the newly inserted text should inherit text properties |
| @@ -1641,6 +1641,122 @@ replace_range (from, to, new, prepare, inherit, markers) | |||
| 1641 | update_compositions (from, GPT, CHECK_BORDER); | 1641 | update_compositions (from, GPT, CHECK_BORDER); |
| 1642 | } | 1642 | } |
| 1643 | 1643 | ||
| 1644 | /* Replace the text from character positions FROM to TO with | ||
| 1645 | the text in INS of length INSCHARS. | ||
| 1646 | Keep the text properties that applied to the old characters | ||
| 1647 | (extending them to all the new chars if there are more new chars). | ||
| 1648 | |||
| 1649 | Note that this does not yet handle markers quite right. | ||
| 1650 | |||
| 1651 | If MARKERS is nonzero, relocate markers. | ||
| 1652 | |||
| 1653 | Unlike most functions at this level, never call | ||
| 1654 | prepare_to_modify_buffer and never call signal_after_change. */ | ||
| 1655 | |||
| 1656 | void | ||
| 1657 | replace_range_2 (from, from_byte, to, to_byte, ins, inschars, insbytes, markers) | ||
| 1658 | int from, from_byte, to, to_byte; | ||
| 1659 | char *ins; | ||
| 1660 | int inschars, insbytes, markers; | ||
| 1661 | { | ||
| 1662 | int nbytes_del, nchars_del; | ||
| 1663 | Lisp_Object temp; | ||
| 1664 | |||
| 1665 | CHECK_MARKERS (); | ||
| 1666 | |||
| 1667 | nchars_del = to - from; | ||
| 1668 | nbytes_del = to_byte - from_byte; | ||
| 1669 | |||
| 1670 | if (nbytes_del <= 0 && insbytes == 0) | ||
| 1671 | return; | ||
| 1672 | |||
| 1673 | /* Make sure point-max won't overflow after this insertion. */ | ||
| 1674 | XSETINT (temp, Z_BYTE - nbytes_del + insbytes); | ||
| 1675 | if (Z_BYTE - nbytes_del + insbytes != XINT (temp)) | ||
| 1676 | error ("Maximum buffer size exceeded"); | ||
| 1677 | |||
| 1678 | /* Make sure the gap is somewhere in or next to what we are deleting. */ | ||
| 1679 | if (from > GPT) | ||
| 1680 | gap_right (from, from_byte); | ||
| 1681 | if (to < GPT) | ||
| 1682 | gap_left (to, to_byte, 0); | ||
| 1683 | |||
| 1684 | GAP_SIZE += nbytes_del; | ||
| 1685 | ZV -= nchars_del; | ||
| 1686 | Z -= nchars_del; | ||
| 1687 | ZV_BYTE -= nbytes_del; | ||
| 1688 | Z_BYTE -= nbytes_del; | ||
| 1689 | GPT = from; | ||
| 1690 | GPT_BYTE = from_byte; | ||
| 1691 | if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */ | ||
| 1692 | |||
| 1693 | if (GPT_BYTE < GPT) | ||
| 1694 | abort (); | ||
| 1695 | |||
| 1696 | if (GPT - BEG < BEG_UNCHANGED) | ||
| 1697 | BEG_UNCHANGED = GPT - BEG; | ||
| 1698 | if (Z - GPT < END_UNCHANGED) | ||
| 1699 | END_UNCHANGED = Z - GPT; | ||
| 1700 | |||
| 1701 | if (GAP_SIZE < insbytes) | ||
| 1702 | make_gap (insbytes - GAP_SIZE); | ||
| 1703 | |||
| 1704 | /* Copy the replacement text into the buffer. */ | ||
| 1705 | bcopy (ins, GPT_ADDR, insbytes); | ||
| 1706 | |||
| 1707 | #ifdef BYTE_COMBINING_DEBUG | ||
| 1708 | /* We have copied text into the gap, but we have not marked | ||
| 1709 | it as part of the buffer. So we can use the old FROM and FROM_BYTE | ||
| 1710 | here, for both the previous text and the following text. | ||
| 1711 | Meanwhile, GPT_ADDR does point to | ||
| 1712 | the text that has been stored by copy_text. */ | ||
| 1713 | if (count_combining_before (GPT_ADDR, insbytes, from, from_byte) | ||
| 1714 | || count_combining_after (GPT_ADDR, insbytes, from, from_byte)) | ||
| 1715 | abort (); | ||
| 1716 | #endif | ||
| 1717 | |||
| 1718 | GAP_SIZE -= insbytes; | ||
| 1719 | GPT += inschars; | ||
| 1720 | ZV += inschars; | ||
| 1721 | Z += inschars; | ||
| 1722 | GPT_BYTE += insbytes; | ||
| 1723 | ZV_BYTE += insbytes; | ||
| 1724 | Z_BYTE += insbytes; | ||
| 1725 | if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */ | ||
| 1726 | |||
| 1727 | if (GPT_BYTE < GPT) | ||
| 1728 | abort (); | ||
| 1729 | |||
| 1730 | /* Adjust the overlay center as needed. This must be done after | ||
| 1731 | adjusting the markers that bound the overlays. */ | ||
| 1732 | if (nchars_del != inschars) | ||
| 1733 | { | ||
| 1734 | adjust_overlays_for_insert (from, inschars); | ||
| 1735 | adjust_overlays_for_delete (from + inschars, nchars_del); | ||
| 1736 | } | ||
| 1737 | |||
| 1738 | /* Adjust markers for the deletion and the insertion. */ | ||
| 1739 | if (markers | ||
| 1740 | && ! (nchars_del == 1 && inschars == 1)) | ||
| 1741 | adjust_markers_for_replace (from, from_byte, nchars_del, nbytes_del, | ||
| 1742 | inschars, insbytes); | ||
| 1743 | |||
| 1744 | offset_intervals (current_buffer, from, inschars - nchars_del); | ||
| 1745 | |||
| 1746 | /* Relocate point as if it were a marker. */ | ||
| 1747 | if (from < PT && nchars_del != inschars) | ||
| 1748 | adjust_point ((from + inschars - (PT < to ? PT : to)), | ||
| 1749 | (from_byte + insbytes | ||
| 1750 | - (PT_BYTE < to_byte ? PT_BYTE : to_byte))); | ||
| 1751 | |||
| 1752 | if (insbytes == 0) | ||
| 1753 | evaporate_overlays (from); | ||
| 1754 | |||
| 1755 | CHECK_MARKERS (); | ||
| 1756 | |||
| 1757 | MODIFF++; | ||
| 1758 | } | ||
| 1759 | |||
| 1644 | /* Delete characters in current buffer | 1760 | /* Delete characters in current buffer |
| 1645 | from FROM up to (but not including) TO. | 1761 | from FROM up to (but not including) TO. |
| 1646 | If TO comes before FROM, we delete nothing. */ | 1762 | If TO comes before FROM, we delete nothing. */ |