Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 7596 → Rev 7597

/programs/develop/oberon07/Lib/KolibriOS/File.ob07
1,5 → 1,5
(*
Copyright 2016 Anton Krotov
(*
Copyright 2016, 2018 Anton Krotov
 
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
19,10 → 19,12
 
IMPORT sys := SYSTEM, KOSAPI;
 
 
CONST
 
SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
 
 
TYPE
 
FNAME* = ARRAY 520 OF CHAR;
47,29 → 49,36
name*: FNAME
END;
 
 
PROCEDURE [stdcall] f_68_27(file_name: INTEGER; VAR size: INTEGER): INTEGER;
BEGIN
sys.CODE("53"); (* push ebx *)
sys.CODE("6A44"); (* push 68 *)
sys.CODE("58"); (* pop eax *)
sys.CODE("6A1B"); (* push 27 *)
sys.CODE("5B"); (* pop ebx *)
sys.CODE("8B4D08"); (* mov ecx, [ebp + 08h] *)
sys.CODE("CD40"); (* int 40h *)
sys.CODE("8B4D0C"); (* mov ecx, [ebp + 0Ch] *)
sys.CODE("8911"); (* mov [ecx], edx *)
sys.CODE("5B"); (* pop ebx *)
sys.CODE("C9"); (* leave *)
sys.CODE("C20800"); (* ret 08h *)
sys.CODE(
053H, (* push ebx *)
06AH, 044H, (* push 68 *)
058H, (* pop eax *)
06AH, 01BH, (* push 27 *)
05BH, (* pop ebx *)
08BH, 04DH, 008H, (* mov ecx, dword [ebp + 8] *)
0CDH, 040H, (* int 64 *)
08BH, 04DH, 00CH, (* mov ecx, dword [ebp + 12] *)
089H, 011H, (* mov dword [ecx], edx *)
05BH, (* pop ebx *)
0C9H, (* leave *)
0C2H, 008H, 000H (* ret 8 *)
)
RETURN 0
END f_68_27;
 
 
PROCEDURE Load*(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
RETURN f_68_27(sys.ADR(FName[0]), size)
END Load;
 
 
PROCEDURE GetFileInfo*(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
VAR res2: INTEGER; fs: rFS;
VAR
res2: INTEGER; fs: rFS;
 
BEGIN
fs.subfunc := 5;
fs.pos := 0;
77,15 → 86,19
fs.bytes := 0;
fs.buffer := sys.ADR(Info);
COPY(FName, fs.name)
 
RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
END GetFileInfo;
 
 
PROCEDURE Exists*(FName: ARRAY OF CHAR): BOOLEAN;
VAR fd: rFD;
VAR
fd: rFD;
BEGIN
RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
END Exists;
 
 
PROCEDURE Close*(VAR F: FS);
BEGIN
IF F # NIL THEN
93,9 → 106,13
END
END Close;
 
 
PROCEDURE Open*(FName: ARRAY OF CHAR): FS;
VAR F: FS;
VAR
F: FS;
 
BEGIN
 
IF Exists(FName) THEN
NEW(F);
IF F # NIL THEN
109,12 → 126,18
ELSE
F := NIL
END
 
RETURN F
END Open;
 
 
PROCEDURE Delete*(FName: ARRAY OF CHAR): BOOLEAN;
VAR F: FS; res, res2: INTEGER;
VAR
F: FS;
res, res2: INTEGER;
 
BEGIN
 
IF Exists(FName) THEN
NEW(F);
IF F # NIL THEN
132,12 → 155,18
ELSE
res := -1
END
 
RETURN res = 0
END Delete;
 
 
PROCEDURE Seek*(F: FS; Offset, Origin: INTEGER): INTEGER;
VAR res: INTEGER; fd: rFD;
VAR
res: INTEGER;
fd: rFD;
 
BEGIN
 
IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
CASE Origin OF
|SEEK_BEG: F.pos := Offset
149,12 → 178,17
ELSE
res := -1
END
 
RETURN res
END Seek;
 
 
PROCEDURE Read*(F: FS; Buffer, Count: INTEGER): INTEGER;
VAR res, res2: INTEGER;
VAR
res, res2: INTEGER;
 
BEGIN
 
IF F # NIL THEN
F.subfunc := 0;
F.bytes := Count;
166,12 → 200,17
ELSE
res2 := 0
END
 
RETURN res2
END Read;
 
 
PROCEDURE Write*(F: FS; Buffer, Count: INTEGER): INTEGER;
VAR res, res2: INTEGER;
VAR
res, res2: INTEGER;
 
BEGIN
 
IF F # NIL THEN
F.subfunc := 3;
F.bytes := Count;
183,13 → 222,19
ELSE
res2 := 0
END
 
RETURN res2
END Write;
 
 
PROCEDURE Create*(FName: ARRAY OF CHAR): FS;
VAR F: FS; res2: INTEGER;
VAR
F: FS;
res2: INTEGER;
 
BEGIN
NEW(F);
 
IF F # NIL THEN
F.subfunc := 2;
F.pos := 0;
201,19 → 246,27
DISPOSE(F)
END
END
 
RETURN F
END Create;
 
 
PROCEDURE DirExists*(FName: ARRAY OF CHAR): BOOLEAN;
VAR fd: rFD;
VAR
fd: rFD;
BEGIN
RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
END DirExists;
 
 
PROCEDURE CreateDir*(DirName: ARRAY OF CHAR): BOOLEAN;
VAR F: FS; res, res2: INTEGER;
VAR
F: FS;
res, res2: INTEGER;
 
BEGIN
NEW(F);
 
IF F # NIL THEN
F.subfunc := 9;
F.pos := 0;
226,12 → 279,18
ELSE
res := -1
END
 
RETURN res = 0
END CreateDir;
 
 
PROCEDURE DeleteDir*(DirName: ARRAY OF CHAR): BOOLEAN;
VAR F: FS; res, res2: INTEGER;
VAR
F: FS;
res, res2: INTEGER;
 
BEGIN
 
IF DirExists(DirName) THEN
NEW(F);
IF F # NIL THEN
249,7 → 308,9
ELSE
res := -1
END
 
RETURN res = 0
END DeleteDir;
 
 
END File.