summaryrefslogtreecommitdiff
path: root/Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m')
-rw-r--r--Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m111
1 files changed, 111 insertions, 0 deletions
diff --git a/Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m b/Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m
new file mode 100644
index 00000000000..37302868279
--- /dev/null
+++ b/Build/source/utils/xml2pmx/xml2pmx-src/obsrc/MyFiles.m
@@ -0,0 +1,111 @@
+MODULE MyFiles;
+
+IMPORT Files;
+
+TYPE File* =
+ POINTER TO RECORD
+ native: Files.File;
+ current: INTEGER;
+ END;
+
+TYPE Rider* =
+ RECORD
+ base: File;
+ id: INTEGER;
+ eof-: BOOLEAN;
+ END;
+
+VAR stamp: INTEGER;
+
+PROCEDURE Open(name, mode: ARRAY OF CHAR): File;
+ VAR f: File; g: Files.File;
+BEGIN
+ g := Files.Open(name, mode);
+ IF g = NIL THEN
+ RETURN NIL
+ ELSE
+ NEW(f);
+ f.native := g; f.current := 0;
+ RETURN f
+ END
+END Open;
+
+PROCEDURE New*(name: ARRAY OF CHAR): File;
+BEGIN
+ RETURN Open(name, "w+")
+END New;
+
+PROCEDURE Old*(name: ARRAY OF CHAR): File;
+BEGIN
+ RETURN Open(name, "r")
+END Old;
+
+(* End of file behaviour: EOF is initially false; trying to read beyond the
+ end of the file returns a CHR(0) and sets the EOF flag. *)
+
+PROCEDURE Set*(VAR r: Rider; f: File; off: INTEGER);
+BEGIN
+ Files.Seek(f.native, off, Files.SeekSet);
+ r.base := f;
+ r.eof := FALSE;
+
+ stamp := stamp+1;
+ r.id := stamp;
+ f.current := stamp;
+END Set;
+
+PROCEDURE Read*(VAR r: Rider; VAR ch: CHAR);
+ VAR f: File;
+BEGIN
+ f := r.base;
+ ASSERT(f.current = r.id);
+ IF Files.Eof(f.native) THEN
+ ch := CHR(0); r.eof := TRUE
+ ELSE
+ Files.ReadChar(f.native, ch)
+ END
+END Read;
+
+PROCEDURE Write*(VAR r: Rider; ch: CHAR);
+BEGIN
+ ASSERT(r.base.current = r.id);
+ Files.WriteChar(r.base.native, ch)
+END Write;
+
+PROCEDURE WriteBytes*(VAR r: Rider; buf: ARRAY OF CHAR; len: INTEGER);
+ VAR i: INTEGER;
+BEGIN
+ ASSERT(r.base.current = r.id);
+ FOR i := 0 TO len-1 DO
+ Files.WriteChar(r.base.native, buf[i])
+ END
+END WriteBytes;
+
+PROCEDURE WriteLongReal*(VAR r: Rider; x: LONGREAL);
+BEGIN
+ ASSERT(r.base.current = r.id);
+ IF x = 0.0 THEN
+ Files.WriteString(r.base.native, "0")
+ ELSE
+ Files.WriteLongReal(r.base.native, x)
+ END
+END WriteLongReal;
+
+PROCEDURE Close*(f: File);
+BEGIN
+ Files.Close(f.native)
+END Close;
+
+PROCEDURE Register*(f: File);
+BEGIN
+END Register;
+
+(* Unix system call *)
+PROCEDURE unlink(name: ARRAY OF CHAR): INTEGER IS "=unlink";
+
+PROCEDURE Delete*(name: ARRAY OF CHAR; VAR res: INTEGER);
+BEGIN
+ res := unlink(name)
+END Delete;
+
+END MyFiles.