GCC Code Coverage Report


Directory: src/
File: script_transcompiler/backend_cpp.cpp
Date: 2024-12-30 15:39:09
Exec Total Coverage
Lines: 79 88 89.8%
Functions: 2 2 100.0%
Branches: 102 206 49.5%

Line Branch Exec Source
1 #include "data.h"
2
3 namespace
4 {
5
6 struct cpp_file
7 {
8 bool use_iostream = false;
9 bool use_string = false;
10 bool use_text_conversion = false;
11 bool use_fstream = false;
12
13 std::vector<std::string> lines;
14 };
15
16 14 inline bool generate_cpp_code(const intermediate& i, cpp_file& file, data&)
17 {
18
1/2
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
14 file.lines.push_back("// " + i.line);
19
20
8/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 1 times.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
14 switch (i.command)
21 {
22 case (intermediate::cmd::comment):
23 {
24 file.lines.push_back("//" + i.operand);
25 break;
26 }
27 1 case (intermediate::cmd::text_init_memory):
28 {
29
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("std::string text = \"" + i.operand + "\";");
30 1 file.use_string = true;
31 1 break;
32 }
33 case (intermediate::cmd::text_memory):
34 {
35 file.lines.push_back("text = \"" + i.operand + "\";");
36 break;
37 }
38 3 case (intermediate::cmd::print_memory):
39 {
40
2/4
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
3 file.lines.push_back("std::cout << text << std::endl;");
41 3 file.use_iostream = true;
42 3 break;
43 }
44 case (intermediate::cmd::load_init_memory):
45 {
46 file.lines.push_back("std::string text;");
47 }
48 [[fallthrough]];
49 2 case (intermediate::cmd::load_memory):
50 {
51
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("{");
52
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" std::ifstream file{\"" + i.operand + "\"};");
53
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" if (!file.is_open())");
54
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" return EXIT_FAILURE;");
55
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" std::stringstream buffer;");
56
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" buffer << file.rdbuf();");
57
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" text = buffer.str();");
58
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back(" file.close();");
59
2/4
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
2 file.lines.push_back("}");
60
61 2 file.use_fstream = true;
62 2 break;
63 }
64 1 case (intermediate::cmd::create_file):
65 {
66
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("{");
67
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" std::ofstream file{\"" + i.operand + "\"};");
68
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" file.close();");
69
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("}");
70
71 1 file.use_fstream = true;
72 1 break;
73 }
74 1 case (intermediate::cmd::save_memory):
75 {
76
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("{");
77
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" std::ofstream output_file{\"" + i.operand +
78 "\"};");
79
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" if (!output_file.is_open())");
80
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" return EXIT_FAILURE;");
81
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" output_file << text << std::endl;");
82
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" output_file.close();");
83
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("}");
84 1 file.use_fstream = true;
85 1 break;
86 }
87 1 case (intermediate::cmd::process_memory):
88 {
89
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("text_conversion::convert_to_title_case(text);");
90 1 file.use_text_conversion = true;
91 1 break;
92 }
93 4 case (intermediate::cmd::print_text):
94 {
95
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 4 times.
✗ Branch 6 not taken.
4 file.lines.push_back("std::cout << \"" + i.operand +
96 "\" << std::endl;");
97 4 file.use_iostream = true;
98 4 break;
99 }
100 1 case (intermediate::cmd::save_text):
101 {
102
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("{");
103
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" std::ofstream output_file{\"" + i.operandB +
104 "\"};");
105
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" if (!output_file.is_open())");
106
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" return EXIT_FAILURE;");
107
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" output_file << \"" + i.operand +
108 "\" << std::endl;");
109
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back(" output_file.close();");
110
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 file.lines.push_back("}");
111 1 file.use_fstream = true;
112 1 break;
113 break;
114 }
115 }
116
117 14 return true;
118 }
119 } // namespace
120
121 1 void generate_cpp(data& data)
122 {
123 1 cpp_file file;
124
125
2/2
✓ Branch 5 taken 14 times.
✓ Branch 6 taken 1 times.
15 for (const auto& ic : data.c)
126 {
127
2/4
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
14 if (!generate_cpp_code(ic, file, data))
128 return;
129 }
130
131
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.use_text_conversion)
132
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include \"text_conversion.h\"");
133
134
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include <cstdlib>");
135
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.use_iostream)
136
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include <iostream>");
137
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.use_string)
138
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include <string>");
139
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (file.use_fstream)
140 {
141
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include <fstream>");
142
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("#include <sstream>");
143 }
144
145
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("\nint main() {");
146
147
2/2
✓ Branch 4 taken 59 times.
✓ Branch 5 taken 1 times.
60 for (const auto& line : file.lines)
148
2/4
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 59 times.
✗ Branch 5 not taken.
59 data.result.push_back(" " + line);
149
150
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back(" return EXIT_SUCCESS;");
151
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 data.result.push_back("}\n");
152
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 }
153