Subversion Repositories Kolibri OS

Rev

Rev 8097 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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