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