Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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