Trailing-Edge
-
PDP-10 Archives
-
tops20-v7-ft-dist1-clock
-
7-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) 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 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