Google
 

Trailing-Edge - PDP-10 Archives - bb-h138f-bm - 7-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) 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 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