Google
 

Trailing-Edge - PDP-10 Archives - BB-AE97C-BM - sources/scrfind.bli
There are 10 other files named scrfind.bli in the archive. Click here to see a list.
 %TITLE 'SCRFIND - find a record in the screen structure'
MODULE SCRFIND (				! Find a screen record
		IDENT = '3-001'			! File: SCRFIND.BLI Edit: CJG3001
		) =
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 searches for a record in the screen
!	data structure.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: John Sauter CREATION DATE: 13-Sep-1982
!
! MODIFIED BY:
!
! 1-001 - Original.  This module was created by extracting the search code from
!	  EDT$CHMMRKCHG.  SMB 22-Sep-1982
! 1-002 - Add some parameters and extra code to original extracted version.
!	  SMB  22-Sep-1982
! 1-003 - Change the parameters passed.  SMB 28-Sep-1982
! 1-004 - Modify to use new 48 bit macros. STS 01-Oct-1982
! 1-005 - Search for EOB differently.  SMB 05-Oct-1982
! 1-006 - Modify to return value of screen pointer found.  SMB 08-Oct-1982
! 1-007 - Increment and decrement displacement on lines equal.  SMB 12-Oct-1982
! 1-008 - Modify to use new compare macro. STS 20-Oct-1982
! 1-009	- Deleted lines have the record number of the next line.  JBS 25-Oct-1982
! 1-010 - Modify search for bottom line of a record.  SMB 28-Oct-1982
! 1-011 - Fix a bug in notruncate mode.  SMB 24-Nov-1982
! 1-012	- Worry about deleted lines when scanning backwards.  JBS 25-Nov-1982
! 1-013	- Remove the edit buffer.  JBS 27-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$$SC_FNDREC;				! Fins a screen record

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$SC_FNDREC - find a record in the screen data structure'

GLOBAL ROUTINE EDT$$SC_FNDREC (			! Find a screen record
    POSITION, 					! Position on the line
    DISPLACEMENT				! Displacement from cursor screen line
    ) : =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Given the current record number, determine if it has a corresponding
!	screen block in the screen data structure.  If so, return
!	the address.
!
! FORMAL PARAMETERS:
!
!  POSITION		The position on the line at which the operation takes place
!
!  DISPLACEMENT		The displacement of the current line info block from the cursor line info block
!
! IMPLICIT INPUTS:
!
!	LST_SCRPTR
!	EOB_SCRPTR
!	LWK_LN
!	EOB_LN
!	CSR_SCRPTR
!	CUR_BUF
!	CUR_SCRLN
!	SCR_BUF
!
! IMPLICIT OUTPUTS:
!
!	NONE
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL
	LNO0,
	LST_SCRPTR : REF SCREEN_LINE,		! Last screen info pointer
	EOB_LN,					! Address of EOB line
	WK_LN,					! Current workfile line
	EOB_SCRPTR : REF SCREEN_LINE,		! EOB screen pointer
	CSR_SCRPTR : REF SCREEN_LINE,		! Pointer to cursor line screen info
	CUR_BUF : REF TBCB_BLOCK,		! Current text buffer control block
	CUR_SCRLN : LN_BLOCK,			! Record number of current screen linM
	SCR_BUF : REF TBCB_BLOCK;		! Current screen buffer

    EXTERNAL ROUTINE
	EDT$$CMP_LNO;				! Compare line numbers

    LOCAL
	DISP,					! Displacement temporary
	SCRPTR : REF SCREEN_LINE,		! Pointer to our screen line
	RECORD_NO : LN_BLOCK,			! Record number of our screen line
	FOUND_LINE;

!+
! If the screen buffer is different from the current buffer then bail out.
! None of the lines in the current buffer can be on the screen.
!-
    DISP = 0;
    FOUND_LINE = 0;

    IF (.CUR_BUF EQLA .SCR_BUF)
    THEN
	BEGIN
!+
! Find our screen line block.
!-
	SCRPTR = .CSR_SCRPTR;
!+
! First check to see if we are searching for EOB on the screen.
!-

	IF (.WK_LN EQLA EOB_LN)
	THEN
	    BEGIN

	    IF (.LST_SCRPTR NEQA .EOB_SCRPTR)
	    THEN
		FOUND_LINE = 0
	    ELSE
		BEGIN
		FOUND_LINE = 1;

		WHILE (.SCRPTR NEQA .EOB_SCRPTR) DO
		    BEGIN
		    SCRPTR = .SCRPTR [SCR_NXT_LINE];
		    DISP = .DISP + 1;
		    END;

		END;

	    END
	ELSE
	    BEGIN
	    MOVELINE (CUR_SCRLN, RECORD_NO);

	    WHILE (( NOT .FOUND_LINE) AND (.SCRPTR NEQA 0)) DO

		CASE EDT$$CMP_LNO (RECORD_NO, CUR_BUF [TBCB_CUR_LIN]) FROM -1 TO 1 OF
		    SET

		    [-1] : 			! Cursor line is before current line
			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
				ADDLINE (LNO0, RECORD_NO, RECORD_NO);

			    END;

			DISP = .DISP + 1;
			SCRPTR = .SCRPTR [SCR_NXT_LINE];
			END;

		    [0] : 			! Cursor line is the current line
			BEGIN

			IF ((.SCRPTR [SCR_CHR_FROM] LEQ .POSITION)	!
			    AND (.SCRPTR [SCR_CHR_TO] GEQ .POSITION)	!
			    AND ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) EQL 0))
			THEN
			    FOUND_LINE = 1
			ELSE
			    BEGIN

			    IF ((.SCRPTR [SCR_EDIT_FLAGS] AND SCR_EDIT_DELLN) NEQ 0)
			    THEN
				BEGIN
!+
! This is a deleted record; the record we want is the first non-deleted record after it.
!-
				SCRPTR = .SCRPTR [SCR_NXT_LINE];
				END
			    ELSE
				IF (.POSITION GTR .SCRPTR [SCR_CHR_TO])
				THEN
				    BEGIN
!+
! This line is continued, the line we want is further down the screen.
!-
				    SCRPTR = .SCRPTR [SCR_NXT_LINE];	! Move forward
				    DISP = .DISP + 1;
				    END
				ELSE
				    BEGIN
!+
! This is a continuation line, the line we want is further up the screen.
!-
				    ASSERT (7, .POSITION LSS .SCRPTR [SCR_CHR_FROM]);
				    SCRPTR = .SCRPTR [SCR_PRV_LINE];	! Move backward
				    DISP = .DISP - 1;
				    END;

			    END;

			END;

		    [1] :		! Cursor line is after the current line
			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
				    SUBLINE (LNO0, RECORD_NO, RECORD_NO);
				END;

			    END;

			DISP = .DISP - 1;
			SCRPTR = .SCRPTR [SCR_PRV_LINE];
			END;

		    [OUTRANGE] :
			ASSERT (7, 0);

		    TES;

	    END;

	END;

!+
! If FOUND_LINE is not set, the record does not appear on the screen.
! In that case return zero.
!-

    .DISPLACEMENT = .DISP;

    IF .FOUND_LINE THEN RETURN (.SCRPTR) ELSE RETURN (0);

    END;				! Of routine EDT$$SC_FNDREC

END

ELUDOM