/* File Reader: helper class for writing data to a file. Copyright (C) 2019, Guillaume Gonnet This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "fs/file_writer.h" #include namespace maconv { namespace fs { // Constructor. FileWriter::FileWriter(std::ostream &s) : stream{s} { } // Write some bytes. void FileWriter::Write(uint8_t *bytes, uint32_t length) { stream.write(reinterpret_cast(bytes), length); } // Fill |length| bytes of |byte|. void FileWriter::Fill(uint8_t byte, uint32_t length) { for (uint32_t i = 0; i < length; i++) stream.put(byte); } // Write a single byte. void FileWriter::WriteByte(uint8_t byte) { stream.put(byte); } // Write a single short (16bits, big endian). void FileWriter::WriteHalfBE(uint16_t half) { uint8_t b[2] = { static_cast(half >> 8), static_cast(half & 0xFF) }; stream.write(reinterpret_cast(b), 2); } // Write a single short (16bits, little endian). void FileWriter::WriteHalfLE(uint16_t half) { stream.write(reinterpret_cast(&half), 2); } // Write a single word (32bits, big endian). void FileWriter::WriteWordBE(uint32_t w) { uint8_t b[4] = { static_cast(w >> 24), static_cast((w >> 16) & 0xFF), static_cast((w >> 8) & 0xFF), static_cast(w & 0xFF) }; stream.write(reinterpret_cast(b), 4); } // Write a single word (32bits, little endian). void FileWriter::WriteWordLE(uint32_t word) { stream.write(reinterpret_cast(&word), 4); } // Write a Macintosh date (epoch on January 1, 1904). void FileWriter::WriteMacDate(time_t date) { WriteWordLE(d_mtime(date)); } // Write a J2000 date (epoch on January 1, 2000). void FileWriter::WriteJ2000Date(time_t date) { return WriteMacDate(date - 3029529600UL); } // Write a string. void FileWriter::WriteString(const std::string &str) { stream << str; } } // namespace fs } // namespace maconv