home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / languages / pot / potsrc / lib / Core / mod / files next >
Text File  |  1995-04-13  |  3KB  |  137 lines

  1. MODULE Files; (*file manager*) 
  2. IMPORT SYSTEM;
  3.  
  4. CONST
  5.   MaxPathLength* = 255;
  6.  
  7. TYPE
  8.     File* = POINTER TO FileDesc; 
  9.   FileDesc = RECORD
  10.     name: ARRAY MaxPathLength +1 OF CHAR;
  11.     handle: LONGINT;
  12.     pos: LONGINT
  13.   END;  
  14.  
  15.     Rider* = RECORD 
  16.     res*: INTEGER; 
  17.     eof*: BOOLEAN;
  18.     pos: LONGINT;
  19.     file: File;
  20.   END;
  21.  
  22. VAR
  23.   StdIn*, StdOut*, StdErr*: File;
  24.  
  25. PROCEDURE Old*(name: ARRAY OF CHAR): File; 
  26.   VAR f: File;
  27. BEGIN NEW(f); f.handle := 0; f.pos := 0; COPY(name, f.name);
  28.   RETURN f
  29. END Old;
  30. (*the file with the given name. NIL if the name is not in the directory*) 
  31.  
  32. PROCEDURE New*(name: ARRAY OF CHAR): File; 
  33.   VAR f: File;
  34. BEGIN NEW(f); f.handle := 0; f.pos := 0; COPY(name, f.name);
  35.   RETURN f
  36. END New;
  37. (*a new file with given name*) 
  38.  
  39. (*Close file f and register it under its name in the directory.
  40. If the name exists already, the corresponding old file is unregistered*)
  41. PROCEDURE Register*(f: File); 
  42. BEGIN f := NIL
  43. END Register;
  44.  
  45. PROCEDURE Close*(f: File);
  46. BEGIN f := NIL
  47. END Close;
  48.  
  49. PROCEDURE Purge*(f: File); 
  50. BEGIN f := NIL
  51. END Purge;
  52.  
  53. PROCEDURE Length*(f: File): LONGINT;
  54. END Length;
  55. (*the number of bytes in the file*) 
  56.  
  57. PROCEDURE Set*(VAR r: Rider; f: File; pos: LONGINT); 
  58. END Set;
  59. (*Associate rider r with file f at position pos. r.eof := FALSE*) 
  60.  
  61. PROCEDURE Read*(VAR r: Rider; VAR x: SYSTEM.BYTE); 
  62. END Read;
  63. (*read byte and advance rider by one position. If at end, r.eof := TRUE and x := 
  64. 0X*) 
  65.  
  66. PROCEDURE ReadBytes*(VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT); 
  67. END ReadBytes;
  68. (*read n bytes and advance rider by n positions.
  69. If at end, r.eof := TRUE and r.res := no. of bytes requested but not read.*) 
  70.  
  71. PROCEDURE ReadInt*(VAR r: Rider; VAR i: INTEGER);
  72. BEGIN ReadBytes(r, i, 2);
  73. END ReadInt;
  74.  
  75. PROCEDURE ReadLInt*(VAR r: Rider; VAR i: LONGINT);
  76. BEGIN ReadBytes(r, i, 4);
  77. END ReadLInt;
  78.  
  79. PROCEDURE ReadString*(VAR r: Rider; VAR s: ARRAY OF CHAR);
  80.   VAR i: INTEGER; ch: CHAR;
  81. BEGIN i := 0;
  82.   REPEAT Read(r, ch); s[i] := ch; INC(i)
  83.   UNTIL ch = 0X;
  84. END ReadString;
  85.   
  86. PROCEDURE Write*(VAR r: Rider; x: SYSTEM.BYTE); 
  87. END Write;
  88. (*write byte and advance rider by one position*) 
  89.  
  90. (*write n bytes and advance rider by n positions*) 
  91. PROCEDURE WriteBytes*(VAR r: Rider; VAR x: ARRAY OF SYSTEM.BYTE; n: LONGINT);
  92. END WriteBytes;
  93.  
  94. PROCEDURE WriteInt*(VAR r: Rider; i: INTEGER);
  95. BEGIN WriteBytes(r, i, 2);
  96. END WriteInt;
  97.  
  98. PROCEDURE WriteLInt*(VAR r: Rider; i: LONGINT);
  99. BEGIN WriteBytes(r, i, 4);
  100. END WriteLInt;
  101.  
  102. PROCEDURE WriteString*(VAR r: Rider; VAR s: ARRAY OF CHAR);
  103.   VAR i: INTEGER; ch: CHAR;
  104. BEGIN i := 0;
  105.   REPEAT ch := s[i]; Write(r, ch); INC(i)
  106.   UNTIL ch = 0X;
  107. END WriteString;
  108.  
  109. PROCEDURE Pos*(VAR r: Rider): LONGINT; 
  110. BEGIN RETURN r.pos
  111. END Pos;
  112.  
  113. PROCEDURE Base*(VAR r: Rider): File; 
  114. BEGIN RETURN r.file
  115. END Base;
  116.  
  117. (*res = 0: renamed;
  118.   res = 1: new name existed already and now denotes the renamed file; 
  119.   res = 2: old name not in directory;
  120.   res = 3: name is illegal;
  121.   res = 4: name is too long *) 
  122. PROCEDURE Rename*(old, new: ARRAY OF CHAR; VAR res: INTEGER); 
  123. END Rename;
  124.  
  125. (*res = 0: deleted;
  126.   res = 2: name not in directory; 
  127.   res = 3: name is illegal;
  128.   res = 4: name is too long *) 
  129. PROCEDURE Delete*(name: ARRAY OF CHAR; VAR res: INTEGER); 
  130. END Delete;
  131.  
  132. BEGIN 
  133.   NEW(StdIn); StdIn.pos := 0; StdIn.name := ""; StdIn.handle := 0;
  134.   NEW(StdOut); StdOut.pos := 0; StdOut.name := ""; StdOut.handle := 0;
  135.   NEW(StdErr); StdErr.pos := 0; StdErr.name := ""; StdErr.handle := 0;
  136. END Files.
  137.