Google
 

Trailing-Edge - PDP-10 Archives - BB-AE97C-BM - sources/fileio.bli
There are 12 other files named fileio.bli in the archive. Click here to see a list.
 %TITLE 'IO - Central file I/O module'
MODULE FILEIO (					! Central file I/O routine for EDT
		IDENT = '3-009'			! File: FILEIO.BLI Edit: GB3009
		) =
BEGIN
!
!			  COPYRIGHT (c) 1980, 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 is the central file i/o routine used by EDT.
!
! ENVIRONMENT:	Runs in user mode on VAX/VMS & TOPS and non-privileged PDP-11
!
! AUTHOR: Shelly T. Solomon, CREATION DATE: 07-Dec-1981
!
! MODIFIED BY:
!
! 1-001	- Original.  STS 25-Dec-1981
! 1-002 - Change module name to EDT$FILEIO.  STS 25-Dec-1981
! 1-003 - Add calls for include file.  STS 26-Dec-1981
! 1-004 - Add require files for 11 translations. STS 28-Dec-1981
! 1-005 - Add linkage attribute to routine.  STS 30-Dec-1981
! 1-006 - Signal any errors.  STS 06-Jan-1982
! 1-007 - Add code for opening output file. STS 13-Jan-1982
! 1-008 - Fix DSC$A_POINTER macro STS 14-Jan-1982
! 1-009 - Add gets and puts STS 15-Jan-1982
! 1-010 - Change opening journal file to open in-out. STS 18-Jan-1982
! 1-011 - Fixed undefined symbol EDT$$opn_inout on 11. STS 19-Jan-1982
! 1-012 - output filenames with error messages. STS 19-Jan-1982
! 1-013 - Change the defaulting of the journal file name. STS 21-Jan-1982
! 1-014 - Add check to see if file is VFC format. STS 22-Jan-1982
! 1-015 - fix journal file name for 11's. STS 26-Jan-1982
! 1-016 - Add dot to sequence parameter passed with journal file.
!		STS 28-Jan-1982
! 1-017 - Pass RHB info down to 11 i/o routines. STS 02-Feb-1982
! 1-018 - Take out extra dot in get on 11's, also
!	  fix include rab. STS 08-Feb-1982
! 1-019 - add flush for journal buffer. STS 11-Feb-1982
! 1-020 - Take out call to edt$$get_fnam. STS 12-Feb-1982
! 1-021 - Pass cler. STS 26-Feb-1982
! 1-022 - Add literals for callable parameters. STS 08-Mar-1982
! 1-023 - Fix status passed on opening write file. STS 10-Mar-1982
! 1-024	- Rearrange interface to EDT$IOMOD to improve the rationality
!	   of file naming.  JBS 25-Mar-1982
! 1-025	- Worry about non-standard input files.  JBS 26-Mar-1982
! 1-026	- Correct a typo.  JBS 27-Mar-1982
! 1-027	- Make the new file handling logic work on the PDP-11.  JBS 29-Mar-1982
! 1-028 - Use temporary file for WRITE and EXIT and then Rename it.  SMB 31-Mar-1982
! 1-029	- Add related file names for the PDP-11.  JBS 31-Mar-1982
! 1-030	- Distinguish two cases of output open for journal files on the PDP11
!	  and add a flush counter to improve PDP-11 performance.  JBS 01-Apr-1982
! 1-031	- Rearrange file name handling for the journal file.  JBS 02-Apr-1982
! 1-032 - Make more modifications for WRITE/EXIT to temp files.  SMB 02-Apr-1982
! 1-033	- Cannot use %REF in STRING_DESC.  JBS 03-Apr-1982
! 1-034 - Fix bugs in PDP-11 opening of output files.  SMB 06-Apr-1982
! 1-035 - Add rename for PDP-11's and CLOSE_DEL for output files.  SMB 08-Apr-1982
! 1-036 - Convert PDP-11 filenames to uppercase.  SMB 12-Apr-1982
! 1-037 - Take out fix 1-036(move to LWRITE)-fix error message filename for VAX.  SMB 13-Apr-1982
! 1-038	- Always return status when closing PDP-11 files.  JBS 09-Apr-1982
! 1-039	- Reverse the attributes flag.  JBS 12-Apr-1982
! 1-040	- Merge the last four edits, which were done independently.  JBS 15-Apr-1982
! 1-041 - Add a parse before opening output files.  SMB 15-Apr-1982
! 1-042 - Put back line accidently deleted for filename storage.  SMB 16-Apr-1982
! 1-043 - Conditionalize the conversion to uppercase.  SMB 22-Apr-1982
! 1-044 - Restrict renaming to disks or DECtapes only.  SMB  26-Apr-1982
! 1-045 - Change the ordinals of global literals for file types.  SMB 19-May-1982
! 1-046 - Add some comments. STS 19-May-1982
! 1-047	- Clean up the magic numbers.  JBS 25-May-1982
! 1-048 - Don't use special linkage on 11's. STS 03-Jun-1982
! 1-049	- On OPEN, use RHB as the default name.  Also, don't use special linkages on
!	   VAX either, since the special linkage used by CALLFIO is compatible with
!	   the standard VAX/VMS linkage conventions.  JBS 15-Jun-1982
! 1-050	- Implement the new file defaulting rules.  JBS 17-Jun-1982
! 1-051 - Signal any bad status from flushing the journal file. STS 30-Jun-1982
! 1-052 - Fix bad parameter pass in open for output without related names.  SMB 06-Jul-1982
! 1-053 - Add a special check for RSTS disk files.  SMB 07-Jul-1982
! 1-054 - Store status on PDP-11 open for output.  SMB 19-Jul-1982
! 3-001 - Add support for TOPS20 in conditionals.  GB 20-Jan-1983
! 3-002 - Move declaration of OPN_INOUT out of BLISS32 conditionals.  GB 20-Jan-1983
! 3-003 - Simplify for TOPS-20. CJG 19-Apr-1983
! 3-004 - Change the way that filespecs are handled. CJG 22-Jun-1983
! 3-005 - Fix bad handling of file descriptor when an output file has been
!	  specified as part of the CREATE command. CJG 12-Oct-1983
! 3-006 - Fix loss of output file generation number. CJG 9-Dec-1983
! 3-007 - Modify ASSERT macro to include error code. CJG 30-Jan-1984
! 3-008 - Clean up error handling.  GB 6-Aug-1984
! 3-009 - Change temporary file type to .EDTTMP to allow .TMP files
!	  to be editted
!--

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

REQUIRE 'EDTSRC:TRAROUNAM';

REQUIRE 'SYS:JSYS';

FORWARD ROUTINE
    EDT$FILEIO;

!
! INCLUDE FILES:
!

REQUIRE 'EDTSRC:EDTREQ';

!
! MACROS:
!
!+
! Macro for the file type used as a constant.  This is defined as a macro
! so we can use %CHARCOUNT to pass the length of the string.
!-
!<BLF/NOFORMAT>

MACRO
    TEMP_TYPE = 'EDTTMP' %;		! File type for temporary output files (before being renamed)

!<BLF/FORMAT>
!
! EQUATED SYMBOLS:
!
!+
! These codes need to be defined here because they need to be known at compile
! time in order to be used in case statements
!-

GLOBAL LITERAL
    EDT$K_OPEN_INPUT = 1,		! code signifying we wish to open a file for input
    EDT$K_OPEN_OUTPUT_SEQ = 2,		! code signifying we wish to open a sequenced file for output
    EDT$K_OPEN_OUTPUT_NOSEQ = 3,	! code meaning we wish to open a non-sequenced file for output
    EDT$K_OPEN_IN_OUT = 4,		! we wish to open a file for both input and output
    EDT$K_GET = 5,			! code signifying we want to get a record from a file
    EDT$K_PUT = 6,			! code signifying we want to put a record to a file
    EDT$K_CLOSE_DEL = 7,		! we want to close the file and then delete it
    EDT$K_CLOSE = 8,			! we want to close the file
    EDT$K_COMMAND_FILE = 1,		! code for the startup command file
    EDT$K_INPUT_FILE = 2,		! code for the main input file
    EDT$K_INCLUDE_FILE = 3,		! code for an include file
    EDT$K_JOURNAL_FILE = 4,		! code for the journal file
    EDT$K_OUTPUT_FILE = 5,		! code for the  output file
    EDT$K_WRITE_FILE = 6;		! code for an output file being written

LITERAL
    FLUSH_LIMIT = 5;			! Flush the journal file buffer after this many records

!+
! The following symbols are for the interface to EDT$$OPN_OFIDEF.  Note that these values
! are hard-coded into the MACRO-11 modules, and into EDT$IOMOD.
!-

LITERAL
    DISK_FILE_NO = 0,			! Not a disk file
    DISK_FILE_YES = 1,			! Is a disk file
    DISK_FILE_RSTS = 2,			! Is a disk file on RSTS
    SEQ_NO = 0,				! The file is not to be sequenced
    SEQ_YES = 1,			! The file is to be sequenced
    RELAT_NONE = 0,			! There is no related file name
    RELAT_INPUT = 1,			! The primary input file is used as the related file
    ATTR_INPUT = 0,			! Take file attributes from the primary input file
    ATTR_DEFAULT = 1,			! Use EDT's default file attributes
    ATTR_JOURNAL = 2;			! Use journal file attributes

!
! OWN STORAGE:
!
!  in the routine
!
! EXTERNAL REFERENCES:
!
! in the routine
!
%SBTTL 'FILEIO - Central EDT file routine'

GLOBAL ROUTINE EDT$FILEIO (			!
    FILECODE, 					!
    FILESTRM, 					!
    FILE_REC 					!
    ) =

!++
! FUNCTIONAL DESCRIPTION:
!
! This is the basic file i/o routine for EDT.  Callable EDT calls this
! routine to do any i/o if this is the routine passed to it by the calling
! program.  This is the routine passed to callable EDT by the "real" EDT.
!
! FORMAL PARAMETERS:
!
! filecode = address of fullword containing function code defining type of i/o
!   operation to be performed
! filestream = address of fullword containing stream identifier
! file_rec = address of string descriptor, i.e. the file name or place to store
!   record read or place to fetch record to be written
!
!
! Note: the default name is not implemented for WRITE/EXIT/PRINT files
!	(because of .TMP logic).  Fortunately, EDT does not pass a default
!	name on these channels.
!
! IMPLICIT INPUTS:
!
!	INP_NAM
!	OUT_NAM
!	CMD_NAM
!	JOU_NAM
!	INC_NAM
!	WRT_NAM
!
!
! IMPLICIT OUTPUTS:
!
!
! COMPLETION STATUS:
!
!	The only error returned, rather than signaled, is EOF.
!
! SIDE EFFECTS:
!
!	NONE
!
!--

    BEGIN

    MAP
	FILE_REC : REF BLOCK;

    EXTERNAL ROUTINE
	EDT$$PAR_FNAME,				! parse a file name
	EDT$$CNV_UPC,				! convert to uppercase
	EDT$$REN_FI,				! renames a file
	EDT$$FLUSH_OBUF,			! empties journal buffer
	EDT$$OPN_IFIDEF,			! i/o input open file routine
	EDT$$OPN_INOUT,				! i/o input & output file routine
	EDT$$OPN_OFIDEF,			! i/o open output file routine
	EDT$$CLS_FI : NOVALUE,			! i/o close file routine
	EDT$$RD_IFI,				! read a record from a file stream
	EDT$$WR_OFI;				! Write a record to a file stream

    EXTERNAL
	INP_NAM : BLOCK,			! Input filespec
	OUT_NAM : BLOCK,			! Output filespec
	CMD_NAM : BLOCK,			! Command filespec
	JOU_NAM : BLOCK,			! Journal filespec
	WRT_NAM : BLOCK,			! Write filespec
	INC_NAM : BLOCK,			! Include filespec
	ERR_NUMBER,				! Last TOPS20 error code
	IO_FNAM,				! File name at last error
	IOFI_NFND;


    MESSAGES ((INPFILOPN, FILNAM, INTERERR, COMFILNEX, COMFILNOP, NOJNLFIL, INPFILNEX, OUTFILCRE));

    OWN
	TEMP_DESC : BLOCK [6]			! Temporary file
	    PRESET ( [DSC$A_POINTER] = 0,
		     [DSC$W_JFN] = 0),
	DISK_FI,				! flag indicating opening a renameable file for output
	FLUSH_COUNTER : INITIAL (0);		! counts PUTs to journal towards flushing the buffer

    LOCAL
	DESC_ADDR : REF BLOCK,
	IO_STS,
	STATUS;

    BIND
	FILE_DESC = .FILE_REC : BLOCK;	! passed in descriptor for filename or record in or out

    IOFI_NFND = 0;

!+
! Point to the correct file descriptor block for the operation.
!-

    DESC_ADDR = (CASE .FILESTRM FROM EDT$K_COMMAND_FILE TO EDT$K_WRITE_FILE OF
	SET

	[EDT$K_COMMAND_FILE] : CMD_NAM;

	[EDT$K_INPUT_FILE]   : INP_NAM;

	[EDT$K_INCLUDE_FILE] : INC_NAM;

	[EDT$K_OUTPUT_FILE]  : OUT_NAM;

	[EDT$K_WRITE_FILE]   : WRT_NAM;

	[EDT$K_JOURNAL_FILE] : JOU_NAM;

	[INRANGE, OUTRANGE]  : 0;
	TES);

    ASSERT (9, .DESC_ADDR NEQ 0);

!+
! Find out first what kind of operation is requested
!-

    CASE .FILECODE FROM EDT$K_OPEN_INPUT TO EDT$K_CLOSE OF
	SET
!+
! Open a file for input
!-

	[EDT$K_OPEN_INPUT] : 			! we want to open a file
	    BEGIN

	    STATUS = EDT$$OPN_IFIDEF (.DESC_ADDR, IO_STS);
	    ERR_NUMBER = .IO_STS;
	    IO_FNAM = .DESC_ADDR;
	    IF (.STATUS EQL 0) THEN RETURN (0) ELSE RETURN (1);

	    END;
!+
! Open a file for output
!-

	[EDT$K_OPEN_OUTPUT_SEQ, EDT$K_OPEN_OUTPUT_NOSEQ] :
	    BEGIN

	    CASE .FILESTRM FROM EDT$K_JOURNAL_FILE TO EDT$K_WRITE_FILE OF
		SET

		[EDT$K_OUTPUT_FILE, EDT$K_WRITE_FILE] : 	! WRITE or OUTPUT file
		    BEGIN

		    DISK_FI = 0;

!+
! Parse the output file name - If successful, then do the open; otherwise
! setup error number
!-
		    STATUS = EDT$$PAR_FNAME (.DESC_ADDR, DISK_FI, IO_STS);

		    IF ( NOT .STATUS)
		    THEN
			BEGIN
			ERR_NUMBER = .STATUS;
			IO_FNAM = .DESC_ADDR;
			RETURN (0);
			END
		    ELSE
			BEGIN
			TEMP_DESC [DSC$L_DESC]   = .DESC_ADDR [DSC$L_DESC];

!+
! Save description of output file before translation with .TMP extension
! if this is a disk file for rename later
!-

			IF (.DISK_FI)
			THEN
			    BEGIN
			    TEMP_DESC [DSC$A_DEVICE] = .DESC_ADDR [DSC$A_DEVICE];
			    TEMP_DESC [DSC$A_DIRECT] = .DESC_ADDR [DSC$A_DIRECT];
			    TEMP_DESC [DSC$A_FNAME]  = .DESC_ADDR [DSC$A_FNAME];
			    TEMP_DESC [DSC$A_FEXTN]  = .DESC_ADDR [DSC$A_FEXTN];
			    TEMP_DESC [DSC$W_JFN]    = .DESC_ADDR [DSC$W_JFN];
			    DESC_ADDR [DSC$A_FEXTN]  = CH$PTR (UPLIT (%ASCIZ TEMP_TYPE),, BYTE_SIZE);
			    DESC_ADDR [DSC$W_JFN]    = 0;
			    DESC_ADDR [DSC$L_DESC]   = 0;
			    END
			ELSE
			    TEMP_DESC [DSC$L_DESC] = 0;


!+
! If this is a disk file, open a temporary file for output, then rename later
! if all goes well.  If not a disk file, just open the "given" file.
!-

			STATUS = EDT$$OPN_OFIDEF (.DESC_ADDR, IO_STS);

!+
! Report an error
!-

			IF (.STATUS EQL 0)
			THEN
			    BEGIN
			    ERR_NUMBER = .IO_STS;
			    IO_FNAM = .DESC_ADDR;
			    RETURN (0);
			    END;

			END;

		    RETURN (1);
		    END;

		[EDT$K_JOURNAL_FILE] :
		    BEGIN

		    STATUS = EDT$$OPN_OFIDEF (JOU_NAM, IO_STS);
		    ERR_NUMBER = .IO_STS;
		    IO_FNAM = JOU_NAM;
		    IF (.STATUS EQL 0) THEN RETURN (0) ELSE RETURN (1);

		    END;

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

	    END;
!+
! Open a file for both input and output
!-

	[EDT$K_OPEN_IN_OUT] :
	    BEGIN
!+
! The journal file is the only file we can open this way
!-

	    IF (.FILESTRM EQL EDT$K_JOURNAL_FILE)
	    THEN
		BEGIN

		STATUS = EDT$$OPN_INOUT (JOU_NAM, IO_STS);
		ERR_NUMBER = .IO_STS;
		IO_FNAM = JOU_NAM;
		IF (.STATUS EQL 0) THEN RETURN (0) ELSE RETURN (1);

		END
	    ELSE
		ASSERT (9, 0);

	    END;

	[EDT$K_GET] : 				! We wish to get a record from a file
	    BEGIN
	    STATUS = EDT$$RD_IFI (.DESC_ADDR, FILE_DESC, IO_STS);

	    IF (NOT .STATUS)
	    THEN
		IF (.IO_STS AND GS_EOF) NEQ 0
		THEN
		    RETURN (0)
		ELSE
		    BEGIN
		    _GETER ($FHSLF; ERR_NUMBER);
		    IO_FNAM = .DESC_ADDR;
		    RETURN (-1);
		    END;

	    RETURN (.STATUS);
	    END;

	[EDT$K_PUT] : 				! we wish to put a record to a file
	    BEGIN
	    STATUS = EDT$$WR_OFI (.DESC_ADDR, FILE_DESC, IO_STS);

	    IF ( NOT .STATUS)
	    THEN
		BEGIN
		_GETER ($FHSLF; ERR_NUMBER);
		IO_FNAM = .DESC_ADDR;
		END
	    ELSE

		IF (.FILESTRM EQL EDT$K_JOURNAL_FILE)
		THEN 				! keep the journal buffer clear
		    BEGIN
		    FLUSH_COUNTER = .FLUSH_COUNTER + 1;

		    IF (.FLUSH_COUNTER EQL FLUSH_LIMIT)
		    THEN
			BEGIN
			STATUS = EDT$$FLUSH_OBUF (JOU_NAM);
			FLUSH_COUNTER = 0;
			END;

		    END;

	    RETURN (.STATUS);
	    END;

	[EDT$K_CLOSE] : 			! close a file

	    BEGIN
	    EDT$$CLS_FI (.DESC_ADDR, 0, IO_STS);

	    IF ((.FILESTRM EQL EDT$K_OUTPUT_FILE) OR (.FILESTRM EQL EDT$K_WRITE_FILE))
		THEN
!+
! Check the status from the close
!-

		BEGIN

		IF (.IO_STS)
		THEN
		    IF (.DISK_FI)
		    THEN
			IF (NOT EDT$$REN_FI (.DESC_ADDR, TEMP_DESC, IO_STS))
			THEN
			    BEGIN
			    IO_FNAM = .DESC_ADDR;
			    ERR_NUMBER = .IO_STS;
			    IO_STS = 0;
			    END
			ELSE
			    IO_STS = 1
		ELSE
		    BEGIN
		    _GETER ($FHSLF; ERR_NUMBER);
		    IO_FNAM = .DESC_ADDR;
		    END;
		END;

	    RETURN (.IO_STS);
	    END;

	[EDT$K_CLOSE_DEL] :
	    BEGIN

	    CASE .FILESTRM FROM EDT$K_JOURNAL_FILE TO EDT$K_WRITE_FILE OF
		SET

		[EDT$K_OUTPUT_FILE, EDT$K_WRITE_FILE] :
		    BEGIN

		    EDT$$CLS_FI (.DESC_ADDR, 1, IO_STS);
		    _GETER ($FHSLF; ERR_NUMBER);
		    IO_FNAM = .DESC_ADDR;

		    END;

		[EDT$K_JOURNAL_FILE] :
		    BEGIN

		    EDT$$CLS_FI (JOU_NAM, 2, IO_STS);
		    _GETER ($FHSLF; ERR_NUMBER);
		    IO_FNAM = JOU_NAM;

		    RETURN (.IO_STS);
		    END;

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


	    RETURN (.IO_STS);
	    END;

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

    ASSERT (0, 0);
    RETURN (0);
    END;					! End of routine FILEIO


END
ELUDOM