(* BSD 2-Clause License Copyright (c) 2019-2020, Anton Krotov All rights reserved. *) MODULE File; IMPORT SYSTEM, WINAPI, API; CONST OPEN_R* = 0; OPEN_W* = 1; OPEN_RW* = 2; SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2; PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN; VAR FindData: WINAPI.TWin32FindData; Handle: INTEGER; attr: SET; BEGIN Handle := WINAPI.FindFirstFileA(SYSTEM.ADR(FName[0]), FindData); IF Handle # -1 THEN WINAPI.FindClose(Handle); SYSTEM.GET32(SYSTEM.ADR(FindData.dwFileAttributes), attr); IF 4 IN attr THEN Handle := -1 END END RETURN Handle # -1 END Exists; PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN; RETURN WINAPI.DeleteFileA(SYSTEM.ADR(FName[0])) # 0 END Delete; PROCEDURE Create* (FName: ARRAY OF CHAR): INTEGER; RETURN WINAPI.CreateFileA(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0) END Create; PROCEDURE Close* (F: INTEGER); BEGIN WINAPI.CloseHandle(F) END Close; PROCEDURE Open* (FName: ARRAY OF CHAR; Mode: INTEGER): INTEGER; VAR ofstr: WINAPI.OFSTRUCT; BEGIN RETURN WINAPI.OpenFile(SYSTEM.ADR(FName[0]), ofstr, Mode) END Open; PROCEDURE Seek* (F, Offset, Origin: INTEGER): INTEGER; RETURN WINAPI.SetFilePointer(F, Offset, 0, Origin) END Seek; PROCEDURE Read* (F, Buffer, Count: INTEGER): INTEGER; VAR res: INTEGER; BEGIN IF WINAPI.ReadFile(F, Buffer, Count, SYSTEM.ADR(res), NIL) = 0 THEN res := -1 END RETURN res END Read; PROCEDURE Write* (F, Buffer, Count: INTEGER): INTEGER; VAR res: INTEGER; BEGIN IF WINAPI.WriteFile(F, Buffer, Count, SYSTEM.ADR(res), NIL) = 0 THEN res := -1 END RETURN res END Write; PROCEDURE Load* (FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER; VAR res, n, F: INTEGER; BEGIN res := 0; F := Open(FName, OPEN_R); IF F # -1 THEN Size := Seek(F, 0, SEEK_END); n := Seek(F, 0, SEEK_BEG); res := API._NEW(Size); IF (res = 0) OR (Read(F, res, Size) # Size) THEN IF res # 0 THEN res := API._DISPOSE(res); Size := 0 END END; Close(F) END RETURN res END Load; PROCEDURE RemoveDir* (DirName: ARRAY OF CHAR): BOOLEAN; RETURN WINAPI.RemoveDirectoryA(SYSTEM.ADR(DirName[0])) # 0 END RemoveDir; PROCEDURE ExistsDir* (DirName: ARRAY OF CHAR): BOOLEAN; VAR Code: SET; BEGIN Code := WINAPI.GetFileAttributesA(SYSTEM.ADR(DirName[0])) RETURN (Code # {0..31}) & (4 IN Code) END ExistsDir; PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN; RETURN WINAPI.CreateDirectoryA(SYSTEM.ADR(DirName[0]), NIL) # 0 END CreateDir; END File.