MODULE PZIntChain;

IMPORT  FileFmt, NGet, FGet, NPut, FPut, Rd, Wr, Thread; 


PROCEDURE Trim(READONLY c: T; start, length: CARDINAL): REF T =
  BEGIN 
    WITH 
      N = NUMBER(c),
      ini = start MOD N,
      fin = ini + length - 1
    DO 
      WITH s = NEW(REF T, length) DO
        IF fin < N  THEN 
          s^ := SUBARRAY(c, ini, length)
        ELSE 
          SUBARRAY(s^, 0, N-ini) := SUBARRAY(c, ini, N-ini);
          SUBARRAY(s^, N-ini, (fin+1) MOD N):= SUBARRAY(c, 0, (fin+1) MOD N);
        END;
        RETURN s
      END;
    END;
  END Trim;
 
CONST FileVersion = "97-01-21";
 
PROCEDURE Read(rd: Rd.T): ReadData =
  VAR 
    data : ReadData;
  BEGIN
    FileFmt.ReadHeader(rd, "PZIntChain.T", FileVersion);
    data.cmt := FileFmt.ReadComment(rd, '|');
    WITH  
      N = NGet.Int(rd, "points")
    DO
      FGet.EOL(rd);
      data.c := NEW(REF T, N);
      WITH c = data.c^ DO 
        FOR i := 0 TO N-1  DO
          c[i,0] :=   FGet.Int(rd);
          c[i,1] :=   FGet.Int(rd);
        END;
        FileFmt.ReadFooter(rd, "PZIntChain.T");
        RETURN data
      END;  
    END;
  END Read;


PROCEDURE Write(wr: Wr.T; cmt: TEXT; READONLY c: T) =
  <* FATAL Wr.Failure, Thread.Alerted *>
  BEGIN
    FileFmt.WriteHeader(wr, "PZIntChain.T", FileVersion);
    FileFmt.WriteComment(wr, cmt, '|');
    NPut.Int(wr, "length", NUMBER(c));  FPut.EOL(wr);
    FOR i := 0 TO LAST(c)  DO
       FPut.Int(wr, c[i,0]);  FPut.Space(wr);
       FPut.Int(wr, c[i,1]);  FPut.EOL(wr)
    END;
    FileFmt.WriteFooter(wr, "PZIntChain.T");
    Wr.Flush(wr);
  END Write;
 
 
BEGIN
END PZIntChain.
