Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
8097 maxcodehac 1
(*
2
    BSD 2-Clause License
3
 
4
    Copyright (c) 2020, Anton Krotov
5
    All rights reserved.
6
*)
7
 
8
MODULE File;
9
 
10
IMPORT SYSTEM, Libdl, API;
11
 
12
 
13
CONST
14
 
15
    OPEN_R* = "rb";  OPEN_W* = "wb";  OPEN_RW* = "r+b";
16
    SEEK_BEG* = 0;   SEEK_CUR* = 1;   SEEK_END* = 2;
17
 
18
 
19
VAR
20
 
21
    fwrite,
22
    fread     : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
23
    fseek     : PROCEDURE [linux] (file, offset, origin: INTEGER): INTEGER;
24
    ftell     : PROCEDURE [linux] (file: INTEGER): INTEGER;
25
    fopen     : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
26
    fclose    : PROCEDURE [linux] (file: INTEGER): INTEGER;
27
    remove    : PROCEDURE [linux] (fname: INTEGER): INTEGER;
28
 
29
 
30
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
31
VAR
32
    sym: INTEGER;
33
 
34
BEGIN
35
    sym := Libdl.sym(lib, name);
36
    ASSERT(sym # 0);
37
    SYSTEM.PUT(VarAdr, sym)
38
END GetSym;
39
 
40
 
41
PROCEDURE init;
42
VAR
43
    libc: INTEGER;
44
 
45
BEGIN
46
    libc := Libdl.open("libc.so.6", Libdl.LAZY);
47
    ASSERT(libc # 0);
48
 
49
    GetSym(libc, "fread",  SYSTEM.ADR(fread));
50
    GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
51
    GetSym(libc, "fseek",  SYSTEM.ADR(fseek));
52
    GetSym(libc, "ftell",  SYSTEM.ADR(ftell));
53
    GetSym(libc, "fopen",  SYSTEM.ADR(fopen));
54
    GetSym(libc, "fclose", SYSTEM.ADR(fclose));
55
    GetSym(libc, "remove", SYSTEM.ADR(remove));
56
END init;
57
 
58
 
59
PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
60
    RETURN remove(SYSTEM.ADR(FName[0])) = 0
61
END Delete;
62
 
63
 
64
PROCEDURE Close* (F: INTEGER);
65
BEGIN
66
    F := fclose(F)
67
END Close;
68
 
69
 
70
PROCEDURE Open* (FName, Mode: ARRAY OF CHAR): INTEGER;
71
    RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.ADR(Mode[0]))
72
END Open;
73
 
74
 
75
PROCEDURE Create* (FName: ARRAY OF CHAR): INTEGER;
76
    RETURN Open(FName, OPEN_W)
77
END Create;
78
 
79
 
80
PROCEDURE Seek* (F, Offset, Origin: INTEGER): INTEGER;
81
VAR
82
    res: INTEGER;
83
 
84
BEGIN
85
    IF fseek(F, Offset, Origin) = 0 THEN
86
        res := ftell(F)
87
    ELSE
88
        res := -1
89
    END
90
 
91
    RETURN res
92
END Seek;
93
 
94
 
95
PROCEDURE Write* (F, Buffer, Count: INTEGER): INTEGER;
96
    RETURN fwrite(Buffer, 1, Count, F)
97
END Write;
98
 
99
 
100
PROCEDURE Read* (F, Buffer, Count: INTEGER): INTEGER;
101
    RETURN fread(Buffer, 1, Count, F)
102
END Read;
103
 
104
 
105
PROCEDURE Load* (FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER;
106
VAR
107
    res, n, F: INTEGER;
108
 
109
BEGIN
110
    res := 0;
111
    F := Open(FName, OPEN_R);
112
 
113
    IF F > 0 THEN
114
        Size := Seek(F, 0, SEEK_END);
115
        n    := Seek(F, 0, SEEK_BEG);
116
        res  := API._NEW(Size);
117
        IF (res = 0) OR (Read(F, res, Size) # Size) THEN
118
            IF res # 0 THEN
119
                res := API._DISPOSE(res);
120
                Size := 0
121
            END
122
        END;
123
        Close(F)
124
    END
125
 
126
    RETURN res
127
END Load;
128
 
129
 
130
BEGIN
131
    init
132
END File.