asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
620 of 713, 0 excluded
87.0%
Functions:
36 of 39, 0 excluded
92.3%
Branches:
1251 of 2354, 0 excluded
53.1%

main.cpp
Line Branch Exec Source
1 // "because satanism is best defeated by summoning a bigger satan"
2 // ~Alcaro, 2019 (discussing Asar)
3 #include "addr2line.h"
4 #include "asar.h"
5 #include "unicode.h"
6 #include "virtualfile.h"
7 #include "platform/file-helpers.h"
8 #include "assembleblock.h"
9 #include "asar_math.h"
10 #include "macro.h"
11 #include <algorithm>
12 #include <ctime>
13 // randomdude999: remember to also update the .rc files (in res/windows/) when changing this.
14 // Couldn't find a way to automate this without shoving the version somewhere in the CMake files
15 const int asarver_maj=2;
16 const int asarver_min=0;
17 const int asarver_bug=0;
18 const bool asarver_beta=true;
19
20 #ifdef _I_RELEASE
21 extern char blockbetareleases[(!asarver_beta)?1:-1];
22 #endif
23 #ifdef _I_DEBUG
24 extern char blockreleasedebug[(asarver_beta)?1:-1];
25 #endif
26
27 unsigned const char * romdata_r;
28 int romlen_r;
29
30 int pass;
31
32 int optimizeforbank=-1;
33 int optimize_dp = optimize_dp_flag::ALWAYS;
34 int dp_base = 0;
35 int optimize_address = optimize_address_flag::MIRRORS;
36
37 std::vector<callstack_entry> callstack;
38
39 bool errored=false;
40 bool ignoretitleerrors=false;
41
42 int recursioncount=0;
43
44 virtual_filesystem* filesystem = nullptr;
45
46 AddressToLineMapping addressToLineMapping;
47
48 294 int get_version_int()
49 {
50 294 return asarver_maj * 10000 + asarver_min * 100 + asarver_bug;
51 }
52
53 bool setmapper()
54 {
55 int maxscore=-99999;
56 mapper_t bestmap=lorom;
57 mapper_t maps[]={lorom, hirom, exlorom, exhirom};
58 for (size_t mapid=0;mapid<sizeof(maps)/sizeof(maps[0]);mapid++)
59 {
60 mapper=maps[mapid];
61 int score=0;
62 int highbits=0;
63 bool foundnull=false;
64 for (int i=0;i<21;i++)
65 {
66 unsigned char c=romdata[snestopc(0x00FFC0+i)];
67 if (foundnull && c) score-=4;//according to some documents, NUL terminated names are possible - but they shouldn't appear in the middle of the name
68 if (c>=128) highbits++;
69 else if (is_upper(c)) score+=3;
70 else if (c==' ') score+=2;
71 else if (is_digit(c)) score+=1;
72 else if (is_lower(c)) score+=1;
73 else if (c=='-') score+=1;
74 else if (!c) foundnull=true;
75 else score-=3;
76 }
77 if (highbits>0 && highbits<=14) score-=21;//high bits set on some, but not all, bytes = unlikely to be a ROM
78 if ((romdata[snestopc(0x00FFDE)]^romdata[snestopc(0x00FFDC)])!=0xFF ||
79 (romdata[snestopc(0x00FFDF)]^romdata[snestopc(0x00FFDD)])!=0xFF) score=-99999;//checksum doesn't match up to 0xFFFF? Not a ROM.
80 //too lazy to check the real checksum
81 if (score>maxscore)
82 {
83 maxscore=score;
84 bestmap=mapper;
85 }
86 }
87 mapper=bestmap;
88
89 //detect oddball mappers
90 int mapperbyte=romdata[snestopc(0x00FFD5)];
91 int romtypebyte=romdata[snestopc(0x00FFD6)];
92 if (mapper==lorom)
93 {
94 if (mapperbyte==0x23 && (romtypebyte==0x32 || romtypebyte==0x34 || romtypebyte==0x35)) mapper=sa1rom;
95 }
96 return (maxscore>=0);
97 }
98
99
100 bool simple_callstacks = true;
101
102 // Shortens target_path to a relative path, but only if it resides
103 // within base_path or a child directory of it.
104 10355 static string shorten_to_relative_path(const char* base_path, const char* target_path)
105 {
106
3/5
✓ Branch 3 → 4 taken 5353 times.
✗ Branch 3 → 5 not taken.
✓ Branch 3 → 8 taken 5002 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 177 times.
10355 if (stribegin(target_path, base_path)) target_path += strlen(base_path);
107 10355 return target_path;
108 }
109
110 10355 static string get_top_level_directory()
111 {
112 10355 string top_level_file_dir;
113
2/4
✓ Branch 13 → 4 taken 5176 times.
✗ Branch 13 → 14 not taken.
✓ Branch 19 → 4 taken 5179 times.
✗ Branch 19 → 20 not taken.
10355 for (size_t i = 0; i < callstack.size(); ++i)
114 {
115
2/4
✓ Branch 5 → 6 taken 5176 times.
✗ Branch 5 → 11 not taken.
✓ Branch 6 → 7 taken 5179 times.
✗ Branch 6 → 17 not taken.
10355 if (callstack[i].type == callstack_entry_type::FILE)
116 {
117
2/4
✓ Branch 7 → 8 taken 5176 times.
✗ Branch 7 → 16 not taken.
✓ Branch 11 → 12 taken 5179 times.
✗ Branch 11 → 22 not taken.
10355 top_level_file_dir = dir(callstack[i].content);
118 10355 break;
119 }
120 }
121 10355 return top_level_file_dir;
122 }
123
124 10313 static string generate_call_details_string(const char* current_block, const char* current_call, int indentation, bool add_lines)
125 {
126 10313 string e;
127
5/5
✓ Branch 3 → 4 taken 48 times.
✓ Branch 3 → 5 taken 10265 times.
✓ Branch 4 → 5 taken 42 times.
✓ Branch 4 → 42 taken 3 times.
✓ Branch 4 → 63 taken 3 times.
10313 if (current_block != nullptr || current_call != nullptr)
128 {
129 10307 string indent;
130
2/7
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 5152 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 5155 times.
✗ Branch 7 → 74 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 105 not taken.
10307 if (add_lines) indent += "|";
131
6/8
✓ Branch 9 → 10 taken 516 times.
✗ Branch 9 → 74 not taken.
✓ Branch 10 → 11 taken 528 times.
✗ Branch 10 → 105 not taken.
✓ Branch 11 → 9 taken 516 times.
✓ Branch 11 → 12 taken 5152 times.
✓ Branch 12 → 10 taken 528 times.
✓ Branch 12 → 13 taken 5155 times.
11351 for (; indentation > 0; --indentation) indent += " ";
132
133
16/28
✓ Branch 12 → 13 taken 5131 times.
✓ Branch 12 → 26 taken 21 times.
✓ Branch 13 → 14 taken 5134 times.
✓ Branch 13 → 37 taken 21 times.
✓ Branch 14 → 15 taken 5131 times.
✗ Branch 14 → 54 not taken.
✓ Branch 15 → 16 taken 5131 times.
✗ Branch 15 → 52 not taken.
✓ Branch 16 → 17 taken 5131 times.
✗ Branch 16 → 50 not taken.
✓ Branch 17 → 18 taken 5131 times.
✗ Branch 17 → 48 not taken.
✓ Branch 18 → 19 taken 5131 times.
✗ Branch 18 → 46 not taken.
✓ Branch 19 → 20 taken 5131 times.
✗ Branch 19 → 44 not taken.
✓ Branch 20 → 21 taken 5134 times.
✗ Branch 20 → 75 not taken.
✓ Branch 21 → 22 taken 5134 times.
✗ Branch 21 → 73 not taken.
✓ Branch 22 → 23 taken 5134 times.
✗ Branch 22 → 71 not taken.
✓ Branch 23 → 24 taken 5134 times.
✗ Branch 23 → 69 not taken.
✓ Branch 24 → 25 taken 5134 times.
✗ Branch 24 → 67 not taken.
✓ Branch 26 → 27 taken 5134 times.
✗ Branch 26 → 65 not taken.
10307 if (current_block != nullptr) e += STR "\n"+indent+"in block: ["+current_block+"]";
134
16/28
✓ Branch 26 → 27 taken 21 times.
✓ Branch 26 → 40 taken 5131 times.
✓ Branch 28 → 29 taken 21 times.
✗ Branch 28 → 69 not taken.
✓ Branch 29 → 30 taken 21 times.
✗ Branch 29 → 67 not taken.
✓ Branch 30 → 31 taken 21 times.
✗ Branch 30 → 65 not taken.
✓ Branch 31 → 32 taken 21 times.
✗ Branch 31 → 63 not taken.
✓ Branch 32 → 33 taken 21 times.
✗ Branch 32 → 61 not taken.
✓ Branch 33 → 34 taken 21 times.
✗ Branch 33 → 59 not taken.
✓ Branch 37 → 38 taken 21 times.
✓ Branch 37 → 61 taken 5134 times.
✓ Branch 44 → 45 taken 21 times.
✗ Branch 44 → 95 not taken.
✓ Branch 45 → 46 taken 21 times.
✗ Branch 45 → 93 not taken.
✓ Branch 46 → 47 taken 21 times.
✗ Branch 46 → 91 not taken.
✓ Branch 47 → 48 taken 21 times.
✗ Branch 47 → 89 not taken.
✓ Branch 48 → 49 taken 21 times.
✗ Branch 48 → 87 not taken.
✓ Branch 50 → 51 taken 21 times.
✗ Branch 50 → 85 not taken.
10307 if (current_call != nullptr) e += STR "\n"+indent+"in macro call: [%"+current_call+"]";
135 10307 }
136 10313 return e;
137 }
138
139 10355 static string get_pretty_filename(const char* current_file)
140 {
141 // RPG Hacker: One could make an argument that we shouldn't shorten paths
142 // here, since some IDEs support jumping to files by double-clicking their
143 // paths. However, AFAIK, no IDE supports this for Asar yet, and if it's
144 // ever desired, we could just make it a command line option. Until then,
145 // I think it's more important to optimize for pretty command line display.
146
4/8
✓ Branch 2 → 3 taken 5176 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 5179 times.
✗ Branch 3 → 14 not taken.
✓ Branch 4 → 5 taken 5176 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 5179 times.
✗ Branch 7 → 12 not taken.
10355 return shorten_to_relative_path(get_top_level_directory(), current_file);
147 }
148
149 309 static string generate_filename_and_line(const char* current_file, int current_line_no)
150 {
151
2/4
✓ Branch 9 → 10 taken 153 times.
✗ Branch 9 → 22 not taken.
✓ Branch 15 → 16 taken 156 times.
✗ Branch 15 → 34 not taken.
618 return STR current_file
152
24/46
✓ Branch 2 → 3 taken 150 times.
✓ Branch 2 → 7 taken 3 times.
✓ Branch 3 → 4 taken 303 times.
✓ Branch 3 → 11 taken 3 times.
✗ Branch 3 → 25 not taken.
✓ Branch 5 → 6 taken 303 times.
✗ Branch 5 → 25 not taken.
✗ Branch 5 → 38 not taken.
✓ Branch 6 → 8 taken 150 times.
✗ Branch 6 → 25 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 25 not taken.
✓ Branch 9 → 10 taken 153 times.
✗ Branch 9 → 38 not taken.
✓ Branch 10 → 11 taken 153 times.
✓ Branch 10 → 12 taken 153 times.
✗ Branch 10 → 20 not taken.
✗ Branch 10 → 38 not taken.
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 38 not taken.
✓ Branch 14 → 15 taken 150 times.
✓ Branch 14 → 16 taken 3 times.
✓ Branch 16 → 17 taken 150 times.
✓ Branch 16 → 18 taken 3 times.
✓ Branch 17 → 18 taken 156 times.
✗ Branch 17 → 32 not taken.
✓ Branch 22 → 23 taken 153 times.
✓ Branch 22 → 24 taken 3 times.
✓ Branch 24 → 25 taken 153 times.
✓ Branch 24 → 26 taken 3 times.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
✓ Branch 26 → 27 taken 153 times.
✓ Branch 26 → 28 taken 3 times.
✓ Branch 28 → 29 taken 153 times.
✓ Branch 28 → 30 taken 3 times.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 43 not taken.
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 46 not taken.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 49 not taken.
927 + (current_line_no>=0?STR ":"+dec(current_line_no+1):"");
153 }
154
155 static string format_stack_line(const printable_callstack_entry& entry, int stack_frame_index)
156 {
157 string indent = "\n| ";
158 indent += dec(stack_frame_index);
159 indent += ": ";
160 // RPG Hacker: We'll probably never have a call stack in the
161 // hundreds even, so this very specific, lazy solution suffices.
162 if (stack_frame_index < 100) indent += " ";
163 if (stack_frame_index < 10) indent += " ";
164 return indent
165 + generate_filename_and_line(entry.prettypath, entry.lineno)
166 + entry.details;
167 }
168
169 10046 static void push_stack_line(autoarray<printable_callstack_entry>* out, const char* current_file, const char* current_block, const char* current_call, int current_line_no, int indentation, bool add_lines)
170 {
171 10046 printable_callstack_entry new_entry;
172
2/4
✓ Branch 3 → 4 taken 5023 times.
✗ Branch 3 → 15 not taken.
✓ Branch 4 → 5 taken 5023 times.
✗ Branch 4 → 26 not taken.
10046 new_entry.fullpath = current_file;
173
2/4
✓ Branch 4 → 5 taken 5023 times.
✗ Branch 4 → 13 not taken.
✓ Branch 6 → 7 taken 5023 times.
✗ Branch 6 → 22 not taken.
10046 new_entry.prettypath = get_pretty_filename(current_file);
174 10046 new_entry.lineno = current_line_no;
175
2/4
✓ Branch 7 → 8 taken 5023 times.
✗ Branch 7 → 14 not taken.
✓ Branch 12 → 13 taken 5023 times.
✗ Branch 12 → 24 not taken.
10046 new_entry.details = generate_call_details_string(current_block, current_call, indentation, add_lines);
176
2/4
✓ Branch 10 → 11 taken 5023 times.
✗ Branch 10 → 15 not taken.
✓ Branch 18 → 19 taken 5023 times.
✗ Branch 18 → 26 not taken.
10046 out->append(new_entry);
177 15069 }
178
179 272 void get_current_line_details(string* location, string* details, bool exclude_block)
180 {
181 272 const char* current_file = nullptr;
182 272 const char* current_block = nullptr;
183 272 const char* current_call = nullptr;
184 272 int current_line_no = -1;
185
4/4
✓ Branch 37 → 4 taken 364 times.
✓ Branch 37 → 38 taken 2 times.
✓ Branch 60 → 4 taken 373 times.
✓ Branch 60 → 61 taken 3 times.
742 for (int i = (int)callstack.size()-1; i >= 0 ; --i)
186 {
187
6/10
✓ Branch 5 → 6 taken 132 times.
✗ Branch 5 → 20 not taken.
✓ Branch 5 → 24 taken 129 times.
✓ Branch 5 → 32 taken 103 times.
✗ Branch 5 → 36 not taken.
✓ Branch 6 → 7 taken 135 times.
✗ Branch 6 → 35 not taken.
✓ Branch 6 → 41 taken 132 times.
✓ Branch 6 → 53 taken 106 times.
✗ Branch 6 → 59 not taken.
737 switch (callstack[i].type)
188 {
189 267 case callstack_entry_type::FILE:
190 267 current_file = callstack[i].content;
191
2/4
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 132 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 135 times.
267 if (exclude_block) current_block = nullptr;
192
4/8
✓ Branch 9 → 10 taken 132 times.
✗ Branch 9 → 43 not taken.
✓ Branch 11 → 12 taken 132 times.
✗ Branch 11 → 41 not taken.
✓ Branch 14 → 15 taken 135 times.
✗ Branch 14 → 68 not taken.
✓ Branch 17 → 18 taken 135 times.
✗ Branch 17 → 66 not taken.
267 *location = generate_filename_and_line(get_pretty_filename(current_file), current_line_no);
193 267 *location += ": ";
194
2/4
✓ Branch 16 → 17 taken 132 times.
✗ Branch 16 → 45 not taken.
✓ Branch 28 → 29 taken 135 times.
✗ Branch 28 → 72 not taken.
267 *details = generate_call_details_string(current_block, current_call, 4, false);
195 267 return;
196 case callstack_entry_type::MACRO_CALL:
197 if (current_call == nullptr) current_call = callstack[i].content;
198 break;
199 261 case callstack_entry_type::LINE:
200
6/8
✓ Branch 24 → 25 taken 26 times.
✓ Branch 24 → 28 taken 103 times.
✓ Branch 25 → 26 taken 26 times.
✗ Branch 25 → 28 not taken.
✓ Branch 41 → 42 taken 26 times.
✓ Branch 41 → 47 taken 106 times.
✓ Branch 42 → 43 taken 26 times.
✗ Branch 42 → 47 not taken.
261 if (current_block == nullptr && current_call == nullptr) current_block = callstack[i].content;
201
2/4
✓ Branch 28 → 29 taken 129 times.
✗ Branch 28 → 31 not taken.
✓ Branch 47 → 48 taken 132 times.
✗ Branch 47 → 52 not taken.
261 if (current_line_no == -1) current_line_no = callstack[i].lineno;
202 261 break;
203 209 case callstack_entry_type::BLOCK:
204
2/4
✓ Branch 32 → 33 taken 103 times.
✗ Branch 32 → 35 not taken.
✓ Branch 53 → 54 taken 106 times.
✗ Branch 53 → 58 not taken.
209 if (current_block == nullptr) current_block = callstack[i].content;
205 209 break;
206 }
207 }
208 5 *location = "";
209 5 *details = "";
210 }
211
212 272 void get_full_printable_callstack(autoarray<printable_callstack_entry>* out, int indentation, bool add_lines)
213 {
214 272 out->reset();
215 272 const char* current_file = nullptr;
216 272 const char* current_block = nullptr;
217 272 const char* current_call = nullptr;
218 272 int current_line_no = -1;
219
4/4
✓ Branch 19 → 4 taken 15454 times.
✓ Branch 19 → 20 taken 134 times.
✓ Branch 31 → 5 taken 15463 times.
✓ Branch 31 → 32 taken 138 times.
31189 for (size_t i = 0; i < callstack.size(); ++i)
220 {
221
8/10
✓ Branch 5 → 6 taken 5155 times.
✓ Branch 5 → 10 taken 21 times.
✓ Branch 5 → 12 taken 5152 times.
✓ Branch 5 → 15 taken 5126 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 5158 times.
✓ Branch 7 → 14 taken 21 times.
✓ Branch 7 → 18 taken 5155 times.
✓ Branch 7 → 25 taken 5129 times.
✗ Branch 7 → 29 not taken.
30917 switch (callstack[i].type)
222 {
223 10313 case callstack_entry_type::FILE:
224
4/4
✓ Branch 6 → 7 taken 5023 times.
✓ Branch 6 → 8 taken 132 times.
✓ Branch 8 → 9 taken 5023 times.
✓ Branch 8 → 10 taken 135 times.
10313 if (current_file != nullptr)
225 {
226 10046 push_stack_line(out, current_file, current_block, current_call, current_line_no, indentation, add_lines);
227 }
228 10313 current_file = callstack[i].content;
229 10313 current_block = nullptr;
230 10313 current_call = nullptr;
231 10313 current_line_no = -1;
232 10313 break;
233 42 case callstack_entry_type::MACRO_CALL:
234 42 current_block = nullptr;
235 42 current_call = callstack[i].content;
236 42 break;
237 10307 case callstack_entry_type::LINE:
238 10307 current_line_no = callstack[i].lineno;
239 10307 current_block = callstack[i].content;
240 10307 break;
241 10255 case callstack_entry_type::BLOCK:
242 10255 current_block = callstack[i].content;
243 10255 break;
244 }
245 }
246 272 }
247
248 static string get_full_callstack()
249 {
250 autoarray<printable_callstack_entry> printable_stack;
251 get_full_printable_callstack(&printable_stack, 12, true);
252
253 string e;
254 if (printable_stack.count > 0)
255 {
256 e += "\nFull call stack:";
257 for (int i = printable_stack.count-1; i >= 0; --i)
258 {
259 e += format_stack_line(printable_stack[i], i);
260 }
261 }
262 return e;
263 }
264
265 // RPG Hacker: This function essetially replicates classic Asar behavior
266 // of only printing a single macro call below the current level.
267 272 static string get_simple_callstack()
268 {
269 int i;
270 272 const char* current_call = nullptr;
271
4/4
✓ Branch 9 → 4 taken 15391 times.
✓ Branch 9 → 10 taken 113 times.
✓ Branch 12 → 4 taken 15400 times.
✓ Branch 12 → 13 taken 117 times.
31021 for (i = (int)callstack.size()-1; i >= 0 ; --i)
272 {
273
4/4
✓ Branch 5 → 6 taken 21 times.
✓ Branch 5 → 8 taken 15370 times.
✓ Branch 6 → 7 taken 21 times.
✓ Branch 6 → 11 taken 15379 times.
30791 if (callstack[i].type == callstack_entry_type::MACRO_CALL)
274 {
275 42 current_call = callstack[i].content;
276 42 break;
277 }
278 }
279
280 272 const char* current_file = nullptr;
281 272 int current_line_no = -1;
282
4/4
✓ Branch 10 → 11 taken 21 times.
✓ Branch 10 → 32 taken 113 times.
✓ Branch 13 → 14 taken 21 times.
✓ Branch 13 → 40 taken 117 times.
272 if (current_call != nullptr)
283 {
284 42 bool stop = false;
285
2/4
✓ Branch 30 → 12 taken 63 times.
✗ Branch 30 → 31 not taken.
✓ Branch 38 → 15 taken 63 times.
✗ Branch 38 → 39 not taken.
126 for (int j = i-1; j >= 0 ; --j)
286 {
287
6/10
✓ Branch 13 → 14 taken 21 times.
✗ Branch 13 → 18 not taken.
✓ Branch 13 → 19 taken 21 times.
✓ Branch 13 → 23 taken 21 times.
✗ Branch 13 → 24 not taken.
✓ Branch 17 → 18 taken 21 times.
✗ Branch 17 → 24 not taken.
✓ Branch 17 → 25 taken 21 times.
✓ Branch 17 → 31 taken 21 times.
✗ Branch 17 → 32 not taken.
126 switch (callstack[j].type)
288 {
289 42 case callstack_entry_type::FILE:
290
2/4
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 21 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 21 times.
42 if (current_file != nullptr)
291 {
292 stop = true;
293 break;
294 }
295 42 current_file = callstack[j].content;
296 42 break;
297 case callstack_entry_type::MACRO_CALL:
298 stop = true;
299 break;
300 42 case callstack_entry_type::LINE:
301
2/4
✓ Branch 19 → 20 taken 21 times.
✗ Branch 19 → 22 not taken.
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 30 not taken.
42 if (current_line_no == -1) current_line_no = callstack[j].lineno;
302 42 break;
303 42 case callstack_entry_type::BLOCK:
304 42 break;
305 }
306
307
6/8
✓ Branch 24 → 25 taken 21 times.
✓ Branch 24 → 27 taken 42 times.
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 27 not taken.
✓ Branch 32 → 33 taken 21 times.
✓ Branch 32 → 35 taken 42 times.
✓ Branch 33 → 34 taken 21 times.
✗ Branch 33 → 35 not taken.
126 if (current_file != nullptr && current_line_no != -1) stop = true;
308
309
4/4
✓ Branch 27 → 28 taken 21 times.
✓ Branch 27 → 29 taken 42 times.
✓ Branch 35 → 36 taken 21 times.
✓ Branch 35 → 37 taken 42 times.
126 if (stop) break;
310 }
311 }
312
313 272 string e;
314
6/8
✓ Branch 33 → 34 taken 21 times.
✓ Branch 33 → 53 taken 113 times.
✓ Branch 34 → 35 taken 21 times.
✗ Branch 34 → 53 not taken.
✓ Branch 41 → 42 taken 21 times.
✓ Branch 41 → 77 taken 117 times.
✓ Branch 42 → 43 taken 21 times.
✗ Branch 42 → 77 not taken.
272 if (current_call != nullptr && current_file != nullptr)
315 {
316
8/16
✓ Branch 35 → 36 taken 21 times.
✗ Branch 35 → 70 not taken.
✓ Branch 37 → 38 taken 21 times.
✗ Branch 37 → 68 not taken.
✓ Branch 39 → 40 taken 21 times.
✗ Branch 39 → 65 not taken.
✓ Branch 40 → 41 taken 21 times.
✗ Branch 40 → 63 not taken.
✓ Branch 49 → 50 taken 21 times.
✗ Branch 49 → 95 not taken.
✓ Branch 52 → 53 taken 21 times.
✗ Branch 52 → 93 not taken.
✓ Branch 56 → 57 taken 21 times.
✗ Branch 56 → 89 not taken.
✓ Branch 57 → 58 taken 21 times.
✗ Branch 57 → 87 not taken.
84 e += STR "\n called from: " + generate_filename_and_line(get_pretty_filename(current_file), current_line_no)
317
8/16
✓ Branch 41 → 42 taken 21 times.
✗ Branch 41 → 61 not taken.
✓ Branch 42 → 43 taken 21 times.
✗ Branch 42 → 59 not taken.
✓ Branch 43 → 44 taken 21 times.
✗ Branch 43 → 57 not taken.
✓ Branch 44 → 45 taken 21 times.
✗ Branch 44 → 55 not taken.
✓ Branch 58 → 59 taken 21 times.
✗ Branch 58 → 85 not taken.
✓ Branch 59 → 60 taken 21 times.
✗ Branch 59 → 83 not taken.
✓ Branch 60 → 61 taken 21 times.
✗ Branch 60 → 81 not taken.
✓ Branch 62 → 63 taken 21 times.
✗ Branch 62 → 79 not taken.
105 + ": [%" + current_call + "]";
318 }
319 272 return e;
320 }
321
322 272 string get_callstack()
323 {
324
3/4
✓ Branch 2 → 3 taken 134 times.
✓ Branch 2 → 4 taken 138 times.
✓ Branch 4 → 5 taken 138 times.
✗ Branch 4 → 7 not taken.
272 if (simple_callstacks)
325 272 return get_simple_callstack();
326 else
327 return get_full_callstack();
328 }
329
330 18 void throw_vfile_error(int whichpass, virtual_file_error vfile_error, const char* filename)
331 {
332
2/5
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 6 not taken.
✓ Branch 2 → 9 taken 12 times.
✗ Branch 2 → 12 not taken.
✗ Branch 2 → 15 not taken.
18 switch (vfile_error)
333 {
334 6 case vfe_doesnt_exist:
335 6 throw_err_block(whichpass, err_file_not_found, filename);
336 case vfe_access_denied:
337 throw_err_block(whichpass, err_failed_to_open_file_access_denied, filename);
338 12 case vfe_not_regular_file:
339 12 throw_err_block(whichpass, err_failed_to_open_not_regular_file, filename);
340 case vfe_unknown:
341 case vfe_none:
342 case vfe_num_errors:
343 throw_err_block(whichpass, err_failed_to_open_file, filename);
344 }
345
346 throw_err_block(whichpass, err_failed_to_open_file, filename);
347 }
348
349 18 virtual_file_error asar_get_last_io_error()
350 {
351
1/3
✓ Branch 2 → 3 taken 18 times.
✗ Branch 2 → 4 not taken.
✗ Branch 2 → 5 not taken.
18 if (filesystem != nullptr)
352 {
353 18 return filesystem->get_last_error();
354 }
355
356 return vfe_unknown;
357 }
358
359 713 int getlenforlabel(int labelpos, int label_fs_id, bool exists)
360 {
361 713 int bank = labelpos>>16;
362 713 unsigned int word = labelpos&0xFFFF;
363 713 bool lbl_is_freespace = label_fs_id > 0;
364 // bank number for mirroring considerations.
365 // this is the number of a bank which has the same "layout" as the current bank.
366 unsigned int relaxed_bank;
367 // nonnegative if we know that DBR is pointing at a certain bank
368 713 int cur_effective_bank = -1;
369
2/2
✓ Branch 2 → 3 taken 24 times.
✓ Branch 2 → 4 taken 689 times.
713 if(optimizeforbank >= 0) {
370 24 cur_effective_bank = relaxed_bank = optimizeforbank;
371 } else {
372
2/2
✓ Branch 4 → 5 taken 529 times.
✓ Branch 4 → 6 taken 160 times.
689 if(freespaceid == 0) {
373 529 cur_effective_bank = relaxed_bank = snespos >> 16;
374 } else {
375 160 int target_bank = freespaces[freespaceid].bank;
376
4/4
✓ Branch 7 → 8 taken 42 times.
✓ Branch 7 → 9 taken 38 times.
✓ Branch 10 → 11 taken 42 times.
✓ Branch 10 → 12 taken 38 times.
160 if(target_bank == -2) relaxed_bank = 0;
377
4/4
✓ Branch 9 → 10 taken 30 times.
✓ Branch 9 → 11 taken 8 times.
✓ Branch 12 → 13 taken 30 times.
✓ Branch 12 → 14 taken 8 times.
76 else if(target_bank == -1) relaxed_bank = 0x40;
378 16 else cur_effective_bank = relaxed_bank = target_bank;
379 }
380 }
381 // hirom has non-mirrored sram in 6000-7fff, so optimize mirrors shouldn't cover it
382
8/12
✓ Branch 12 → 13 taken 348 times.
✓ Branch 12 → 14 taken 6 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 348 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 359 times.
✓ Branch 17 → 18 taken 353 times.
✓ Branch 17 → 21 taken 6 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 353 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 353 times.
713 unsigned int mirror_bound = (mapper == hirom || mapper == exhirom) ? 0x6000 : 0x8000;
383
384
4/4
✓ Branch 16 → 17 taken 90 times.
✓ Branch 16 → 19 taken 264 times.
✓ Branch 23 → 24 taken 90 times.
✓ Branch 23 → 29 taken 269 times.
713 if(lbl_is_freespace) {
385 180 bank = freespaces[label_fs_id].bank;
386 }
387
388
2/4
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 354 times.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 359 times.
713 if (!exists)
389 {
390 return 2;
391 }
392
12/16
✓ Branch 21 → 22 taken 6 times.
✓ Branch 21 → 26 taken 348 times.
✓ Branch 22 → 23 taken 3 times.
✓ Branch 22 → 26 taken 3 times.
✓ Branch 23 → 24 taken 3 times.
✗ Branch 23 → 26 not taken.
✓ Branch 24 → 25 taken 3 times.
✗ Branch 24 → 26 not taken.
✓ Branch 31 → 32 taken 6 times.
✓ Branch 31 → 36 taken 353 times.
✓ Branch 32 → 33 taken 3 times.
✓ Branch 32 → 36 taken 3 times.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 36 not taken.
✓ Branch 34 → 35 taken 3 times.
✗ Branch 34 → 36 not taken.
713 else if((optimize_dp == optimize_dp_flag::RAM) && bank == 0x7E && (word-dp_base < 0x100) && !lbl_is_freespace)
393 {
394 6 return 1;
395 }
396
16/20
✓ Branch 26 → 27 taken 228 times.
✓ Branch 26 → 32 taken 123 times.
✓ Branch 27 → 28 taken 228 times.
✗ Branch 27 → 29 not taken.
✓ Branch 28 → 29 taken 162 times.
✓ Branch 28 → 32 taken 66 times.
✓ Branch 29 → 30 taken 15 times.
✓ Branch 29 → 32 taken 147 times.
✓ Branch 30 → 31 taken 15 times.
✗ Branch 30 → 32 not taken.
✓ Branch 36 → 37 taken 233 times.
✓ Branch 36 → 42 taken 123 times.
✓ Branch 37 → 38 taken 233 times.
✗ Branch 37 → 39 not taken.
✓ Branch 38 → 39 taken 167 times.
✓ Branch 38 → 42 taken 66 times.
✓ Branch 39 → 40 taken 20 times.
✓ Branch 39 → 42 taken 147 times.
✓ Branch 40 → 41 taken 20 times.
✗ Branch 40 → 42 not taken.
707 else if(optimize_dp == optimize_dp_flag::ALWAYS && (bank == 0x7E || !(bank & 0x40)) && (word-dp_base < 0x100) && !lbl_is_freespace)
397 {
398 35 return 1;
399 }
400 672 else if (
401 // if we should optimize ram accesses...
402
8/8
✓ Branch 32 → 33 taken 318 times.
✓ Branch 32 → 34 taken 18 times.
✓ Branch 33 → 34 taken 264 times.
✓ Branch 33 → 39 taken 54 times.
✓ Branch 42 → 43 taken 318 times.
✓ Branch 42 → 44 taken 18 times.
✓ Branch 43 → 44 taken 264 times.
✓ Branch 43 → 49 taken 54 times.
672 (optimize_address == optimize_address_flag::RAM || optimize_address == optimize_address_flag::MIRRORS)
403 // and we're in a bank with ram mirrors... (optimizeforbank=0x7E is checked later)
404
4/4
✓ Branch 34 → 35 taken 258 times.
✓ Branch 34 → 39 taken 24 times.
✓ Branch 44 → 45 taken 258 times.
✓ Branch 44 → 49 taken 24 times.
564 && !(relaxed_bank & 0x40)
405 // and the label is in low RAM
406
8/12
✓ Branch 35 → 36 taken 9 times.
✓ Branch 35 → 39 taken 249 times.
✓ Branch 36 → 37 taken 9 times.
✗ Branch 36 → 39 not taken.
✓ Branch 37 → 38 taken 9 times.
✗ Branch 37 → 39 not taken.
✓ Branch 45 → 46 taken 9 times.
✓ Branch 45 → 49 taken 249 times.
✓ Branch 46 → 47 taken 9 times.
✗ Branch 46 → 49 not taken.
✓ Branch 47 → 48 taken 9 times.
✗ Branch 47 → 49 not taken.
516 && bank == 0x7E && word < 0x2000 && !lbl_is_freespace)
407 {
408 18 return 2;
409 }
410 654 else if (
411 // if we should optimize mirrors...
412
4/4
✓ Branch 39 → 40 taken 261 times.
✓ Branch 39 → 45 taken 66 times.
✓ Branch 49 → 50 taken 261 times.
✓ Branch 49 → 55 taken 66 times.
654 optimize_address == optimize_address_flag::MIRRORS
413 // we're in a bank with ram mirrors...
414
4/4
✓ Branch 40 → 41 taken 240 times.
✓ Branch 40 → 45 taken 21 times.
✓ Branch 50 → 51 taken 240 times.
✓ Branch 50 → 55 taken 21 times.
522 && !(relaxed_bank & 0x40)
415 // and the label is in a mirrored section
416
12/12
✓ Branch 41 → 42 taken 176 times.
✓ Branch 41 → 45 taken 64 times.
✓ Branch 42 → 43 taken 15 times.
✓ Branch 42 → 45 taken 161 times.
✓ Branch 43 → 44 taken 12 times.
✓ Branch 43 → 45 taken 3 times.
✓ Branch 51 → 52 taken 176 times.
✓ Branch 51 → 55 taken 64 times.
✓ Branch 52 → 53 taken 15 times.
✓ Branch 52 → 55 taken 161 times.
✓ Branch 53 → 54 taken 12 times.
✓ Branch 53 → 55 taken 3 times.
480 && !(bank & 0x40) && word < mirror_bound && !lbl_is_freespace)
417 {
418 24 return 2;
419 }
420
4/4
✓ Branch 45 → 46 taken 12 times.
✓ Branch 45 → 49 taken 303 times.
✓ Branch 55 → 56 taken 12 times.
✓ Branch 55 → 59 taken 303 times.
630 else if (optimizeforbank>=0)
421 {
422 // if optimizing for a specific bank:
423 // if the label is in freespace, then bank is the freespace's bank, and
424 // if that's non-negative, then the freespace is forced to that bank.
425 // if the freespace isn't forced to a specific bank, then bank is
426 // negative, so this equality will never hold.
427
4/4
✓ Branch 46 → 47 taken 6 times.
✓ Branch 46 → 48 taken 6 times.
✓ Branch 56 → 57 taken 6 times.
✓ Branch 56 → 58 taken 6 times.
24 if (bank == optimizeforbank) return 2;
428 12 else return 3;
429 }
430
431 // check if the label is pinned to the current freespace.
432 // can only be checked after pass 0, as freespace pin targets aren't
433 // computed before then.
434 // This codepath also handles the case of labels that are in the current freespace.
435
12/12
✓ Branch 49 → 50 taken 232 times.
✓ Branch 49 → 56 taken 71 times.
✓ Branch 50 → 51 taken 82 times.
✓ Branch 50 → 56 taken 150 times.
✓ Branch 51 → 52 taken 30 times.
✓ Branch 51 → 56 taken 52 times.
✓ Branch 59 → 60 taken 232 times.
✓ Branch 59 → 72 taken 71 times.
✓ Branch 60 → 61 taken 82 times.
✓ Branch 60 → 72 taken 150 times.
✓ Branch 61 → 62 taken 30 times.
✓ Branch 61 → 72 taken 52 times.
606 if(pass > 0 && lbl_is_freespace && freespaceid > 0) {
436 60 int fs_pin_1 = freespaces[label_fs_id].pin_target_id;
437 60 int fs_pin_2 = freespaces[freespaceid].pin_target_id;
438
4/4
✓ Branch 54 → 55 taken 16 times.
✓ Branch 54 → 56 taken 14 times.
✓ Branch 70 → 71 taken 16 times.
✓ Branch 70 → 72 taken 14 times.
60 if(fs_pin_1 == fs_pin_2) return 2;
439 }
440
441
8/8
✓ Branch 56 → 57 taken 221 times.
✓ Branch 56 → 59 taken 66 times.
✓ Branch 57 → 58 taken 171 times.
✓ Branch 57 → 59 taken 50 times.
✓ Branch 72 → 73 taken 221 times.
✓ Branch 72 → 75 taken 66 times.
✓ Branch 73 → 74 taken 171 times.
✓ Branch 73 → 75 taken 50 times.
574 if (bank >= 0 && bank == cur_effective_bank) return 2;
442 232 else return 3;
443 }
444 701 int getlenforlabel(snes_label thislabel, bool exists) {
445 701 return getlenforlabel(thislabel.pos, thislabel.freespace_id, exists);
446 }
447
448
449 333 bool is_hex_constant(const char* str){
450
4/4
✓ Branch 2 → 3 taken 108 times.
✓ Branch 2 → 9 taken 57 times.
✓ Branch 3 → 4 taken 108 times.
✓ Branch 3 → 14 taken 60 times.
333 if (*str=='$')
451 {
452 216 str++;
453
4/4
✓ Branch 6 → 4 taken 300 times.
✓ Branch 6 → 7 taken 108 times.
✓ Branch 10 → 6 taken 300 times.
✓ Branch 10 → 11 taken 108 times.
816 while(is_xdigit(*str)) {
454 600 str++;
455 }
456
2/4
✓ Branch 7 → 8 taken 108 times.
✗ Branch 7 → 9 not taken.
✓ Branch 12 → 13 taken 108 times.
✗ Branch 12 → 14 not taken.
216 if(*str=='\0'){
457 216 return true;
458 }
459 }
460 117 return false;
461 }
462
463 struct strcompare {
464 bool operator() (const char * lhs, const char * rhs) const
465 {
466 return strcmp(lhs, rhs)<0;
467 }
468 };
469
470 struct stricompare {
471 bool operator() (const char * lhs, const char * rhs) const
472 {
473 return stricmp(lhs, rhs)<0;
474 }
475 };
476
477 struct sourceline {
478 char* line;
479 int lineno;
480 };
481
482 struct sourcefile {
483 char *data;
484 autoarray<sourceline> lines;
485 };
486
487 static assocarr<sourcefile> filecontents;
488 assocarr<string> defines;
489 // needs to be separate because defines is reset between parsing arguments and patching
490 assocarr<string> clidefines;
491 assocarr<string> builtindefines;
492
493 201 bool validatedefinename(const char * name)
494 {
495
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 96 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 105 times.
201 if (!name[0]) return false;
496
4/4
✓ Branch 9 → 5 taken 429 times.
✓ Branch 9 → 10 taken 96 times.
✓ Branch 14 → 6 taken 479 times.
✓ Branch 14 → 15 taken 105 times.
1109 for (int i = 0;name[i];i++)
497 {
498
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 429 times.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 479 times.
908 if (!is_ualnum(name[i])) return false;
499 }
500
501 201 return true;
502 }
503
504 51881 void resolvedefines(string& out, const char * start)
505 {
506
4/4
✓ Branch 2 → 3 taken 25822 times.
✓ Branch 2 → 264 taken 1 time.
✓ Branch 3 → 4 taken 26057 times.
✓ Branch 3 → 381 taken 1 time.
51881 recurseblock rec;
507 51879 const char * here=start;
508
5/6
✓ Branch 3 → 4 taken 20599 times.
✓ Branch 3 → 6 taken 5223 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 26057 times.
✓ Branch 6 → 7 taken 20802 times.
✓ Branch 6 → 10 taken 5255 times.
51879 if (!strchr(here, '!'))
509 {
510
2/4
✓ Branch 4 → 5 taken 20599 times.
✗ Branch 4 → 262 not taken.
✓ Branch 8 → 9 taken 20802 times.
✗ Branch 8 → 379 not taken.
41401 out += here;
511 41401 return;
512 }
513
4/4
✓ Branch 223 → 7 taken 36027 times.
✓ Branch 223 → 224 taken 5208 times.
✓ Branch 326 → 11 taken 36350 times.
✓ Branch 326 → 327 taken 5239 times.
82824 while (*here)
514 {
515
8/8
✓ Branch 7 → 8 taken 24 times.
✓ Branch 7 → 13 taken 36003 times.
✓ Branch 8 → 9 taken 3 times.
✓ Branch 8 → 13 taken 21 times.
✓ Branch 12 → 13 taken 24 times.
✓ Branch 12 → 23 taken 36326 times.
✓ Branch 15 → 16 taken 3 times.
✓ Branch 15 → 23 taken 21 times.
72377 if (here[0] == '\\' && here[1] == '\\')
516 {
517 // allow using \\ as escape sequence
518
2/8
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 3 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 262 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 19 taken 3 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 379 not taken.
6 if (in_macro_def > 0) out += "\\";
519
2/4
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 262 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 379 not taken.
6 out += "\\";
520 6 here += 2;
521 }
522
6/8
✓ Branch 13 → 14 taken 21 times.
✓ Branch 13 → 19 taken 36003 times.
✓ Branch 14 → 15 taken 21 times.
✗ Branch 14 → 19 not taken.
✓ Branch 24 → 25 taken 21 times.
✓ Branch 24 → 35 taken 36326 times.
✓ Branch 27 → 28 taken 21 times.
✗ Branch 27 → 35 not taken.
72371 else if (here[0] == '\\' && here[1] == '!')
523 {
524 // allow using \! to escape !
525
6/8
✓ Branch 15 → 16 taken 6 times.
✓ Branch 15 → 17 taken 15 times.
✓ Branch 16 → 17 taken 6 times.
✗ Branch 16 → 262 not taken.
✓ Branch 28 → 29 taken 6 times.
✓ Branch 28 → 31 taken 15 times.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 379 not taken.
42 if (in_macro_def > 0) out += "\\";
526
2/4
✓ Branch 17 → 18 taken 21 times.
✗ Branch 17 → 262 not taken.
✓ Branch 32 → 33 taken 21 times.
✗ Branch 32 → 379 not taken.
42 out+="!";
527 42 here += 2;
528 }
529
4/4
✓ Branch 19 → 20 taken 5604 times.
✓ Branch 19 → 221 taken 30399 times.
✓ Branch 36 → 37 taken 5648 times.
✓ Branch 36 → 320 taken 30678 times.
72329 else if (*here=='!')
530 {
531
20/20
✓ Branch 20 → 21 taken 2730 times.
✓ Branch 20 → 25 taken 2874 times.
✓ Branch 21 → 22 taken 1695 times.
✓ Branch 21 → 26 taken 1035 times.
✓ Branch 22 → 23 taken 1302 times.
✓ Branch 22 → 26 taken 393 times.
✓ Branch 23 → 24 taken 60 times.
✓ Branch 23 → 26 taken 1242 times.
✓ Branch 24 → 25 taken 6 times.
✓ Branch 24 → 26 taken 54 times.
✓ Branch 37 → 38 taken 2762 times.
✓ Branch 37 → 49 taken 2886 times.
✓ Branch 39 → 40 taken 1724 times.
✓ Branch 39 → 50 taken 1038 times.
✓ Branch 42 → 43 taken 1307 times.
✓ Branch 42 → 50 taken 417 times.
✓ Branch 45 → 46 taken 60 times.
✓ Branch 45 → 50 taken 1247 times.
✓ Branch 48 → 49 taken 6 times.
✓ Branch 48 → 50 taken 54 times.
11252 bool first=(here==start || (here>=start+4 && here[-1]==' ' && here[-2]==':' && here[-3]==' '));//check if it's the start of a block
532 11252 string defname;
533 11252 here++;
534
535 11252 int depth = 0;
536
4/4
✓ Branch 30 → 29 taken 57 times.
✓ Branch 30 → 31 taken 5604 times.
✓ Branch 58 → 55 taken 57 times.
✓ Branch 58 → 59 taken 5648 times.
11366 for (const char* depth_str = here; *depth_str=='^'; depth_str++)
537 {
538 114 depth++;
539 }
540 11252 here += depth;
541
542
4/4
✓ Branch 31 → 32 taken 660 times.
✓ Branch 31 → 42 taken 4944 times.
✓ Branch 60 → 61 taken 660 times.
✓ Branch 60 → 73 taken 4988 times.
11252 if (depth != in_macro_def)
543 {
544
2/4
✓ Branch 32 → 33 taken 660 times.
✗ Branch 32 → 259 not taken.
✓ Branch 62 → 63 taken 660 times.
✗ Branch 62 → 375 not taken.
1320 out += '!';
545
6/8
✓ Branch 34 → 35 taken 33 times.
✗ Branch 34 → 259 not taken.
✓ Branch 36 → 34 taken 33 times.
✓ Branch 36 → 37 taken 660 times.
✓ Branch 65 → 66 taken 33 times.
✗ Branch 65 → 375 not taken.
✓ Branch 67 → 64 taken 33 times.
✓ Branch 67 → 68 taken 660 times.
1386 for (int i=0; i < depth; ++i) out += '^';
546
6/8
✓ Branch 37 → 38 taken 9 times.
✓ Branch 37 → 41 taken 651 times.
✓ Branch 38 → 39 taken 9 times.
✗ Branch 38 → 259 not taken.
✓ Branch 68 → 69 taken 9 times.
✓ Branch 68 → 72 taken 651 times.
✓ Branch 69 → 70 taken 9 times.
✗ Branch 69 → 375 not taken.
1320 if (depth > in_macro_def) throw_err_line(0, err_invalid_depth_resolve, "define", "define", depth, in_macro_def);
547 1302 continue;
548 1302 }
549
550
4/4
✓ Branch 42 → 43 taken 54 times.
✓ Branch 42 → 67 taken 4890 times.
✓ Branch 74 → 75 taken 54 times.
✓ Branch 74 → 107 taken 4934 times.
9932 if (*here=='{')
551 {
552 108 here++;
553 108 string unprocessedname;
554 108 int braces=1;
555 while (true)
556 {
557
4/4
✓ Branch 45 → 46 taken 36 times.
✓ Branch 45 → 47 taken 540 times.
✓ Branch 80 → 81 taken 36 times.
✓ Branch 80 → 82 taken 540 times.
1152 if (*here=='{') braces++;
558
4/4
✓ Branch 47 → 48 taken 90 times.
✓ Branch 47 → 49 taken 486 times.
✓ Branch 83 → 84 taken 90 times.
✓ Branch 83 → 85 taken 486 times.
1152 if (*here=='}') braces--;
559
2/8
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 53 taken 576 times.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 231 not taken.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 90 taken 576 times.
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 335 not taken.
1152 if (!*here) throw_err_line(0, err_mismatched_braces);
560
4/4
✓ Branch 53 → 54 taken 54 times.
✓ Branch 53 → 55 taken 522 times.
✓ Branch 90 → 91 taken 54 times.
✓ Branch 90 → 92 taken 522 times.
1152 if (!braces) break;
561
2/4
✓ Branch 55 → 56 taken 522 times.
✗ Branch 55 → 231 not taken.
✓ Branch 94 → 95 taken 522 times.
✗ Branch 94 → 335 not taken.
1044 unprocessedname+=*here++;
562 }
563 108 here++;
564
2/4
✓ Branch 58 → 59 taken 54 times.
✗ Branch 58 → 231 not taken.
✓ Branch 98 → 99 taken 54 times.
✗ Branch 98 → 335 not taken.
108 resolvedefines(defname, unprocessedname);
565
3/10
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 65 taken 54 times.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 231 not taken.
✓ Branch 100 → 101 taken 54 times.
✗ Branch 100 → 335 not taken.
✗ Branch 101 → 102 not taken.
✓ Branch 101 → 105 taken 54 times.
✗ Branch 102 → 103 not taken.
✗ Branch 102 → 335 not taken.
108 if (!validatedefinename(defname)) throw_err_line(0, err_invalid_define_name);
566 108 }
567 else
568 {
569
6/8
✓ Branch 68 → 69 taken 24774 times.
✗ Branch 68 → 259 not taken.
✓ Branch 70 → 68 taken 24774 times.
✓ Branch 70 → 71 taken 4890 times.
✓ Branch 110 → 111 taken 24981 times.
✗ Branch 110 → 375 not taken.
✓ Branch 113 → 108 taken 24981 times.
✓ Branch 113 → 114 taken 4934 times.
59579 while (is_ualnum(*here)) defname+=*here++;
570 }
571
572
4/4
✓ Branch 71 → 72 taken 2625 times.
✓ Branch 71 → 197 taken 2319 times.
✓ Branch 114 → 115 taken 2351 times.
✓ Branch 114 → 116 taken 2637 times.
9932 if (first)
573 {
574 enum {
575 null,
576 append,
577 expand,
578 domath,
579 setifnotset,
580 } mode;
581 if(0);
582
4/4
✓ Branch 73 → 74 taken 255 times.
✓ Branch 73 → 75 taken 2370 times.
✓ Branch 117 → 118 taken 264 times.
✓ Branch 117 → 120 taken 2373 times.
5262 else if (stribegin(here, " = ")) { here+=3; mode=null; }
583
4/4
✓ Branch 76 → 77 taken 51 times.
✓ Branch 76 → 78 taken 2319 times.
✓ Branch 121 → 122 taken 51 times.
✓ Branch 121 → 124 taken 2322 times.
4743 else if (stribegin(here, " += ")) { here+=4; mode=append; }
584
4/4
✓ Branch 79 → 80 taken 27 times.
✓ Branch 79 → 81 taken 2292 times.
✓ Branch 125 → 126 taken 27 times.
✓ Branch 125 → 128 taken 2295 times.
4641 else if (stribegin(here, " := ")) { here+=4; mode=expand; }
585
4/4
✓ Branch 82 → 83 taken 963 times.
✓ Branch 82 → 84 taken 1329 times.
✓ Branch 129 → 130 taken 963 times.
✓ Branch 129 → 132 taken 1332 times.
4587 else if (stribegin(here, " #= ")) { here+=4; mode=domath; }
586
2/4
✗ Branch 85 → 86 not taken.
✓ Branch 85 → 87 taken 1329 times.
✗ Branch 133 → 134 not taken.
✓ Branch 133 → 136 taken 1332 times.
2661 else if (stribegin(here, " ?= ")) { here+=4; mode=setifnotset; }
587 2661 else goto notdefineset;
588 2601 string val;
589
4/4
✓ Branch 89 → 90 taken 93 times.
✓ Branch 89 → 102 taken 1203 times.
✓ Branch 140 → 141 taken 96 times.
✓ Branch 140 → 165 taken 1209 times.
2601 if (*here=='"')
590 {
591 189 here++;
592 while (true)
593 {
594
4/4
✓ Branch 91 → 92 taken 96 times.
✓ Branch 91 → 99 taken 414 times.
✓ Branch 144 → 145 taken 99 times.
✓ Branch 144 → 159 taken 414 times.
1023 if (*here=='"')
595 {
596
6/8
✓ Branch 92 → 93 taken 3 times.
✓ Branch 92 → 101 taken 93 times.
✓ Branch 93 → 94 taken 3 times.
✗ Branch 93 → 101 not taken.
✓ Branch 147 → 148 taken 3 times.
✓ Branch 147 → 163 taken 96 times.
✓ Branch 150 → 151 taken 3 times.
✗ Branch 150 → 163 not taken.
195 if (!here[1] || here[1]==' ') break;
597
2/4
✓ Branch 94 → 95 taken 3 times.
✗ Branch 94 → 96 not taken.
✓ Branch 153 → 154 taken 3 times.
✗ Branch 153 → 156 not taken.
6 else if (here[1]=='"') here++;
598 else throw_err_line(0, err_broken_define_declaration);
599 }
600
2/4
✓ Branch 99 → 100 taken 417 times.
✗ Branch 99 → 253 not taken.
✓ Branch 161 → 162 taken 417 times.
✗ Branch 161 → 367 not taken.
834 val+=*here++;
601 }
602 189 here++;
603 }
604 else
605 {
606
8/12
✓ Branch 103 → 104 taken 8286 times.
✗ Branch 103 → 253 not taken.
✓ Branch 104 → 105 taken 8286 times.
✓ Branch 104 → 106 taken 1203 times.
✓ Branch 105 → 103 taken 8286 times.
✗ Branch 105 → 106 not taken.
✓ Branch 168 → 169 taken 8304 times.
✗ Branch 168 → 367 not taken.
✓ Branch 170 → 171 taken 8304 times.
✓ Branch 170 → 173 taken 1209 times.
✓ Branch 172 → 166 taken 8304 times.
✗ Branch 172 → 173 not taken.
19002 while (*here && *here!=' ') val+=*here++;
607 }
608 //if (strqchr(val.data(), ';')) *strqchr(val.data(), ';')=0;
609
4/16
✗ Branch 106 → 107 not taken.
✓ Branch 106 → 110 taken 1296 times.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 110 not taken.
✗ Branch 111 → 112 not taken.
✓ Branch 111 → 115 taken 1296 times.
✗ Branch 112 → 113 not taken.
✗ Branch 112 → 253 not taken.
✗ Branch 174 → 175 not taken.
✓ Branch 174 → 178 taken 1305 times.
✗ Branch 176 → 177 not taken.
✗ Branch 176 → 178 not taken.
✗ Branch 179 → 180 not taken.
✓ Branch 179 → 183 taken 1305 times.
✗ Branch 180 → 181 not taken.
✗ Branch 180 → 367 not taken.
2601 if (*here && !stribegin(here, " : ")) throw_err_line(0, err_broken_define_declaration);
610 // RPG Hacker: Is it really a good idea to normalize
611 // the content of defines? That kinda violates their
612 // functionality as a string replacement mechanism.
613 //val.qnormalize();
614
615 // RPG Hacker: throw an error if we're trying to overwrite built-in defines.
616
6/8
✓ Branch 116 → 117 taken 1296 times.
✗ Branch 116 → 253 not taken.
✓ Branch 117 → 118 taken 3 times.
✓ Branch 117 → 122 taken 1293 times.
✓ Branch 184 → 185 taken 1305 times.
✗ Branch 184 → 367 not taken.
✓ Branch 185 → 186 taken 3 times.
✓ Branch 185 → 190 taken 1302 times.
2601 if (builtindefines.exists(defname))
617 {
618
2/4
✓ Branch 119 → 120 taken 3 times.
✗ Branch 119 → 253 not taken.
✓ Branch 187 → 188 taken 3 times.
✗ Branch 187 → 367 not taken.
6 throw_err_line(0, err_overriding_builtin_define, defname.data());
619 }
620
621
8/12
✓ Branch 122 → 123 taken 252 times.
✓ Branch 122 → 127 taken 51 times.
✓ Branch 122 → 147 taken 27 times.
✓ Branch 122 → 156 taken 963 times.
✗ Branch 122 → 188 not taken.
✗ Branch 122 → 195 not taken.
✓ Branch 190 → 191 taken 261 times.
✓ Branch 190 → 196 taken 51 times.
✓ Branch 190 → 222 taken 27 times.
✓ Branch 190 → 233 taken 963 times.
✗ Branch 190 → 279 not taken.
✗ Branch 190 → 287 not taken.
2595 switch (mode)
622 {
623 513 case null:
624 {
625
4/8
✓ Branch 124 → 125 taken 252 times.
✗ Branch 124 → 253 not taken.
✓ Branch 125 → 126 taken 252 times.
✗ Branch 125 → 253 not taken.
✓ Branch 192 → 193 taken 261 times.
✗ Branch 192 → 367 not taken.
✓ Branch 194 → 195 taken 261 times.
✗ Branch 194 → 367 not taken.
513 defines.create(defname) = val;
626 513 break;
627 }
628 102 case append:
629 {
630
4/12
✓ Branch 128 → 129 taken 51 times.
✗ Branch 128 → 237 not taken.
✗ Branch 129 → 130 not taken.
✓ Branch 129 → 134 taken 51 times.
✗ Branch 131 → 132 not taken.
✗ Branch 131 → 237 not taken.
✓ Branch 197 → 198 taken 51 times.
✗ Branch 197 → 343 not taken.
✗ Branch 198 → 199 not taken.
✓ Branch 198 → 203 taken 51 times.
✗ Branch 200 → 201 not taken.
✗ Branch 200 → 343 not taken.
102 if (!defines.exists(defname)) throw_err_line(0, err_define_not_found, defname.data());
631
4/8
✓ Branch 135 → 136 taken 51 times.
✗ Branch 135 → 237 not taken.
✓ Branch 136 → 137 taken 51 times.
✗ Branch 136 → 237 not taken.
✓ Branch 205 → 206 taken 51 times.
✗ Branch 205 → 343 not taken.
✓ Branch 207 → 208 taken 51 times.
✗ Branch 207 → 343 not taken.
102 string oldval = defines.find(defname);
632
2/4
✓ Branch 138 → 139 taken 51 times.
✗ Branch 138 → 234 not taken.
✓ Branch 210 → 211 taken 51 times.
✗ Branch 210 → 339 not taken.
102 val=oldval+val;
633
4/8
✓ Branch 142 → 143 taken 51 times.
✗ Branch 142 → 235 not taken.
✓ Branch 143 → 144 taken 51 times.
✗ Branch 143 → 235 not taken.
✓ Branch 216 → 217 taken 51 times.
✗ Branch 216 → 341 not taken.
✓ Branch 218 → 219 taken 51 times.
✗ Branch 218 → 341 not taken.
102 defines.create(defname) = val;
634 102 break;
635 102 }
636 54 case expand:
637 {
638 54 string newval;
639
2/4
✓ Branch 149 → 150 taken 27 times.
✗ Branch 149 → 238 not taken.
✓ Branch 225 → 226 taken 27 times.
✗ Branch 225 → 345 not taken.
54 resolvedefines(newval, val);
640
4/8
✓ Branch 151 → 152 taken 27 times.
✗ Branch 151 → 238 not taken.
✓ Branch 152 → 153 taken 27 times.
✗ Branch 152 → 238 not taken.
✓ Branch 227 → 228 taken 27 times.
✗ Branch 227 → 345 not taken.
✓ Branch 229 → 230 taken 27 times.
✗ Branch 229 → 345 not taken.
54 defines.create(defname) = newval;
641 54 break;
642 54 }
643 1926 case domath:
644 {
645 1926 string newval;
646
2/4
✓ Branch 158 → 159 taken 963 times.
✗ Branch 158 → 250 not taken.
✓ Branch 236 → 237 taken 963 times.
✗ Branch 236 → 361 not taken.
1926 resolvedefines(newval, val);
647
6/8
✓ Branch 160 → 161 taken 963 times.
✗ Branch 160 → 243 not taken.
✓ Branch 162 → 163 taken 960 times.
✓ Branch 162 → 241 taken 3 times.
✓ Branch 240 → 241 taken 963 times.
✗ Branch 240 → 351 not taken.
✓ Branch 243 → 244 taken 960 times.
✓ Branch 243 → 349 taken 3 times.
1932 math_val num = parse_math_expr(newval)->evaluate_static();
648 1920 string num_str;
649
2/12
✗ Branch 165 → 166 not taken.
✓ Branch 165 → 168 taken 960 times.
✗ Branch 166 → 167 not taken.
✗ Branch 166 → 246 not taken.
✗ Branch 167 → 179 not taken.
✗ Branch 167 → 246 not taken.
✗ Branch 248 → 249 not taken.
✓ Branch 248 → 251 taken 960 times.
✗ Branch 249 → 250 not taken.
✗ Branch 249 → 357 not taken.
✗ Branch 250 → 266 not taken.
✗ Branch 250 → 357 not taken.
1920 if(num.m_type == math_val_type::string) num_str = num.get_str();
650
8/12
✓ Branch 168 → 169 taken 6 times.
✓ Branch 168 → 174 taken 954 times.
✓ Branch 169 → 170 taken 6 times.
✗ Branch 169 → 244 not taken.
✓ Branch 170 → 171 taken 6 times.
✗ Branch 170 → 244 not taken.
✓ Branch 251 → 252 taken 6 times.
✓ Branch 251 → 259 taken 954 times.
✓ Branch 253 → 254 taken 6 times.
✗ Branch 253 → 353 not taken.
✓ Branch 254 → 255 taken 6 times.
✗ Branch 254 → 353 not taken.
1920 else if(num.m_type == math_val_type::floating) num_str = ftostr(num.get_double());
651
4/8
✓ Branch 174 → 175 taken 954 times.
✗ Branch 174 → 245 not taken.
✓ Branch 175 → 176 taken 954 times.
✗ Branch 175 → 245 not taken.
✓ Branch 260 → 261 taken 954 times.
✗ Branch 260 → 355 not taken.
✓ Branch 261 → 262 taken 954 times.
✗ Branch 261 → 355 not taken.
1908 else num_str = dec(num.get_integer());
652
2/4
✓ Branch 181 → 182 taken 960 times.
✗ Branch 181 → 246 not taken.
✓ Branch 269 → 270 taken 960 times.
✗ Branch 269 → 357 not taken.
1920 defines.create(defname) = std::move(num_str);
653 1920 break;
654 1926 }
655 case setifnotset:
656 {
657 if (!defines.exists(defname)) defines.create(defname) = val;
658 break;
659 }
660 }
661 2601 }
662 else
663 {
664 6002 notdefineset:
665
6/8
✓ Branch 199 → 200 taken 42 times.
✓ Branch 199 → 201 taken 3606 times.
✓ Branch 200 → 215 taken 42 times.
✗ Branch 200 → 259 not taken.
✓ Branch 294 → 295 taken 45 times.
✓ Branch 294 → 297 taken 3638 times.
✓ Branch 296 → 313 taken 45 times.
✗ Branch 296 → 375 not taken.
7331 if (!defname) out+="!";
666 else
667 {
668
6/12
✓ Branch 202 → 203 taken 3606 times.
✗ Branch 202 → 259 not taken.
✗ Branch 203 → 204 not taken.
✓ Branch 203 → 208 taken 3606 times.
✗ Branch 205 → 206 not taken.
✗ Branch 205 → 259 not taken.
✓ Branch 298 → 299 taken 3638 times.
✗ Branch 298 → 375 not taken.
✓ Branch 299 → 300 taken 1 time.
✓ Branch 299 → 304 taken 3637 times.
✓ Branch 301 → 302 taken 1 time.
✗ Branch 301 → 375 not taken.
7244 if (!defines.exists(defname)) throw_err_line(0, err_define_not_found, defname.data());
669 else {
670
4/8
✓ Branch 209 → 210 taken 3606 times.
✗ Branch 209 → 258 not taken.
✓ Branch 210 → 211 taken 3606 times.
✗ Branch 210 → 258 not taken.
✓ Branch 306 → 307 taken 3637 times.
✗ Branch 306 → 373 not taken.
✓ Branch 308 → 309 taken 3637 times.
✗ Branch 308 → 373 not taken.
7243 string thisone = defines.find(defname);
671
2/4
✓ Branch 212 → 213 taken 3606 times.
✗ Branch 212 → 256 not taken.
✓ Branch 310 → 311 taken 3637 times.
✗ Branch 310 → 371 not taken.
7243 resolvedefines(out, thisone);
672 7243 }
673 }
674 }
675
4/4
✓ Branch 217 → 218 taken 4938 times.
✓ Branch 217 → 220 taken 651 times.
✓ Branch 315 → 316 taken 4981 times.
✓ Branch 315 → 317 taken 651 times.
11252 }
676
2/4
✓ Branch 221 → 222 taken 30399 times.
✗ Branch 221 → 262 not taken.
✓ Branch 323 → 324 taken 30678 times.
✗ Branch 323 → 379 not taken.
61077 else out+=*here++;
677 }
678
4/4
✓ Branch 226 → 227 taken 5208 times.
✓ Branch 226 → 229 taken 20599 times.
✓ Branch 329 → 330 taken 5239 times.
✓ Branch 329 → 331 taken 20802 times.
51879 }
679
680 bool moreonline;
681 bool asarverallowed = false;
682
683 41735 void assembleline(const char * fname, int linenum, const string& line, int& single_line_for_tracker)
684 {
685
2/4
✓ Branch 2 → 3 taken 20767 times.
✗ Branch 2 → 59 not taken.
✓ Branch 3 → 4 taken 20968 times.
✗ Branch 3 → 104 not taken.
41735 recurseblock rec;
686
1/2
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 20968 times.
41735 bool moreonlinetmp=moreonline;
687 41735 single_line_for_tracker = 1;
688 try
689 {
690
2/4
✓ Branch 3 → 4 taken 20767 times.
✗ Branch 3 → 52 not taken.
✓ Branch 8 → 9 taken 20968 times.
✗ Branch 8 → 94 not taken.
41735 string out=line;
691
2/4
✓ Branch 5 → 6 taken 20767 times.
✗ Branch 5 → 50 not taken.
✓ Branch 11 → 12 taken 20968 times.
✗ Branch 11 → 92 not taken.
41735 autoptr<char**> blocks=qsplitstr(out.temp_raw(), " : ");
692 41735 moreonline=true;
693
5/6
✓ Branch 35 → 8 taken 21670 times.
✓ Branch 35 → 36 taken 15764 times.
✗ Branch 71 → 72 not taken.
✓ Branch 71 → 73 taken 37905 times.
✓ Branch 73 → 14 taken 21940 times.
✓ Branch 73 → 74 taken 15965 times.
75339 for (int block_i=0;moreonline;block_i++)
694 {
695 43610 moreonline=(blocks[block_i+1] != nullptr);
696 try
697 {
698 // it's possible that our input looks something like:
699 // nop : : nop
700 // nop : : : : : nop
701 // also, it's possible that there were empty blocks at the start or end of the line:
702 // : nop :
703 // after qsplit, we still need to deal with possibly a single ": " from a preceding empty block,
704 // and if it's the last block, possibly a following " :".
705 43610 char* thisblock = strip_whitespace(blocks[block_i]);
706 // if the block starts with ": "
707
8/8
✓ Branch 11 → 12 taken 27 times.
✓ Branch 11 → 16 taken 21643 times.
✓ Branch 12 → 13 taken 12 times.
✓ Branch 12 → 16 taken 15 times.
✓ Branch 22 → 23 taken 27 times.
✓ Branch 22 → 32 taken 21913 times.
✓ Branch 25 → 26 taken 12 times.
✓ Branch 25 → 32 taken 15 times.
43610 if(thisblock[0] == ':' && thisblock[1] == ' ') {
708 24 thisblock++;
709
4/4
✓ Branch 15 → 14 taken 12 times.
✓ Branch 15 → 16 taken 12 times.
✓ Branch 31 → 28 taken 12 times.
✓ Branch 31 → 32 taken 12 times.
48 while(*thisblock == ' ') thisblock++;
710 }
711 // if the block is a single :, skip that too.
712
6/8
✓ Branch 16 → 17 taken 15 times.
✓ Branch 16 → 19 taken 21655 times.
✓ Branch 17 → 18 taken 15 times.
✗ Branch 17 → 19 not taken.
✓ Branch 33 → 34 taken 15 times.
✓ Branch 33 → 39 taken 21925 times.
✓ Branch 36 → 37 taken 15 times.
✗ Branch 36 → 39 not taken.
43610 if(thisblock[0] == ':' && thisblock[1] == 0) thisblock++;
713
714
1/2
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 21940 times.
43610 int len_blk = strlen(thisblock);
715 // last block - strip trailing " :" if present.
716
17/18
✓ Branch 19 → 20 taken 20767 times.
✓ Branch 19 → 24 taken 903 times.
✓ Branch 20 → 21 taken 19378 times.
✓ Branch 20 → 24 taken 1389 times.
✓ Branch 21 → 22 taken 1581 times.
✓ Branch 21 → 24 taken 17797 times.
✓ Branch 22 → 23 taken 6 times.
✓ Branch 22 → 24 taken 1575 times.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 21940 times.
✓ Branch 43 → 44 taken 20968 times.
✓ Branch 43 → 54 taken 972 times.
✓ Branch 44 → 45 taken 19561 times.
✓ Branch 44 → 54 taken 1407 times.
✓ Branch 47 → 48 taken 1611 times.
✓ Branch 47 → 54 taken 17950 times.
✓ Branch 50 → 51 taken 6 times.
✓ Branch 50 → 54 taken 1605 times.
43610 if(!moreonline && len_blk >= 2 && thisblock[len_blk-2] == ' ' && thisblock[len_blk-1] == ':') {
717 12 thisblock[len_blk - 2] = 0;
718 }
719
720
2/4
✓ Branch 24 → 25 taken 21670 times.
✗ Branch 24 → 43 not taken.
✓ Branch 55 → 56 taken 21940 times.
✗ Branch 55 → 83 not taken.
43610 callstack_push cs_push(callstack_entry_type::BLOCK, thisblock);
721
722
4/4
✓ Branch 25 → 26 taken 16516 times.
✓ Branch 25 → 41 taken 5154 times.
✓ Branch 56 → 57 taken 16780 times.
✓ Branch 56 → 81 taken 5160 times.
43610 assembleblock(thisblock, single_line_for_tracker);
723
4/4
✓ Branch 26 → 27 taken 16514 times.
✓ Branch 26 → 41 taken 2 times.
✓ Branch 57 → 58 taken 16778 times.
✓ Branch 57 → 81 taken 2 times.
33296 checkbankcross();
724 43610 }
725
4/4
✓ Branch 44 → 45 taken 5003 times.
✓ Branch 44 → 46 taken 153 times.
✓ Branch 85 → 86 taken 5003 times.
✓ Branch 85 → 87 taken 159 times.
10318 catch (errblock&) {}
726
4/4
✓ Branch 30 → 31 taken 15368 times.
✓ Branch 30 → 32 taken 1299 times.
✓ Branch 64 → 65 taken 15626 times.
✓ Branch 64 → 66 taken 1311 times.
33604 if (blocks[block_i][0]!='\0') asarverallowed=false;
727
4/4
✓ Branch 32 → 33 taken 15599 times.
✓ Branch 32 → 34 taken 1068 times.
✓ Branch 67 → 68 taken 15800 times.
✓ Branch 67 → 70 taken 1137 times.
33604 if(single_line_for_tracker == 1) single_line_for_tracker = 0;
728 }
729 51741 }
730
2/4
✓ Branch 53 → 54 taken 5003 times.
✗ Branch 53 → 55 not taken.
✓ Branch 97 → 98 taken 5003 times.
✗ Branch 97 → 99 not taken.
10006 catch (errline&) {}
731 31729 moreonline=moreonlinetmp;
732 57700 }
733
734 int incsrcdepth=0;
735
736 // Returns true if a file is protected via
737 // an "includeonce".
738 11054 bool file_included_once(const char* file)
739 {
740
4/4
✓ Branch 8 → 3 taken 120 times.
✓ Branch 8 → 9 taken 5449 times.
✓ Branch 10 → 3 taken 120 times.
✓ Branch 10 → 11 taken 5563 times.
11252 for (int i = 0; i < includeonce.count; ++i)
741 {
742
4/4
✓ Branch 5 → 6 taken 21 times.
✓ Branch 5 → 7 taken 99 times.
✓ Branch 7 → 8 taken 21 times.
✓ Branch 7 → 9 taken 99 times.
240 if (includeonce[i] == file)
743 {
744 42 return true;
745 }
746 }
747
748 11012 return false;
749 }
750
751 autoarray<string> macro_defs;
752 int in_macro_def=0;
753 int cur_logical_lineno;
754
755 11024 void assemblefile(const char * filename)
756 {
757 11024 incsrcdepth++;
758
2/5
✓ Branch 3 → 4 taken 11015 times.
✗ Branch 3 → 147 not taken.
✗ Branch 3 → 262 not taken.
✓ Branch 4 → 5 taken 5569 times.
✗ Branch 4 → 262 not taken.
11024 string absolutepath = filesystem->create_absolute_path(get_current_file_name(), filename);
759
760
5/7
✓ Branch 5 → 6 taken 5455 times.
✗ Branch 5 → 145 not taken.
✓ Branch 6 → 7 taken 5590 times.
✓ Branch 6 → 8 taken 5434 times.
✗ Branch 6 → 260 not taken.
✓ Branch 7 → 8 taken 21 times.
✓ Branch 7 → 9 taken 5548 times.
11024 if (file_included_once(absolutepath))
761 {
762 42 return;
763 }
764
765 // don't do this yet; we want "file not found" errors to show the location
766 // that called assemblefile
767 //callstack_push cs_push(callstack_entry_type::FILE, absolutepath);
768
769 10982 int startif=numif;
770
5/7
✓ Branch 9 → 10 taken 5434 times.
✗ Branch 9 → 145 not taken.
✓ Branch 10 → 11 taken 5700 times.
✓ Branch 10 → 94 taken 5282 times.
✗ Branch 10 → 260 not taken.
✓ Branch 11 → 12 taken 190 times.
✓ Branch 11 → 181 taken 5358 times.
10982 if (!filecontents.exists(absolutepath))
771 {
772
4/4
✓ Branch 12 → 13 taken 151 times.
✓ Branch 12 → 139 taken 1 time.
✓ Branch 13 → 14 taken 189 times.
✓ Branch 13 → 249 taken 1 time.
342 char * temp = readfile(absolutepath, "");
773
4/4
✓ Branch 13 → 14 taken 3 times.
✓ Branch 13 → 17 taken 148 times.
✓ Branch 14 → 15 taken 3 times.
✓ Branch 14 → 18 taken 186 times.
340 if (!temp)
774 {
775
3/5
✓ Branch 15 → 16 taken 3 times.
✓ Branch 15 → 139 taken 3 times.
✗ Branch 15 → 249 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 249 taken 3 times.
6 throw_vfile_error(0, asar_get_last_io_error(), filename);
776 return;
777 }
778
2/4
✓ Branch 18 → 19 taken 148 times.
✗ Branch 18 → 139 not taken.
✓ Branch 20 → 21 taken 186 times.
✗ Branch 20 → 249 not taken.
334 callstack_push cs_push(callstack_entry_type::FILE, absolutepath);
779
780
2/4
✓ Branch 20 → 21 taken 148 times.
✗ Branch 20 → 137 not taken.
✓ Branch 22 → 23 taken 186 times.
✗ Branch 22 → 247 not taken.
334 sourcefile& newfile = filecontents.create(absolutepath);
781 334 newfile.data = temp;
782 334 char *inp = temp, *outp = temp, *line_start_p = temp;
783 334 int lineno = 0;
784 // whether there was a mismatched quote error on this line
785 334 bool linebad = false;
786 // munch is just `inp++` except it updates lineno correctly
787 #define munch (*inp == '\n' ? lineno++ : 0, inp++)
788 #define eol (*inp == 0 || *inp == '\n')
789
790 2020 auto munch_comm = [&]() {
791 3668 char* inp_start = inp;
792 3668 int lineno_start = lineno;
793
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1834 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 1834 times.
3668 munch; // eat the ';'
794
6/8
✓ Branch 4 → 5 taken 6 times.
✓ Branch 4 → 23 taken 1828 times.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 23 not taken.
✓ Branch 23 → 24 taken 6 times.
✓ Branch 23 → 82 taken 1828 times.
✓ Branch 28 → 29 taken 6 times.
✗ Branch 28 → 82 not taken.
3668 if(inp[0] == '[' && inp[1] == '[') {
795 // block comment
796
14/16
✓ Branch 7 → 8 taken 9 times.
✓ Branch 7 → 9 taken 157 times.
✓ Branch 10 → 11 taken 171 times.
✓ Branch 10 → 13 taken 1 time.
✓ Branch 11 → 7 taken 166 times.
✓ Branch 11 → 12 taken 5 times.
✗ Branch 12 → 7 not taken.
✓ Branch 12 → 13 taken 5 times.
✓ Branch 33 → 34 taken 9 times.
✓ Branch 33 → 39 taken 157 times.
✓ Branch 47 → 48 taken 171 times.
✓ Branch 47 → 57 taken 1 time.
✓ Branch 51 → 30 taken 166 times.
✓ Branch 51 → 52 taken 5 times.
✗ Branch 56 → 30 not taken.
✓ Branch 56 → 57 taken 5 times.
344 while(*inp && (inp[0] != ']' || inp[1] != ']')) munch;
797
4/4
✓ Branch 13 → 14 taken 1 time.
✓ Branch 13 → 21 taken 5 times.
✓ Branch 60 → 61 taken 1 time.
✓ Branch 60 → 75 taken 5 times.
12 if(!*inp) {
798 // we need to construct a nice callstack_push entry for the error.
799 // i think it's good enough to display the offending line starting from the comment start.
800
1/2
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 63 taken 1 time.
2 char* end = strchr(inp_start, '\n');
801
2/4
✗ Branch 16 → 15 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 68 → 64 not taken.
✓ Branch 68 → 69 taken 1 time.
2 while(isspace(end[-1])) end--;
802 2 *end = 0;
803
2/4
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 32 not taken.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 108 not taken.
2 callstack_push cs_push(callstack_entry_type::LINE, inp_start, lineno_start);
804
2/4
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 30 not taken.
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 106 not taken.
2 throw_err_null(0, err_unclosed_block_comment);
805 2 } else {
806 10 inp += 2; // the two chars are known to be ]], no need to use munch
807 }
808 12 } else {
809
10/12
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 34980 times.
✓ Branch 27 → 28 taken 36807 times.
✓ Branch 27 → 29 taken 1 time.
✓ Branch 28 → 24 taken 34980 times.
✓ Branch 28 → 29 taken 1827 times.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 92 taken 34980 times.
✓ Branch 100 → 101 taken 36807 times.
✓ Branch 100 → 105 taken 1 time.
✓ Branch 104 → 83 taken 34980 times.
✓ Branch 104 → 105 taken 1827 times.
73616 while(!eol) munch;
810 }
811 4002 };
812 while(true) {
813 // we are currently at the start of a line
814
8/8
✓ Branch 23 → 24 taken 2377 times.
✓ Branch 23 → 25 taken 1446 times.
✓ Branch 26 → 23 taken 3823 times.
✓ Branch 26 → 27 taken 5390 times.
✓ Branch 30 → 31 taken 2383 times.
✓ Branch 30 → 32 taken 1878 times.
✓ Branch 35 → 29 taken 4261 times.
✓ Branch 35 → 36 taken 5495 times.
18969 while(isspace(*inp)) munch; // includes \n; we don't care about blank lines
815
6/8
✓ Branch 27 → 28 taken 1552 times.
✓ Branch 27 → 30 taken 3838 times.
✓ Branch 28 → 29 taken 1552 times.
✗ Branch 28 → 137 not taken.
✓ Branch 37 → 38 taken 1552 times.
✓ Branch 37 → 40 taken 3943 times.
✓ Branch 38 → 39 taken 1552 times.
✗ Branch 38 → 247 not taken.
10885 if(*inp == ';') { munch_comm(); continue; }
816
4/4
✓ Branch 30 → 31 taken 148 times.
✓ Branch 30 → 32 taken 3690 times.
✓ Branch 41 → 42 taken 186 times.
✓ Branch 41 → 43 taken 3757 times.
7781 if(!*inp) break;
817 // not space, not a comment
818
2/4
✓ Branch 32 → 33 taken 3690 times.
✗ Branch 32 → 133 not taken.
✓ Branch 48 → 49 taken 3757 times.
✗ Branch 48 → 241 not taken.
7447 newfile.lines.append({outp, lineno});
819 7447 line_start_p = outp;
820 7447 linebad = false;
821 3773 continue_line:
822
8/8
✓ Branch 69 → 70 taken 56185 times.
✓ Branch 69 → 71 taken 24 times.
✓ Branch 70 → 36 taken 52511 times.
✓ Branch 70 → 71 taken 3674 times.
✓ Branch 130 → 131 taken 57085 times.
✓ Branch 130 → 133 taken 54 times.
✓ Branch 132 → 58 taken 53374 times.
✓ Branch 132 → 133 taken 3711 times.
113348 while(!eol) {
823
6/8
✓ Branch 36 → 37 taken 282 times.
✓ Branch 36 → 39 taken 52229 times.
✓ Branch 37 → 38 taken 282 times.
✗ Branch 37 → 137 not taken.
✓ Branch 59 → 60 taken 282 times.
✓ Branch 59 → 62 taken 53092 times.
✓ Branch 60 → 61 taken 282 times.
✗ Branch 60 → 247 not taken.
105885 if(*inp == ';') { munch_comm(); continue; }
824
2/4
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 52229 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 53092 times.
105321 char c = *munch;
825 105321 *outp++ = c;
826
4/4
✓ Branch 41 → 42 taken 292 times.
✓ Branch 41 → 54 taken 51937 times.
✓ Branch 69 → 70 taken 300 times.
✓ Branch 69 → 96 taken 52792 times.
105321 if(c == '"') {
827
12/16
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 3056 times.
✓ Branch 46 → 47 taken 3347 times.
✓ Branch 46 → 49 taken 1 time.
✓ Branch 47 → 48 taken 3347 times.
✗ Branch 47 → 49 not taken.
✓ Branch 48 → 43 taken 3056 times.
✓ Branch 48 → 49 taken 291 times.
✗ Branch 72 → 73 not taken.
✓ Branch 72 → 74 taken 3122 times.
✓ Branch 80 → 81 taken 3421 times.
✓ Branch 80 → 85 taken 1 time.
✓ Branch 82 → 83 taken 3421 times.
✗ Branch 82 → 85 not taken.
✓ Branch 84 → 71 taken 3122 times.
✓ Branch 84 → 85 taken 299 times.
6770 while(!eol && *inp != '"') *outp++ = *munch;
828
4/4
✓ Branch 49 → 50 taken 1 time.
✓ Branch 49 → 51 taken 291 times.
✓ Branch 86 → 87 taken 1 time.
✓ Branch 86 → 88 taken 299 times.
592 if(*inp != '"') { linebad = true; continue; }
829
2/4
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 291 times.
✗ Branch 89 → 90 not taken.
✓ Branch 89 → 91 taken 299 times.
590 *outp++ = *munch;
830
4/4
✓ Branch 54 → 55 taken 96 times.
✓ Branch 54 → 68 taken 51841 times.
✓ Branch 96 → 97 taken 96 times.
✓ Branch 96 → 128 taken 52696 times.
104729 } else if(c == '\'') {
831
4/8
✓ Branch 55 → 56 taken 96 times.
✗ Branch 55 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 58 taken 96 times.
✓ Branch 98 → 99 taken 96 times.
✗ Branch 98 → 101 not taken.
✗ Branch 100 → 101 not taken.
✓ Branch 100 → 102 taken 96 times.
192 if(eol) { linebad = true; continue; }
832
2/4
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 96 times.
✗ Branch 103 → 104 not taken.
✓ Branch 103 → 105 taken 96 times.
192 *outp++ = *munch; // the char between the quotes
833
4/4
✓ Branch 62 → 61 taken 17 times.
✓ Branch 62 → 63 taken 96 times.
✓ Branch 116 → 110 taken 17 times.
✓ Branch 116 → 117 taken 96 times.
226 while(((unsigned char)*inp & 0xc0) == 0x80) *outp++ = *inp++; // utf8 continuation bytes
834
4/4
✓ Branch 63 → 64 taken 2 times.
✓ Branch 63 → 65 taken 94 times.
✓ Branch 118 → 119 taken 2 times.
✓ Branch 118 → 120 taken 94 times.
192 if(*inp != '\'') { linebad = true; continue; }
835
2/4
✗ Branch 65 → 66 not taken.
✓ Branch 65 → 67 taken 94 times.
✗ Branch 121 → 122 not taken.
✓ Branch 121 → 123 taken 94 times.
188 *outp++ = *munch;
836 }
837 }
838 // end of line
839
6/8
✓ Branch 71 → 72 taken 3674 times.
✓ Branch 71 → 75 taken 24 times.
✓ Branch 72 → 73 taken 3674 times.
✗ Branch 72 → 74 not taken.
✓ Branch 134 → 135 taken 3711 times.
✓ Branch 134 → 140 taken 54 times.
✓ Branch 136 → 137 taken 3711 times.
✗ Branch 136 → 138 not taken.
7463 if(*inp) munch; // eat the \n
840
841 7463 char* line_end_p = outp;
842
6/8
✓ Branch 77 → 78 taken 11213 times.
✗ Branch 77 → 79 not taken.
✓ Branch 78 → 76 taken 7515 times.
✓ Branch 78 → 79 taken 3698 times.
✓ Branch 143 → 144 taken 11280 times.
✗ Branch 143 → 147 not taken.
✓ Branch 146 → 141 taken 7515 times.
✓ Branch 146 → 147 taken 3765 times.
22493 while(line_end_p > line_start_p && isspace(line_end_p[-1])) line_end_p--;
843 7463 *line_end_p = 0; // terminates line and trims any trailing whitespace
844 7463 outp = line_end_p+1;
845
846
4/4
✓ Branch 79 → 80 taken 2 times.
✓ Branch 79 → 86 taken 3696 times.
✓ Branch 149 → 150 taken 2 times.
✓ Branch 149 → 162 taken 3763 times.
7463 if(linebad) {
847
2/4
✓ Branch 80 → 81 taken 2 times.
✗ Branch 80 → 136 not taken.
✓ Branch 151 → 152 taken 2 times.
✗ Branch 151 → 245 not taken.
4 callstack_push cs_push(callstack_entry_type::LINE, line_start_p, lineno);
848
2/4
✓ Branch 81 → 82 taken 2 times.
✗ Branch 81 → 134 not taken.
✓ Branch 152 → 153 taken 2 times.
✗ Branch 152 → 243 not taken.
4 throw_err_null(0, err_mismatched_quotes);
849 // forget this line
850 4 newfile.lines.reset(newfile.lines.count-1);
851 4 continue;
852 4 }
853
854
2/4
✓ Branch 86 → 87 taken 3696 times.
✗ Branch 86 → 91 not taken.
✓ Branch 162 → 163 taken 3763 times.
✗ Branch 162 → 172 not taken.
7459 if(line_end_p > line_start_p) {
855
4/4
✓ Branch 87 → 88 taken 3 times.
✓ Branch 87 → 89 taken 3693 times.
✓ Branch 165 → 166 taken 3 times.
✓ Branch 165 → 168 taken 3760 times.
7459 if(line_end_p[-1] == '\\') {
856 // line joiner
857 6 outp = line_end_p-1; // remove the '\'
858 6 goto continue_line;
859
4/4
✓ Branch 89 → 90 taken 5 times.
✓ Branch 89 → 91 taken 3688 times.
✓ Branch 170 → 171 taken 5 times.
✓ Branch 170 → 172 taken 3755 times.
7453 } else if(line_end_p[-1] == ',') {
860 // comma line joiner
861 10 outp = line_end_p;
862 10 goto continue_line;
863 }
864 }
865 10551 }
866 #undef munch
867 #undef eol
868 334 }
869
870
2/4
✓ Branch 95 → 96 taken 5430 times.
✗ Branch 95 → 145 not taken.
✓ Branch 182 → 183 taken 5544 times.
✗ Branch 182 → 260 not taken.
10974 sourcefile& file = filecontents.find(absolutepath);
871 // previous callstack_push got dropped by the end of the if scope
872
2/4
✓ Branch 97 → 98 taken 5430 times.
✗ Branch 97 → 145 not taken.
✓ Branch 185 → 186 taken 5544 times.
✗ Branch 185 → 260 not taken.
20982 callstack_push cs_push(callstack_entry_type::FILE, absolutepath);
873 10974 asarverallowed=true;
874
4/4
✓ Branch 113 → 99 taken 19220 times.
✓ Branch 113 → 114 taken 426 times.
✓ Branch 218 → 187 taken 19421 times.
✓ Branch 218 → 219 taken 540 times.
39607 for (int i=0;i<file.lines.count;i++)
875 {
876
2/4
✓ Branch 99 → 100 taken 19220 times.
✗ Branch 99 → 142 not taken.
✓ Branch 190 → 191 taken 19421 times.
✗ Branch 190 → 256 not taken.
38641 sourceline& l = file.lines[i];
877
2/4
✓ Branch 100 → 101 taken 19220 times.
✗ Branch 100 → 142 not taken.
✓ Branch 193 → 194 taken 19421 times.
✗ Branch 193 → 256 not taken.
38641 string connectedline(l.line);
878 38641 cur_logical_lineno = i;
879
880
4/4
✓ Branch 102 → 103 taken 14216 times.
✓ Branch 102 → 140 taken 5004 times.
✓ Branch 197 → 198 taken 14417 times.
✓ Branch 197 → 254 taken 5004 times.
38641 bool was_loop_end = do_line_logic(connectedline, absolutepath, l.lineno);
881
882 // if a loop ended on this line, should it run again?
883
15/18
✓ Branch 103 → 104 taken 780 times.
✓ Branch 103 → 107 taken 13436 times.
✓ Branch 104 → 105 taken 780 times.
✗ Branch 104 → 140 not taken.
✓ Branch 105 → 106 taken 666 times.
✓ Branch 105 → 107 taken 114 times.
✓ Branch 108 → 109 taken 666 times.
✓ Branch 108 → 111 taken 13550 times.
✓ Branch 198 → 199 taken 780 times.
✓ Branch 198 → 206 taken 13637 times.
✓ Branch 200 → 201 taken 780 times.
✗ Branch 200 → 254 not taken.
✗ Branch 202 → 203 not taken.
✓ Branch 202 → 204 taken 780 times.
✓ Branch 204 → 205 taken 666 times.
✓ Branch 204 → 206 taken 114 times.
✓ Branch 207 → 208 taken 666 times.
✓ Branch 207 → 213 taken 13751 times.
28633 if (was_loop_end && whilestatus[numif].cond)
884
2/4
✓ Branch 109 → 110 taken 666 times.
✗ Branch 109 → 140 not taken.
✓ Branch 209 → 210 taken 666 times.
✗ Branch 209 → 254 not taken.
1332 i = whilestatus[numif].startline - 1;
885 38641 }
886
4/4
✓ Branch 122 → 115 taken 6 times.
✓ Branch 122 → 123 taken 426 times.
✓ Branch 228 → 220 taken 6 times.
✓ Branch 228 → 229 taken 540 times.
978 while (in_macro_def > 0)
887 {
888
4/8
✓ Branch 115 → 116 taken 6 times.
✗ Branch 115 → 143 not taken.
✓ Branch 117 → 118 taken 6 times.
✗ Branch 117 → 143 not taken.
✓ Branch 220 → 221 taken 6 times.
✗ Branch 220 → 258 not taken.
✓ Branch 223 → 224 taken 6 times.
✗ Branch 223 → 258 not taken.
12 throw_err_null(0, err_unclosed_macro, macro_defs[in_macro_def-1].data());
889
10/12
✓ Branch 118 → 119 taken 2 times.
✓ Branch 118 → 121 taken 4 times.
✓ Branch 119 → 120 taken 1 time.
✓ Branch 119 → 121 taken 1 time.
✓ Branch 120 → 121 taken 1 time.
✗ Branch 120 → 143 not taken.
✓ Branch 224 → 225 taken 2 times.
✓ Branch 224 → 227 taken 4 times.
✓ Branch 225 → 226 taken 1 time.
✓ Branch 225 → 227 taken 1 time.
✓ Branch 226 → 227 taken 1 time.
✗ Branch 226 → 258 not taken.
12 if (!pass && in_macro_def == 1) endmacro(false);
890 12 in_macro_def--;
891 12 macro_defs.remove(in_macro_def);
892 }
893
2/4
✗ Branch 123 → 124 not taken.
✓ Branch 123 → 125 taken 426 times.
✗ Branch 229 → 230 not taken.
✓ Branch 229 → 231 taken 540 times.
966 if (numif!=startif)
894 {
895 numif=startif;
896 numtrue=startif;
897 throw_err_null(0, err_unclosed_if);
898 }
899 966 incsrcdepth--;
900
4/4
✓ Branch 128 → 129 taken 426 times.
✓ Branch 128 → 131 taken 21 times.
✓ Branch 234 → 235 taken 540 times.
✓ Branch 234 → 236 taken 21 times.
11024 }
901
902 bool for_loop_expansion_warning = false;
903
904 // RPG Hacker: At some point, this should probably be merged
905 // into assembleline(), since the two names just cause
906 // confusion otherwise.
907 // return value is "did a loop end on this line"
908 44803 bool do_line_logic(const string& line, const char* filename, int lineno)
909 {
910 44803 int prevnumif = numif;
911 44803 int single_line_for_tracker = 1;
912 try
913 {
914 44803 for_loop_expansion_warning = false;
915 44803 string current_line;
916
15/15
✓ Branch 3 → 4 taken 1476 times.
✓ Branch 3 → 8 taken 20825 times.
✓ Branch 4 → 5 taken 1251 times.
✓ Branch 4 → 9 taken 225 times.
✓ Branch 5 → 6 taken 1476 times.
✓ Branch 5 → 11 taken 21026 times.
✓ Branch 6 → 7 taken 1251 times.
✓ Branch 6 → 12 taken 225 times.
✓ Branch 7 → 8 taken 84 times.
✓ Branch 7 → 9 taken 1167 times.
✓ Branch 10 → 11 taken 20993 times.
✓ Branch 10 → 12 taken 1167 times.
✓ Branch 10 → 35 taken 1392 times.
✓ Branch 13 → 14 taken 21110 times.
✓ Branch 13 → 44 taken 1392 times.
44803 if (numif==numtrue || (numtrue+1==numif && stribegin(line, "elseif ")))
917 {
918
2/5
✓ Branch 12 → 13 taken 20909 times.
✗ Branch 12 → 105 not taken.
✗ Branch 12 → 106 not taken.
✓ Branch 17 → 18 taken 21110 times.
✗ Branch 17 → 133 not taken.
42019 callstack_push cs_push(callstack_entry_type::LINE, line, lineno);
919
4/5
✓ Branch 13 → 14 taken 20864 times.
✗ Branch 13 → 103 not taken.
✓ Branch 13 → 104 taken 45 times.
✓ Branch 19 → 20 taken 21065 times.
✓ Branch 19 → 131 taken 45 times.
42019 string tmp=replace_macro_args(line);
920
2/5
✓ Branch 14 → 15 taken 20864 times.
✗ Branch 14 → 101 not taken.
✗ Branch 14 → 102 not taken.
✓ Branch 20 → 21 taken 21065 times.
✗ Branch 20 → 129 not taken.
41929 tmp.qnormalize();
921
4/12
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 20864 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 21 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 20864 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 29 taken 21065 times.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 29 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 21065 times.
41929 if(stribegin(tmp, "for !") && tmp[5] != '{') {
922 // we can't throw a warning here directly, since then it'll get
923 // thrown repeatedly in every iteration of the loop.
924 for_loop_expansion_warning = true;
925 }
926
4/5
✓ Branch 25 → 26 taken 20848 times.
✗ Branch 25 → 101 not taken.
✓ Branch 25 → 102 taken 16 times.
✓ Branch 33 → 34 taken 21049 times.
✓ Branch 33 → 129 taken 16 times.
41929 resolvedefines(current_line, tmp);
927
8/14
✓ Branch 27 → 28 taken 20848 times.
✗ Branch 27 → 101 not taken.
✗ Branch 27 → 102 not taken.
✓ Branch 28 → 29 taken 3 times.
✓ Branch 28 → 32 taken 20845 times.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 101 not taken.
✗ Branch 29 → 102 not taken.
✓ Branch 35 → 36 taken 21049 times.
✗ Branch 35 → 129 not taken.
✓ Branch 36 → 37 taken 3 times.
✓ Branch 36 → 40 taken 21046 times.
✓ Branch 37 → 38 taken 3 times.
✗ Branch 37 → 129 not taken.
41897 if (!confirmquotes(current_line)) throw_err_line(0, err_mismatched_quotes);
928 42057 }
929
2/5
✓ Branch 35 → 36 taken 1392 times.
✗ Branch 35 → 120 not taken.
✗ Branch 35 → 121 not taken.
✓ Branch 44 → 45 taken 1392 times.
✗ Branch 44 → 154 not taken.
2784 else current_line=line;
930
931
2/5
✓ Branch 37 → 38 taken 22237 times.
✗ Branch 37 → 120 not taken.
✗ Branch 37 → 121 not taken.
✓ Branch 47 → 48 taken 22438 times.
✗ Branch 47 → 154 not taken.
44675 callstack_push cs_push(callstack_entry_type::LINE, current_line, lineno);
932
933
12/12
✓ Branch 40 → 41 taken 276 times.
✓ Branch 40 → 43 taken 21961 times.
✓ Branch 41 → 42 taken 258 times.
✓ Branch 41 → 43 taken 18 times.
✓ Branch 44 → 45 taken 258 times.
✓ Branch 44 → 62 taken 21979 times.
✓ Branch 50 → 51 taken 276 times.
✓ Branch 50 → 53 taken 22162 times.
✓ Branch 51 → 52 taken 258 times.
✓ Branch 51 → 53 taken 18 times.
✓ Branch 54 → 55 taken 258 times.
✓ Branch 54 → 77 taken 22180 times.
44675 if (stribegin(current_line, "macro ") && numif==numtrue)
934 {
935 // RPG Hacker: Slight redundancy here with code that is
936 // also in startmacro(). Could improve this for Asar 2.0.
937
2/5
✓ Branch 46 → 47 taken 258 times.
✗ Branch 46 → 111 not taken.
✗ Branch 46 → 112 not taken.
✓ Branch 58 → 59 taken 258 times.
✗ Branch 58 → 142 not taken.
516 string macro_name = current_line.data()+6;
938 516 char * startpar=strqchr(macro_name.raw(), '(');
939
2/4
✓ Branch 49 → 50 taken 258 times.
✗ Branch 49 → 51 not taken.
✓ Branch 61 → 62 taken 258 times.
✗ Branch 61 → 64 not taken.
516 if (startpar) *startpar=0;
940
2/5
✓ Branch 51 → 52 taken 258 times.
✗ Branch 51 → 109 not taken.
✗ Branch 51 → 110 not taken.
✓ Branch 64 → 65 taken 258 times.
✗ Branch 64 → 140 not taken.
516 macro_defs.append(macro_name);
941
942 // RPG Hacker: I think it would make more logical sense
943 // to have this ++ after the if, but hat breaks compatibility
944 // with at least one test, and it generally leads to more
945 // errors being output after a broken macro declaration.
946 516 in_macro_def++;
947
4/4
✓ Branch 52 → 53 taken 86 times.
✓ Branch 52 → 60 taken 172 times.
✓ Branch 65 → 66 taken 86 times.
✓ Branch 65 → 75 taken 172 times.
516 if (!pass)
948 {
949
8/9
✓ Branch 53 → 54 taken 70 times.
✓ Branch 53 → 56 taken 16 times.
✓ Branch 55 → 60 taken 69 times.
✗ Branch 55 → 109 not taken.
✓ Branch 55 → 110 taken 1 time.
✓ Branch 66 → 67 taken 70 times.
✓ Branch 66 → 70 taken 16 times.
✓ Branch 69 → 75 taken 69 times.
✓ Branch 69 → 140 taken 1 time.
172 if (in_macro_def == 1) startmacro(current_line.data()+6);
950
4/10
✓ Branch 56 → 57 taken 16 times.
✗ Branch 56 → 108 not taken.
✗ Branch 56 → 109 not taken.
✓ Branch 57 → 58 taken 16 times.
✗ Branch 57 → 106 not taken.
✗ Branch 57 → 107 not taken.
✓ Branch 71 → 72 taken 16 times.
✗ Branch 71 → 138 not taken.
✓ Branch 72 → 73 taken 16 times.
✗ Branch 72 → 136 not taken.
32 else tomacro(current_line);
951 }
952 516 }
953
14/20
✓ Branch 63 → 64 taken 21979 times.
✗ Branch 63 → 66 not taken.
✗ Branch 63 → 119 not taken.
✓ Branch 64 → 65 taken 270 times.
✗ Branch 64 → 66 not taken.
✓ Branch 64 → 67 taken 21709 times.
✓ Branch 65 → 66 taken 252 times.
✓ Branch 65 → 67 taken 18 times.
✗ Branch 67 → 68 not taken.
✗ Branch 67 → 80 not taken.
✓ Branch 68 → 69 taken 252 times.
✓ Branch 68 → 81 taken 21727 times.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 22180 times.
✓ Branch 80 → 81 taken 270 times.
✓ Branch 80 → 83 taken 21910 times.
✓ Branch 81 → 82 taken 252 times.
✓ Branch 81 → 83 taken 18 times.
✓ Branch 84 → 85 taken 252 times.
✓ Branch 84 → 98 taken 21928 times.
44159 else if (!stricmp(current_line, "endmacro") && numif==numtrue)
954 {
955
2/11
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 72 not taken.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 73 taken 252 times.
✗ Branch 69 → 118 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 119 not taken.
✗ Branch 85 → 86 not taken.
✓ Branch 85 → 89 taken 252 times.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 152 not taken.
504 if (in_macro_def == 0) throw_err_line(0, err_misplaced_endmacro);
956 else
957 {
958 504 in_macro_def--;
959 504 macro_defs.remove(in_macro_def);
960
4/6
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 87 not taken.
✓ Branch 74 → 75 taken 84 times.
✓ Branch 74 → 88 taken 168 times.
✓ Branch 90 → 91 taken 84 times.
✓ Branch 90 → 106 taken 168 times.
504 if (!pass)
961 {
962
6/12
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 76 not taken.
✓ Branch 75 → 76 taken 69 times.
✓ Branch 75 → 77 taken 15 times.
✗ Branch 75 → 87 not taken.
✗ Branch 75 → 118 not taken.
✓ Branch 76 → 88 taken 69 times.
✗ Branch 76 → 119 not taken.
✓ Branch 91 → 92 taken 69 times.
✓ Branch 91 → 93 taken 15 times.
✓ Branch 92 → 106 taken 69 times.
✗ Branch 92 → 152 not taken.
168 if (in_macro_def == 0) endmacro(true);
963
4/11
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 114 not taken.
✓ Branch 77 → 78 taken 15 times.
✗ Branch 77 → 112 not taken.
✗ Branch 77 → 115 not taken.
✓ Branch 78 → 79 taken 15 times.
✗ Branch 78 → 113 not taken.
✓ Branch 94 → 95 taken 15 times.
✗ Branch 94 → 146 not taken.
✓ Branch 95 → 96 taken 15 times.
✗ Branch 95 → 144 not taken.
30 else tomacro(current_line);
964 }
965 }
966 }
967
4/6
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 86 not taken.
✓ Branch 81 → 82 taken 960 times.
✓ Branch 81 → 87 taken 20767 times.
✓ Branch 98 → 99 taken 960 times.
✓ Branch 98 → 105 taken 20968 times.
43655 else if (in_macro_def > 0)
968 {
969
8/16
✗ Branch 81 → 82 not taken.
✗ Branch 81 → 87 not taken.
✓ Branch 82 → 83 taken 320 times.
✓ Branch 82 → 88 taken 640 times.
✗ Branch 82 → 117 not taken.
✓ Branch 83 → 84 taken 320 times.
✗ Branch 83 → 115 not taken.
✗ Branch 83 → 118 not taken.
✓ Branch 84 → 85 taken 320 times.
✗ Branch 84 → 116 not taken.
✓ Branch 99 → 100 taken 320 times.
✓ Branch 99 → 106 taken 640 times.
✓ Branch 101 → 102 taken 320 times.
✗ Branch 101 → 150 not taken.
✓ Branch 102 → 103 taken 320 times.
✗ Branch 102 → 148 not taken.
1920 if (!pass) tomacro(current_line);
970 }
971 else
972 {
973
4/6
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 118 not taken.
✓ Branch 87 → 88 taken 15764 times.
✓ Branch 87 → 119 taken 5003 times.
✓ Branch 105 → 106 taken 15965 times.
✓ Branch 105 → 152 taken 5003 times.
41735 assembleline(filename, lineno, current_line, single_line_for_tracker);
974 }
975 54811 }
976
4/6
✗ Branch 123 → 124 not taken.
✗ Branch 123 → 125 not taken.
✓ Branch 124 → 125 taken 5004 times.
✓ Branch 124 → 126 taken 64 times.
✓ Branch 159 → 160 taken 5004 times.
✓ Branch 159 → 161 taken 64 times.
10136 catch (errline&) {}
977
4/6
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 97 not taken.
✓ Branch 92 → 93 taken 30 times.
✓ Branch 92 → 98 taken 15899 times.
✓ Branch 111 → 112 taken 30 times.
✓ Branch 111 → 125 taken 16100 times.
32059 return (numif < prevnumif || single_line_for_tracker == 3)
978
18/31
✗ Branch 90 → 91 not taken.
✗ Branch 90 → 92 not taken.
✓ Branch 91 → 92 taken 15929 times.
✓ Branch 91 → 93 taken 1368 times.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 127 not taken.
✓ Branch 93 → 94 taken 1398 times.
✗ Branch 93 → 96 not taken.
✗ Branch 93 → 128 not taken.
✓ Branch 94 → 95 taken 435 times.
✓ Branch 94 → 97 taken 963 times.
✗ Branch 94 → 127 not taken.
✓ Branch 95 → 96 taken 435 times.
✗ Branch 95 → 97 not taken.
✗ Branch 95 → 128 not taken.
✓ Branch 96 → 97 taken 174 times.
✓ Branch 96 → 98 taken 261 times.
✓ Branch 110 → 111 taken 16130 times.
✓ Branch 110 → 112 taken 1368 times.
✓ Branch 113 → 114 taken 1398 times.
✗ Branch 113 → 164 not taken.
✗ Branch 115 → 116 not taken.
✓ Branch 115 → 117 taken 1398 times.
✓ Branch 117 → 118 taken 435 times.
✓ Branch 117 → 124 taken 963 times.
✓ Branch 119 → 120 taken 435 times.
✗ Branch 119 → 164 not taken.
✗ Branch 121 → 122 not taken.
✓ Branch 121 → 123 taken 435 times.
✓ Branch 123 → 124 taken 174 times.
✓ Branch 123 → 125 taken 261 times.
101649 && (whilestatus[numif].iswhile || whilestatus[numif].is_for);
979 }
980
981
982 4 void parse_std_includes(const char* textfile, autoarray<string>& outarray)
983 {
984 4 char* content = readfilenative(textfile);
985
986
2/3
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 34 not taken.
✓ Branch 3 → 49 taken 3 times.
4 if (content != nullptr)
987 {
988 1 char* pos = content;
989
990
2/4
✗ Branch 32 → 5 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 47 → 5 taken 4 times.
✓ Branch 47 → 48 taken 1 time.
5 while (pos[0] != '\0')
991 {
992 4 string stdinclude;
993
994 do
995 {
996
3/8
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 9 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✓ Branch 8 → 9 taken 30 times.
✗ Branch 8 → 13 not taken.
✓ Branch 10 → 11 taken 27 times.
✓ Branch 10 → 13 taken 3 times.
30 if (pos[0] != '\r' && pos[0] != '\n')
997 {
998
1/4
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 42 not taken.
✓ Branch 12 → 13 taken 27 times.
✗ Branch 12 → 60 not taken.
27 stdinclude += pos[0];
999 }
1000 30 pos++;
1001
4/8
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 12 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
✓ Branch 15 → 16 taken 29 times.
✓ Branch 15 → 19 taken 1 time.
✓ Branch 17 → 18 taken 26 times.
✓ Branch 17 → 19 taken 3 times.
30 } while (pos[0] != '\0' && pos[0] != '\n');
1002
1003
1/4
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 42 not taken.
✓ Branch 19 → 20 taken 4 times.
✗ Branch 19 → 60 not taken.
4 strip_whitespace(stdinclude);
1004
1005
2/4
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 30 not taken.
✓ Branch 21 → 22 taken 3 times.
✓ Branch 21 → 44 taken 1 time.
4 if (stdinclude != "")
1006 {
1007
3/8
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 42 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 25 not taken.
✓ Branch 23 → 24 taken 3 times.
✗ Branch 23 → 60 not taken.
✓ Branch 24 → 25 taken 1 time.
✓ Branch 24 → 36 taken 2 times.
3 if (!path_is_absolute(stdinclude))
1008 {
1009
2/8
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 37 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 35 not taken.
✓ Branch 28 → 29 taken 1 time.
✗ Branch 28 → 52 not taken.
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 50 not taken.
1 stdinclude = dir(textfile) + stdinclude;
1010 }
1011
2/8
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 41 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 39 not taken.
✓ Branch 39 → 40 taken 3 times.
✗ Branch 39 → 58 not taken.
✓ Branch 41 → 42 taken 3 times.
✗ Branch 41 → 56 not taken.
3 outarray.append(normalize_path(stdinclude));
1012 }
1013 4 }
1014
1015 1 free(content);
1016 }
1017 4 }
1018
1019 293 void parse_std_defines(const char* textfile)
1020 {
1021
1022 // RPG Hacker: add built-in defines.
1023 // (They're not really standard defines, but I was lazy and this was
1024 // one convenient place for doing it).
1025 293 builtindefines.create("assembler") = "asar";
1026
4/9
✓ Branch 5 → 6 taken 131 times.
✗ Branch 5 → 122 not taken.
✓ Branch 6 → 7 taken 290 times.
✗ Branch 6 → 120 not taken.
✗ Branch 6 → 186 not taken.
✓ Branch 7 → 8 taken 162 times.
✗ Branch 7 → 186 not taken.
✓ Branch 9 → 10 taken 162 times.
✗ Branch 9 → 184 not taken.
293 builtindefines.create("assembler_ver") = dec(get_version_int());
1027
4/8
✓ Branch 10 → 11 taken 131 times.
✗ Branch 10 → 125 not taken.
✓ Branch 11 → 12 taken 131 times.
✗ Branch 11 → 123 not taken.
✓ Branch 16 → 17 taken 162 times.
✗ Branch 16 → 190 not taken.
✓ Branch 18 → 19 taken 162 times.
✗ Branch 18 → 188 not taken.
293 builtindefines.create("assembler_time") = dec(time(nullptr));
1028
1029
3/4
✓ Branch 14 → 15 taken 131 times.
✗ Branch 14 → 16 not taken.
✓ Branch 23 → 24 taken 158 times.
✓ Branch 23 → 25 taken 4 times.
293 if(textfile == nullptr) return;
1030
1031 4 char* content = readfilenative(textfile);
1032
1033
2/4
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 119 not taken.
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 183 taken 3 times.
4 if (content != nullptr)
1034 {
1035 1 char* pos = content;
1036
2/4
✗ Branch 117 → 19 not taken.
✗ Branch 117 → 118 not taken.
✓ Branch 181 → 28 taken 5 times.
✓ Branch 181 → 182 taken 1 time.
6 while (*pos != 0) {
1037 5 string define_name;
1038 5 string define_val;
1039
1040
4/8
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 29 not taken.
✗ Branch 28 → 22 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 43 → 44 taken 27 times.
✓ Branch 43 → 46 taken 2 times.
✓ Branch 45 → 33 taken 24 times.
✓ Branch 45 → 46 taken 3 times.
29 while (*pos != '=' && *pos != '\n') {
1041
1/4
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 37 taken 24 times.
24 if(*pos == '\r') { pos++; continue; }
1042
1/4
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 129 not taken.
✓ Branch 38 → 39 taken 24 times.
✗ Branch 38 → 196 not taken.
24 define_name += *pos;
1043 24 pos++;
1044 }
1045
4/12
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 33 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 33 not taken.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
✓ Branch 47 → 48 taken 5 times.
✗ Branch 47 → 54 not taken.
✓ Branch 49 → 50 taken 5 times.
✗ Branch 49 → 54 not taken.
✓ Branch 51 → 52 taken 2 times.
✓ Branch 51 → 54 taken 3 times.
5 if (*pos != 0 && *pos != '\r' && *pos != '\n') pos++; // skip =
1046
3/8
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 41 not taken.
✗ Branch 40 → 34 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 65 → 66 taken 18 times.
✗ Branch 65 → 68 not taken.
✓ Branch 67 → 55 taken 13 times.
✓ Branch 67 → 68 taken 5 times.
18 while (*pos != 0 && *pos != '\n') {
1047
1/4
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 36 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 59 taken 13 times.
13 if(*pos == '\r') { pos++; continue; }
1048
1/4
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 129 not taken.
✓ Branch 60 → 61 taken 13 times.
✗ Branch 60 → 196 not taken.
13 define_val += *pos;
1049 13 pos++;
1050 }
1051
1/4
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 43 not taken.
✓ Branch 69 → 70 taken 5 times.
✗ Branch 69 → 72 not taken.
5 if (*pos != 0)
1052 5 pos++; // skip \n
1053 // clean define_name
1054
1/4
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 129 not taken.
✓ Branch 72 → 73 taken 5 times.
✗ Branch 72 → 196 not taken.
5 strip_whitespace(define_name);
1055
1/4
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 129 not taken.
✓ Branch 73 → 74 taken 5 times.
✗ Branch 73 → 196 not taken.
5 define_name.strip_prefix('!'); // remove leading ! if present
1056
1057
2/4
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 51 not taken.
✓ Branch 75 → 76 taken 1 time.
✓ Branch 75 → 80 taken 4 times.
5 if (define_name == "")
1058 {
1059
1/4
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 50 not taken.
✓ Branch 77 → 78 taken 1 time.
✗ Branch 77 → 79 not taken.
1 if (define_val == "")
1060 {
1061 1 continue;
1062 }
1063
1064 throw_err_null(pass, err_stddefines_no_identifier);
1065 }
1066
1067
2/10
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 56 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 129 not taken.
✓ Branch 81 → 82 taken 4 times.
✗ Branch 81 → 196 not taken.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 85 taken 4 times.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 196 not taken.
4 if (!validatedefinename(define_name)) throw_err_null(pass, err_cmdl_define_invalid, "stddefines.txt", define_name.data());
1068
1069 // clean define_val
1070 4 const char* defval = define_val.data();
1071 4 string cleaned_defval;
1072
1073
2/4
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 68 not taken.
✓ Branch 89 → 90 taken 2 times.
✓ Branch 89 → 100 taken 2 times.
4 if (*defval == 0) {
1074 // no value
1075
2/12
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 127 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 64 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 127 not taken.
✓ Branch 91 → 92 taken 2 times.
✗ Branch 91 → 194 not taken.
✗ Branch 92 → 93 not taken.
✓ Branch 92 → 95 taken 2 times.
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 194 not taken.
2 if (clidefines.exists(define_name)) throw_err_null(pass, err_cmdl_define_override, "Std define", define_name.data());
1076
2/8
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 127 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 127 not taken.
✓ Branch 96 → 97 taken 2 times.
✗ Branch 96 → 194 not taken.
✓ Branch 98 → 99 taken 2 times.
✗ Branch 98 → 194 not taken.
2 clidefines.create(define_name) = "";
1077 2 continue;
1078 }
1079
1080
3/8
✗ Branch 70 → 69 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 71 → 69 not taken.
✗ Branch 71 → 72 not taken.
✓ Branch 104 → 101 taken 2 times.
✓ Branch 104 → 105 taken 2 times.
✗ Branch 106 → 101 not taken.
✓ Branch 106 → 107 taken 2 times.
4 while (*defval == ' ' || *defval == '\t') defval++; // skip whitespace in beginning
1081
2/4
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 95 not taken.
✓ Branch 108 → 109 taken 1 time.
✓ Branch 108 → 144 taken 1 time.
2 if (*defval == '"') {
1082 1 defval++; // skip opening quote
1083
3/8
✗ Branch 75 → 76 not taken.
✗ Branch 75 → 77 not taken.
✗ Branch 76 → 74 not taken.
✗ Branch 76 → 77 not taken.
✓ Branch 115 → 116 taken 5 times.
✓ Branch 115 → 118 taken 1 time.
✓ Branch 117 → 111 taken 5 times.
✗ Branch 117 → 118 not taken.
6 while (*defval != '"' && *defval != 0)
1084
1/4
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 127 not taken.
✓ Branch 113 → 114 taken 5 times.
✗ Branch 113 → 194 not taken.
5 cleaned_defval += *defval++;
1085
1086
1/4
✗ Branch 77 → 78 not taken.
✗ Branch 77 → 79 not taken.
✗ Branch 119 → 120 not taken.
✓ Branch 119 → 121 taken 1 time.
1 if (*defval == 0) {
1087 throw_err_null(pass, err_mismatched_quotes);
1088 }
1089 1 defval++; // skip closing quote
1090
2/8
✗ Branch 81 → 80 not taken.
✗ Branch 81 → 82 not taken.
✗ Branch 82 → 80 not taken.
✗ Branch 82 → 83 not taken.
✗ Branch 126 → 123 not taken.
✓ Branch 126 → 127 taken 1 time.
✗ Branch 128 → 123 not taken.
✓ Branch 128 → 129 taken 1 time.
1 while (*defval == ' ' || *defval == '\t') defval++; // skip whitespace
1091
1/8
✗ Branch 83 → 84 not taken.
✗ Branch 83 → 86 not taken.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 86 not taken.
✗ Branch 130 → 131 not taken.
✓ Branch 130 → 134 taken 1 time.
✗ Branch 132 → 133 not taken.
✗ Branch 132 → 134 not taken.
1 if (*defval != 0 && *defval != '\n')
1092 throw_err_null(pass, err_stddefine_after_closing_quote);
1093
1094
2/12
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 127 not taken.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 91 not taken.
✗ Branch 90 → 91 not taken.
✗ Branch 90 → 127 not taken.
✓ Branch 135 → 136 taken 1 time.
✗ Branch 135 → 194 not taken.
✗ Branch 136 → 137 not taken.
✓ Branch 136 → 139 taken 1 time.
✗ Branch 138 → 139 not taken.
✗ Branch 138 → 194 not taken.
1 if (clidefines.exists(define_name)) throw_err_null(pass, err_cmdl_define_override, "Std define", define_name.data());
1095
2/8
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 127 not taken.
✗ Branch 93 → 94 not taken.
✗ Branch 93 → 127 not taken.
✓ Branch 140 → 141 taken 1 time.
✗ Branch 140 → 194 not taken.
✓ Branch 142 → 143 taken 1 time.
✗ Branch 142 → 194 not taken.
1 clidefines.create(define_name) = cleaned_defval;
1096 1 continue;
1097 }
1098 else
1099 {
1100 // slightly hacky way to remove trailing whitespace
1101
1/2
✗ Branch 144 → 145 not taken.
✓ Branch 144 → 146 taken 1 time.
1 const char* defval_end = strchr(defval, '\n'); // slightly hacky way to get end of string or newline
1102
2/6
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 97 not taken.
✓ Branch 146 → 147 taken 1 time.
✗ Branch 146 → 150 not taken.
✗ Branch 147 → 148 not taken.
✓ Branch 147 → 149 taken 1 time.
1 if (!defval_end) defval_end = strchr(defval, 0);
1103 1 defval_end--;
1104
3/8
✗ Branch 99 → 98 not taken.
✗ Branch 99 → 100 not taken.
✗ Branch 100 → 98 not taken.
✗ Branch 100 → 101 not taken.
✓ Branch 155 → 152 taken 3 times.
✓ Branch 155 → 156 taken 1 time.
✗ Branch 157 → 152 not taken.
✓ Branch 157 → 158 taken 1 time.
4 while (*defval_end == ' ' || *defval_end == '\t') defval_end--;
1105
1/4
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 126 not taken.
✓ Branch 159 → 160 taken 1 time.
✗ Branch 159 → 192 not taken.
1 cleaned_defval = string(defval, (int)(defval_end - defval + 1));
1106
1107
2/12
✗ Branch 105 → 106 not taken.
✗ Branch 105 → 127 not taken.
✗ Branch 106 → 107 not taken.
✗ Branch 106 → 109 not taken.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 127 not taken.
✓ Branch 165 → 166 taken 1 time.
✗ Branch 165 → 194 not taken.
✗ Branch 166 → 167 not taken.
✓ Branch 166 → 169 taken 1 time.
✗ Branch 168 → 169 not taken.
✗ Branch 168 → 194 not taken.
1 if (clidefines.exists(define_name)) throw_err_null(pass, err_cmdl_define_override, "Std define", define_name.data());
1108
2/8
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 127 not taken.
✗ Branch 111 → 112 not taken.
✗ Branch 111 → 127 not taken.
✓ Branch 170 → 171 taken 1 time.
✗ Branch 170 → 194 not taken.
✓ Branch 172 → 173 taken 1 time.
✗ Branch 172 → 194 not taken.
1 clidefines.create(define_name) = cleaned_defval;
1109 1 continue;
1110 1 }
1111
1112 5 }
1113 1 free(content);
1114 }
1115 }
1116
1117 bool checksum_fix_enabled = true;
1118 bool force_checksum_fix = false;
1119
1120 #define cfree(x) free((void*)x)
1121 138 static void clearmacro(const string & key, macrodata* & macro)
1122 {
1123 (void)key;
1124 138 freemacro(macro);
1125 138 }
1126
1127 334 static void clearfile(const string & key, sourcefile& filecontent)
1128 {
1129 (void)key;
1130 334 cfree(filecontent.data);
1131 334 }
1132 #undef cfree
1133
1134 882 static void adddefine(const string & key, string & value)
1135 {
1136
2/4
✓ Branch 4 → 5 taken 393 times.
✗ Branch 4 → 8 not taken.
✓ Branch 5 → 6 taken 489 times.
✗ Branch 5 → 12 not taken.
882 if (!defines.exists(key)) defines.create(key) = value;
1137 882 }
1138
1139 1 string create_symbols_file(string format, uint32_t romCrc){
1140 1 string symbolfile;
1141
1142 1 std::vector<std::pair<unsigned int, const char*>> all_labels;
1143
1/5
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 70 not taken.
✗ Branch 4 → 75 not taken.
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 141 not taken.
1 labels.each([&all_labels](const string& key, snes_label& label) {
1144
2/8
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 6 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 17 not taken.
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 17 not taken.
2 all_labels.push_back(std::make_pair(label.pos, key.data()));
1145 2 });
1146
1/5
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 70 not taken.
✗ Branch 7 → 75 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 141 not taken.
1 std::sort(all_labels.begin(), all_labels.end(),
1147 1 [](auto& l, auto& r) {
1148
1/4
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 4 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 14 taken 1 time.
1 if (l.first == r.first)
1149 return strcmp(l.second, r.second) < 0;
1150 1 return l.first < r.first;
1151 });
1152
1153
1/5
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 70 not taken.
✗ Branch 9 → 75 not taken.
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 141 not taken.
1 format = lower(format);
1154
1/5
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 45 not taken.
✗ Branch 11 → 49 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 94 not taken.
1 if(format == "wla")
1155 {
1156
1/5
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 70 not taken.
✗ Branch 12 → 75 not taken.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 141 not taken.
1 symbolfile = "; wla symbolic information file\n";
1157
1/5
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 70 not taken.
✗ Branch 13 → 75 not taken.
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 141 not taken.
1 symbolfile += "; generated by asar\n";
1158
1159
1/5
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 70 not taken.
✗ Branch 14 → 75 not taken.
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 141 not taken.
1 symbolfile += "\n[labels]\n";
1160
2/6
✗ Branch 23 → 17 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 24 → 17 not taken.
✗ Branch 24 → 25 not taken.
✓ Branch 39 → 24 taken 2 times.
✓ Branch 39 → 40 taken 1 time.
3 for (auto& p : all_labels) {
1161 2 char buffer[10];
1162
1/4
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 68 not taken.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 2 times.
2 std::snprintf(buffer, sizeof(buffer), "%02X:%04X ", (p.first >> 16) & 0xFF, p.first & 0xFFFF);
1163
1164
1/6
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 63 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 68 not taken.
✓ Branch 31 → 32 taken 2 times.
✗ Branch 31 → 125 not taken.
2 symbolfile += buffer;
1165
1/6
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 63 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 68 not taken.
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 125 not taken.
2 symbolfile += p.second;
1166
1/6
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 63 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 68 not taken.
✓ Branch 35 → 36 taken 2 times.
✗ Branch 35 → 125 not taken.
2 symbolfile += "\n";
1167 }
1168
1169
1/6
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 70 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 75 not taken.
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 141 not taken.
1 symbolfile += "\n[source files]\n";
1170 1 const autoarray<AddressToLineMapping::FileInfo>& addrToLineFileList = addressToLineMapping.getFileList();
1171
2/6
✗ Branch 32 → 27 not taken.
✗ Branch 32 → 33 not taken.
✗ Branch 34 → 28 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 61 → 45 taken 1 time.
✓ Branch 61 → 62 taken 1 time.
2 for (int i = 0; i < addrToLineFileList.count; ++i)
1172 {
1173 1 char addrToFileListStr[256];
1174 1 snprintf(addrToFileListStr, 256, "%.4x %.8x %s\n",
1175 i,
1176
2/10
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 65 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 70 not taken.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 70 not taken.
✓ Branch 52 → 53 taken 1 time.
✗ Branch 52 → 130 not taken.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 57 taken 1 time.
1 addrToLineFileList[i].fileCrc,
1177
1/6
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 65 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 70 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 130 not taken.
1 addrToLineFileList[i].filename.data()
1178 );
1179
1/6
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 65 not taken.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 70 not taken.
✓ Branch 57 → 58 taken 1 time.
✗ Branch 57 → 130 not taken.
1 symbolfile += addrToFileListStr;
1180 }
1181
1182
1/6
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 70 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 75 not taken.
✓ Branch 62 → 63 taken 1 time.
✗ Branch 62 → 141 not taken.
1 symbolfile += "\n[rom checksum]\n";
1183 {
1184 1 char romCrcStr[32];
1185
1/4
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 71 not taken.
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 66 taken 1 time.
1 snprintf(romCrcStr, 32, "%.8x\n",
1186 romCrc
1187 );
1188
1/6
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 66 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 71 not taken.
✓ Branch 66 → 67 taken 1 time.
✗ Branch 66 → 132 not taken.
1 symbolfile += romCrcStr;
1189 }
1190
1191
1/6
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 70 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 75 not taken.
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 141 not taken.
1 symbolfile += "\n[addr-to-line mapping]\n";
1192 1 const autoarray<AddressToLineMapping::AddrToLineInfo>& addrToLineInfo = addressToLineMapping.getAddrToLineInfo();
1193
2/6
✗ Branch 44 → 38 not taken.
✗ Branch 44 → 60 not taken.
✗ Branch 48 → 41 not taken.
✗ Branch 48 → 65 not taken.
✓ Branch 93 → 71 taken 3 times.
✓ Branch 93 → 122 taken 1 time.
4 for (int i = 0; i < addrToLineInfo.count; ++i)
1194 {
1195 3 char addrToLineStr[32];
1196 snprintf(addrToLineStr, 32, "%.2x:%.4x %.4x:%.8x\n",
1197
2/6
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 72 not taken.
✓ Branch 84 → 85 taken 3 times.
✗ Branch 84 → 134 not taken.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 3 times.
3 (addrToLineInfo[i].addr & 0xFF0000) >> 16,
1198
1/6
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 67 not taken.
✗ Branch 44 → 45 not taken.
✗ Branch 44 → 72 not taken.
✓ Branch 80 → 81 taken 3 times.
✗ Branch 80 → 134 not taken.
3 addrToLineInfo[i].addr & 0xFFFF,
1199
1/6
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 67 not taken.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 72 not taken.
✓ Branch 77 → 78 taken 3 times.
✗ Branch 77 → 134 not taken.
3 addrToLineInfo[i].fileIdx & 0xFFFF,
1200
1/10
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 67 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 67 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 72 not taken.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 72 not taken.
✓ Branch 73 → 74 taken 3 times.
✗ Branch 73 → 134 not taken.
3 addrToLineInfo[i].line & 0xFFFFFFFF
1201 );
1202
1/6
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 67 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 72 not taken.
✓ Branch 89 → 90 taken 3 times.
✗ Branch 89 → 134 not taken.
3 symbolfile += addrToLineStr;
1203 }
1204
1205 }
1206 else if (format == "nocash")
1207 {
1208 symbolfile = ";no$sns symbolic information file\n";
1209 symbolfile += ";generated by asar\n";
1210 symbolfile += "\n";
1211 for (auto& p : all_labels) {
1212 char buffer[10];
1213 std::snprintf(buffer, sizeof(buffer), "%08X ", p.first & 0xFFFFFF);
1214
1215 symbolfile += buffer;
1216 symbolfile += p.second;
1217 symbolfile += "\n";
1218 }
1219 }
1220 1 return symbolfile;
1221 1 }
1222
1223
1224 2 bool in_top_level_file()
1225 {
1226 2 int num_files = 0;
1227
4/4
✓ Branch 9 → 4 taken 3 times.
✓ Branch 9 → 10 taken 1 time.
✓ Branch 10 → 4 taken 3 times.
✓ Branch 10 → 11 taken 1 time.
8 for (int i = (int)callstack.size()-1; i >= 0; --i)
1228 {
1229
4/4
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 8 taken 2 times.
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 9 taken 2 times.
6 if (callstack[i].type == callstack_entry_type::FILE)
1230 {
1231 2 num_files++;
1232
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 1 time.
2 if (num_files > 1) break;
1233 }
1234 }
1235 2 return (num_files <= 1);
1236 }
1237
1238 17114 const char* get_current_file_name()
1239 {
1240
4/4
✓ Branch 9 → 4 taken 24192 times.
✓ Branch 9 → 10 taken 385 times.
✓ Branch 12 → 4 taken 24354 times.
✓ Branch 12 → 13 taken 479 times.
49410 for (int i = (int)callstack.size()-1; i >= 0; --i)
1241 {
1242
4/4
✓ Branch 5 → 6 taken 8098 times.
✓ Branch 5 → 8 taken 16094 times.
✓ Branch 6 → 7 taken 8152 times.
✓ Branch 6 → 11 taken 16202 times.
48546 if (callstack[i].type == callstack_entry_type::FILE)
1243 16250 return callstack[i].content;
1244 }
1245 864 return nullptr;
1246 }
1247
1248 5946 int get_current_line()
1249 {
1250
4/4
✓ Branch 9 → 4 taken 5809 times.
✓ Branch 9 → 10 taken 5 times.
✓ Branch 12 → 4 taken 5875 times.
✓ Branch 12 → 13 taken 6 times.
11695 for (int i = (int)callstack.size()-1; i >= 0; --i)
1251 {
1252
4/4
✓ Branch 5 → 6 taken 2951 times.
✓ Branch 5 → 8 taken 2858 times.
✓ Branch 6 → 7 taken 2984 times.
✓ Branch 6 → 11 taken 2891 times.
11684 if (callstack[i].type == callstack_entry_type::LINE) return callstack[i].lineno;
1253 }
1254 11 return -1;
1255 }
1256
1257 272 const char* get_current_block()
1258 {
1259
4/4
✓ Branch 14 → 4 taken 132 times.
✓ Branch 14 → 15 taken 5 times.
✓ Branch 18 → 4 taken 135 times.
✓ Branch 18 → 19 taken 6 times.
278 for (int i = (int)callstack.size()-1; i >= 0; --i)
1260 {
1261
12/12
✓ Branch 5 → 6 taken 106 times.
✓ Branch 5 → 8 taken 26 times.
✓ Branch 6 → 7 taken 109 times.
✓ Branch 6 → 10 taken 26 times.
✓ Branch 7 → 8 taken 103 times.
✓ Branch 7 → 9 taken 3 times.
✓ Branch 9 → 10 taken 106 times.
✓ Branch 9 → 11 taken 3 times.
✓ Branch 10 → 11 taken 129 times.
✓ Branch 10 → 13 taken 3 times.
✓ Branch 12 → 13 taken 132 times.
✓ Branch 12 → 17 taken 3 times.
267 if (callstack[i].type == callstack_entry_type::LINE || callstack[i].type == callstack_entry_type::BLOCK) return callstack[i].content;
1262 }
1263 11 return nullptr;
1264 }
1265
1266
1267 296 void reseteverything()
1268 {
1269 296 string str;
1270 296 labels.reset();
1271 296 defines.reset();
1272
2/4
✓ Branch 5 → 6 taken 132 times.
✗ Branch 5 → 17 not taken.
✓ Branch 7 → 8 taken 164 times.
✗ Branch 7 → 24 not taken.
296 builtindefines.each(adddefine);
1273
2/4
✓ Branch 6 → 7 taken 132 times.
✗ Branch 6 → 17 not taken.
✓ Branch 8 → 9 taken 164 times.
✗ Branch 8 → 24 not taken.
296 clidefines.each(adddefine);
1274 296 structs.reset();
1275
1276
2/4
✓ Branch 8 → 9 taken 132 times.
✗ Branch 8 → 17 not taken.
✓ Branch 12 → 13 taken 164 times.
✗ Branch 12 → 24 not taken.
296 macros.each(clearmacro);
1277 296 macros.reset();
1278
1279
2/4
✓ Branch 10 → 11 taken 132 times.
✗ Branch 10 → 17 not taken.
✓ Branch 15 → 16 taken 164 times.
✗ Branch 15 → 24 not taken.
296 filecontents.each(clearfile);
1280 296 filecontents.reset();
1281
1282 296 writtenblocks.reset();
1283
1284 296 optimizeforbank=-1;
1285 296 optimize_dp = optimize_dp_flag::ALWAYS;
1286 296 dp_base = 0;
1287 296 optimize_address = optimize_address_flag::MIRRORS;
1288
1289
2/4
✓ Branch 13 → 14 taken 132 times.
✗ Branch 13 → 17 not taken.
✓ Branch 19 → 20 taken 164 times.
✗ Branch 19 → 24 not taken.
296 closecachedfiles();
1290
1291 296 incsrcdepth=0;
1292 296 label_counter = 0;
1293 296 errored = false;
1294 296 checksum_fix_enabled = true;
1295 296 force_checksum_fix = false;
1296
1297 296 in_macro_def = 0;
1298
1299 296 callstack.clear();
1300 296 simple_callstacks = true;
1301 460 }
1302