Subversion Repositories Kolibri OS

Rev

Rev 7597 | Blame | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2018, 2019, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE WRITER;
  9.  
  10. IMPORT FILES, ERRORS, UTILS;
  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
  38.         ERRORS.Error(201)
  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
  50.         ERRORS.Error(201)
  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
  62.         WriteByte(file, UTILS.Byte(n, i))
  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
  73.         WriteByte(file, UTILS.Byte(n, i))
  74.     END
  75. END Write32LE;
  76.  
  77.  
  78. PROCEDURE Write16LE* (file: FILE; n: INTEGER);
  79. BEGIN
  80.     WriteByte(file, UTILS.Byte(n, 0));
  81.     WriteByte(file, UTILS.Byte(n, 1))
  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.  
  111. END WRITER.