-- 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.