File.ob07 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. (*
  2. Copyright 2016, 2018, 2021 Anton Krotov
  3. This program is free software: you can redistribute it and/or modify
  4. it under the terms of the GNU Lesser General Public License as published by
  5. the Free Software Foundation, either version 3 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU Lesser General Public License for more details.
  11. You should have received a copy of the GNU Lesser General Public License
  12. along with this program. If not, see <http://www.gnu.org/licenses/>.
  13. *)
  14. MODULE File;
  15. IMPORT sys := SYSTEM, KOSAPI;
  16. CONST
  17. SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
  18. TYPE
  19. FNAME* = ARRAY 520 OF CHAR;
  20. FS* = POINTER TO rFS;
  21. rFS* = RECORD
  22. subfunc*, pos*, hpos*, bytes*, buffer*: INTEGER;
  23. name*: FNAME
  24. END;
  25. FD* = POINTER TO rFD;
  26. rFD* = RECORD
  27. attr*: INTEGER;
  28. ntyp*: CHAR;
  29. reserved: ARRAY 3 OF CHAR;
  30. time_create*, date_create*,
  31. time_access*, date_access*,
  32. time_modif*, date_modif*,
  33. size*, hsize*: INTEGER;
  34. name*: FNAME
  35. END;
  36. PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER;
  37. BEGIN
  38. sys.CODE(
  39. 053H, (* push ebx *)
  40. 06AH, 044H, (* push 68 *)
  41. 058H, (* pop eax *)
  42. 06AH, 01BH, (* push 27 *)
  43. 05BH, (* pop ebx *)
  44. 08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *)
  45. 0CDH, 040H, (* int 64 *)
  46. 08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *)
  47. 089H, 011H, (* mov dword [ecx], edx *)
  48. 05BH, (* pop ebx *)
  49. 0C9H, (* leave *)
  50. 0C2H, 008H, 000H (* ret 8 *)
  51. )
  52. RETURN 0
  53. END f_68_27;
  54. PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
  55. RETURN f_68_27(sys.ADR(FName[0]), size)
  56. END Load;
  57. PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
  58. VAR
  59. res2: INTEGER; fs: rFS;
  60. BEGIN
  61. fs.subfunc := 5;
  62. fs.pos := 0;
  63. fs.hpos := 0;
  64. fs.bytes := 0;
  65. fs.buffer := sys.ADR(Info);
  66. COPY(FName, fs.name)
  67. RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
  68. END GetFileInfo;
  69. PROCEDURE FileSize* (FName: ARRAY OF CHAR): INTEGER;
  70. VAR
  71. Info: rFD;
  72. res: INTEGER;
  73. BEGIN
  74. IF GetFileInfo(FName, Info) THEN
  75. res := Info.size
  76. ELSE
  77. res := -1
  78. END
  79. RETURN res
  80. END FileSize;
  81. PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
  82. VAR
  83. fd: rFD;
  84. BEGIN
  85. RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
  86. END Exists;
  87. PROCEDURE Close* (VAR F: FS);
  88. BEGIN
  89. IF F # NIL THEN
  90. DISPOSE(F)
  91. END
  92. END Close;
  93. PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
  94. VAR
  95. F: FS;
  96. BEGIN
  97. IF Exists(FName) THEN
  98. NEW(F);
  99. IF F # NIL THEN
  100. F.subfunc := 0;
  101. F.pos := 0;
  102. F.hpos := 0;
  103. F.bytes := 0;
  104. F.buffer := 0;
  105. COPY(FName, F.name)
  106. END
  107. ELSE
  108. F := NIL
  109. END
  110. RETURN F
  111. END Open;
  112. PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
  113. VAR
  114. F: FS;
  115. res, res2: INTEGER;
  116. BEGIN
  117. IF Exists(FName) THEN
  118. NEW(F);
  119. IF F # NIL THEN
  120. F.subfunc := 8;
  121. F.pos := 0;
  122. F.hpos := 0;
  123. F.bytes := 0;
  124. F.buffer := 0;
  125. COPY(FName, F.name);
  126. res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  127. DISPOSE(F)
  128. ELSE
  129. res := -1
  130. END
  131. ELSE
  132. res := -1
  133. END
  134. RETURN res = 0
  135. END Delete;
  136. PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
  137. VAR
  138. res: INTEGER;
  139. fd: rFD;
  140. BEGIN
  141. IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
  142. CASE Origin OF
  143. |SEEK_BEG: F.pos := Offset
  144. |SEEK_CUR: F.pos := F.pos + Offset
  145. |SEEK_END: F.pos := fd.size + Offset
  146. ELSE
  147. END;
  148. res := F.pos
  149. ELSE
  150. res := -1
  151. END
  152. RETURN res
  153. END Seek;
  154. PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
  155. VAR
  156. res, res2: INTEGER;
  157. BEGIN
  158. IF F # NIL THEN
  159. F.subfunc := 0;
  160. F.bytes := Count;
  161. F.buffer := Buffer;
  162. res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  163. IF res2 > 0 THEN
  164. F.pos := F.pos + res2
  165. END
  166. ELSE
  167. res2 := 0
  168. END
  169. RETURN res2
  170. END Read;
  171. PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
  172. VAR
  173. res, res2: INTEGER;
  174. BEGIN
  175. IF F # NIL THEN
  176. F.subfunc := 3;
  177. F.bytes := Count;
  178. F.buffer := Buffer;
  179. res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  180. IF res2 > 0 THEN
  181. F.pos := F.pos + res2
  182. END
  183. ELSE
  184. res2 := 0
  185. END
  186. RETURN res2
  187. END Write;
  188. PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
  189. VAR
  190. F: FS;
  191. res2: INTEGER;
  192. BEGIN
  193. NEW(F);
  194. IF F # NIL THEN
  195. F.subfunc := 2;
  196. F.pos := 0;
  197. F.hpos := 0;
  198. F.bytes := 0;
  199. F.buffer := 0;
  200. COPY(FName, F.name);
  201. IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
  202. DISPOSE(F)
  203. END
  204. END
  205. RETURN F
  206. END Create;
  207. PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
  208. VAR
  209. fd: rFD;
  210. BEGIN
  211. RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
  212. END DirExists;
  213. PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  214. VAR
  215. F: FS;
  216. res, res2: INTEGER;
  217. BEGIN
  218. NEW(F);
  219. IF F # NIL THEN
  220. F.subfunc := 9;
  221. F.pos := 0;
  222. F.hpos := 0;
  223. F.bytes := 0;
  224. F.buffer := 0;
  225. COPY(DirName, F.name);
  226. res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  227. DISPOSE(F)
  228. ELSE
  229. res := -1
  230. END
  231. RETURN res = 0
  232. END CreateDir;
  233. PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  234. VAR
  235. F: FS;
  236. res, res2: INTEGER;
  237. BEGIN
  238. IF DirExists(DirName) THEN
  239. NEW(F);
  240. IF F # NIL THEN
  241. F.subfunc := 8;
  242. F.pos := 0;
  243. F.hpos := 0;
  244. F.bytes := 0;
  245. F.buffer := 0;
  246. COPY(DirName, F.name);
  247. res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  248. DISPOSE(F)
  249. ELSE
  250. res := -1
  251. END
  252. ELSE
  253. res := -1
  254. END
  255. RETURN res = 0
  256. END DeleteDir;
  257. END File.