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. |