Syntax10.Scn.FntSyntax10i.Scn.FntStampElemsAlloc17 Jul 954Syntax10b.Scn.Fnt      8FoldElemsNewE&8.88 3828  88 &8O8 &8O8 &8*8  838 MODULE SAFiles; (* mah 10.1.95, MK  *) IMPORT Files, SYS := SYSTEM; CONST closed = 0; readOnly* = 1; readWrite* = 2; ok* = 0; errAccessMode* = 1; errEndOfFile* = 2; errDiskFull* = 3; errRecNotFound* = 4; TYPE File* = POINTER TO FileDesc; FileDesc* = RECORD numEntries, current: LONGINT; mode: INTEGER; f: Files.File; status-: INTEGER; entrySize-: INTEGER; END; PROCEDURE Open* (name: ARRAY OF CHAR; mode: INTEGER) : File; VAR f: File; r: Files.Rider; BEGIN NEW (f); f.f := Files.Old (name); f.mode := mode; f.current := -1; IF f.f = NIL THEN RETURN NIL END; Files.Set (r, f.f, 0); Files.ReadLInt (r, f.numEntries); Files.ReadInt (r, f.entrySize); RETURN f END Open; PROCEDURE Create* (name: ARRAY OF CHAR; entrySize: INTEGER) : File; VAR f: File; r: Files.Rider; BEGIN NEW (f); f.f := Files.New (name); f.mode := readWrite; f.entrySize := entrySize; f.current := -1; IF f.f = NIL THEN RETURN NIL END; Files.Set (r, f.f, 0); Files.WriteLInt (r, f.numEntries); Files.WriteInt (r, f.entrySize); Files.Register (f.f); RETURN f END Create; PROCEDURE Close* (f: File); VAR r: Files.Rider; BEGIN IF f.mode = readWrite THEN Files.Set (r, f.f, 0); Files.WriteLInt (r, f.numEntries); Files.WriteInt (r, f.entrySize); Files.Register (f.f) END; f.mode := closed END Close; PROCEDURE Read* (f: File; VAR x: ARRAY OF SYS.BYTE); VAR r: Files.Rider; ch: CHAR; BEGIN IF f.mode = closed THEN f.status := errAccessMode; RETURN END; INC (f.current); IF f.current >= f.numEntries THEN f.status := errEndOfFile; RETURN END; Files.Set (r, f.f, SIZE (LONGINT) + SIZE (INTEGER) + f.current * f.entrySize); Files.ReadBytes (r, x, f.entrySize); f.status := ok END Read; PROCEDURE Write* (f: File; VAR x: ARRAY OF SYS.BYTE); VAR r: Files.Rider; BEGIN IF f.mode # readWrite THEN f.status := errAccessMode; RETURN END; IF (f.current < 0) OR (f.current >= f.numEntries) THEN f.status := errRecNotFound; RETURN END; Files.Set (r, f.f, SIZE (LONGINT) + SIZE (INTEGER) + f.current * f.entrySize); Files.WriteBytes (r, x, f.entrySize); f.status := ok END Write; PROCEDURE Append* (f: File; VAR x: ARRAY OF SYS.BYTE); VAR r: Files.Rider; arr: POINTER TO ARRAY OF SYS.BYTE; BEGIN IF f.mode # readWrite THEN f.status := errAccessMode; RETURN END; Files.Set (r, f.f, SIZE (LONGINT) + SIZE (INTEGER) + f.numEntries * f.entrySize); Files.WriteBytes (r, x, f.entrySize); INC (f.numEntries); f.status := ok END Append; PROCEDURE Restart* (f: File); BEGIN f.current := -1; f.status := ok END Restart; END SAFiles.