WRITER.ob07 1.7 KB

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