Google
 

Trailing-Edge - PDP-10 Archives - bb-r775d-bm_tops20_ks_upd_4 - 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) 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 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