Google
 

Trailing-Edge - PDP-10 Archives - BB-AE97C-BM - sources/chmchkcc.bli
There are 11 other files named chmchkcc.bli in the archive. Click here to see a list.
 %TITLE 'CHMCHKCC - check for control C'
MODULE CHMCHKCC (				! Check for control C
		IDENT = '3-005'			! File: CHMCHKCC.BLI Edit: CJG3005
		) =
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 checks to see if a CTRL/C has been typed.
!
! 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 routine EDT$$CHK_CC  from module CHANGE.BLI.
! 1-002	- Regularize headers and remove control C checking, since we intend to
!	   re-do it to support journaling.  JBS 27-Feb-1981
! 1-003	- Fix module name.  JBS 02-Mar-1981
! 1-004	- Revise journaling to support control C.  JBS 22-Jun-1981
! 1-005	- Add logic for recovering during control C.  JBS 18-Dec-1981
! 1-006	- Debug control C journaling.  JBS 24-Dec-1981
! 1-007	- Change names of control C data.  JBS 29-Dec-1981
! 1-008	- Use two words for control C counters.  JBS 30-Dec-1981
! 1-009	- Print the 'working' message from this routine.  JBS 13-Jan-1982
! 1-010	- Use symbols instead of magic numbers for control C journaling.  JBS 24-May-1982
! 1-011 - Change the format of the working message.  SMB 28-Jun-1982
! 1-012 - Figure out whether the journal buffer should be flushed. STS 28-Sep-1982
! 1-013	- Don't destroy the cursor position, it is now being maintained accurately.  JBS 07-Oct-1982
! 1-014	- Clear EDT$$G_SECOND after printing or erasing the working message, so
!	   we do not spend all our time printing the working message on slow terminals.  JBS 07-Oct-1982
! 3-001 - Add updates from V3 sources.  GB 26-Apr-1983
! 3-002 - Fix working message for TOPS-20 operation. CJG 15-Jun-1983
! 3-003 - Modify Control-C code slightly. CJG 17-Jun-1983
! 3-004 - Simplify the timer again. CJG 24-Nov-1983
! 3-005 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--
%SBTTL 'Declarations'
!
! TABLE OF CONTENTS:
!

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$CHK_CC;				! Check to see if a CTRL/C has been typed

!
! INCLUDE FILES:
!

REQUIRE 'SYS:JSYS';

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!

LITERAL
    JOU_MAX = 20,
    WORK_COL = 26;

!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$CHK_CC  - check for control C'

GLOBAL ROUTINE EDT$$CHK_CC 			! Check for control C
=

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine checks to see if a CTRL/C has been typed.
!	It is called frequently enough that the response to typing a control C
!	is reasonably fast.  It keeps track of how often it has been called
!	since the last journal record was written so it can do the same during
!	recovery.
!
!	This routine is also responsible for printing the 'working' message.
!	The flag SECOND is set once a second by an AST.  If it is set
!	this routine clears it and either prints or erases the 'working' message.
!
! FORMAL PARAMETERS:
!
!	NONE
!
!IMPLICIT INPUTS:
!
!	FMT_WRRUT
!    	MESSAGE_LINE
!	RCOV_MOD
!	CC
!	CC_CNT1
!	CC_CNT2
!	CC_FLAG
!	SECOND
!	WORKCOUNT
!
! IMPLICIT OUTPUTS:
!
!	CC_CNT1
!	CC_CNT2
!	CC_FLAG
!	SECOND
!	WORKCOUNT
!
! ROUTINE VALUE:
!
!	0		no control C typed
!	1		control C was typed
!
! SIDE EFFECTS:
!
!	May print or erase the 'working' message.
!
!--

BEGIN

EXTERNAL
	PUT_JOU,			! Flag to put journal buffer
	TIN_OBUFPOS,			!
	FMT_WRRUT,			! Address of output formatter
	MESSAGE_LINE,			! Working on this line + 1
	CC : VOLATILE,			! 1 = a control C has been typed
	CC_CNT1,			! Counts number of "no control C's" returned.
	CC_CNT2,			! Loaded with value from control C record
	CC_FLAG,			! 1 = a control C record was read or written
	RCOV_MOD,			! 1 = /RECOVER
	SECOND : VOLATILE,		! Set once a second
	WORKCOUNT;			! Counter to support the 'working' message

EXTERNAL ROUTINE
	EDT$$TI_WRSTR,			! String format for working
	EDT$$OUT_FMTBUF,		! Output format buffer to terminal
	EDT$$SC_ERATOEOL,		! Erase to end of current line
	EDT$$SC_POSCSIF,		! Absolute cursor positioning
	EDT$$SC_REVID : NOVALUE,	! Set screen to reverse video
	EDT$$MSG_TOSTR,			! Write out the working message
	EDT$$TI_FLUSHJOUFI : NOVALUE;	! Write a record on the journal file

    LOCAL
	FORMAT_ROUTINE;			! Save the format routine entered with


    MESSAGES ((WORKING));

!+
! If a second has passed since we were last here, print or erase the
! 'working' message.
!-

    IF ((.WORKCOUNT GEQ 0) AND (.SECOND NEQ 0))
    THEN
	BEGIN
	WORKCOUNT = .WORKCOUNT + 1;
	FORMAT_ROUTINE = .FMT_WRRUT;
	FMT_WRRUT = EDT$$TI_WRSTR;
	EDT$$SC_POSCSIF (.MESSAGE_LINE + 1, WORK_COL);
	EDT$$SC_REVID ();
	IF .WORKCOUNT THEN EDT$$MSG_TOSTR (EDT$_WORKING) ELSE EDT$$SC_ERATOEOL ();

	EDT$$OUT_FMTBUF ();
	FMT_WRRUT = .FORMAT_ROUTINE;
	SECOND = 0;
	END;

!+
! If we are in recovery mode, use the counters to
! simulate typing a control C at the right point.
!-

    IF .RCOV_MOD
    THEN
	BEGIN
!+
! If CC_FLAG is zero, there has been no control C record.
!-

	IF (.CC_FLAG EQL 0) THEN RETURN (0);

!+
! If the counters match, it is time to return a control C.
!-

	IF (.CC_CNT1 EQL .CC_CNT2)
	THEN
	    BEGIN
	    PUT_JOU = 1;
	    RETURN (1);
	    END;

!+
! Otherwise, we are one count closer to a control C.
!-

	CC_CNT1 = .CC_CNT1 + 1;
	ASSERT (4, .CC_CNT1 LEQ CC_CTR_MAX);
	RETURN (0);
	END
    ELSE
	BEGIN
!+
! We are not recovering.
!-

	IF (.CC NEQ 0)
	THEN
	    BEGIN
!+
! A control C was typed.  Write out a control C record in case
! we must recover to this point, unless we have already written it.
!-

	    PUT_JOU = 1;
	    IF (.CC_FLAG EQL 0)
	    THEN
		BEGIN
		EDT$$TI_FLUSHJOUFI (%C'C');
		CC_FLAG = 1;
		END;

	    RETURN (1);
	    END;

!+
! Keep track of the number of times we are called but no control C has
! been typed; that is, count the number of times we return 0.  This
! number will be written to the journal file later, when and if we see a
! control C, so that we can read it into the second counter on recovery,
! and thus return 1 at the same point in EDT's execution.
!-

	CC_CNT1 = .CC_CNT1 + 1;
	ASSERT (4, .CC_CNT1 LEQ CC_CTR_MAX);

!+
! check to see if the journal buffer should be written out and
! the control-c counter restarted
!-

	IF (.TIN_OBUFPOS GEQ JOU_MAX) THEN PUT_JOU = 1;

	RETURN (0);
	END;
    END;

END
ELUDOM