Trailing-Edge
-
PDP-10 Archives
-
BB-H138F-BM_1988
-
7-sources/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) 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 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