This repository has been archived by the owner on Mar 26, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinary.h
61 lines (51 loc) · 2.23 KB
/
Binary.h
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
#ifndef EXPRESSER_BINARY_HPP
#define EXPRESSER_BINARY_HPP
#include <vector>
#include "Lexer/Lexer.h"
#include "Parser/Parser.h"
#include "Instruction/Instruction.h"
const static std::vector<uint8_t> magic = {0x43, 0x30, 0x3a, 0x29};
const static std::vector<uint8_t> version = {0x00, 0x00, 0x00, 0x01};
void write_binary_to_file(const expresser::Parser &_parser, std::ostream &_output) {
uint8_t *cpy_pointer;
std::vector<uint8_t> result;
result.insert(result.end(), magic.begin(), magic.end());
result.insert(result.end(), version.begin(), version.end());
// constant
auto constants_count = (uint16_t) _parser._global_constants.size();
cpy_pointer = (uint8_t *) &constants_count;
for (int i = 1; i >= 0; i--)
result.push_back(cpy_pointer[i]);
for (auto constant:_parser._global_constants) {
auto constant_binary = constant.ToBinary();
result.insert(result.end(), constant_binary.begin(), constant_binary.end());
}
// start code
auto start_code_count = (uint16_t) _parser._start_instruments.size();
cpy_pointer = (uint8_t *) &start_code_count;
for (int i = 1; i >= 0; i--)
result.push_back(cpy_pointer[i]);
for (auto instrument:_parser._start_instruments) {
auto instrument_bin = instrument.ToBinary();
result.insert(result.end(), instrument_bin.begin(), instrument_bin.end());
}
// functions
std::vector<std::pair<int32_t, std::string>> function_information;
function_information.reserve(_parser._functions.size());
for (const auto &function:_parser._functions) {
function_information.emplace_back(std::make_pair(function.second._index, function.first));
}
std::sort(function_information.begin(), function_information.end());
auto function_count = function_information.size();
cpy_pointer = (uint8_t *) &function_count;
for (int i = 1; i >= 0; i--)
result.push_back(cpy_pointer[i]);
for (const auto &it:function_information) {
auto function = _parser._functions.find(it.second)->second;
auto func_bin = function.ToBinary();
result.insert(result.end(), func_bin.begin(), func_bin.end());
}
for (uint8_t ch:result)
_output.put(ch);
}
#endif //EXPRESSER_BINARY_HPP