| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- (*
- BSD 2-Clause License
- Copyright (c) 2019-2021, 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;
- VAR
- res: INTEGER;
- BEGIN
- IF API.BIT_DEPTH = 32 THEN
- res := WINAPI.SetFilePointer(F, Offset, 0, Origin)
- ELSE
- res := WINAPI.SetFilePointer(F, ORD(BITS(Offset) * {0..31}), SYSTEM.ADR(Offset) + 4, Origin)
- END
- RETURN res
- 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.
|