Trailing-Edge
-
PDP-10 Archives
-
bb-r775d-bm_tops20_ks_upd_4
-
sources/lmove.bli
There are 10 other files named lmove.bli in the archive. Click here to see a list.
%TITLE 'LMOVE - MOVE and COPY line-mode commands'
MODULE LMOVE ( ! MOVE and COPY line-mode commands
IDENT = '3-003' ! File: LMOVE.BLI Edit: GB3003
) =
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 executes the line mode MOVE and COPY commands.
!
! 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 from the module EXEC.BLI.
! 1-002 - Regularize headers. JBS 20-Mar-1981
! 1-003 - Use new message codes. JBS 04-Aug-1981
! 1-004 - Abort on control C. JBS 04-Jan-1982
! 1-005 - Change size of move/copy counters. SMB 05-Feb-1982
! 1-006 - Change DUP count to 48-bits. SMB 07-Feb-1982
! 1-007 - Limit DUP count to 65535 or less. SMB 08-Feb-1982
! 1-008 - Fix bug in return address for DUP range check. SMB 09-Feb-1982
! 1-009 - Set a flag if control C actually aborts something. JBS 25-May-1982
! 1-010 - Correct a message error introduced by edit 1-009. JBS 26-May-1982
! 1-011 - Check the status returned by EDT$$CPY_LN. JBS 09-Jun-1982
! 1-012 - Stop working message before messages. SMB 30-Jun-1982
! 1-013 - Stop processing on bad select range. SMB 01-Jul-1982
! 1-014 - Use EDT$$FMT_CRLF instead of EDT$$OUT_FMTBUF. JBS 05-Jul-1982
! 1-015 - Make sure the screen is repainted if any lines are changed. For
! compatibility with EDT version 2, don't go through "Press return
! to continue". JBS 06-Jul-1982
! 1-016 - Move edt$$tst_eob in line. STS 22-Sep-1982
! 1-017 - Modify to use new 48 bit macro. STS 01-Oct-1982
! 1-018 - Remove EDT$$G_SCR_CHGD, new screen update logic doesn't need it. JBS 09-Oct-1982
! 1-019 - Put code for edt$$rng_posfrst in line. STS 11-Oct-1982
! 1-020 - Modify to use new compare macro. STS 20-Oct-1982
! 1-021 - Modify control c checking. STS 01-Dec-1982
! 3-001 - Fix EDT$$FMT_STR and EDT$$FMT_STRCNT. CJG 22-Mar-1983
! 3-002 - Use EDT$$CPY_MEM instead of EDT$$SAV_POS and EDT$$SET_POS.
! CJG 17-Apr-1983
! 3-003 - Add updates from V3 sources. GB 29-Apr-1983
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!
REQUIRE 'EDTSRC:TRAROUNAM';
FORWARD ROUTINE
EDT$$MOVCPY_CMD : NOVALUE; ! Process the MOVE and COPY commands
!
! INCLUDE FILES:
!
REQUIRE 'EDTSRC:EDTREQ';
!
! MACROS:
!
! NONE
!
! EQUATED SYMBOLS:
!
! NONE
!
! OWN STORAGE:
!
! NONE
!
! EXTERNAL REFERENCES:
!
! In the routine
%SBTTL 'EDT$$MOVCPY_CMD - MOVE and COPY line-mode commands'
GLOBAL ROUTINE EDT$$MOVCPY_CMD ( ! MOVE and COPY line-mode commands
DELETE ! 1 = delete lines as moved (0 = copy)
) : NOVALUE =
!++
! FUNCTIONAL DESCRIPTION:
!
! Command processing for MOVE and COPY. First, find the destination
! range to make sure we can position there. Next process the source
! range, copying all the lines to an intermediate buffer. Then position
! to the destination range again, and copy the temporary buffer the
! indicated number of times. If the command is MOVE then the DELETE parameter
! will be true, causing us to delete the source lines as they are processed.
!
! FORMAL PARAMETERS:
!
! DELETE 1 = delete lines (MOVE command) 0 = don't (COPY command)
!
! IMPLICIT INPUTS:
!
! CUR_BUF
! WK_LN
! EXE_CURCMD
! EXE_QRYQUIT
! EXE_SBITS
! EXE_SBLK
!
! IMPLICIT OUTPUTS:
!
! CC_DONE
!
! ROUTINE VALUE:
!
! NONE
!
! SIDE EFFECTS:
!
! NONE
!
!--
BEGIN
EXTERNAL ROUTINE
EDT$$STOP_WKINGMSG,
EDT$$CMP_LNO,
EDT$$FMT_STRCNT : NOVALUE,
EDT$$FMT_CRLF, ! Terminate an output line
EDT$$FMT_MSG,
EDT$$FMT_STR,
EDT$$PROC_QRYQAL,
EDT$$NXT_LNRNG,
EDT$$RNG_REPOS,
EDT$$CPY_LN,
EDT$$END_CPY,
EDT$$LOC_LN,
EDT$$NEW_BUF,
EDT$$RD_CURLN,
EDT$$RD_NXTLN,
EDT$$START_CPY,
EDT$$TOP_BUF,
EDT$$CHK_CC; ! Check for a control C having been typed
EXTERNAL
EXT_MOD, ! Are we in EXT mode
LNO0 : LN_BLOCK,
LNO_ZERO : LN_BLOCK,
CUR_BUF : REF POS_BLOCK,
WK_LN : REF LIN_BLOCK,
EXE_CURCMD : REF NODE_BLOCK, ! Pointer to the current command.
EXE_QRYQUIT, ! Quit flag for /QUERY operations.
RNG_FRSTLN,
RNG_ORIGPOS: POS_BLOCK,
EXE_SBITS, ! The options switches.
EXE_SBLK : REF NODE_BLOCK, ! The option switch value block.
CC_DONE, ! Set to 1 if control C actually aborts something
EOB_LN;
MESSAGES ((DSTMOVCOP, BADRANGE, INSMEM));
LOCAL
NLINES : LN_BLOCK, ! Number of lines copied.
DEST_LINE : LN_BLOCK, ! Line number of the destination.
S_TBCB, ! Address of TBCB for the source.
D_TBCB, ! Address of TBCB for the destination.
NUM_COPIES : LN_BLOCK, ! Number of times to copy it.
START_POS : POS_BLOCK, ! The start position.
TEMP : TBCB_BLOCK, ! Temporary buffer TBCB.
COPY_COUNTER : LN_BLOCK, ! Number of copies made
CONTROL_C; ! 1 = a control C was typed.
!+
! Save the current position for future restoration.
!-
EDT$$CPY_MEM (POS_SIZE, .CUR_BUF, START_POS);
!+
! Save the current TBCB address so we can detect a buffer change
!-
S_TBCB = .CUR_BUF;
!+
! First check to make sure we can locate the destination line.
!-
RNG_FRSTLN = 1;
EDT$$CPY_MEM(POS_SIZE, .CUR_BUF, RNG_ORIGPOS);
IF ( NOT EDT$$RNG_REPOS (.EXE_CURCMD [RANGE1]))
THEN
BEGIN
EDT$$FMT_MSG (EDT$_DSTMOVCOP);
RETURN;
END;
CONTROL_C = EDT$$CHK_CC();
IF .CONTROL_C THEN RETURN;
!+
! Save the line number of the destination line so we are able to reposition
! there when we are ready to move it.
!-
DEST_LINE [LN_LO] = .WK_LN [LIN_NUM];
DEST_LINE [LN_MD] = .WK_LN [LIN_NUMM];
DEST_LINE [LN_HI] = .WK_LN [LIN_NUMH];
D_TBCB = .CUR_BUF;
!+
! Create a temporary buffer to copy the lines.
!-
CUR_BUF = TEMP;
!+
! Zero the temporary TBCB - Is there a better way? GB
!-
CH$FILL (0, TBCB_SIZE * 4, CH$PTR(TEMP, 0, 9));
EDT$$NEW_BUF ();
CUR_BUF = .S_TBCB;
EDT$$CPY_MEM (POS_SIZE, START_POS, .CUR_BUF);
EDT$$RD_CURLN ();
!+
! Now position to the front of the source range.
!-
RNG_FRSTLN = 1;
EDT$$CPY_MEM(POS_SIZE,.CUR_BUF, RNG_ORIGPOS);
IF ( NOT EDT$$RNG_REPOS (.EXE_CURCMD [RANGE2])) THEN RETURN;
!+
! Copy the source lines to a temporary buffer.
!-
EDT$$START_CPY (TEMP);
NLINES [LN_LO] = .LNO_ZERO [LN_LO];
NLINES [LN_MD] = .LNO_ZERO [LN_MD];
NLINES [LN_HI] = .LNO_ZERO [LN_HI];
IF (.DELETE EQL 0) THEN CONTROL_C = EDT$$CHK_CC();
WHILE (EDT$$NXT_LNRNG (.DELETE) AND (.WK_LN NEQA EOB_LN) AND (.EXE_QRYQUIT EQL 0)) DO
BEGIN
IF EDT$$PROC_QRYQAL (0, 0)
THEN
BEGIN
ADDLINE (LNO0, NLINES, NLINES);
IF .DELETE THEN CUR_BUF [POS_CHAR_POS] = 0;
IF ( NOT EDT$$CPY_LN (.DELETE))
THEN
BEGIN
EDT$$END_CPY (0);
EDT$$FMT_MSG (EDT$_INSMEM);
RETURN;
END;
END
ELSE
IF .DELETE THEN EDT$$RD_NXTLN ();
IF (.DELETE EQL 0) THEN CONTROL_C = EDT$$CHK_CC();
END;
EDT$$END_CPY (0);
!+
! Now, re-position to the destination range.
!-
CUR_BUF = .D_TBCB;
EDT$$RD_CURLN ();
EDT$$LOC_LN (DEST_LINE);
!+
! Switch to the temp buffer we just created.
!-
CUR_BUF = TEMP;
EDT$$RD_CURLN ();
!+
! Get the number of times to copy.
!-
IF .EXE_SBITS<OPB_DUPL>
THEN
MOVELINE (EXE_SBLK [SW_VAL1], NUM_COPIES)
ELSE
BEGIN
MOVELINE (LNO0, NUM_COPIES);
END;
!+
! Check that DUP is less than 65536
!-
IF ((.NUM_COPIES [LN_HI] NEQ 0) OR (.NUM_COPIES [LN_MD] NEQ 0))
THEN
BEGIN
EDT$$FMT_MSG (EDT$_BADRANGE);
MOVELINE (LNO_ZERO, NUM_COPIES);
MOVELINE (LNO_ZERO, NLINES);
END;
!+
! And finally, do the copy.
!-
EDT$$START_CPY (.D_TBCB);
MOVELINE (LNO_ZERO, COPY_COUNTER);
IF (.DELETE EQL 0) THEN CONTROL_C = EDT$$CHK_CC ();
WHILE ((EDT$$CMP_LNO (COPY_COUNTER, NUM_COPIES) LSS 0) AND ( NOT .CONTROL_C)) DO
BEGIN
EDT$$TOP_BUF ();
WHILE (.WK_LN NEQA EOB_LN) DO
BEGIN
IF ( NOT EDT$$CPY_LN (0))
THEN
BEGIN
EDT$$END_CPY (1);
EDT$$FMT_MSG (EDT$_INSMEM);
RETURN;
END;
EDT$$RD_NXTLN ();
END;
ADDLINE (LNO0, COPY_COUNTER, COPY_COUNTER);
IF (.DELETE EQL 0) THEN CONTROL_C = EDT$$CHK_CC ();
END;
EDT$$END_CPY (1);
IF (.EXT_MOD) THEN EDT$$STOP_WKINGMSG ();
!+
! Report the number of lines moved or copied.
!-
EDT$$FMT_STRCNT (NLINES, CH$PTR (UPLIT (%STRING (' line'))), 5);
IF (.DELETE NEQ 0)
THEN
EDT$$FMT_STR (CH$PTR (UPLIT (%STRING (' moved'))), 6)
ELSE
EDT$$FMT_STR (CH$PTR (UPLIT (%STRING (' copied'))), 7);
IF (EDT$$CMP_LNO (COPY_COUNTER, LNO0) NEQ 0) !
THEN
BEGIN
EDT$$FMT_STR (CH$PTR (UPLIT (%STRING (' '))), 1);
EDT$$FMT_STRCNT (COPY_COUNTER, CH$PTR (UPLIT (%STRING (' time'))), 5);
END;
EDT$$FMT_CRLF ();
IF ((EDT$$CMP_LNO (COPY_COUNTER, NUM_COPIES) NEQ 0) AND (.CONTROL_C)) THEN CC_DONE = 1;
END; ! of routine EDT$$MOVCPY_CMD
END
ELUDOM