Google
 

Trailing-Edge - PDP-10 Archives - BB-AE97C-BM - 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) 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 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