Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/fixnotrun.bli
There are 10 other files named fixnotrun.bli in the archive. Click here to see a list.
 %TITLE 'FIXNOTRUN - Fix screen data base in NOTRUNCATE mode'
MODULE FIXNOTRUN (				! Fix screen data base in NOTRUNCATE mode
		IDENT = '3-001'			! File: FIXNOTRUN.BLI Edit: CJG3001
		) =
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:
!
!	This module fixes up the screen data base if we are in NOTRUNCATE mode.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: John Sauter, CREATION DATE: November 1, 1983
!
! MODIFIED BY:
!
! 1-001	- Original.  This is a stub which always forces the data base to be rebuilt.
!	   JBS 01-Nov-1982
! 1-002	- Enable this routine.  JBS 02-Nov-1982
! 1-003	- Fix a problem in counting records.  JBS 09-Nov-1982
! 1-004 - Fix backwards search bug.  SMB 23-Nov-1982
! 1-005	- Worry about deleted lines when scanning backwards.  JBS 25-Nov-1982
! 1-006	- Revise handling of EDT$$G_SHF.  JBS 14-Dec-1982
! 1-007	- Fix tabbing at the end of a line.  JBS 15-Dec-1982
! 1-008	- Remove the edit buffer.  JBS 27-Dec-1982
! 1-009	- Fix a bug in finding the current screen pointer which caused excessive rebuilding.  JBS 30-Dec-1982
! 3-001 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$FIX_NOTRUNC : NOVALUE;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$FIX_NOTRUNC - fix screen data base in NOTRUNCATE mode'

GLOBAL ROUTINE EDT$$FIX_NOTRUNC 		! Fix screen data base in NOTRUNCATE mode
    : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Fix the screen data base if we are in NOTRUNCATE mode.  If a character is
!	inserted on a line, or deleted from a line, or even replaced (since characters
!	have different widths), the limits of this line must be recomputed.  If this line's
!	limits change the limits of the next line may also change.
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	LN_PTR
!	LN_BUF
!	CUR_SCRPTR
!	FST_SCRPTR
!	FST_AVLN
!	CUR_SCRLN
!	SCR_BUF
!	CUR_BUF
!	CS_LN
!	CUR_SCRLN
!	CSR_SCRPTR
!	WK_LN
!	MEM_CNT
!	SHF
!	TI_WID
!
! IMPLICIT OUTPUTS:
!
!	SCR_REBUILD
!	FST_AVLN
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	MANY
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$CMP_LNO,			! compare line numbers
	EDT$$SC_MOVTOLN,		! Move to a record in the work file relative to the current record
	EDT$$FMT_CHWID,				! Compute the width of a character
	EDT$$SC_FNDREC;				! Find the screen pointer for the current record

    EXTERNAL
	LN_PTR,				! Current line character position
	LN_BUF,				! Current line buffer
	SCR_REBUILD,			! Rebuild the screen data base
	FST_SCRPTR : REF SCREEN_LINE,	! First screen line info address
	FST_AVLN : REF SCREEN_LINE,	! List of available lines
	LNO_EMPTY : REF LN_BLOCK,
	CUR_SCRLN : REF LN_BLOCK,
	SCR_BUF : REF TBCB_BLOCK,
	CUR_BUF : REF TBCB_BLOCK,
	CS_LN : REF LN_BLOCK,
	CSR_SCRPTR : REF SCREEN_LINE,
	WK_LN : REF LIN_BLOCK,
	MEM_CNT,
	SHF,				! Number of columns shifted
	TI_WID;

    LOCAL
	SCRPTR : REF SCREEN_LINE,		! Address of a current screen line buffer
	NXT_SCRPTR : REF SCREEN_LINE,		! Address of next screen line buffer
	REC_NO,					! Current relative reocrd number
	FST_RECNO,			! Relative record number of first line in the screen data base
	UPDATE_DONE,
	ANOTHER_PASS,
	WIDTH,
	DISP,
	COL,
	LEFT,
	RIGHT,
	DIR,
	TXT,
	CHAR,
	LEN;

!+
! If we are already going to rebuild the screen data base, just return.
!-

    IF .SCR_REBUILD THEN RETURN;

!+
! Compute the direction of motion.
!-

    IF (EDT$$CMP_LNO (LNO_EMPTY, CUR_SCRLN) EQL 0) OR (.SCR_BUF NEQA .CUR_BUF)
    THEN
	DIR = 1
    ELSE
	DIR = EDT$$CMP_LNO (CS_LN, CUR_SCRLN);

!+
! Find the relative record number of the old cursor line.
! We must be careful of deleted lines.  The convention is that a deleted line
! has the record number of the next lower line.  This prevents deleted
! lines before record zero from having negative absolute record numbers.
!-
    SCRPTR = EDT$$SC_FNDREC (CH$DIFF (.LN_PTR, CH$PTR (LN_BUF,, BYTE_SIZE)), DISP);

    IF (.SCRPTR EQLA 0)
    THEN
	BEGIN
	SCR_REBUILD = 1;
	RETURN;
	END;

    REC_NO = 0;

    CASE .DIR FROM -1 TO 1 OF
	SET

	[1] :
	    BEGIN
!+
! The new line is after the old.  We must move back in the work file.
!-

	    DO
		BEGIN

		IF ((.SCRPTR [SCR_LINE_IDX] EQL 0) OR ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0))
		THEN
		    BEGIN

		    LOCAL
			PREV_SCRPTR : REF SCREEN_LINE;

		    PREV_SCRPTR = .SCRPTR [SCR_PRV_LINE];

		    IF (.PREV_SCRPTR NEQA 0)
		    THEN
			BEGIN

			IF ((.PREV_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0)
			THEN
			    REC_NO = .REC_NO - 1;

			END;

		    END;

		SCRPTR = .SCRPTR [SCR_PRV_LINE];
		END
	    UNTIL ((.SCRPTR EQLA .CSR_SCRPTR) OR (.SCRPTR EQLA 0));

	    END;

	[0] :
	    BEGIN
!+
! We are positioned correctly in the work file.
!-
	    SCRPTR = .CSR_SCRPTR;
	    END;

	[-1] :
	    BEGIN
!+
! The new line is before the old.  We must move forward in the work file.
!-

	    DO
		BEGIN

		LOCAL
		    NEXT_SCRPTR : REF SCREEN_LINE;

		NEXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];

		IF (.NEXT_SCRPTR NEQA 0)
		THEN
		    BEGIN

		    IF (((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) AND 	!
			((.NEXT_SCRPTR [SCR_LINE_IDX] EQL 0) OR 	!
			((.NEXT_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)))
		    THEN
			REC_NO = .REC_NO + 1;

		    END;

		SCRPTR = .SCRPTR [SCR_NXT_LINE];
		END
	    UNTIL ((.SCRPTR EQLA .CSR_SCRPTR) OR (.SCRPTR EQLA 0));

	    END;

	[OUTRANGE] :
	    ASSERT (11, 0);
	TES;

!+
! If we couldn't find it, rebuild the screen data base.
!-

    IF (.SCRPTR NEQA .CSR_SCRPTR)
    THEN
	BEGIN
	SCR_REBUILD = 1;
	RETURN;
	END;

!+
! Now work backwards to the first line.
!-

    WHILE ((.SCRPTR NEQA .FST_SCRPTR) AND (.SCRPTR NEQA 0)) DO
	BEGIN

	IF ((.SCRPTR [SCR_LINE_IDX] EQL 0) OR ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0))
	THEN
	    BEGIN

	    LOCAL
		PREV_SCRPTR : REF SCREEN_LINE;

	    PREV_SCRPTR = .SCRPTR [SCR_PRV_LINE];

	    IF (.PREV_SCRPTR NEQA 0)
	    THEN
		BEGIN

		IF ((.PREV_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) THEN REC_NO = .REC_NO - 1;

		END;

	    END;

	SCRPTR = .SCRPTR [SCR_PRV_LINE];
	END;

    FST_RECNO = .REC_NO;
!+
! If we didn't find it, rebuild the screen data base.
!-

    IF (.SCRPTR NEQA .FST_SCRPTR)
    THEN
	BEGIN
	SCR_REBUILD = 1;
	RETURN;
	END;

!+
! Recompute the end points of any lines which have changed.
!-

    DO
	BEGIN
	ANOTHER_PASS = 0;
	REC_NO = .FST_RECNO;
	SCRPTR = .FST_SCRPTR;

	DO
	    BEGIN
	    UPDATE_DONE = 0;

	    IF ((.SCRPTR [SCR_EDIT_FLAGS] AND (SCR_EDIT_MODIFY OR SCR_EDIT_INSLN)) NEQ 0)
	    THEN
		BEGIN
!+
! Compute the width of the current line.
!-
		LEFT = .SCRPTR [SCR_CHR_FROM];

		IF (.LEFT EQL 0)
		THEN
		    BEGIN
		    WIDTH = .TI_WID + .SHF;
		    COL = 0;
		    END
		ELSE
		    BEGIN
		    WIDTH = .TI_WID + .SHF;
		    COL = .SHF + 2;
		    END;

!+
! We must compute the width of each character to see how many will fit.
!-
		ASSERT (12, EDT$$SC_MOVTOLN (.REC_NO));
		LEN = .WK_LN [LIN_LENGTH] - .LEFT;
		TXT = CH$PTR (WK_LN [LIN_TEXT], .LEFT, BYTE_SIZE);
		RIGHT = .LEFT - 1;
		CHAR = CH$RCHAR_A (TXT);

		WHILE ((.LEN GTR 0) AND ((.COL + EDT$$FMT_CHWID (.CHAR, .COL)) LEQ .WIDTH)) DO
		    BEGIN
		    LEN = .LEN - 1;
		    RIGHT = .RIGHT + 1;
		    COL = .COL + EDT$$FMT_CHWID (.CHAR, .COL);
		    CHAR = CH$RCHAR_A (TXT);
		    END;

		IF (.LEN EQL 0) THEN RIGHT = 255;

		IF (.SCRPTR [SCR_CHR_TO] NEQ .RIGHT)
		THEN
		    BEGIN
!+
! This line's width has changed.  Store the new width and
! arrange to recompute the width of the next line.
!-
		    SCRPTR [SCR_CHR_TO] = .RIGHT;
		    NXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];
!+
! If there is no next line in the screen data base and we need one, do it the hard way.
!-

		    IF (.RIGHT NEQ 255)
		    THEN
			BEGIN

			IF (.NXT_SCRPTR EQLA 0)
			THEN
			    BEGIN
			    EDT$$SC_MOVTOLN (0);
			    SCR_REBUILD = 1;
			    RETURN;
			    END;

!+
! If there isn't another line already for this record, and we need one,
! do it the hard way.
! Perhaps someday we'll allocate another screen line block here.
!-

			IF (.NXT_SCRPTR [SCR_CHR_FROM] EQL 0)
			THEN
			    BEGIN
			    EDT$$SC_MOVTOLN (0);
			    SCR_REBUILD = 1;
			    RETURN;
			    END;

			NXT_SCRPTR [SCR_CHR_FROM] = .RIGHT + 1;
			NXT_SCRPTR [SCR_EDIT_MINPOS] = 0;
			NXT_SCRPTR [SCR_EDIT_MAXPOS] = 255;
			NXT_SCRPTR [SCR_EDIT_FLAGS] = .NXT_SCRPTR [SCR_EDIT_FLAGS] OR SCR_EDIT_MODIFY;
			END
		    ELSE
			BEGIN
!+
! We have reached the end of the record, make sure there isn't
! another line allocated for it.
!-
			NXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];

			IF (.NXT_SCRPTR NEQA 0)
			THEN
			    BEGIN

			    IF (.NXT_SCRPTR [SCR_CHR_FROM] NEQ 0)
			    THEN
				BEGIN
				EDT$$SC_MOVTOLN (0);
				SCR_REBUILD = 1;
				RETURN;
				END;

			    END;

			END;

		    END;

		END;

	    IF ( NOT .UPDATE_DONE)
	    THEN
		BEGIN

		IF (.SCRPTR [SCR_NXT_LINE] EQLA 0)
		THEN
		    UPDATE_DONE = 1
		ELSE
		    BEGIN

		    LOCAL
			NEXT_SCRPTR : REF SCREEN_LINE;

		    NEXT_SCRPTR = .SCRPTR [SCR_NXT_LINE];

		    IF (.NEXT_SCRPTR NEQA 0)
		    THEN
			BEGIN

			IF (((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0) AND 	!
			    ((.NEXT_SCRPTR [SCR_LINE_IDX] EQL 0) OR 	!
			    ((.NEXT_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)))
			THEN
			    REC_NO = .REC_NO + 1;

			END;

		    SCRPTR = .SCRPTR [SCR_NXT_LINE];
		    END;

		END;

	    END
	UNTIL .UPDATE_DONE;

	END
    UNTIL ( NOT .ANOTHER_PASS);

    EDT$$SC_MOVTOLN (0);
    END;					! of routine EDT$$SC_UPD

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

ELUDOM