comparison src/insdel.c @ 18830:ac0f5f1912c0

(replace_range): New function.
author Richard M. Stallman <rms@gnu.org>
date Thu, 17 Jul 1997 06:51:28 +0000
parents 59d2f2a0a36e
children bc4c4e15a135
comparison
equal deleted inserted replaced
18829:efc598630ee9 18830:ac0f5f1912c0
693 adjust_markers (opoint - 1, opoint, length); 693 adjust_markers (opoint - 1, opoint, length);
694 signal_after_change (PT-length, 0, length); 694 signal_after_change (PT-length, 0, length);
695 } 695 }
696 } 696 }
697 697
698 /* Replace the text from FROM to TO with NEW,
699 If PREPARE is nonzero, call prepare_to_modify_buffer.
700 If INHERIT, the newly inserted text should inherit text properties
701 from the surrounding non-deleted text. */
702
703 /* Note that this does not yet handle markers quite right.
704 Also it needs to record a single undo-entry that does a replacement
705 rather than a separate delete and insert.
706 That way, undo will also handle markers properly. */
707
708 void
709 replace_range (from, to, new, prepare, inherit)
710 Lisp_Object new;
711 int from, to, prepare, inherit;
712 {
713 int numdel;
714 int inslen = XSTRING (new)->size;
715 register Lisp_Object temp;
716 struct gcpro gcpro1;
717
718 GCPRO1 (new);
719
720 if (prepare)
721 {
722 int range_length = to - from;
723 prepare_to_modify_buffer (from, to, &from);
724 to = from + range_length;
725 }
726
727 /* Make args be valid */
728 if (from < BEGV)
729 from = BEGV;
730 if (to > ZV)
731 to = ZV;
732
733 UNGCPRO;
734
735 numdel = to - from;
736
737 /* Make sure point-max won't overflow after this insertion. */
738 XSETINT (temp, Z - numdel + inslen);
739 if (Z - numdel + inslen != XINT (temp))
740 error ("maximum buffer size exceeded");
741
742 if (numdel <= 0 && inslen == 0)
743 return;
744
745 GCPRO1 (new);
746
747 /* Make sure the gap is somewhere in or next to what we are deleting. */
748 if (from > GPT)
749 gap_right (from);
750 if (to < GPT)
751 gap_left (to, 0);
752
753 /* Relocate all markers pointing into the new, larger gap
754 to point at the end of the text before the gap.
755 This has to be done before recording the deletion,
756 so undo handles this after reinserting the text. */
757 adjust_markers (to + GAP_SIZE, to + GAP_SIZE, - numdel - GAP_SIZE);
758
759 record_delete (from, numdel);
760
761 GAP_SIZE += numdel;
762 ZV -= numdel;
763 Z -= numdel;
764 GPT = from;
765 *(GPT_ADDR) = 0; /* Put an anchor. */
766
767 if (GPT - BEG < beg_unchanged)
768 beg_unchanged = GPT - BEG;
769 if (Z - GPT < end_unchanged)
770 end_unchanged = Z - GPT;
771
772 if (GAP_SIZE < inslen)
773 make_gap (inslen - GAP_SIZE);
774
775 record_insert (from, inslen);
776
777 bcopy (XSTRING (new)->data, GPT_ADDR, inslen);
778
779 /* Relocate point as if it were a marker. */
780 if (from < PT)
781 adjust_point (from + inslen - (PT < to ? PT : to));
782
783 #ifdef USE_TEXT_PROPERTIES
784 offset_intervals (current_buffer, PT, inslen - numdel);
785 #endif
786
787 GAP_SIZE -= inslen;
788 GPT += inslen;
789 ZV += inslen;
790 Z += inslen;
791 if (GAP_SIZE > 0) *(GPT_ADDR) = 0; /* Put an anchor. */
792
793 /* Adjust the overlay center as needed. This must be done after
794 adjusting the markers that bound the overlays. */
795 adjust_overlays_for_delete (from, numdel);
796 adjust_overlays_for_insert (from, inslen);
797 adjust_markers_for_insert (from, inslen);
798
799 #ifdef USE_TEXT_PROPERTIES
800 /* Only defined if Emacs is compiled with USE_TEXT_PROPERTIES */
801 graft_intervals_into_buffer (XSTRING (new)->intervals, from, inslen,
802 current_buffer, inherit);
803 #endif
804
805 if (inslen == 0)
806 evaporate_overlays (from);
807
808 MODIFF++;
809 UNGCPRO;
810
811 signal_after_change (from, numdel, inslen);
812 }
813
698 /* Delete characters in current buffer 814 /* Delete characters in current buffer
699 from FROM up to (but not including) TO. */ 815 from FROM up to (but not including) TO. */
700 816
701 void 817 void
702 del_range (from, to) 818 del_range (from, to)