Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/chmexcom.bli
There are 11 other files named chmexcom.bli in the archive. Click here to see a list.
 %TITLE 'CHMEXCOM - execute certain change-mode commands'
MODULE CHMEXCOM (				! Execute certain change-mode commands
		IDENT = '3-007'			! File: CHMEXCOM.BLI Edit: CJG3007
		) =
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 change mode commands which
!	do not take an entity.
!
! 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 EXECUTE_COM from module CHANGE.BLI.
! 1-002	- Regularized headers.  JBS 25-Feb-1981
! 1-003	- Fix module name.  JBS 02-Mar-1981
! 1-004	- Change SPLIT_LINE to EDT$$SPLT_LNINS .  JBS 30-Mar-1981
! 1-005	- Use the ASSERT macro.  JBS 01-Jun-1981
! 1-006	- Remove explicit journaling.  JBS 18-Jun-1981
! 1-007	- Use new message codes.  JBS 04-Aug-1981
! 1-008 - Add bell verb. STS 11-Aug-1981
! 1-009 - Add the date verb. STS 31-Aug-1981
! 1-010 - Add verbs to set up default verb. STS 21-Sep-1981
! 1-011 - Add verbs for toggle select and delete select. STS 23-Sep-1981
! 1-012 - Added command to set success to 0 if verb was select and select
!	  range was already active.  I needed this status for search and
!	  select. STS 28-Sep-1981
! 1-013	- Add a return value to indicate end of journal file.  JBS 02-Oct-1981
! 1-014 - Remove parameter from EDT$$SUB_CMD call.  SMB 28-Oct-1981
! 1-015 - Revise Tab Compute calculation when SHFL not zero.  SMB 06-Nov-1981
! 1-016	- Add range checking to ASC command.  JBS 10-Feb-1982
! 1-017	- Correct spelling of error code.  JBS 12-Feb-1982
! 1-018 - Add a flag for EXT command mode entered.  SMB 26-Feb-1982
! 1-019	- Rewrite word wrapping code.  JBS 07-Apr-1982
! 1-020	- Give messages on error returns from setting search strings.  JBS 04-May-1982
! 1-021	- Set a flag if control C actually aborts something.  JBS 24-May-1982
! 1-022 - Change setting of output format routine.  SMB 30-Jun-1982
! 1-023 - Set format output to TI_WRSTR for EXT output.  SMB 02-Jul-1982
! 1-024 - Make KS move the cursor even if PST_CNT = 0.  SMB 22-Jul-1982
! 1-025 - Add the XLATE command. STS 13-Aug-1982
! 1-026	- Flag screen changed for HELP, SHL and SHR.  JBS 13-Sep-1982
! 1-027	- Remove EDT$$G_LN_NO for new screen update logic.  JBS 29-Sep-1982
! 1-028	- Remove external declaration of EDT$$FMT_LIT, not used.  JBS 05-Oct-1982
! 1-029 - Remove call to SC_INIT, set a flag instead.  SMB 06-Oct-1982
! 1-030	- Change EDT$$G_SCR_CHGD to EDT$$G_SCR_REBUILD in a few places.  JBS 09-Oct-1982
! 1-031	- Rebuild the screen data base if selection is too complex.  JBS 02-Dec-1982
! 1-032	- Revise handling of EDT$$G_SHF.  JBS 14-Dec-1982
! 1-033	- Put WPS and VT220 support under a conditional.  JBS 10-Feb-1983
! 1-034 - Remove declarations of routines which aren't called.  SMB 23-Feb-1983
! 1-035	- Add new value for EDT$$G_SCR_CHGD.  JBS 02-Mar-1983
! 3-001 - Add updates from V3 source kit.  GB 27-Apr-1983
! 3-002 - Remove call to EDT$$GET_XLATE - TOPS-20 does not use it. CJG 2-Jun-1983
! 3-003 - Fix problem with screen update after help command GB 17-Jun-1983
! 3-004 - Fix problem with <GOLD> nn ^x getting bad data. CJG 25-Sep-1983
! 3-005 - Call EDT$$STORE_FMTCH and EDT$$GET_DATE directly. CJG 5-Jan-1984
! 3-006 - Add FMT_FREE to improve speed of format routines. CJG 11-Jan-1984
! 3-007 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$EXE_CHMCMD1;			! Execute the verbs which do not take an entity specification

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$EXE_CHMCMD1  - execute certain change-mode commands'

GLOBAL ROUTINE EDT$$EXE_CHMCMD1 (		! Execute certain change-mode commands
    VERB, 					! Command number
    COUNT, 					! Repeat count (char value for ASC)
    OPERAND, 					! Pointer to start of operand
    EXPLICIT					! 1 = the count is explicit
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine executes a command which is not of the verb entity form.
!
! FORMAL PARAMETERS:
!
!  VERB			command number
!  COUNT		repeat count (char value for ASC)
!  OPERAND		Pointer to start of operand for insert, insert_cc etc.
!  EXPLICIT		1 = the count is explicit
!
! IMPLICIT INPUTS:
!
!	TI_SCROLL
!	SCR_LNS
!	DEL_CH
!	DEL_CHLEN
!	DIRN
!	DEL_LN
!	DEL_LNLEN
!	DIR_MOD
!	DEL_WD
!	DEL_WDLEN
!	EXI
!	PST_CNT
!	RPL_STR
!	RPL_LEN
!	SEA_PTR
!	SEL_BUF
!	OLD_SEL
!	SEL_LN
!	SEL_POS
!	SHF
!	TRUN
!	SEA_LEN
!	TOP_LN
!	EXITD
!	TAB_SIZ
!	CUR_BUF
!	TAB_LVL
!	TI_TYP
!	FMT_BUF
!	FMT_CUR
!	LN_BUF
!	LN_PTR
!
! IMPLICIT OUTPUTS:
!
!	SHF
!	TAB_LVL
!	FMT_CUR
!	FMT_FREE
!	LN_PTR
!	VERT
!	DFLT_VERB
!	SEL_BUF
!	CC_DONE
!	SCR_CHGD
!	SCR_REBUILD
!
! ROUTINE VALUE:
!
!	0 = failure, 1 = success, 2 = end of journal file
!
! SIDE EFFECTS:
!
!	MANY
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$INS_STR,			! Insert a string of characters at the current position
	EDT$$INS_CHS,			! Insert a string of characters which may include carriage returns
	EDT$$MOV_TOCOL,			! Insert tabs and spaces
	EDT$$GET_DATE,			! System date routine
!	EDT$$GET_XLATE,			! call translation routine
	EDT$$UNDL,			! Insert the contents of an undelete buffer
	EDT$$MSG_BELL : NOVALUE,	! Output a message to the terminal with a warning bell
	EDT$$CHK_CC,			! Check to see if a CTRL/C has been typed
	EDT$$LN_DEFK,			! Define a key for keypad editing
	EDT$$PST_CMD,			! Execute the paste command
	EDT$$SUB_CMD,			! Execute the SUBSTITUTE command
	EDT$$EXT_CMD,			! Extend command handler
	EDT$$STORE_FMTCH,		! Store a formatted character
	EDT$$OUT_FMTBUF,		! Dump the format buffer
	EDT$$KPAD_HLP,			! Keypad mode help processor
	EDT$$TI_WRLN,			! Write to terminal
	EDT$$TI_WRSTR,			! Write to terminal unformatted
	EDT$$RPL_CHGDLN,		! Declare current line as changed
	EDT$$GET_TXTLN,			! Get current line in line buffer
	EDT$$CS_LEFT,			! Move left a character
	EDT$$SC_CPUCSPOS,		! Compute cursor position
	EDT$$WORD_WRAP,			! Try doing word wrapping
	EDT$$SC_POSCSIF,		! Put cursor position in format buffer
	EDT$$SC_NONREVID,		! End reverse video
	EDT$$SC_FULLSCLL,		! Reset the scrolling region
	EDT$$SC_SETSCLLREG,		! Set the scrolling region
	EDT$$STOP_WKINGMSG,		! Terminate working AST
	EDT$$SET_SEASUBSTR;		! Setup SUBSTITUTE strings

    EXTERNAL
	TI_SCROLL,			! Scrolling terminal
	SCR_LNS,			! Number of screen lines
	FMT_WRRUT,			! Holds address of output format routine
	EXT_MOD,			! 1=in EXT command mode
	DEL_CH : BLOCK 			! Deleted character buffer.
	    [CH$ALLOCATION (2, BYTE_SIZE)],
	DEL_CHLEN,			! Length of deleted character buffer
	DIRN,				! The current direction.
	DEL_LN : BLOCK 			! Deleted line buffer.
	    [CH$ALLOCATION (257, BYTE_SIZE)],
	DEL_LNLEN,			! Deleted line length.
	DIR_MOD,			! The directional mode.
	DEL_WD : BLOCK 			! Deleted word buffer.
	    [CH$ALLOCATION (81, BYTE_SIZE)],
	DEL_WDLEN,			! Length of del word string.
	EXI,				! Change mode has been exited.
	PST_CNT,			! No. of characters pasted.
	RPL_STR,			! Address of replace string.
	RPL_LEN,			! Length of replace string.
	SEA_STRLEN,			! Length of serach string
	SEA_PTR,			! Address of search string.
	SEL_BUF,			! Pointer to select buffer.
	OLD_SEL,			! Pointer to old select buffer
	SEL_LN : LN_BLOCK,		! Relative line number of select.
	SEL_POS,			! select position.
	SHF,				! The number of columns shifted.
	TRUN,				! 0 = Set no truncate
	SEA_LEN,			! Length of search string.
	TOP_LN : LN_BLOCK,		! The forced to top line.
	VERT,				! Last entity was VERT flag.
	EXITD,				! Exit from EDT
	SCR_CHGD,			! Was screen changed by EXT command?
	SCR_REBUILD,			! Set if text part of screen must be rebuilt from work file
	TAB_SIZ,			! Structured tab size
	CUR_BUF : REF TBCB_BLOCK,	! The current buffer tbcb
	TAB_LVL,			! Structured tab level.
	TI_TYP,				! Terminal type.
	FMT_BUF,			! Format buffer
	FMT_CUR,			! Pointer into format buffer
	FMT_FREE,			! Space left in format buffer
	LN_BUF,				! Current line buffer
	LN_PTR,				! Current character pointer
	DFLT_VERB,			! Default verb
	CC_DONE;			! Set to 1 if control C aborts something

!+
! Declare the message codes to be used.
!-
    MESSAGES ((SELALRACT, INVSUBCOM, CLDNOTALN, INVASCCHR, INVSTR));

    LOCAL
	SUCCEED,
	START_POS : POS_BLOCK,
	END_POS : POS_BLOCK,
	NUM_LINES;

!+
! If verb is SUBSTITUTE, set up the search and substitute strings.
!-

    IF (.VERB EQL VERB_K_SUBS)
    THEN
	SUCCEED = EDT$$SET_SEASUBSTR (.SEA_PTR, 	!
	    .SEA_LEN, 			!
	    .RPL_STR, 			!
	    .RPL_LEN)
    ELSE
	SUCCEED = 1;

    IF ( NOT .SUCCEED)
    THEN
	EDT$$MSG_BELL (EDT$_INVSTR)
    ELSE

	DO
	    BEGIN

	    CASE .VERB FROM VERB_K_SEL TO LAST_K_VERB OF
		SET

		[VERB_K_UNDC] :
		    BEGIN
		    SUCCEED = EDT$$UNDL (DEL_CH, .DEL_CHLEN);
		    END;

		[VERB_K_UNDW] :
		    BEGIN
		    SUCCEED = EDT$$UNDL (DEL_WD, .DEL_WDLEN);
		    END;

		[VERB_K_UNDL] :
		    BEGIN
		    SUCCEED = EDT$$UNDL (DEL_LN, .DEL_LNLEN);
		    END;

		[VERB_K_INSERT] :
		    BEGIN
		    SUCCEED = EDT$$INS_CHS (.OPERAND, .SEA_LEN);

		    IF .SUCCEED THEN SUCCEED = EDT$$WORD_WRAP ();

		    END;

		[VERB_K_XLATE] :
		    BEGIN

!		    SUCCEED = EDT$$GET_XLATE (.OPERAND, .SEA_LEN);
		    EDT$$MSG_BELL (EDT$_INVSUBCOM);
		    SUCCEED = 0;
		    END;

		[VERB_K_CC] :
		    BEGIN
		    LOCAL
			TEMP;			! old control char here

		    CH$WCHAR (CH$RCHAR (.OPERAND) - %C'@', CH$PTR (TEMP,, BYTE_SIZE));
		    SUCCEED = EDT$$INS_CHS (CH$PTR (TEMP,, BYTE_SIZE), 1);
		    END;

		[VERB_K_BACK] :
		    BEGIN
		    DIR_MOD = DIR_BACKWARD;
		    EXITLOOP;
		    END;

		[VERB_K_ADV] :
		    BEGIN
		    DIR_MOD = DIR_FORWARD;
		    EXITLOOP;
		    END;

		[VERB_K_DLWC] :
		    BEGIN
		    DFLT_VERB = VERB_K_CHGL;	! set up default verb to change case lower
		    EXITLOOP;
		    END;

		[VERB_K_DUPC] :
		    BEGIN
		    DFLT_VERB = VERB_K_CHGU;	! set up default verb to change case upper
		    EXITLOOP;
		    END;

		[VERB_K_DMOV] :
		    BEGIN
		    DFLT_VERB = VERB_K_MOVE;	! set up default verb to move
		    EXITLOOP;
		    END;

		[VERB_K_EXIT, VERB_K_QUIT] :
		    BEGIN
		    EXI = 1;

		    IF (.VERB EQL VERB_K_QUIT) THEN EXITD = 1;

		    RETURN (1);
		    END;

		[VERB_K_PASTE] :
		    BEGIN
		    SUCCEED = EDT$$PST_CMD ();
		    END;

		[VERB_K_SEL] :
		    BEGIN

		    IF (.SEL_BUF NEQA 0)
		    THEN
			BEGIN
			EDT$$MSG_BELL (EDT$_SELALRACT);
			SUCCEED = 0;
			END
		    ELSE
			BEGIN
			MOVELINE (CUR_BUF [TBCB_CUR_LIN], SEL_LN);
			SEL_BUF = .CUR_BUF;
			SEL_POS = .LN_PTR;
			IF (.OLD_SEL NEQA 0) THEN SCR_REBUILD = 1;
			END;

		    EXITLOOP;
		    END;

		[VERB_K_REF] :
		    BEGIN
		    SCR_CHGD = 2;	! Initialize the terminal and repaint the screen
		    EXITLOOP;
		    END;

		[VERB_K_BELL] :
		    BEGIN
		    EDT$$STORE_FMTCH (7);
		    EDT$$OUT_FMTBUF ();
		    EXITLOOP;
		    END;

		[VERB_K_DATE] :
		    BEGIN
		    LOCAL
			LEN,					! length of date string
			BUF : BLOCK [CH$ALLOCATION (24)];	! buffer for string

		    LEN = 0;
		    EDT$$GET_DATE (LEN, BUF);
		    SUCCEED = EDT$$INS_CHS (CH$PTR (BUF), .LEN);
		    END;

		[VERB_K_DEFK] :
		    BEGIN
		    SUCCEED = EDT$$LN_DEFK ();
		    EXITLOOP;
		    END;

		[VERB_K_TOP] :
		    BEGIN
		    MOVELINE (CUR_BUF [TBCB_CUR_LIN], TOP_LN);
		    EXITLOOP;
		    END;

		[VERB_K_HELP] :
		    BEGIN

		    LOCAL
			KPAD_STATUS;

		    EDT$$SC_NONREVID ();
		    EDT$$STOP_WKINGMSG ();
		    KPAD_STATUS = EDT$$KPAD_HLP ();
		    SCR_CHGD = 2;	! Repaint the screen

		    IF (.KPAD_STATUS EQL 0) THEN SUCCEED = 2;

		    EXITLOOP;
		    END;

		[VERB_K_ASC] :
		    BEGIN

		    IF ((.COUNT GTR 255) OR (.COUNT LSS 0))
		    THEN
			BEGIN
			EDT$$MSG_BELL (EDT$_INVASCCHR);
			SUCCEED = 0;
			END
		    ELSE
			BEGIN
			LOCAL
			    CHAR;
			CH$WCHAR (.COUNT, CH$PTR (CHAR,, BYTE_SIZE));
			EDT$$INS_STR (CH$PTR (CHAR,, BYTE_SIZE), 1);
			EXITLOOP;
			END;

		    END;

		[VERB_K_SUBS, VERB_K_SN] :
		    BEGIN
		    SUCCEED = EDT$$SUB_CMD ();
		    END;

		[VERB_K_KS] : 			! Adjust for KED SUBSTITUTE.
		    BEGIN

!+
! The cursor should move left one even if PST_CNT is zero
!-

		    IF (.DIRN EQL DIR_BACKWARD) AND (.PST_CNT NEQ 0)
		    THEN

			DECR I FROM .PST_CNT - 1 TO 0 DO
			    EDT$$CS_LEFT ()

		    ELSE
			EDT$$CS_LEFT ();

		    END;

		[VERB_K_SHL] :
		    BEGIN
		    SHF = .SHF + 8;

		    IF ((.SHF GEQ 32767) OR (.SHF LSS 0)) THEN SHF = 0;

		    SCR_CHGD = 1;	! repaint the screen

		    IF ( NOT .TRUN) THEN SCR_REBUILD = 1;
		    END;

		[VERB_K_SHR] :
		    BEGIN
		    SHF = .SHF - 8;

		    IF ((.SHF GEQ 32767) OR (.SHF LSS 0)) THEN SHF = 0;

		    SCR_CHGD = 1;	! repaint the screen

		    IF ( NOT .TRUN) THEN SCR_REBUILD = 1;
		    END;

		[VERB_K_TAB] :
		    BEGIN

		    LOCAL
			TAB_COUNT;

		    IF (CH$PTR_NEQ (.LN_PTR, CH$PTR (LN_BUF,, BYTE_SIZE)) OR
			(.TAB_SIZ EQL 0))
		    THEN
			TAB_COUNT = 8
		    ELSE
			TAB_COUNT = .TAB_LVL*.TAB_SIZ;

		    SUCCEED = EDT$$MOV_TOCOL (.TAB_COUNT);
		    END;

		[VERB_K_TC] :
		    BEGIN

		    LOCAL
			COL,
			LIN;

		    IF (.TAB_SIZ EQL 0) THEN EXITLOOP;

		    EDT$$SC_CPUCSPOS (LIN, COL);

		    COL = .COL + .SHF;

		    IF ((.COL MOD .TAB_SIZ) NEQ 0)
		    THEN
			EDT$$MSG_BELL (EDT$_CLDNOTALN)
		    ELSE
			TAB_LVL = (MAX (0, .COL))/.TAB_SIZ;

		    EXITLOOP;
		    END;

		[VERB_K_TD] :
		    BEGIN
		    TAB_LVL = MAX (0, .TAB_LVL - 1);
		    END;

		[VERB_K_TI] :
		    BEGIN
		    TAB_LVL = .TAB_LVL + 1;
		    END;

		[VERB_K_EXT] :
		    BEGIN
		    EDT$$SC_FULLSCLL ();

		    IF ((.TI_TYP EQL TERM_VT52) OR 	!
			(.TI_TYP EQL TERM_VT100))
		    THEN
			FMT_WRRUT = EDT$$TI_WRSTR
		    ELSE
			BEGIN
			EDT$$STOP_WKINGMSG ();
			FMT_WRRUT = EDT$$TI_WRLN;
			END;

		    EDT$$RPL_CHGDLN ();
		    CUR_BUF [TBCB_CHAR_POS] = CH$DIFF (.LN_PTR,
					      CH$PTR (LN_BUF,, BYTE_SIZE));
		    EXT_MOD = 1;
		    EDT$$EXT_CMD ();
		    EXT_MOD = 0;
		    FMT_FREE = FMT_BUFLEN;
		    FMT_CUR = CH$PTR (FMT_BUF,, BYTE_SIZE);
		    EDT$$GET_TXTLN ();
		    LN_PTR = CH$PTR (LN_BUF, .CUR_BUF [TBCB_CHAR_POS], BYTE_SIZE);
		    IF (.TI_SCROLL) THEN EDT$$SC_SETSCLLREG (0, .SCR_LNS);

		    EXITLOOP;
		    END;

		[VERB_K_DESEL] :
		    BEGIN
		    SEL_BUF = 0;		! No select range active
		    END;

		[VERB_K_TGSEL] :
		    BEGIN

		    IF (.SEL_BUF EQLA 0)
		    THEN
			BEGIN
			MOVELINE (CUR_BUF [TBCB_CUR_LIN], SEL_LN);
			SEL_BUF = .CUR_BUF;
			SEL_POS = .LN_PTR;
			IF (.OLD_SEL NEQA 0) THEN SCR_REBUILD = 1;
			END
		    ELSE
			BEGIN
			SEL_BUF = 0;
			END

		    END;

		[VERB_K_CLSS] :
		    BEGIN

		    SEA_STRLEN = 0;	! reset search string

		    END;

		[OUTRANGE] :
		    ASSERT (6, 0);
		TES;

	    IF (.EXPLICIT NEQ 0) THEN COUNT = .COUNT - 1;

	    IF (.SUCCEED NEQ 1) THEN EXITLOOP;

	    IF EDT$$CHK_CC ()
	    THEN
		BEGIN

		IF (.COUNT GTR 0) THEN CC_DONE = 1;

		EXITLOOP;
		END;

	    END
	UNTIL (.COUNT LEQ 0);

!+
! Unless the command was advance or backup, turn off the VERT  flag.
!-

    IF ((.VERB NEQ VERB_K_ADV) AND (.VERB NEQ VERB_K_BACK)) THEN VERT = 0;

    RETURN (.SUCCEED);
    END;					! of routine EDT$$EXE_CHMCMD1


END
ELUDOM