home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Columbia Kermit
/
kermit.zip
/
archives
/
computervision.tar.gz
/
computervision.tar
/
kermit.text-file-io
< prev
next >
Wrap
Text File
|
1987-02-19
|
10KB
|
301 lines
; 18 aug 85 esj replaces s.e.fm.error.uil with kerdef
* 18 jly 85 ESJ CREATED FOR kermit
*
*----------------------------- text-file-io -------------------------
E:F A:S(NWLS , STKARG)
*-----------------------------------------------------------------------
*
* PURPOSE
*
* INPUT
I'R FD(*) ; file descriptor block
*
* OUTPUT
*)
*
* GLOBALS DEFINITIONS
* none
*
* LOCAL DEFINITIONS
I'R NEWNAME(42) ; dest name field
I'R PACKNAME(42) ; temp for packed filename
I'R OPENMODE ; open mode temp
I'R TEMPMODE ; open mode temp
I'R OTSPC(9) ;
I'R STATUS(1) ; FM error code
I'R WRSPEC(3) ; inspecs field for write call
* SUBROUTINES CALLED
*
* INSERTS
/INCLUDE BYU.PROG.KERMIT.SYM.EQU.KERDEF
/INCLUDE SYM.EQU.FM.OPEN
/INCLUDE SYM.EQU.FM.BASIC
/INCLUDE SYM.EQU.FM.READ
*--- put equates for the FD block here till ready to move to sym file---
EQU FD&CHAN = 0 ; channel number of the file once it's
; open
EQU FD&MAX = 1 ; maximum length of the text record which
; can be handled by this FD. It is also
; the size of the FD&TXTB field.
EQU FD&NDX = 2 ; index for next char to be read from TXTB
EQU FD&MODE = 3 ; mode of how the file was opened
EQU FD&LNPOS= 4 ; number of current line being read. 0 based
EQU FD&TXTC = 5 ; text count. The length of the text record
; currently in this FD
EQU FD&TXTB = FD&TXTC+1 ; text buffer
*-----------------------------------------------------------------------
*
* STATIC DATA INITIALIZATION
V'S TXTSPEC = 03,
1 %CATLOG,%%SEARCH,
1 %FORMAT , %%TEXT,
1 %RTNERR
V'S BCDNAME = 4,$&BCD$
*
* RESTRICTIONS
*
* ERROR INDICATIONS
*
* METHOD
*
*
*---------------------------- START OF CODE ----------------------------
* HOW TO USE
* opentext is part of a simplified interface for manipulating
* text files with the new file manager. opentext is used to
* open a text file for stream io.
* opentext takes four arguments:
* 1) FD is a buffer that contains information about the file and
* the record being manipulated. the information in FD is to be
* hidden from the user so that information can be added,deleted
* or changed without the need to support existing structures.
* The size of FD is defined by FD&SIZE. The buffer will need to
* be created by an ALLOC call because the buffer is larger than a
* local data section.
* 2) FILENAME is a string in kermit or cv format. opentext will
* make a copy of the file name and add an &bcd level to the name
* and stick an ! on the end, if needed converting the file name
* to a proper text file name.
* 3) TEXTMODE is a two character descripter for the open mode for
* a text file. The only modes supported are, RD for read,
* MO for modify, and SU for supercede.
*
* 4) NAMETYPE defines the type of string in filename. CV is a cv type
* of string. KM is a kermit type of string.
*
E'O OPENTEXT.( FILENAME, TEXTMODE, NAMETYPE, FD)
# E'E TYPE.(2,NAMETYPE)
; convert filename to &bcd type and put ! on end
W'R NAMETYPE .E. $KM$
# E'E HEXDMPP.(1,41,1,FILENAME)
E'E PACK.(FILENAME, PACKNAME )
# E'E HEXDMP.(2,42,2,PACKNAME)
E'E FMEXPNM.(PACKNAME,BCDNAME,NEWNAME)
O'E
E'E FMEXPNM.(FILENAME,BCDNAME,NEWNAME)
E'L
W'R LDCHRT.(NEWNAME(1),NEWNAME-1) .NE. $!$
E'E STCHRT.($!$,NEWNAME(1),NEWNAME)
NEWNAME(0) = NEWNAME(0) + 1
E'L
# E'E TYPEMSG.($THIS SHOULD BE THE &BCD NAME!$)
# E'E HEXDMP.(0,NEWNAME,0,NEWNAME)
; convert textmode to open file mode
; convert char string to cv char type and lower case
TEMPMODE = TEXTMODE .LOR. 'A0A0'
# E'E HEXDMP.(TEMPMODE,TEMPMODE,TEMPMODE,TEMPMODE)
W'R TEMPMODE .E. $rd$
; read mode
OPENMODE = %OREAD
*
O'R TEMPMODE .E. $mo$
; modify mode
OPENMODE = %OMODIFY
*
O'R TEMPMODE .E. $su$
; supercede mode
OPENMODE = %OSUPR
O'E
; force openmode error
OPENMODE = -1
E'L
*
* Set to no error
STATUS = STATUS(1) = FM%NOERR
; call the fm and try to open
E'E F&OPEN.(OPENMODE,
1 %IDFILNM,
1 NEWNAME ,
1 TXTSPEC ,
1 FD(FD&CHAN),
1 OTSPC ,
1 STATUS )
# E'E HEXDMP.(1,1,1,STATUS)
*
FD(FD&NDX) = 0 ; make text buffer empty
FD(FD&TXTC) = 0
FD(FD&MODE) = OPENMODE ; set up access protection
FD(FD&LNPOS) = 0
F:N STATUS
*------------ end of opentext -------------------------------------
*------------ start of dgetch --------------------------------------
* dgetch is part of a simplified interface for Manipulating
* text files with the new file manager. dgetch is used to
* read characters from a text file for stream io.
* dgetch takes two arguments:
* 1) CHAR is a single char from the file described in FD. The
* character is in kermit format. When end of file is reached,
* CHAR will equal -1. End of line is indicated by CR.
* 2) FD is a buffer that contains information about the file and
* the record being manipulated. the information in FD is to be
* hidden from the user so that information can be added,deleted
* or changed without the need to support existing structures.
* The size of FD is defined by FD&SIZE. The buffer will need to
* be created by an ALLOC call because the buffer is larger than a
* local data section.
*
V'S RDSPC = 02,
1 %RTNERR,
1 %RETURN,1,
1 %%BYTCNT
E'O DGETCH.(CHAR, FD)
STATUS = STATUS(1) = 0
;if char index = 0 read in line and stick cr at end
W'R FD(FD&NDX) .E. 0
E'E F&READ.(FD(FD&CHAN),
1 1 ,
1 FD(FD&TXTB) ,
1 RDSPC ,
1 OTSPC ,
1 STATUS )
W'R STATUS .GE. FM%NOERR
FD(FD&TXTC) = OTSPC(3)
E'E STBYTT.('8D', FD(FD&TXTB), FD(FD&TXTC))
FD(FD&TXTC) = FD(FD&TXTC) + 1
E'L
E'L
W'R STATUS .GE.FM%NOERR
; get a char from the input stream
CHAR = LDBYTT.(FD(FD&TXTB), FD(FD&NDX)) .LAND. '7F'
W'R CHAR .E. '000D'
FD(FD&NDX) = 0
FD(FD&LNPOS) = FD(FD&LNPOS) + 1
O'E
FD(FD&NDX) = FD(FD&NDX) + 1
E'L
O'R STATUS .E. UL%RDEOF
; if at eof set char = -1
CHAR = -1
E'L
F'N STATUS
*-------------- end of dgetch -----------------------------------------
*-------------- start of dputch ---------------------------------------
* dputch is part of a simplified interface for manipulating
* text files with the new file manager. dputch is used to
* write a stream of characters to a text file.
* dputch takes two arguments:
* 1) CHAR is a single char from the file described in FD. The
* character is in kermit format. The end of line is indicated by
* the symbol CR.
* 1) FD is a buffer that contains information about the file and
* the record being manipulated. the information in FD is to be
* hidden from the user so that information can be added,deleted
* or changed without the need to support existing structures.
* The size of FD is defined by FD&SIZE. The buffer will need to
* be created by an ALLOC call because the buffer is larger than a
* local data section.
E'O DPUTCH.(CHAR, FD)
STATUS = 0
# E'E HEXDMP.(0,0,0,CHAR)
# E'E HEXDMP.(1,50,1,FD(FD&TXTC))
W'R CHAR .NE. '000D'
W'R CHAR .E. '000A' .AND. FD(FD&TXTC) .E. 0 , T:O EXITPCH
FD(FD&NDX) = FD(FD&NDX) + 1
W'R PACKLINE.((CHAR), FD(FD&TXTC)) .NE. -1, T:O EXITPCH
E'L
WRSPEC(0) = 2
WRSPEC(1) = %RECLEN
WRSPEC(2) = FD(FD&TXTC)
WRSPEC(3) = %RTNERR
E'E F&WRITE.(FD(FD&CHAN), 1, FD(FD&TXTB), WRSPEC, OTSPC, STATUS)
FD(FD&TXTC) = FD(FD&NDX) = 0
FD(FD&LNPOS) = FD(FD&LNPOS) + 1
EXITPCH C'E
F'N STATUS
*-------------- end of dputch -----------------------------------------
*-------------- start of closstrm -------------------------------------
* closstrm is part of a simplified interface for manipulating
* text files with the new file manager. closstrm is used to
* close a text file used for stream io.
* closstrm takes one argument:
* 1) FD is a buffer that contains information about the file and
* the record being manipulated. the information in FD is to be
* hidden from the user so that information can be added,deleted
* or changed without the need to support existing structures.
* The size of FD is defined by FD&SIZE. The buffer will need to
* be created by an ALLOC call because the buffer is larger than a
* local data section.
*
V'S CLOSPC = 1,
1 %RTNERR
E'O CLOSTEXT.(FD)
# E'E TYPEMSG.($ CLOSSTRM!$)
# E'E HEXDMP.(0,0,0,FD(FD&TXTC))
W'R FD(FD&TXTC) .NE. 0
; the line buffer is not empty, so flush the line to disk
E'E DPUTCH.('000D', FD)
E'L
E'E F&CLOSE.(FD(FD&CHAN),CLOSPC, STATUS)
F'N STATUS
*-------------- end of clostext -------------------------------------
*
E:N