DEFINITION MODULE ByteBlockIO;
(*******************************************************************
Module ByteBlockIO (Version 1.0)
Copyright (c) 1991-2006 by Dimitrios Gyalistras and ETH Zurich.
Purpose Sequential and random read/write access to an ARRAY OF BYTE.
Remarks - This module can be used to read/write a sequential text
file blockwise in memory.
- The procedures exported below are identical with the IO-
routines provided by module DMFiles (DM v2.02), with the
difference that they operate directly on computer memory
("VAR f: TextFile" no more exists, all operations on current
byte block).
- There exist no IO-modes. Reading and writing within a
ByteBlock can be performed alternately, but each operation
will increment the current position in the same way.
Programming
o Design
Dimitrios Gyalistras 10/01/1991
o Implementation
Dimitrios Gyalistras 10/01/1991
ETH Zurich
Systems Ecology
CHN E 35.1
Universitaetstrasse 16
8092 Zurich
SWITZERLAND
URLs:
<mailto:RAMSES@env.ethz.ch>
<http://www.sysecol.ethz.ch>
<http://www.sysecol.ethz.ch/SimSoftware/RAMSES>
Last revision of definition: 10/01/1991 AF
*******************************************************************)
FROM SYSTEM IMPORT BYTE ;
TYPE
BlockAccessProcedure = PROC;
PROCEDURE SetWorkBlock ( VAR buf: ARRAY OF BYTE; blockNr: LONGINT; used: LONGINT );
(*
Declare the current work array and set start position to 0.
Declaration has no effect, if used<1 or blockNr<1. The case
used>HIGH(buf)+1 is not checked allowing usage of pointers
(e.g. buf equal ptr^). Read/Write may be performed sequentially
within the address area given by bb (start address) and "bb+used-1"
(stop address). No checks are performed by the
*)
PROCEDURE GetWorkBlock ( VAR blockNr: LONGINT; VAR used: LONGINT );
(*
Number and used bytes of current work object.
*)
VAR
specifyPreviousWorkBlock,
specifyNextWorkBlock : BlockAccessProcedure ;
(*
PROC-variables above are initialized to 'DoNothing'.
'specifyPreviousWorkBlock' is needed to guarantee
correct execution of procedure 'Again',
'specifyNextWorkBlock' to continue sequential IO in a next
(other) piece of memory.
Example for correct usage: see module TstByteBlockIO.MOD
*)
PROCEDURE GetBytePos( VAR pos:LONGINT );
(*
Returns current position in byte-block.
*)
PROCEDURE SetBytePos( pos: LONGINT );
(*
Sets new current position, if pos within valid bounds.
*)
PROCEDURE GetLineCount( VAR line: LONGINT );
(*
Returns line counter. The counter is initialized to 1D when
calling "SetWorkBlock" and is incremented whenever "ReadChar"
or "WriteChar" read/write ch=EOL. "Again" will decrement the
line counter, if the current character before calling the
procedure was = EOL.
*)
PROCEDURE SetLineCount( line: LONGINT );
(*
Sets line counter to new value.
*)
PROCEDURE ResetByteBlockIO;
(*
Call this procedure when finishing your IO in order to assign
DoNothing to specifyPreviousWorkBlock and
specifyNextWorkBlock and prevent erroneous read/write into
memory.
*)
(*===== IO procedures analogous to those exported by DMFiles =====*)
PROCEDURE EOF(): BOOLEAN;
(*
Returns TRUE, if end of current block reached and a call to
specifyNextWorkBlock does not change the current block. Any
changes in
*)
PROCEDURE Again;
PROCEDURE ReadByte(VAR b: BYTE);
PROCEDURE WriteByte(b: BYTE);
CONST EOL = 36C; (*char returned by ReadChar if an end of line has
been encountered*)
PROCEDURE ReadChar(VAR ch: CHAR);
PROCEDURE SkipGap;
PROCEDURE ReadChars(VAR string: ARRAY OF CHAR);
PROCEDURE WriteChar(ch: CHAR);
PROCEDURE WriteEOL; (* = Write(EOL) *)
PROCEDURE WriteChars(string: ARRAY OF CHAR);
VAR
legalNum: BOOLEAN; (*indicates whether read string conforms
to legal Modula-2 number syntax*)
PROCEDURE GetCardinal(VAR c: CARDINAL);
PROCEDURE PutCardinal(c: CARDINAL; n: CARDINAL);
PROCEDURE GetInteger(VAR i: INTEGER);
PROCEDURE PutInteger(i: INTEGER; n: CARDINAL);
PROCEDURE GetReal(VAR x: REAL);
PROCEDURE PutReal(x: REAL; n, dec: CARDINAL);
PROCEDURE PutRealSci(x: REAL; n: CARDINAL);
PROCEDURE GetLongCard(VAR c: LONGCARD);
PROCEDURE GetLongInt(VAR i: LONGINT);
PROCEDURE GetLongReal(VAR x: LONGREAL);
PROCEDURE PutLongCard(lc: LONGCARD; n: CARDINAL);
PROCEDURE PutLongInt(li: LONGINT; n: CARDINAL);
PROCEDURE PutLongReal(lr: LONGREAL; n,dec: CARDINAL);
PROCEDURE PutLongRealSci(lr: LONGREAL; n,dec: CARDINAL);
END ByteBlockIO.