with SEQUENTIAL_IO; separate (NETWORK_PROTOCOLS) package body GENERIC_FILE_IO is type Buf is array ( 1 .. 512 ) of Byte ; RBUFFER, WBUFFER : BUF := (others => BYTE'VAL(CHARACTER'POS(' '))); RBUF_POS, WBUF_POS : INTEGER := 0; package SEQ_IO is new SEQUENTIAL_IO ( BUF ) ; use SEQ_IO; IFILE, OFILE : SEQ_IO.FILE_TYPE ; LFILE : TEXT_IO.FILE_TYPE; procedure OPEN_READ ( NAME : STRING ; FORM : STRING := "" ) is begin SEQ_IO.OPEN(IFILE,IN_FILE,NAME,FORM) ; end OPEN_READ ; procedure F_READ ( C : out BYTE ; EOFILE : out BOOLEAN ) is begin if RBUF_POS = 0 then -- get next record SEQ_IO.READ(IFILE,RBUFFER) ; RBUF_POS := 1; end if; C := RBUFFER(RBUF_POS) ; RBUF_POS := (RBUF_POS + 1) mod (RBUFFER'LENGTH+1); -- indicate returning a character EOFILE := FALSE ; exception when SEQ_IO.END_ERROR => EOFILE := TRUE ; end F_READ ; procedure CLOSE_READ is begin SEQ_IO.CLOSE(IFILE) ; end CLOSE_READ ; procedure OPEN_WRITE ( NAME : STRING ; FORM : STRING := "" ) is begin SEQ_IO.CREATE(OFILE,OUT_FILE,NAME,FORM) ; end OPEN_WRITE ; procedure F_WRITE ( C : BYTE ) is begin WBUF_POS := WBUF_POS + 1; WBUFFER(WBUF_POS) := C; if WBUF_POS = WBUFFER'LENGTH then SEQ_IO.WRITE(OFILE, WBUFFER) ; WBUFFER := (others => BYTE'VAL(CHARACTER'POS(' '))); WBUF_POS := 0; end if; end F_WRITE ; procedure CLOSE_WRITE is begin if WBUF_POS /= 0 then -- we have some stuff left SEQ_IO.WRITE(OFILE, WBUFFER) ; end if; SEQ_IO.CLOSE(OFILE) ; end CLOSE_WRITE ; function NAME_OF_FILE_BEING_TRANSFERRED return STRING is begin return SEQ_IO.NAME(IFILE); exception when others => raise FILE_TRANSFER_ERROR; end; end GENERIC_FILE_IO ;