Google
 

Trailing-Edge - PDP-10 Archives - BB-R775E-BM - sources/edt/lsub.bli
There are 10 other files named lsub.bli in the archive. Click here to see a list.
 %TITLE 'LSUB - SUBSTITUTE in one line of text'
MODULE LSUB (				! SUBSTITUTE in one line of text
		IDENT = '3-002'			! File: LSUB.BLI Edit: GB3002
		) =
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 scans a line of text for a match with the
!	search string.  If found, it performs the substitution.
!	This is used by the line mode commands SUBSTITUTE
!	and SUBSTITUTE NEXT.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: February 3, 1978
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 30-JAN-1981.  This module was created by
!	extracting the routine SUBSTITUTE from the module EXEC.BLI.
! 1-002 - DJS 16-MAR-1981.  Before the SUBSTITUTE search string is
!	compared to part of a text line, an additional test was added
!	to ensure that there is enough text left on the line to make
!	a match possible.  Previously, it was possible for data beyond
!	the end-of-line to be included in the string match.
! 1-003	- Regularize headers.  JBS 20-Mar-1981
! 1-004	- Use the new message codes.  JBS 06-Aug-1981
! 1-005 - Force cursor to remain positioned less than 256 characters 
!	from the beginning of the line.  Previously,, string substitution
!	could leave the cursor after the end of the line.
!	STS 17-Sep-1981
!	with them.  GB 22-Feb-1983
! 1-006	- Remove EDT$$A_STR_CMP.  JBS 16-Jul-1982
! 1-007	- Mark the line changed in the screen data base.  JBS 01-Dec-1982
! 1-008	- Change the call to EDT$$MRK_LNCHG.  JBS 27-Dec-1982
! 3-001 - Use string pointers correctly and don't try to do arithmetic
! 3-002 - Make argument to RPL_LN a string ptr.  GB 16-Mar-1983
! 3-003 - Add updates from V3 sources.  GB 29-Apr-1983
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$SUB_NXT : NOVALUE;			! Do a substitution within one line of text

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$SUB_NXT  - substitute in one line of text'

GLOBAL ROUTINE EDT$$SUB_NXT (			! substitute in one line of text
	SINGLE, 				! 1 = just do one substitution
	START_POS				! start searching here
    ) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Do substitutions in one line of text.  This routine scans the current
!	line of text, starting at the character position START_POS, looking
!	for a string that matches the search string.  If it is found, that string
!	is replaced by the subsitute string.  If the SINGLE flag is on,
!	it returns after one substitution, otherwise all matches in the line are substituted.
!
! FORMAL PARAMETERS:
!
!  SINGLE		1 = just do one substitution
!
!  START_POS		where to start the search
!
! IMPLICIT INPUTS:
!
!	CUR_BUF
!	LN_BUF
!	SEA_STRLEN
!	SEA_STR
!	SUB_STR
!	SUB_STRLEN
!	WK_LN
!	EXE_QRYQUIT
!	EXE_SUBCNT
!	EXE_SBITS
!	EXCT_MATCH
!
! IMPLICIT OUTPUTS:
!
!	LN_LEN
!	EXE_SUBCNT
!
! ROUTINE VALUE:
!
!	NONE
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$FMT_MSG,
	EDT$$PUT_CH : NOVALUE,
	EDT$$PROC_QRYQAL,
	EDT$$RPL_LN,
	EDT$$TY_CURLN,
	EDT$$STR_CMP,				! Compare strings of equal length
	EDT$$MRK_LNCHG : NOVALUE;		! Mark the line changed in the screen data base

    EXTERNAL
	CUR_BUF : REF TBCB_BLOCK,
	LN_BUF : VECTOR [CH$ALLOCATION (255, BYTE_SIZE)],
	LN_LEN,
	SEA_STRLEN,
	SEA_STR,
	SUB_STR,
	SUB_STRLEN,
	WK_LN : REF LIN_BLOCK,
	EXE_QRYQUIT,
	EXE_SUBCNT,			! No. of substitutions done.
	EXE_SBITS,			! The options switches.
	EXCT_MATCH;			! Type of string matching

    MESSAGES ((LINEXC255));

    LOCAL
	OLD,					! Pointer to the original line
	END_LINE,				! Pointer to end of the line
	OLD_LEN,				! Length of original line
	REPPOINT,				! Pointer to the replacement string
	NEW_POS,				! Character position after last subs.
	CHANGED,				! Flag indicating this line was changed.
	THIS_CHAR_CHANGED;			! Flag indicating this character was changed

!+
! Get a local pointer to the line and its length;
!-
    OLD = CH$PTR (WK_LN [LIN_TEXT],, BYTE_SIZE);
    OLD_LEN = .WK_LN [LIN_LENGTH];
!+
! Initialize the length of the new line, changed flag and position of
! last SUBSTITUTE.
!-
    LN_LEN = 0;
    CHANGED = 0;
    NEW_POS = 0;
!+
! Get a pointer to the end of the old line.
!-
    END_LINE = CH$PTR (WK_LN [LIN_TEXT], .WK_LN [LIN_LENGTH], BYTE_SIZE);
!+
! Loop until either we finish the line or the new line exceed 255 chars.
!-

    WHILE ((CH$DIFF (.END_LINE, .OLD) GTR 0) AND (.LN_LEN LSS 256)) DO
	BEGIN
	THIS_CHAR_CHANGED = 0;
!+
! Look for a match if the position is greater or equal to
! start position.
!-

	IF ((.LN_LEN GEQ .START_POS) AND 	!
	    ((CH$DIFF (.END_LINE, .OLD) - .SEA_STRLEN) GEQ 0) AND 	!
	    ( NOT .EXE_QRYQUIT) AND 	!
	    ( NOT (.SINGLE AND .CHANGED)))
	THEN

	    IF EDT$$STR_CMP (.OLD, CH$PTR (SEA_STR,, BYTE_SIZE), .SEA_STRLEN, .EXCT_MATCH)
	    THEN

		IF EDT$$PROC_QRYQAL (.OLD, .END_LINE)
		THEN
		    BEGIN
!+
! A match was found.  Set flag indicating that a change has been
! made and increment the count.
!-
		    THIS_CHAR_CHANGED = 1;
		    CHANGED = 1;
		    EXE_SUBCNT = .EXE_SUBCNT + 1;
!+
! Mark the line as changed in the screen data base.
!-
		    EDT$$MRK_LNCHG (SCR_EDIT_MODIFY, .LN_LEN);
!+
! Get a pointer to the replacement string.
!-
		    REPPOINT = CH$PTR (SUB_STR,, BYTE_SIZE);
!+
! Move the replacement string into the new line buffer.
!-

		    INCR J FROM 1 TO .SUB_STRLEN DO
			EDT$$PUT_CH (CH$RCHAR_A (REPPOINT));

		    NEW_POS = .LN_LEN;
!+
! Bump the old line pointer by the length of the search string.
!-
		    OLD = CH$PLUS (.OLD, .SEA_STRLEN);
		    END;

	IF ( NOT .THIS_CHAR_CHANGED)
	THEN
	    BEGIN
!+
! No match, just copy the chararacter and continue.
!-
	    EDT$$PUT_CH (CH$RCHAR_A (OLD));
	    END;

	END;

!+
! Check to see if any substitutions have been done.
!-

    IF .CHANGED
    THEN
	BEGIN
!+
! Check for overflow of the newly constructed line.
!-

	IF (.LN_LEN GTR 255)
	THEN
	    BEGIN
	    EDT$$FMT_MSG (EDT$_LINEXC255);
	    LN_LEN = 255;
	    END;
!+
! Also need to check if new cursor position would be after 255 characters.
!-
	IF (.NEW_POS GTR 255) THEN NEW_POS = 255;

!+
! Replace the line in the buffer, and update the position to
! the position after the last substitution.
!-
	EDT$$RPL_LN (CH$PTR (LN_BUF, 0, BYTE_SIZE), .LN_LEN);
	CUR_BUF [TBCB_CHAR_POS] = .NEW_POS;
!+
! Unless /NOTYPE was specified, display the updated line.
!-

	IF ( NOT .EXE_SBITS<OPB_NOTYP>) THEN EDT$$TY_CURLN ()

	END;

    END;


END
ELUDOM