Google
 

Trailing-Edge - PDP-10 Archives - BB-R775C-BM - sources/chmchange.bli
There are 11 other files named chmchange.bli in the archive. Click here to see a list.
%TITLE 'CHMCHANGE - change mode execution'
MODULE CHMCHANGE (				! Change mode execution
		IDENT = '3-006'			! File: CHMCHANGE.BLI Edit: CJG3006
		) =
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 contains the main routine for change mode execution.
!
! 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$$CHM_EXE  from module CHANGE.BLI.
! 1-002	- Regularize headers and remove control C.  JBS 27-Feb-1981
! 1-003	- Fix module name.  JBS 02-Mar-1981
! 1-004	- Revise journaling.  JBS 22-Jun-1981
! 1-005	- Fix a journaling bug.  JBS 08-Jul-1981
! 1-006	- Use EDT$_ for message codes.  JBS 04-Aug-1981
! 1-007	- Fix a comment which stated that EDT$$GZ_COMMAND_RAB is an implicit input;
!	   actually, it is not used.  JBS 16-Aug-1981
! 1-008	- Return if the journal file terminates, and tell the caller.  JBS 01-Oct-1981
! 1-009 - Change EOB to user defined string. STS 06-Oct-1981
! 1-010	- Change literal prompt to use global string.  JBS 20-Oct-1981
! 1-011	- Remove length of prompt string.  JBS 23-Oct-1981
! 1-012	- Add control C handling.  JBS 21-Dec-1981
! 1-013	- Debug control C handling.  JBS 24-Dec-1981
! 1-014	- Add JOU_VALID.  JBS 09-Apr-1982
! 1-015	- Simplify the call to EDT$$SC_RESET.  JBS 22-Apr-1982
! 1-016	- Add alternative control C message.  JBS 25-May-1982
! 1-017	- Clear EXI before exiting.  JBS 02-Jun-1982
! 1-018	- Clear error indicator after an error in hardcopy
! 1-019 - Remove reference to SET_FMTWRRUT and other message changes.
!	  SMB 29-Jun-1982
! 1-020 - Make FIRST_TIME_ENTERED a global.  SMB 1-Jul-1982
! 1-021	- Remove CHM_FRST_ENTRY, use instead LASTMSG.  JBS 05-Jul-1982
! 1-022 - Remove EDT$$G_LN_NO.  SMB 24-Sep-1982
! 1-023	- Change the call to screen update and add a LOAD entry point, so this module
!	   can be displaced by the screen update modules on the PDP-11.  JBS 25-Sep-1982
! 1-024	- Change the screen update call again, to improve overlay size.  JBS 27-Sep-1982
! 1-025 - Remove the call to SC_INIT, set a flag instead.  SMB 06-Oct-1982
! 1-026 - Convert to new journalling scheme. STS 06-Oct-1982
! 1-027	- Change the name of the cursor positioning routine, to obsolete a
!	   redundent module.  JBS 07-Oct-1982
! 1-028	- Correct a comment.  JBS 09-Oct-1982
! 1-029	- Set EDT$$G_SCR_REBUILD on exit, so line mode will be more efficient.  JBS 21-Oct-1982
! 1-030 - First time through - ignore typeahead. STS 10-Nov-1982
! 1-031 - First time through - don't update screen if typeahead. STS 01-Dec-1982
! 1-032 - Clear screen first time through. STS 02-Dec-1982
! 1-033 - Fix problem with hardcopy recoveries. STS 13-Dec-1982
! 1-034	- Only initialize the screen once.  JBS 20-Dec-1982
! 1-035	- Be more careful about printing the owed message.  JBS 18-Jan-1983
! 1-036	- Don't call EDT$$ERA_MSGLN unnecessarily.  JBS 20-Jan-1983
! 1-037	- Don't call EDT$$RD_ECHO unnecessarily.  JBS 21-Jan-1983
! 1-038	- Only update the screen for every 10 characters when doing
!	   a recovery.  JBS 21-Jan-1983
! 1-039	- Add new value for EDT$$G_SCR_CHGD.  JBS 02-Mar-1983
!	  Start of modifications for TOPS10/20.
! 3-001 - Fix EDT$$FMT_STR. CJG 22-Mar-1983
! 3-002 - Add updates from V3 source kit.  GB 26-Apr-1983
! 3-003 - Modify to use EDT$$TI_BUFSTR for journalling. CJG 15-Jun-1983
! 3-004 - Fix problem in handling of nokeypad commands with CHANGE command.
!	  CJG 13-Dec-1983
! 3-005 - Fix a problem with journalling multicommand lines, especially CHANGE\...
!	  CJG 10-Jan-1984
! 3-006 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
EDT$$CHM_EXE;				! Driver for change mode processing

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine

%SBTTL 'EDT$$CHM_EXE  - change mode execution'

GLOBAL ROUTINE EDT$$CHM_EXE 			! Change mode execution
=

!++
! FUNCTIONAL DESCRIPTION:
!
!	This is the main routine for change mode execution.  First we initialize
!	for change mode, then execute any change mode commands on the current
!	command line.  After we have finished with them, we check to see if an
!	exit was done and if so get out.  Otherwise we enter into the change mode
!	command loop, getting commands and executing them until an exit is done,
!	or until the journal file ends.
!
! FORMAL PARAMETERS:
!
!	NONE
!
! IMPLICIT INPUTS:
!
!	CMD_BUF
!	CUR_COL
!	CS_LNO
!	EXI
!	CMD_LEN
!	CMD_PTR
!	INP_SRC
!	RCOV_MOD
!	TI_TYP
!	LN_BUF
!	LN_PTR
!	LN_END
!	PMT_HCCHG
!	CC_DONE
!	LASTMSG
!	TIN_ECHOFLG
!	RECSCRUPD
!
! IMPLICIT OUTPUTS:
!
!	EXI
!	CMD_END
!	CMD_PTR
!	CUR_BUF
!	EDIT_MOD
!	JOU_VALID
!	SCR_CHGD
!	SCR_REBUILD
!	RECSCRUPD
!
! ROUTINE VALUE:
!
!	1 = reached the end of the journal file
!	0 = executed an exit command
!
! SIDE EFFECTS:
!
!	MANY
!
!--

BEGIN

EXTERNAL ROUTINE
	EDT$$MSG_BELL : NOVALUE,	! Output a message to the terminal with a warning bell
	EDT$$SC_POSCSIF,		! Absolute cursor positioning
	EDT$$RD_ECHO,			! Try to optimize terminal input
	EDT$$INIT_CHM : NOVALUE,	! Initialization on entering change mode
	EDT$$FMT_CH,			! Format a charcter
	EDT$$OUT_FMTBUF,		! Dump the format buffer
	EDT$$FMT_STR,			! Format a string
	EDT$$RD_CMDLN,			! Get a command line
	EDT$$TI_BUFCH : NOVALUE,	! Put a character in the journal file buffer
	EDT$$TI_BUFSTR : NOVALUE,	! Put string in journal file
	EDT$$TI_FLUSHJOUFI : NOVALUE,	! Empty the journal file's buffer
	EDT$$RD_JOUTXT,			! Read a text record from the journal file
	EDT$$TI_WRLN,			! Write to terminal
	EDT$$TI_WRSTR,			! Write to terminal unformatted
	EDT$$GET_KPADCMD,		! Get a keypad command
	EDT$$FMT_TEXT : NOVALUE,	! output eob string
	EDT$$RPL_CHGDLN,		! Declare current line as changed
	EDT$$CHM_PAREXE,		! Parse and execute a change mode command string
	EDT$$SC_INIT,			! Initialize for screen mode
	EDT$$SC_ERAALL,			! Erase the screen
	EDT$$SC_RESET,			! Reset screen parameters
	EDT$$SC_UPD,			! Update the screen
	EDT$$START_WKINGMSG,		! Set up working AST
	EDT$$STOP_WKINGMSG,		! Terminate working AST
	EDT$$FMT_MSG,			! Print message text
	EDT$$ERA_MSGLN,			! Start command echoing
	EDT$$TI_TSTTYAHED,		! Check for type ahead
	EDT$$TST_EOB,			! Check for end of buffer
	EDT$$CHK_CC,			! Check for control C
	EDT$$CLR_CC : NOVALUE;		! Clear control C flag

EXTERNAL
	EDIT_DFLTMOD,			! Editing default mode
	PUT_JOU,			!
	MESSAGE_LINE,			! Error message line is 1 more
	MSGFLG,				! 1 = there is a message on the last line
	LASTMSG,			! The last message printed
	FMT_WRRUT,			! Holds address of write routine
	CMD_BUF,			! Command string buffer
	PA_MORE,			! Non-zero = more command in buffer
	PA_CURTOK,			! Pointer to remainder of command
	PA_CURTOKLEN,			! Length of remainder
	CUR_COL,			! current column
	CS_LNO,				! cursor line.
	EXI,				! Change mode has been exited.
	CMD_END,			! End of command pointer
	CMD_LEN,			! Length of command buffer
	CMD_PTR,			! Command string pointer
	INP_SRC,			! Source of command input.
	RCOV_MOD,			! In recovery mode?
	CUR_BUF : REF TBCB_BLOCK,	! The current buffer tbcb
	TI_TYP,				! Terminal type.
	LN_BUF,				! Current line buffer
	LN_PTR,				! Current character pointer
	LN_END,				! End of current line pointer
	EDIT_MOD,			! Editing mode: line or change
	PMT_HCCHG : VECTOR,		! Counted ASCII prompt string for hardcopy change mode
	CC_DONE,			! 1 = Control C actually aborted something
	JOU_VALID,			! 1 = Journal record is valid
	WK_LN : REF LIN_BLOCK,
	EOB_LN,
	SCR_CHGD,			! The screen must be repainted
	SCR_REBUILD,			! The screen must be rebuilt from the work file
	TIN_ECHOFLG,
	RECSCRUPD;			! Counter for screen updates in recovery mode

LOCAL
	FIRST_TIME,			! 1 = first time at least initialise the screen
	STATUS,				! 0 = error, 1 = ok, 2 = journal file ended
	CC_MSG,				! 0 = no message, 1 = aborted msg, 2 = ignored msg
	OWED_MESSAGE;			! 1 = we should print the last message again

!+
! Specify messages used in this routine.
!-

    MESSAGES ((CHGMODTER, ABOBYCC, CTRC__IGN));

!+
! Since we entered this routine, we must be in change mode.
!-

    ASSERT (2, .EDIT_MOD EQL CHANGE_MODE);

!+
! Perform initialization.
!-

    EDT$$INIT_CHM ();
    FIRST_TIME = 1;
    CC_MSG = 0;

!+
! Execute remainder of command line if there is a backslash.
!-

    IF (.PA_MORE)
    THEN
	BEGIN
	PA_MORE = 0;
	CMD_PTR = .PA_CURTOK;
	CMD_END = CH$PLUS (.PA_CURTOK, .PA_CURTOKLEN - 2);
	EDT$$TI_BUFSTR (CH$PTR (CMD_BUF ,,BYTE_SIZE), .CMD_LEN + .PA_CURTOKLEN - 2);
	JOU_VALID = 1;
	STATUS = EDT$$CHM_PAREXE (1);
	END
    ELSE
	STATUS = 1;

!+
! Make sure any previous commands have been written out to the journal file
!-

    IF ( NOT .RCOV_MOD) THEN EDT$$TI_FLUSHJOUFI (%C'T');

!+
! If an exit command was seen, get out now.
!-

    IF .EXI
    THEN
	BEGIN
	EDIT_MOD = LINE_MODE;
	EDT$$RPL_CHGDLN ();
	EXI = 0;
	RETURN (0);
	END;

!+
! Before entering the command loop, make sure the input is either coming
! from the terminal or from a recovery file.  We do not allow the startup
! file or macros to enter change mode.
!-

    IF (((.INP_SRC NEQ INP_TERM) AND ( NOT .RCOV_MOD)) OR 	!
	(.TI_TYP EQL TERM_UNKNOWN))
    THEN
	BEGIN
	EDIT_MOD = LINE_MODE;
	EDT$$FMT_MSG (EDT$_CHGMODTER);
	RETURN (0);
	END;

!+
! Set up for change mode editing.
!-
    OWED_MESSAGE = 1;

    IF ((.TI_TYP EQL TERM_VT52) OR (.TI_TYP EQL TERM_VT100))
    THEN
	BEGIN
	FMT_WRRUT = EDT$$TI_WRSTR;
!+
! Since we are about to refresh the screen, remember if there is a message,
! so we can display it.  This lets us display, for example, "Input file does not
! have standard text format" even if the first thing we do is enter change mode.
!-

	OWED_MESSAGE = .LASTMSG;
	SCR_CHGD = 2;

	END;

!+
! Now loop through, getting commands until an exit is seen or the journal file ends.
!-

    WHILE ((.EXI EQL 0) AND (.STATUS NEQ 2)) DO
	BEGIN
	IF .PUT_JOU
	THEN
	    BEGIN
	    IF ( NOT .RCOV_MOD) THEN EDT$$TI_FLUSHJOUFI (%C'T');
	    EDT$$CLR_CC ();
	    PUT_JOU = 0;
	    END;
!+
! Check for a hardcopy terminal.
!-

	IF (.TI_TYP EQL TERM_HCPY)
	THEN
	    BEGIN
!+
! Hard copy change mode.  Output a control C message if we owe one.
!-

	    CASE .CC_MSG FROM 0 TO 2 OF
		SET

		[0] : 				! We don't owe a message
		    BEGIN
		    0
		    END;

		[1] : 				! The previous operation was aborted by a control C
		    BEGIN
		    EDT$$MSG_BELL (EDT$_ABOBYCC);
		    CC_MSG = 0;
		    END;
	
		[2] : 				! The previous control C was ignored
		    BEGIN
		    EDT$$MSG_BELL (EDT$_CTRC__IGN);
		    CC_MSG = 0;
		    END;
		TES;
!+
! Type the current line with the cursor bracketed.
!-

	    IF (.WK_LN EQLA EOB_LN)
	    THEN
		EDT$$FMT_TEXT (0)
	    ELSE
		BEGIN
		EDT$$FMT_STR (CH$PTR (LN_BUF,, BYTE_SIZE),
			      CH$DIFF (.LN_PTR, CH$PTR (LN_BUF,, BYTE_SIZE)));
		EDT$$FMT_CH (%C'[');
		EDT$$FMT_CH (CH$RCHAR (.LN_PTR));
		EDT$$FMT_CH (%C']');

		IF CH$PTR_NEQ (.LN_PTR, .LN_END)
		THEN
		    EDT$$FMT_STR (CH$PLUS (.LN_PTR, 1), CH$DIFF (.LN_END, .LN_PTR) - 1);

		END;

	    EDT$$OUT_FMTBUF ();
!+
! Now get the next command string.
!-
	    STATUS = 1;

	    IF .RCOV_MOD
	    THEN
		BEGIN

		IF ( NOT EDT$$RD_JOUTXT (CMD_BUF, CMD_LEN))
		THEN
		    STATUS = 2			! Journal file ended
		ELSE
		    BEGIN

		    IF (.CMD_LEN EQL 2)
		    THEN

			IF (CH$RCHAR (CH$PTR (CMD_BUF,, BYTE_SIZE)) EQL %C'^')
			THEN

			    IF ((CH$RCHAR (CH$PTR (CMD_BUF, 1, BYTE_SIZE)) EQL %C'Z') OR 	!
				(CH$RCHAR (CH$PTR (CMD_BUF, 1, BYTE_SIZE)) EQL %C'z'))
			    THEN
				EXI = 1;
		    CMD_END = CH$PTR (CMD_BUF, .CMD_LEN, BYTE_SIZE);
		    END

		END
	    ELSE
		BEGIN
!+
! We are not recovering.
!-
!+
! Since we are about to read from the terminal, make sure the last
! line has been written to the journal file.
!-
		EXI = EDT$$RD_CMDLN (PMT_HCCHG [1], .PMT_HCCHG [0], CMD_BUF,
		    CMD_LEN, 255);
		CMD_END = CH$PTR (CMD_BUF, .CMD_LEN, BYTE_SIZE);
!+
! Put the new line in the journal file buffer.
!-

		IF .EXI
		THEN
		    BEGIN
		    EDT$$TI_BUFCH (%C'^');
		    EDT$$TI_BUFCH (%C'Z');
		    END
		ELSE
		    EDT$$TI_BUFSTR (CH$PTR (CMD_BUF,, BYTE_SIZE), .CMD_LEN);

		JOU_VALID = 1;
		END;

	    END
	ELSE
	    BEGIN
!+
! This is not a hard copy terminal.
! Erase the message line, unless it is scheduled to be erased by the next keystroke.
!-

	    IF (( NOT .MSGFLG) AND .TIN_ECHOFLG) THEN EDT$$ERA_MSGLN ();

!+
! Check for characters in type ahead.  Do not update if there
! are more characters to handle.
!-

	    IF ( NOT EDT$$TI_TSTTYAHED ())
	    THEN
		BEGIN
		FIRST_TIME = 0;
!+
! Update the screen.
! In recovery mode we update the screen only 1/10 as often, to make
! recovery go faster.
!-

		IF .RCOV_MOD
		THEN
		    BEGIN
		    RECSCRUPD = .RECSCRUPD - 1;

		    IF (.RECSCRUPD LEQ 0)
		    THEN
			BEGIN
			RECSCRUPD = 10;
			EDT$$SC_UPD ();
			END

		    END
		ELSE
		    EDT$$SC_UPD ();
!+
! Re-display the last message we saw before entering change mode.
!-

		IF (.OWED_MESSAGE NEQ 1)	! If there is a message
		THEN
		    BEGIN
		    EDT$$SC_POSCSIF (.MESSAGE_LINE + 1, 0);
		    EDT$$MSG_BELL (.OWED_MESSAGE);
		    MSGFLG = 1;			! Erase it on next keystroke
		    OWED_MESSAGE = 1;		! We no longer owe the message
		    END
		ELSE
		    BEGIN
!+
! Output a control C message if we owe one.
!-

		    CASE .CC_MSG FROM 0 TO 2 OF
			SET

			[0] : 			! We don't owe a message
			    BEGIN
			    0
			    END;

			[1] : 			! The previous operation was aborted by a control C
			    BEGIN
			    EDT$$MSG_BELL (EDT$_ABOBYCC);
			    CC_MSG = 0;
			    END;

			[2] : 			! The previous control C was ignored
			    BEGIN
			    EDT$$MSG_BELL (EDT$_CTRC__IGN);
			    CC_MSG = 0;
			    END;
			TES;

		    END;

!+
! Check for the optimized input applying.
!-

		IF ( NOT .RCOV_MOD)
		THEN
		    IF ( NOT EDT$$RD_ECHO ()) THEN EDT$$SC_POSCSIF (.CS_LNO, .CUR_COL);
		END
	    ELSE
		IF .FIRST_TIME
		THEN
		    BEGIN
		    FIRST_TIME = 0;
		    EDT$$SC_INIT ();
		    EDT$$SC_ERAALL ();
		    END;

!+
! Get the next command string.
!-
	    CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);
	    CMD_END = CH$PTR (CMD_BUF, 256, BYTE_SIZE);

	    IF EDT$$CHK_CC () THEN STATUS = 1 ELSE STATUS = EDT$$GET_KPADCMD ();

	    END;

	IF ((.STATUS EQL 1) AND ( NOT EDT$$CHK_CC ()))
	THEN
	    BEGIN
!+
! Start up the 'working' AST.
!-

	    IF (.TI_TYP NEQ TERM_HCPY) THEN EDT$$START_WKINGMSG ();

!+
! Execute the command string in CMD_BUF .
!-
	    CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);
	    STATUS = EDT$$CHM_PAREXE (1);
!+
! Turn off the 'working' AST.
!-

	    IF (.TI_TYP NEQ TERM_HCPY) THEN EDT$$STOP_WKINGMSG ();

	    END;

!+
! If the control C flag is set, the command was probably aborted by a control C.
! Invalidate the screen (since control C can sometimes cause a scroll) and arrange
! to show an appropriate message.
!-

	IF EDT$$CHK_CC ()
	THEN
	    BEGIN

	    IF (.TI_TYP NEQ TERM_HCPY) THEN SCR_CHGD = 1;

	    IF .CC_DONE THEN CC_MSG = 1 ELSE CC_MSG = 2;

	    END
	ELSE
	    CC_MSG = 0;

	END;

    EDT$$RPL_CHGDLN ();

!+
! Clean up after ourselves.  If we will be back here because this is
! just the journal file ending we will put everything back for change
! mode again.
!
! Reset the terminal as required.
!-

    EDT$$SC_RESET ();

!+
! Flag that the screen must be rebuilt from the work file.  This makes line
! mode more efficient, since it does not need to maintain the screen data base.
!-

    SCR_REBUILD = 1;

!+
! Reset the formatted write routine for line mode.
!-

    FMT_WRRUT = EDT$$TI_WRLN;
    CUR_BUF [TBCB_CHAR_POS] = CH$DIFF (.LN_PTR, CH$PTR (LN_BUF,, BYTE_SIZE));
    CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);
    CH$WCHAR (%C'!', .CMD_PTR);

    IF (.EXI NEQ 0)
    THEN
	BEGIN
	EDIT_MOD = LINE_MODE;
	EXI = 0;
	END;

    IF (.STATUS EQL 2) THEN RETURN (1) ELSE RETURN (0);

    END;					! of routine EDT$$CHM_EXE

END
ELUDOM