Subversion Repositories Kolibri OS

Rev

Rev 8097 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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