Google
 

Trailing-Edge - PDP-10 Archives - tops20-v7-ft-dist1-clock - 7-sources/input.bli
There are 10 other files named input.bli in the archive. Click here to see a list.
 %TITLE 'INPUT - read a line of input'
MODULE INPUT (				! Read a line of input
		IDENT = '3-009'			! File: INPUT.BLI Edit: CJG3009
		) =
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 is called whenever an input line is required for a
!	command or an insert.  This module handles fetching of lines
!	from macros or from the initialization file.
!
! ENVIRONMENT: User mode, sharable
!
! AUTHOR: Bob Kushlis, CREATION DATE: 4-Feb-1979
!
! MODIFIED BY:
!
! Dan Szymanski, 17-NOV-80, 02
!	Change to EDT$$GET_LN  so that a line of input from the terminal
!	which consists of only the two characters ^z or ^Z are not
!	considered to be an end-of-file.
! 2-003	- Regularized headers.  JBS 24-Feb-1981
! 2-004	- Fix module name.  JBS 06-Mar-1981
! 2-005	- Use the ASSERT macro.  JBS 01-Jun-1981
! 2-006	- Remove explicit journaling.  JBS 22-Jun-1981
! 2-007	- Use new journaling interface.  JBS 08-Jul-1981
! 2-008	- Separate reading of the startup file from reading of the journal file.
!	   JBS 16-Aug-1981
! 2-009 - Make command file i/o use EDT$FILEIO.  STS 25-Dec-1981
! 2-010 - Remove DSC$A_POINTER macro  STS 14-Jan-1982
! 2-011 - Convert  reads and writes to use EDT$FILEIO. STS 15-Jan-1981
! 2-012 - Add rhb_descriptor. STS 21-Jan-1982
! 2-013 - Remove reference to sys_cmdrab. STS 10-Feb-1982
! 2-014 - Add literals for callable parameters. STS 08-Mar-1982
! 2-015	- Add JOU_VALID.  JBS 09-Apr-1982
! 2-016 - Make sure an insert line terminated by ^Z gets journalled. STS 24-Jun-1982
! 3-001 - Make all quoted string arguments %C so they are right justified.  GB 09-Feb-1983
! 3-002 - Put the command in the rescan buffer if the parser will be called
!	  next. In terminal mode - don't do anything. CJG Ides of March, 1983
! 3-003 - Don't need RHB code on TPS20. CJG 19-Apr-1983
! 3-004 - Add updates from V3 kit.  GB 27-Apr-1983
! 3-005 - Remove call to EDT$$CALLFIO. CJG 10-Jun-1983
! 3-006 - Modify to use EDT$$TI_BUFSTR for journalling. CJG 15-Jun-1983
! 3-007 - Scan input from command file for nulls and convert to ^_ which the
!         parser can understand. CJG 8-Nov-1983
! 3-008 - Make sure that Control-H works in the main parser. CJG 20-Dec-1983
! 3-009 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

FORWARD ROUTINE
    EDT$$GET_LN;

!
! INCLUDE FILES:
!

REQUIRE 'SYS:JSYS';

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!
! EQUATED SYMBOLS:
!

EXTERNAL LITERAL
    EDT$K_GET,
    EDT$K_COMMAND_FILE;

!
! OWN STORAGE:
!
!	NONE
!
! EXTERNAL REFERENCES:
!

EXTERNAL
    CMD_BUF,
    CMD_LEN,
    CMD_END,
    CMD_PTR,
    TEMP_BUFFER,
    SAV_CNT,
    RCOV_MOD,
    INP_SRC,
    MAC_BUF,
    CUR_BUF,
    VFY,
    EOB_LN,
    WK_LN : REF LIN_BLOCK,
    JOU_VALID;				! 1 = journal record is valid


EXTERNAL ROUTINE
    EDT$FILEIO,
    EDT$$RD_JOUTXT,			! Read a text line from the journal file
    EDT$$TI_BUFCH : NOVALUE,		! Put a character in the journal file buffer
    EDT$$TI_BUFSTR : NOVALUE,		! Put a string in the journal file
    EDT$$TI_FLUSHJOUFI : NOVALUE,	! Write out journal file buffer
    EDT$$TI_WRLN,
    EDT$$RD_CMDLN,
    EDT$$RD_CURLN,
    EDT$$RD_NXTLN;

%SBTTL 'EDT$$GET_LN  - return a line'

GLOBAL ROUTINE EDT$$GET_LN (			! Return a line
    PARSE,					! 1=parser will be called next
    PROMPT, 					! Address of the prompt
    PR_LEN					! Length of the prompt
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
!	This routine returns a line from the current macro or from the
!	terminal or command file.
!
! FORMAL PARAMETERS:
!
!  PROMPT		The address of a prompt string for terminal input
!
!  PR_LEN		The length of the prompt
!
!
! IMPLICIT INPUTS:
!
!	INP_SRC    - 	tells where the input line will come from.
!	RCOV_MOD
!	WK_LN
!	MAC_BUF
!	VFY
!
! IMPLICIT OUTPUTS:
!
!	CMD_BUF
!	CMD_LEN
!	CUR_BUF
!	CMD_END
!	CMD_PTR
!	JOU_VALID
!
! COMPLETION CODES:
!
!	0	-	No eof occured on this line
!	1	-	An eof did occur
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    LOCAL
	FILE_DESC : BLOCK [1],
	EOF;

    FILE_DESC [DSC$A_POINTER] = 0;
    FILE_DESC [DSC$W_LENGTH] = 0;
    EOF = 0;

    CASE .INP_SRC FROM INP_TERM TO INP_JOURNAL OF
	SET

	[INP_TERM] :
!+
! Input is coming from the terminal (or command procedure)
!-
	    BEGIN
!+
! Since we are about to read from the terminal, make sure the last
! line has been written to the journal file.
!-
	    EDT$$TI_FLUSHJOUFI (%C'T');
	    IF (NOT .PARSE) THEN
		BEGIN
		EOF = EDT$$RD_CMDLN (.PROMPT, .PR_LEN, CMD_BUF, CMD_LEN, 255);
!+
! Put the new line in the journal file buffer.
!-
		EDT$$TI_BUFSTR (CH$PTR (CMD_BUF,, BYTE_SIZE), .CMD_LEN);

		IF .EOF
		THEN
		    BEGIN
		    EDT$$TI_BUFCH (%C'^');
		    EDT$$TI_BUFCH (%C'Z');
		    END;


!+
! Even if we put no characters into the journal record (because the line
! is empty) it is important to output the record next time around, since
! an empty record changes the current line.
!-
		JOU_VALID = 1;
		END;
	    END;

	[INP_JOURNAL] :
!+
! Input is coming from the journal file.
!-
	    BEGIN
	    ASSERT (13, .RCOV_MOD);

	    IF EDT$$RD_JOUTXT (CMD_BUF, CMD_LEN)
	    THEN
		EDT$$TI_WRLN (CMD_BUF, .CMD_LEN)
	    ELSE
		BEGIN
		EOF = 1;
		CMD_LEN = 0;
		END

	    END;

	[INP_COMMAND] :
!+
! Input is coming from the startup file.
!-
	    BEGIN

	    LOCAL
		C,
		P1,
		P2,
		STATUS;

	    STATUS = EDT$FILEIO (EDT$K_GET, EDT$K_COMMAND_FILE, FILE_DESC);

	    IF .STATUS
	    THEN
		BEGIN
		CMD_LEN = .FILE_DESC [DSC$W_LENGTH];
		P1 = CH$PTR (.FILE_DESC [DSC$A_POINTER],, BYTE_SIZE);
		P2 = CH$PTR (CMD_BUF,, BYTE_SIZE);

!+
!Scan through the command line looking for nulls. Convert these to ^_ for
!the parser.
!-
		INCR I FROM 1 TO .CMD_LEN DO
		    BEGIN
		    C = CH$RCHAR_A (P1);
		    IF (.C EQL 0) THEN C = %O'37';
		    CH$WCHAR_A (.C, P2);
		    END;

		END
	    ELSE
		BEGIN
		EOF = 1;
		CMD_LEN = 0;
		END;

	    END;

	[INP_MACRO] :
	    BEGIN

	    LOCAL
		SAVE_TBCB;

	    SAVE_TBCB = .CUR_BUF;
	    CUR_BUF = .MAC_BUF;
	    EDT$$RD_CURLN ();

	    IF (.WK_LN NEQA EOB_LN )
	    THEN
		BEGIN
		CH$MOVE (.WK_LN [LIN_LENGTH], CH$PTR (WK_LN [LIN_TEXT],, BYTE_SIZE),
		    CH$PTR ( CMD_BUF,, BYTE_SIZE));
		CMD_LEN = .WK_LN [LIN_LENGTH];
		EDT$$RD_NXTLN ()
		END
	    ELSE
		BEGIN
		EOF = 1;
		CMD_LEN = 0;
		END;

	    CUR_BUF = .SAVE_TBCB;
	    EDT$$RD_CURLN ();
	    END;

	[INRANGE, OUTRANGE] :
	    ASSERT (9, 0);
	TES;

!+
! If input is coming from a file see if the line ended with ^Z or EOF found.
!-

    IF ((.INP_SRC NEQ INP_TERM) AND ( NOT .EOF)) THEN
	BEGIN

	IF CH$EQL (2, CH$PTR (CMD_BUF, .CMD_LEN - 2, BYTE_SIZE),
		   2, CH$PTR (UPLIT (%STRING('^Z'))))
	THEN
	    BEGIN
	    CMD_LEN = .CMD_LEN - 2;
	    EOF = 1;
	    END;

	IF .VFY THEN EDT$$TI_WRLN (CMD_BUF, .CMD_LEN);

	IF .PARSE THEN
	    BEGIN
	    LOCAL
		PTR;

!+
! If the data is required for the parser, then copy the command to the rescan
! buffer (unless its from the terminal). The string must be terminated by
! <CR><LF><NUL> for this to work.
!-

	    PTR = CH$MOVE (.CMD_LEN, CH$PTR (CMD_BUF,, BYTE_SIZE),
				     CH$PTR (TEMP_BUFFER,, BYTE_SIZE));
	    PTR = CH$MOVE (3, CH$PTR (UPLIT (%STRING (%CHAR (ASC_K_CR, ASC_K_LF, 0)))), .PTR);
	    _RSCAN (CH$PTR (TEMP_BUFFER,, BYTE_SIZE));
	    _RSCAN ($RSINI);
	    END;

	END;


    CMD_END = CH$PTR (CMD_BUF, .CMD_LEN, BYTE_SIZE);
    CMD_PTR = CH$PTR (CMD_BUF,, BYTE_SIZE);

    RETURN (.EOF);
    END;


END
ELUDOM