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