home *** CD-ROM | disk | FTP | other *** search
- (*
- * Example program for use of persistent Objects using the features
- * provided by Module Objects.
- *
- * (c) 1993 Fridtjof Siebert.
- *)
-
- MODULE Persistent;
-
- IMPORT O := Objects,
- B := BasicTypes,
- F := FileSystem,
- Out;
-
- TYPE
- Figure = POINTER TO FigureDesc;
- Rectangle = POINTER TO RectangleDesc;
- Circle = POINTER TO CircleDesc;
-
- FigureDesc = RECORD (O.ObjectDesc)
- next: Figure;
- color: INTEGER;
- END;
-
- RectangleDesc = RECORD (FigureDesc)
- x,y,w,h: INTEGER;
- END;
-
- CircleDesc = RECORD (FigureDesc)
- mx,my,r: INTEGER;
- END;
-
- VAR ok: BOOLEAN; (* to ignore I/O errors, don't do this in your code! *)
-
- PROCEDURE (fig: Figure) Store * (VAR f: F.File);
- BEGIN
- ok := F.Write(f,fig.color);
- END Store;
-
- PROCEDURE (rec: Rectangle) Store * (VAR f: F.File);
- BEGIN
- rec.Store^(f);
- ok := F.Write(f,rec.x) & F.Write(f,rec.y) & F.Write(f,rec.w) & F.Write(f,rec.h);
- END Store;
-
- PROCEDURE (cir: Circle) Store * (VAR f: F.File);
- BEGIN
- cir.Store^(f);
- ok := F.Write(f,cir.mx) & F.Write(f,cir.my) & F.Write(f,cir.r );
- END Store;
-
- PROCEDURE (fig: Figure) Load * (VAR f: F.File);
- BEGIN
- ok := F.Read(f,fig.color);
- END Load;
-
- PROCEDURE (rec: Rectangle) Load * (VAR f: F.File);
- BEGIN
- rec.Load^(f);
- ok := F.Read(f,rec.x) & F.Read(f,rec.y) & F.Read(f,rec.w) & F.Read(f,rec.h);
- END Load;
-
- PROCEDURE (cir: Circle) Load * (VAR f: F.File);
- BEGIN
- cir.Load^(f);
- ok := F.Read(f,cir.mx) & F.Read(f,cir.my) & F.Read(f,cir.r );
- END Load;
-
- PROCEDURE (fig: Figure) Draw;
- BEGIN
- Out.String("Figure"); Out.Ln;
- END Draw;
-
- PROCEDURE (rec: Rectangle) Draw;
- BEGIN
- Out.String("Rectangle: ");
- Out.Int(rec.x,4); Out.String(",");
- Out.Int(rec.y,4); Out.String(",");
- Out.Int(rec.w,4); Out.String(",");
- Out.Int(rec.h,4); Out.Ln;
- END Draw;
-
- PROCEDURE (cir: Circle) Draw;
- BEGIN
- Out.String("Circle: ");
- Out.Int(cir.mx,4); Out.String(",");
- Out.Int(cir.my,4); Out.String(",");
- Out.Int(cir.r ,4); Out.Ln;
- END Draw;
-
- PROCEDURE WriteFigure(VAR f: F.File; x: Figure);
- VAR
- name: ARRAY 64 OF CHAR;
- BEGIN
- IF x=NIL THEN
- ok := F.WriteString(f,"")
- ELSE
- O.ObjToName(x,name);
- ok := F.WriteString(f,name);
- x.Store(f);
- END;
- END WriteFigure;
-
- PROCEDURE ReadFigure(VAR f: F.File; VAR x: Figure);
- VAR
- name: ARRAY 64 OF CHAR;
- o: B.ANY;
- BEGIN
- ok := F.ReadString(f,name);
- IF name="" THEN
- x := NIL
- ELSE
- O.NameToObj(name,o);
- x := o(Figure);
- x.Load(f);
- END;
- END ReadFigure;
-
- PROCEDURE SaveFigure(name: ARRAY OF CHAR; x: Figure);
- VAR f: F.File;
- BEGIN
- ok := F.Open(f,name,TRUE);
- WHILE x#NIL DO WriteFigure(f,x); x := x.next END;
- WriteFigure(f,NIL);
- ok := F.Close(f);
- END SaveFigure;
-
- PROCEDURE LoadFigure(name: ARRAY OF CHAR; VAR head: Figure);
- VAR
- f: F.File;
- x: Figure;
- BEGIN
- ok := F.Open(f,name,FALSE);
- ReadFigure(f,x); head := x;
- WHILE x#NIL DO ReadFigure(f,x.next); x := x.next END;
- ok := F.Close(f);
- END LoadFigure;
-
- PROCEDURE TestSave;
- VAR
- r: Rectangle;
- c: Circle;
- fig: Figure;
- BEGIN
- NEW(r); r.x := 10; r.y := 10; r.w := 25; r.h := 30; r.next := fig; fig := r;
- NEW(c); c.mx:= 20; c.my:= 10; c.r := 35; c.next := fig; fig := c;
- NEW(r); r.x := 12; r.y := 8; r.w := 5; r.h := 16; r.next := fig; fig := r;
- SaveFigure("test.fig",fig);
- END TestSave;
-
- PROCEDURE TestLoad;
- VAR fig: Figure;
- BEGIN
- LoadFigure("test.fig",fig);
- WHILE fig#NIL DO fig.Draw; fig := fig.next END;
- END TestLoad;
-
- PROCEDURE InitObjects;
- (*
- * inform Objects.mod about our objects!
- * this must be done by every module that works with storeable
- * objects.
- *)
- VAR
- r: Rectangle;
- c: Circle;
- f: Figure;
- BEGIN
- NEW(r); O.AddObject(r,"Persistent.Rectangle");
- NEW(c); O.AddObject(c,"Persistent.Circle");
- NEW(f); O.AddObject(f,"Persistent.Figure");
- END InitObjects;
-
- BEGIN
- InitObjects; (* Tell Module Objects about our Objects *)
- TestSave; (* Save some objects *)
- TestLoad; (* Reload the objects *)
- END Persistent.
-
-