Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/exec.bli
There are 10 other files named exec.bli in the archive. Click here to see a list.
 %TITLE 'EXEC - enter and exit line and change mode'
MODULE EXEC (				! Enter and Exit Line and Change Mode
		IDENT = '3-007'			! File: EXEC.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 provides the initialization and termination
!	processing for entering and exiting line and change mode.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: 6-AUG-1979
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 18-FEB-1981.  This module was created by
!	extracting routine EDT$$EXE_CMD  from module EDTCTRL.
! 1-002	- Regularized the headers.  JBS 24-Feb-1981
! 1-003	- Fix the file name and module name, and remove control C handling.
!	   JBS 04-Mar-1981
! 1-004	- Use the ASSERT macro.  JBS 01-Jun-1981
! 1-005	- Don't change the current mode to line just because the change mode
!	   processor exits, since it now exits at the end of the journal file.
!	   Rearrange the looping logic to take the new recovery procedure into
!	   account; this means this module no longer has RCOV_MOD as an
!	   implicit input.  Also, remove L_LINE and L_CHANGE.  JBS 02-Oct-1981
! 1-006	- Don't fail to enter change mode if the terminal is unknown or hard copy.
!	   JBS 20-Oct-1981
! 1-007	- Take the prompt from the global rather than from a constant.  JBS 21-Oct-1981
! 1-008	- Remove length of prompt string.  JBS 23-Oct-1981
! 1-009	- Correct an error in a comment.  JBS 17-Nov-1981
! 1-010 - Put L_LINE and L_CHANGE back TMV 7-Dec-81
! 1-011	- Add control C handling for line mode.  JBS 21-Dec-1981
! 1-012	- Debug control C handling.  JBS 24-Dec-1981
! 1-013	- Before returning load MACCAL into memory, in case we are returning
!	   to it on the PDP-11.  JBS 10-Mar-1982
! 1-014	- Revise the nooverlay logic to avoid undefined symbols at build time.
!	   JBS 15-Mar-1982
! 1-015	- Remove the reference to EDT$$LOAD_MACCAL.  JBS 18-Mar-1982
! 1-016	- Add alternative control C message.  JBS 24-May-1982
! 1-017	- Remove L_LINE and L_CHANGE.  JBS 03-Jun-1982
! 1-018 - Reset command buffer if ^c seen from terminal. STS 15-Jul-1982
! 1-019	- Don't clear the control C counters unless we are reading from
!	   a terminal.  Also, treat the startup file like a macro for
!	   control C processing.  JBS 28-Jul-1982
! 1-020	- Improve the control Z ignoring logic: don't journal ignored
!	   control Z's, since three in a row will be mistaken for the
!	   end of the journal file on a /RECOVER.  JBS 29-Jul-1982
! 1-021	- Simplify the call to initialize the keypad.  JBS 13-Jul-1982
! 1-022 - Clear control C if we don't have a macro. STS 06-Oct-1982
! 3-001 - Use string pointers not addresses.  GB 09-Feb-1983
! 3-002 - Modify for the TOPS-20 parser. CJG Ides of March, 1983
! 3-003 - Don't need overlay code. CJG 17-Apr-1983
! 3-004 - Add updates from V3 source kit.  GB 27-Apr-1983
! 3-005 - Modify to use EDT$$TI_BUFSTR for journalling. CJG 15-Jun-1983
! 3-006 - Fix incorrect journalling of multicommand lines. Only journal at the
!	  end of the line. CJG 10-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_CMD : NOVALUE;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

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

GLOBAL ROUTINE EDT$$EXE_CMD (			! Execute commands
    SOURCE					! New input source
    ) : NOVALUE =

!++
! FUNCTIONAL DESCRIPTION:
!
!	Enter and exit line and change mode.
!
! FORMAL PARAMETERS:
!
!  SOURCE		new input source
!
! IMPLICIT INPUTS:
!
!	TRN_TBLINIT
!	CMD_BUF
!	CMD_LEN
!	EXITD
!	EDIT_MOD
!	TI_TYP
!	TXT_ONSCR
!	PA_STK
!	PA_MORE
!	VT52_KTBL
!	VT100_KTBL
!	PMT_LINE
!	CC_DONE
!
! IMPLICIT OUTPUTS:
!
!	INP_SRC
!	CMD_PTR
!	TXT_ONSCR
!
! ROUTINE VALUE:
!
!	0 - We have seen an EXIT command; EXITD will be set
!	1 - We have reached end of file.
!	2 - We saw a control C
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$TI_BUFSTR : NOVALUE,	! Write a line to journal buffer
	EDT$$DEF_DFLTK,			! Define default keys
	EDT$$CHM_EXE,			! Execute change mode commands
	EDT$$GET_LN,			! Read a line of input
	EDT$$PA_CMD,			! Parse a command
	EDT$$LNM_CMD,			! Execute a line mode command
	EDT$$CHK_CC,			! Check for control C
	EDT$$MSG_TOSTR : NOVALUE,	! Convert a message code to a string
	EDT$$OUT_FMTBUF : NOVALUE,	! Print the format buffer
	EDT$$CLR_CC : NOVALUE,		! Clear control C flag
	EDT$$FMT_CRLF : NOVALUE;	! End of output line

    EXTERNAL
	TRN_TBLINIT,			! Translate table init flag
	CMD_END,			! Pointer to end of command
	CMD_BUF,			! Command line buffer
	CMD_PTR,			! Pointer into command line buffer
	CMD_LEN,			! Length of current command
	EXITD,				! Did we exit with the last command?
	INP_SRC,			! Source of input commands
	EDIT_MOD,			! Current editing mode
	TXT_ONSCR,			! Text was written to screen
	PA_STK,				! Parser semantic stack
	PA_MORE,			! More input on current line
	PMT_LINE : VECTOR,		! Counted ASCII string of line-mode prompt
	CC_DONE,			! Set if control C actually aborted anything
	TIN_OBUFPOS,			! Current length of journal record
	JOU_VALID;			! Set to 1 if there is a record in the journal buffer

!+
! Specify the messages used in this routine.
!-
    MESSAGES ((ABOBYCC, CTRC__IGN));

    LOCAL
	STATUS,
	SAVE_SOURCE,
	EOF_FLAG;				! 1 = reached end of file, 2 = control C

!+
! If we are not coming from the terminal but a control C has been typed, get out now.
!-

    IF ((.INP_SRC NEQ INP_TERM) AND (.INP_SRC NEQ INP_JOURNAL))
    THEN

	IF EDT$$CHK_CC ()
	THEN
	    BEGIN
	    CC_DONE = 1;
	    RETURN (2);
	    END;

    SAVE_SOURCE = .INP_SRC;
    INP_SRC = .SOURCE;
    CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);

    PA_MORE = 0;
    EOF_FLAG = 0;

    WHILE ((.EOF_FLAG EQL 0) AND ( NOT .EXITD)) DO

	IF (.EDIT_MOD EQL CHANGE_MODE)
	THEN
!+
! We are in change mode, go into the change mode processor.
!-
	    BEGIN

!+
! Init the keypad translation table if necessary.
! If the initialization fails, drop into line mode.
!-
	    STATUS = 1;

	    IF ( NOT .TRN_TBLINIT) THEN STATUS = EDT$$DEF_DFLTK ();

	    IF (.STATUS EQL 1)
	    THEN
		EOF_FLAG = EDT$$CHM_EXE ()
	    ELSE
		BEGIN
		EDT$$MSG_TOSTR (.STATUS);
		EDT$$FMT_CRLF ();
		EDIT_MOD = LINE_MODE;
		END;

!+
! EDT$$CHM_EXE returns after a series of commands.  It returns on the EXIT
! command (which sets EDIT_MOD to LINE_MODE) and at the end of the
! journal file.  In the latter case it returns a 1; if it returns because
! of exiting it returns a 0.
!-
	    END
	ELSE
	    BEGIN
	    IF (.INP_SRC NEQ INP_MACRO) THEN EDT$$CLR_CC ();

	    ASSERT (2, .EDIT_MOD EQL LINE_MODE);	! We are in line mode
!+
! See if we must read a line.
!-
	    IF (.PA_MORE EQL 0) THEN
		BEGIN

		WHILE ((EDT$$GET_LN (1, PMT_LINE [1], .PMT_LINE [0]) NEQ 0) AND ( NOT .EOF_FLAG))
		DO
		    BEGIN

		    IF (.INP_SRC NEQ INP_TERM)
		    THEN
			EOF_FLAG = 1
		    ELSE
			BEGIN
!+
! This is an EOF from the terminal, invalidate the journal buffer.
! If we journal this it may be confused with the end of the journal file.
!-
			TIN_OBUFPOS = 0;
			JOU_VALID = 0;
			END;

		    END;

		END;


!+
! Parse and execute the command. (Unless it is a comment or we have reached EOF.)
!-

	    IF ( NOT .EOF_FLAG)
	    THEN
		BEGIN

		STATUS = EDT$$PA_CMD (CH$PTR (PMT_LINE [1],, BYTE_SIZE),
		    (IF (.INP_SRC EQL INP_TERM)
			THEN .PMT_LINE [0]
			ELSE 0));
!+
! Write the command to the journal file
!-

		IF ((.INP_SRC EQL INP_TERM) AND (.PA_MORE EQL 0)) THEN
		    BEGIN
		    EDT$$TI_BUFSTR (CH$PTR (CMD_BUF,, BYTE_SIZE), .CMD_LEN - 2);
		    JOU_VALID = 1;
		    END;

		IF .STATUS THEN
		    EDT$$LNM_CMD (PA_STK)
		ELSE
		    TXT_ONSCR = .TXT_ONSCR + 1;

!+
! If the control C flag is set, it is likely that the command was aborted
! by a control C.
!-

		IF EDT$$CHK_CC ()
		THEN
		    BEGIN
		    IF ((.INP_SRC EQL INP_TERM) OR (.INP_SRC EQL INP_JOURNAL))
		    THEN
			BEGIN

			IF CH$PTR_NEQ (.CMD_PTR, CH$PTR (CMD_BUF,, BYTE_SIZE))
			THEN
			    CC_DONE = 1;

			IF (.CC_DONE)
			THEN
			    EDT$$MSG_TOSTR (EDT$_ABOBYCC)
			ELSE
			    EDT$$MSG_TOSTR (EDT$_CTRC__IGN);

			EDT$$OUT_FMTBUF ();
!+
! We've seen a control C from the terminal, so clear out the command buffer.
!-
			CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);
			CMD_END = .CMD_PTR;
!			CH$WCHAR (%C'!', .CMD_END);
			END
		    ELSE
!+
! We have seen a control C but we are not reading from the terminal.  Return to our caller, who
! will arrange to print an appropriate message.
!-
			BEGIN
			CC_DONE = 1;
			EOF_FLAG = 2;
			END;

		    END;

		END;

	    END;

!+
! When the loop falls through we have either reached an end of file or
! seen an EXIT command.  Tell the caller which.
!-
    INP_SRC = .SAVE_SOURCE;
    RETURN (.EOF_FLAG);
    END;


END
ELUDOM