1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- %
- % OPEN-CLOSE.RED - File primitives
- %
- % Author: Eric Benson
- % Symbolic Computation Group
- % Computer Science Dept.
- % University of Utah
- % Date: 27 August 1981
- % Copyright (c) 1981 University of Utah
- %
- % Edit by Cris Perdue, 27 Jan 1983 1700-PST
- % Close now checks for a legitimate FileDes argument
- fluid '(SpecialReadFunction!* % These must be set up for special
- SpecialWriteFunction!* % Open call
- SpecialCloseFunction!*);
- on SysLisp;
- external WArray ReadFunction, % indexed by channel to read a char
- WriteFunction, % indexed by channel to write a char
- CloseFunction, % indexed by channel to close channel
- UnReadBuffer, % indexed by channel for input backup
- LinePosition, % indexed by channel for Posn()
- MaxLine; % when to force an end-of-line
- syslsp procedure Open(FileName, AccessType); %. Get access to file
- begin scalar FileDes;
- if AccessType eq 'INPUT then
- << FileDes := SystemOpenFileForInput FileName;
- UnReadBuffer[FileDes] := char NULL;
- WriteFunction[FileDes] := 'ReadOnlyChannel >>
- else if AccessType eq 'OUTPUT then
- << FileDes := SystemOpenFileForOutput FileName;
- LinePosition[FileDes] := 0;
- MaxLine[FileDes] := 80;
- ReadFunction[FileDes] := 'WriteOnlyChannel >>
- else if AccessType eq 'SPECIAL then
- if IDP LispVar SpecialReadFunction!*
- and IDP LispVar SpecialWriteFunction!*
- and IDP LispVar SpecialCloseFunction!* then
- << FileDes := SystemOpenFileSpecial FileName;
- LinePosition[FileDes] := 0;
- MaxLine[FileDes] := 80;
- UnReadBuffer[FileDes] := char NULL;
- ReadFunction[FileDes] := IdInf LispVar SpecialReadFunction!*;
- WriteFunction[FileDes] := IdInf LispVar SpecialWriteFunction!*;
- CloseFunction[FileDes] := IdInf LispVar SpecialCloseFunction!* >>
- else IOError "Improperly set-up special IO open call"
- else IOError "Unknown access type";
- return MkINT FileDes;
- end;
- syslsp procedure Close FileDes; %. End access to file
- begin scalar BareFileDes;
- BareFileDes := IntInf FileDes;
- if not (0 <= BareFileDes and BareFileDes <= MaxChannels) then
- NonIOChannelError(FileDes, "Close");
- IDApply1(BareFileDes, CloseFunction[BareFileDes]);
- SystemMarkAsClosedChannel FileDes;
- ReadFunction[BareFileDes] := 'ChannelNotOpen;
- WriteFunction[BareFileDes] := 'ChannelNotOpen;
- CloseFunction[BareFileDes] := 'ChannelNotOpen;
- return FileDes;
- end;
- off SysLisp;
- END;
|