Trailing-Edge
-
PDP-10 Archives
-
BB-H138F-BM_1988
-
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