WRITER.ob07 1.6 KB

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