#include "HexEditor.h" /* Helper functions */ size_t fileSize(std::ifstream& file) { size_t currIndex = file.tellg(); file.seekg(0, std::ios::end); size_t size = file.tellg(); file.seekg(currIndex, std::ios::beg); return size; } /* Private functions */ void HexEditor::resizeBuffer() { size_t newLen = (length == 0) ? 8 : length << 1; Bytex* temp = new Bytex[newLen]; for (size_t i = 0; i < length; i++) temp[i] = fileBuffer[i]; if (length != 0) delete[] fileBuffer; fileBuffer = temp; length = newLen; } char HexEditor::bytexToReadableChar(const Bytex& bytex) const { char b = bytex.getByte(); if ((b >= 'A' && b <= 'Z') || (b >= 'a' && b <= 'z')) return b; return '.'; } /* Public functions */ HexEditor::HexEditor(const char* filePath) { std::ifstream inFile(filePath); if (!inFile.is_open()) { std::cout << "Error opening file" << std::endl; return; } size_t size = fileSize(inFile); length = count = 0; for (size_t i = 0; i < size; i++) add(inFile.get()); inFile.close(); size_t pathLen = strlen(filePath) + 1; originalFilePath = new char[pathLen]; strcpy(originalFilePath, filePath); } HexEditor::~HexEditor() { delete[] fileBuffer; delete[] originalFilePath; } void HexEditor::change(size_t index, const Bytex& bytex) { fileBuffer[index] = bytex; } void HexEditor::add(const Bytex& bytex) { if (count == length) resizeBuffer(); fileBuffer[count++] = bytex; } void HexEditor::remove() { fileBuffer[count--] = Bytex('\0'); } void HexEditor::viewFile() const { char buffer[2]; for (size_t i = 0; i < count; i++) { fileBuffer[i].getHex(buffer); std::cout << buffer << " "; } std::cout << std::endl; for (size_t i = 0; i < count; i++) std::cout << bytexToReadableChar(fileBuffer[i]) << " "; std::cout << std::endl; } void HexEditor::save() const { saveAs(originalFilePath); } void HexEditor::saveAs(const char* filePath) const { std::ofstream outFile(filePath); for (size_t i = 0; i < count; i++) outFile.put(fileBuffer[i].getByte()); outFile.close(); }