Google
 

Trailing-Edge - PDP-10 Archives - CFS_TSU04_19910205_1of1 - update/t20src/chmonstr.bli
There are 11 other files named chmonstr.bli in the archive. Click here to see a list.
 %TITLE 'CHMONSTR - test for being on a given string'
MODULE CHMONSTR (				! Test for being on a given string
		IDENT = '3-005'			! File: CHMONSTR.BLI Edit: CJG3005
		) =
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 determines if the current position matches
!	a given string.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: Unknown
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 04-Feb-1981.  This module was created by
!	extracting the routine EDT$$TST_ONSTR  from module CHANGE.BLI.
! 1-002	- Regularize headers.  JBS 03-Mar-1981
! 1-003 - Add WPS string matching.  STS 05-Oct-1981
! 1-004	- Support the DEC Multinational character set.  JBS 20-Jul-1982
! 1-005 - Replace call to edt$$tst_eob. STS 22-Sep-1982
! 1-006	- Fix a missing dot.  JBS 07-Dec-1982
! 1-007	- Add conditionals for WPS and VT220 support.  JBS 11-Feb-1983
! 3-001 - Make CP a real pointer and fix some quoted characters.  GB 24-Mar-1983
! 3-002 - Add updates from V3 source kit.  GB 28-Apr-1983
! 3-003 - Modified to support SET SEARCH IGNORE. CJG 17-Nov-1983
! 3-004 - Remove VT220 conditional to speed up code. CJG 25-Nov-1983
! 3-005 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$TST_ONSTR;			! Compare the current character position with a string descriptor

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

LIBRARY 'EDTSRC:TRANSLATE';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$TST_ONSTR  - test for being on a given string'

GLOBAL ROUTINE EDT$$TST_ONSTR (			! Test for being on a given string
	ADDR, 					! Address of the model string
	LEN					! Length of the model string
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine checks to see if the string specified by ADDR and
!	LEN matches at the current character position.
!
! FORMAL PARAMETERS:
!
!  ADDR			Address of the string to test against the current position
!
!  LEN			Length of that string
!
! IMPLICIT INPUTS:
!
!	EXCT_MATCH
!	LN_END
!	LN_PTR
!
! IMPLICIT OUTPUTS:
!
!	LN_PTR
!
! ROUTINE VALUE:
!
!	The value 1 is returned if it matches, 0 otherwise.
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$CS_DWN,			! Move down a line
	EDT$$CS_LEFT;			! Move left a character

    EXTERNAL
	WK_LN : REF LIN_BLOCK,
	EOB_LN,
	IGN_LEN,			! Length of ignore string
	IGN_PTR,			! Pointer to ignore string
	EXCT_MATCH,			! Exact search or no.
	LN_END,				! End of current line pointer
	LN_PTR,				! Current character pointer
	CHAR_INFO : BLOCKVECTOR [256, 1];	! Information about characters

    BIND
	GENERAL_TABLE = UPLIT (CHAR_GENERAL_TAB) : VECTOR [256];

    BIND
	CI_TABLE = UPLIT (CHAR_CI_TAB) : VECTOR [256];

    BIND
	DI_TABLE = UPLIT (CHAR_DI_TAB) : VECTOR [256];

    LOCAL
	SC,
	TC,
	CP,
	SKIPPED,
	IGNORED,
	MATCHED;

!+
! Keep track of how many characters matched so we can back up.
!-
    SKIPPED = 0;
    IGNORED = 0;
    MATCHED = 0;
    CP = CH$PTR (.ADDR,, BYTE_SIZE);
!+
! Loop over size of the string.
!-

    DECR I FROM .LEN - 1 TO 0 DO
	BEGIN

	IF CH$PTR_EQL (.LN_PTR, .LN_END)
	THEN

	    IF (CH$RCHAR_A (CP) EQL ASC_K_CR)
	    THEN

		IF (.WK_LN EQLA EOB_LN) THEN EXITLOOP ELSE EDT$$CS_DWN ()

	    ELSE
		EXITLOOP

	ELSE
	    BEGIN
	    IF ((.IGN_LEN EQL 0) OR (.EXCT_MATCH NEQ 0))
	    THEN
		BEGIN
		SC = CH$RCHAR (.LN_PTR);
		TC = CH$RCHAR_A (CP);		! get the char we're trying to match
		END
	    ELSE
		BEGIN
		WHILE 1 DO
		    BEGIN
		    SC = CH$RCHAR (.LN_PTR);
		    IF CH$FAIL (CH$FIND_CH (.IGN_LEN, .IGN_PTR, .SC)) THEN EXITLOOP;
		    LN_PTR = CH$PLUS (.LN_PTR, 1);
		    SKIPPED = .SKIPPED + 1;
		    END;
		WHILE 1 DO
		    BEGIN
		    TC = CH$RCHAR_A (CP);
		    IF CH$FAIL (CH$FIND_CH (.IGN_LEN, .IGN_PTR, .TC)) THEN EXITLOOP;
		    IGNORED = .IGNORED + 1;
		    END;
		END;

	    CASE .EXCT_MATCH FROM 0 TO 4 OF
		SET

		[0] : 				! General

		    IF (.GENERAL_TABLE [.SC] NEQ .GENERAL_TABLE [.TC]) THEN EXITLOOP;

		[1] : 				! Exact

		    IF (.SC NEQ .TC) THEN EXITLOOP;

		[2] : 				! WPS
		    BEGIN

		    IF .CHAR_INFO [.TC, CI_LC]	! If lower case letter
		    THEN
			BEGIN
			IF (.CI_TABLE [.SC] NEQ .CI_TABLE [.TC]) THEN EXITLOOP;
			END
		    ELSE
			BEGIN
			IF (.SC NEQ .TC) THEN EXITLOOP;	! Exact compare
			END;

		    END;

		[3] : 				! Case insensitive

		    IF (.CI_TABLE [.SC] NEQ .CI_TABLE [.TC]) THEN EXITLOOP;

		[4] : 				! Diacritical insensitive

		    IF (.DI_TABLE [.SC] NEQ .DI_TABLE [.TC]) THEN EXITLOOP;

		[OUTRANGE] :

		    ASSERT (3, 0);

		TES;

	    LN_PTR = CH$PLUS (.LN_PTR, 1);
	    END;

	MATCHED = .MATCHED + 1;
	END;

!+
! Back up to the original position.
!-

    DECR I FROM (.MATCHED + .SKIPPED - 1) TO 0 DO
	EDT$$CS_LEFT ();

    RETURN ((.MATCHED + .IGNORED) EQL .LEN);
    END;					! of routine EDT$$TST_ONSTR

!<BLF/PAGE>
END						! of module EDT$CHMONSTR
ELUDOM