Google
 

Trailing-Edge - PDP-10 Archives - BB-AE97C-BM - sources/chminsstr.bli
There are 11 other files named chminsstr.bli in the archive. Click here to see a list.
 %TITLE 'CHMINSSTR - insert characters'
MODULE CHMINSSTR (				! Insert characters
		IDENT = '3-001'			! File: CHMINSSTR.BLI Edit: GB3001
		) =
BEGIN
!
!			  COPYRIGHT (c) 1981, 1985 BY
!	      DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
!		ALL RIGHTS RESERVED.
!
! THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND  COPIED
! ONLY  IN  ACCORDANCE  WITH  THE  TERMS  OF  SUCH  LICENSE AND WITH THE
! INCLUSION OF THE ABOVE COPYRIGHT NOTICE.  THIS SOFTWARE OR  ANY  OTHER
! COPIES  THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY
! OTHER PERSON.  NO TITLE TO AND OWNERSHIP OF  THE  SOFTWARE  IS  HEREBY
! TRANSFERRED.
!
! THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE  WITHOUT  NOTICE
! AND  SHOULD  NOT  BE  CONSTRUED  AS  A COMMITMENT BY DIGITAL EQUIPMENT
! CORPORATION.
!
! DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR  RELIABILITY  OF  ITS
! SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL.
!

!++
! FACILITY:	EDT -- The DEC Standard Editor
!
! ABSTRACT:
!
!	This module does a (change mode) insertion of a string of
!	characters which may include carriage returns.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: Unknown
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 04-Feb-1981.  This module was created by
!	extracting the routine INSERT_STRING from the module CHANGE.BLI.
! 1-002	- Regularize headers.  JBS 03-Mar-1981
! 1-003	- Change SPLIT_LINE to EDT$$SPLT_LNINS .  JBS 30-Mar-1981
! 1-004	- New screen update logic.  JBS 13-Sep-1982
! 1-005 - Add parameter to split line routine.  SMB 16-Nov-1982
! 1-006	- Do special handling for trailing carriage returns.  JBS 28-Dec-1982
!--

%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$INS_CHS;			! Insert a string of characters which may include carriage returns

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$INS_CHS  - insert characters'

GLOBAL ROUTINE EDT$$INS_CHS (			! Insert characters
	S, 					! address of string to insert
	L					! length of that string
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Insert a string of characters which may include carriage returns.
!	Carriage returns are treated as line terminators, having the effect of
!	breaking the current line of text into two.
!
! FORMAL PARAMETERS:
!
!  S 			a pointer to the character string to insert.
!
!  L 			the length of the string.
!
! IMPLICIT INPUTS:
!
!	NONE
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	A value of 0 is returned if a line exceeded 255 characters during the
!	insert (further insertions were lost).
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$INS_STR,				! Insert a string of characters at the current position
	EDT$$SPLT_LNINS : NOVALUE,		! Split a line of text at the current cursor position
	EDT$$CS_RIGHT,				! Move right a characteI
	EDT$$CS_LEFT;				! Move left a character

    LOCAL
	END_STRING,
	POINT,
	MY_S,
	MY_L;

    MY_L = .L;

!+
! Initialize a pointer to the current character and one to the end of the
! string.
!-
    POINT = .S;
    END_STRING = CH$PLUS (.S, .MY_L);
!+
! If we have trailing carriage returns do the line splitting before the insertion
! to improve screen repainting.
!-

    IF ((.MY_L GTR 1) AND (CH$RCHAR (CH$PLUS (.POINT, .MY_L - 1)) EQL ASC_K_CR))
    THEN
	BEGIN

	LOCAL
	    LINES_INSERTED,
	    STATUS;

!+
! Insert enough empty lines to account for the carriage returns.
! Keep backing up so our position doesn't change.
!-
	LINES_INSERTED = 0;

	WHILE ((.MY_L GTR 1) AND (CH$RCHAR (CH$PLUS (.POINT, .MY_L - 1)) EQL ASC_K_CR)) DO
	    BEGIN
	    EDT$$SPLT_LNINS (1);
	    EDT$$CS_LEFT ();
	    MY_L = .MY_L - 1;
	    LINES_INSERTED = .LINES_INSERTED + 1;
	    END;

!+
! Insert the text without the trailing carriage returns.
!-
	STATUS = EDT$$INS_CHS (.POINT, .MY_L);
!+
! Now move forward over those blank lines.
!-

	DECR I FROM .LINES_INSERTED - 1 TO 0 DO
	    EDT$$CS_RIGHT ();

!+
! We are done with the insert.
!-
	RETURN (.STATUS);
	END;

!+
! Either this is a string of length one or there is no
! trailing carriage returns.  Loop until no more characters remain.
!-

    WHILE CH$PTR_NEQ (.END_STRING, .POINT) DO
	BEGIN

	IF (CH$RCHAR (.POINT) EQL ASC_K_CR)
	THEN
!+
! The character is a carriage return.  Split the line, scrolling
! the screen if possible to make room for the new line.
!-
	    BEGIN
	    EDT$$SPLT_LNINS (1);
	    POINT = CH$PLUS (.POINT, 1);
	    END
	ELSE
	    BEGIN
!+
! The character is not a carriage return.  Insert the string of
! characters up to the end or to the next carriage return.
!-
	    MY_S = .POINT;

	    WHILE (CH$PTR_NEQ (.END_STRING, .POINT) AND (CH$RCHAR (.POINT) NEQ ASC_K_CR)) DO
		POINT = CH$PLUS (.POINT, 1);

	    IF (EDT$$INS_STR (.MY_S, CH$DIFF (.POINT, .MY_S)) EQL 0) THEN RETURN (0);

	    END;

	END;

    RETURN (1);
    END;


END
ELUDOM