Google
 

Trailing-Edge - PDP-10 Archives - bb-h138f-bm - 7-sources/tichar.bli
There are 10 other files named tichar.bli in the archive. Click here to see a list.
 %TITLE 'TICHAR - input a character'
MODULE TICHAR (				! Input a character
		IDENT = '3-003'			! File: TICHAR.BLI Edit: CJG3003
		) =
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:
!
!	Input a character.
!
! ENVIRONMENT:	Runs at any access mode - AST reentrant
!
! AUTHOR: Bob Kushlis, CREATION DATE: June 9, 1979
!
! MODIFIED BY:
!
! 1-001	- Original.  DJS 18-FEB-1981.  This module was created by
!	extracting routine EDT$$TI_INPCH  from module TINPUT.
! 1-002	- Regularize headers.  JBS 10-Mar-1981
! 1-003	- Revise journaling.  JBS 22-Jun-1981
! 1-004	- Fix reading journal file.  JBS 08-Jul-1981
! 1-005	- Don't flush the journal record in the middle of an escape sequence.
!	   JBS 08-Jul-1981
! 1-006	- Return 0 if the journal file ends.  JBS 01-Oct-1981
! 1-007	- Use the global prompt string, if specified.  JBS 21-Oct-1981
! 1-008	- Remove length of prompt string.  JBS 23-Oct-1981
! 1-009	- Revise autorepeat logic, putting it in a subroutine.  JBS 30-Jan-1982
! 1-010	- Flush the terminal buffer after turning off Autorepeat.
!	   JBS 31-Jan-1982
! 1-011	- Add JOU_VALID.  JBS 09-Apr-1982
! 1-012	- Allow for 8-bit keyboards.  JBS 17-Aug-1982
! 1-013	- Add SS3 for 8-bit keyboards.  JBS 20-Aug-1982
! 1-014	- Revise read-ahead logic.  JBS 02-Sep-1982
! 1-015 - Don't write out to the journal file here. 07-Oct-1982
! 1-016	- Add VT220 support conditional.  JBS 11-Feb-1983
! 3-001 - Make argument to FLUSHJOUFI %C.  GB 08-Mar-1983
! 3-002 - Remove VT220 conditional to speed up code. CJG 25-Nov-1983
! 3-003 - Check for VT52 and clear parity bit if it is a VT52. CJG 26-Jan-84
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$TI_INPCH;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

LIBRARY 'EDTSRC:TRANSLATE';

!
! MACROS:
!
!	NONE
!
! EQUATED SYMBOLS:
!
!	NONE
!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!
!	In the routine
%SBTTL 'EDT$$TI_INPCH  - input a character'

GLOBAL ROUTINE EDT$$TI_INPCH (			! Input a character
    BUF						! Where to store character
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine gets the next character from input.  If recovery mode is on
!	then the character is read from the journal file.   If not, then we check
!	to see if the character was read previously, and take it from the type-
!	ahead character; otherwise, we read a chraracter from the terminal.  If the
!	character is not coming from the journal file, it is written to it.
!
! FORMAL PARAMETERS:
!
!  BUF 			the address of a fullword in which the character is returned.
!
! IMPLICIT INPUTS:
!
!	RCOV_MOD
!	K_AUTRPT
!	TIN_IRECEND
!	RDAHEDBF
!	RDAHED
!	TIN_INREC
!	TIN_IBUFPTR
!	PMT_KPD
!	PMT_NOKPD
!	KPAD
!
! IMPLICIT OUTPUTS:
!
!	TIN_IRECLEN
!	RDAHED
!	TIN_IBUFPTR
!	JOU_VALID
!
! ROUTINE VALUE:
!
!	1 = got a character, 0 = end of journal file
!
! SIDE EFFECTS:
!
!	May turn off auto-repeat.
!
!--

    BEGIN

    EXTERNAL ROUTINE
	EDT$$RD_JOUTXT,				! Read a text record from the journal file
	EDT$$OUT_FMTBUF,
	EDT$$FMT_LIT,
	EDT$$TI_GETCH,
	EDT$$TI_BUFCH : NOVALUE,
	EDT$$TI_ENBLAUTREP : NOVALUE;		! Enable and disable autorepeat

    EXTERNAL
	RCOV_MOD,			! Recovery mode flag
	K_AUTRPT,			! Auto repeat flag
	RDAHED,				! Type ahead counter
	RDAHEDBF,			! Type ahead buffer
	TIN_IBUFPTR : REF VECTOR,	! Pointer into journal input buffer
	TIN_IRECLEN,			! Length of journal input record
	TIN_INREC,			! Journal input record buffer
	TIN_IRECEND,			! Pointer to end of journal input buffer
	PMT_KPD : VECTOR,		! Counted ASCII string for keypad mode prompt
	PMT_NOKPD : VECTOR,		! Counted ASCII string for nokeypad mode prompt
	KPAD,				! 1 = keypad change mode, 0 = nokeypad change mode
	TI_TYPE,			! Terminal type
	JOU_VALID,			! 1 = journal record is valid
	CHAR_INFO : BLOCKVECTOR [256, 1];	! Information about characters

!+
! Check for recovery mode.
!-

    IF .RCOV_MOD
    THEN
	BEGIN

!+
! Make sure we have a character in the buffer.
!-

	WHILE (CH$PTR_EQL (.TIN_IBUFPTR, .TIN_IRECEND) OR (.TIN_IBUFPTR EQL 0)) DO
	    BEGIN

!+
! No characters left, try to read a new record from the journal
! file.
!+

	    IF EDT$$RD_JOUTXT (TIN_INREC, TIN_IRECLEN)
	    THEN
		BEGIN
		TIN_IRECEND = CH$PTR (TIN_INREC, .TIN_IRECLEN, BYTE_SIZE);
		TIN_IBUFPTR = CH$PTR (TIN_INREC, 0, BYTE_SIZE);
		END
	    ELSE

!+
! No more records in the journal file, arrange to return to the root.
!-

		RETURN (0);

	    END;

!+
! Return next character from the journal buffer.
!-

	.BUF = CH$RCHAR_A (TIN_IBUFPTR);
	END
    ELSE

!+
! Not in recovery mode, check for type ahead.
!-

	BEGIN

!+
! If there are any characters in the type-ahead buffer, use the first.
! Otherwise block waiting for the user to type something.
!-

	IF (.RDAHED GTR 0)
	THEN
	    BEGIN

!+
! Return the oldest typed ahead character, and shuffle the buffer.
!-

	    RDAHED = .RDAHED - 1;
	    .BUF = CH$RCHAR (CH$PTR (RDAHEDBF,, BYTE_SIZE));

	    IF (.RDAHED GTR 0)		!
	    THEN
		CH$MOVE (.RDAHED, CH$PTR (RDAHEDBF, 1, BYTE_SIZE),
				  CH$PTR (RDAHEDBF, 0, BYTE_SIZE));

	    END
	ELSE
	    BEGIN

!+
! Read the character from the terminal.  Prompt first if requested.
!-

	    LOCAL
		PROMPT_ADDR : REF VECTOR [8];

	    PROMPT_ADDR = (IF .KPAD THEN PMT_KPD ELSE PMT_NOKPD);

	    IF (.PROMPT_ADDR [0] GTR 0)
	    THEN
		BEGIN
		EDT$$FMT_LIT (CH$PTR (PROMPT_ADDR [1],, BYTE_SIZE), .PROMPT_ADDR [0]);
		EDT$$OUT_FMTBUF ();
		END;

	    EDT$$TI_GETCH (.BUF);
	    END;

!+
! Make sure the character is journaled.
!-

	IF (.TI_TYPE EQL TERM_VT52) THEN .BUF = ..BUF AND %O'177';
	EDT$$TI_BUFCH (..BUF);
	JOU_VALID = 1;

!+
! If the character was an escape, CSI or SS3, turn auto-repeat off.
! This also disables dumping the journal buffer, so that a
! journal record can contain an entire escape or control sequence.
!-

	IF .CHAR_INFO [..BUF, CI_ESC]
	THEN
	    BEGIN
	    EDT$$TI_ENBLAUTREP (0);
	    EDT$$OUT_FMTBUF ();
	    END;

	END;

    RETURN (1);
    END;					! of routine EDT$$TI_INPCH


END
ELUDOM