Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/scrnewins.bli
There are 10 other files named scrnewins.bli in the archive. Click here to see a list.
 %TITLE 'SCRNEWINS - insert a line on the screen'
MODULE SCRNEWINS (				! Insert a line on the screen
		IDENT = '1-022'			! File: SCRNEWINS.BLI Edit: JBS1022
		) =
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 updates the screen information data structure to
!	reflect the insertion of a line.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Sharon M. Burlingame, CREATION DATE: September 15, 198E
!
! MODIFIED BY:
!
! 1-001	- Original.  SMB 15-Sep-1982.
! 1-002 - Remove the position parameter and assume EOB is last line.  SMB 06-Oct-1982
! 1-003 - Remove setting of SCR_PTR.  SMB 10-Oct-1982
! 1-004	- Add support for NOTRUNCATE mode.  JBS 11-Oct-1982
! 1-005	- Return the number of lines produced.  JBS 11-Oct-1982
! 1-006	- Fix a bug found by the QA system in finding a deleted line.  JBS 12-Oct-1982
! 1-007	- In NOTRUNCATE mode, leave room for the blob in lines after the first.  JBS 12-Oct-1982
! 1-008	- Fix call to EDT$$FMT_CHWID.  JBS 13-Oct-1982
! 1-009 - Use memory allocation counter.  SMB 18-Oct-1982
! 1-010	- When deleting lines from the screen data base, delete complete records.  JBS 23-Oct-1982
! 1-011	- If we delete the [EOB] line from the screen data base, clear the EOB pointer.  JBS 23-Oct-1982
! 1-012	- Allow up to five times the number of lines on the screen of screen data blocks.  JBS 24-Oct-1982
! 1-013	- [EOB] can only be inserted at the end of the screen data base.  JBS 24-Oct-1982
! 1-014	- Correct the code that uses the earliest deleted line.  JBS 25-Oct-1982
! 1-015	- Fix another bug in the code that searches for the earliest deleted line.  JBS 28-Oct-1982
! 1-016	- Maintain SCR_EDIT_MINPOS.  JBS 28-Oct-1982
! 1-017	- Use EDT$$SC_LNDEL to free a line block.  JBS 29-Oct-1982
! 1-018 - Add two parameters to help notruncate inserts.  SMB 03-Dec-1982
! 1-019	- Change the handling of SHF.  JBS 14-Dec-1982
! 1-020	- Fix tabbing at end of line in notruncate mode.  JBS 15-Dec-1982
! 1-021	- Remove the edit buffer.  JBS 27-Dec-1982
! 1-022	- Set the rebuild flag if we delete the cursor line.  JBS 03-Jan-1983
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$SC_LNINS;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$SC_LNINS  - insert a line on the screen'

GLOBAL ROUTINE EDT$$SC_LNINS (			! Insert a line on the screen
    SCRPTR, 					! Location above which to insert
    REC_ADDR, 					! Address of new line
    REC_LEN					! Length of new line
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	A record has been inserted, update screen line information structure
!	by indicating that the line(s) need to be repainted.  Get memory
!	from heap storage or the pool of available storage as needed.
!
! FORMAL PARAMETERS:
!
!  SCRPTR		insert the new line(s) just before this line
!
!  REC_ADDR 		the address of the new record
!
!  REC_LEN 		the length of the new record
!
! IMPLICIT INPUTS:
!
!	MEM_CNT
!	WK_LN
!	EOB_LN
!	CUR_BUF
!	FST_SCRPTR
!	LST_SCRPTR
!	CUR_SCRPTR
!	TI_WID
!	SHF
!	TRUN
!	SCR_LNS
!
! IMPLICIT OUTPUTS:
!
!	MEM_CNT
!	EOB_SCRPTR
!	FST_SCRPTR
!	CSR_SCRPTR
!	CUR_SCRLN
!	LNO_EMPTY
!	SCR_REBUILD
!	LST_SCRPTR
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$FMT_MSG : NOVALUE,			! Print a message
	EDT$$ALO_HEAP,				! Allocate heap storage
	EDT$$FMT_CHWID,				! Compute the width of a character
	EDT$$SC_LNDEL : NOVALUE;		! Free a line from the screen data base

    EXTERNAL
	MEM_CNT,				! Memory allocation count
	FST_AVLN : REF SCREEN_LINE,		! List of free screen lines
	WK_LN : REF LIN_BLOCK,			! Address of current workfile line
	EOB_LN,					! Address of EOB
	CUR_BUF : REF TBCB_BLOCK,		! Current text buffer control block
	EOB_SCRPTR : REF SCREEN_LINE,		! Pointer to EOB screen line
	FST_SCRPTR : REF SCREEN_LINE,		! Pointer to first screen line info
	LST_SCRPTR : REF SCREEN_LINE,		! Pointer to last screen line info
	CUR_SCRPTR : REF SCREEN_LINE,		! Pointer to the current screen line
	TRUN,					! 1 = truncate mode
	SHF,					! Screen shift amount
	TI_WID,					! Width of the terminal
	SCR_LNS,				! Number of lines on the screen
	CSR_SCRPTR : REF SCREEN_LINE,		! Current cursor line screen info
	CUR_SCRLN : LN_BLOCK,			! Absolute record number of that line
	LNO_EMPTY : LN_BLOCK,			! Special value for "empty" line number
	SCR_REBUILD;				! 1 = rebuild the screen data base from the work file

    MESSAGES ((INSMEM));

    MAP
	SCRPTR : REF SCREEN_LINE;

    LOCAL
	EDIT_CODE,				! Repaint or insert
	NEW_SCRPTR : REF SCREEN_LINE,		! Address of new line info
	PREV_SCRPTR : REF SCREEN_LINE,		! Address of previous line info
	INDX,					! Index for inserting multiple lines
	NEED_ANOTHER_LINE,			! 1 = another line needed for this record
	LEFT,					! Left character position for this line
	RIGHT,					! Right character position for this line
	CHAR,
	TXT,
	COL,
	LEN,
	NEW_ADDR;

    INDX = 0;					! Start with first line
    NEED_ANOTHER_LINE = 1;			! Always need at least one line
    LEFT = 0;					! Start the first line at position 0

    WHILE (.NEED_ANOTHER_LINE AND (.INDX LEQ 255)) DO
	BEGIN
!+
! If we are inserting before a line, look for deleted lines; use the earliest
! one found.
!-

	IF (.SCRPTR NEQA 0)
	THEN
	    BEGIN
	    NEW_SCRPTR = .SCRPTR [SCR_PRV_LINE];

	    IF (.NEW_SCRPTR NEQA 0)
	    THEN
		BEGIN

		IF ((.NEW_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)
		THEN
		    BEGIN

		    LOCAL
			FOUND_EARLIEST;

		    FOUND_EARLIEST = 0;

		    WHILE ( NOT .FOUND_EARLIEST) DO
			BEGIN
			PREV_SCRPTR = .NEW_SCRPTR [SCR_PRV_LINE];

			IF (.PREV_SCRPTR EQLA 0)
			THEN
			    FOUND_EARLIEST = 1
			ELSE
			    BEGIN

			    IF ((.PREV_SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)
			    THEN
				NEW_SCRPTR = .PREV_SCRPTR
			    ELSE
				FOUND_EARLIEST = 1;

			    END;

			END;

		    EDIT_CODE = SCR_EDIT_MODIFY;
		    END
		ELSE
		    NEW_SCRPTR = 0;

		END;

	    END
	ELSE
	    NEW_SCRPTR = 0;

	IF (.NEW_SCRPTR EQLA 0)
	THEN
	    BEGIN
	    MEM_CNT = .MEM_CNT + 1;	! Incremented each time entered
!+
! Unless there is available memory, get some from heap storage for the
! new screen line information buffer.
!-

	    IF (.FST_AVLN EQLA 0)
	    THEN
		BEGIN

		IF ( NOT EDT$$ALO_HEAP (%REF (SCR_SIZE*BYTES_PER_WORD), NEW_ADDR))
		THEN
		    BEGIN
		    SCR_REBUILD = 1;
		    EDT$$FMT_MSG (EDT$_INSMEM);
		    RETURN (0);
		    END;

		NEW_SCRPTR = .NEW_ADDR;
		END
	    ELSE
		BEGIN
		NEW_SCRPTR = .FST_AVLN;
		FST_AVLN = .NEW_SCRPTR [SCR_NXT_LINE];
		END;

	    EDIT_CODE = SCR_EDIT_INSLN;
!+
! If the screen information structure is empty, then initialize
! the screen pointers. Set up the first pointer as EOB if the
! current line is at the end of the buffer.
!-

	    IF (.FST_SCRPTR EQL 0)
	    THEN
		BEGIN
		FST_SCRPTR = .NEW_SCRPTR;
		LST_SCRPTR = .NEW_SCRPTR;
		NEW_SCRPTR [SCR_NXT_LINE] = 0;
		NEW_SCRPTR [SCR_PRV_LINE] = 0;
		END
	    ELSE
		BEGIN
!+
! Perform the insert above the given SCRPTR.  If that SCRPTR is
! zero, then insert the new line below the last screen pointer.
!-

		IF (.SCRPTR EQLA 0)
		THEN
		    BEGIN
		    NEW_SCRPTR [SCR_NXT_LINE] = 0;
		    NEW_SCRPTR [SCR_PRV_LINE] = .LST_SCRPTR;
		    LST_SCRPTR [SCR_NXT_LINE] = .NEW_SCRPTR;
		    LST_SCRPTR = .NEW_SCRPTR;
!+
! If we have exceeded our maximum screen line insert count, then
! remove the top screen record.
!-

		    WHILE ((.MEM_CNT GEQ (.SCR_LNS*5)) AND 	!
			(.FST_SCRPTR NEQA .NEW_SCRPTR)) DO
			BEGIN

			DO
			    BEGIN
!+
! Check for deleting the cursor line from the data base.  If this happens we will
! have to rebuild the screen data base.
!-

			    IF (.CSR_SCRPTR EQLA .FST_SCRPTR)
			    THEN
				BEGIN
				CSR_SCRPTR = 0;
				MOVELINE (LNO_EMPTY, CUR_SCRLN);
				SCR_REBUILD = 1;
				END;

			    EDT$$SC_LNDEL (.FST_SCRPTR);
			    END
			UNTIL ((.FST_SCRPTR [SCR_LINE_IDX] EQL 0) OR 	!
			    (.FST_SCRPTR EQLA .NEW_SCRPTR))

			END;

		    END
		ELSE
		    BEGIN
		    PREV_SCRPTR = .SCRPTR [SCR_PRV_LINE];
		    NEW_SCRPTR [SCR_PRV_LINE] = .PREV_SCRPTR;
		    NEW_SCRPTR [SCR_NXT_LINE] = .SCRPTR;

		    IF (.PREV_SCRPTR NEQA 0)
		    THEN
			PREV_SCRPTR [SCR_NXT_LINE] = .NEW_SCRPTR
		    ELSE
			BEGIN
			FST_SCRPTR = .NEW_SCRPTR;
!+
! If we have exceeded our maximum screen line insert count, then
! remove the bottom screen record.
!-

			WHILE ((.MEM_CNT GEQ (.SCR_LNS*5)) AND 	!
			    (.LST_SCRPTR NEQA .NEW_SCRPTR)) DO
			    BEGIN

			    DO
				BEGIN
!+
! Check for deleting the cursor line from the data base.  If this happens we will
! have to rebuild the screen data base.
!-

				IF (.CSR_SCRPTR EQLA .LST_SCRPTR)
				THEN
				    BEGIN
				    CSR_SCRPTR = 0;
				    MOVELINE (LNO_EMPTY, CUR_SCRLN);
				    SCR_REBUILD = 1;
				    END;

				EDT$$SC_LNDEL (.LST_SCRPTR);
				END
			    UNTIL ((.FST_AVLN [SCR_LINE_IDX] EQL 0) OR 	!
				(.LST_SCRPTR EQLA .NEW_SCRPTR));

			    END;

			END;

		    SCRPTR [SCR_PRV_LINE] = .NEW_SCRPTR;
		    END;

		END;

	    END;

!+
! Initialize the fields of the screen information block for repaint.
!-
	NEW_SCRPTR [SCR_EDIT_FLAGS] = .EDIT_CODE;
	NEW_SCRPTR [SCR_LINE_IDX] = .INDX;
	NEW_SCRPTR [SCR_EDIT_MINPOS] = 0;
	NEW_SCRPTR [SCR_EDIT_MAXPOS] = 255;
	NEW_SCRPTR [SCR_CHR_FROM] = .LEFT;
!+
! Compute the right character position of the current line.
!-

	IF ( NOT .TRUN)
	THEN
	    BEGIN

	    LOCAL
		WIDTH;

	    IF (.INDX 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.
!-
	    LEN = .REC_LEN - .LEFT;
	    TXT = CH$PTR (.REC_ADDR, .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 GTR 0)
	    THEN
		BEGIN
!+
! We need another line.
!-
		NEED_ANOTHER_LINE = 1;
		LEFT = .RIGHT + 1;
		END
	    ELSE
		BEGIN
!+
! We don't need another line.
!-
		NEED_ANOTHER_LINE = 0;
		RIGHT = 255;
		END;

	    END
	ELSE
	    BEGIN
!+
! Truncate mode, we never need more than one line.
!-
	    NEED_ANOTHER_LINE = 0;
	    RIGHT = 255;
	    END;

	NEW_SCRPTR [SCR_CHR_TO] = .RIGHT;
!+
! If there is no current screen pointer, make this line the current line.
!-

	IF (.CUR_SCRPTR EQLA 0) THEN CUR_SCRPTR = .NEW_SCRPTR;

	INDX = .INDX + 1;
	END;

    IF ((.WK_LN EQLA EOB_LN) AND (.SCRPTR EQLA 0)) THEN EOB_SCRPTR = .NEW_SCRPTR;

!+
! Return the number of lines produced.
!-
    RETURN (.INDX);
    END;					! of routine EDT$$SC_LNINS

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

ELUDOM