Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/wfreplin.bli
There are 10 other files named wfreplin.bli in the archive. Click here to see a list.
 %TITLE 'WFREPLIN - replace the current line'
MODULE WFREPLIN (				! Replace the current line
		IDENT = '3-002'			! File: WFREPLIN.BLI Edit: GB3002
		) =
BEGIN
!COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1981, 1988.  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 THAT IS NOT SUPPLIED BY DIGITAL.
!
!
!++
! FACILITY:	EDT -- The DEC Standard Editor
!
! ABSTRACT:
!
!	Replace the current line with a specified line.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: October 16, 1978
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 23-Feb-1981.  This module was created by
!	extracting routine EDT$$RPL_LN  from module EDTWF.
! 1-002	- Regularize headers.  JBS 19-Mar-1981
! 1-003 - Change index for line numbers from 10 to 15.  SMB 18-Jan-1982
! 1-004 - Remove original line numbers.  SMB 28-Jan-1982
! 1-005	- Do most replaces without doing delete/insert, to improve
!	   performance, especially when updating the screen.  JBS 04-Oct-1982
! 1-006	- Preserve EDT$$A_SEL_POS if we must delete and then insert.  JBS 09-Nov-1982
! 1-007	- Don't disturb the screen data base if we must delete and then insert.  JBS 01-Dec-1982
! 3-001 - Change EDT$$CPY_MEM to EDT$$CPY_STR and make changes for word addressing.  GB 09-May-1983
! 3-002 - Fix calculation of buffer end and line size. CJG 8-Jun-1983
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$RPL_LN : NOVALUE;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$RPL_LN  - replace the current line'

GLOBAL ROUTINE EDT$$RPL_LN (			! Replace the current line
    NEWLINE, 					! Address of the new line
    LEN						! Length of the new line (in bytes)
    ) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Replace the current line.  If the replacement line is the same size as
!	the current line, just copy the new one in its place, otherwise, delete
!	the current line and insert the new one.
!
! FORMAL PARAMETERS:
!
!  NEWLINE 		a pointer to the new line
!
!  LEN 			its length
!
! IMPLICIT INPUTS:
!
!	WK_INSCNT
!	WK_LN
!	WK_MODFD
!	LNO0
!	CUR_BUF
!	WK_BUK
!
!IMPLICIT OUTPUTS:
!
!	WK_INSCNT
!	WK_LN
!	CUR_BUF
!	WK_BUK
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$DEL_CURLN : NOVALUE,
	EDT$$INS_LN : NOVALUE,
	EDT$$RD_PRVLN;

    EXTERNAL
	WK_INSCNT : LN_BLOCK,		! The count of inserted lines
	WK_LN : REF LIN_BLOCK,		! Pointer to current line
	WK_MODFD,			! Flag indicating bucket was modified
	LNO0 : LNOVECTOR [14],		! 48-bit line numbers
	CUR_BUF : REF TBCB_BLOCK,	! Current text buffer control block
	WK_BUK : REF BLOCK [WF_BUKT_SIZE] FIELD (WFB_FIELDS),
	SEL_POS,			! Select position
	SCR_REBUILD;			! 1 = don't touch the screen data base

    LOCAL
	SAVE_LIN : LN_BLOCK,
	SAVE_SELPOS,
	OLD_LEN,			! Length of the old line (in bytes)
	REP_LEN,			! Length of new line (in words)
	CUR_LEN,			! Length of old line (in words)
	SOURCE,
	REMAINING,
	SAVE_REBUILD;

!+
! Check for a replacement which does not change the length of the
! line, and leave the work-file block structure unaltered.  This
! is not done only for speed; EDT will break if it is removed.
!-
    OLD_LEN = .WK_LN [LIN_LENGTH];

    IF (.OLD_LEN EQL .LEN)
    THEN
	BEGIN
	EDT$$CPY_STR (.LEN, .NEWLINE, CH$PTR (WK_LN [LIN_TEXT], 0, BYTE_SIZE));
	WK_MODFD = 1;
	RETURN;
	END;

!+
! Check for a replacement which neither empties the block nor causes it
! to overflow.  Do such a replacement directly in the block, without
! calling the more general routines which delete and insert lines.
!-

    REP_LEN = (.LEN + BYTES_PER_WORD - 1) / BYTES_PER_WORD + LIN_FIXED_SIZE + 1;
    CUR_LEN = .WK_LN [LIN_NEXT];
    IF (((.WK_BUK [WFB_END] - .CUR_LEN + .REP_LEN) LSS WF_BUKT_SIZE) AND
	(.CUR_BUF [TBCB_LINE_ADDR] NEQ .WK_BUK [WFB_END]) AND 	!
	(.CUR_BUF [TBCB_LINE_ADDR] NEQ WFB_FIXED_SIZE))
    THEN
	BEGIN
!+
! Update the character count for this buffer.
!-
	CUR_BUF [TBCB_CHAR_COUNT] = .CUR_BUF [TBCB_CHAR_COUNT] - .OLD_LEN + .LEN;
!+
! Make room in the block for the line.  This may require either increasing or decreasing
! the amount of space now available.
!-
	SOURCE = .WK_LN + .CUR_LEN;
	REMAINING = .WK_BUK [WFB_END] - .CUR_BUF [TBCB_LINE_ADDR] - .CUR_LEN;
	WK_BUK [WFB_END] = .WK_BUK [WFB_END] - .CUR_LEN + .REP_LEN;

	IF (.REMAINING NEQ 0)			!
	THEN
	    EDT$$CPY_MEM (ABS (.REMAINING), .SOURCE, .WK_LN + .REP_LEN);

!+
! Insert the text into the buffer and update the line lengths
!-
	WK_LN [LIN_LENGTH] = .LEN;
	WK_LN [LIN_NEXT] = .REP_LEN;
	CH$FILL (0, .REP_LEN - (LIN_FIXED_SIZE + 1), CH$PTR (WK_LN [LIN_TEXT], 0, 36));
	CH$MOVE (.LEN, .NEWLINE, CH$PTR (WK_LN [LIN_TEXT], 0, BYTE_SIZE));
	.WK_LN + .REP_LEN - 1 = .REP_LEN;
	WK_MODFD = 1;
	RETURN;
	END;

!+
! This is a complex case.  Delete the old line and insert the new one.
!-
    MOVELINE (WK_LN [LIN_NUM], SAVE_LIN);
    SAVE_SELPOS = .SEL_POS;
    SAVE_REBUILD = .SCR_REBUILD;
    SCR_REBUILD = 1;
    EDT$$DEL_CURLN ();
    EDT$$INS_LN (.NEWLINE, .LEN);
    EDT$$RD_PRVLN ();
    SCR_REBUILD = .SAVE_REBUILD;
    SEL_POS = .SAVE_SELPOS;
    MOVELINE (SAVE_LIN, WK_LN [LIN_NUM]);
    SUBLINE (LNO0, WK_INSCNT, WK_INSCNT);
    RETURN;
    END;					! of routine EDT$$RPL_LN

!<BLF/PAGE>
END						! of module EDT$WFREPLIN

ELUDOM