Trailing-Edge
-
PDP-10 Archives
-
bb-r775d-bm_tops20_ks_upd_4
-
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