-- File PieceTable.mesa -- Edited by Sweet, 1-Dec-80 10:41:12 DIRECTORY Segments USING [FHandle], Streams USING [Handle]; PieceTable: DEFINITIONS = BEGIN Piece: TYPE = RECORD [ -- carefully 8 words long prev: PieceIndex, length: CARDINAL, -- for this application, pieces are small position: LONG CARDINAL, next: PieceIndex, file: Segments.FHandle]; PieceIndex: TYPE = LONG POINTER TO Piece; Place: TYPE = RECORD [pi: PieceIndex, pos: Position]; PlacePtr: TYPE = POINTER TO Place; NullPiece: PieceIndex = NIL; PFS: TYPE = RECORD [ next: LONG POINTER TO PFS _ NIL, file: Segments.FHandle, stream: Streams.Handle]; Position: TYPE = LONG CARDINAL; PieceTableImpl: PROGRAM; PTError: PUBLIC SIGNAL; -- something went wrong Append: PROCEDURE RETURNS [Position]; -- go to EOF and return pos AppendWord: PROCEDURE RETURNS [Position]; -- round pos to word, Append AppendQuadWord: PROCEDURE RETURNS [Position]; -- round pos to Quadword AppendPage: PROCEDURE RETURNS [Position]; -- round pos to page, Append CopyFromFile: PROCEDURE [ file: Segments.FHandle, position: LONG CARDINAL, length: CARDINAL]; Delete: PROCEDURE [count: INTEGER]; Finalize: PROCEDURE; GetByte: PROCEDURE RETURNS [UNSPECIFIED [0..256)]; GetPlace: PROCEDURE RETURNS [Place]; -- of start of current piece GetWord: PROCEDURE RETURNS [UNSPECIFIED]; GetVPos: PROCEDURE RETURNS [Position]; Initialize: PROCEDURE; Length: PROCEDURE RETURNS [LONG CARDINAL]; Move: PROCEDURE [dist: LONG INTEGER]; PutByte: PROCEDURE [byte: UNSPECIFIED [0..256)]; PutWord: PROCEDURE [word: UNSPECIFIED]; PutZeros: PROCEDURE [count: CARDINAL]; SetVPos: PROCEDURE [pos: Position, near: PlacePtr _ NIL]; Store: PROCEDURE [outStream: Streams.Handle]; END.