GCC Code Coverage Report


Directory: src/
File: script_compiler/compiler.cpp
Date: 2024-12-30 15:39:09
Exec Total Coverage
Lines: 38 42 90.5%
Functions: 3 3 100.0%
Branches: 34 60 56.7%

Line Branch Exec Source
1 #include <cstdlib>
2 #include <fstream>
3 #include <iostream>
4 #include <script.h>
5 #include <string>
6 #include <vector>
7
8 2 inline void print_error(const char* msg)
9 {
10 2 std::cout << "\033[31m";
11 2 std::cout << "Error: " << msg << std::endl;
12 2 std::cout << "\033[0m";
13 2 }
14
15 3 bool compile(int argc, char* argv[])
16 {
17
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if (argc <= 2)
18 {
19
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 print_error("Missing command line argument.");
20 1 return false;
21 }
22
23 // todo: make option
24
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 std::cout << argv[1] << "\n";
25
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 std::cout << argv[2] << "\n";
26
27
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 std::ifstream source{argv[1]};
28
29
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 if (!source.is_open())
30 return false;
31
32
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 std::ofstream dst{argv[2]};
33
2/4
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 if (!dst.is_open())
34 return false;
35
36 2 std::vector<std::string> lines;
37
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 lines.reserve(16);
38
39 2 std::string line;
40
4/6
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 17 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 15 times.
✓ Branch 7 taken 2 times.
17 while (std::getline(source, line))
41 {
42
2/2
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 12 times.
15 if (line.empty())
43 3 continue;
44
45
3/6
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
12 if ((line.back() == '\r' || line.back() == '\n'))
46 line.erase(line.size() - 1);
47
48
1/2
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
12 lines.push_back(line);
49 }
50
51
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 source.close();
52
53
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
2 if (lines.empty())
54 return false;
55
56 2 std::vector<char> bytecode;
57
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 auto res = script::compile(lines, bytecode);
58
59
2/2
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
2 if (!res.empty())
60 {
61
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 print_error(res.c_str());
62 1 return false;
63 }
64
65
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 dst.write(bytecode.data(), bytecode.size());
66
67 // todo: make class
68
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 dst.close();
69
70 1 return true;
71 2 }
72
73 3 int main(int argc, char* argv[])
74 {
75
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1 times.
3 if (!compile(argc, argv))
76 2 return EXIT_FAILURE;
77
78 1 return EXIT_SUCCESS;
79 }
80