Google
 

Trailing-Edge - PDP-10 Archives - bb-r775d-bm_tops20_ks_upd_4 - sources/rannext.bli
There are 10 other files named rannext.bli in the archive. Click here to see a list.
 %TITLE 'RANNEXT - next line in a range'
MODULE RANNEXT (				! Next line in a range
		IDENT = '3-002'			! File: RANNEXT.BLI Edit: CJG3002
		) =
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:
!
!	Get the next line in a range.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: February 3, 1978
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 19-FEB-1981.  This module was created by
!	extracting routine EDT$$NXT_LNRNG  from module RANGE.
! 1-003	- Use the ASSERT macro.  JBS 01-Jun-1981
! 1-004	- If this is an ALL range, it must have a search string.
!	   JBS 31-Oct-1981
! 1-005	- Use the new PREV_RANGE field to find the ALL string.  JBS 02-Nov-1981
! 1-006 - Modify the next range find for AND ranges.  SMB 15-Feb-1982
! 1-007 - Type .,-,- now works at the [EOB]. TMV 18-FEB-1982
! 1-008	- Regularize format.  JBS 04-May-1982
! 1-009	- Remove EDT$$A_STR_CMP.  JBS 16-Jul-1982
! 1-010 - Put calls to edt$$rng_nxtln in line. STS 17-Sep-1982
! 1-011 - Put edt$$tst_eob in line. STS 22-Sep-1982
! 1-012 - Remove reference to edt$$rng_posfrst. STS 11-Oct-1982
! 3-001 - Add updates from V3 sources.  GB 03-May-1983
! 3-002 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--

%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$NXT_LNRNG;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$NXT_LNRNG  - next line in a range'

GLOBAL ROUTINE EDT$$NXT_LNRNG (			! Get the next line in a range
    DELETED					! 1 = last line was deleted
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine returns the next line in a range.  The position
!	routine must have been called first if this routine is to
!	work properly.
!
! FORMAL PARAMETERS:
!
!  DELETED		Indicate whether the last line was deleted.
!
! IMPLICIT INPUTS:
!
!	RNG_CURRNG
!	RNG_EOL
!	RNG_MORELN
!	RNG_NOOFLN
!	SEA_STRLEN
!	WK_LN
!	EXCT_MATCH
!
! IMPLICIT OUTPUTS:
!
!	RNG_FRSTLN
!
! ROUTINE VALUE:
!
!	0 = No more lines exist in this range
!	1 = A line was sucessfully located
!
!
! SIDE EFFECTS:
!
!	The current text buffer is re-positioned.
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$RNG_REPOS,
	EDT$$CMP_LNO,
    	EDT$$RD_NXTLN,
	EDT$$STR_CMP;				! Compare two strings of equal length

    EXTERNAL
	RNG_CURRNG : REF NODE_BLOCK,	! The current range node
	RNG_EOL : LN_BLOCK,		! The line number at which this range ends
	RNG_MORELN,			! Used by EDT$$NXT_LNRNG  to indicate more lines.
	RNG_FRSTLN,			! Indicates first line in a range.
	RNG_NOOFLN,			! Count of number of lines in a range.
	SEA_STRLEN,			! Length of search string.
    	EOB_LN,
	EXCT_MATCH,			! The type of string matching
	WK_LN : REF LIN_BLOCK;		! The current line pointer.

    LABEL
	LOOP;

    LOCAL
	DEL_FLAG;

!+
! Get a local copy of the delete flag, since if this is an ALL range,
! we will loop, and the delete flag will be turned off after the first
! time though.
!-
    DEL_FLAG = .DELETED;
!+
! Loop until we find a line which contains the ALL string.  If no all
! string, we will get out the first time through.
!-
LOOP :
    BEGIN

    WHILE 1 DO
	BEGIN
!+
! If we are at the end of the buffer, or the RNG_MORELN  flag is zero,
! then there are no more lines.  Exit with a 0.
!-

	IF .RNG_MORELN EQL 0 THEN RETURN (0);

!+
! Case on the range type.
!-

	CASE .RNG_CURRNG [RAN_TYPE] FROM RAN_NULL TO NUM_RAN OF
	    SET
!+
! For all the single line ranges, if RNG_FRSTLN  is on, then return
! success and turn it off.  If it is not then check to see if it
! was part of an AND list; if so, position to the next line in
! the list.
!-

	    [RAN_NUMBER, RAN_DOT, RAN_STR, RAN_BEGIN, RAN_LAST, RAN_END, RAN_MINUS, RAN_PLUS, RAN_NULL,
		RAN_MINSTR, RAN_ORIG] :
		BEGIN

		IF .RNG_FRSTLN		!
		THEN
		    RNG_FRSTLN = 0
		ELSE

		    IF (.RNG_CURRNG [NEXT_RANGE] EQL 0)
		    THEN
			RETURN (0)
		    ELSE

			IF EDT$$RNG_REPOS (.RNG_CURRNG [NEXT_RANGE])
			THEN
			    RNG_FRSTLN = 0
			ELSE
			    RETURN (0);

		END;
!+
! For WHOLE or REST, just move to the next line.
!-

	    [RAN_WHOLE, RAN_REST] :
		BEGIN

		IF (.WK_LN EQLA EOB_LN) THEN RETURN (0);


    		IF NOT .DEL_FLAG
    		THEN
    		    IF (NOT .RNG_FRSTLN) 
    		    THEN
    			EDT$$RD_NXTLN()
    		    ELSE
    			RNG_FRSTLN = 0;

		END;
!+
! For FOR and SELECT, the range block contains the number of lines
! to include.  Count it down, returning failure if it becomes negative.
!-

	    [RAN_FOR, RAN_SELECT] :
		BEGIN

		IF (.WK_LN EQLA EOB_LN) THEN RETURN (0);

		RNG_CURRNG [RAN_VAL] = .RNG_CURRNG [RAN_VAL] - 1;

		IF (.RNG_CURRNG [RAN_VAL] LSS 0)
    		THEN 
    		    RETURN (0)
    		ELSE
    		    IF NOT .DEL_FLAG
    		    THEN
    			IF NOT .RNG_FRSTLN
    			THEN
    			    EDT$$RD_NXTLN()
    			ELSE
    			    RNG_FRSTLN = 0;
		END;
!+
! The THRU and BEFORE ranges have saved away the last line to be
! included.  Move to the next line in the range, then compare it
! to the last line number.  If it is greater, return failure.
!-

	    [RAN_THRU, RAN_BEFORE] :
		BEGIN

		IF (.WK_LN EQLA EOB_LN) THEN RETURN (0);

    		IF NOT .DEL_FLAG
    		THEN
    		    IF NOT .RNG_FRSTLN
    		    THEN
    			EDT$$RD_NXTLN()
    		    ELSE
    			RNG_FRSTLN = 0;

		IF (EDT$$CMP_LNO (WK_LN [LIN_NUM], RNG_EOL) GTR 0) THEN RETURN (0);

		END;

	    [INRANGE] :
	    ;					! some ranges (such as ALL) can never get here.

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

!+
! If there was an ALL, insure that the string exists in the line.
! If it does not, continue through the loop again looking either
! for one that does contain the string or the end of the range.
!-
	BEGIN

	BIND
	    ALL_RAN = .RNG_CURRNG [PREV_RANGE] : NODE_BLOCK;

	LOCAL
	    CH_POINT;

	IF (ALL_RAN EQLA 0) THEN LEAVE LOOP;

	IF ((ALL_RAN NEQA 0) AND (.WK_LN EQLA EOB_LN)) THEN RETURN (0);

	IF (.ALL_RAN [RAN_TYPE] NEQ RAN_ALL) THEN LEAVE LOOP;

!+
! An ALL range must have a string.
!-
	ASSERT (19, .ALL_RAN [STR_PNT] NEQA 0);
	CH_POINT = CH$PTR (WK_LN [LIN_TEXT],, BYTE_SIZE);

	DECR I FROM .WK_LN [LIN_LENGTH] - .SEA_STRLEN TO 0 DO

	    IF EDT$$STR_CMP (.CH_POINT, .ALL_RAN [STR_PNT], .ALL_RAN [RAN_VAL], .EXCT_MATCH)
	    THEN
		LEAVE LOOP			! This line has the string
	    ELSE
		CH_POINT = CH$PLUS (.CH_POINT, 1);	! Keep looking

	DEL_FLAG = 0;
	END;
	END;

    END;
!+
! Count one more line found in the range.
!-
    RNG_NOOFLN = .RNG_NOOFLN + 1;
    RETURN (1);
    END;					! of routine EDT$$NXT_LNRNG


END
ELUDOM