Trailing-Edge
-
PDP-10 Archives
-
tops20-v7-ft-dist1-clock
-
7-sources/lsubs.bli
There are 10 other files named lsubs.bli in the archive. Click here to see a list.
%TITLE 'LSUBS - SUBSTITUTE line-mode command'
MODULE LSUBS ( ! SUBSTITUTE line-mode command
IDENT = '3-002' ! File: LSUBS.BLI Edit: GB3003
) =
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 executes the line mode SUBSTITUTE command.
!
! ENVIRONMENT: Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: February 3, 1978
!
! MODIFIED BY:
!
! 1-001 - Original. DJS 30-JAN-81. This module was created by
! extracting the routine EDT$$LN_SUBCMD from the module EXEC.BLI.
! 1-002 - Regularize headers. JBS 20-Mar-1981
! 1-003 - Change substitute to EDT$$SUB_NXT . JBS 27-Mar-1981
! 1-004 - Change paramter to FMT-STRCNT. SMB 5-Feb-1982
! 1-005 - Give a message if there is an error setting search strings. JBS 04-May-1982
! 1-006 - Stop processing on bad select range. SMB 01-Jul-1982
! 1-007 - Use EDT$$FMT_CRLF instead of EDT$$OUT_FMTBUF. JBS 05-Jul-1982
! 1-008 - Mark the screen as changed if we change anything. JBS 07-Jul-1982
! 1-009 - Put edt$$tst_eob in line . STS 22-Sep-1982
! 1-010 - Remove EDT$$G_SCR_CHGD, new screen logic doesn't need it. JBS 09-Oct-1982
! 1-011 - Put edt$$rng_frstln in line. STS 11-Oct-1982
! 3-001 - Start of modifications for Tops10/20. GB Decemeber 1982.
! Remove moveline macro and add code to copy line number.
! 3-002 - Fix EDT$$FMT_STRCNT. CJG 22-Mar-1983
! 3-003 - Add updates from V3 sources. GB 29-Apr-1983
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$LN_SUBCMD : NOVALUE; ! Process the SUBSTITUTE command
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$LN_SUBCMD - SUBSTITUTE line-mode command'
GLOBAL ROUTINE EDT$$LN_SUBCMD ! SUBSTITUTE line-mode command
: NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Command processing routine for SUBSTITUTE. Position to the first
! line of the range, then enter a loop getting the next line and
! calling EDT$$SUB_NXT to do substituions within that line.
! If the range was null, then we do only a single substitution,
! otherwise all are done.
!
! FORMAL PARAMETERS:
!
! NONE
!
! IMPLICIT INPUTS:
!
! INP_SRC
! CUR_BUF
! RNG_SAVPOS
! EXE_CURCMD
! EXE_QRYQUIT
! EXE_SUBCNT
! WK_LN
!
! IMPLICIT OUTPUTS:
!
! NONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$FMT_STRCNT : NOVALUE,
EDT$$FMT_CRLF, ! Terminate an output line
EDT$$SET_STR,
EDT$$FMT_MSG : NOVALUE,
EDT$$NXT_LNRNG,
EDT$$RNG_REPOS,
EDT$$RD_CURLN,
EDT$$SUB_NXT : NOVALUE,
EDT$$STOP_WKINGMSG : NOVALUE, ! Turn off the "working" message
EDT$$CHK_CC; ! Check for a control C
EXTERNAL
LNO_ZERO : LN_BLOCK,
INP_SRC,
CUR_BUF : REF TBCB_BLOCK,
RNG_SAVPOS : POS_BLOCK,
WK_LN : REF LIN_BLOCK,
RNG_FRSTLN,
RNG_ORIGPOS : POS_BLOCK,
EOB_LN,
EXE_CURCMD : REF NODE_BLOCK, ! Pointer to the current command.
EXE_QRYQUIT, ! Quit flag for /QUERY operations.
EXE_SUBCNT, ! No. of substitutions done.
CC_DONE; ! Set if control C actually aborted something
MESSAGES ((INVSTR));
LOCAL
STRINGS_OK, ! Flag indicating that there is a problem setting the strings
TEMP_COUNT : LN_BLOCK, ! 6 byte count field
SINGLE, ! Flag indicating single subs only
FIRST, ! Flag indicating whether this is the first one.
SEEN_CC; ! Flag indicating we have seen a control C
!+
! Get the range node.
!-
BIND
RANGE = .EXE_CURCMD [RANGE1] : NODE_BLOCK;
!+
! Position to the first line.
!-
RNG_FRSTLN = 1;
EDT$$CPY_MEM( POS_SIZE, .CUR_BUF, RNG_ORIGPOS);
IF ( NOT EDT$$RNG_REPOS (.EXE_CURCMD [RANGE1])) THEN RETURN;
!+
! Set the single substitution flag if the range was null.
!-
SINGLE = .RANGE [RAN_TYPE] EQL RAN_NULL;
!+
! Set flag indicating this if the first substitution, and zero the
! substitution count.
!-
FIRST = 1;
EXE_SUBCNT = 0;
STRINGS_OK = 1;
SEEN_CC = 0;
!+
! Loop over the range.
!-
WHILE (EDT$$NXT_LNRNG (0) AND ( NOT .EXE_QRYQUIT) AND .STRINGS_OK AND ( NOT .SEEN_CC)) DO
IF (.WK_LN NEQA EOB_LN)
THEN
BEGIN
!+
! Must set up the search and replace string each time through
! in case the range involved a search string, which would clobber
! it.
!-
STRINGS_OK = EDT$$SET_STR ();
IF .STRINGS_OK
THEN
BEGIN
!+
! Do substitutions in this line starting at position 0.
!-
SEEN_CC = EDT$$CHK_CC ();
IF ( NOT .SEEN_CC)
THEN
BEGIN
EDT$$SUB_NXT (.SINGLE, 0);
!+
! Check to see if this was the first line in the range.
!-
IF .FIRST
THEN
!+
! Save position after first substitute so we can
! correctly reposition there. This is nescessary since
! modifying the first line might change it's position in
! the text buffer, invalidating the previously saved position.
!-
BEGIN
EDT$$CPY_MEM (POS_SIZE, .CUR_BUF, RNG_SAVPOS);
FIRST = 0;
END;
END
ELSE
CC_DONE = 1;
END;
END;
EDT$$STOP_WKINGMSG ();
!+
! Report a case of an invalid string.
!-
IF ( NOT .STRINGS_OK) THEN EDT$$FMT_MSG (EDT$_INVSTR);
!+
! If the command came from the terminal, report the number of
! substitutions.
!-
IF (.INP_SRC EQL INP_TERM)
THEN
BEGIN
TEMP_COUNT [LN_LO] = .LNO_ZERO [LN_LO];
TEMP_COUNT [LN_MD] = .LNO_ZERO [LN_MD];
TEMP_COUNT [LN_HI] = .LNO_ZERO [LN_HI];
TEMP_COUNT = .EXE_SUBCNT;
EDT$$FMT_STRCNT (TEMP_COUNT, CH$PTR (UPLIT (' substitution')), 13);
EDT$$FMT_CRLF ();
END;
!+
! And re-position.
!-
EDT$$CPY_MEM(POS_SIZE, RNG_SAVPOS, .CUR_BUF);
EDT$$RD_CURLN();
END; ! of routine EDT$$LN_SUBCMD
END
ELUDOM