Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7693 Rev 7696
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
3
 
3
 
4
    Copyright (c) 2018, 2019, Anton Krotov
4
    Copyright (c) 2018-2019, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
7
 
7
 
8
MODULE WRITER;
8
MODULE WRITER;
9
 
9
 
10
IMPORT FILES, ERRORS, UTILS;
10
IMPORT FILES, ERRORS, UTILS;
11
 
11
 
12
 
12
 
13
TYPE
13
TYPE
14
 
14
 
15
    FILE* = FILES.FILE;
15
    FILE* = FILES.FILE;
16
 
16
 
17
 
17
 
18
VAR
18
VAR
19
 
19
 
20
    counter*: INTEGER;
20
    counter*: INTEGER;
21
 
21
 
22
 
22
 
23
PROCEDURE align (n, _align: INTEGER): INTEGER;
23
PROCEDURE align (n, _align: INTEGER): INTEGER;
24
BEGIN
24
BEGIN
25
    IF n MOD _align # 0 THEN
25
    IF n MOD _align # 0 THEN
26
        n := n + _align - (n MOD _align)
26
        n := n + _align - (n MOD _align)
27
    END
27
    END
28
 
28
 
29
    RETURN n
29
    RETURN n
30
END align;
30
END align;
31
 
31
 
32
 
32
 
33
PROCEDURE WriteByte* (file: FILE; n: BYTE);
33
PROCEDURE WriteByte* (file: FILE; n: BYTE);
34
BEGIN
34
BEGIN
35
    IF FILES.WriteByte(file, n) THEN
35
    IF FILES.WriteByte(file, n) THEN
36
        INC(counter)
36
        INC(counter)
37
    ELSE
37
    ELSE
38
        ERRORS.Error(201)
38
        ERRORS.Error(201)
39
    END
39
    END
40
END WriteByte;
40
END WriteByte;
41
 
41
 
42
 
42
 
43
PROCEDURE Write* (file: FILE; chunk: ARRAY OF BYTE; bytes: INTEGER);
43
PROCEDURE Write* (file: FILE; chunk: ARRAY OF BYTE; bytes: INTEGER);
44
VAR
44
VAR
45
    n: INTEGER;
45
    n: INTEGER;
46
 
46
 
47
BEGIN
47
BEGIN
48
    n := FILES.write(file, chunk, bytes);
48
    n := FILES.write(file, chunk, bytes);
49
    IF n # bytes THEN
49
    IF n # bytes THEN
50
        ERRORS.Error(201)
50
        ERRORS.Error(201)
51
    END;
51
    END;
52
    INC(counter, n)
52
    INC(counter, n)
53
END Write;
53
END Write;
54
 
54
 
55
 
55
 
56
PROCEDURE Write64LE* (file: FILE; n: INTEGER);
56
PROCEDURE Write64LE* (file: FILE; n: INTEGER);
57
VAR
57
VAR
58
    i: INTEGER;
58
    i: INTEGER;
59
 
59
 
60
BEGIN
60
BEGIN
61
    FOR i := 0 TO 7 DO
61
    FOR i := 0 TO 7 DO
62
        WriteByte(file, UTILS.Byte(n, i))
62
        WriteByte(file, UTILS.Byte(n, i))
63
    END
63
    END
64
END Write64LE;
64
END Write64LE;
65
 
65
 
66
 
66
 
67
PROCEDURE Write32LE* (file: FILE; n: INTEGER);
67
PROCEDURE Write32LE* (file: FILE; n: INTEGER);
68
VAR
68
VAR
69
    i: INTEGER;
69
    i: INTEGER;
70
 
70
 
71
BEGIN
71
BEGIN
72
    FOR i := 0 TO 3 DO
72
    FOR i := 0 TO 3 DO
73
        WriteByte(file, UTILS.Byte(n, i))
73
        WriteByte(file, UTILS.Byte(n, i))
74
    END
74
    END
75
END Write32LE;
75
END Write32LE;
76
 
76
 
77
 
77
 
78
PROCEDURE Write16LE* (file: FILE; n: INTEGER);
78
PROCEDURE Write16LE* (file: FILE; n: INTEGER);
79
BEGIN
79
BEGIN
80
    WriteByte(file, UTILS.Byte(n, 0));
80
    WriteByte(file, UTILS.Byte(n, 0));
81
    WriteByte(file, UTILS.Byte(n, 1))
81
    WriteByte(file, UTILS.Byte(n, 1))
82
END Write16LE;
82
END Write16LE;
83
 
83
 
84
 
84
 
85
PROCEDURE Padding* (file: FILE; FileAlignment: INTEGER);
85
PROCEDURE Padding* (file: FILE; FileAlignment: INTEGER);
86
VAR
86
VAR
87
    i: INTEGER;
87
    i: INTEGER;
88
 
88
 
89
BEGIN
89
BEGIN
90
    i := align(counter, FileAlignment) - counter;
90
    i := align(counter, FileAlignment) - counter;
91
    WHILE i > 0 DO
91
    WHILE i > 0 DO
92
        WriteByte(file, 0);
92
        WriteByte(file, 0);
93
        DEC(i)
93
        DEC(i)
94
    END
94
    END
95
END Padding;
95
END Padding;
96
 
96
 
97
 
97
 
98
PROCEDURE Create* (FileName: ARRAY OF CHAR): FILE;
98
PROCEDURE Create* (FileName: ARRAY OF CHAR): FILE;
99
BEGIN
99
BEGIN
100
    counter := 0
100
    counter := 0
101
    RETURN FILES.create(FileName)
101
    RETURN FILES.create(FileName)
102
END Create;
102
END Create;
103
 
103
 
104
 
104
 
105
PROCEDURE Close* (VAR file: FILE);
105
PROCEDURE Close* (VAR file: FILE);
106
BEGIN
106
BEGIN
107
    FILES.close(file)
107
    FILES.close(file)
108
END Close;
108
END Close;
109
 
109
 
110
 
110
 
111
END WRITER.
111
END WRITER.