Summary Files Commits Branches @commit @diff @stats
path: root / Year 1 / Object-oriented Programming / Solutions Sem. 03 / ex4 / HexEditor.cpp
blob: 63979bcf51b7fe0636c5710293803d97159105d5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#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();
}