asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
1724 of 1913, 0 excluded
90.1%
Functions:
130 of 135, 0 excluded
96.3%
Branches:
3371 of 6743, 0 excluded
50.0%

assembleblock.cpp
Line Branch Exec Source
1 #include "addr2line.h"
2 #include "asar.h"
3 #include "assembleblock.h"
4 #include "asar_math.h"
5 #include "macro.h"
6 #include "table.h"
7 #include "unicode.h"
8 #include "frozen/string.h"
9 #include "frozen/unordered_map.h"
10
11 #include "interface-shared.h"
12 #include "arch-shared.h"
13
14 int arch=arch_65816;
15
16 bool snespos_valid = false;
17 int snespos;
18 int realsnespos;
19 int startpos;
20 int realstartpos;
21
22 static bool mapper_set = false;
23 int label_counter = 0;
24
25 static int old_snespos;
26 static int old_startpos;
27 static int old_optimizeforbank;
28 static bool old_snespos_valid;
29 static int struct_base;
30 static string struct_name;
31 static string struct_parent;
32 static bool in_struct = false;
33 static bool in_sub_struct = false;
34 static bool static_struct = false;
35 static bool in_spcblock = false;
36
37 assocarr<snes_struct> structs;
38
39 static bool movinglabelspossible = false;
40
41 static bool disable_bank_cross_errors = false;
42 static bool check_half_banks_crossed = false;
43
44 int bytes;
45 static int freespaceuse=0;
46
47 static enum {
48 ratsmeta_ban,
49 ratsmeta_allow,
50 ratsmeta_used,
51 } ratsmetastate=ratsmeta_ban;
52
53 enum spcblock_type{
54 spcblock_nspc,
55 spcblock_custom
56 };
57
58 static struct spcblock_data{
59 unsigned int destination;
60 spcblock_type type;
61 string macro_name;
62
63 unsigned int size_address;
64 mapper_t old_mapper;
65 }spcblock;
66
67 438123 static inline void verifysnespos()
68 {
69
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 219156 times.
✓ Branch 2 → 6 taken 218967 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 219156 times.
438123 if (!snespos_valid)
70 {
71 throw_err_block(0, err_missing_org);
72 snespos=0x008000;
73 realsnespos=0x008000;
74 startpos=0x008000;
75 realstartpos=0x008000;
76 snespos_valid = true;
77 }
78 438123 }
79
80 552 static int fixsnespos(int inaddr, int step)
81 {
82 // randomdude999: turns out it wasn't very reliable at all.
83 /* // RPG Hacker: No idea how reliable this is.
84 // Might not work with some of the more exotic mappers.
85 return pctosnes(snestopc(inaddr) + step); */
86
5/5
✓ Branch 2 → 3 taken 48 times.
✓ Branch 2 → 4 taken 276 times.
✓ Branch 2 → 6 taken 228 times.
✓ Branch 4 → 5 taken 48 times.
✓ Branch 4 → 8 taken 228 times.
552 if (mapper == lorom) {
87
4/4
✓ Branch 3 → 4 taken 6 times.
✓ Branch 3 → 5 taken 42 times.
✓ Branch 5 → 6 taken 6 times.
✓ Branch 5 → 7 taken 42 times.
96 if ((inaddr&0xFFFF)+step > 0xFFFF) {
88 // bank crossed
89 12 return inaddr+step+0x8000;
90 }
91 84 return inaddr+step;
92
3/6
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 12 taken 228 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 228 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 16 taken 228 times.
456 } else if (mapper == hirom) {
93 if ((inaddr&0x400000) == 0 && freespaceid == 0) {
94 // we shouldn't get here in pass 2 inside a freespace anyways i think
95 // system pages, need to account for low pages and stuff
96 if ((inaddr&0xFFFF)+step > 0xFFFF) {
97 return inaddr+step+0x8000;
98 }
99 }
100 return inaddr+step;
101
3/6
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 15 taken 228 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 228 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 21 taken 228 times.
456 } else if (mapper == exlorom) {
102 // exlorom has no mirroring so this should work fine
103 return pctosnes(snestopc(inaddr)+step);
104
3/6
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 20 taken 228 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 228 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 28 taken 228 times.
456 } else if (mapper == exhirom) {
105 // apparently exhirom is pretty similar to hirom after all
106 if ((inaddr&0x400000) == 0) {
107 // system pages, need to account for low pages and stuff
108 if ((inaddr&0xFFFF)+step > 0xFFFF) {
109 return inaddr+step+0x8000;
110 }
111 }
112 return inaddr+step;
113
3/6
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 26 taken 228 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 228 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 36 taken 228 times.
456 } else if (mapper == sa1rom) {
114 if((inaddr&0x400000) == 0) {
115 // lorom area
116 if ((inaddr&0xFFFF)+step > 0xFFFF) {
117 return inaddr+step+0x8000;
118 }
119 return inaddr+step;
120 } else {
121 // hirom area
122 return inaddr+step;
123 }
124
3/6
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 31 taken 228 times.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 228 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 43 taken 228 times.
456 } else if (mapper == sfxrom) {
125 if ((inaddr&0x400000) == 0) {
126 // lorom area
127 if ((inaddr&0xFFFF)+step > 0xFFFF) {
128 return inaddr+step+0x8000;
129 }
130 } else {
131 // hirom area
132 return inaddr+step;
133 }
134
3/6
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 34 taken 228 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 228 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 48 taken 228 times.
456 } else if (mapper == bigsa1rom) {
135 // no mirrors here, so this should work
136 return pctosnes(snestopc(inaddr)+step);
137
3/6
✓ Branch 34 → 35 taken 228 times.
✗ Branch 34 → 36 not taken.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 50 taken 228 times.
✓ Branch 50 → 51 taken 228 times.
✗ Branch 50 → 52 not taken.
456 } else if (mapper == norom) {
138 456 return inaddr+step;
139 }
140 return -1;
141 }
142
143 437628 static inline void step(int num)
144 {
145
5/5
✓ Branch 2 → 3 taken 138 times.
✓ Branch 2 → 4 taken 218898 times.
✓ Branch 2 → 6 taken 218592 times.
✓ Branch 4 → 5 taken 138 times.
✓ Branch 4 → 8 taken 218760 times.
437628 if (disable_bank_cross_errors)
146 {
147 276 snespos = fixsnespos(snespos, num);
148 276 realsnespos = fixsnespos(realsnespos, num);
149
150 // RPG Hacker: Not adjusting startpos here will eventually throw
151 // an error in checkbankcross() if we set warn bankcross on again.
152 // As far as I can tell, those are pretty much just used for
153 // checking bank crossing, anyways, so it's hopefully save to just
154 // adjust them here.
155 276 startpos = snespos;
156 276 realstartpos = realsnespos;
157 }
158 else
159 {
160 437352 snespos += num;
161 437352 realsnespos += num;
162 }
163 437628 bytes+=num;
164 437628 }
165
166 437010 void write1(unsigned int num)
167 {
168 437010 verifysnespos();
169
3/3
✓ Branch 3 → 4 taken 145638 times.
✓ Branch 3 → 16 taken 145630 times.
✓ Branch 3 → 18 taken 145742 times.
437010 if (pass==2)
170 {
171 145638 int pcpos=snestopc(realsnespos&0xFFFFFF);
172
2/3
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 72791 times.
✓ Branch 5 → 13 taken 72847 times.
145638 if (pcpos<0)
173 {
174 movinglabelspossible=true;
175 throw_err_block(2, err_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
176 }
177 145638 writeromdata_byte(pcpos, (unsigned char)num, freespaceid != 0);
178
4/4
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 16 taken 72790 times.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 18 taken 72846 times.
145638 if (pcpos>=romlen) {
179
2/4
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 1 time.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 1 time.
2 if(pcpos - romlen > 0) writeromdata_bytes(romlen, freespacebyte, pcpos - romlen, false);
180 2 romlen=pcpos+1;
181 }
182 }
183
8/8
✓ Branch 16 → 17 taken 72814 times.
✓ Branch 16 → 30 taken 145607 times.
✓ Branch 17 → 18 taken 4563 times.
✓ Branch 17 → 30 taken 68251 times.
✓ Branch 18 → 19 taken 72870 times.
✓ Branch 18 → 34 taken 145719 times.
✓ Branch 19 → 20 taken 4619 times.
✓ Branch 19 → 34 taken 68251 times.
437010 if(pass == 1 && freespaceid == 0) {
184 9182 int pcpos = snestopc(realsnespos & 0xFFFFFF);
185
2/4
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 25 taken 4563 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 29 taken 4619 times.
9182 if(pcpos < 0)
186 {
187 movinglabelspossible=true;
188 throw_err_block(2, err_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
189 }
190 9182 addromwrite(pcpos, 1);
191
4/4
✓ Branch 26 → 27 taken 4354 times.
✓ Branch 26 → 30 taken 209 times.
✓ Branch 30 → 31 taken 4407 times.
✓ Branch 30 → 34 taken 212 times.
9182 if (pcpos>=romlen) {
192
4/4
✓ Branch 27 → 28 taken 41 times.
✓ Branch 27 → 29 taken 4313 times.
✓ Branch 31 → 32 taken 48 times.
✓ Branch 31 → 33 taken 4359 times.
8761 if(pcpos - romlen > 0) writeromdata_bytes(romlen, freespacebyte, pcpos - romlen, false);
193 8761 romlen=pcpos+1;
194 }
195 }
196 437010 step(1);
197 437010 ratsmetastate=ratsmeta_ban;
198 437010 }
199
200 32045 static bool asblock_pick(const string& firstword, const char* par)
201 {
202
8/8
✓ Branch 2 → 3 taken 29699 times.
✓ Branch 2 → 4 taken 1173 times.
✓ Branch 2 → 6 taken 1173 times.
✓ Branch 3 → 4 taken 15 times.
✓ Branch 3 → 5 taken 14971 times.
✓ Branch 3 → 16 taken 14713 times.
✓ Branch 5 → 6 taken 15 times.
✓ Branch 5 → 24 taken 14956 times.
32045 if (arch==arch_spc700 || in_spcblock) {
203 // TODO
204
2/4
✓ Branch 4 → 5 taken 1188 times.
✗ Branch 4 → 38 not taken.
✓ Branch 7 → 8 taken 1188 times.
✗ Branch 7 → 52 not taken.
2376 string dup(firstword);
205
2/4
✓ Branch 5 → 6 taken 1188 times.
✗ Branch 5 → 36 not taken.
✓ Branch 9 → 10 taken 1188 times.
✗ Branch 9 → 50 not taken.
2376 string duppar(par);
206 2376 char* words[] = { dup.raw(), duppar.raw() };
207
6/8
✓ Branch 8 → 9 taken 1128 times.
✓ Branch 8 → 10 taken 60 times.
✓ Branch 11 → 12 taken 1188 times.
✗ Branch 11 → 34 not taken.
✓ Branch 14 → 15 taken 1128 times.
✓ Branch 14 → 16 taken 60 times.
✓ Branch 17 → 18 taken 1188 times.
✗ Branch 17 → 48 not taken.
2376 return asblock_spc700(words, *par ? 2 : 1);
208 2376 }
209
4/4
✓ Branch 16 → 17 taken 12886 times.
✓ Branch 16 → 19 taken 1827 times.
✓ Branch 24 → 25 taken 13129 times.
✓ Branch 24 → 27 taken 1827 times.
29669 if (arch==arch_65816) {
210 26015 return asblock_65816(firstword, par);
211 }
212
2/4
✓ Branch 19 → 20 taken 1827 times.
✗ Branch 19 → 32 not taken.
✓ Branch 27 → 28 taken 1827 times.
✗ Branch 27 → 46 not taken.
3654 if (arch==arch_superfx) {
213
2/4
✓ Branch 20 → 21 taken 1827 times.
✗ Branch 20 → 43 not taken.
✓ Branch 29 → 30 taken 1827 times.
✗ Branch 29 → 60 not taken.
3654 string dup(firstword);
214
2/4
✓ Branch 21 → 22 taken 1827 times.
✗ Branch 21 → 41 not taken.
✓ Branch 31 → 32 taken 1827 times.
✗ Branch 31 → 58 not taken.
3654 string duppar(par);
215 3654 char* words[] = { dup.raw(), duppar.raw() };
216
6/8
✓ Branch 24 → 25 taken 1722 times.
✓ Branch 24 → 26 taken 105 times.
✓ Branch 27 → 28 taken 1827 times.
✗ Branch 27 → 39 not taken.
✓ Branch 36 → 37 taken 1722 times.
✓ Branch 36 → 38 taken 105 times.
✓ Branch 39 → 40 taken 1827 times.
✗ Branch 39 → 56 not taken.
3654 return asblock_superfx(words, *par ? 2 : 1);
217 3654 }
218 return true;
219 }
220
221 11527 const char * safedequote(char * str)
222 {
223 11527 const char * tmp=dequote(str);
224
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 11527 times.
11527 if (!tmp) throw_err_block(0, err_garbage_near_quoted_string);
225 11527 return tmp;
226 }
227
228 1877 void write2(unsigned int num)
229 {
230 1877 write1(num);
231 1877 write1(num/256);
232 1877 }
233
234 1236 void write3(unsigned int num)
235 {
236 1236 write1(num);
237 1236 write1(num/256);
238 1236 write1(num/65536);
239 1236 }
240
241 114 void write4(unsigned int num)
242 {
243 114 write1(num);
244 114 write1(num/256);
245 114 write1(num/65536);
246 114 write1(num/16777216);
247 114 }
248
249 //these are NOT used by the math parser - see asar_math.cpp for that
250 22 static int read2(int insnespos)
251 {
252 22 int addr=snestopc(insnespos);
253
2/4
✓ Branch 3 → 4 taken 22 times.
✗ Branch 3 → 5 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 22 times.
22 if (addr<0 || addr+2>romlen_r) return -1;
254 return
255 22 romdata_r[addr ] |
256
1/2
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 11 times.
33 (romdata_r[addr+1]<< 8);
257 }
258
259 54 static int read3(int insnespos)
260 {
261 54 int addr=snestopc(insnespos);
262
2/4
✓ Branch 3 → 4 taken 54 times.
✗ Branch 3 → 5 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 54 times.
54 if (addr<0 || addr+3>romlen_r) return -1;
263 return
264 54 romdata_r[addr ] |
265 81 (romdata_r[addr+1]<< 8)|
266
2/4
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 27 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 27 times.
81 (romdata_r[addr+2]<<16);
267 }
268
269 1452 int getlenfromchar(char c)
270 {
271 1452 c=(char)to_lower(c);
272
2/2
✓ Branch 3 → 4 taken 660 times.
✓ Branch 3 → 5 taken 792 times.
1452 if (c=='b') return 1;
273
2/2
✓ Branch 5 → 6 taken 690 times.
✓ Branch 5 → 7 taken 102 times.
792 if (c=='w') return 2;
274
2/2
✓ Branch 7 → 8 taken 96 times.
✓ Branch 7 → 9 taken 6 times.
102 if (c=='l') return 3;
275 6 throw_err_block(0, err_invalid_opcode_length);
276 }
277
278 assocarr<snes_label> labels;
279 static autoarray<int> poslabels;
280 static autoarray<int> neglabels;
281
282 autoarray<int>* macroposlabels;
283 autoarray<int>* macroneglabels;
284
285 autoarray<string> sublabels;
286 autoarray<string>* macrosublabels;
287
288 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
289 string ns;
290 static string ns_backup;
291 autoarray<string> namespace_list;
292
293 autoarray<string> includeonce;
294
295 autoarray<freespace_data> freespaces;
296
297 // id of the next unused freespace.
298 static int freespaceidnext;
299 // id of the current freespace, or 0 if not in freespace.
300 int freespaceid;
301 // start address of the current freespace, used for computing the length of the
302 // current freespace.
303 static int freespacestart;
304 static freespace_data default_freespace_settings;
305
306 1222 bool confirmname(const char * name)
307 {
308
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 608 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 614 times.
1222 if (!name[0]) return false;
309
2/4
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 608 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 614 times.
1222 if (is_digit(name[0])) return false;
310
4/4
✓ Branch 12 → 8 taken 6030 times.
✓ Branch 12 → 13 taken 608 times.
✓ Branch 18 → 10 taken 6048 times.
✓ Branch 18 → 19 taken 614 times.
13300 for (int i=0;name[i];i++)
311 {
312
2/4
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 6030 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 6048 times.
12078 if (!is_ualnum(name[i])) return false;
313 }
314 1222 return true;
315 }
316
317 53378 string posneglabelname(const char ** input, bool define)
318 {
319 53378 const char* label = *input;
320
321 53378 string output;
322
323 53378 int depth = 0;
324 53378 bool ismacro = false;
325
326
4/4
✓ Branch 3 → 4 taken 28 times.
✓ Branch 3 → 5 taken 26457 times.
✓ Branch 5 → 6 taken 28 times.
✓ Branch 5 → 8 taken 26865 times.
53378 if (label[0] == '?')
327 {
328 56 ismacro = true;
329 56 label++;
330 }
331
8/8
✓ Branch 5 → 6 taken 26459 times.
✓ Branch 5 → 7 taken 26 times.
✓ Branch 6 → 7 taken 66 times.
✓ Branch 6 → 114 taken 26393 times.
✓ Branch 9 → 10 taken 26861 times.
✓ Branch 9 → 12 taken 32 times.
✓ Branch 11 → 12 taken 72 times.
✓ Branch 11 → 215 taken 26789 times.
53378 if (label[0] == '-' || label[0] == '+')
332 {
333 196 char first = label[0];
334
8/8
✓ Branch 9 → 10 taken 121 times.
✓ Branch 9 → 11 taken 63 times.
✓ Branch 10 → 8 taken 92 times.
✓ Branch 10 → 11 taken 29 times.
✓ Branch 17 → 18 taken 133 times.
✓ Branch 17 → 20 taken 75 times.
✓ Branch 19 → 14 taken 104 times.
✓ Branch 19 → 20 taken 29 times.
392 for (depth = 0; label[0] && label[0] == first; depth++) label++;
335
336
4/4
✓ Branch 11 → 12 taken 83 times.
✓ Branch 11 → 52 taken 9 times.
✓ Branch 20 → 21 taken 95 times.
✓ Branch 20 → 98 taken 9 times.
196 if (!ismacro)
337 {
338
4/4
✓ Branch 12 → 13 taken 62 times.
✓ Branch 12 → 32 taken 21 times.
✓ Branch 21 → 22 taken 68 times.
✓ Branch 21 → 60 taken 27 times.
178 if (first == '+')
339 {
340 130 *input = label;
341
14/28
✓ Branch 13 → 14 taken 62 times.
✗ Branch 13 → 130 not taken.
✓ Branch 14 → 15 taken 62 times.
✗ Branch 14 → 130 not taken.
✓ Branch 16 → 17 taken 62 times.
✗ Branch 16 → 125 not taken.
✓ Branch 18 → 19 taken 62 times.
✗ Branch 18 → 122 not taken.
✓ Branch 19 → 20 taken 62 times.
✗ Branch 19 → 120 not taken.
✓ Branch 20 → 21 taken 62 times.
✗ Branch 20 → 118 not taken.
✓ Branch 21 → 22 taken 62 times.
✗ Branch 21 → 116 not taken.
✓ Branch 25 → 26 taken 68 times.
✗ Branch 25 → 235 not taken.
✓ Branch 27 → 28 taken 68 times.
✗ Branch 27 → 235 not taken.
✓ Branch 33 → 34 taken 68 times.
✗ Branch 33 → 227 not taken.
✓ Branch 37 → 38 taken 68 times.
✗ Branch 37 → 223 not taken.
✓ Branch 38 → 39 taken 68 times.
✗ Branch 38 → 221 not taken.
✓ Branch 39 → 40 taken 68 times.
✗ Branch 39 → 219 not taken.
✓ Branch 40 → 41 taken 68 times.
✗ Branch 40 → 217 not taken.
130 output = STR":pos_" + dec(depth) + "_" + dec(poslabels[depth]);
342
6/8
✓ Branch 29 → 30 taken 51 times.
✓ Branch 29 → 114 taken 11 times.
✓ Branch 30 → 31 taken 51 times.
✗ Branch 30 → 198 not taken.
✓ Branch 55 → 56 taken 54 times.
✓ Branch 55 → 215 taken 14 times.
✓ Branch 56 → 57 taken 54 times.
✗ Branch 56 → 329 not taken.
130 if (define) poslabels[depth]++;
343 }
344 else
345 {
346 48 *input = label;
347
6/8
✓ Branch 32 → 33 taken 3 times.
✓ Branch 32 → 35 taken 18 times.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 198 not taken.
✓ Branch 61 → 62 taken 6 times.
✓ Branch 61 → 66 taken 21 times.
✓ Branch 62 → 63 taken 6 times.
✗ Branch 62 → 329 not taken.
48 if (define) neglabels[depth]++;
348
14/28
✓ Branch 35 → 36 taken 21 times.
✗ Branch 35 → 146 not taken.
✓ Branch 36 → 37 taken 21 times.
✗ Branch 36 → 146 not taken.
✓ Branch 38 → 39 taken 21 times.
✗ Branch 38 → 141 not taken.
✓ Branch 40 → 41 taken 21 times.
✗ Branch 40 → 138 not taken.
✓ Branch 41 → 42 taken 21 times.
✗ Branch 41 → 136 not taken.
✓ Branch 42 → 43 taken 21 times.
✗ Branch 42 → 134 not taken.
✓ Branch 43 → 44 taken 21 times.
✗ Branch 43 → 132 not taken.
✓ Branch 68 → 69 taken 27 times.
✗ Branch 68 → 257 not taken.
✓ Branch 70 → 71 taken 27 times.
✗ Branch 70 → 257 not taken.
✓ Branch 76 → 77 taken 27 times.
✗ Branch 76 → 249 not taken.
✓ Branch 80 → 81 taken 27 times.
✗ Branch 80 → 245 not taken.
✓ Branch 81 → 82 taken 27 times.
✗ Branch 81 → 243 not taken.
✓ Branch 82 → 83 taken 27 times.
✗ Branch 82 → 241 not taken.
✓ Branch 83 → 84 taken 27 times.
✗ Branch 83 → 239 not taken.
48 output = STR":neg_" + dec(depth) + "_" + dec(neglabels[depth]);
349 }
350 }
351 else
352 {
353
8/12
✓ Branch 52 → 53 taken 8 times.
✓ Branch 52 → 55 taken 1 time.
✓ Branch 53 → 54 taken 8 times.
✗ Branch 53 → 55 not taken.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 60 taken 8 times.
✓ Branch 98 → 99 taken 8 times.
✓ Branch 98 → 101 taken 1 time.
✓ Branch 99 → 100 taken 8 times.
✗ Branch 99 → 101 not taken.
✗ Branch 100 → 101 not taken.
✓ Branch 100 → 106 taken 8 times.
18 if (macrorecursion == 0 || macroposlabels == nullptr || macroneglabels == nullptr)
354 {
355
4/8
✓ Branch 55 → 56 taken 1 time.
✗ Branch 55 → 59 not taken.
✓ Branch 56 → 57 taken 1 time.
✗ Branch 56 → 198 not taken.
✓ Branch 101 → 102 taken 1 time.
✗ Branch 101 → 105 not taken.
✓ Branch 102 → 103 taken 1 time.
✗ Branch 102 → 329 not taken.
2 if (!macrorecursion) throw_err_block(2, err_macro_label_outside_of_macro);
356 }
357 else
358 {
359
4/4
✓ Branch 60 → 61 taken 4 times.
✓ Branch 60 → 87 taken 4 times.
✓ Branch 106 → 107 taken 4 times.
✓ Branch 106 → 161 taken 4 times.
16 if (first == '+')
360 {
361 8 *input = label;
362
20/40
✓ Branch 61 → 62 taken 4 times.
✗ Branch 61 → 171 not taken.
✓ Branch 62 → 63 taken 4 times.
✗ Branch 62 → 171 not taken.
✓ Branch 64 → 65 taken 4 times.
✗ Branch 64 → 166 not taken.
✓ Branch 66 → 67 taken 4 times.
✗ Branch 66 → 161 not taken.
✓ Branch 68 → 69 taken 4 times.
✗ Branch 68 → 158 not taken.
✓ Branch 69 → 70 taken 4 times.
✗ Branch 69 → 156 not taken.
✓ Branch 70 → 71 taken 4 times.
✗ Branch 70 → 154 not taken.
✓ Branch 71 → 72 taken 4 times.
✗ Branch 71 → 152 not taken.
✓ Branch 72 → 73 taken 4 times.
✗ Branch 72 → 150 not taken.
✓ Branch 73 → 74 taken 4 times.
✗ Branch 73 → 148 not taken.
✓ Branch 111 → 112 taken 4 times.
✗ Branch 111 → 291 not taken.
✓ Branch 113 → 114 taken 4 times.
✗ Branch 113 → 291 not taken.
✓ Branch 119 → 120 taken 4 times.
✗ Branch 119 → 283 not taken.
✓ Branch 125 → 126 taken 4 times.
✗ Branch 125 → 275 not taken.
✓ Branch 129 → 130 taken 4 times.
✗ Branch 129 → 271 not taken.
✓ Branch 130 → 131 taken 4 times.
✗ Branch 130 → 269 not taken.
✓ Branch 131 → 132 taken 4 times.
✗ Branch 131 → 267 not taken.
✓ Branch 132 → 133 taken 4 times.
✗ Branch 132 → 265 not taken.
✓ Branch 133 → 134 taken 4 times.
✗ Branch 133 → 263 not taken.
✓ Branch 134 → 135 taken 4 times.
✗ Branch 134 → 261 not taken.
8 output = STR":macro_" + dec(calledmacros) + "_pos_" + dec(depth) + "_" + dec((*macroposlabels)[depth]);
363
6/8
✓ Branch 84 → 85 taken 3 times.
✓ Branch 84 → 114 taken 1 time.
✓ Branch 85 → 86 taken 3 times.
✗ Branch 85 → 198 not taken.
✓ Branch 155 → 156 taken 3 times.
✓ Branch 155 → 215 taken 1 time.
✓ Branch 157 → 158 taken 3 times.
✗ Branch 157 → 329 not taken.
8 if (define) (*macroposlabels)[depth]++;
364 }
365 else
366 {
367 8 *input = label;
368
6/8
✓ Branch 87 → 88 taken 3 times.
✓ Branch 87 → 90 taken 1 time.
✓ Branch 88 → 89 taken 3 times.
✗ Branch 88 → 198 not taken.
✓ Branch 162 → 163 taken 3 times.
✓ Branch 162 → 168 taken 1 time.
✓ Branch 164 → 165 taken 3 times.
✗ Branch 164 → 329 not taken.
8 if (define) (*macroneglabels)[depth]++;
369
20/40
✓ Branch 90 → 91 taken 4 times.
✗ Branch 90 → 196 not taken.
✓ Branch 91 → 92 taken 4 times.
✗ Branch 91 → 196 not taken.
✓ Branch 93 → 94 taken 4 times.
✗ Branch 93 → 191 not taken.
✓ Branch 95 → 96 taken 4 times.
✗ Branch 95 → 186 not taken.
✓ Branch 97 → 98 taken 4 times.
✗ Branch 97 → 183 not taken.
✓ Branch 98 → 99 taken 4 times.
✗ Branch 98 → 181 not taken.
✓ Branch 99 → 100 taken 4 times.
✗ Branch 99 → 179 not taken.
✓ Branch 100 → 101 taken 4 times.
✗ Branch 100 → 177 not taken.
✓ Branch 101 → 102 taken 4 times.
✗ Branch 101 → 175 not taken.
✓ Branch 102 → 103 taken 4 times.
✗ Branch 102 → 173 not taken.
✓ Branch 171 → 172 taken 4 times.
✗ Branch 171 → 325 not taken.
✓ Branch 173 → 174 taken 4 times.
✗ Branch 173 → 325 not taken.
✓ Branch 179 → 180 taken 4 times.
✗ Branch 179 → 317 not taken.
✓ Branch 185 → 186 taken 4 times.
✗ Branch 185 → 309 not taken.
✓ Branch 189 → 190 taken 4 times.
✗ Branch 189 → 305 not taken.
✓ Branch 190 → 191 taken 4 times.
✗ Branch 190 → 303 not taken.
✓ Branch 191 → 192 taken 4 times.
✗ Branch 191 → 301 not taken.
✓ Branch 192 → 193 taken 4 times.
✗ Branch 192 → 299 not taken.
✓ Branch 193 → 194 taken 4 times.
✗ Branch 193 → 297 not taken.
✓ Branch 194 → 195 taken 4 times.
✗ Branch 194 → 295 not taken.
8 output = STR":macro_" + dec(calledmacros) + "_neg_" + dec(depth) + "_" + dec((*macroneglabels)[depth]);
370 }
371 }
372 }
373 }
374
375 53376 return output;
376 2 }
377
378 2425 string labelname(const char ** rawname, bool define, bool is_addlabel)
379 {
380 #define deref_rawname (*rawname)
381 2425 autoarray<string>* sublabellist = &sublabels;
382
383 2425 bool ismacro = (deref_rawname[0] == '?');
384 2425 bool issublabel = false;
385
386
4/4
✓ Branch 2 → 3 taken 12 times.
✓ Branch 2 → 4 taken 1191 times.
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 9 taken 1210 times.
2425 if (ismacro)
387 {
388 24 deref_rawname++;
389 24 sublabellist = macrosublabels;
390 }
391
392 2425 string name;
393 2425 int i=-1;
394
395
2/8
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 1203 times.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 119 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 1222 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 198 not taken.
2425 if (is_digit(*deref_rawname)) throw_err_block(2, err_invalid_label_name);
396
2/4
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 1203 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 24 taken 1222 times.
2425 if (*deref_rawname ==':')
397 {
398 deref_rawname++;
399 name=":";
400 }
401
10/12
✓ Branch 12 → 13 taken 1086 times.
✓ Branch 12 → 40 taken 117 times.
✓ Branch 13 → 14 taken 1074 times.
✓ Branch 13 → 40 taken 12 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 1222 times.
✓ Branch 26 → 27 taken 1105 times.
✓ Branch 26 → 72 taken 117 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 1105 times.
✓ Branch 29 → 30 taken 1093 times.
✓ Branch 29 → 72 taken 12 times.
2425 else if (!in_struct && !in_sub_struct)
402 {
403
4/4
✓ Branch 16 → 15 taken 47 times.
✓ Branch 16 → 17 taken 1074 times.
✓ Branch 37 → 31 taken 53 times.
✓ Branch 37 → 38 taken 1093 times.
2267 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
404
2/8
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 1074 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 119 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 1093 times.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 198 not taken.
2167 if (!is_ualnum(*deref_rawname)) throw_err_block(2, err_invalid_label_name);
405
4/4
✓ Branch 22 → 23 taken 44 times.
✓ Branch 22 → 40 taken 1030 times.
✓ Branch 45 → 46 taken 50 times.
✓ Branch 45 → 72 taken 1043 times.
2167 if (i)
406 {
407
8/20
✓ Branch 23 → 24 taken 44 times.
✗ Branch 23 → 27 not taken.
✓ Branch 24 → 25 taken 44 times.
✗ Branch 24 → 119 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 44 times.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 33 taken 44 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 119 not taken.
✓ Branch 46 → 47 taken 50 times.
✗ Branch 46 → 52 not taken.
✓ Branch 48 → 49 taken 50 times.
✗ Branch 48 → 198 not taken.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 50 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 58 taken 50 times.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 198 not taken.
94 if (!sublabellist || !(*sublabellist)[i - 1]) throw_err_block(2, err_label_missing_parent);
408
8/16
✓ Branch 33 → 34 taken 44 times.
✗ Branch 33 → 101 not taken.
✓ Branch 34 → 35 taken 44 times.
✗ Branch 34 → 101 not taken.
✓ Branch 35 → 36 taken 44 times.
✗ Branch 35 → 99 not taken.
✓ Branch 36 → 37 taken 44 times.
✗ Branch 36 → 97 not taken.
✓ Branch 61 → 62 taken 50 times.
✗ Branch 61 → 172 not taken.
✓ Branch 63 → 64 taken 50 times.
✗ Branch 63 → 172 not taken.
✓ Branch 64 → 65 taken 50 times.
✗ Branch 64 → 170 not taken.
✓ Branch 66 → 67 taken 50 times.
✗ Branch 66 → 168 not taken.
94 name+=STR(*sublabellist)[i-1]+"_";
409 94 issublabel = true;
410 }
411 }
412
413
8/8
✓ Branch 40 → 41 taken 12 times.
✓ Branch 40 → 61 taken 1191 times.
✓ Branch 41 → 42 taken 8 times.
✓ Branch 41 → 61 taken 4 times.
✓ Branch 72 → 73 taken 12 times.
✓ Branch 72 → 104 taken 1210 times.
✓ Branch 73 → 74 taken 8 times.
✓ Branch 73 → 104 taken 4 times.
2425 if (ismacro && !issublabel)
414 {
415 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
416 // their parents' names.
417
8/12
✓ Branch 42 → 43 taken 5 times.
✓ Branch 42 → 44 taken 3 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 47 taken 5 times.
✓ Branch 44 → 45 taken 3 times.
✗ Branch 44 → 119 not taken.
✓ Branch 74 → 75 taken 5 times.
✓ Branch 74 → 76 taken 3 times.
✗ Branch 75 → 76 not taken.
✓ Branch 75 → 79 taken 5 times.
✓ Branch 76 → 77 taken 3 times.
✗ Branch 76 → 198 not taken.
16 if (!macrorecursion || macrosublabels == nullptr) throw_err_block(2, err_macro_label_outside_of_macro);
418
10/20
✓ Branch 48 → 49 taken 5 times.
✗ Branch 48 → 112 not taken.
✓ Branch 50 → 51 taken 5 times.
✗ Branch 50 → 109 not taken.
✓ Branch 51 → 52 taken 5 times.
✗ Branch 51 → 107 not taken.
✓ Branch 52 → 53 taken 5 times.
✗ Branch 52 → 105 not taken.
✓ Branch 53 → 54 taken 5 times.
✗ Branch 53 → 103 not taken.
✓ Branch 84 → 85 taken 5 times.
✗ Branch 84 → 186 not taken.
✓ Branch 88 → 89 taken 5 times.
✗ Branch 88 → 182 not taken.
✓ Branch 89 → 90 taken 5 times.
✗ Branch 89 → 180 not taken.
✓ Branch 90 → 91 taken 5 times.
✗ Branch 90 → 178 not taken.
✓ Branch 91 → 92 taken 5 times.
✗ Branch 91 → 176 not taken.
10 name = STR":macro_" + dec(calledmacros) + "_" + name;
419 }
420
421
422
10/12
✓ Branch 61 → 62 taken 1083 times.
✓ Branch 61 → 63 taken 117 times.
✓ Branch 62 → 63 taken 12 times.
✓ Branch 62 → 76 taken 1071 times.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 106 taken 1219 times.
✓ Branch 106 → 107 taken 1102 times.
✓ Branch 106 → 110 taken 117 times.
✗ Branch 107 → 108 not taken.
✓ Branch 107 → 109 taken 1102 times.
✓ Branch 109 → 110 taken 12 times.
✓ Branch 109 → 134 taken 1090 times.
2419 if (in_struct || in_sub_struct)
423 {
424
10/12
✓ Branch 63 → 64 taken 120 times.
✓ Branch 63 → 68 taken 9 times.
✓ Branch 64 → 65 taken 6 times.
✓ Branch 64 → 68 taken 114 times.
✓ Branch 65 → 66 taken 6 times.
✗ Branch 65 → 119 not taken.
✓ Branch 110 → 111 taken 120 times.
✓ Branch 110 → 117 taken 9 times.
✓ Branch 113 → 114 taken 6 times.
✓ Branch 113 → 117 taken 114 times.
✓ Branch 114 → 115 taken 6 times.
✗ Branch 114 → 198 not taken.
258 if(is_addlabel && *deref_rawname != '.') throw_err_block(2, err_invalid_label_name); //probably should be a better error. TODO!!!
425
4/4
✓ Branch 68 → 69 taken 120 times.
✓ Branch 68 → 76 taken 3 times.
✓ Branch 119 → 120 taken 120 times.
✓ Branch 119 → 134 taken 3 times.
246 if(*deref_rawname == '.') {
426 240 deref_rawname++;
427
5/6
✓ Branch 69 → 70 taken 12 times.
✓ Branch 69 → 74 taken 108 times.
✗ Branch 123 → 124 not taken.
✓ Branch 123 → 125 taken 120 times.
✓ Branch 125 → 126 taken 12 times.
✓ Branch 125 → 132 taken 108 times.
240 if(in_sub_struct)
428 {
429
4/8
✓ Branch 70 → 71 taken 12 times.
✗ Branch 70 → 118 not taken.
✓ Branch 71 → 72 taken 12 times.
✗ Branch 71 → 116 not taken.
✓ Branch 127 → 128 taken 12 times.
✗ Branch 127 → 196 not taken.
✓ Branch 129 → 130 taken 12 times.
✗ Branch 129 → 194 not taken.
24 name += struct_parent + ".";
430 }
431
2/4
✓ Branch 74 → 75 taken 120 times.
✗ Branch 74 → 119 not taken.
✓ Branch 132 → 133 taken 120 times.
✗ Branch 132 → 198 not taken.
240 name += struct_name;
432
2/4
✓ Branch 75 → 76 taken 120 times.
✗ Branch 75 → 119 not taken.
✓ Branch 133 → 134 taken 120 times.
✗ Branch 133 → 198 not taken.
240 name += '.';
433 }
434 }
435
436
2/8
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 81 taken 1194 times.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 119 not taken.
✗ Branch 137 → 138 not taken.
✓ Branch 137 → 141 taken 1213 times.
✗ Branch 138 → 139 not taken.
✗ Branch 138 → 198 not taken.
2407 if (!is_ualnum(*deref_rawname)) throw_err_block(2, err_invalid_label_name);
437
438
12/12
✓ Branch 85 → 86 taken 1290 times.
✓ Branch 85 → 87 taken 8084 times.
✓ Branch 86 → 87 taken 96 times.
✓ Branch 86 → 88 taken 1194 times.
✓ Branch 89 → 82 taken 8180 times.
✓ Branch 89 → 90 taken 1194 times.
✓ Branch 151 → 152 taken 1309 times.
✓ Branch 151 → 155 taken 8159 times.
✓ Branch 154 → 155 taken 96 times.
✓ Branch 154 → 156 taken 1213 times.
✓ Branch 157 → 142 taken 8255 times.
✓ Branch 157 → 158 taken 1213 times.
18842 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
439 {
440
2/4
✓ Branch 82 → 83 taken 8180 times.
✗ Branch 82 → 119 not taken.
✓ Branch 146 → 147 taken 8255 times.
✗ Branch 146 → 198 not taken.
16435 name+=*(deref_rawname++);
441 }
442
443
8/8
✓ Branch 90 → 91 taken 486 times.
✓ Branch 90 → 95 taken 708 times.
✓ Branch 91 → 92 taken 372 times.
✓ Branch 91 → 95 taken 114 times.
✓ Branch 158 → 159 taken 501 times.
✓ Branch 158 → 166 taken 712 times.
✓ Branch 159 → 160 taken 387 times.
✓ Branch 159 → 166 taken 114 times.
2407 if (define && i>=0)
444 {
445 759 (*sublabellist).reset(i);
446
4/8
✓ Branch 93 → 94 taken 372 times.
✗ Branch 93 → 119 not taken.
✓ Branch 94 → 95 taken 372 times.
✗ Branch 94 → 119 not taken.
✓ Branch 163 → 164 taken 387 times.
✗ Branch 163 → 198 not taken.
✓ Branch 165 → 166 taken 387 times.
✗ Branch 165 → 198 not taken.
759 (*sublabellist)[i]=name;
447 }
448 2407 return name;
449 #undef deref_rawname
450 18 }
451
452 196 static inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
453 {
454
2/4
✓ Branch 2 → 3 taken 97 times.
✗ Branch 2 → 47 not taken.
✓ Branch 3 → 4 taken 99 times.
✗ Branch 3 → 68 not taken.
196 string name=labelname(rawname, define);
455
12/37
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 11 taken 97 times.
✓ Branch 5 → 6 taken 2 times.
✓ Branch 5 → 14 taken 97 times.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 38 not taken.
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 38 not taken.
✗ Branch 8 → 56 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✓ Branch 11 → 12 taken 2 times.
✗ Branch 11 → 56 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 99 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 21 taken 97 times.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 15 → 17 taken 97 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 44 not taken.
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 19 taken 97 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 42 not taken.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 31 taken 99 times.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 64 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 62 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 61 not taken.
196 if (ns && labels.exists(ns+name)) {*rval = labels.find(ns+name);}
456
8/12
✓ Branch 22 → 23 taken 97 times.
✗ Branch 22 → 45 not taken.
✓ Branch 23 → 24 taken 86 times.
✓ Branch 23 → 27 taken 11 times.
✓ Branch 25 → 26 taken 86 times.
✗ Branch 25 → 45 not taken.
✓ Branch 32 → 33 taken 99 times.
✗ Branch 32 → 66 not taken.
✓ Branch 33 → 34 taken 87 times.
✓ Branch 33 → 40 taken 12 times.
✓ Branch 35 → 36 taken 87 times.
✗ Branch 35 → 66 not taken.
196 else if (labels.exists(name)) {*rval = labels.find(name);}
457 else
458 {
459
5/8
✓ Branch 27 → 28 taken 11 times.
✗ Branch 27 → 33 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 33 taken 11 times.
✓ Branch 40 → 41 taken 12 times.
✗ Branch 40 → 46 not taken.
✓ Branch 41 → 42 taken 1 time.
✓ Branch 41 → 46 taken 11 times.
23 if (shouldthrow && pass)
460 {
461
1/4
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 45 not taken.
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 66 not taken.
1 throw_err_block(2, err_label_not_found, name.data());
462 }
463 22 rval->pos = (unsigned int)-1;
464 22 rval->freespace_id = 0;
465 22 rval->is_static = false;
466 22 return false;
467 }
468 173 return true;
469 196 }
470
471 170 snes_label labelval(const char ** rawname, bool define)
472 {
473 170 snes_label rval;
474
2/4
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 85 times.
✓ Branch 4 → 7 taken 1 time.
170 labelvalcore(rawname, &rval, define, true);
475 169 return rval;
476 }
477
478 26 snes_label labelval(string name, bool define)
479 {
480 26 const char * rawname=name;
481 26 snes_label rval;
482
2/5
✓ Branch 4 → 5 taken 13 times.
✗ Branch 4 → 7 not taken.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 13 times.
✗ Branch 6 → 10 not taken.
26 labelvalcore(&rawname, &rval, define, true);
483 52 return rval;
484 }
485
486 bool labelval(const char ** rawname, snes_label * rval, bool define)
487 {
488 return labelvalcore(rawname, rval, define, false);
489 }
490
491 bool labelval(string name, snes_label * rval, bool define)
492 {
493 const char * str=name;
494 return labelvalcore(&str, rval, define, false);
495 }
496
497 1366 static void setlabel(string name, int loc=-1, bool is_static=false)
498 {
499 1366 int lbl_fs_id = 0;
500
2/2
✓ Branch 2 → 3 taken 1107 times.
✓ Branch 2 → 6 taken 259 times.
1366 if (loc==-1)
501 {
502
1/3
✓ Branch 3 → 4 taken 1107 times.
✗ Branch 3 → 51 not taken.
✗ Branch 3 → 59 not taken.
1107 verifysnespos();
503 1107 loc = snespos;
504 // if base is not active:
505
2/2
✓ Branch 4 → 5 taken 855 times.
✓ Branch 4 → 6 taken 252 times.
1107 if(snespos == realsnespos) lbl_fs_id = freespaceid;
506 // if base is active, always treat the label as freespace 0, i.e. not freespace.
507 }
508
509 1366 snes_label label_data;
510 1366 label_data.pos = (unsigned int)loc;
511 1366 label_data.is_static = is_static;
512 1366 label_data.freespace_id = lbl_fs_id;
513
514 unsigned int labelpos;
515
4/4
✓ Branch 7 → 8 taken 223 times.
✓ Branch 7 → 18 taken 448 times.
✓ Branch 8 → 9 taken 231 times.
✓ Branch 8 → 20 taken 464 times.
1366 if (pass==0)
516 {
517
5/7
✓ Branch 9 → 10 taken 223 times.
✗ Branch 9 → 51 not taken.
✓ Branch 10 → 11 taken 232 times.
✓ Branch 10 → 15 taken 222 times.
✗ Branch 10 → 59 not taken.
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 16 taken 230 times.
454 if (labels.exists(name))
518 {
519 2 movinglabelspossible=true;
520
2/4
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 51 not taken.
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 59 not taken.
2 throw_err_block(0, err_label_redefined, name.data());
521 }
522
2/4
✓ Branch 16 → 17 taken 222 times.
✗ Branch 16 → 51 not taken.
✓ Branch 17 → 18 taken 230 times.
✗ Branch 17 → 59 not taken.
452 labels.create(name) = label_data;
523 }
524
4/4
✓ Branch 18 → 19 taken 224 times.
✓ Branch 18 → 22 taken 224 times.
✓ Branch 20 → 21 taken 232 times.
✓ Branch 20 → 25 taken 232 times.
912 else if (pass==1)
525 {
526
2/4
✓ Branch 20 → 21 taken 224 times.
✗ Branch 20 → 51 not taken.
✓ Branch 22 → 23 taken 232 times.
✗ Branch 22 → 59 not taken.
456 labels.create(name) = label_data;
527 }
528
2/4
✓ Branch 22 → 23 taken 224 times.
✗ Branch 22 → 48 not taken.
✓ Branch 25 → 26 taken 232 times.
✗ Branch 25 → 56 not taken.
456 else if (pass==2)
529 {
530 //all label locations are known at this point, add a sanity check
531
4/12
✓ Branch 24 → 25 taken 224 times.
✗ Branch 24 → 51 not taken.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 224 times.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 51 not taken.
✓ Branch 27 → 28 taken 232 times.
✗ Branch 27 → 59 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 32 taken 232 times.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 59 not taken.
456 if (!labels.exists(name)) throw_err_block(2, err_internal_error, "label created on 3rd pass");
532
2/4
✓ Branch 30 → 31 taken 224 times.
✗ Branch 30 → 51 not taken.
✓ Branch 33 → 34 taken 232 times.
✗ Branch 33 → 59 not taken.
456 labelpos = labels.find(name).pos;
533
7/10
✓ Branch 31 → 32 taken 3 times.
✓ Branch 31 → 48 taken 221 times.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 48 not taken.
✓ Branch 35 → 36 taken 3 times.
✓ Branch 35 → 56 taken 229 times.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 3 times.
✓ Branch 38 → 39 taken 3 times.
✗ Branch 38 → 56 not taken.
456 if ((int)labelpos != loc && !movinglabelspossible)
534 {
535
2/8
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 38 taken 3 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 51 not taken.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 44 taken 3 times.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 59 not taken.
6 if((unsigned int)loc>>16 != labelpos>>16) throw_err_block(2, err_label_ambiguous, name.data());
536
6/8
✓ Branch 38 → 39 taken 1 time.
✓ Branch 38 → 43 taken 2 times.
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 51 not taken.
✓ Branch 44 → 45 taken 1 time.
✓ Branch 44 → 49 taken 2 times.
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 59 not taken.
6 else if(labelpos == (dp_base + 0xFFu)) throw_err_block(2, err_label_ambiguous, name.data());
537
3/6
✓ Branch 43 → 44 taken 2 times.
✗ Branch 43 → 45 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 2 times.
✓ Branch 51 → 52 taken 2 times.
✗ Branch 51 → 53 not taken.
4 else if(errored) return;
538 else throw_err_block(2, err_internal_error, "moving label");
539 }
540 }
541 }
542
543 table thetable;
544 static autoarray<table> tablestack;
545
546 853 static void cleartable()
547 {
548
3/7
✓ Branch 2 → 3 taken 380 times.
✗ Branch 2 → 8 not taken.
✓ Branch 3 → 4 taken 853 times.
✗ Branch 3 → 6 not taken.
✗ Branch 3 → 11 not taken.
✓ Branch 5 → 6 taken 473 times.
✗ Branch 5 → 9 not taken.
853 thetable = table();
549 853 }
550
551 struct pushable {
552 int arch;
553 int snespos;
554 int snesstart;
555 int snesposreal;
556 int snesstartreal;
557 int freeid;
558 int freest;
559 int arch1;
560 int arch2;
561 int arch3;
562 int arch4;
563 };
564 static autoarray<pushable> pushpc;
565 static int pushpcnum;
566
567 static autoarray<int> basestack;
568 static int basestacknum;
569
570 struct ns_pushable {
571 string ns;
572 autoarray<string> namespace_list;
573 bool nested_namespaces;
574 };
575
576 static autoarray<ns_pushable> pushns;
577 static int pushnsnum;
578
579
580 static unsigned char fillbyte[12];
581 static unsigned char padbyte[12];
582
583 static bool nested_namespaces = false;
584
585 48702 void checkbankcross()
586 {
587
4/4
✓ Branch 2 → 3 taken 4602 times.
✓ Branch 2 → 4 taken 44100 times.
✓ Branch 4 → 5 taken 4674 times.
✓ Branch 4 → 6 taken 19830 times.
48702 if (!snespos_valid) return;
588
5/6
✓ Branch 4 → 5 taken 189 times.
✓ Branch 4 → 6 taken 19407 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 19830 times.
✓ Branch 8 → 9 taken 189 times.
✓ Branch 8 → 10 taken 19641 times.
39426 if (disable_bank_cross_errors) return;
589
5/6
✓ Branch 6 → 7 taken 146 times.
✓ Branch 6 → 8 taken 19261 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 19641 times.
✓ Branch 12 → 13 taken 146 times.
✓ Branch 12 → 14 taken 19495 times.
39048 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
590
8/8
✓ Branch 9 → 10 taken 285 times.
✓ Branch 9 → 14 taken 19122 times.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 14 taken 283 times.
✓ Branch 15 → 16 taken 303 times.
✓ Branch 15 → 20 taken 19338 times.
✓ Branch 16 → 17 taken 2 times.
✓ Branch 16 → 20 taken 301 times.
39048 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
591 {
592 4 throw_err_fatal(pass, err_bank_border_crossed, snespos);
593 }
594 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
595
11/14
✓ Branch 14 → 15 taken 19264 times.
✓ Branch 14 → 20 taken 141 times.
✓ Branch 15 → 16 taken 283 times.
✓ Branch 15 → 20 taken 18981 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 283 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 19639 times.
✓ Branch 22 → 23 taken 19462 times.
✓ Branch 22 → 28 taken 177 times.
✓ Branch 23 → 24 taken 298 times.
✓ Branch 23 → 28 taken 19164 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 28 taken 298 times.
39044 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
596 {
597 throw_err_fatal(pass, err_bank_border_crossed, realsnespos);
598 }
599 }
600
601 3351 static void freespaceend()
602 {
603
3/3
✓ Branch 2 → 3 taken 1608 times.
✓ Branch 2 → 5 taken 789 times.
✓ Branch 2 → 7 taken 954 times.
3351 if (freespaceid > 0)
604 {
605 1608 freespaces[freespaceid].len = realsnespos-freespacestart;
606 1608 snespos=(int)0xFFFFFFFF;
607 1608 snespos_valid = false;
608 }
609 3351 freespaceid = 0;
610 3351 }
611
612 2568 static void adddefine(const string & key, string & value)
613 {
614
2/4
✓ Branch 4 → 5 taken 1131 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 1437 times.
✗ Branch 6 → 14 not taken.
2568 if (!defines.exists(key)) defines.create(key) = value;
615 2568 }
616
617 847 void initstuff()
618 {
619
3/3
✓ Branch 2 → 3 taken 289 times.
✓ Branch 2 → 5 taken 248 times.
✓ Branch 2 → 6 taken 310 times.
847 if (pass==0)
620 {
621 289 freespaces.reset();
622 289 movinglabelspossible = false;
623 289 found_rats_tags_initialized = false;
624 289 found_rats_tags.clear();
625 }
626 847 arch=arch_65816;
627 847 mapper=lorom;
628 847 mapper_set = false;
629 847 calledmacros = 0;
630 847 reallycalledmacros = 0;
631 847 macrorecursion = 0;
632 847 defines.reset();
633 847 builtindefines.each(adddefine);
634 847 clidefines.each(adddefine);
635 847 ns="";
636 847 namespace_list.reset();
637 847 sublabels.reset();
638 847 poslabels.reset();
639 847 neglabels.reset();
640 847 macroposlabels = nullptr;
641 847 macroneglabels = nullptr;
642 847 macrosublabels = nullptr;
643 847 cleartable();
644 847 pushpc.reset();
645 847 pushpcnum=0;
646 847 pushns.reset();
647 847 pushnsnum = 0;
648 847 bytes=0;
649 847 freespaceuse=0;
650
1/2
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 470 times.
847 memset(fillbyte, 0, sizeof(fillbyte));
651
1/2
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 470 times.
847 memset(padbyte, 0, sizeof(padbyte));
652 847 snespos_valid = false;
653 847 snespos=(int)0xFFFFFFFF;
654 847 realsnespos= (int)0xFFFFFFFF;
655 847 startpos= (int)0xFFFFFFFF;
656 847 realstartpos= (int)0xFFFFFFFF;
657 847 freespaceidnext=1;
658 847 freespaceid=0;
659 847 freespacebyte=0x00;
660 847 incsrcdepth = 0;
661
662 847 optimizeforbank = -1;
663 847 optimize_dp = optimize_dp_flag::ALWAYS;
664 847 dp_base = 0;
665 847 optimize_address = optimize_address_flag::MIRRORS;
666
667 847 in_struct = false;
668 847 in_sub_struct = false;
669 847 in_spcblock = false;
670
671 847 disable_bank_cross_errors = false;
672 847 check_half_banks_crossed = false;
673 847 nested_namespaces = false;
674
675 847 includeonce.reset();
676
677 extern AddressToLineMapping addressToLineMapping;
678 847 addressToLineMapping.reset();
679
680 847 push_warnings(false);
681
682 847 initmathcore();
683
684 1317 default_freespace_settings = {};
685 847 default_freespace_settings.bank = -3;
686 847 default_freespace_settings.search_start = -1;
687 847 default_freespace_settings.write_rats = true;
688 // rest are initialized to false/0/empty string
689
690 847 callstack.clear();
691 #if defined(_WIN32) || !defined(NO_USE_THREADS)
692 847 init_stack_use_check();
693 #endif
694 847 }
695
696 1608 static void parse_freespace_arguments(freespace_data& thisfs, string& arguments) {
697
4/4
✓ Branch 3 → 4 taken 111 times.
✓ Branch 3 → 5 taken 693 times.
✓ Branch 4 → 5 taken 111 times.
✓ Branch 4 → 6 taken 693 times.
1608 if(arguments == "") return;
698
2/5
✓ Branch 6 → 7 taken 693 times.
✗ Branch 6 → 119 not taken.
✗ Branch 6 → 132 not taken.
✓ Branch 9 → 10 taken 693 times.
✗ Branch 9 → 247 not taken.
1386 autoptr<char**> pars=qpsplit(arguments.temp_raw(), ',');
699
700
4/6
✗ Branch 93 → 9 not taken.
✗ Branch 93 → 94 not taken.
✓ Branch 105 → 9 taken 702 times.
✓ Branch 105 → 106 taken 693 times.
✓ Branch 213 → 12 taken 702 times.
✓ Branch 213 → 214 taken 693 times.
2790 for (int i=0;pars[i];i++)
701 {
702
4/9
✓ Branch 10 → 11 taken 702 times.
✗ Branch 10 → 12 not taken.
✗ Branch 10 → 130 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 702 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 702 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 702 times.
1404 if (!stricmp(pars[i], "ram")) { thisfs.bank = -2; }
703
6/10
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
✓ Branch 14 → 15 taken 702 times.
✗ Branch 14 → 130 not taken.
✓ Branch 15 → 16 taken 3 times.
✓ Branch 15 → 17 taken 699 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 702 times.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 30 taken 699 times.
1404 else if (!stricmp(pars[i], "noram")) { thisfs.bank = -1; }
704
6/10
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
✓ Branch 18 → 19 taken 699 times.
✗ Branch 18 → 130 not taken.
✓ Branch 19 → 20 taken 6 times.
✓ Branch 19 → 21 taken 693 times.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 35 taken 699 times.
✓ Branch 35 → 36 taken 6 times.
✓ Branch 35 → 39 taken 693 times.
1398 else if (!stricmp(pars[i], "static")) { thisfs.is_static = true; }
705
4/10
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 21 not taken.
✓ Branch 22 → 23 taken 693 times.
✗ Branch 22 → 130 not taken.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 693 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 693 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 48 taken 693 times.
1386 else if (!stricmp(pars[i], "nostatic")) { thisfs.is_static = false; }
706
6/10
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 24 not taken.
✓ Branch 26 → 27 taken 693 times.
✗ Branch 26 → 130 not taken.
✓ Branch 27 → 28 taken 6 times.
✓ Branch 27 → 29 taken 687 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 693 times.
✓ Branch 53 → 54 taken 6 times.
✓ Branch 53 → 57 taken 687 times.
1386 else if (!stricmp(pars[i], "align")) { thisfs.flag_align = true; }
707
4/10
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
✓ Branch 30 → 31 taken 687 times.
✗ Branch 30 → 130 not taken.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 687 times.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 62 taken 687 times.
✗ Branch 62 → 63 not taken.
✓ Branch 62 → 66 taken 687 times.
1374 else if (!stricmp(pars[i], "noalign")) { thisfs.flag_align = false; }
708
6/10
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
✓ Branch 34 → 35 taken 687 times.
✗ Branch 34 → 130 not taken.
✓ Branch 35 → 36 taken 636 times.
✓ Branch 35 → 37 taken 51 times.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 71 taken 687 times.
✓ Branch 71 → 72 taken 636 times.
✓ Branch 71 → 75 taken 51 times.
1374 else if (!stricmp(pars[i], "cleaned")) { thisfs.flag_cleaned = true; }
709
4/10
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 33 not taken.
✓ Branch 38 → 39 taken 51 times.
✗ Branch 38 → 130 not taken.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 51 times.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 51 times.
✗ Branch 80 → 81 not taken.
✓ Branch 80 → 84 taken 51 times.
102 else if (!stricmp(pars[i], "nocleaned")) { thisfs.flag_cleaned = false; }
710
4/10
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 36 not taken.
✓ Branch 42 → 43 taken 51 times.
✗ Branch 42 → 130 not taken.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 51 times.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 51 times.
✗ Branch 89 → 90 not taken.
✓ Branch 89 → 93 taken 51 times.
102 else if (!stricmp(pars[i], "rats")) { thisfs.write_rats = true; }
711
4/10
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 39 not taken.
✓ Branch 46 → 47 taken 51 times.
✗ Branch 46 → 130 not taken.
✗ Branch 47 → 48 not taken.
✓ Branch 47 → 49 taken 51 times.
✗ Branch 96 → 97 not taken.
✓ Branch 96 → 98 taken 51 times.
✗ Branch 98 → 99 not taken.
✓ Branch 98 → 102 taken 51 times.
102 else if (!stricmp(pars[i], "norats")) { thisfs.write_rats = false; }
712
4/10
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 42 not taken.
✓ Branch 50 → 51 taken 51 times.
✗ Branch 50 → 130 not taken.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 51 times.
✗ Branch 105 → 106 not taken.
✓ Branch 105 → 107 taken 51 times.
✗ Branch 107 → 108 not taken.
✓ Branch 107 → 111 taken 51 times.
102 else if (!stricmp(pars[i], "bankcross")) { thisfs.allow_bankcross = true; }
713
4/10
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 45 not taken.
✓ Branch 54 → 55 taken 51 times.
✗ Branch 54 → 130 not taken.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 57 taken 51 times.
✗ Branch 114 → 115 not taken.
✓ Branch 114 → 116 taken 51 times.
✗ Branch 116 → 117 not taken.
✓ Branch 116 → 120 taken 51 times.
102 else if (!stricmp(pars[i], "nobankcross")) { thisfs.allow_bankcross = false; }
714
4/6
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 56 not taken.
✓ Branch 59 → 60 taken 24 times.
✓ Branch 59 → 68 taken 27 times.
✓ Branch 124 → 125 taken 24 times.
✓ Branch 124 → 143 taken 27 times.
102 else if (stribegin(pars[i], "bank="))
715 {
716
6/18
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 102 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 100 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 98 not taken.
✓ Branch 61 → 62 taken 24 times.
✗ Branch 61 → 114 not taken.
✓ Branch 63 → 64 taken 24 times.
✗ Branch 63 → 112 not taken.
✓ Branch 64 → 65 taken 24 times.
✗ Branch 64 → 110 not taken.
✓ Branch 131 → 132 taken 24 times.
✗ Branch 131 → 222 not taken.
✓ Branch 134 → 135 taken 24 times.
✗ Branch 134 → 220 not taken.
✓ Branch 136 → 137 taken 24 times.
✗ Branch 136 → 218 not taken.
48 thisfs.bank = parse_math_expr(pars[i] + 5)->evaluate_static().get_integer();
717 }
718
4/6
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 67 not taken.
✓ Branch 70 → 71 taken 12 times.
✓ Branch 70 → 79 taken 15 times.
✓ Branch 147 → 148 taken 12 times.
✓ Branch 147 → 166 taken 15 times.
54 else if (stribegin(pars[i], "start="))
719 {
720
6/18
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 108 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 106 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 104 not taken.
✓ Branch 72 → 73 taken 12 times.
✗ Branch 72 → 120 not taken.
✓ Branch 74 → 75 taken 12 times.
✗ Branch 74 → 118 not taken.
✓ Branch 75 → 76 taken 12 times.
✗ Branch 75 → 116 not taken.
✓ Branch 154 → 155 taken 12 times.
✗ Branch 154 → 230 not taken.
✓ Branch 157 → 158 taken 12 times.
✗ Branch 157 → 228 not taken.
✓ Branch 159 → 160 taken 12 times.
✗ Branch 159 → 226 not taken.
24 thisfs.search_start = parse_math_expr(pars[i] + 6)->evaluate_static().get_integer();
721 }
722
2/6
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 88 not taken.
✓ Branch 81 → 82 taken 15 times.
✗ Branch 81 → 100 not taken.
✓ Branch 170 → 171 taken 15 times.
✗ Branch 170 → 206 not taken.
30 else if (stribegin(pars[i], "pin="))
723 {
724 // TODO: should we handle posneg labels here too?
725
2/6
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 116 not taken.
✓ Branch 83 → 84 taken 15 times.
✗ Branch 83 → 129 not taken.
✓ Branch 176 → 177 taken 15 times.
✗ Branch 176 → 242 not taken.
30 string pin_to = pars[i] + 4;
726 30 const char* pin_to_c = pin_to.data();
727
2/6
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 110 not taken.
✓ Branch 85 → 86 taken 15 times.
✗ Branch 85 → 122 not taken.
✓ Branch 180 → 181 taken 15 times.
✗ Branch 180 → 234 not taken.
30 thisfs.pin_target = labelname(&pin_to_c);
728
2/12
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 80 not taken.
✗ Branch 77 → 78 not taken.
✗ Branch 77 → 114 not taken.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 92 taken 15 times.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 127 not taken.
✗ Branch 189 → 190 not taken.
✓ Branch 189 → 193 taken 15 times.
✗ Branch 190 → 191 not taken.
✗ Branch 190 → 240 not taken.
30 if(*pin_to_c) throw_err_block(0, err_invalid_label_name);
729 // this is to throw an "undefined label" error with the proper callstack
730
8/18
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 85 not taken.
✗ Branch 81 → 82 not taken.
✗ Branch 81 → 113 not taken.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 111 not taken.
✓ Branch 92 → 93 taken 10 times.
✓ Branch 92 → 97 taken 5 times.
✓ Branch 93 → 94 taken 10 times.
✗ Branch 93 → 125 not taken.
✓ Branch 94 → 95 taken 10 times.
✗ Branch 94 → 123 not taken.
✓ Branch 193 → 194 taken 10 times.
✓ Branch 193 → 199 taken 5 times.
✓ Branch 195 → 196 taken 10 times.
✗ Branch 195 → 238 not taken.
✓ Branch 196 → 197 taken 10 times.
✗ Branch 196 → 236 not taken.
30 if(pass) labelval(pin_to);
731
2/6
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 114 not taken.
✓ Branch 97 → 98 taken 15 times.
✗ Branch 97 → 127 not taken.
✓ Branch 202 → 203 taken 15 times.
✗ Branch 202 → 240 not taken.
30 thisfs.pin_target_ns = ns;
732 30 }
733 else throw_err_block(0, err_invalid_freespace_request);
734 }
735 1386 }
736
737 544 static int get_freespace_pin_target(int target_id) {
738 // union-find algorithm
739
4/4
✓ Branch 9 → 3 taken 2 times.
✓ Branch 9 → 10 taken 272 times.
✓ Branch 19 → 3 taken 2 times.
✓ Branch 19 → 20 taken 272 times.
548 while(freespaces[target_id].pin_target_id != target_id) {
740 // i love programming
741 6 freespaces[target_id].pin_target_id =
742 4 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
743 4 target_id = freespaces[target_id].pin_target_id;
744 }
745 544 return target_id;
746 }
747
748 279 static void resolve_pinned_freespaces() {
749
4/4
✓ Branch 5 → 3 taken 267 times.
✓ Branch 5 → 6 taken 124 times.
✓ Branch 7 → 3 taken 267 times.
✓ Branch 7 → 8 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++)
750 // default to everyone being in a separate component
751 534 freespaces[i].pin_target_id = i;
752
4/4
✓ Branch 41 → 7 taken 267 times.
✓ Branch 41 → 42 taken 124 times.
✓ Branch 80 → 9 taken 267 times.
✓ Branch 80 → 81 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++) {
753
2/4
✓ Branch 7 → 8 taken 267 times.
✗ Branch 7 → 55 not taken.
✓ Branch 9 → 10 taken 267 times.
✗ Branch 9 → 101 not taken.
534 freespace_data& fs = freespaces[i];
754
4/4
✓ Branch 9 → 10 taken 262 times.
✓ Branch 9 → 11 taken 5 times.
✓ Branch 14 → 15 taken 262 times.
✓ Branch 14 → 16 taken 5 times.
534 if(fs.pin_target == "") continue;
755 10 snes_label value;
756
7/32
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 20 taken 5 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 48 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 48 not taken.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 5 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 36 taken 5 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 30 taken 5 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 91 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 91 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 36 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 5 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 5 times.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 57 taken 5 times.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 50 not taken.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 93 not taken.
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 96 not taken.
10 if(fs.pin_target_ns && labels.exists(fs.pin_target_ns + fs.pin_target))
757 value = labels.find(fs.pin_target_ns + fs.pin_target);
758
4/8
✓ Branch 31 → 32 taken 5 times.
✗ Branch 31 → 55 not taken.
✓ Branch 32 → 33 taken 5 times.
✗ Branch 32 → 36 not taken.
✓ Branch 61 → 62 taken 5 times.
✗ Branch 61 → 101 not taken.
✓ Branch 62 → 63 taken 5 times.
✗ Branch 62 → 71 not taken.
10 else if(labels.exists(fs.pin_target))
759
2/4
✓ Branch 34 → 35 taken 5 times.
✗ Branch 34 → 55 not taken.
✓ Branch 67 → 68 taken 5 times.
✗ Branch 67 → 101 not taken.
10 value = labels.find(fs.pin_target);
760 else continue; // the error for this is thrown in the freespace command during pass 2
761
2/4
✓ Branch 37 → 38 taken 5 times.
✗ Branch 37 → 55 not taken.
✓ Branch 72 → 73 taken 5 times.
✗ Branch 72 → 101 not taken.
10 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
762 10 fs.len = 0;
763 }
764
4/4
✓ Branch 46 → 43 taken 267 times.
✓ Branch 46 → 47 taken 124 times.
✓ Branch 89 → 82 taken 267 times.
✓ Branch 89 → 90 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++) {
765 534 freespace_data& fs = freespaces[i];
766 // just in case the pin target changed again or something
767 534 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
768 }
769 279 }
770
771 279 static void allocate_freespaces() {
772 // compute real size of all pinned freespace blocks
773
4/4
✓ Branch 7 → 3 taken 267 times.
✓ Branch 7 → 8 taken 124 times.
✓ Branch 24 → 3 taken 267 times.
✓ Branch 24 → 25 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++) {
774 534 freespace_data& fs = freespaces[i];
775 534 freespace_data& target = freespaces[fs.pin_target_id];
776 534 target.total_len += fs.len;
777 534 target.search_start = std::max(fs.search_start, target.search_start);
778 }
779
780
4/4
✓ Branch 18 → 9 taken 267 times.
✓ Branch 18 → 19 taken 124 times.
✓ Branch 65 → 26 taken 267 times.
✓ Branch 65 → 66 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++) {
781 534 freespace_data& fs = freespaces[i];
782
9/10
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 13 taken 265 times.
✓ Branch 11 → 12 taken 1 time.
✓ Branch 11 → 13 taken 1 time.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 267 times.
✓ Branch 30 → 31 taken 2 times.
✓ Branch 30 → 38 taken 265 times.
✓ Branch 33 → 34 taken 1 time.
✓ Branch 33 → 38 taken 1 time.
534 if(fs.is_static && fs.orgpos > 0) {
783 2 fs.pos = fs.orgpos;
784 2 continue;
785 }
786 // if this freespace is pinned to another one, set it later
787
4/4
✓ Branch 13 → 14 taken 4 times.
✓ Branch 13 → 15 taken 262 times.
✓ Branch 40 → 41 taken 4 times.
✓ Branch 40 → 42 taken 262 times.
532 if(fs.pin_target_id != i) continue;
788 // TODO: possibly fancier align
789
3/6
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 262 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 50 taken 262 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 262 times.
524 fs.pos = getsnesfreespace(fs.total_len, fs.bank, true, !fs.allow_bankcross, fs.flag_align, fs.write_rats, fs.search_start);
790 524 fs.used_len = fs.len;
791 }
792 // set pos for all pinned freespaces
793
4/4
✓ Branch 26 → 20 taken 267 times.
✓ Branch 26 → 27 taken 124 times.
✓ Branch 87 → 67 taken 267 times.
✓ Branch 87 → 88 taken 155 times.
813 for(int i = 1; i < freespaces.count; i++) {
794 534 freespace_data& fs = freespaces[i];
795
4/4
✓ Branch 21 → 22 taken 263 times.
✓ Branch 21 → 23 taken 4 times.
✓ Branch 70 → 71 taken 263 times.
✓ Branch 70 → 72 taken 4 times.
534 if(fs.pin_target_id == i) continue;
796 8 freespace_data& tgt = freespaces[fs.pin_target_id];
797 8 fs.pos = tgt.pos + tgt.used_len;
798 8 tgt.used_len += fs.len;
799 }
800
801 // relocate all labels that were in freespace to point them to their real location
802 279 labels.each([](const char * key, snes_label & val) {
803
4/4
✓ Branch 2 → 3 taken 49 times.
✓ Branch 2 → 5 taken 174 times.
✓ Branch 4 → 5 taken 49 times.
✓ Branch 4 → 12 taken 182 times.
454 if(val.freespace_id != 0) {
804 98 val.pos += freespaces[val.freespace_id].pos;
805 }
806 454 });
807 279 }
808
809 837 void finishpass()
810 {
811 837 verify_warnings();
812 837 pull_warnings(false);
813
814
3/5
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 465 times.
✓ Branch 4 → 8 taken 372 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 465 times.
837 if(in_spcblock) throw_err_block(0, err_missing_endspcblock);
815
6/12
✓ Branch 8 → 9 taken 372 times.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 372 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 465 times.
✓ Branch 12 → 13 taken 465 times.
✗ Branch 12 → 16 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 465 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 465 times.
837 if (in_struct || in_sub_struct) throw_err_null(0, err_struct_without_endstruct);
816
2/4
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 372 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 465 times.
837 else if (pushpcnum) throw_err_null(0, err_pushpc_without_pullpc);
817
2/4
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 372 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 465 times.
837 else if (pushnsnum) throw_err_null(0, err_pushns_without_pullns);
818 837 freespaceend();
819
820 837 deinitmathcore();
821
4/4
✓ Branch 17 → 18 taken 124 times.
✓ Branch 17 → 19 taken 248 times.
✓ Branch 23 → 24 taken 155 times.
✓ Branch 23 → 25 taken 310 times.
837 if(pass == 0) {
822 279 resolve_pinned_freespaces();
823
4/4
✓ Branch 19 → 20 taken 124 times.
✓ Branch 19 → 22 taken 124 times.
✓ Branch 25 → 26 taken 155 times.
✓ Branch 25 → 28 taken 155 times.
558 } else if(pass == 1) {
824 279 allocate_freespaces();
825 279 handle_cleared_rats_tags();
826 }
827 #if defined(_WIN32) || !defined(NO_USE_THREADS)
828 837 deinit_stack_use_check();
829 #endif
830 837 }
831
832 32657 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
833 {
834
4/7
✓ Branch 2 → 3 taken 16198 times.
✗ Branch 2 → 4 not taken.
✓ Branch 3 → 4 taken 16459 times.
✓ Branch 3 → 5 taken 16198 times.
✗ Branch 3 → 6 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 16459 times.
32657 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
835
836 32657 const char* posneglabel = label;
837
2/4
✓ Branch 5 → 6 taken 16198 times.
✗ Branch 5 → 89 not taken.
✓ Branch 9 → 10 taken 16459 times.
✗ Branch 9 → 139 not taken.
32657 string posnegname = posneglabelname(&posneglabel, true);
838
839
4/4
✓ Branch 7 → 8 taken 60 times.
✓ Branch 7 → 19 taken 16138 times.
✓ Branch 11 → 12 taken 66 times.
✓ Branch 11 → 27 taken 16393 times.
32657 if (posnegname.length() > 0)
840 {
841
2/4
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 60 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 66 times.
126 if (global_label) return false;
842
6/12
✓ Branch 10 → 11 taken 12 times.
✓ Branch 10 → 15 taken 48 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 12 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 87 not taken.
✓ Branch 15 → 16 taken 12 times.
✓ Branch 15 → 21 taken 54 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 12 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 137 not taken.
126 if (*posneglabel != '\0' && *posneglabel != ':') throw_err_block(0, err_broken_label_definition);
843
4/8
✓ Branch 15 → 16 taken 60 times.
✗ Branch 15 → 79 not taken.
✓ Branch 16 → 17 taken 60 times.
✗ Branch 16 → 77 not taken.
✓ Branch 22 → 23 taken 66 times.
✗ Branch 22 → 125 not taken.
✓ Branch 23 → 24 taken 66 times.
✗ Branch 23 → 123 not taken.
126 setlabel(posnegname, pos);
844 126 return true;
845 }
846
15/18
✓ Branch 19 → 20 taken 15655 times.
✓ Branch 19 → 23 taken 483 times.
✓ Branch 20 → 21 taken 15625 times.
✓ Branch 20 → 23 taken 30 times.
✓ Branch 21 → 22 taken 15622 times.
✓ Branch 21 → 23 taken 3 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 73 taken 15622 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 16393 times.
✓ Branch 31 → 32 taken 15898 times.
✓ Branch 31 → 38 taken 495 times.
✓ Branch 33 → 34 taken 15865 times.
✓ Branch 33 → 38 taken 33 times.
✓ Branch 35 → 36 taken 15862 times.
✓ Branch 35 → 38 taken 3 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 118 taken 15862 times.
32531 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
847 {
848
4/4
✓ Branch 23 → 24 taken 6 times.
✓ Branch 23 → 25 taken 510 times.
✓ Branch 40 → 41 taken 6 times.
✓ Branch 40 → 42 taken 525 times.
1047 if (!label[1]) return false;
849
14/20
✓ Branch 25 → 26 taken 21 times.
✓ Branch 25 → 30 taken 489 times.
✓ Branch 26 → 27 taken 21 times.
✗ Branch 26 → 29 not taken.
✓ Branch 27 → 28 taken 21 times.
✗ Branch 27 → 29 not taken.
✓ Branch 28 → 29 taken 3 times.
✓ Branch 28 → 30 taken 18 times.
✓ Branch 42 → 43 taken 21 times.
✓ Branch 42 → 52 taken 504 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 21 times.
✓ Branch 45 → 46 taken 21 times.
✗ Branch 45 → 51 not taken.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 21 times.
✓ Branch 48 → 49 taken 21 times.
✗ Branch 48 → 51 not taken.
✓ Branch 50 → 51 taken 3 times.
✓ Branch 50 → 52 taken 18 times.
1035 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
850
851 1029 bool define = true;
852
853
4/4
✓ Branch 30 → 31 taken 12 times.
✓ Branch 30 → 32 taken 495 times.
✓ Branch 53 → 54 taken 12 times.
✓ Branch 53 → 56 taken 510 times.
1029 if (label[0] == '#')
854 {
855 24 define = false;
856 24 label++;
857 }
858
859 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
860 // Also, apparently this here doesn't account for main labels. I guess because
861 // we don't even get here in the first place if they don't include a colon?
862
16/20
✓ Branch 32 → 33 taken 354 times.
✓ Branch 32 → 37 taken 153 times.
✓ Branch 33 → 34 taken 351 times.
✓ Branch 33 → 37 taken 3 times.
✓ Branch 34 → 35 taken 345 times.
✓ Branch 34 → 36 taken 6 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 345 times.
✓ Branch 57 → 58 taken 363 times.
✓ Branch 57 → 68 taken 159 times.
✓ Branch 60 → 61 taken 360 times.
✓ Branch 60 → 68 taken 3 times.
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 63 taken 360 times.
✓ Branch 63 → 64 taken 354 times.
✓ Branch 63 → 67 taken 6 times.
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 66 taken 354 times.
✗ Branch 66 → 67 not taken.
✓ Branch 66 → 68 taken 354 times.
1029 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
863
4/4
✓ Branch 38 → 39 taken 498 times.
✓ Branch 38 → 86 taken 9 times.
✓ Branch 70 → 71 taken 513 times.
✓ Branch 70 → 135 taken 9 times.
1029 string name=labelname(&label, define, true);
864
4/4
✓ Branch 39 → 40 taken 465 times.
✓ Branch 39 → 41 taken 33 times.
✓ Branch 72 → 73 taken 477 times.
✓ Branch 72 → 75 taken 36 times.
1011 if (label[0]==':') label++;
865
2/8
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 33 times.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 84 not taken.
✗ Branch 75 → 76 not taken.
✓ Branch 75 → 79 taken 36 times.
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 133 not taken.
69 else if (requirecolon) throw_err_block(0, err_broken_label_definition);
866
4/4
✓ Branch 45 → 46 taken 3 times.
✓ Branch 45 → 47 taken 30 times.
✓ Branch 79 → 80 taken 3 times.
✓ Branch 79 → 81 taken 33 times.
69 else if (global_label) return false;
867
6/8
✓ Branch 47 → 48 taken 12 times.
✓ Branch 47 → 51 taken 483 times.
✓ Branch 48 → 49 taken 12 times.
✗ Branch 48 → 84 not taken.
✓ Branch 82 → 83 taken 12 times.
✓ Branch 82 → 86 taken 498 times.
✓ Branch 83 → 84 taken 12 times.
✗ Branch 83 → 133 not taken.
1005 if (label[0]) throw_err_block(0, err_broken_label_definition);
868
14/16
✓ Branch 52 → 53 taken 54 times.
✓ Branch 52 → 55 taken 429 times.
✓ Branch 53 → 54 taken 48 times.
✓ Branch 53 → 55 taken 6 times.
✓ Branch 56 → 57 taken 48 times.
✓ Branch 56 → 62 taken 435 times.
✓ Branch 58 → 59 taken 48 times.
✗ Branch 58 → 80 not taken.
✓ Branch 87 → 88 taken 57 times.
✓ Branch 87 → 90 taken 441 times.
✓ Branch 88 → 89 taken 51 times.
✓ Branch 88 → 90 taken 6 times.
✓ Branch 91 → 92 taken 51 times.
✓ Branch 91 → 99 taken 447 times.
✓ Branch 94 → 95 taken 51 times.
✗ Branch 94 → 127 not taken.
981 if (ns && !global_label) name=ns+name;
869
21/26
✓ Branch 62 → 63 taken 384 times.
✓ Branch 62 → 64 taken 99 times.
✓ Branch 63 → 64 taken 12 times.
✓ Branch 63 → 66 taken 372 times.
✓ Branch 64 → 65 taken 81 times.
✓ Branch 64 → 66 taken 30 times.
✓ Branch 67 → 68 taken 483 times.
✗ Branch 67 → 83 not taken.
✓ Branch 68 → 69 taken 481 times.
✓ Branch 68 → 81 taken 2 times.
✗ Branch 99 → 100 not taken.
✓ Branch 99 → 101 taken 498 times.
✓ Branch 101 → 102 taken 399 times.
✓ Branch 101 → 105 taken 99 times.
✗ Branch 102 → 103 not taken.
✓ Branch 102 → 104 taken 399 times.
✓ Branch 104 → 105 taken 12 times.
✓ Branch 104 → 109 taken 387 times.
✗ Branch 105 → 106 not taken.
✓ Branch 105 → 107 taken 111 times.
✓ Branch 107 → 108 taken 81 times.
✓ Branch 107 → 109 taken 30 times.
✓ Branch 111 → 112 taken 498 times.
✗ Branch 111 → 131 not taken.
✓ Branch 112 → 113 taken 496 times.
✓ Branch 112 → 129 taken 2 times.
985 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
870 977 return true;
871 1011 }
872 31484 return false;
873 32657 }
874
875 15650 static void add_addr_to_line(int pos)
876 {
877
3/3
✓ Branch 2 → 3 taken 5520 times.
✓ Branch 2 → 6 taken 5035 times.
✓ Branch 2 → 7 taken 5095 times.
15650 if (pass == 2)
878 5520 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
879 15650 }
880
881 static autoarray<bool> elsestatus;
882 int numtrue=0;//if 1 -> increase both
883 int numif = 0; //if 0 or inside if 0 -> increase only numif
884
885 autoarray<whiletracker> whilestatus;
886
887
888 112 static void push_pc()
889 {
890 112 pushpc[pushpcnum].arch=arch;
891 112 pushpc[pushpcnum].snespos=snespos;
892 112 pushpc[pushpcnum].snesstart=startpos;
893 112 pushpc[pushpcnum].snesposreal=realsnespos;
894 112 pushpc[pushpcnum].snesstartreal=realstartpos;
895 112 pushpc[pushpcnum].freeid=freespaceid;
896 112 pushpc[pushpcnum].freest=freespacestart;
897 112 pushpcnum++;
898 112 }
899
900 112 static void pop_pc()
901 {
902 112 pushpcnum--;
903 112 snespos=pushpc[pushpcnum].snespos;
904 112 startpos=pushpc[pushpcnum].snesstart;
905 112 realsnespos=pushpc[pushpcnum].snesposreal;
906 112 realstartpos=pushpc[pushpcnum].snesstartreal;
907 112 freespaceid=pushpc[pushpcnum].freeid;
908 112 freespacestart=pushpc[pushpcnum].freest;
909 112 }
910
911
912 372 static string handle_print(const char* input)
913 {
914 // evaluating this math can be unsafe in pass 0
915
3/6
✓ Branch 2 → 3 taken 244 times.
✓ Branch 2 → 5 taken 128 times.
✓ Branch 3 → 4 taken 244 times.
✗ Branch 3 → 74 not taken.
✗ Branch 3 → 77 not taken.
✗ Branch 3 → 116 not taken.
372 if(pass != 2) return "";
916 128 string out;
917
2/5
✓ Branch 6 → 7 taken 62 times.
✗ Branch 6 → 72 not taken.
✗ Branch 6 → 75 not taken.
✓ Branch 8 → 9 taken 66 times.
✗ Branch 8 → 114 not taken.
128 string buf = input;
918
2/5
✓ Branch 8 → 9 taken 62 times.
✗ Branch 8 → 70 not taken.
✗ Branch 8 → 73 not taken.
✓ Branch 11 → 12 taken 66 times.
✗ Branch 11 → 112 not taken.
128 autoptr<char**> pars = qpsplit(buf.raw(), ',');
919
2/5
✓ Branch 10 → 11 taken 62 times.
✗ Branch 10 → 68 not taken.
✗ Branch 10 → 71 not taken.
✓ Branch 13 → 14 taken 66 times.
✗ Branch 13 → 110 not taken.
128 verify_paren(pars);
920
4/6
✗ Branch 43 → 12 not taken.
✗ Branch 43 → 44 not taken.
✓ Branch 46 → 12 taken 101 times.
✓ Branch 46 → 47 taken 58 times.
✓ Branch 77 → 15 taken 108 times.
✓ Branch 77 → 78 taken 62 times.
329 for (int i = 0; pars[i]; i++)
921 {
922 if (0);
923 // leaving these here is kinda hacky, but whatever...
924
10/19
✓ Branch 13 → 14 taken 101 times.
✗ Branch 13 → 18 not taken.
✗ Branch 13 → 71 not taken.
✓ Branch 14 → 15 taken 2 times.
✓ Branch 14 → 19 taken 99 times.
✗ Branch 14 → 52 not taken.
✓ Branch 15 → 16 taken 2 times.
✗ Branch 15 → 50 not taken.
✗ Branch 15 → 55 not taken.
✓ Branch 16 → 17 taken 2 times.
✗ Branch 16 → 53 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 108 times.
✓ Branch 20 → 21 taken 2 times.
✓ Branch 20 → 27 taken 106 times.
✓ Branch 22 → 23 taken 2 times.
✗ Branch 22 → 88 not taken.
✓ Branch 24 → 25 taken 2 times.
✗ Branch 24 → 86 not taken.
209 else if (!stricmp(pars[i], "bytes")) out += dec(bytes);
925
10/20
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 24 not taken.
✓ Branch 20 → 21 taken 99 times.
✗ Branch 20 → 55 not taken.
✗ Branch 20 → 71 not taken.
✓ Branch 21 → 22 taken 1 time.
✓ Branch 21 → 26 taken 98 times.
✗ Branch 21 → 53 not taken.
✓ Branch 22 → 23 taken 1 time.
✗ Branch 22 → 58 not taken.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 56 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 106 times.
✓ Branch 32 → 33 taken 1 time.
✓ Branch 32 → 39 taken 105 times.
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 92 not taken.
✓ Branch 36 → 37 taken 1 time.
✗ Branch 36 → 90 not taken.
205 else if (!stricmp(pars[i], "freespaceuse")) out += dec(freespaceuse);
926
4/21
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 30 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 58 not taken.
✓ Branch 27 → 28 taken 98 times.
✗ Branch 27 → 56 not taken.
✗ Branch 27 → 71 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 33 taken 98 times.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 61 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 59 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 105 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 51 taken 105 times.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 96 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 94 not taken.
203 else if (!stricmp(pars[i], "pc")) out += hex((unsigned int)(snespos & 0xFFFFFF), 6);
927 else {
928
6/11
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 64 not taken.
✓ Branch 34 → 35 taken 98 times.
✗ Branch 34 → 59 not taken.
✗ Branch 34 → 67 not taken.
✓ Branch 37 → 38 taken 94 times.
✓ Branch 37 → 62 taken 4 times.
✓ Branch 56 → 57 taken 105 times.
✗ Branch 56 → 104 not taken.
✓ Branch 64 → 65 taken 101 times.
✓ Branch 64 → 98 taken 4 times.
426 math_val value = parse_math_expr(pars[i])->evaluate();
929
4/12
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 65 not taken.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 65 not taken.
✓ Branch 40 → 41 taken 94 times.
✗ Branch 40 → 68 not taken.
✓ Branch 41 → 42 taken 94 times.
✗ Branch 41 → 68 not taken.
✓ Branch 69 → 70 taken 101 times.
✗ Branch 69 → 106 not taken.
✓ Branch 70 → 71 taken 101 times.
✗ Branch 70 → 106 not taken.
195 out += value.get_str();
930 195 }
931 }
932 120 return out;
933 347 }
934
935 114 void handle_autoclean(string& arg, int checkbyte, int write_pos)
936 {
937
1/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 114 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 40 not taken.
✗ Branch 3 → 63 not taken.
114 if(freespaceid > 0) throw_err_block(0, err_autoclean_in_freespace);
938
939 114 const char* labeltest = arg.data();
940
2/4
✓ Branch 7 → 8 taken 57 times.
✗ Branch 7 → 40 not taken.
✓ Branch 9 → 10 taken 57 times.
✗ Branch 9 → 63 not taken.
114 snes_label lblval = labelval(&labeltest);
941
2/8
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 57 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 40 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 17 taken 57 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 63 not taken.
114 if (*labeltest) throw_err_block(0, err_label_not_found, arg.data());
942 114 int num = lblval.pos;
943
2/4
✓ Branch 13 → 14 taken 57 times.
✗ Branch 13 → 40 not taken.
✓ Branch 17 → 18 taken 57 times.
✗ Branch 17 → 63 not taken.
114 auto& targetfs = freespaces[lblval.freespace_id];
944
945
4/4
✓ Branch 14 → 15 taken 27 times.
✓ Branch 14 → 29 taken 30 times.
✓ Branch 18 → 19 taken 27 times.
✓ Branch 18 → 50 taken 30 times.
114 if (pass == 1) {
946 54 targetfs.leaked = false;
947
4/4
✓ Branch 15 → 16 taken 24 times.
✓ Branch 15 → 17 taken 3 times.
✓ Branch 21 → 22 taken 24 times.
✓ Branch 21 → 23 taken 3 times.
54 int orig_pos = read3(checkbyte != -1 ? write_pos+1 : write_pos);
948 54 int write_pos_pc = snestopc(write_pos);
949 54 targetfs.orgpos = targetfs.orglen = -1;
950
12/16
✓ Branch 20 → 21 taken 27 times.
✗ Branch 20 → 38 not taken.
✓ Branch 21 → 22 taken 27 times.
✗ Branch 21 → 38 not taken.
✓ Branch 22 → 23 taken 24 times.
✓ Branch 22 → 24 taken 3 times.
✓ Branch 23 → 24 taken 11 times.
✓ Branch 23 → 38 taken 13 times.
✓ Branch 32 → 33 taken 27 times.
✗ Branch 32 → 60 not taken.
✓ Branch 33 → 34 taken 27 times.
✗ Branch 33 → 60 not taken.
✓ Branch 34 → 35 taken 24 times.
✓ Branch 34 → 38 taken 3 times.
✓ Branch 37 → 38 taken 11 times.
✓ Branch 37 → 60 taken 13 times.
54 if(write_pos_pc >= 0 && write_pos_pc < romlen_r && (checkbyte == -1 || romdata_r[write_pos_pc] == checkbyte)) {
951
2/4
✓ Branch 24 → 25 taken 14 times.
✗ Branch 24 → 40 not taken.
✓ Branch 38 → 39 taken 14 times.
✗ Branch 38 → 63 not taken.
28 int rats_loc = ratsstart(orig_pos);
952
4/4
✓ Branch 25 → 26 taken 11 times.
✓ Branch 25 → 38 taken 3 times.
✓ Branch 39 → 40 taken 11 times.
✓ Branch 39 → 60 taken 3 times.
28 if(rats_loc != -1) {
953 22 targetfs.orgpos = rats_loc + 8;
954 22 targetfs.orglen = read2(rats_loc + 4) + 1;
955
7/10
✓ Branch 27 → 28 taken 10 times.
✓ Branch 27 → 38 taken 1 time.
✓ Branch 28 → 38 taken 10 times.
✗ Branch 28 → 40 not taken.
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 11 times.
✓ Branch 48 → 49 taken 10 times.
✓ Branch 48 → 60 taken 1 time.
✓ Branch 49 → 60 taken 10 times.
✗ Branch 49 → 63 not taken.
22 if(!targetfs.is_static) removerats(rats_loc + 8, freespacebyte);
956 }
957 }
958
4/4
✓ Branch 29 → 30 taken 27 times.
✓ Branch 29 → 38 taken 3 times.
✓ Branch 50 → 51 taken 27 times.
✓ Branch 50 → 60 taken 3 times.
60 } else if(pass == 2) {
959
2/4
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 27 times.
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 54 taken 27 times.
54 if(targetfs.pos < 0) {
960 // this freespace failed to allocate.
961 // ratsstart is obviously not going to find a nonexistent freespace,
962 // and would error too, we don't need 2 errors about the same thing.
963 // especially if one of them is as weird as this one.
964 return;
965 }
966
2/4
✓ Branch 32 → 33 taken 27 times.
✗ Branch 32 → 40 not taken.
✓ Branch 54 → 55 taken 27 times.
✗ Branch 54 → 63 not taken.
54 int start = ratsstart(num);
967
4/12
✓ Branch 33 → 34 taken 27 times.
✗ Branch 33 → 35 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 38 taken 27 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 40 not taken.
✓ Branch 55 → 56 taken 27 times.
✗ Branch 55 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 60 taken 27 times.
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 63 not taken.
54 if(start >= num || start < 0) throw_err_block(2, err_autoclean_label_at_freespace_end);
968 }
969 }
970
971 namespace {
972
973 template<void (*do_write)(unsigned int)>
974 4827 void cmd_write_data(const char* par) {
975 4827 int addrToLinePos = realsnespos & 0xFFFFFF;
976
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 2 → 3 taken 1998 times.
✗ Branch 2 → 66 not taken.
✓ Branch 3 → 4 taken 2073 times.
✗ Branch 3 → 106 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 2 → 3 taken 30 times.
✗ Branch 2 → 66 not taken.
✓ Branch 3 → 4 taken 30 times.
✗ Branch 3 → 106 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 2 → 3 taken 300 times.
✗ Branch 2 → 66 not taken.
✓ Branch 3 → 4 taken 300 times.
✗ Branch 3 → 106 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 2 → 3 taken 48 times.
✗ Branch 2 → 66 not taken.
✓ Branch 3 → 4 taken 48 times.
✗ Branch 3 → 106 not taken.
4827 string line = par;
977
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 4 → 5 taken 1998 times.
✗ Branch 4 → 64 not taken.
✓ Branch 6 → 7 taken 2073 times.
✗ Branch 6 → 104 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 4 → 5 taken 30 times.
✗ Branch 4 → 64 not taken.
✓ Branch 6 → 7 taken 30 times.
✗ Branch 6 → 104 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 4 → 5 taken 300 times.
✗ Branch 4 → 64 not taken.
✓ Branch 6 → 7 taken 300 times.
✗ Branch 6 → 104 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 4 → 5 taken 48 times.
✗ Branch 4 → 64 not taken.
✓ Branch 6 → 7 taken 48 times.
✗ Branch 6 → 104 not taken.
4827 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
978
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 6 → 7 taken 1998 times.
✗ Branch 6 → 62 not taken.
✓ Branch 8 → 9 taken 2073 times.
✗ Branch 8 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 6 → 7 taken 30 times.
✗ Branch 6 → 62 not taken.
✓ Branch 8 → 9 taken 30 times.
✗ Branch 8 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 6 → 7 taken 300 times.
✗ Branch 6 → 62 not taken.
✓ Branch 8 → 9 taken 300 times.
✗ Branch 8 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 6 → 7 taken 48 times.
✗ Branch 6 → 62 not taken.
✓ Branch 8 → 9 taken 48 times.
✗ Branch 8 → 102 not taken.
4827 verify_paren(pars);
979
980
16/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 44 → 8 taken 2404 times.
✓ Branch 44 → 45 taken 1986 times.
✓ Branch 73 → 10 taken 2518 times.
✓ Branch 73 → 74 taken 2061 times.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 44 → 8 taken 30 times.
✓ Branch 44 → 45 taken 30 times.
✓ Branch 73 → 10 taken 30 times.
✓ Branch 73 → 74 taken 30 times.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 44 → 8 taken 300 times.
✓ Branch 44 → 45 taken 299 times.
✓ Branch 73 → 10 taken 300 times.
✓ Branch 73 → 74 taken 299 times.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 44 → 8 taken 48 times.
✓ Branch 44 → 45 taken 48 times.
✓ Branch 73 → 10 taken 48 times.
✓ Branch 73 → 74 taken 48 times.
10479 for (int i=0;pars[i];i++)
981 {
982
16/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 9 → 10 taken 90 times.
✓ Branch 9 → 25 taken 2314 times.
✓ Branch 14 → 15 taken 93 times.
✓ Branch 14 → 35 taken 2425 times.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 25 taken 27 times.
✓ Branch 14 → 15 taken 3 times.
✓ Branch 14 → 35 taken 27 times.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 25 taken 297 times.
✓ Branch 14 → 15 taken 3 times.
✓ Branch 14 → 35 taken 297 times.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 9 → 10 taken 15 times.
✓ Branch 9 → 25 taken 33 times.
✓ Branch 14 → 15 taken 15 times.
✓ Branch 14 → 35 taken 33 times.
5678 if (pars[i][0]=='"') {
983
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 11 → 12 taken 90 times.
✗ Branch 11 → 49 not taken.
✓ Branch 18 → 19 taken 93 times.
✗ Branch 18 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 49 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 49 not taken.
✓ Branch 18 → 19 taken 3 times.
✗ Branch 18 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 11 → 12 taken 15 times.
✗ Branch 11 → 49 not taken.
✓ Branch 18 → 19 taken 15 times.
✗ Branch 18 → 80 not taken.
225 const char * str = safedequote(pars[i]);
984 225 int codepoint = 0u;
985
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 12 → 13 taken 90 times.
✗ Branch 12 → 49 not taken.
✓ Branch 20 → 21 taken 93 times.
✗ Branch 20 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 49 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 49 not taken.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 12 → 13 taken 15 times.
✗ Branch 12 → 49 not taken.
✓ Branch 20 → 21 taken 15 times.
✗ Branch 20 → 80 not taken.
225 str += utf8_val(&codepoint, str);
986
24/32
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 18 → 19 taken 402 times.
✓ Branch 18 → 20 taken 90 times.
✓ Branch 19 → 14 taken 402 times.
✗ Branch 19 → 20 not taken.
✓ Branch 28 → 29 taken 420 times.
✓ Branch 28 → 30 taken 93 times.
✓ Branch 29 → 23 taken 420 times.
✗ Branch 29 → 30 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 18 → 19 taken 12 times.
✓ Branch 18 → 20 taken 3 times.
✓ Branch 19 → 14 taken 12 times.
✗ Branch 19 → 20 not taken.
✓ Branch 28 → 29 taken 12 times.
✓ Branch 28 → 30 taken 3 times.
✓ Branch 29 → 23 taken 12 times.
✗ Branch 29 → 30 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 18 → 19 taken 12 times.
✓ Branch 18 → 20 taken 3 times.
✓ Branch 19 → 14 taken 12 times.
✗ Branch 19 → 20 not taken.
✓ Branch 28 → 29 taken 12 times.
✓ Branch 28 → 30 taken 3 times.
✓ Branch 29 → 23 taken 12 times.
✗ Branch 29 → 30 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 18 → 19 taken 24 times.
✓ Branch 18 → 20 taken 15 times.
✓ Branch 19 → 14 taken 24 times.
✗ Branch 19 → 20 not taken.
✓ Branch 28 → 29 taken 24 times.
✓ Branch 28 → 30 taken 15 times.
✓ Branch 29 → 23 taken 24 times.
✗ Branch 29 → 30 not taken.
1143 while ( codepoint != 0 && codepoint != -1 )
987 {
988
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 14 → 15 taken 402 times.
✗ Branch 14 → 49 not taken.
✓ Branch 23 → 24 taken 420 times.
✗ Branch 23 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 14 → 15 taken 12 times.
✗ Branch 14 → 49 not taken.
✓ Branch 23 → 24 taken 12 times.
✗ Branch 23 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 14 → 15 taken 12 times.
✗ Branch 14 → 49 not taken.
✓ Branch 23 → 24 taken 12 times.
✗ Branch 23 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 14 → 15 taken 24 times.
✗ Branch 14 → 49 not taken.
✓ Branch 23 → 24 taken 24 times.
✗ Branch 23 → 80 not taken.
918 do_write(thetable.get_val(codepoint));
989
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 16 → 17 taken 402 times.
✗ Branch 16 → 49 not taken.
✓ Branch 25 → 26 taken 420 times.
✗ Branch 25 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 16 → 17 taken 12 times.
✗ Branch 16 → 49 not taken.
✓ Branch 25 → 26 taken 12 times.
✗ Branch 25 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 16 → 17 taken 12 times.
✗ Branch 16 → 49 not taken.
✓ Branch 25 → 26 taken 12 times.
✗ Branch 25 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 16 → 17 taken 24 times.
✗ Branch 16 → 49 not taken.
✓ Branch 25 → 26 taken 24 times.
✗ Branch 25 → 80 not taken.
918 str += utf8_val(&codepoint, str);
990 }
991
8/32
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 90 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 49 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 93 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 3 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 49 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 3 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 3 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 49 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 3 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 80 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 15 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 49 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 15 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 80 not taken.
225 if (codepoint == -1) throw_err_block(0, err_invalid_utf8);
992 } else {
993
121/184
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 27 → 28 taken 762 times.
✓ Branch 27 → 50 taken 8 times.
✓ Branch 30 → 31 taken 758 times.
✓ Branch 30 → 50 taken 4 times.
✓ Branch 35 → 36 taken 758 times.
✓ Branch 35 → 37 taken 1544 times.
✓ Branch 37 → 38 taken 758 times.
✓ Branch 37 → 39 taken 1544 times.
✓ Branch 39 → 40 taken 758 times.
✓ Branch 39 → 41 taken 1544 times.
✓ Branch 41 → 42 taken 799 times.
✓ Branch 41 → 82 taken 8 times.
✓ Branch 49 → 50 taken 795 times.
✓ Branch 49 → 82 taken 4 times.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 12 times.
✓ Branch 51 → 52 taken 795 times.
✗ Branch 51 → 82 not taken.
✓ Branch 54 → 55 taken 4 times.
✓ Branch 54 → 56 taken 8 times.
✓ Branch 55 → 56 taken 795 times.
✓ Branch 55 → 57 taken 1618 times.
✓ Branch 57 → 58 taken 795 times.
✓ Branch 57 → 59 taken 1618 times.
✓ Branch 58 → 59 taken 4 times.
✓ Branch 58 → 60 taken 8 times.
✓ Branch 59 → 60 taken 795 times.
✓ Branch 59 → 61 taken 1618 times.
✓ Branch 61 → 62 taken 795 times.
✓ Branch 61 → 63 taken 1618 times.
✓ Branch 63 → 64 taken 795 times.
✓ Branch 63 → 65 taken 1618 times.
✓ Branch 65 → 66 taken 1618 times.
✓ Branch 65 → 67 taken 795 times.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 12 times.
✓ Branch 85 → 86 taken 12 times.
✗ Branch 85 → 87 not taken.
✓ Branch 88 → 89 taken 4 times.
✓ Branch 88 → 90 taken 8 times.
✓ Branch 91 → 92 taken 4 times.
✓ Branch 91 → 93 taken 8 times.
✓ Branch 94 → 95 taken 4 times.
✓ Branch 94 → 96 taken 8 times.
✗ Branch 97 → 98 not taken.
✓ Branch 97 → 99 taken 12 times.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 27 → 28 taken 8 times.
✗ Branch 27 → 50 not taken.
✓ Branch 30 → 31 taken 8 times.
✗ Branch 30 → 50 not taken.
✓ Branch 35 → 36 taken 8 times.
✓ Branch 35 → 37 taken 19 times.
✓ Branch 37 → 38 taken 8 times.
✓ Branch 37 → 39 taken 19 times.
✓ Branch 39 → 40 taken 8 times.
✓ Branch 39 → 41 taken 19 times.
✓ Branch 41 → 42 taken 8 times.
✗ Branch 41 → 82 not taken.
✓ Branch 49 → 50 taken 8 times.
✗ Branch 49 → 82 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
✓ Branch 51 → 52 taken 8 times.
✗ Branch 51 → 82 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
✓ Branch 55 → 56 taken 8 times.
✓ Branch 55 → 57 taken 19 times.
✓ Branch 57 → 58 taken 8 times.
✓ Branch 57 → 59 taken 19 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
✓ Branch 59 → 60 taken 8 times.
✓ Branch 59 → 61 taken 19 times.
✓ Branch 61 → 62 taken 8 times.
✓ Branch 61 → 63 taken 19 times.
✓ Branch 63 → 64 taken 8 times.
✓ Branch 63 → 65 taken 19 times.
✓ Branch 65 → 66 taken 19 times.
✓ Branch 65 → 67 taken 8 times.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 84 not taken.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 87 not taken.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 90 not taken.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 93 not taken.
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 96 not taken.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 99 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 27 → 28 taken 99 times.
✗ Branch 27 → 50 not taken.
✓ Branch 30 → 31 taken 98 times.
✓ Branch 30 → 50 taken 1 time.
✓ Branch 35 → 36 taken 98 times.
✓ Branch 35 → 37 taken 198 times.
✓ Branch 37 → 38 taken 98 times.
✓ Branch 37 → 39 taken 198 times.
✓ Branch 39 → 40 taken 98 times.
✓ Branch 39 → 41 taken 198 times.
✓ Branch 41 → 42 taken 99 times.
✗ Branch 41 → 82 not taken.
✓ Branch 49 → 50 taken 98 times.
✓ Branch 49 → 82 taken 1 time.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 1 time.
✓ Branch 51 → 52 taken 98 times.
✗ Branch 51 → 82 not taken.
✓ Branch 54 → 55 taken 1 time.
✗ Branch 54 → 56 not taken.
✓ Branch 55 → 56 taken 98 times.
✓ Branch 55 → 57 taken 198 times.
✓ Branch 57 → 58 taken 98 times.
✓ Branch 57 → 59 taken 198 times.
✓ Branch 58 → 59 taken 1 time.
✗ Branch 58 → 60 not taken.
✓ Branch 59 → 60 taken 98 times.
✓ Branch 59 → 61 taken 198 times.
✓ Branch 61 → 62 taken 98 times.
✓ Branch 61 → 63 taken 198 times.
✓ Branch 63 → 64 taken 98 times.
✓ Branch 63 → 65 taken 198 times.
✓ Branch 65 → 66 taken 198 times.
✓ Branch 65 → 67 taken 98 times.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 1 time.
✓ Branch 85 → 86 taken 1 time.
✗ Branch 85 → 87 not taken.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 90 not taken.
✓ Branch 91 → 92 taken 1 time.
✗ Branch 91 → 93 not taken.
✓ Branch 94 → 95 taken 1 time.
✗ Branch 94 → 96 not taken.
✗ Branch 97 → 98 not taken.
✓ Branch 97 → 99 taken 1 time.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 27 → 28 taken 11 times.
✗ Branch 27 → 50 not taken.
✓ Branch 30 → 31 taken 11 times.
✗ Branch 30 → 50 not taken.
✓ Branch 35 → 36 taken 11 times.
✓ Branch 35 → 37 taken 22 times.
✓ Branch 37 → 38 taken 11 times.
✓ Branch 37 → 39 taken 22 times.
✓ Branch 39 → 40 taken 11 times.
✓ Branch 39 → 41 taken 22 times.
✓ Branch 41 → 42 taken 11 times.
✗ Branch 41 → 82 not taken.
✓ Branch 49 → 50 taken 11 times.
✗ Branch 49 → 82 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
✓ Branch 51 → 52 taken 11 times.
✗ Branch 51 → 82 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
✓ Branch 55 → 56 taken 11 times.
✓ Branch 55 → 57 taken 22 times.
✓ Branch 57 → 58 taken 11 times.
✓ Branch 57 → 59 taken 22 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
✓ Branch 59 → 60 taken 11 times.
✓ Branch 59 → 61 taken 22 times.
✓ Branch 61 → 62 taken 11 times.
✓ Branch 61 → 63 taken 22 times.
✓ Branch 63 → 64 taken 11 times.
✓ Branch 63 → 65 taken 22 times.
✓ Branch 65 → 66 taken 22 times.
✓ Branch 65 → 67 taken 11 times.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 84 not taken.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 87 not taken.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 90 not taken.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 93 not taken.
✗ Branch 94 → 95 not taken.
✗ Branch 94 → 96 not taken.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 99 not taken.
10066 do_write((pass==2) ? parse_math_expr(pars[i])->evaluate().get_integer() : 0);
994 }
995 }
996
8/16
void (anonymous namespace)::cmd_write_data<&(write1(unsigned int))>(char const*):
✓ Branch 45 → 46 taken 1986 times.
✗ Branch 45 → 62 not taken.
✓ Branch 74 → 75 taken 2061 times.
✗ Branch 74 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write2(unsigned int))>(char const*):
✓ Branch 45 → 46 taken 30 times.
✗ Branch 45 → 62 not taken.
✓ Branch 74 → 75 taken 30 times.
✗ Branch 74 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write3(unsigned int))>(char const*):
✓ Branch 45 → 46 taken 299 times.
✗ Branch 45 → 62 not taken.
✓ Branch 74 → 75 taken 299 times.
✗ Branch 74 → 102 not taken.
void (anonymous namespace)::cmd_write_data<&(write4(unsigned int))>(char const*):
✓ Branch 45 → 46 taken 48 times.
✗ Branch 45 → 62 not taken.
✓ Branch 74 → 75 taken 48 times.
✗ Branch 74 → 102 not taken.
4801 add_addr_to_line(addrToLinePos);
997 9088 }
998
999 366 void cmd_assert(const char* par) {
1000
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 180 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 186 times.
366 if(!*par) {
1001 throw_err_block(0, err_broken_command, "assert", "Missing condition.");
1002 }
1003 // todo optimize after adding some math helpers
1004
2/4
✓ Branch 6 → 7 taken 180 times.
✗ Branch 6 → 63 not taken.
✓ Branch 7 → 8 taken 186 times.
✗ Branch 7 → 89 not taken.
366 const char* message_start = strqpchr(par, ',');
1005
1006 366 string cond_str;
1007
4/4
✓ Branch 8 → 9 taken 15 times.
✓ Branch 8 → 11 taken 165 times.
✓ Branch 10 → 11 taken 15 times.
✓ Branch 10 → 14 taken 171 times.
366 if(message_start) {
1008
2/4
✓ Branch 9 → 10 taken 15 times.
✗ Branch 9 → 61 not taken.
✓ Branch 11 → 12 taken 15 times.
✗ Branch 11 → 87 not taken.
30 cond_str.assign(par, message_start - par);
1009 30 message_start++; // eat the comma
1010 } else {
1011
2/4
✓ Branch 11 → 12 taken 165 times.
✗ Branch 11 → 61 not taken.
✓ Branch 14 → 15 taken 171 times.
✗ Branch 14 → 87 not taken.
336 cond_str = par;
1012 }
1013
1014
4/4
✓ Branch 12 → 13 taken 120 times.
✓ Branch 12 → 14 taken 60 times.
✓ Branch 15 → 16 taken 124 times.
✓ Branch 15 → 17 taken 62 times.
366 if(pass != 2) return;
1015
1016
8/12
✓ Branch 15 → 16 taken 60 times.
✗ Branch 15 → 50 not taken.
✓ Branch 18 → 19 taken 47 times.
✓ Branch 18 → 45 taken 13 times.
✓ Branch 19 → 20 taken 47 times.
✗ Branch 19 → 43 not taken.
✓ Branch 20 → 21 taken 62 times.
✗ Branch 20 → 71 not taken.
✓ Branch 28 → 29 taken 49 times.
✓ Branch 28 → 65 taken 13 times.
✓ Branch 30 → 31 taken 49 times.
✗ Branch 30 → 63 not taken.
322 bool cond = parse_math_expr(cond_str)->evaluate().get_bool();
1017
1018
4/4
✓ Branch 23 → 24 taken 6 times.
✓ Branch 23 → 36 taken 41 times.
✓ Branch 37 → 38 taken 6 times.
✓ Branch 37 → 55 taken 43 times.
96 if(!cond) {
1019
12/20
✓ Branch 24 → 25 taken 3 times.
✓ Branch 24 → 33 taken 3 times.
✓ Branch 25 → 26 taken 3 times.
✗ Branch 25 → 59 not taken.
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 56 not taken.
✓ Branch 28 → 29 taken 3 times.
✗ Branch 28 → 54 not taken.
✓ Branch 30 → 31 taken 3 times.
✗ Branch 30 → 52 not taken.
✓ Branch 38 → 39 taken 3 times.
✓ Branch 38 → 52 taken 3 times.
✓ Branch 41 → 42 taken 3 times.
✗ Branch 41 → 83 not taken.
✓ Branch 45 → 46 taken 3 times.
✗ Branch 45 → 79 not taken.
✓ Branch 46 → 47 taken 3 times.
✗ Branch 46 → 77 not taken.
✓ Branch 49 → 50 taken 3 times.
✗ Branch 49 → 75 not taken.
36 if (message_start) throw_err_block(2, err_assertion_failed, (string(": ") + handle_print(message_start)).data());
1020
2/4
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 61 not taken.
✓ Branch 52 → 53 taken 3 times.
✗ Branch 52 → 87 not taken.
6 else throw_err_block(2, err_assertion_failed, ".");
1021 }
1022
4/4
✓ Branch 38 → 39 taken 41 times.
✓ Branch 38 → 41 taken 120 times.
✓ Branch 57 → 58 taken 43 times.
✓ Branch 57 → 59 taken 124 times.
488 }
1023
1024 120 void cmd_undef(const char* par) {
1025
2/4
✓ Branch 2 → 3 taken 60 times.
✗ Branch 2 → 29 not taken.
✓ Branch 3 → 4 taken 60 times.
✗ Branch 3 → 36 not taken.
120 string temp = par;
1026
4/8
✓ Branch 4 → 5 taken 60 times.
✗ Branch 4 → 27 not taken.
✓ Branch 5 → 6 taken 60 times.
✗ Branch 5 → 27 not taken.
✓ Branch 6 → 7 taken 60 times.
✗ Branch 6 → 34 not taken.
✓ Branch 7 → 8 taken 60 times.
✗ Branch 7 → 34 not taken.
120 string def = safedequote(temp.raw());
1027
4/8
✓ Branch 7 → 8 taken 60 times.
✗ Branch 7 → 25 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 13 taken 60 times.
✓ Branch 10 → 11 taken 60 times.
✗ Branch 10 → 32 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 16 taken 60 times.
120 if (builtindefines.exists(def)) {
1028 throw_err_line(0, err_overriding_builtin_define, def.data());
1029 }
1030
1031
6/8
✓ Branch 14 → 15 taken 60 times.
✗ Branch 14 → 25 not taken.
✓ Branch 15 → 16 taken 57 times.
✓ Branch 15 → 18 taken 3 times.
✓ Branch 18 → 19 taken 60 times.
✗ Branch 18 → 32 not taken.
✓ Branch 19 → 20 taken 57 times.
✓ Branch 19 → 23 taken 3 times.
120 if (defines.exists(def)) {
1032
2/4
✓ Branch 17 → 22 taken 57 times.
✗ Branch 17 → 25 not taken.
✓ Branch 22 → 27 taken 57 times.
✗ Branch 22 → 32 not taken.
114 defines.remove(def);
1033 } else {
1034
2/4
✓ Branch 19 → 20 taken 3 times.
✗ Branch 19 → 25 not taken.
✓ Branch 24 → 25 taken 3 times.
✗ Branch 24 → 32 not taken.
6 throw_err_block(0, err_define_not_found, def.data());
1035 }
1036 183 }
1037
1038 21 void cmd_error(const char* par) {
1039
4/4
✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 6 taken 6 times.
✓ Branch 3 → 4 taken 3 times.
✓ Branch 3 → 7 taken 9 times.
21 if(!*par)
1040
2/4
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 22 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 29 not taken.
6 throw_err_block(0, err_error_command, ".");
1041
2/4
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 22 not taken.
✓ Branch 8 → 9 taken 9 times.
✗ Branch 8 → 29 not taken.
15 string out = handle_print(par);
1042
6/12
✓ Branch 8 → 9 taken 6 times.
✗ Branch 8 → 18 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 16 not taken.
✓ Branch 11 → 12 taken 6 times.
✗ Branch 11 → 14 not taken.
✓ Branch 12 → 13 taken 9 times.
✗ Branch 12 → 23 not taken.
✓ Branch 13 → 14 taken 9 times.
✗ Branch 13 → 21 not taken.
✓ Branch 16 → 17 taken 9 times.
✗ Branch 16 → 19 not taken.
54 throw_err_block(2, err_error_command, (string(": ") + out).data());
1043 15 }
1044
1045 33 void cmd_warn(const char* par) {
1046
4/4
✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 5 taken 12 times.
✓ Branch 3 → 4 taken 3 times.
✓ Branch 3 → 6 taken 15 times.
33 if(!*par) {
1047
2/4
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 24 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 34 not taken.
6 throw_warning(0, warn_warn_command, ".");
1048 6 return;
1049 }
1050
2/4
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 24 not taken.
✓ Branch 7 → 8 taken 15 times.
✗ Branch 7 → 34 not taken.
27 string out = handle_print(par);
1051
6/12
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 20 not taken.
✓ Branch 8 → 9 taken 12 times.
✗ Branch 8 → 18 not taken.
✓ Branch 10 → 11 taken 12 times.
✗ Branch 10 → 16 not taken.
✓ Branch 11 → 12 taken 15 times.
✗ Branch 11 → 28 not taken.
✓ Branch 12 → 13 taken 15 times.
✗ Branch 12 → 26 not taken.
✓ Branch 15 → 16 taken 15 times.
✗ Branch 15 → 24 not taken.
27 throw_warning(2, warn_warn_command, (string(": ") + out).data());
1052 27 }
1053
1054 132 void cmd_warnings(char** words, int numwords) {
1055
11/11
✓ Branch 2 → 3 taken 48 times.
✓ Branch 2 → 6 taken 42 times.
✓ Branch 2 → 7 taken 42 times.
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 6 taken 12 times.
✓ Branch 5 → 6 taken 12 times.
✓ Branch 5 → 7 taken 12 times.
✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 54 times.
✓ Branch 8 → 9 taken 12 times.
✓ Branch 8 → 10 taken 54 times.
132 if(numwords == 1 && !stricmpwithlower(words[0], "push")) {
1056 24 push_warnings();
1057
10/12
✓ Branch 9 → 10 taken 12 times.
✓ Branch 9 → 13 taken 42 times.
✓ Branch 10 → 11 taken 12 times.
✓ Branch 10 → 15 taken 42 times.
✓ Branch 11 → 12 taken 12 times.
✗ Branch 11 → 13 not taken.
✓ Branch 13 → 14 taken 12 times.
✗ Branch 13 → 15 not taken.
✓ Branch 14 → 15 taken 12 times.
✓ Branch 14 → 16 taken 42 times.
✓ Branch 16 → 17 taken 12 times.
✓ Branch 16 → 18 taken 42 times.
108 } else if(numwords == 1 && !stricmpwithlower(words[0], "pull")) {
1058 24 pull_warnings();
1059
8/10
✓ Branch 16 → 17 taken 42 times.
✗ Branch 16 → 20 not taken.
✓ Branch 18 → 19 taken 51 times.
✓ Branch 18 → 20 taken 33 times.
✗ Branch 18 → 23 not taken.
✓ Branch 21 → 22 taken 18 times.
✓ Branch 21 → 23 taken 33 times.
✓ Branch 21 → 26 taken 33 times.
✓ Branch 24 → 25 taken 9 times.
✓ Branch 24 → 33 taken 33 times.
84 } else if(numwords == 2 && !stricmpwithlower(words[0], "enable")) {
1060 18 asar_warning_id warnid = parse_warning_id_from_string(words[1]);
1061
1062
4/4
✓ Branch 23 → 24 taken 6 times.
✓ Branch 23 → 25 taken 3 times.
✓ Branch 28 → 29 taken 6 times.
✓ Branch 28 → 30 taken 3 times.
18 if (warnid != warning_id_end) {
1063 12 set_warning_enabled(warnid, true);
1064 } else {
1065 6 throw_warning(0, warn_invalid_warning_id, words[1], "warnings enable");
1066 }
1067
6/12
✓ Branch 26 → 27 taken 33 times.
✗ Branch 26 → 30 not taken.
✓ Branch 28 → 29 taken 33 times.
✗ Branch 28 → 30 not taken.
✓ Branch 31 → 32 taken 33 times.
✗ Branch 31 → 36 not taken.
✓ Branch 33 → 34 taken 33 times.
✗ Branch 33 → 38 not taken.
✓ Branch 36 → 37 taken 33 times.
✗ Branch 36 → 38 not taken.
✓ Branch 39 → 40 taken 33 times.
✗ Branch 39 → 48 not taken.
66 } else if(numwords == 2 && !stricmpwithlower(words[0], "disable")) {
1068 66 asar_warning_id warnid = parse_warning_id_from_string(words[1]);
1069
1070
4/4
✓ Branch 33 → 34 taken 27 times.
✓ Branch 33 → 35 taken 6 times.
✓ Branch 43 → 44 taken 27 times.
✓ Branch 43 → 45 taken 6 times.
66 if (warnid != warning_id_end) {
1071 54 set_warning_enabled(warnid, false);
1072 } else {
1073 12 throw_warning(0, warn_invalid_warning_id, words[1], "warnings disable");
1074 }
1075 } else {
1076 throw_err_block(0, err_broken_command, "warnings", "Unknown parameter");
1077 }
1078 126 }
1079
1080 42 void cmd_global(const char* par) {
1081
2/2
✓ Branch 3 → 4 taken 12 times.
✓ Branch 3 → 7 taken 30 times.
42 if(!addlabel(par, -1, true)) {
1082 12 throw_err_block(1, err_invalid_global_label, par);
1083 }
1084 30 }
1085
1086 70 void cmd_check(char** words, int numwords) {
1087
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 70 times.
70 if(numwords != 2) throw_err_block(0, err_invalid_check);
1088
1089
4/4
✓ Branch 7 → 8 taken 3 times.
✓ Branch 7 → 59 taken 32 times.
✓ Branch 8 → 9 taken 3 times.
✓ Branch 8 → 80 taken 32 times.
70 if(!stricmpwithlower(words[0], "title")) {
1090 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1091 // better here (not sure, though, it's worth discussing)
1092
4/8
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 84 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 84 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 114 not taken.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 114 not taken.
6 string expected_title = safedequote(words[1]);
1093 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1094
8/15
✓ Branch 10 → 11 taken 3 times.
✗ Branch 10 → 12 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 3 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 3 times.
✓ Branch 14 → 22 taken 3 times.
✓ Branch 16 → 17 taken 3 times.
✗ Branch 16 → 20 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 3 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 3 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 32 taken 3 times.
6 if (romlen < ((mapper == hirom || mapper == exhirom) ? 0x10000 : 0x8000)) // too short
1095 {
1096 if (!ignoretitleerrors) // title errors shouldn't be ignored
1097 throw_err_block(0, err_rom_too_short, expected_title.data());
1098 else // title errors should be ignored, throw a warning anyways
1099 throw_warning(0, warn_rom_too_short, expected_title.data());
1100 } else {
1101 6 string actual_title;
1102 6 string actual_display_title;
1103
4/4
✓ Branch 41 → 25 taken 63 times.
✓ Branch 41 → 42 taken 3 times.
✓ Branch 55 → 37 taken 63 times.
✓ Branch 55 → 56 taken 3 times.
132 for (int i = 0;i < 21;i++)
1104 {
1105 126 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1106
2/4
✓ Branch 26 → 27 taken 63 times.
✗ Branch 26 → 77 not taken.
✓ Branch 40 → 41 taken 63 times.
✗ Branch 40 → 105 not taken.
126 actual_title += (char)c;
1107 // the replacements are from interface-cli.cpp
1108
2/4
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 63 times.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 63 times.
126 if (c == 7) c = 14;
1109
2/4
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 63 times.
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 63 times.
126 if (c == 8) c = 27;
1110
2/4
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 63 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 63 times.
126 if (c == 9) c = 26;
1111
2/4
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 35 taken 63 times.
✗ Branch 47 → 48 not taken.
✓ Branch 47 → 49 taken 63 times.
126 if (c == '\r') c = 17;
1112
2/4
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 63 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 63 times.
126 if (c == '\n') c = 25;
1113
2/4
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 63 times.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 63 times.
126 if (c == '\0') c = 155;
1114
2/4
✓ Branch 39 → 40 taken 63 times.
✗ Branch 39 → 77 not taken.
✓ Branch 53 → 54 taken 63 times.
✗ Branch 53 → 105 not taken.
126 actual_display_title += (char)c;
1115 }
1116
4/8
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 54 taken 3 times.
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 3 times.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 62 taken 3 times.
✗ Branch 62 → 63 not taken.
✓ Branch 62 → 74 taken 3 times.
6 if (strncmp(expected_title, actual_title, 21) != 0)
1117 {
1118 if (!ignoretitleerrors) // title errors shouldn't be ignored
1119 throw_err_block(0, err_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1120 else // title errors should be ignored, throw a warning anyways
1121 throw_warning(0, warn_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1122 }
1123 6 }
1124
2/4
✓ Branch 60 → 61 taken 32 times.
✗ Branch 60 → 73 not taken.
✓ Branch 82 → 83 taken 32 times.
✗ Branch 82 → 101 not taken.
70 } else if(!stricmpwithlower(words[0], "bankcross")) {
1125
4/4
✓ Branch 62 → 63 taken 15 times.
✓ Branch 62 → 64 taken 17 times.
✓ Branch 86 → 87 taken 15 times.
✓ Branch 86 → 88 taken 17 times.
64 if(!stricmpwithlower(words[1], "off")) {
1126 30 disable_bank_cross_errors = true;
1127
4/4
✓ Branch 65 → 66 taken 16 times.
✓ Branch 65 → 67 taken 1 time.
✓ Branch 91 → 92 taken 16 times.
✓ Branch 91 → 93 taken 1 time.
34 } else if(!stricmpwithlower(words[1], "half")) {
1128 32 disable_bank_cross_errors = false;
1129 32 check_half_banks_crossed = true;
1130
2/4
✓ Branch 68 → 69 taken 1 time.
✗ Branch 68 → 70 not taken.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 98 not taken.
2 } else if(!stricmpwithlower(words[1], "full")) {
1131 2 disable_bank_cross_errors = false;
1132 2 check_half_banks_crossed = false;
1133 } else {
1134 throw_err_block(0, err_invalid_check);
1135 }
1136 } else {
1137 throw_err_block(0, err_invalid_check);
1138 }
1139 70 }
1140
1141 36 void cmd_asar(const char* par) {
1142
3/10
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 18 times.
✓ Branch 2 → 6 taken 18 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 79 not taken.
✗ Branch 3 → 83 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 18 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 111 not taken.
36 if(!asarverallowed) throw_err_block(0, err_start_of_file);
1143
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 18 times.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 18 times.
51 if(!*par) return;
1144 36 int dots = 0;
1145 36 int dig = 0;
1146
4/4
✓ Branch 22 → 9 taken 75 times.
✓ Branch 22 → 23 taken 18 times.
✓ Branch 31 → 12 taken 75 times.
✓ Branch 31 → 32 taken 18 times.
186 for (int i=0;par[i];i++)
1147 {
1148
4/4
✓ Branch 9 → 10 taken 21 times.
✓ Branch 9 → 15 taken 54 times.
✓ Branch 14 → 15 taken 21 times.
✓ Branch 14 → 20 taken 54 times.
150 if (par[i]=='.')
1149 {
1150
2/9
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 21 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 79 not taken.
✗ Branch 11 → 83 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 21 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 111 not taken.
42 if (!dig) throw_err_block(0, err_invalid_version_number);
1151 42 dig=0;
1152 42 dots++;
1153 }
1154
2/4
✓ Branch 16 → 17 taken 54 times.
✗ Branch 16 → 18 not taken.
✓ Branch 23 → 24 taken 54 times.
✗ Branch 23 → 25 not taken.
108 else if (is_digit(par[i])) dig++;
1155 else throw_err_block(0, err_invalid_version_number);
1156 }
1157
6/17
✓ Branch 23 → 24 taken 18 times.
✗ Branch 23 → 26 not taken.
✓ Branch 24 → 25 taken 18 times.
✗ Branch 24 → 26 not taken.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 18 times.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 79 not taken.
✗ Branch 26 → 83 not taken.
✓ Branch 32 → 33 taken 18 times.
✗ Branch 32 → 35 not taken.
✓ Branch 33 → 34 taken 18 times.
✗ Branch 33 → 35 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 38 taken 18 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 111 not taken.
36 if (!dig || !dots || dots>2) throw_err_block(0, err_invalid_version_number);
1158
2/5
✓ Branch 29 → 30 taken 18 times.
✗ Branch 29 → 79 not taken.
✗ Branch 29 → 83 not taken.
✓ Branch 39 → 40 taken 18 times.
✗ Branch 39 → 111 not taken.
36 string vers_buf = par;
1159
2/5
✓ Branch 31 → 32 taken 18 times.
✗ Branch 31 → 77 not taken.
✗ Branch 31 → 81 not taken.
✓ Branch 42 → 43 taken 18 times.
✗ Branch 42 → 109 not taken.
36 autoptr<char**> vers = split(vers_buf.raw(), '.');
1160
1/2
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 18 times.
36 int vermaj=atoi(vers[0]);
1161
2/11
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 38 not taken.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 39 taken 18 times.
✗ Branch 35 → 75 not taken.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 79 not taken.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 52 taken 18 times.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 107 not taken.
36 if (vermaj > asarver_maj) throw_err_fatal(pass, err_asar_too_old);
1162
4/6
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✓ Branch 39 → 40 taken 15 times.
✓ Branch 39 → 41 taken 3 times.
✓ Branch 52 → 53 taken 15 times.
✓ Branch 52 → 54 taken 3 times.
36 if (vermaj < asarver_maj) return;
1163
2/6
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 53 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 55 taken 3 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 75 taken 3 times.
6 if (dots==1) {
1164 // todo: probably want to allow some more stuff here (it bans "asar 2.0" right now)
1165 if (strlen(vers[1])!=2) throw_err_block(0, err_invalid_version_number);
1166 int verminbug=atoi(vers[1]);
1167 int tmpver=asarver_bug;
1168 if (tmpver>9) tmpver=9;
1169 if (asarver_min*10+tmpver<verminbug) throw_err_fatal(pass, err_asar_too_old);
1170 } else {
1171
1/2
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 3 times.
6 int vermin = atoi(vers[1]);
1172
2/12
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 58 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 75 not taken.
✗ Branch 57 → 58 not taken.
✓ Branch 57 → 61 taken 3 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 79 not taken.
✗ Branch 80 → 81 not taken.
✓ Branch 80 → 84 taken 3 times.
✗ Branch 81 → 82 not taken.
✗ Branch 81 → 107 not taken.
6 if (vermin > asarver_min) throw_err_fatal(pass, err_asar_too_old);
1173
1/2
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 3 times.
6 int verbug = atoi(vers[2]);
1174
4/18
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 64 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 64 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 75 not taken.
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 68 not taken.
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 68 taken 3 times.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 79 not taken.
✓ Branch 89 → 90 taken 3 times.
✗ Branch 89 → 94 not taken.
✗ Branch 90 → 91 not taken.
✓ Branch 90 → 94 taken 3 times.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 107 not taken.
6 if (vermin == asarver_min && verbug > asarver_bug) throw_err_fatal(pass, err_asar_too_old);
1175 }
1176
8/11
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 68 not taken.
✓ Branch 70 → 71 taken 3 times.
✓ Branch 70 → 72 taken 15 times.
✗ Branch 70 → 73 not taken.
✓ Branch 74 → 75 taken 3 times.
✓ Branch 74 → 77 taken 15 times.
✓ Branch 96 → 97 taken 3 times.
✓ Branch 96 → 98 taken 15 times.
✓ Branch 100 → 101 taken 3 times.
✓ Branch 100 → 102 taken 15 times.
66 }
1177
1178 2 void cmd_include(const char* par) {
1179
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
✓ Branch 2 → 6 taken 1 time.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 1 time.
2 if(!asarverallowed) throw_err_block(0, err_start_of_file);
1180
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 1 time.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 1 time.
2 if(*par) throw_err_block(0, err_broken_command, "include", "");
1181
2/4
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 15 not taken.
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 18 not taken.
2 if(in_top_level_file()) throw_err_fatal(pass, err_cant_be_main_file, "");
1182 }
1183
1184 6 void cmd_includefrom(const char* par) {
1185
3/5
✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 4 taken 3 times.
✗ Branch 2 → 6 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 8 not taken.
6 if(!asarverallowed) throw_err_block(0, err_start_of_file);
1186 if(!*par) throw_err_block(0, err_broken_command, "include", "");
1187 if(in_top_level_file()) throw_err_fatal(pass, err_cant_be_main_file, (string(" The main file is '") + par + "'.").data());
1188 }
1189
1190 30 void cmd_includeonce(const char* par) {
1191
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 15 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 15 times.
30 if(*par) throw_err_block(0, err_broken_command, "includeonce", "");
1192
1193 30 const char* current_file = get_current_file_name();
1194
2/4
✓ Branch 8 → 9 taken 15 times.
✗ Branch 8 → 13 not taken.
✓ Branch 9 → 10 taken 15 times.
✗ Branch 9 → 16 not taken.
30 if (!file_included_once(current_file))
1195 {
1196
4/8
✓ Branch 9 → 10 taken 15 times.
✗ Branch 9 → 16 not taken.
✓ Branch 10 → 11 taken 15 times.
✗ Branch 10 → 14 not taken.
✓ Branch 11 → 12 taken 15 times.
✗ Branch 11 → 19 not taken.
✓ Branch 13 → 14 taken 15 times.
✗ Branch 13 → 17 not taken.
30 includeonce.append(current_file);
1197 }
1198 30 }
1199
1200 906 void cmd_org(const char* par) {
1201
3/9
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 489 times.
✓ Branch 2 → 6 taken 417 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 33 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 489 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 48 not taken.
906 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1202
2/4
✓ Branch 6 → 7 taken 417 times.
✗ Branch 6 → 33 not taken.
✓ Branch 8 → 9 taken 489 times.
✗ Branch 8 → 48 not taken.
906 freespaceend();
1203
2/4
✓ Branch 7 → 8 taken 417 times.
✗ Branch 7 → 33 not taken.
✓ Branch 10 → 11 taken 489 times.
✗ Branch 10 → 48 not taken.
906 auto math_expr = parse_math_expr(par);
1204
6/8
✓ Branch 9 → 10 taken 416 times.
✓ Branch 9 → 27 taken 1 time.
✓ Branch 10 → 11 taken 416 times.
✗ Branch 10 → 25 not taken.
✓ Branch 13 → 14 taken 488 times.
✓ Branch 13 → 40 taken 1 time.
✓ Branch 15 → 16 taken 488 times.
✗ Branch 15 → 38 not taken.
906 int64_t num = math_expr->evaluate_non_forward().get_integer();
1205
2/12
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 18 taken 416 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 30 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 28 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 26 taken 488 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 44 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 42 not taken.
904 if (num&~0xFFFFFF) throw_err_block(1, err_snes_address_out_of_bounds, hex(num, 6).data());
1206
12/24
✓ Branch 18 → 19 taken 138 times.
✓ Branch 18 → 20 taken 278 times.
✓ Branch 19 → 20 taken 3 times.
✓ Branch 19 → 23 taken 135 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 23 taken 281 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 31 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 488 times.
✓ Branch 28 → 29 taken 150 times.
✓ Branch 28 → 32 taken 338 times.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 150 times.
✓ Branch 31 → 32 taken 3 times.
✓ Branch 31 → 35 taken 147 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 35 taken 341 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 35 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 46 not taken.
904 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) throw_warning(0, warn_set_middle_byte);
1207 904 snespos=(int)num;
1208 904 realsnespos=(int)num;
1209 904 startpos=(int)num;
1210 904 realstartpos=(int)num;
1211 904 snespos_valid = true;
1212 1394 }
1213
1214 114 void cmd_struct(char** words, int numwords) {
1215 //verifysnespos();
1216
6/10
✓ Branch 2 → 3 taken 57 times.
✓ Branch 2 → 4 taken 57 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 57 times.
✓ Branch 4 → 5 taken 57 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 57 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 57 times.
114 if (in_struct || in_sub_struct) throw_err_block(0, err_nested_struct);
1217
2/4
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 57 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 57 times.
114 if (numwords < 1) throw_err_block(0, err_missing_struct_params);
1218
2/4
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 57 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 57 times.
114 if (numwords > 3) throw_err_block(0, err_too_many_struct_params);
1219
2/4
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 57 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 25 taken 57 times.
114 if (!confirmname(words[0])) throw_err_block(0, err_invalid_struct_name);
1220
1221
8/12
✓ Branch 21 → 22 taken 27 times.
✓ Branch 21 → 24 taken 30 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 27 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 57 times.
✓ Branch 27 → 28 taken 27 times.
✓ Branch 27 → 30 taken 30 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 27 times.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 36 taken 57 times.
114 if (structs.exists(words[0]) && pass == 0) throw_err_block(0, err_struct_redefined, words[0]);
1222
1223 114 static_struct = false;
1224 114 old_snespos = snespos;
1225 114 old_startpos = startpos;
1226 114 old_optimizeforbank = optimizeforbank;
1227
1/2
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 57 times.
114 old_snespos_valid = snespos_valid;
1228 114 unsigned int base = 0;
1229
4/4
✓ Branch 29 → 30 taken 24 times.
✓ Branch 29 → 46 taken 33 times.
✓ Branch 38 → 39 taken 24 times.
✓ Branch 38 → 74 taken 33 times.
114 if (numwords == 2)
1230 {
1231 48 static_struct = true;
1232
2/5
✓ Branch 30 → 31 taken 24 times.
✗ Branch 30 → 107 not taken.
✗ Branch 30 → 108 not taken.
✓ Branch 42 → 43 taken 24 times.
✗ Branch 42 → 169 not taken.
48 auto base_expr = parse_math_expr(words[1]);
1233
6/10
✓ Branch 32 → 33 taken 23 times.
✗ Branch 32 → 104 not taken.
✓ Branch 32 → 105 taken 1 time.
✓ Branch 33 → 34 taken 23 times.
✗ Branch 33 → 102 not taken.
✗ Branch 33 → 103 not taken.
✓ Branch 45 → 46 taken 23 times.
✓ Branch 45 → 165 taken 1 time.
✓ Branch 47 → 48 taken 23 times.
✗ Branch 47 → 163 not taken.
48 base = base_expr->evaluate_non_forward().get_integer();
1234
1235
4/9
✓ Branch 36 → 37 taken 23 times.
✗ Branch 36 → 105 not taken.
✗ Branch 36 → 106 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 23 times.
✓ Branch 57 → 58 taken 23 times.
✗ Branch 57 → 167 not taken.
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 23 times.
46 if (base_expr->has_label() > 1) static_struct = false;
1236
4/4
✓ Branch 39 → 40 taken 16 times.
✓ Branch 39 → 44 taken 7 times.
✓ Branch 60 → 61 taken 16 times.
✓ Branch 60 → 72 taken 7 times.
46 if (pass > 0) {
1237 // foundlabel_static isn't accurate anymore
1238
10/18
✓ Branch 40 → 41 taken 16 times.
✗ Branch 40 → 105 not taken.
✗ Branch 40 → 106 not taken.
✓ Branch 41 → 42 taken 15 times.
✓ Branch 41 → 44 taken 1 time.
✓ Branch 42 → 43 taken 15 times.
✗ Branch 42 → 105 not taken.
✗ Branch 42 → 106 not taken.
✓ Branch 62 → 63 taken 16 times.
✗ Branch 62 → 167 not taken.
✓ Branch 63 → 64 taken 15 times.
✓ Branch 63 → 72 taken 1 time.
✓ Branch 65 → 66 taken 15 times.
✗ Branch 65 → 167 not taken.
✗ Branch 67 → 68 not taken.
✓ Branch 67 → 69 taken 15 times.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 71 taken 15 times.
32 if(structs.exists(words[0])) static_struct &= structs.find(words[0]).is_static;
1239 }
1240 48 }
1241
1242
1/2
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 76 taken 56 times.
112 bool old_in_struct = in_struct;
1243
1/2
✗ Branch 76 → 77 not taken.
✓ Branch 76 → 78 taken 56 times.
112 bool old_in_sub_struct = in_sub_struct;
1244
8/8
✓ Branch 46 → 47 taken 38 times.
✓ Branch 46 → 48 taken 18 times.
✓ Branch 47 → 48 taken 23 times.
✓ Branch 47 → 49 taken 15 times.
✓ Branch 78 → 79 taken 38 times.
✓ Branch 78 → 80 taken 18 times.
✓ Branch 79 → 80 taken 23 times.
✓ Branch 79 → 81 taken 15 times.
112 in_struct = numwords == 1 || numwords == 2;
1245 112 in_sub_struct = numwords == 3;
1246
1247 #define cleanup() (in_struct = old_in_struct, in_sub_struct = old_in_sub_struct)
1248
1249
4/4
✓ Branch 50 → 51 taken 23 times.
✓ Branch 50 → 58 taken 33 times.
✓ Branch 82 → 83 taken 23 times.
✓ Branch 82 → 92 taken 33 times.
112 if (numwords == 2)
1250 {
1251
2/14
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 57 taken 23 times.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 110 not taken.
✗ Branch 52 → 111 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 108 not taken.
✗ Branch 54 → 109 not taken.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 91 taken 23 times.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 173 not taken.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 171 not taken.
46 if (base&~0xFFFFFF) cleanup(), throw_err_block(0, err_snes_address_out_of_bounds, hex((unsigned int)base, 6).data());
1252 46 snespos = (int)base;
1253 46 startpos = (int)base;
1254 }
1255
4/5
✓ Branch 58 → 59 taken 15 times.
✗ Branch 58 → 83 not taken.
✓ Branch 58 → 84 taken 18 times.
✓ Branch 92 → 93 taken 15 times.
✓ Branch 92 → 131 taken 18 times.
66 else if (numwords == 3)
1256 {
1257
4/14
✓ Branch 59 → 60 taken 15 times.
✗ Branch 59 → 63 not taken.
✗ Branch 59 → 116 not taken.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 15 times.
✗ Branch 60 → 115 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 116 not taken.
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 97 taken 15 times.
✗ Branch 97 → 98 not taken.
✓ Branch 97 → 101 taken 15 times.
✗ Branch 98 → 99 not taken.
✗ Branch 98 → 179 not taken.
30 if (strcasecmp(words[1], "extends")) cleanup(), throw_err_block(0, err_missing_extends);
1258
3/13
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 68 not taken.
✗ Branch 65 → 66 not taken.
✓ Branch 65 → 69 taken 15 times.
✗ Branch 65 → 115 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 116 not taken.
✓ Branch 103 → 104 taken 15 times.
✗ Branch 103 → 179 not taken.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 108 taken 15 times.
✗ Branch 105 → 106 not taken.
✗ Branch 105 → 179 not taken.
30 if (!confirmname(words[2])) cleanup(), throw_err_block(0, err_struct_invalid_parent_name);
1259
2/6
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 115 not taken.
✓ Branch 69 → 70 taken 15 times.
✗ Branch 69 → 116 not taken.
✓ Branch 111 → 112 taken 15 times.
✗ Branch 111 → 179 not taken.
30 string tmp_struct_parent = words[2];
1260
1261
4/17
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 113 not taken.
✓ Branch 71 → 72 taken 15 times.
✗ Branch 71 → 76 not taken.
✗ Branch 71 → 114 not taken.
✗ Branch 72 → 73 not taken.
✓ Branch 72 → 77 taken 15 times.
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 113 not taken.
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 114 not taken.
✓ Branch 113 → 114 taken 15 times.
✗ Branch 113 → 177 not taken.
✗ Branch 114 → 115 not taken.
✓ Branch 114 → 119 taken 15 times.
✗ Branch 116 → 117 not taken.
✗ Branch 116 → 177 not taken.
30 if (!structs.exists(tmp_struct_parent)) cleanup(), throw_err_block(0, err_struct_not_found, tmp_struct_parent.data());
1262
4/11
✗ Branch 77 → 78 not taken.
✗ Branch 77 → 113 not taken.
✓ Branch 78 → 79 taken 15 times.
✗ Branch 78 → 113 not taken.
✗ Branch 78 → 114 not taken.
✓ Branch 79 → 80 taken 15 times.
✗ Branch 79 → 114 not taken.
✓ Branch 121 → 122 taken 15 times.
✗ Branch 121 → 177 not taken.
✓ Branch 123 → 124 taken 15 times.
✗ Branch 123 → 177 not taken.
30 snes_struct structure = structs.find(tmp_struct_parent);
1263
1264
1/2
✗ Branch 124 → 125 not taken.
✓ Branch 124 → 126 taken 15 times.
30 static_struct = structure.is_static;
1265
2/6
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 111 not taken.
✓ Branch 80 → 81 taken 15 times.
✗ Branch 80 → 112 not taken.
✓ Branch 126 → 127 taken 15 times.
✗ Branch 126 → 175 not taken.
30 struct_parent = tmp_struct_parent;
1266 30 snespos = structure.base_end;
1267 30 startpos = structure.base_end;
1268 30 }
1269
1270 112 push_pc();
1271
1272 112 optimizeforbank = -1;
1273
1274 112 struct_name = words[0];
1275 112 struct_base = snespos;
1276 112 realsnespos = 0;
1277 112 realstartpos = 0;
1278 112 snespos_valid = true;
1279
1280
5/8
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 96 not taken.
✓ Branch 86 → 87 taken 15 times.
✓ Branch 86 → 97 taken 41 times.
✗ Branch 134 → 135 not taken.
✓ Branch 134 → 136 taken 56 times.
✓ Branch 136 → 137 taken 15 times.
✓ Branch 136 → 154 taken 41 times.
112 if(in_sub_struct) {
1281
4/11
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 118 not taken.
✓ Branch 88 → 89 taken 15 times.
✗ Branch 88 → 116 not taken.
✗ Branch 88 → 119 not taken.
✓ Branch 89 → 90 taken 15 times.
✗ Branch 89 → 117 not taken.
✓ Branch 140 → 141 taken 15 times.
✗ Branch 140 → 184 not taken.
✓ Branch 141 → 142 taken 15 times.
✗ Branch 141 → 182 not taken.
30 string labelname = struct_parent + "." + struct_name;
1282
5/13
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 121 not taken.
✓ Branch 92 → 93 taken 15 times.
✗ Branch 92 → 119 not taken.
✗ Branch 92 → 122 not taken.
✓ Branch 93 → 94 taken 15 times.
✗ Branch 93 → 120 not taken.
✗ Branch 144 → 145 not taken.
✓ Branch 144 → 146 taken 15 times.
✓ Branch 148 → 149 taken 15 times.
✗ Branch 148 → 188 not taken.
✓ Branch 149 → 150 taken 15 times.
✗ Branch 149 → 186 not taken.
30 setlabel(ns + labelname, snespos, static_struct);
1283 30 } else {
1284
5/13
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 127 not taken.
✓ Branch 98 → 99 taken 41 times.
✗ Branch 98 → 125 not taken.
✗ Branch 98 → 128 not taken.
✓ Branch 99 → 100 taken 41 times.
✗ Branch 99 → 126 not taken.
✗ Branch 154 → 155 not taken.
✓ Branch 154 → 156 taken 41 times.
✓ Branch 158 → 159 taken 41 times.
✗ Branch 158 → 196 not taken.
✓ Branch 159 → 160 taken 41 times.
✗ Branch 159 → 194 not taken.
82 setlabel(ns + struct_name, snespos, static_struct);
1285 }
1286
1287 #undef cleanup
1288 112 }
1289
1290 114 void cmd_endstruct(char** words, int numwords) {
1291
3/7
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 7 taken 108 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 68 not taken.
✗ Branch 4 → 100 not taken.
114 if (numwords != 0 && numwords != 2) throw_err_block(0, err_invalid_endstruct_count);
1292
7/14
✓ Branch 7 → 8 taken 6 times.
✓ Branch 7 → 11 taken 54 times.
✓ Branch 7 → 12 taken 54 times.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 3 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 3 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 57 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 57 times.
✗ Branch 13 → 68 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 100 not taken.
114 if (numwords == 2 && stricmpwithlower(words[0], "align")) throw_err_block(0, err_expected_align);
1293
12/15
✓ Branch 16 → 17 taken 16 times.
✓ Branch 16 → 21 taken 41 times.
✓ Branch 17 → 18 taken 1 time.
✓ Branch 17 → 19 taken 57 times.
✓ Branch 17 → 21 taken 15 times.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 68 not taken.
✓ Branch 19 → 20 taken 16 times.
✓ Branch 19 → 26 taken 41 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 16 times.
✓ Branch 22 → 23 taken 1 time.
✓ Branch 22 → 26 taken 15 times.
✓ Branch 23 → 24 taken 1 time.
✗ Branch 23 → 100 not taken.
114 if (!in_struct && !in_sub_struct) throw_err_block(0, err_endstruct_without_struct);
1294
1295
6/8
✓ Branch 21 → 22 taken 3 times.
✓ Branch 21 → 24 taken 53 times.
✓ Branch 22 → 23 taken 3 times.
✗ Branch 22 → 68 not taken.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 31 taken 53 times.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 100 not taken.
112 int alignment = numwords == 2 ? (int)getnum(words[1]) : 1;
1296
2/8
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 56 times.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 68 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 56 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 100 not taken.
112 if (alignment < 1) throw_err_block(0, err_alignment_too_small);
1297
1298 112 snes_struct structure;
1299 112 structure.base_end = snespos;
1300
1/2
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 56 times.
112 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1301 112 structure.object_size = structure.struct_size;
1302
1/2
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 56 times.
112 structure.is_static = static_struct;
1303
1304
5/6
✓ Branch 30 → 31 taken 41 times.
✓ Branch 30 → 34 taken 15 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 56 times.
✓ Branch 44 → 45 taken 41 times.
✓ Branch 44 → 49 taken 15 times.
112 if (in_struct)
1305 {
1306
4/8
✓ Branch 32 → 33 taken 41 times.
✗ Branch 32 → 66 not taken.
✓ Branch 33 → 54 taken 41 times.
✗ Branch 33 → 66 not taken.
✓ Branch 46 → 47 taken 41 times.
✗ Branch 46 → 98 not taken.
✓ Branch 48 → 80 taken 41 times.
✗ Branch 48 → 98 not taken.
82 structs.create(struct_name) = structure;
1307 }
1308
3/6
✓ Branch 34 → 35 taken 15 times.
✗ Branch 34 → 54 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 15 times.
✓ Branch 51 → 52 taken 15 times.
✗ Branch 51 → 80 not taken.
30 else if (in_sub_struct)
1309 {
1310 30 snes_struct parent;
1311
4/8
✓ Branch 37 → 38 taken 15 times.
✗ Branch 37 → 63 not taken.
✓ Branch 38 → 39 taken 15 times.
✗ Branch 38 → 63 not taken.
✓ Branch 55 → 56 taken 15 times.
✗ Branch 55 → 94 not taken.
✓ Branch 57 → 58 taken 15 times.
✗ Branch 57 → 94 not taken.
30 parent = structs.find(struct_parent);
1312
1313
4/4
✓ Branch 39 → 40 taken 12 times.
✓ Branch 39 → 41 taken 3 times.
✓ Branch 58 → 59 taken 12 times.
✓ Branch 58 → 60 taken 3 times.
30 if (parent.object_size < parent.struct_size + structure.struct_size) {
1314 24 parent.object_size = parent.struct_size + structure.struct_size;
1315 }
1316
1317
8/16
✓ Branch 42 → 43 taken 15 times.
✗ Branch 42 → 61 not taken.
✓ Branch 43 → 44 taken 15 times.
✗ Branch 43 → 59 not taken.
✓ Branch 45 → 46 taken 15 times.
✗ Branch 45 → 57 not taken.
✓ Branch 46 → 47 taken 15 times.
✗ Branch 46 → 57 not taken.
✓ Branch 63 → 64 taken 15 times.
✗ Branch 63 → 90 not taken.
✓ Branch 64 → 65 taken 15 times.
✗ Branch 64 → 88 not taken.
✓ Branch 67 → 68 taken 15 times.
✗ Branch 67 → 86 not taken.
✓ Branch 69 → 70 taken 15 times.
✗ Branch 69 → 86 not taken.
30 structs.create(struct_parent + "." + struct_name) = structure;
1318
4/8
✓ Branch 50 → 51 taken 15 times.
✗ Branch 50 → 63 not taken.
✓ Branch 51 → 52 taken 15 times.
✗ Branch 51 → 63 not taken.
✓ Branch 75 → 76 taken 15 times.
✗ Branch 75 → 94 not taken.
✓ Branch 77 → 78 taken 15 times.
✗ Branch 77 → 94 not taken.
30 structs.create(struct_parent) = parent;
1319 30 }
1320
1321
2/4
✓ Branch 54 → 55 taken 56 times.
✗ Branch 54 → 66 not taken.
✓ Branch 80 → 81 taken 56 times.
✗ Branch 80 → 98 not taken.
112 pop_pc();
1322 112 in_struct = false;
1323 112 in_sub_struct = false;
1324 112 snespos = old_snespos;
1325 112 startpos = old_startpos;
1326 112 optimizeforbank = old_optimizeforbank;
1327
1/2
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 83 taken 56 times.
112 snespos_valid = old_snespos_valid;
1328 112 static_struct = false;
1329 168 }
1330
1331 12 void cmd_spcblock(char** words, int num_words) {
1332 12 int addrToLinePos = realsnespos & 0xFFFFFF;
1333 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1334
6/10
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 4 taken 6 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 6 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 6 times.
12 if(in_struct || in_sub_struct) throw_err_block(0, err_spcblock_inside_struct);
1335
2/4
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 6 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 6 times.
12 if(num_words < 1) throw_err_block(0, err_spcblock_too_few_args);
1336
2/4
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 6 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 6 times.
12 if(num_words > 3) throw_err_block(0, err_spcblock_too_many_args);
1337
1338 12 spcblock.destination = getnum(words[0]);
1339 12 spcblock.type = spcblock_nspc;
1340 12 spcblock.macro_name = "";
1341
1342
2/14
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 23 taken 6 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 75 not taken.
✗ Branch 18 → 78 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 73 not taken.
✗ Branch 20 → 76 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 30 taken 6 times.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 115 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 113 not taken.
12 if (spcblock.destination&~0xFFFF) throw_err_block(0, err_snes_address_out_of_bounds, hex(spcblock.destination, 6).data());
1343
1344
2/5
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 33 not taken.
✓ Branch 23 → 35 taken 6 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 48 taken 6 times.
12 if(num_words == 2)
1345 {
1346 if(!stricmp(words[1], "nspc")) spcblock.type = spcblock_nspc;
1347 else if(!stricmp(words[1], "custom")) throw_err_block(0, err_custom_spcblock_missing_macro);
1348 else throw_err_block(0, err_unknown_spcblock_type);
1349 }
1350
2/6
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 54 not taken.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 57 taken 6 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 87 taken 6 times.
12 else if(num_words == 3)
1351 {
1352 if(!stricmp(words[1], "custom")) spcblock.type = spcblock_custom;
1353 else throw_err_block(0, err_extra_spcblock_arg_for_type);
1354
1355 if(macros.exists(words[2]))
1356 {
1357 macrodata *macro = macros.find(words[2]);
1358 if(!macro->variadic) throw_err_block(0, err_spcblock_macro_must_be_varadic);
1359 if(macro->numargs != 3) throw_err_block(0, err_spcblock_macro_invalid_static_args);
1360 spcblock.macro_name = words[2];
1361 }
1362 else throw_err_block(0, err_spcblock_macro_doesnt_exist);
1363 }
1364
1365
3/11
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 58 not taken.
✗ Branch 54 → 61 not taken.
✓ Branch 57 → 58 taken 6 times.
✗ Branch 57 → 61 not taken.
✗ Branch 57 → 64 not taken.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 6 times.
✓ Branch 89 → 90 taken 6 times.
✗ Branch 89 → 93 not taken.
✗ Branch 89 → 96 not taken.
12 switch(spcblock.type)
1366 {
1367 12 case spcblock_nspc:
1368 12 spcblock.size_address=realsnespos;
1369 12 write2(0x0000);
1370 12 write2(spcblock.destination);
1371 12 snespos=(int)spcblock.destination;
1372 12 startpos=(int)spcblock.destination;
1373 12 add_addr_to_line(addrToLinePos);
1374 12 break;
1375 case spcblock_custom:
1376 //this is a todo that probably won't be ready for 1.9
1377 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1378 throw_err_block(0, err_spcblock_custom_types_incomplete);
1379 push_pc();
1380 spcblock.old_mapper = mapper;
1381 mapper = norom;
1382 break;
1383 default:
1384 throw_err_fatal(0, err_internal_error, "invalid spcblock type");
1385 }
1386
1387 12 ns_backup = ns;
1388
4/12
✗ Branch 67 → 68 not taken.
✗ Branch 67 → 78 not taken.
✗ Branch 68 → 69 not taken.
✗ Branch 68 → 76 not taken.
✓ Branch 70 → 71 taken 6 times.
✗ Branch 70 → 81 not taken.
✓ Branch 71 → 72 taken 6 times.
✗ Branch 71 → 79 not taken.
✓ Branch 104 → 105 taken 6 times.
✗ Branch 104 → 119 not taken.
✓ Branch 105 → 106 taken 6 times.
✗ Branch 105 → 117 not taken.
12 ns = STR":SPCBLOCK:_" + ns_backup;
1389 12 in_spcblock = true;
1390 12 }
1391
1392 12 void cmd_endspcblock(char** words, int num_words) {
1393
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
✓ Branch 2 → 6 taken 6 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 6 times.
12 if(!in_spcblock) throw_err_block(0, err_endspcblock_without_spcblock);
1394
1395
3/8
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 29 not taken.
✗ Branch 6 → 30 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 6 times.
✓ Branch 10 → 11 taken 6 times.
✗ Branch 10 → 41 not taken.
✗ Branch 10 → 44 not taken.
12 switch(spcblock.type)
1396 {
1397 12 case spcblock_nspc:
1398
4/4
✓ Branch 7 → 8 taken 2 times.
✓ Branch 7 → 17 taken 4 times.
✓ Branch 11 → 12 taken 2 times.
✓ Branch 11 → 23 taken 4 times.
12 if (pass==2)
1399 {
1400 4 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1401
2/12
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 15 taken 2 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 38 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 36 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 21 taken 2 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 52 not taken.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 50 not taken.
4 if (pcpos<0) throw_err_block(2, err_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
1402 // compute number of bytes written;
1403 // offset by 4 for the spcblock header itself
1404 4 int num = realsnespos - ((int)spcblock.size_address + 4);
1405 4 writeromdata_byte(pcpos, (unsigned char)num);
1406 4 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1407 }
1408
4/4
✓ Branch 17 → 18 taken 3 times.
✓ Branch 17 → 26 taken 3 times.
✓ Branch 23 → 24 taken 3 times.
✓ Branch 23 → 38 taken 3 times.
12 if (num_words == 2)
1409 {
1410 // todo allow spaces here
1411
3/6
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 3 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 27 taken 3 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 30 taken 3 times.
6 if (strcmp(words[0], "execute")) throw_err_null(0, err_invalid_endspcblock_arg, words[0]);
1412 else
1413 {
1414 6 write2(0x0000);
1415
4/4
✓ Branch 21 → 22 taken 1 time.
✓ Branch 21 → 24 taken 2 times.
✓ Branch 31 → 32 taken 1 time.
✓ Branch 31 → 36 taken 2 times.
6 write2(pass == 2 ? (unsigned int)getnum(words[1]) : 0);
1416 }
1417 }
1418
2/4
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 3 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 3 times.
6 else if (num_words != 0)
1419 {
1420 throw_err_null(0, err_unknown_endspcblock_format);
1421 }
1422 12 break;
1423 case spcblock_custom:
1424 mapper = spcblock.old_mapper;
1425 pop_pc();
1426 break;
1427 default:
1428 throw_err_fatal(0, err_internal_error, "invalid spcblock type");
1429 }
1430 12 ns = ns_backup;
1431 12 in_spcblock = false;
1432 12 snespos=realsnespos;
1433 12 startpos=realstartpos;
1434 12 }
1435
1436 102 void cmd_base(const char* par) {
1437
5/6
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 51 times.
✓ Branch 3 → 4 taken 15 times.
✓ Branch 3 → 5 taken 36 times.
✓ Branch 4 → 5 taken 15 times.
✓ Branch 4 → 6 taken 36 times.
102 if (!stricmp(par, "off"))
1438 {
1439 30 snespos=realsnespos;
1440 30 startpos=realstartpos;
1441 30 snespos_valid = realsnespos >= 0;
1442 30 return;
1443 }
1444
5/16
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 22 not taken.
✓ Branch 5 → 6 taken 36 times.
✗ Branch 5 → 23 not taken.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 20 not taken.
✓ Branch 7 → 8 taken 36 times.
✗ Branch 7 → 18 not taken.
✗ Branch 7 → 21 not taken.
✓ Branch 8 → 9 taken 72 times.
✗ Branch 8 → 19 not taken.
✗ Branch 8 → 32 not taken.
✓ Branch 11 → 12 taken 36 times.
✗ Branch 11 → 30 not taken.
✓ Branch 13 → 14 taken 36 times.
✗ Branch 13 → 28 not taken.
72 unsigned int num=parse_math_expr(par)->evaluate_non_forward().get_integer();
1445
2/17
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 16 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 17 taken 36 times.
✗ Branch 11 → 26 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 27 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 24 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 25 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 26 taken 36 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 38 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 36 not taken.
72 if (num&~0xFFFFFF) throw_err_block(1, err_snes_address_out_of_bounds, hex((unsigned int)num).data());
1446 72 snespos=(int)num;
1447 72 startpos=(int)num;
1448 72 optimizeforbank=-1;
1449 72 snespos_valid = realsnespos >= 0;
1450 }
1451
1452 12 void cmd_dpbase(const char* par) {
1453
5/11
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 27 not taken.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 25 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 23 not taken.
12 unsigned int num=parse_math_expr(par)->evaluate_non_forward().get_integer();
1454
2/12
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 14 taken 6 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 23 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 21 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 22 taken 6 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 33 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 31 not taken.
12 if (num&~0xFF00) throw_err_block(1, err_bad_dp_base, hex((unsigned int)num, 6).data());
1455 12 dp_base = (int)num;
1456 12 }
1457
1458 108 void cmd_optimize(char** words, int num_words) {
1459
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 108 times.
108 if(num_words != 2) throw_err_block(1, err_bad_optimize, "");
1460
1461
5/7
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 16 not taken.
✓ Branch 7 → 8 taken 21 times.
✓ Branch 7 → 9 taken 54 times.
✓ Branch 7 → 20 taken 33 times.
✓ Branch 9 → 10 taken 21 times.
✓ Branch 9 → 33 taken 33 times.
108 if (!stricmp(words[0], "dp"))
1462 {
1463
5/8
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✓ Branch 9 → 10 taken 12 times.
✓ Branch 9 → 11 taken 9 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 21 times.
✓ Branch 14 → 15 taken 12 times.
✓ Branch 14 → 16 taken 9 times.
42 if (!stricmp(words[1], "none"))
1464 {
1465 24 optimize_dp = optimize_dp_flag::NONE;
1466 24 return;
1467 }
1468
5/8
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✓ Branch 12 → 13 taken 3 times.
✓ Branch 12 → 14 taken 6 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 9 times.
✓ Branch 20 → 21 taken 3 times.
✓ Branch 20 → 22 taken 6 times.
18 if (!stricmp(words[1], "ram"))
1469 {
1470 6 optimize_dp = optimize_dp_flag::RAM;
1471 6 return;
1472 }
1473
3/8
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
✓ Branch 15 → 16 taken 6 times.
✗ Branch 15 → 17 not taken.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 6 times.
✓ Branch 26 → 27 taken 6 times.
✗ Branch 26 → 28 not taken.
12 if (!stricmp(words[1], "always"))
1474 {
1475 12 optimize_dp = optimize_dp_flag::ALWAYS;
1476 12 return;
1477 }
1478 throw_err_block(1, err_bad_dp_optimize, words[1]);
1479 }
1480
3/8
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 26 not taken.
✓ Branch 21 → 22 taken 33 times.
✗ Branch 21 → 34 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 33 times.
✓ Branch 36 → 37 taken 33 times.
✗ Branch 36 → 60 not taken.
66 if (!stricmp(words[0], "address"))
1481 {
1482
5/8
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
✓ Branch 23 → 24 taken 12 times.
✓ Branch 23 → 25 taken 21 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 33 times.
✓ Branch 41 → 42 taken 12 times.
✓ Branch 41 → 43 taken 21 times.
66 if (!stricmp(words[1], "default"))
1483 {
1484 24 optimize_address = optimize_address_flag::DEFAULT;
1485 24 return;
1486 }
1487
5/8
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 21 not taken.
✓ Branch 26 → 27 taken 9 times.
✓ Branch 26 → 28 taken 12 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 47 taken 21 times.
✓ Branch 47 → 48 taken 9 times.
✓ Branch 47 → 49 taken 12 times.
42 if (!stricmp(words[1], "ram"))
1488 {
1489 18 optimize_address = optimize_address_flag::RAM;
1490 18 return;
1491 }
1492
3/8
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 23 not taken.
✓ Branch 29 → 30 taken 12 times.
✗ Branch 29 → 31 not taken.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 12 times.
✓ Branch 53 → 54 taken 12 times.
✗ Branch 53 → 55 not taken.
24 if (!stricmp(words[1], "mirrors"))
1493 {
1494 24 optimize_address = optimize_address_flag::MIRRORS;
1495 24 return;
1496 }
1497 throw_err_block(1, err_bad_address_optimize, words[1]);
1498 }
1499 throw_err_block(1, err_bad_optimize, words[0]);
1500 }
1501
1502 18 void cmd_bank(const char* par) {
1503
5/6
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 9 times.
✓ Branch 3 → 4 taken 3 times.
✓ Branch 3 → 5 taken 6 times.
✓ Branch 4 → 5 taken 3 times.
✓ Branch 4 → 6 taken 6 times.
18 if (!stricmp(par, "auto"))
1504 {
1505 6 optimizeforbank=-1;
1506 6 return;
1507 }
1508
4/6
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 6 not taken.
✓ Branch 6 → 7 taken 3 times.
✓ Branch 6 → 8 taken 9 times.
✓ Branch 8 → 9 taken 3 times.
✓ Branch 8 → 10 taken 3 times.
12 if (!stricmp(par, "noassume"))
1509 {
1510 6 optimizeforbank=0x140;
1511 6 return;
1512 }
1513 6 unsigned int num=getnum(par);
1514 //if (forwardlabel) error(0, "bank Label is not valid");
1515 //if (foundlabel) num>>=16;
1516
2/17
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 13 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 17 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 15 taken 3 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 15 not taken.
✗ Branch 10 → 19 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 19 taken 3 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 17 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 23 not taken.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 21 not taken.
6 if (num&~0x0000FF) throw_err_block(1, err_snes_address_out_of_bounds, hex((unsigned int)num, 6).data());
1517 6 optimizeforbank=(int)num;
1518 }
1519
1520 enum class freespace_cmds {
1521 freespace,
1522 freecode,
1523 freedata,
1524 segment,
1525 };
1526
1527 template<freespace_cmds the_cmd>
1528 1602 void cmd_freespace(const char* par) {
1529
12/36
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 3 times.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 95 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 3 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 174 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 561 times.
✓ Branch 2 → 6 taken 561 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 96 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 561 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 175 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 168 times.
✓ Branch 2 → 6 taken 168 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 96 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 168 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 175 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 69 times.
✓ Branch 2 → 6 taken 69 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 95 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 69 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 174 not taken.
1602 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1530
1531
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 95 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 174 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 6 → 7 taken 561 times.
✗ Branch 6 → 96 not taken.
✓ Branch 9 → 10 taken 561 times.
✗ Branch 9 → 175 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 6 → 7 taken 168 times.
✗ Branch 6 → 96 not taken.
✓ Branch 9 → 10 taken 168 times.
✗ Branch 9 → 175 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 6 → 7 taken 69 times.
✗ Branch 6 → 95 not taken.
✓ Branch 9 → 10 taken 69 times.
✗ Branch 9 → 174 not taken.
1602 freespace_data this_fs_settings = default_freespace_settings;
1532 1122 if (the_cmd == freespace_cmds::freecode) this_fs_settings.bank = -2;
1533 336 if (the_cmd == freespace_cmds::freedata) this_fs_settings.bank = -1;
1534 138 if (the_cmd == freespace_cmds::segment) this_fs_settings.write_rats = false;
1535
1536
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 93 not taken.
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 172 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 8 → 9 taken 561 times.
✗ Branch 8 → 94 not taken.
✓ Branch 12 → 13 taken 561 times.
✗ Branch 12 → 173 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 8 → 9 taken 168 times.
✗ Branch 8 → 94 not taken.
✓ Branch 12 → 13 taken 168 times.
✗ Branch 12 → 173 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 7 → 8 taken 69 times.
✗ Branch 7 → 93 not taken.
✓ Branch 11 → 12 taken 69 times.
✗ Branch 11 → 172 not taken.
1602 string parstr = par;
1537
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 91 not taken.
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 9 → 10 taken 561 times.
✗ Branch 9 → 92 not taken.
✓ Branch 13 → 14 taken 561 times.
✗ Branch 13 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 9 → 10 taken 168 times.
✗ Branch 9 → 92 not taken.
✓ Branch 13 → 14 taken 168 times.
✗ Branch 13 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 8 → 9 taken 69 times.
✗ Branch 8 → 91 not taken.
✓ Branch 12 → 13 taken 69 times.
✗ Branch 12 → 170 not taken.
1602 parse_freespace_arguments(this_fs_settings, parstr);
1538
1539
13/40
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 12 taken 3 times.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 18 taken 3 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 18 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 561 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 19 taken 561 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 168 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 19 taken 168 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 9 → 10 taken 42 times.
✓ Branch 9 → 12 taken 27 times.
✓ Branch 10 → 11 taken 42 times.
✗ Branch 10 → 12 not taken.
✓ Branch 13 → 14 taken 42 times.
✓ Branch 13 → 18 taken 27 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 42 times.
✓ Branch 16 → 17 taken 42 times.
✗ Branch 16 → 18 not taken.
1602 if(this_fs_settings.bank == -3 && !this_fs_settings.write_rats) this_fs_settings.bank = -1;
1540
8/32
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 3 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 91 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 3 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 561 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 92 not taken.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 23 taken 561 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 168 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 92 not taken.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 23 taken 168 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 69 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 91 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 69 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 170 not taken.
1602 if(this_fs_settings.bank == -3) throw_err_block(0, err_invalid_freespace_request);
1541 // no point specifying anything about cleaning when not writing a rats tag
1542
12/24
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 22 taken 3 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 3 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 34 taken 3 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 23 taken 561 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 561 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 35 taken 561 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 23 taken 168 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 168 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 35 taken 168 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 16 → 17 taken 69 times.
✗ Branch 16 → 22 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 69 times.
✓ Branch 24 → 25 taken 69 times.
✗ Branch 24 → 34 not taken.
1602 if(!this_fs_settings.write_rats &&
1543
6/48
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 22 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 27 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 31 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 30 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 34 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 23 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 28 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 32 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 35 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 23 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 28 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 32 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 31 not taken.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 35 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 17 → 18 taken 69 times.
✗ Branch 17 → 19 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 69 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 27 taken 69 times.
✓ Branch 27 → 28 taken 69 times.
✗ Branch 27 → 31 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 69 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 69 times.
138 (this_fs_settings.flag_cleaned || this_fs_settings.is_static))
1544 throw_err_block(0, err_invalid_freespace_request);
1545
12/24
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 3 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 3 times.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 3 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 561 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 561 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 561 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 168 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 168 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 168 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 22 → 23 taken 69 times.
✗ Branch 22 → 24 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 69 times.
✓ Branch 36 → 37 taken 69 times.
✗ Branch 36 → 38 not taken.
1602 if(!this_fs_settings.write_rats) this_fs_settings.flag_cleaned = true;
1546
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 24 → 25 taken 3 times.
✗ Branch 24 → 91 not taken.
✓ Branch 38 → 39 taken 3 times.
✗ Branch 38 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 25 → 26 taken 561 times.
✗ Branch 25 → 92 not taken.
✓ Branch 39 → 40 taken 561 times.
✗ Branch 39 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 25 → 26 taken 168 times.
✗ Branch 25 → 92 not taken.
✓ Branch 39 → 40 taken 168 times.
✗ Branch 39 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 24 → 25 taken 69 times.
✗ Branch 24 → 91 not taken.
✓ Branch 38 → 39 taken 69 times.
✗ Branch 38 → 170 not taken.
1602 freespaceend();
1547 1602 freespaceid = freespaceidnext++;
1548
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 25 → 26 taken 3 times.
✗ Branch 25 → 91 not taken.
✓ Branch 39 → 40 taken 3 times.
✗ Branch 39 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 26 → 27 taken 561 times.
✗ Branch 26 → 92 not taken.
✓ Branch 40 → 41 taken 561 times.
✗ Branch 40 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 26 → 27 taken 168 times.
✗ Branch 26 → 92 not taken.
✓ Branch 40 → 41 taken 168 times.
✗ Branch 40 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 25 → 26 taken 69 times.
✗ Branch 25 → 91 not taken.
✓ Branch 39 → 40 taken 69 times.
✗ Branch 39 → 170 not taken.
1602 freespace_data& thisfs = freespaces[freespaceid];
1549
1550
16/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 26 → 27 taken 1 time.
✓ Branch 26 → 29 taken 2 times.
✓ Branch 40 → 41 taken 1 time.
✓ Branch 40 → 51 taken 2 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 27 → 28 taken 187 times.
✓ Branch 27 → 30 taken 374 times.
✓ Branch 41 → 42 taken 187 times.
✓ Branch 41 → 52 taken 374 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 27 → 28 taken 56 times.
✓ Branch 27 → 30 taken 112 times.
✓ Branch 41 → 42 taken 56 times.
✓ Branch 41 → 52 taken 112 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 26 → 27 taken 23 times.
✓ Branch 26 → 29 taken 46 times.
✓ Branch 40 → 41 taken 23 times.
✓ Branch 40 → 51 taken 46 times.
1602 if (pass==0) {
1551
8/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 27 → 28 taken 1 time.
✗ Branch 27 → 91 not taken.
✓ Branch 42 → 43 taken 1 time.
✗ Branch 42 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 28 → 29 taken 187 times.
✗ Branch 28 → 92 not taken.
✓ Branch 43 → 44 taken 187 times.
✗ Branch 43 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 28 → 29 taken 56 times.
✗ Branch 28 → 92 not taken.
✓ Branch 43 → 44 taken 56 times.
✗ Branch 43 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 27 → 28 taken 23 times.
✗ Branch 27 → 91 not taken.
✓ Branch 42 → 43 taken 23 times.
✗ Branch 42 → 170 not taken.
534 thisfs = this_fs_settings;
1552 534 thisfs.pos = -1;
1553 534 thisfs.leaked = true;
1554 534 thisfs.orgpos = -2;
1555 534 thisfs.orglen = -1;
1556 534 snespos=0;
1557 }
1558
16/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 29 → 30 taken 1 time.
✓ Branch 29 → 36 taken 2 times.
✓ Branch 51 → 52 taken 1 time.
✓ Branch 51 → 66 taken 2 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 30 → 31 taken 187 times.
✓ Branch 30 → 37 taken 374 times.
✓ Branch 52 → 53 taken 187 times.
✓ Branch 52 → 67 taken 374 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 30 → 31 taken 56 times.
✓ Branch 30 → 37 taken 112 times.
✓ Branch 52 → 53 taken 56 times.
✓ Branch 52 → 67 taken 112 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 29 → 30 taken 23 times.
✓ Branch 29 → 36 taken 46 times.
✓ Branch 51 → 52 taken 23 times.
✓ Branch 51 → 66 taken 46 times.
1602 if (pass==1)
1559 {
1560
16/40
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 35 taken 1 time.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 35 not taken.
✗ Branch 53 → 54 not taken.
✓ Branch 53 → 55 taken 1 time.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 65 taken 1 time.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 65 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 36 taken 187 times.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 36 not taken.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 56 taken 187 times.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 66 taken 187 times.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 66 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 31 → 32 taken 2 times.
✓ Branch 31 → 36 taken 54 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 2 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 56 taken 56 times.
✓ Branch 56 → 57 taken 2 times.
✓ Branch 56 → 66 taken 54 times.
✗ Branch 59 → 60 not taken.
✓ Branch 59 → 66 taken 2 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 35 taken 23 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 35 not taken.
✗ Branch 53 → 54 not taken.
✓ Branch 53 → 55 taken 23 times.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 65 taken 23 times.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 65 not taken.
534 if (thisfs.is_static && thisfs.orgpos == -2)
1561 {
1562 thisfs.pos = 0;
1563 thisfs.leaked = false;//mute some other errors
1564 throw_err_block(1, err_static_freespace_autoclean);
1565 }
1566 534 snespos = 0;
1567 }
1568
16/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 36 → 37 taken 1 time.
✓ Branch 36 → 48 taken 2 times.
✓ Branch 66 → 67 taken 1 time.
✓ Branch 66 → 98 taken 2 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 37 → 38 taken 187 times.
✓ Branch 37 → 49 taken 374 times.
✓ Branch 67 → 68 taken 187 times.
✓ Branch 67 → 99 taken 374 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 37 → 38 taken 56 times.
✓ Branch 37 → 49 taken 112 times.
✓ Branch 67 → 68 taken 56 times.
✓ Branch 67 → 99 taken 112 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 36 → 37 taken 23 times.
✓ Branch 36 → 48 taken 46 times.
✓ Branch 66 → 67 taken 23 times.
✓ Branch 66 → 98 taken 46 times.
1602 if (pass==2)
1569 {
1570
16/40
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 40 taken 1 time.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 68 → 69 not taken.
✓ Branch 68 → 70 taken 1 time.
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 75 taken 1 time.
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 75 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 41 taken 187 times.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 41 not taken.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 71 taken 187 times.
✗ Branch 71 → 72 not taken.
✓ Branch 71 → 76 taken 187 times.
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 76 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 38 → 39 taken 2 times.
✓ Branch 38 → 41 taken 54 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 2 times.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 71 taken 56 times.
✓ Branch 71 → 72 taken 2 times.
✓ Branch 71 → 76 taken 54 times.
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 76 taken 2 times.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 40 taken 23 times.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 40 not taken.
✗ Branch 68 → 69 not taken.
✓ Branch 68 → 70 taken 23 times.
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 75 taken 23 times.
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 75 not taken.
534 if (thisfs.is_static && thisfs.orgpos == -2) return;//to kill some errors (supposedly????)
1571 534 snespos=thisfs.pos;
1572
28/64
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 40 → 41 taken 1 time.
✗ Branch 40 → 43 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 1 time.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 91 not taken.
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 1 time.
✓ Branch 79 → 80 taken 1 time.
✗ Branch 79 → 85 not taken.
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 83 taken 1 time.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 85 taken 1 time.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 41 → 42 taken 171 times.
✓ Branch 41 → 44 taken 16 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 171 times.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 92 not taken.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 187 times.
✓ Branch 80 → 81 taken 171 times.
✓ Branch 80 → 86 taken 16 times.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 171 times.
✗ Branch 84 → 85 not taken.
✓ Branch 84 → 86 taken 171 times.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 41 → 42 taken 39 times.
✓ Branch 41 → 44 taken 17 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 39 times.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 92 not taken.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 56 times.
✓ Branch 80 → 81 taken 39 times.
✓ Branch 80 → 86 taken 17 times.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 39 times.
✗ Branch 84 → 85 not taken.
✓ Branch 84 → 86 taken 39 times.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 40 → 41 taken 23 times.
✗ Branch 40 → 43 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 43 taken 23 times.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 91 not taken.
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 23 times.
✓ Branch 79 → 80 taken 23 times.
✗ Branch 79 → 85 not taken.
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 83 taken 23 times.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 85 taken 23 times.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 170 not taken.
534 if (thisfs.leaked && !thisfs.flag_cleaned) throw_warning(2, warn_freespace_leaked);
1573
12/24
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 43 → 44 taken 1 time.
✗ Branch 43 → 45 not taken.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 88 taken 1 time.
✓ Branch 88 → 89 taken 1 time.
✗ Branch 88 → 90 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 44 → 45 taken 187 times.
✗ Branch 44 → 46 not taken.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 187 times.
✓ Branch 89 → 90 taken 187 times.
✗ Branch 89 → 91 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 44 → 45 taken 56 times.
✗ Branch 44 → 46 not taken.
✗ Branch 87 → 88 not taken.
✓ Branch 87 → 89 taken 56 times.
✓ Branch 89 → 90 taken 56 times.
✗ Branch 89 → 91 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 23 times.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 88 taken 23 times.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 90 taken 23 times.
534 freespaceuse += (thisfs.write_rats ? 8 : 0) + thisfs.len;
1574
1575 // add a mapping for the start of the rats tag
1576
18/40
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 46 → 47 taken 1 time.
✗ Branch 46 → 48 not taken.
✓ Branch 47 → 48 taken 1 time.
✗ Branch 47 → 91 not taken.
✗ Branch 94 → 95 not taken.
✓ Branch 94 → 96 taken 1 time.
✓ Branch 96 → 97 taken 1 time.
✗ Branch 96 → 98 not taken.
✓ Branch 97 → 98 taken 1 time.
✗ Branch 97 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 47 → 48 taken 187 times.
✗ Branch 47 → 49 not taken.
✓ Branch 48 → 49 taken 187 times.
✗ Branch 48 → 92 not taken.
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 97 taken 187 times.
✓ Branch 97 → 98 taken 187 times.
✗ Branch 97 → 99 not taken.
✓ Branch 98 → 99 taken 187 times.
✗ Branch 98 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 47 → 48 taken 56 times.
✗ Branch 47 → 49 not taken.
✓ Branch 48 → 49 taken 56 times.
✗ Branch 48 → 92 not taken.
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 97 taken 56 times.
✓ Branch 97 → 98 taken 56 times.
✗ Branch 97 → 99 not taken.
✓ Branch 98 → 99 taken 56 times.
✗ Branch 98 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 23 times.
✗ Branch 47 → 48 not taken.
✗ Branch 47 → 91 not taken.
✗ Branch 94 → 95 not taken.
✓ Branch 94 → 96 taken 23 times.
✗ Branch 96 → 97 not taken.
✓ Branch 96 → 98 taken 23 times.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 170 not taken.
534 if (thisfs.write_rats) add_addr_to_line(snespos-8);
1577 }
1578
8/72
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 55 taken 3 times.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 55 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 87 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 85 not taken.
✗ Branch 98 → 99 not taken.
✓ Branch 98 → 111 taken 3 times.
✗ Branch 99 → 100 not taken.
✗ Branch 99 → 101 not taken.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 111 not taken.
✗ Branch 105 → 106 not taken.
✗ Branch 105 → 164 not taken.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 162 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 56 taken 561 times.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 56 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 88 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 86 not taken.
✗ Branch 99 → 100 not taken.
✓ Branch 99 → 112 taken 561 times.
✗ Branch 100 → 101 not taken.
✗ Branch 100 → 102 not taken.
✗ Branch 102 → 103 not taken.
✗ Branch 102 → 112 not taken.
✗ Branch 106 → 107 not taken.
✗ Branch 106 → 165 not taken.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 163 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 56 taken 168 times.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 56 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 88 not taken.
✗ Branch 53 → 54 not taken.
✗ Branch 53 → 86 not taken.
✗ Branch 99 → 100 not taken.
✓ Branch 99 → 112 taken 168 times.
✗ Branch 100 → 101 not taken.
✗ Branch 100 → 102 not taken.
✗ Branch 102 → 103 not taken.
✗ Branch 102 → 112 not taken.
✗ Branch 106 → 107 not taken.
✗ Branch 106 → 165 not taken.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 163 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 55 taken 69 times.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 55 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 87 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 85 not taken.
✗ Branch 98 → 99 not taken.
✓ Branch 98 → 111 taken 69 times.
✗ Branch 99 → 100 not taken.
✗ Branch 99 → 101 not taken.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 111 not taken.
✗ Branch 105 → 106 not taken.
✗ Branch 105 → 164 not taken.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 162 not taken.
1602 if (snespos < 0 && mapper == sa1rom) throw_err_fatal(pass, err_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1579
8/48
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 61 taken 3 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 90 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 88 not taken.
✗ Branch 111 → 112 not taken.
✓ Branch 111 → 121 taken 3 times.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 168 not taken.
✗ Branch 118 → 119 not taken.
✗ Branch 118 → 166 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 62 taken 561 times.
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 91 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 89 not taken.
✗ Branch 112 → 113 not taken.
✓ Branch 112 → 122 taken 561 times.
✗ Branch 116 → 117 not taken.
✗ Branch 116 → 169 not taken.
✗ Branch 119 → 120 not taken.
✗ Branch 119 → 167 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 62 taken 168 times.
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 91 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 89 not taken.
✗ Branch 112 → 113 not taken.
✓ Branch 112 → 122 taken 168 times.
✗ Branch 116 → 117 not taken.
✗ Branch 116 → 169 not taken.
✗ Branch 119 → 120 not taken.
✗ Branch 119 → 167 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 61 taken 69 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 90 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 88 not taken.
✗ Branch 111 → 112 not taken.
✓ Branch 111 → 121 taken 69 times.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 168 not taken.
✗ Branch 118 → 119 not taken.
✗ Branch 118 → 166 not taken.
1602 if (snespos < 0) throw_err_fatal(pass, err_no_freespace, dec(thisfs.len).data());
1580
12/24
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 61 → 62 taken 3 times.
✗ Branch 61 → 63 not taken.
✗ Branch 122 → 123 not taken.
✓ Branch 122 → 124 taken 3 times.
✓ Branch 124 → 125 taken 3 times.
✗ Branch 124 → 126 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 62 → 63 taken 561 times.
✗ Branch 62 → 64 not taken.
✗ Branch 123 → 124 not taken.
✓ Branch 123 → 125 taken 561 times.
✓ Branch 125 → 126 taken 561 times.
✗ Branch 125 → 127 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 62 → 63 taken 168 times.
✗ Branch 62 → 64 not taken.
✗ Branch 123 → 124 not taken.
✓ Branch 123 → 125 taken 168 times.
✓ Branch 125 → 126 taken 168 times.
✗ Branch 125 → 127 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 63 taken 69 times.
✗ Branch 122 → 123 not taken.
✓ Branch 122 → 124 taken 69 times.
✗ Branch 124 → 125 not taken.
✓ Branch 124 → 126 taken 69 times.
1602 bytes+=thisfs.write_rats ? 8 : 0;
1581 1602 freespacestart=snespos;
1582 1602 startpos=snespos;
1583 1602 realstartpos=snespos;
1584 1602 realsnespos=snespos;
1585 1602 optimizeforbank=-1;
1586
12/24
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 66 not taken.
✗ Branch 128 → 129 not taken.
✓ Branch 128 → 130 taken 3 times.
✓ Branch 130 → 131 taken 3 times.
✗ Branch 130 → 132 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 65 → 66 taken 561 times.
✗ Branch 65 → 67 not taken.
✗ Branch 129 → 130 not taken.
✓ Branch 129 → 131 taken 561 times.
✓ Branch 131 → 132 taken 561 times.
✗ Branch 131 → 133 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 65 → 66 taken 168 times.
✗ Branch 65 → 67 not taken.
✗ Branch 129 → 130 not taken.
✓ Branch 129 → 131 taken 168 times.
✓ Branch 131 → 132 taken 168 times.
✗ Branch 131 → 133 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 66 taken 69 times.
✗ Branch 128 → 129 not taken.
✓ Branch 128 → 130 taken 69 times.
✗ Branch 130 → 131 not taken.
✓ Branch 130 → 132 taken 69 times.
1602 ratsmetastate=thisfs.write_rats ? ratsmeta_allow : ratsmeta_ban;
1587 1602 snespos_valid = true;
1588 // check this at the very end so that snespos gets set properly, to
1589 // prevent spurious errors later
1590 //...i guess this can still cause bankcross errors if the old freespace
1591 //happened to be very close to the end of a bank or something, but
1592 //whatever
1593
36/72
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 67 → 68 taken 1 time.
✓ Branch 67 → 74 taken 2 times.
✗ Branch 68 → 69 not taken.
✓ Branch 68 → 74 taken 1 time.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 74 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 74 not taken.
✓ Branch 133 → 134 taken 1 time.
✓ Branch 133 → 149 taken 2 times.
✗ Branch 135 → 136 not taken.
✓ Branch 135 → 137 taken 1 time.
✗ Branch 137 → 138 not taken.
✓ Branch 137 → 149 taken 1 time.
✗ Branch 140 → 141 not taken.
✗ Branch 140 → 149 not taken.
✗ Branch 145 → 146 not taken.
✗ Branch 145 → 149 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 68 → 69 taken 187 times.
✓ Branch 68 → 75 taken 374 times.
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 75 taken 187 times.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 75 not taken.
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 75 not taken.
✓ Branch 134 → 135 taken 187 times.
✓ Branch 134 → 150 taken 374 times.
✗ Branch 136 → 137 not taken.
✓ Branch 136 → 138 taken 187 times.
✗ Branch 138 → 139 not taken.
✓ Branch 138 → 150 taken 187 times.
✗ Branch 141 → 142 not taken.
✗ Branch 141 → 150 not taken.
✗ Branch 146 → 147 not taken.
✗ Branch 146 → 150 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 68 → 69 taken 56 times.
✓ Branch 68 → 75 taken 112 times.
✓ Branch 69 → 70 taken 2 times.
✓ Branch 69 → 75 taken 54 times.
✓ Branch 70 → 71 taken 1 time.
✓ Branch 70 → 75 taken 1 time.
✓ Branch 71 → 72 taken 1 time.
✗ Branch 71 → 75 not taken.
✓ Branch 134 → 135 taken 56 times.
✓ Branch 134 → 150 taken 112 times.
✗ Branch 136 → 137 not taken.
✓ Branch 136 → 138 taken 56 times.
✓ Branch 138 → 139 taken 2 times.
✓ Branch 138 → 150 taken 54 times.
✓ Branch 141 → 142 taken 1 time.
✓ Branch 141 → 150 taken 1 time.
✓ Branch 146 → 147 taken 1 time.
✗ Branch 146 → 150 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 67 → 68 taken 23 times.
✓ Branch 67 → 74 taken 46 times.
✗ Branch 68 → 69 not taken.
✓ Branch 68 → 74 taken 23 times.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 74 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 74 not taken.
✓ Branch 133 → 134 taken 23 times.
✓ Branch 133 → 149 taken 46 times.
✗ Branch 135 → 136 not taken.
✓ Branch 135 → 137 taken 23 times.
✗ Branch 137 → 138 not taken.
✓ Branch 137 → 149 taken 23 times.
✗ Branch 140 → 141 not taken.
✗ Branch 140 → 149 not taken.
✗ Branch 145 → 146 not taken.
✗ Branch 145 → 149 not taken.
1602 if (pass == 2 && thisfs.is_static && thisfs.orgpos > 0 && thisfs.len > thisfs.orglen)
1594
2/16
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 91 not taken.
✗ Branch 146 → 147 not taken.
✗ Branch 146 → 170 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 92 not taken.
✗ Branch 147 → 148 not taken.
✗ Branch 147 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 72 → 73 taken 1 time.
✗ Branch 72 → 92 not taken.
✓ Branch 147 → 148 taken 1 time.
✗ Branch 147 → 171 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 91 not taken.
✗ Branch 146 → 147 not taken.
✗ Branch 146 → 170 not taken.
2 throw_err_block(2, err_static_freespace_growing);
1595
16/32
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)0>(char const*):
✓ Branch 76 → 77 taken 3 times.
✗ Branch 76 → 78 not taken.
✓ Branch 80 → 81 taken 3 times.
✗ Branch 80 → 83 not taken.
✓ Branch 151 → 152 taken 3 times.
✗ Branch 151 → 153 not taken.
✓ Branch 155 → 156 taken 3 times.
✗ Branch 155 → 157 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)1>(char const*):
✓ Branch 77 → 78 taken 561 times.
✗ Branch 77 → 79 not taken.
✓ Branch 81 → 82 taken 561 times.
✗ Branch 81 → 84 not taken.
✓ Branch 152 → 153 taken 561 times.
✗ Branch 152 → 154 not taken.
✓ Branch 156 → 157 taken 561 times.
✗ Branch 156 → 158 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)2>(char const*):
✓ Branch 77 → 78 taken 167 times.
✗ Branch 77 → 79 not taken.
✓ Branch 81 → 82 taken 167 times.
✗ Branch 81 → 84 not taken.
✓ Branch 152 → 153 taken 167 times.
✗ Branch 152 → 154 not taken.
✓ Branch 156 → 157 taken 167 times.
✗ Branch 156 → 158 not taken.
void (anonymous namespace)::cmd_freespace<((anonymous namespace)::freespace_cmds)3>(char const*):
✓ Branch 76 → 77 taken 69 times.
✗ Branch 76 → 78 not taken.
✓ Branch 80 → 81 taken 69 times.
✗ Branch 80 → 83 not taken.
✓ Branch 151 → 152 taken 69 times.
✗ Branch 151 → 153 not taken.
✓ Branch 155 → 156 taken 69 times.
✗ Branch 155 → 157 not taken.
1604 }
1596
1597 6 void cmd_freespace_settings(const char* par) {
1598
2/4
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 8 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 10 not taken.
6 string arg = par;
1599
2/4
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 6 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 8 not taken.
6 parse_freespace_arguments(default_freespace_settings, arg);
1600 9 }
1601
1602 42 void cmd_prot(const char* par) {
1603 42 int addrToLinePos = realsnespos & 0xFFFFFF;
1604
3/9
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 21 times.
✓ Branch 2 → 6 taken 21 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 58 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 21 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 81 not taken.
42 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1605
3/10
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 21 times.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 58 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 21 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 21 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 81 not taken.
42 if (!ratsmetastate) throw_err_block(2, err_prot_not_at_freespace_start);
1606
5/6
✓ Branch 10 → 11 taken 6 times.
✓ Branch 10 → 12 taken 15 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 21 times.
✓ Branch 16 → 17 taken 6 times.
✓ Branch 16 → 18 taken 15 times.
42 if (ratsmetastate==ratsmeta_used) step(-5);
1607 21 int num;
1608
2/4
✓ Branch 12 → 13 taken 21 times.
✗ Branch 12 → 58 not taken.
✓ Branch 20 → 21 taken 21 times.
✗ Branch 20 → 81 not taken.
42 string parbuf = par;
1609
2/4
✓ Branch 14 → 15 taken 21 times.
✗ Branch 14 → 56 not taken.
✓ Branch 23 → 24 taken 21 times.
✗ Branch 23 → 79 not taken.
42 autoptr<char**> pars=qpsplit(parbuf.raw(), ',', &num);
1610
2/4
✓ Branch 16 → 17 taken 21 times.
✗ Branch 16 → 54 not taken.
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 77 not taken.
42 verify_paren(pars);
1611
2/4
✓ Branch 17 → 18 taken 21 times.
✗ Branch 17 → 54 not taken.
✓ Branch 26 → 27 taken 21 times.
✗ Branch 26 → 77 not taken.
42 write1('P');
1612
2/4
✓ Branch 18 → 19 taken 21 times.
✗ Branch 18 → 54 not taken.
✓ Branch 27 → 28 taken 21 times.
✗ Branch 27 → 77 not taken.
42 write1('R');
1613
2/4
✓ Branch 19 → 20 taken 21 times.
✗ Branch 19 → 54 not taken.
✓ Branch 28 → 29 taken 21 times.
✗ Branch 28 → 77 not taken.
42 write1('O');
1614
2/4
✓ Branch 20 → 21 taken 21 times.
✗ Branch 20 → 54 not taken.
✓ Branch 29 → 30 taken 21 times.
✗ Branch 29 → 77 not taken.
42 write1('T');
1615
2/8
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 25 taken 21 times.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 54 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 21 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 77 not taken.
42 if (num * 3 > 255) throw_err_block(0, err_prot_too_many_entries);
1616
2/4
✓ Branch 25 → 26 taken 21 times.
✗ Branch 25 → 54 not taken.
✓ Branch 34 → 35 taken 21 times.
✗ Branch 34 → 77 not taken.
42 write1((unsigned int)(num*3));
1617
4/4
✓ Branch 41 → 27 taken 27 times.
✓ Branch 41 → 42 taken 21 times.
✓ Branch 59 → 36 taken 27 times.
✓ Branch 59 → 60 taken 21 times.
96 for (int i=0;i<num;i++)
1618 {
1619 54 const char * labeltest=pars[i];
1620
2/4
✓ Branch 28 → 29 taken 27 times.
✗ Branch 28 → 53 not taken.
✓ Branch 41 → 42 taken 27 times.
✗ Branch 41 → 74 not taken.
54 string testlabel = labeltest;
1621
2/4
✓ Branch 29 → 30 taken 27 times.
✗ Branch 29 → 51 not taken.
✓ Branch 42 → 43 taken 27 times.
✗ Branch 42 → 72 not taken.
54 snes_label lblval = labelval(&labeltest);
1622
2/8
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 35 taken 27 times.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 51 not taken.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 49 taken 27 times.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 72 not taken.
54 if (*labeltest) throw_err_block(0, err_label_not_found, testlabel.data());
1623
2/4
✓ Branch 35 → 36 taken 27 times.
✗ Branch 35 → 51 not taken.
✓ Branch 49 → 50 taken 27 times.
✗ Branch 49 → 72 not taken.
54 write3(lblval.pos);
1624
6/8
✓ Branch 36 → 37 taken 9 times.
✓ Branch 36 → 39 taken 18 times.
✓ Branch 37 → 38 taken 9 times.
✗ Branch 37 → 51 not taken.
✓ Branch 50 → 51 taken 9 times.
✓ Branch 50 → 55 taken 18 times.
✓ Branch 51 → 52 taken 9 times.
✗ Branch 51 → 72 not taken.
54 if (pass==1) freespaces[lblval.freespace_id].leaked = false;
1625 54 }
1626
2/4
✓ Branch 42 → 43 taken 21 times.
✗ Branch 42 → 54 not taken.
✓ Branch 60 → 61 taken 21 times.
✗ Branch 60 → 77 not taken.
42 write1('S');
1627
2/4
✓ Branch 43 → 44 taken 21 times.
✗ Branch 43 → 54 not taken.
✓ Branch 61 → 62 taken 21 times.
✗ Branch 61 → 77 not taken.
42 write1('T');
1628
2/4
✓ Branch 44 → 45 taken 21 times.
✗ Branch 44 → 54 not taken.
✓ Branch 62 → 63 taken 21 times.
✗ Branch 62 → 77 not taken.
42 write1('O');
1629
2/4
✓ Branch 45 → 46 taken 21 times.
✗ Branch 45 → 54 not taken.
✓ Branch 63 → 64 taken 21 times.
✗ Branch 63 → 77 not taken.
42 write1('P');
1630
2/4
✓ Branch 46 → 47 taken 21 times.
✗ Branch 46 → 54 not taken.
✓ Branch 64 → 65 taken 21 times.
✗ Branch 64 → 77 not taken.
42 write1(0);
1631 42 ratsmetastate=ratsmeta_used;
1632
1633
2/4
✓ Branch 47 → 48 taken 21 times.
✗ Branch 47 → 54 not taken.
✓ Branch 65 → 66 taken 21 times.
✗ Branch 65 → 77 not taken.
42 add_addr_to_line(addrToLinePos);
1634 63 }
1635
1636 18 void cmd_autoclean(char** words, int num_words) {
1637
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 9 times.
✓ Branch 2 → 6 taken 9 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 9 times.
18 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1638
2/4
✓ Branch 6 → 7 taken 9 times.
✗ Branch 6 → 26 not taken.
✓ Branch 8 → 9 taken 9 times.
✗ Branch 8 → 35 not taken.
18 if (num_words==2)
1639 {
1640 18 const char * labeltest = words[1];
1641
2/5
✓ Branch 7 → 8 taken 9 times.
✗ Branch 7 → 46 not taken.
✗ Branch 7 → 47 not taken.
✓ Branch 12 → 13 taken 9 times.
✗ Branch 12 → 63 not taken.
18 string testlabel = labeltest;
1642
2/4
✓ Branch 9 → 10 taken 9 times.
✗ Branch 9 → 21 not taken.
✓ Branch 15 → 16 taken 9 times.
✗ Branch 15 → 30 not taken.
18 if(!stricmpwithlower(words[0], "dl")) {
1643
2/5
✓ Branch 10 → 11 taken 9 times.
✗ Branch 10 → 44 not taken.
✗ Branch 10 → 45 not taken.
✓ Branch 16 → 17 taken 9 times.
✗ Branch 16 → 61 not taken.
18 handle_autoclean(testlabel, -1, snespos);
1644
1645
2/5
✓ Branch 11 → 12 taken 9 times.
✗ Branch 11 → 44 not taken.
✗ Branch 11 → 45 not taken.
✓ Branch 17 → 18 taken 9 times.
✗ Branch 17 → 61 not taken.
18 add_addr_to_line(realsnespos & 0xFFFFFF);
1646
15/29
✓ Branch 12 → 13 taken 3 times.
✓ Branch 12 → 16 taken 6 times.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 40 not taken.
✓ Branch 14 → 15 taken 3 times.
✗ Branch 14 → 40 not taken.
✓ Branch 17 → 18 taken 9 times.
✗ Branch 17 → 40 not taken.
✓ Branch 18 → 19 taken 6 times.
✓ Branch 18 → 20 taken 6 times.
✓ Branch 18 → 23 taken 6 times.
✓ Branch 20 → 21 taken 3 times.
✗ Branch 20 → 55 not taken.
✓ Branch 21 → 22 taken 3 times.
✗ Branch 21 → 55 not taken.
✓ Branch 24 → 25 taken 9 times.
✗ Branch 24 → 55 not taken.
✓ Branch 25 → 26 taken 3 times.
✓ Branch 25 → 27 taken 6 times.
✓ Branch 27 → 28 taken 3 times.
✓ Branch 27 → 29 taken 6 times.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 42 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 43 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 57 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 60 not taken.
18 write3(pass==2 ? labelval(testlabel).pos : 0);
1647 } else {
1648 // other ones are handled in arch-65816
1649 throw_err_block(0, err_broken_autoclean);
1650 }
1651 18 }
1652 else if (num_words == 1) {
1653 if(pass==0) removerats(parse_math_expr(words[0])->evaluate_static().get_integer(), freespacebyte);
1654 } else {
1655 throw_err_block(0, err_broken_autoclean);
1656 }
1657 18 }
1658
1659 6 void cmd_freespacebyte(const char* par) {
1660
5/11
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 13 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 11 not taken.
✗ Branch 4 → 19 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 9 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 17 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 15 not taken.
6 freespacebyte = parse_math_expr(par)->evaluate_static().get_integer();
1661 6 }
1662
1663 6 void cmd_pushpc(const char* par) {
1664
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pushpc", "");
1665 6 verifysnespos();
1666 6 pushpc[pushpcnum].arch=arch;
1667 6 pushpc[pushpcnum].snespos=snespos;
1668 6 pushpc[pushpcnum].snesstart=startpos;
1669 6 pushpc[pushpcnum].snesposreal=realsnespos;
1670 6 pushpc[pushpcnum].snesstartreal=realstartpos;
1671 6 pushpc[pushpcnum].freeid=freespaceid;
1672 6 pushpc[pushpcnum].freest=freespacestart;
1673 6 pushpcnum++;
1674 6 snespos=(int)0xFFFFFFFF;
1675 6 startpos= (int)0xFFFFFFFF;
1676 6 realsnespos= (int)0xFFFFFFFF;
1677 6 realstartpos= (int)0xFFFFFFFF;
1678 6 snespos_valid = false;
1679 6 }
1680
1681 6 void cmd_pullpc(const char* par) {
1682
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pullpc", "");
1683
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 3 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 3 times.
6 if (!pushpcnum) throw_err_block(0, err_pullpc_without_pushpc);
1684 6 pushpcnum--;
1685 6 freespaceend();
1686
2/4
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 3 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 18 taken 3 times.
6 if (arch != pushpc[pushpcnum].arch) throw_err_block(0, err_pullpc_different_arch);
1687 6 snespos=pushpc[pushpcnum].snespos;
1688 6 startpos=pushpc[pushpcnum].snesstart;
1689 6 realsnespos=pushpc[pushpcnum].snesposreal;
1690 6 realstartpos=pushpc[pushpcnum].snesstartreal;
1691 6 freespaceid=pushpc[pushpcnum].freeid;
1692 6 freespacestart=pushpc[pushpcnum].freest;
1693 6 snespos_valid = true;
1694 6 }
1695
1696 6 void cmd_pushbase(const char* par) {
1697
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pushbase", "");
1698 6 basestack[basestacknum] = snespos;
1699 6 basestacknum++;
1700 6 }
1701
1702 6 void cmd_pullbase(const char* par) {
1703
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pullbase", "");
1704
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 3 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 3 times.
6 if (!basestacknum) throw_err_block(0, err_pullbase_without_pushbase);
1705 6 basestacknum--;
1706 6 snespos = basestack[basestacknum];
1707 6 startpos = basestack[basestacknum];
1708
1709
2/4
✓ Branch 12 → 13 taken 3 times.
✗ Branch 12 → 14 not taken.
✓ Branch 15 → 16 taken 3 times.
✗ Branch 15 → 17 not taken.
6 if (snespos != realstartpos)
1710 {
1711 6 optimizeforbank = -1;
1712 }
1713 6 }
1714
1715 12 void cmd_pushns(const char* par) {
1716
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 6 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
12 if(*par) throw_err_block(0, err_broken_command, "pushns", "");
1717
3/6
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 6 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 6 times.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 6 times.
12 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1718 12 pushns[pushnsnum].ns = ns;
1719
4/4
✓ Branch 17 → 13 taken 6 times.
✓ Branch 17 → 18 taken 6 times.
✓ Branch 26 → 18 taken 6 times.
✓ Branch 26 → 27 taken 6 times.
24 for(int i = 0; i < namespace_list.count; i++)
1720 {
1721 12 pushns[pushnsnum].namespace_list.append(namespace_list[i]);
1722 }
1723
1/2
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 6 times.
12 pushns[pushnsnum].nested_namespaces = nested_namespaces;
1724 12 pushnsnum++;
1725
1726 12 namespace_list.reset();
1727 12 ns = "";
1728 12 nested_namespaces = false;
1729 12 }
1730
1731 12 void cmd_pullns(const char* par) {
1732
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 6 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
12 if(*par) throw_err_block(0, err_broken_command, "pullns", "");
1733
3/6
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 6 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 6 times.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 6 times.
12 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1734
2/4
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 6 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 6 times.
12 if (!pushnsnum) throw_err_block(0, err_pullns_without_pushns);
1735 12 pushnsnum--;
1736 12 ns = pushns[pushnsnum].ns;
1737
1/2
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 6 times.
12 nested_namespaces = pushns[pushnsnum].nested_namespaces;
1738 12 namespace_list.reset();
1739
4/4
✓ Branch 24 → 19 taken 12 times.
✓ Branch 24 → 25 taken 6 times.
✓ Branch 38 → 27 taken 12 times.
✓ Branch 38 → 39 taken 6 times.
36 for(int i = 0; i < pushns[pushnsnum].namespace_list.count; i++)
1740 {
1741 24 namespace_list.append(pushns[pushnsnum].namespace_list[i]);
1742 }
1743 12 }
1744
1745 165 void cmd_namespace(char** words, int num_words) {
1746
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 84 times.
✓ Branch 2 → 6 taken 81 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 84 times.
165 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1747 165 bool leave = false;
1748
2/5
✓ Branch 6 → 7 taken 81 times.
✗ Branch 6 → 38 not taken.
✗ Branch 6 → 42 not taken.
✓ Branch 8 → 9 taken 84 times.
✗ Branch 8 → 59 not taken.
165 if (num_words >= 1)
1749 {
1750
5/8
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 13 not taken.
✓ Branch 8 → 9 taken 24 times.
✓ Branch 8 → 14 taken 57 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 84 times.
✓ Branch 12 → 13 taken 24 times.
✓ Branch 12 → 18 taken 60 times.
165 if (!stricmp(words[0], "off"))
1751 {
1752
2/6
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 12 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 13 taken 24 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 24 times.
48 if (num_words != 1) throw_err_block(0, err_invalid_namespace_use);
1753 48 leave = true;
1754 }
1755
5/8
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 22 not taken.
✓ Branch 15 → 16 taken 18 times.
✓ Branch 15 → 26 taken 39 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 60 times.
✓ Branch 21 → 22 taken 18 times.
✓ Branch 21 → 38 taken 42 times.
117 else if (!stricmp(words[0], "nested"))
1756 {
1757
2/6
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 18 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 18 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 26 taken 18 times.
36 if (num_words != 2) throw_err_block(0, err_invalid_namespace_use);
1758
5/8
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
✓ Branch 21 → 22 taken 9 times.
✓ Branch 21 → 23 taken 9 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 18 times.
✓ Branch 30 → 31 taken 9 times.
✓ Branch 30 → 32 taken 9 times.
36 else if (!stricmp(words[1], "on")) nested_namespaces = true;
1759
3/8
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 41 not taken.
✓ Branch 24 → 25 taken 9 times.
✗ Branch 24 → 45 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 9 times.
✓ Branch 36 → 37 taken 9 times.
✗ Branch 36 → 62 not taken.
18 else if (!stricmp(words[1], "off")) nested_namespaces = false;
1760 }
1761 else
1762 {
1763
2/6
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 26 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 30 taken 39 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 42 taken 42 times.
81 if (num_words != 1) throw_err_block(0, err_invalid_namespace_use);
1764 81 const char * tmpstr= safedequote(words[0]);
1765
2/6
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 32 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 39 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 49 taken 42 times.
81 if (!confirmname(tmpstr)) throw_err_block(0, err_invalid_namespace_name);
1766
5/8
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 34 not taken.
✓ Branch 36 → 37 taken 15 times.
✓ Branch 36 → 38 taken 24 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 42 times.
✓ Branch 51 → 52 taken 18 times.
✓ Branch 51 → 53 taken 24 times.
81 if (!nested_namespaces)
1767 {
1768 33 namespace_list.reset();
1769 }
1770
4/12
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 55 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 53 not taken.
✓ Branch 38 → 39 taken 39 times.
✗ Branch 38 → 59 not taken.
✓ Branch 39 → 40 taken 39 times.
✗ Branch 39 → 57 not taken.
✓ Branch 54 → 55 taken 42 times.
✗ Branch 54 → 79 not taken.
✓ Branch 56 → 57 taken 42 times.
✗ Branch 56 → 77 not taken.
81 namespace_list.append(tmpstr);
1771 }
1772 }
1773 else
1774 {
1775 throw_err_block(0, err_invalid_namespace_use);
1776 //leave = true;
1777 }
1778
1779
4/6
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 45 not taken.
✓ Branch 45 → 46 taken 24 times.
✓ Branch 45 → 49 taken 57 times.
✓ Branch 62 → 63 taken 24 times.
✓ Branch 62 → 68 taken 60 times.
165 if (leave)
1780 {
1781
5/8
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 44 not taken.
✓ Branch 46 → 47 taken 18 times.
✓ Branch 46 → 48 taken 6 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 24 times.
✓ Branch 65 → 66 taken 18 times.
✓ Branch 65 → 67 taken 6 times.
48 if (nested_namespaces)
1782 {
1783 36 namespace_list.remove(namespace_list.count - 1);
1784 }
1785 else
1786 {
1787 12 namespace_list.reset();
1788 }
1789 }
1790
1791 // recompute ns
1792 165 ns = "";
1793
4/6
✗ Branch 51 → 47 not taken.
✗ Branch 51 → 52 not taken.
✓ Branch 55 → 51 taken 96 times.
✓ Branch 55 → 56 taken 81 times.
✓ Branch 75 → 70 taken 99 times.
✓ Branch 75 → 76 taken 84 times.
360 for (int i = 0; i < namespace_list.count; i++)
1794 {
1795 195 ns += namespace_list[i];
1796 195 ns += "_";
1797 }
1798 165 }
1799
1800 10171 void cmd_incsrc(const char* par) {
1801 // RPG Hacker: Should this also throw on absolute paths?
1802 // E.g., on something starting with C:/ or whatever.
1803
5/5
✓ Branch 2 → 3 taken 3 times.
✓ Branch 2 → 4 taken 5096 times.
✓ Branch 2 → 6 taken 5072 times.
✓ Branch 4 → 5 taken 3 times.
✓ Branch 4 → 8 taken 5093 times.
10171 if (strchr(par, '\\'))
1804 {
1805
2/4
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 14 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 18 not taken.
6 throw_err_block(0, err_platform_paths);
1806 }
1807
2/4
✓ Branch 6 → 7 taken 5072 times.
✗ Branch 6 → 14 not taken.
✓ Branch 9 → 10 taken 5093 times.
✗ Branch 9 → 18 not taken.
10165 string temp = par;
1808
2/4
✓ Branch 8 → 9 taken 5072 times.
✗ Branch 8 → 12 not taken.
✓ Branch 11 → 12 taken 5093 times.
✗ Branch 11 → 16 not taken.
10165 const char* name = safedequote(temp.raw());
1809
4/4
✓ Branch 9 → 10 taken 69 times.
✓ Branch 9 → 12 taken 5003 times.
✓ Branch 12 → 13 taken 90 times.
✓ Branch 12 → 16 taken 5003 times.
10165 assemblefile(name);
1810 10255 }
1811
1812 60 void cmd_incbin(const char* par) {
1813 60 int addrToLinePos = realsnespos & 0xFFFFFF;
1814 30 int len;
1815 60 int start=0;
1816 60 int end=0;
1817
2/4
✓ Branch 2 → 3 taken 30 times.
✗ Branch 2 → 105 not taken.
✓ Branch 4 → 5 taken 30 times.
✗ Branch 4 → 147 not taken.
60 string temp = par;
1818 60 const char* lengths = strqchr(temp, ':');
1819
4/4
✓ Branch 5 → 6 taken 15 times.
✓ Branch 5 → 42 taken 15 times.
✓ Branch 7 → 8 taken 15 times.
✓ Branch 7 → 62 taken 15 times.
60 if (lengths)
1820 {
1821 30 lengths++;
1822
1823
2/4
✓ Branch 6 → 7 taken 15 times.
✗ Branch 6 → 94 not taken.
✓ Branch 9 → 10 taken 15 times.
✗ Branch 9 → 132 not taken.
30 const char* split = strqpstr(lengths, "..");
1824
6/8
✓ Branch 7 → 8 taken 3 times.
✓ Branch 7 → 11 taken 12 times.
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 94 not taken.
✓ Branch 10 → 11 taken 3 times.
✓ Branch 10 → 14 taken 12 times.
✓ Branch 11 → 12 taken 3 times.
✗ Branch 11 → 132 not taken.
30 if(!split) throw_err_block(0, err_broken_incbin);
1825
2/4
✓ Branch 11 → 12 taken 12 times.
✗ Branch 11 → 94 not taken.
✓ Branch 15 → 16 taken 12 times.
✗ Branch 15 → 132 not taken.
24 string start_str(lengths, split-lengths);
1826
2/8
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 12 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 92 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 12 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 130 not taken.
24 if(start_str == "") throw_err_block(0, err_broken_incbin);
1827
6/12
✓ Branch 18 → 19 taken 12 times.
✗ Branch 18 → 82 not taken.
✓ Branch 20 → 21 taken 12 times.
✗ Branch 20 → 80 not taken.
✓ Branch 21 → 22 taken 12 times.
✗ Branch 21 → 78 not taken.
✓ Branch 24 → 25 taken 12 times.
✗ Branch 24 → 116 not taken.
✓ Branch 27 → 28 taken 12 times.
✗ Branch 27 → 114 not taken.
✓ Branch 29 → 30 taken 12 times.
✗ Branch 29 → 112 not taken.
24 start = parse_math_expr(start_str)->evaluate_non_forward().get_integer();
1828
2/4
✓ Branch 24 → 25 taken 12 times.
✗ Branch 24 → 92 not taken.
✓ Branch 36 → 37 taken 12 times.
✗ Branch 36 → 130 not taken.
24 string end_str(split+2);
1829
2/8
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 30 taken 12 times.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 90 not taken.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 42 taken 12 times.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 128 not taken.
24 if(end_str == "") throw_err_block(0, err_broken_incbin);
1830
6/12
✓ Branch 31 → 32 taken 12 times.
✗ Branch 31 → 88 not taken.
✓ Branch 33 → 34 taken 12 times.
✗ Branch 33 → 86 not taken.
✓ Branch 34 → 35 taken 12 times.
✗ Branch 34 → 84 not taken.
✓ Branch 45 → 46 taken 12 times.
✗ Branch 45 → 124 not taken.
✓ Branch 48 → 49 taken 12 times.
✗ Branch 48 → 122 not taken.
✓ Branch 50 → 51 taken 12 times.
✗ Branch 50 → 120 not taken.
24 end = parse_math_expr(end_str)->evaluate_non_forward().get_integer();
1831 // make temp just the filename without the lengths
1832
2/4
✓ Branch 38 → 39 taken 12 times.
✗ Branch 38 → 90 not taken.
✓ Branch 57 → 58 taken 12 times.
✗ Branch 57 → 128 not taken.
24 temp.truncate(lengths-1 - temp.data());
1833 24 }
1834
2/4
✓ Branch 42 → 43 taken 27 times.
✗ Branch 42 → 103 not taken.
✓ Branch 62 → 63 taken 27 times.
✗ Branch 62 → 145 not taken.
54 const char* current_file = get_current_file_name();
1835 // RPG Hacker: Should this also throw on absolute paths?
1836 // E.g., on something starting with C:/ or whatever.
1837
5/6
✓ Branch 43 → 44 taken 3 times.
✓ Branch 43 → 47 taken 24 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 65 taken 27 times.
✓ Branch 65 → 66 taken 3 times.
✓ Branch 65 → 69 taken 24 times.
54 if (strchr(par, '\\'))
1838 {
1839
2/4
✓ Branch 44 → 45 taken 3 times.
✗ Branch 44 → 103 not taken.
✓ Branch 66 → 67 taken 3 times.
✗ Branch 66 → 145 not taken.
6 throw_err_block(0, err_platform_paths);
1840 }
1841
2/4
✓ Branch 48 → 49 taken 24 times.
✗ Branch 48 → 103 not taken.
✓ Branch 70 → 71 taken 24 times.
✗ Branch 70 → 145 not taken.
48 const char* name = safedequote(temp.raw());
1842
1843 24 char * data;//I couldn't find a way to get this into an autoptr
1844
10/16
✓ Branch 49 → 50 taken 24 times.
✗ Branch 49 → 103 not taken.
✓ Branch 50 → 51 taken 6 times.
✓ Branch 50 → 53 taken 18 times.
✓ Branch 51 → 52 taken 6 times.
✗ Branch 51 → 103 not taken.
✗ Branch 52 → 53 not taken.
✓ Branch 52 → 103 taken 6 times.
✓ Branch 72 → 73 taken 24 times.
✗ Branch 72 → 145 not taken.
✓ Branch 73 → 74 taken 6 times.
✓ Branch 73 → 76 taken 18 times.
✓ Branch 74 → 75 taken 6 times.
✗ Branch 74 → 145 not taken.
✗ Branch 75 → 76 not taken.
✓ Branch 75 → 145 taken 6 times.
48 if (!readfile(name, current_file, &data, &len)) throw_vfile_error(0, asar_get_last_io_error(), name);
1845 36 autoptr<char*> datacopy=data;
1846
4/4
✓ Branch 54 → 55 taken 6 times.
✓ Branch 54 → 56 taken 12 times.
✓ Branch 78 → 79 taken 6 times.
✓ Branch 78 → 80 taken 12 times.
36 if (!end) end=len;
1847
2/12
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 62 taken 18 times.
✗ Branch 57 → 58 not taken.
✗ Branch 57 → 97 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 95 not taken.
✗ Branch 80 → 81 not taken.
✓ Branch 80 → 88 taken 18 times.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 137 not taken.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 135 not taken.
36 if(start < 0) throw_err_block(1, err_file_offset_out_of_bounds, dec(start).data(), name);
1848
6/20
✓ Branch 62 → 63 taken 18 times.
✗ Branch 62 → 65 not taken.
✓ Branch 63 → 64 taken 18 times.
✗ Branch 63 → 65 not taken.
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 70 taken 18 times.
✗ Branch 65 → 66 not taken.
✗ Branch 65 → 100 not taken.
✗ Branch 67 → 68 not taken.
✗ Branch 67 → 98 not taken.
✓ Branch 88 → 89 taken 18 times.
✗ Branch 88 → 91 not taken.
✓ Branch 89 → 90 taken 18 times.
✗ Branch 89 → 91 not taken.
✗ Branch 90 → 91 not taken.
✓ Branch 90 → 98 taken 18 times.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 141 not taken.
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 139 not taken.
36 if (end < start || end > len || end < 0) throw_err_block(1, err_file_offset_out_of_bounds, dec(end).data(), name);
1849
1850
6/8
✓ Branch 71 → 72 taken 33 times.
✗ Branch 71 → 101 not taken.
✓ Branch 73 → 71 taken 33 times.
✓ Branch 73 → 74 taken 18 times.
✓ Branch 101 → 102 taken 33 times.
✗ Branch 101 → 143 not taken.
✓ Branch 103 → 99 taken 33 times.
✓ Branch 103 → 104 taken 18 times.
102 for (int i=start;i<end;i++) write1((unsigned int)data[i]);
1851
2/4
✓ Branch 74 → 75 taken 18 times.
✗ Branch 74 → 101 not taken.
✓ Branch 104 → 105 taken 18 times.
✗ Branch 104 → 143 not taken.
36 add_addr_to_line(addrToLinePos);
1852 78 }
1853
1854 template<bool is_fill>
1855 672 void cmd_skip_fill(char** words, int num_words) {
1856 672 const char* cmdname = is_fill ? "fill" : "skip";
1857
5/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 8 taken 600 times.
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 8 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 6 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 8 taken 66 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 8 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 8 not taken.
672 if(num_words != 1 && num_words != 2 && num_words != 4) throw_err_block(0, err_broken_command, cmdname, "");
1858
9/24
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✓ Branch 8 → 9 taken 6 times.
✓ Branch 8 → 12 taken 300 times.
✗ Branch 8 → 13 not taken.
✓ Branch 8 → 16 taken 300 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 13 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 6 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 3 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 303 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 12 taken 33 times.
✗ Branch 8 → 13 not taken.
✓ Branch 8 → 16 taken 33 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 13 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 16 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 33 times.
672 if(num_words > 1 && stricmp(words[0], "align")) throw_err_block(0, err_broken_command, cmdname, "expected \"align\"");
1859
10/28
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 18 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 18 not taken.
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 25 taken 300 times.
✓ Branch 17 → 18 taken 3 times.
✓ Branch 17 → 21 taken 300 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 6 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 25 taken 3 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 26 taken 303 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 18 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 18 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 25 taken 33 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 33 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 21 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 25 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 26 taken 33 times.
672 if(num_words == 4 && stricmp(words[2], "offset")) throw_err_block(0, err_broken_command, cmdname, "expected \"offset\"");
1860 int amount;
1861
6/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 46 not taken.
✓ Branch 25 → 26 taken 3 times.
✓ Branch 25 → 68 taken 300 times.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 54 taken 300 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 46 not taken.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 68 taken 33 times.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 54 taken 33 times.
672 if(num_words > 1)
1862 {
1863
5/34
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 59 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 57 not taken.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 55 not taken.
✓ Branch 27 → 28 taken 3 times.
✗ Branch 27 → 67 not taken.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 65 not taken.
✓ Branch 30 → 31 taken 6 times.
✗ Branch 30 → 63 not taken.
✗ Branch 30 → 87 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 85 not taken.
✓ Branch 35 → 36 taken 3 times.
✗ Branch 35 → 83 not taken.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 63 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 61 not taken.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 59 not taken.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 71 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 69 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 67 not taken.
✗ Branch 30 → 95 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 93 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 91 not taken.
6 int alignment = parse_math_expr(words[1])->evaluate_static().get_integer();
1864 6 int offset = 0;
1865
2/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 33 not taken.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 41 not taken.
✓ Branch 40 → 41 taken 3 times.
✗ Branch 40 → 55 not taken.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 33 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 41 not taken.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 55 not taken.
6 if(num_words==4)
1866 {
1867
6/36
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 65 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 63 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 61 not taken.
✓ Branch 34 → 35 taken 3 times.
✗ Branch 34 → 73 not taken.
✓ Branch 36 → 37 taken 3 times.
✗ Branch 36 → 71 not taken.
✓ Branch 37 → 38 taken 3 times.
✗ Branch 37 → 69 not taken.
✓ Branch 45 → 46 taken 3 times.
✗ Branch 45 → 95 not taken.
✓ Branch 48 → 49 taken 3 times.
✗ Branch 48 → 93 not taken.
✓ Branch 50 → 51 taken 3 times.
✗ Branch 50 → 91 not taken.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 69 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 67 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 65 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 77 not taken.
✗ Branch 36 → 37 not taken.
✗ Branch 36 → 75 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 73 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 103 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 101 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 99 not taken.
6 offset = parse_math_expr(words[3])->evaluate_static().get_integer();
1868 }
1869
2/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 37 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 3 times.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 59 taken 3 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 37 not taken.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 45 not taken.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 59 not taken.
6 if(alignment > 0x800000) throw_err_block(0, err_alignment_too_big);
1870
2/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 41 not taken.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 49 taken 3 times.
✗ Branch 59 → 60 not taken.
✓ Branch 59 → 63 taken 3 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 41 not taken.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 49 not taken.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 63 not taken.
6 if(alignment < 1) throw_err_block(0, err_alignment_too_small);
1871
2/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 45 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 53 taken 3 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 67 taken 3 times.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 45 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 53 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 67 not taken.
6 if(alignment & (alignment-1)) throw_err_block(0, err_invalid_alignment);
1872 // i just guessed this formula but it seems to work
1873 6 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
1874 // TODO: set current freespace align to at least alignment
1875 }
1876 else
1877 {
1878
12/36
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 71 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 69 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 67 not taken.
✓ Branch 54 → 55 taken 300 times.
✗ Branch 54 → 79 not taken.
✓ Branch 56 → 57 taken 300 times.
✗ Branch 56 → 77 not taken.
✓ Branch 57 → 58 taken 300 times.
✗ Branch 57 → 75 not taken.
✓ Branch 71 → 72 taken 300 times.
✗ Branch 71 → 103 not taken.
✓ Branch 74 → 75 taken 300 times.
✗ Branch 74 → 101 not taken.
✓ Branch 76 → 77 taken 300 times.
✗ Branch 76 → 99 not taken.
void (anonymous namespace)::cmd_skip_fill<true>(char**, int):
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 75 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 73 not taken.
✗ Branch 49 → 50 not taken.
✗ Branch 49 → 71 not taken.
✓ Branch 54 → 55 taken 33 times.
✗ Branch 54 → 83 not taken.
✓ Branch 56 → 57 taken 33 times.
✗ Branch 56 → 81 not taken.
✓ Branch 57 → 58 taken 33 times.
✗ Branch 57 → 79 not taken.
✓ Branch 71 → 72 taken 33 times.
✗ Branch 71 → 111 not taken.
✓ Branch 74 → 75 taken 33 times.
✗ Branch 74 → 109 not taken.
✓ Branch 76 → 77 taken 33 times.
✗ Branch 76 → 107 not taken.
666 amount = parse_math_expr(words[0])->evaluate_non_forward().get_integer();
1879 }
1880 606 if(!is_fill) step(amount);
1881 else
1882 {
1883 66 add_addr_to_line(realsnespos & 0xFFFFFF);
1884
4/6
✗ Branch 57 → 55 not taken.
✗ Branch 57 → 58 not taken.
✓ Branch 65 → 63 taken 203535 times.
✓ Branch 65 → 66 taken 33 times.
✓ Branch 89 → 83 taken 203535 times.
✓ Branch 89 → 90 taken 33 times.
407136 for(int i=0; i < amount; i++) write1(fillbyte[i%12]);
1885 }
1886 672 }
1887
1888 6 void cmd_cleartable(const char* par) {
1889
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "cleartable", "");
1890 6 cleartable();
1891 6 }
1892
1893 6 void cmd_pushtable(const char* par) {
1894
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pushtable", "");
1895 6 tablestack.append(thetable);
1896 6 }
1897
1898 6 void cmd_pulltable(const char* par) {
1899
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "pulltable", "");
1900
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 3 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 3 times.
6 if (tablestack.count <= 0) throw_err_block(0, err_pulltable_without_table);
1901 6 thetable=tablestack[tablestack.count-1];
1902 6 tablestack.remove(tablestack.count-1);
1903 6 }
1904
1905 48 void cmd_function(const char* par) {
1906
2/4
✓ Branch 2 → 3 taken 24 times.
✗ Branch 2 → 37 not taken.
✓ Branch 3 → 4 taken 24 times.
✗ Branch 3 → 50 not taken.
48 string parbuf = par;
1907
2/4
✓ Branch 3 → 4 taken 24 times.
✗ Branch 3 → 35 not taken.
✓ Branch 4 → 5 taken 24 times.
✗ Branch 4 → 48 not taken.
48 parbuf.qnormalize(); // todo what's the point of doing this here in particular???
1908 48 char* name_and_args = parbuf.raw();
1909
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 24 times.
48 char* fn_body = strchr(name_and_args, '=');
1910
2/8
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 9 taken 24 times.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 35 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 12 taken 24 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 48 not taken.
48 if(!fn_body) throw_err_block(0, err_broken_function_declaration);
1911 48 *fn_body = 0;
1912 48 fn_body++;
1913
4/12
✓ Branch 9 → 10 taken 24 times.
✗ Branch 9 → 35 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 24 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 35 not taken.
✓ Branch 14 → 15 taken 24 times.
✗ Branch 14 → 48 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 24 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 48 not taken.
48 if(!confirmqpar(name_and_args)) throw_err_block(0, err_broken_function_declaration);
1914 48 char* startpar = strqchr(name_and_args, '(');
1915
2/8
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 24 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 35 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 24 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 48 not taken.
48 if (!startpar) throw_err_block(0, err_broken_function_declaration);
1916 48 *startpar = 0;
1917 48 startpar++;
1918
3/10
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 24 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 35 not taken.
✓ Branch 26 → 27 taken 24 times.
✗ Branch 26 → 48 not taken.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 31 taken 24 times.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 48 not taken.
48 if(!confirmname(name_and_args)) throw_err_block(0, err_invalid_function_name);
1919 48 char* endpar = strqchr(startpar, ')');
1920 48 *endpar = 0;
1921 48 endpar++;
1922 // it's legal for there to be spaces between ) and =
1923
4/4
✓ Branch 27 → 26 taken 24 times.
✓ Branch 27 → 28 taken 24 times.
✓ Branch 38 → 35 taken 24 times.
✓ Branch 38 → 39 taken 24 times.
96 while(*endpar == ' ') endpar++;
1924
2/8
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 32 taken 24 times.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 35 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 44 taken 24 times.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 48 not taken.
48 if(*endpar) throw_err_block(0, err_broken_function_declaration);
1925
1926
2/4
✓ Branch 32 → 33 taken 24 times.
✗ Branch 32 → 35 not taken.
✓ Branch 44 → 45 taken 24 times.
✗ Branch 44 → 48 not taken.
48 createuserfunc(name_and_args, startpar, fn_body);
1927 72 }
1928
1929 324 void cmd_print(const char* par) {
1930
4/4
✓ Branch 2 → 3 taken 155 times.
✓ Branch 2 → 10 taken 4 times.
✓ Branch 3 → 4 taken 161 times.
✓ Branch 3 → 12 taken 4 times.
324 string out = handle_print(par);
1931
6/8
✓ Branch 3 → 4 taken 49 times.
✓ Branch 3 → 6 taken 106 times.
✓ Branch 4 → 5 taken 51 times.
✓ Branch 4 → 7 taken 110 times.
✓ Branch 5 → 6 taken 49 times.
✗ Branch 5 → 8 not taken.
✓ Branch 6 → 7 taken 51 times.
✗ Branch 6 → 10 not taken.
316 if(pass == 2) print(out);
1932 477 }
1933
1934 6 void cmd_reset(const char* par) {
1935 if(0);
1936
3/6
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 3 times.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 5 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 6 not taken.
6 else if (!stricmp(par, "bytes")) bytes=0;
1937 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
1938 else throw_err_block(2, err_unknown_variable);
1939 6 }
1940
1941 template<int width, bool is_fill>
1942 54 void cmd_padbytes(const char* par) {
1943
25/88
void (anonymous namespace)::cmd_padbytes<1, false>(char const*):
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 5 → 6 taken 6 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<1, true>(char const*):
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 24 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<2, false>(char const*):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 19 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 15 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 26 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<2, true>(char const*):
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<3, false>(char const*):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 19 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 15 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 26 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<3, true>(char const*):
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<4, false>(char const*):
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 19 not taken.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 15 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 26 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 24 not taken.
void (anonymous namespace)::cmd_padbytes<4, true>(char const*):
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 19 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 17 not taken.
✗ Branch 4 → 28 not taken.
✓ Branch 5 → 6 taken 3 times.
✗ Branch 5 → 15 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 26 not taken.
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 24 not taken.
54 unsigned int val = parse_math_expr(par)->evaluate_static().get_integer();
1944
20/32
void (anonymous namespace)::cmd_padbytes<1, false>(char const*):
✓ Branch 13 → 9 taken 72 times.
✓ Branch 13 → 14 taken 6 times.
✓ Branch 22 → 15 taken 72 times.
✓ Branch 22 → 23 taken 6 times.
void (anonymous namespace)::cmd_padbytes<1, true>(char const*):
✓ Branch 13 → 9 taken 144 times.
✓ Branch 13 → 14 taken 12 times.
✓ Branch 22 → 15 taken 144 times.
✓ Branch 22 → 23 taken 12 times.
void (anonymous namespace)::cmd_padbytes<2, false>(char const*):
✗ Branch 13 → 9 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 22 → 15 not taken.
✗ Branch 22 → 23 not taken.
void (anonymous namespace)::cmd_padbytes<2, true>(char const*):
✓ Branch 13 → 9 taken 18 times.
✓ Branch 13 → 14 taken 3 times.
✓ Branch 22 → 15 taken 18 times.
✓ Branch 22 → 23 taken 3 times.
void (anonymous namespace)::cmd_padbytes<3, false>(char const*):
✗ Branch 13 → 9 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 22 → 15 not taken.
✗ Branch 22 → 23 not taken.
void (anonymous namespace)::cmd_padbytes<3, true>(char const*):
✓ Branch 13 → 9 taken 12 times.
✓ Branch 13 → 14 taken 3 times.
✓ Branch 22 → 15 taken 12 times.
✓ Branch 22 → 23 taken 3 times.
void (anonymous namespace)::cmd_padbytes<4, false>(char const*):
✗ Branch 13 → 9 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 22 → 15 not taken.
✗ Branch 22 → 23 not taken.
void (anonymous namespace)::cmd_padbytes<4, true>(char const*):
✓ Branch 13 → 9 taken 9 times.
✓ Branch 13 → 14 taken 3 times.
✓ Branch 22 → 15 taken 9 times.
✓ Branch 22 → 23 taken 3 times.
564 for (int i=0;i<12;i+=width)
1945 {
1946 510 unsigned int tmpval=val;
1947
20/32
void (anonymous namespace)::cmd_padbytes<1, false>(char const*):
✓ Branch 11 → 10 taken 72 times.
✓ Branch 11 → 12 taken 72 times.
✓ Branch 20 → 16 taken 72 times.
✓ Branch 20 → 21 taken 72 times.
void (anonymous namespace)::cmd_padbytes<1, true>(char const*):
✓ Branch 11 → 10 taken 144 times.
✓ Branch 11 → 12 taken 144 times.
✓ Branch 20 → 16 taken 144 times.
✓ Branch 20 → 21 taken 144 times.
void (anonymous namespace)::cmd_padbytes<2, false>(char const*):
✗ Branch 11 → 10 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 20 → 16 not taken.
✗ Branch 20 → 21 not taken.
void (anonymous namespace)::cmd_padbytes<2, true>(char const*):
✓ Branch 11 → 10 taken 36 times.
✓ Branch 11 → 12 taken 18 times.
✓ Branch 20 → 16 taken 36 times.
✓ Branch 20 → 21 taken 18 times.
void (anonymous namespace)::cmd_padbytes<3, false>(char const*):
✗ Branch 11 → 10 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 20 → 16 not taken.
✗ Branch 20 → 21 not taken.
void (anonymous namespace)::cmd_padbytes<3, true>(char const*):
✓ Branch 11 → 10 taken 36 times.
✓ Branch 11 → 12 taken 12 times.
✓ Branch 20 → 16 taken 36 times.
✓ Branch 20 → 21 taken 12 times.
void (anonymous namespace)::cmd_padbytes<4, false>(char const*):
✗ Branch 11 → 10 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 20 → 16 not taken.
✗ Branch 20 → 21 not taken.
void (anonymous namespace)::cmd_padbytes<4, true>(char const*):
✓ Branch 11 → 10 taken 36 times.
✓ Branch 11 → 12 taken 9 times.
✓ Branch 20 → 16 taken 36 times.
✓ Branch 20 → 21 taken 9 times.
1158 for (int j=0;j<width;j++)
1948 {
1949 648 (is_fill ? fillbyte : padbyte)[i+j] = (unsigned char)tmpval;
1950 648 tmpval>>=8;
1951 }
1952 }
1953 54 }
1954
1955 12 void cmd_pad(const char* par) {
1956
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 12 times.
12 if (freespaceid > 0) throw_err_block(0, err_pad_in_freespace);
1957
5/11
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 31 not taken.
✓ Branch 8 → 9 taken 12 times.
✗ Branch 8 → 29 not taken.
✗ Branch 8 → 43 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 27 not taken.
✓ Branch 11 → 12 taken 6 times.
✗ Branch 11 → 41 not taken.
✓ Branch 13 → 14 taken 6 times.
✗ Branch 13 → 39 not taken.
12 int num = parse_math_expr(par)->evaluate_non_forward().get_integer();
1958
2/12
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 18 taken 6 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 35 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 33 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 26 taken 6 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 49 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 47 not taken.
12 if ((unsigned int)num & 0xFF000000) throw_err_block(0, err_snes_address_doesnt_map_to_rom, hex((unsigned int)num, 6).data());
1959
2/4
✓ Branch 18 → 19 taken 6 times.
✗ Branch 18 → 26 not taken.
✓ Branch 26 → 27 taken 6 times.
✗ Branch 26 → 38 not taken.
12 if (num>realsnespos)
1960 {
1961 12 int end=snestopc(num);
1962 12 int start=snestopc(realsnespos);
1963 12 int len=end-start;
1964 12 add_addr_to_line(realsnespos & 0xFFFFFF);
1965
4/4
✓ Branch 25 → 23 taken 30 times.
✓ Branch 25 → 26 taken 6 times.
✓ Branch 37 → 31 taken 30 times.
✓ Branch 37 → 38 taken 6 times.
72 for (int i=0;i<len;i++) write1(padbyte[i%12]);
1966 }
1967 12 }
1968
1969 90 void cmd_arch(const char* par) {
1970
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 45 times.
✓ Branch 2 → 6 taken 45 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 45 times.
90 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1971
5/8
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 8 not taken.
✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 33 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 45 times.
✓ Branch 10 → 11 taken 12 times.
✓ Branch 10 → 12 taken 33 times.
90 if (!stricmp(par, "65816")) { arch=arch_65816; return; }
1972
5/8
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✓ Branch 10 → 11 taken 21 times.
✓ Branch 10 → 12 taken 12 times.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 33 times.
✓ Branch 14 → 15 taken 21 times.
✓ Branch 14 → 16 taken 12 times.
66 if (!stricmp(par, "spc700")) { arch=arch_spc700; return; }
1973
3/8
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
✓ Branch 13 → 14 taken 12 times.
✗ Branch 13 → 15 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 12 times.
✓ Branch 18 → 19 taken 12 times.
✗ Branch 18 → 20 not taken.
24 if (!stricmp(par, "superfx")) { arch=arch_superfx; return; }
1974 throw_err_block(0, err_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
1975 }
1976
1977 72 void cmd_braces(const char* par) {
1978
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 36 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 36 times.
72 if(*par) throw_err_block(0, err_broken_command, "{ / }", "");
1979 72 }
1980
1981 template<void (*F)(const char*)>
1982 265 void wrap_mapper(const char* par) {
1983
24/40
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_norom>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 27 times.
✓ Branch 2 → 6 taken 18 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 27 times.
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_sa1rom>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 15 times.
✓ Branch 2 → 6 taken 12 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 15 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)1>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 51 times.
✓ Branch 2 → 6 taken 48 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 51 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)2>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 29 times.
✓ Branch 2 → 6 taken 23 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 29 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)4>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)5>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 9 times.
✓ Branch 2 → 6 taken 6 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 9 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)6>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)7>(char const*))>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 6 times.
265 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1984
8/16
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_norom>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 27 times.
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_sa1rom>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 15 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)1>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 51 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)2>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 29 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)4>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)5>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 9 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)6>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)7>(char const*))>(char const*):
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 6 times.
265 mapper_t previous_mapper = mapper;
1985 F(par);
1986
34/48
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_norom>(char const*):
✓ Branch 7 → 8 taken 12 times.
✓ Branch 7 → 9 taken 6 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 27 times.
✓ Branch 13 → 14 taken 21 times.
✓ Branch 13 → 15 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_sa1rom>(char const*):
✓ Branch 7 → 8 taken 6 times.
✓ Branch 7 → 9 taken 6 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 15 times.
✓ Branch 13 → 14 taken 9 times.
✓ Branch 13 → 15 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)1>(char const*))>(char const*):
✓ Branch 7 → 8 taken 36 times.
✓ Branch 7 → 9 taken 12 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 51 times.
✓ Branch 13 → 14 taken 39 times.
✓ Branch 13 → 15 taken 12 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)2>(char const*))>(char const*):
✓ Branch 7 → 8 taken 8 times.
✓ Branch 7 → 9 taken 15 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 29 times.
✓ Branch 13 → 14 taken 14 times.
✓ Branch 13 → 15 taken 15 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)4>(char const*))>(char const*):
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 9 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 6 times.
✓ Branch 13 → 14 taken 6 times.
✗ Branch 13 → 15 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)5>(char const*))>(char const*):
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 9 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 9 times.
✓ Branch 13 → 14 taken 9 times.
✗ Branch 13 → 15 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)6>(char const*))>(char const*):
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 3 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 6 times.
✓ Branch 13 → 14 taken 3 times.
✓ Branch 13 → 15 taken 3 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)7>(char const*))>(char const*):
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 3 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 6 times.
✓ Branch 13 → 14 taken 3 times.
✓ Branch 13 → 15 taken 3 times.
265 if(!mapper_set){
1987 175 mapper_set = true;
1988
18/48
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_norom>(char const*):
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 6 times.
✓ Branch 17 → 18 taken 6 times.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(anonymous namespace)::mapper_sa1rom>(char const*):
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 6 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 6 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 6 times.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)1>(char const*))>(char const*):
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 12 times.
✓ Branch 17 → 18 taken 12 times.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)2>(char const*))>(char const*):
✓ Branch 9 → 10 taken 15 times.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 15 times.
✓ Branch 17 → 18 taken 15 times.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)4>(char const*))>(char const*):
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)5>(char const*))>(char const*):
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)6>(char const*))>(char const*):
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 3 times.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 19 not taken.
void (anonymous namespace)::wrap_mapper<&(void (anonymous namespace)::mapper_simple<(mapper_t)7>(char const*))>(char const*):
✓ Branch 9 → 10 taken 3 times.
✗ Branch 9 → 11 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 3 times.
✓ Branch 17 → 18 taken 3 times.
✗ Branch 17 → 19 not taken.
90 }else if(previous_mapper != mapper){
1989 78 throw_warning(1, warn_mapper_already_set);
1990 }
1991 265 }
1992
1993 template<mapper_t the_mapper>
1994 193 void mapper_simple(const char* par) {
1995
12/24
void (anonymous namespace)::mapper_simple<(mapper_t)1>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 48 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 51 times.
void (anonymous namespace)::mapper_simple<(mapper_t)2>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 23 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 29 times.
void (anonymous namespace)::mapper_simple<(mapper_t)4>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
void (anonymous namespace)::mapper_simple<(mapper_t)5>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 6 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 9 times.
void (anonymous namespace)::mapper_simple<(mapper_t)6>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
void (anonymous namespace)::mapper_simple<(mapper_t)7>(char const*):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
193 if(*par) throw_err_block(0, err_invalid_mapper);
1996 193 mapper = the_mapper;
1997 193 }
1998
1999 45 void mapper_norom(const char* par) {
2000
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 18 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 27 times.
45 if(*par) throw_err_block(0, err_invalid_mapper);
2001 //$000000 would be the best snespos for this, but I don't care
2002 45 mapper = norom;
2003
4/6
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 18 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 27 times.
✓ Branch 9 → 10 taken 6 times.
✓ Branch 9 → 11 taken 21 times.
45 if(!force_checksum_fix)
2004 6 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2005 45 }
2006
2007 27 void mapper_sa1rom(const char* par) {
2008
4/4
✓ Branch 2 → 3 taken 9 times.
✓ Branch 2 → 22 taken 3 times.
✓ Branch 3 → 4 taken 12 times.
✓ Branch 3 → 84 taken 3 times.
27 if (*par) {
2009 // todo why doesn't this allow math?
2010
2/4
✓ Branch 5 → 6 taken 9 times.
✗ Branch 5 → 15 not taken.
✓ Branch 9 → 10 taken 12 times.
✗ Branch 9 → 31 not taken.
42 if (!is_digit(par[0]) || par[1]!=',' ||
2011
4/8
✓ Branch 7 → 8 taken 9 times.
✗ Branch 7 → 15 not taken.
✓ Branch 8 → 9 taken 9 times.
✗ Branch 8 → 15 not taken.
✓ Branch 13 → 14 taken 12 times.
✗ Branch 13 → 31 not taken.
✓ Branch 16 → 17 taken 12 times.
✗ Branch 16 → 31 not taken.
21 !is_digit(par[2]) || par[3]!=',' ||
2012
4/8
✓ Branch 10 → 11 taken 9 times.
✗ Branch 10 → 15 not taken.
✓ Branch 11 → 12 taken 9 times.
✗ Branch 11 → 15 not taken.
✓ Branch 20 → 21 taken 12 times.
✗ Branch 20 → 31 not taken.
✓ Branch 23 → 24 taken 12 times.
✗ Branch 23 → 31 not taken.
21 !is_digit(par[4]) || par[5]!=',' ||
2013
8/16
✓ Branch 4 → 5 taken 9 times.
✗ Branch 4 → 15 not taken.
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 31 not taken.
✓ Branch 13 → 14 taken 9 times.
✗ Branch 13 → 15 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 9 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 9 times.
✓ Branch 27 → 28 taken 12 times.
✗ Branch 27 → 31 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 12 times.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 37 taken 12 times.
42 !is_digit(par[6]) || par[7]) throw_err_block(0, err_invalid_mapper);
2014 /*
2015 // this part is just useless ???
2016 int len;
2017 string parbuf = par;
2018 autoptr<char**> pars=qpsplit(parbuf.raw(), ',', &len);
2019 verify_paren(pars);
2020 if (len!=4) throw_err_block(0, err_invalid_mapper); */
2021
1/2
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 43 taken 12 times.
21 sa1banks[0]=(par[0]-'0')<<20;
2022
1/2
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 54 taken 12 times.
21 sa1banks[1]=(par[2]-'0')<<20;
2023
1/2
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 67 taken 12 times.
21 sa1banks[4]=(par[4]-'0')<<20;
2024
1/2
✗ Branch 76 → 77 not taken.
✓ Branch 76 → 80 taken 12 times.
21 sa1banks[5]=(par[6]-'0')<<20;
2025 }
2026 else
2027 {
2028 6 sa1banks[0]=0<<20;
2029 6 sa1banks[1]=1<<20;
2030 6 sa1banks[4]=2<<20;
2031 6 sa1banks[5]=3<<20;
2032 }
2033 27 mapper=sa1rom;
2034 27 }
2035
2036 using command_fn_t = void(*)(const char*);
2037
2038 template<void (*F)(char**, int)>
2039 1417 void wrap_split(const char* par) {
2040
22/44
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 2 → 3 taken 57 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 57 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_optimize>(char const*):
✓ Branch 2 → 3 taken 54 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 54 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_spcblock>(char const*):
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_warnings>(char const*):
✓ Branch 2 → 3 taken 66 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 66 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_autoclean>(char const*):
✓ Branch 2 → 3 taken 9 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 9 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endstruct>(char const*):
✓ Branch 2 → 3 taken 57 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 57 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_namespace>(char const*):
✓ Branch 2 → 3 taken 81 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 84 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<false>(char**, int))>(char const*):
✓ Branch 2 → 3 taken 303 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 303 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<true>(char**, int))>(char const*):
✓ Branch 2 → 3 taken 33 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 33 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endspcblock>(char const*):
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 30 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_check>(char const*):
✓ Branch 2 → 3 taken 35 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 35 times.
✗ Branch 3 → 30 not taken.
1417 string temp(par);
2041 710 int num_words;
2042
22/44
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 4 → 5 taken 57 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 57 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_optimize>(char const*):
✓ Branch 4 → 5 taken 54 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 54 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_spcblock>(char const*):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_warnings>(char const*):
✓ Branch 4 → 5 taken 66 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 66 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_autoclean>(char const*):
✓ Branch 4 → 5 taken 9 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 9 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endstruct>(char const*):
✓ Branch 4 → 5 taken 57 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 57 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_namespace>(char const*):
✓ Branch 4 → 5 taken 81 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 84 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<false>(char**, int))>(char const*):
✓ Branch 4 → 5 taken 303 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 303 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<true>(char**, int))>(char const*):
✓ Branch 4 → 5 taken 33 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 33 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endspcblock>(char const*):
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 28 not taken.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_check>(char const*):
✓ Branch 4 → 5 taken 35 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 35 times.
✗ Branch 7 → 28 not taken.
1417 autoptr<char**> word = qsplit(temp.raw(), ' ', &num_words);
2043
76/132
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 6 → 7 taken 18 times.
✓ Branch 6 → 10 taken 39 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 18 times.
✓ Branch 9 → 10 taken 18 times.
✓ Branch 9 → 15 taken 39 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 57 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 18 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 57 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_optimize>(char const*):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 54 times.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 15 taken 54 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 54 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 54 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_spcblock>(char const*):
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 10 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 6 times.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 15 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 6 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 6 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 6 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_warnings>(char const*):
✓ Branch 6 → 7 taken 24 times.
✓ Branch 6 → 10 taken 42 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 24 times.
✓ Branch 9 → 10 taken 24 times.
✓ Branch 9 → 15 taken 42 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 66 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 24 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 66 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_autoclean>(char const*):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 9 times.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 15 taken 9 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 9 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 9 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endstruct>(char const*):
✓ Branch 6 → 7 taken 54 times.
✓ Branch 6 → 10 taken 3 times.
✓ Branch 8 → 9 taken 54 times.
✗ Branch 8 → 10 not taken.
✓ Branch 9 → 10 taken 54 times.
✓ Branch 9 → 15 taken 3 times.
✓ Branch 11 → 12 taken 54 times.
✓ Branch 11 → 13 taken 3 times.
✓ Branch 13 → 14 taken 54 times.
✗ Branch 13 → 15 not taken.
✓ Branch 16 → 17 taken 54 times.
✓ Branch 16 → 18 taken 3 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_namespace>(char const*):
✓ Branch 6 → 7 taken 63 times.
✓ Branch 6 → 10 taken 18 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 63 times.
✓ Branch 9 → 10 taken 66 times.
✓ Branch 9 → 15 taken 18 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 81 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 66 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 84 times.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<false>(char**, int))>(char const*):
✓ Branch 6 → 7 taken 300 times.
✓ Branch 6 → 10 taken 3 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 300 times.
✓ Branch 9 → 10 taken 300 times.
✓ Branch 9 → 15 taken 3 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 303 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 300 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 303 times.
void (anonymous namespace)::wrap_split<&(void (anonymous namespace)::cmd_skip_fill<true>(char**, int))>(char const*):
✓ Branch 6 → 7 taken 33 times.
✗ Branch 6 → 10 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 33 times.
✓ Branch 9 → 10 taken 33 times.
✗ Branch 9 → 15 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 33 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 33 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 33 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_endspcblock>(char const*):
✓ Branch 6 → 7 taken 3 times.
✓ Branch 6 → 10 taken 3 times.
✓ Branch 8 → 9 taken 3 times.
✗ Branch 8 → 10 not taken.
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 15 taken 3 times.
✓ Branch 11 → 12 taken 3 times.
✓ Branch 11 → 13 taken 3 times.
✓ Branch 13 → 14 taken 3 times.
✗ Branch 13 → 15 not taken.
✓ Branch 16 → 17 taken 3 times.
✓ Branch 16 → 18 taken 3 times.
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_check>(char const*):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 35 times.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 15 taken 35 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 35 times.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 35 times.
1417 if(num_words == 1 && word[0][0] == 0) num_words--;
2044 F(word, num_words);
2045 2132 }
2046
2047 }
2048
2049
13/18
✓ Branch 14 → 15 taken 702 times.
✓ Branch 14 → 18 taken 5 times.
✓ Branch 15 → 16 taken 450 times.
✗ Branch 15 → 49 not taken.
✓ Branch 19 → 20 taken 705 times.
✓ Branch 19 → 26 taken 5 times.
✓ Branch 24 → 25 taken 468 times.
✗ Branch 24 → 80 not taken.
✓ Branch 25 → 26 taken 888 times.
✓ Branch 25 → 33 taken 1783 times.
✓ Branch 31 → 32 taken 875 times.
✗ Branch 31 → 50 not taken.
✓ Branch 34 → 35 taken 2658 times.
✗ Branch 34 → 50 not taken.
✓ Branch 35 → 36 taken 925 times.
✓ Branch 35 → 53 taken 1857 times.
✓ Branch 54 → 55 taken 2769 times.
✗ Branch 54 → 82 not taken.
9840 static constexpr auto normal_commands = frozen::make_unordered_map<frozen::string, command_fn_t>({
2050 { "db", cmd_write_data<write1> },
2051 { "dw", cmd_write_data<write2> },
2052 { "dl", cmd_write_data<write3> },
2053 { "dd", cmd_write_data<write4> },
2054 { "assert", cmd_assert },
2055 { "undef", cmd_undef },
2056 { "error", cmd_error },
2057 { "warn", cmd_warn },
2058 { "warnings", wrap_split<cmd_warnings> },
2059 { "global", cmd_global },
2060 { "check", wrap_split<cmd_check> },
2061 { "asar", cmd_asar },
2062 { "include", cmd_include },
2063 { "includefrom", cmd_includefrom },
2064 { "includeonce", cmd_includeonce },
2065 { "org", cmd_org },
2066 { "struct", wrap_split<cmd_struct> },
2067 { "endstruct", wrap_split<cmd_endstruct> },
2068 { "spcblock", wrap_split<cmd_spcblock> },
2069 { "endspcblock", wrap_split<cmd_endspcblock> },
2070 { "base", cmd_base },
2071 { "dpbase", cmd_dpbase },
2072 { "optimize", wrap_split<cmd_optimize> },
2073 { "bank", cmd_bank },
2074 { "freespace", cmd_freespace<freespace_cmds::freespace> },
2075 { "freecode", cmd_freespace<freespace_cmds::freecode> },
2076 { "freedata", cmd_freespace<freespace_cmds::freedata> },
2077 { "segment", cmd_freespace<freespace_cmds::segment> },
2078 { "freespace_settings", cmd_freespace_settings },
2079 { "prot", cmd_prot },
2080 { "autoclean", wrap_split<cmd_autoclean> },
2081 { "freespacebyte", cmd_freespacebyte },
2082 { "pushpc", cmd_pushpc },
2083 { "pullpc", cmd_pullpc },
2084 { "pushbase", cmd_pushbase },
2085 { "pullbase", cmd_pullbase },
2086 { "pushns", cmd_pushns },
2087 { "pullns", cmd_pullns },
2088 { "namespace", wrap_split<cmd_namespace> },
2089 { "incsrc", cmd_incsrc },
2090 { "incbin", cmd_incbin },
2091 { "skip", wrap_split<cmd_skip_fill<false>> },
2092 { "fill", wrap_split<cmd_skip_fill<true>> },
2093 { "cleartable", cmd_cleartable },
2094 { "pushtable", cmd_pushtable },
2095 { "pulltable", cmd_pulltable },
2096 { "function", cmd_function },
2097 { "print", cmd_print },
2098 { "reset", cmd_reset },
2099 { "padbyte", cmd_padbytes<1, false> },
2100 { "padword", cmd_padbytes<2, false> },
2101 { "padlong", cmd_padbytes<3, false> },
2102 { "paddword", cmd_padbytes<4, false> },
2103 { "fillbyte", cmd_padbytes<1, true> },
2104 { "fillword", cmd_padbytes<2, true> },
2105 { "filllong", cmd_padbytes<3, true> },
2106 { "filldword", cmd_padbytes<4, true> },
2107 { "pad", cmd_pad },
2108 { "arch", cmd_arch },
2109 { "{", cmd_braces },
2110 { "}", cmd_braces },
2111
2112 { "lorom", wrap_mapper<mapper_simple<lorom>> },
2113 { "hirom", wrap_mapper<mapper_simple<hirom>> },
2114 { "exlorom", wrap_mapper<mapper_simple<exlorom>> },
2115 { "exhirom", wrap_mapper<mapper_simple<exhirom>> },
2116 { "sfxrom", wrap_mapper<mapper_simple<sfxrom>> },
2117 { "norom", wrap_mapper<mapper_norom> },
2118 { "sa1rom", wrap_mapper<mapper_sa1rom> },
2119 { "fullsa1rom", wrap_mapper<mapper_simple<bigsa1rom>> },
2120 });
2121
2122 namespace control_flow {
2123
2124 enum cf_cmds {
2125 c_if,
2126 c_elseif,
2127 c_while,
2128 c_for,
2129 };
2130
2131 // todo possibly this would be cleaner if `for` was refactored out entirely?
2132 template<cf_cmds type>
2133 3132 void cf_start(const char* par, int& single_line_for_tracker) {
2134 3132 const char* typ_name =
2135 type == c_if ? "if" :
2136 type == c_elseif ? "elseif" :
2137 type == c_while ? "while" : "for";
2138 3132 whiletracker wstatus;
2139
8/16
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 3 → 4 taken 264 times.
✗ Branch 3 → 45 not taken.
✓ Branch 4 → 5 taken 264 times.
✗ Branch 4 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 3 → 4 taken 165 times.
✗ Branch 3 → 58 not taken.
✓ Branch 4 → 5 taken 165 times.
✗ Branch 4 → 76 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 3 → 4 taken 963 times.
✗ Branch 3 → 45 not taken.
✓ Branch 4 → 5 taken 963 times.
✗ Branch 4 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 3 → 4 taken 174 times.
✗ Branch 3 → 115 not taken.
✓ Branch 4 → 5 taken 174 times.
✗ Branch 4 → 204 not taken.
3132 wstatus.startline = get_current_line();
2140 3132 wstatus.iswhile = type == c_while;
2141 3132 wstatus.cond = false;
2142 3132 wstatus.is_for = false;
2143 3132 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
2144 3132 wstatus.for_has_var_backup = false;
2145 348 if(type == c_for) wstatus.is_for = true;
2146
2147 3132 bool is_for_cont = false;
2148 // if this is a for loop and a whilestatus entry already exists at this level,
2149 // and the for loop isn't finished, this is a continuation of the for loop
2150 348 if ((type == c_for)
2151
6/9
✓ Branch 5 → 6 taken 174 times.
✗ Branch 5 → 115 not taken.
✓ Branch 6 → 7 taken 340 times.
✓ Branch 6 → 11 taken 8 times.
✗ Branch 6 → 204 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 174 times.
✓ Branch 10 → 11 taken 166 times.
✓ Branch 10 → 19 taken 8 times.
348 && whilestatus.count > numif && whilestatus[numif].is_for
2152
14/20
✓ Branch 4 → 5 taken 174 times.
✗ Branch 4 → 11 not taken.
✓ Branch 5 → 6 taken 174 times.
✗ Branch 5 → 19 not taken.
✓ Branch 7 → 8 taken 166 times.
✗ Branch 7 → 115 not taken.
✓ Branch 8 → 9 taken 166 times.
✗ Branch 8 → 115 not taken.
✓ Branch 9 → 10 taken 123 times.
✓ Branch 9 → 11 taken 43 times.
✓ Branch 11 → 12 taken 166 times.
✗ Branch 11 → 204 not taken.
✓ Branch 12 → 13 taken 123 times.
✓ Branch 12 → 14 taken 51 times.
✓ Branch 14 → 15 taken 166 times.
✗ Branch 14 → 204 not taken.
✓ Branch 17 → 18 taken 123 times.
✓ Branch 17 → 19 taken 43 times.
✓ Branch 20 → 21 taken 123 times.
✓ Branch 20 → 22 taken 51 times.
696 && whilestatus[numif].for_cur < whilestatus[numif].for_end) {
2153 246 is_for_cont = true;
2154 }
2155
25/58
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 264 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 264 times.
✗ Branch 7 → 45 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 60 not taken.
✓ Branch 9 → 10 taken 264 times.
✗ Branch 9 → 45 not taken.
✓ Branch 10 → 11 taken 528 times.
✗ Branch 10 → 45 not taken.
✗ Branch 10 → 60 not taken.
✓ Branch 12 → 13 taken 264 times.
✗ Branch 12 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 165 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 165 times.
✗ Branch 7 → 58 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 76 not taken.
✓ Branch 9 → 10 taken 165 times.
✗ Branch 9 → 58 not taken.
✓ Branch 10 → 11 taken 330 times.
✗ Branch 10 → 58 not taken.
✗ Branch 10 → 76 not taken.
✓ Branch 12 → 13 taken 165 times.
✗ Branch 12 → 76 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 963 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 10 taken 963 times.
✗ Branch 7 → 45 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 60 not taken.
✓ Branch 9 → 10 taken 963 times.
✗ Branch 9 → 45 not taken.
✓ Branch 10 → 11 taken 1926 times.
✗ Branch 10 → 45 not taken.
✗ Branch 10 → 60 not taken.
✓ Branch 12 → 13 taken 963 times.
✗ Branch 12 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 14 → 15 taken 123 times.
✓ Branch 14 → 17 taken 51 times.
✓ Branch 15 → 16 taken 123 times.
✗ Branch 15 → 115 not taken.
✓ Branch 17 → 18 taken 51 times.
✗ Branch 17 → 115 not taken.
✓ Branch 18 → 19 taken 51 times.
✗ Branch 18 → 115 not taken.
✓ Branch 22 → 23 taken 123 times.
✓ Branch 22 → 25 taken 51 times.
✓ Branch 23 → 24 taken 123 times.
✗ Branch 23 → 204 not taken.
✓ Branch 25 → 26 taken 51 times.
✗ Branch 25 → 204 not taken.
✓ Branch 27 → 28 taken 51 times.
✗ Branch 27 → 204 not taken.
3132 whiletracker& addedwstatus = is_for_cont ? whilestatus[numif] : (whilestatus[numif] = wstatus);
2156 //handle nested if statements
2157
20/20
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 12 → 13 taken 24 times.
✓ Branch 12 → 14 taken 240 times.
✓ Branch 14 → 15 taken 24 times.
✓ Branch 14 → 16 taken 240 times.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 12 → 13 taken 111 times.
✓ Branch 12 → 15 taken 54 times.
✓ Branch 13 → 14 taken 24 times.
✓ Branch 13 → 15 taken 87 times.
✓ Branch 14 → 15 taken 111 times.
✓ Branch 14 → 17 taken 54 times.
✓ Branch 15 → 16 taken 24 times.
✓ Branch 15 → 17 taken 87 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 12 → 13 taken 24 times.
✓ Branch 12 → 14 taken 939 times.
✓ Branch 14 → 15 taken 24 times.
✓ Branch 14 → 16 taken 939 times.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 20 → 21 taken 9 times.
✓ Branch 20 → 22 taken 165 times.
✓ Branch 29 → 30 taken 9 times.
✓ Branch 29 → 31 taken 165 times.
3132 if (numtrue!=numif && !(type == c_elseif && numtrue+1==numif))
2158 {
2159 114 if (type != c_elseif) numif++;
2160 162 return;
2161 }
2162 2688 if (type != c_elseif) numif++;
2163
2164 bool cond;
2165 if(type != c_for)
2166 {
2167
6/24
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 18 taken 240 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 45 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 240 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 141 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 58 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 141 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 76 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 18 taken 939 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 45 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 939 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 60 not taken.
2640 if(!*par) throw_err_block(0, err_broken_command, typ_name, "Missing condition.");
2168
20/36
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 18 → 19 taken 240 times.
✗ Branch 18 → 43 not taken.
✓ Branch 20 → 21 taken 219 times.
✓ Branch 20 → 41 taken 21 times.
✓ Branch 21 → 22 taken 219 times.
✗ Branch 21 → 39 not taken.
✓ Branch 23 → 24 taken 240 times.
✗ Branch 23 → 56 not taken.
✓ Branch 26 → 27 taken 219 times.
✓ Branch 26 → 54 taken 21 times.
✓ Branch 28 → 29 taken 219 times.
✗ Branch 28 → 52 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 19 → 20 taken 141 times.
✗ Branch 19 → 56 not taken.
✓ Branch 21 → 22 taken 141 times.
✗ Branch 21 → 54 not taken.
✓ Branch 22 → 23 taken 141 times.
✗ Branch 22 → 52 not taken.
✓ Branch 24 → 25 taken 141 times.
✗ Branch 24 → 72 not taken.
✓ Branch 27 → 28 taken 141 times.
✗ Branch 27 → 70 not taken.
✓ Branch 29 → 30 taken 141 times.
✗ Branch 29 → 68 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 18 → 19 taken 939 times.
✗ Branch 18 → 43 not taken.
✓ Branch 20 → 21 taken 939 times.
✗ Branch 20 → 41 not taken.
✓ Branch 21 → 22 taken 939 times.
✗ Branch 21 → 39 not taken.
✓ Branch 23 → 24 taken 939 times.
✗ Branch 23 → 56 not taken.
✓ Branch 26 → 27 taken 939 times.
✗ Branch 26 → 54 not taken.
✓ Branch 28 → 29 taken 939 times.
✗ Branch 28 → 52 not taken.
2703 cond = parse_math_expr(par)->evaluate_static().get_bool();
2169 }
2170
2171 if (type == c_for)
2172 {
2173
2/8
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 27 taken 165 times.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 115 not taken.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 37 taken 165 times.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 204 not taken.
330 if(!*par) throw_err_block(0, err_broken_for_loop, "missing loop range");
2174
2/4
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 31 taken 165 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 42 taken 165 times.
330 if(single_line_for_tracker != 1)
2175 {
2176 numif--;
2177 throw_err_line(0, err_bad_single_line_for);
2178 }
2179
2180
4/4
✓ Branch 31 → 32 taken 42 times.
✓ Branch 31 → 72 taken 123 times.
✓ Branch 42 → 43 taken 42 times.
✓ Branch 42 → 115 taken 123 times.
330 if(!is_for_cont)
2181 {
2182
1/2
✗ Branch 43 → 44 not taken.
✓ Branch 43 → 45 taken 42 times.
84 const char* past_eq = strchr(par, '=');
2183
2/4
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 42 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 49 taken 42 times.
84 if(!past_eq)
2184 throw_err_block(0, err_broken_for_loop, "missing loop range");
2185
2186
2/4
✓ Branch 36 → 37 taken 42 times.
✗ Branch 36 → 111 not taken.
✓ Branch 50 → 51 taken 42 times.
✗ Branch 50 → 196 not taken.
84 string varname(par, past_eq - par);
2187 84 past_eq += 1;
2188
2/4
✓ Branch 37 → 38 taken 42 times.
✗ Branch 37 → 109 not taken.
✓ Branch 52 → 53 taken 42 times.
✗ Branch 52 → 194 not taken.
84 strip_whitespace(varname);
2189
4/8
✓ Branch 39 → 40 taken 42 times.
✗ Branch 39 → 109 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 44 taken 42 times.
✓ Branch 54 → 55 taken 42 times.
✗ Branch 54 → 194 not taken.
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 59 taken 42 times.
84 if(!validatedefinename(varname))
2190 throw_err_block(0, err_broken_for_loop, "invalid define name");
2191
2192
2/4
✓ Branch 44 → 45 taken 42 times.
✗ Branch 44 → 109 not taken.
✓ Branch 59 → 60 taken 42 times.
✗ Branch 59 → 194 not taken.
84 const char* range_sep = strqpstr(past_eq, "..");
2193
2/4
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 49 taken 42 times.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 42 times.
84 if(!range_sep)
2194 throw_err_block(0, err_broken_for_loop, "invalid loop range");
2195
2196
2/4
✓ Branch 49 → 50 taken 42 times.
✗ Branch 49 → 109 not taken.
✓ Branch 65 → 66 taken 42 times.
✗ Branch 65 → 194 not taken.
84 string for_start(past_eq, range_sep - past_eq);
2197
2/4
✓ Branch 50 → 51 taken 42 times.
✗ Branch 50 → 107 not taken.
✓ Branch 66 → 67 taken 42 times.
✗ Branch 66 → 192 not taken.
84 strip_whitespace(for_start);
2198
2/4
✓ Branch 51 → 52 taken 42 times.
✗ Branch 51 → 107 not taken.
✓ Branch 69 → 70 taken 42 times.
✗ Branch 69 → 192 not taken.
84 string for_end(range_sep+2);
2199
2/4
✓ Branch 52 → 53 taken 42 times.
✗ Branch 52 → 105 not taken.
✓ Branch 70 → 71 taken 42 times.
✗ Branch 70 → 190 not taken.
84 strip_whitespace(for_end);
2200
2201
6/12
✓ Branch 54 → 55 taken 42 times.
✗ Branch 54 → 97 not taken.
✓ Branch 56 → 57 taken 42 times.
✗ Branch 56 → 95 not taken.
✓ Branch 57 → 58 taken 42 times.
✗ Branch 57 → 93 not taken.
✓ Branch 74 → 75 taken 42 times.
✗ Branch 74 → 178 not taken.
✓ Branch 77 → 78 taken 42 times.
✗ Branch 77 → 176 not taken.
✓ Branch 79 → 80 taken 42 times.
✗ Branch 79 → 174 not taken.
84 addedwstatus.for_start = parse_math_expr(for_start)->evaluate_static().get_integer();
2202
6/12
✓ Branch 61 → 62 taken 42 times.
✗ Branch 61 → 103 not taken.
✓ Branch 63 → 64 taken 42 times.
✗ Branch 63 → 101 not taken.
✓ Branch 64 → 65 taken 42 times.
✗ Branch 64 → 99 not taken.
✓ Branch 89 → 90 taken 42 times.
✗ Branch 89 → 186 not taken.
✓ Branch 92 → 93 taken 42 times.
✗ Branch 92 → 184 not taken.
✓ Branch 94 → 95 taken 42 times.
✗ Branch 94 → 182 not taken.
84 addedwstatus.for_end = parse_math_expr(for_end)->evaluate_static().get_integer();
2203
2204
2/4
✓ Branch 67 → 68 taken 42 times.
✗ Branch 67 → 105 not taken.
✓ Branch 104 → 105 taken 42 times.
✗ Branch 104 → 190 not taken.
84 addedwstatus.for_variable = varname;
2205 84 addedwstatus.for_cur = addedwstatus.for_start;
2206 84 }
2207 246 else addedwstatus.for_cur++;
2208
2209 330 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
2210 330 single_line_for_tracker = 2;
2211
5/6
✓ Branch 73 → 74 taken 123 times.
✓ Branch 73 → 86 taken 42 times.
✗ Branch 128 → 129 not taken.
✓ Branch 128 → 130 taken 165 times.
✓ Branch 130 → 131 taken 123 times.
✓ Branch 130 → 166 taken 42 times.
330 if(addedwstatus.cond)
2212 {
2213 246 numtrue++;
2214
6/8
✓ Branch 75 → 76 taken 123 times.
✗ Branch 75 → 115 not taken.
✓ Branch 76 → 77 taken 96 times.
✓ Branch 76 → 80 taken 27 times.
✓ Branch 136 → 137 taken 123 times.
✗ Branch 136 → 204 not taken.
✓ Branch 137 → 138 taken 96 times.
✓ Branch 137 → 151 taken 27 times.
246 if(defines.exists(addedwstatus.for_variable))
2215 {
2216 192 addedwstatus.for_has_var_backup = true;
2217
4/8
✓ Branch 78 → 79 taken 96 times.
✗ Branch 78 → 115 not taken.
✓ Branch 79 → 80 taken 96 times.
✗ Branch 79 → 115 not taken.
✓ Branch 145 → 146 taken 96 times.
✗ Branch 145 → 204 not taken.
✓ Branch 150 → 151 taken 96 times.
✗ Branch 150 → 204 not taken.
192 addedwstatus.for_var_backup = defines.find(addedwstatus.for_variable);
2218 }
2219
4/8
✓ Branch 80 → 81 taken 123 times.
✗ Branch 80 → 114 not taken.
✓ Branch 82 → 83 taken 123 times.
✗ Branch 82 → 112 not taken.
✓ Branch 154 → 155 taken 123 times.
✗ Branch 154 → 202 not taken.
✓ Branch 161 → 162 taken 123 times.
✗ Branch 161 → 200 not taken.
246 defines.create(addedwstatus.for_variable) = ftostr(addedwstatus.for_cur);
2220 }
2221 }
2222 else if (type == c_if || type == c_while)
2223 {
2224 if(0);
2225
8/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 25 → 26 taken 108 times.
✓ Branch 25 → 28 taken 111 times.
✓ Branch 33 → 34 taken 108 times.
✓ Branch 33 → 37 taken 111 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 25 → 26 taken 834 times.
✓ Branch 25 → 28 taken 105 times.
✓ Branch 33 → 34 taken 834 times.
✓ Branch 33 → 37 taken 105 times.
2316 else if (cond)
2226 {
2227 1884 numtrue++;
2228
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 26 → 27 taken 108 times.
✗ Branch 26 → 45 not taken.
✓ Branch 34 → 35 taken 108 times.
✗ Branch 34 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 26 → 27 taken 834 times.
✗ Branch 26 → 45 not taken.
✓ Branch 34 → 35 taken 834 times.
✗ Branch 34 → 60 not taken.
1884 elsestatus[numif]=true;
2229 }
2230
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 28 → 29 taken 111 times.
✗ Branch 28 → 31 not taken.
✓ Branch 37 → 38 taken 111 times.
✗ Branch 37 → 41 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 28 → 29 taken 105 times.
✗ Branch 28 → 31 not taken.
✓ Branch 37 → 38 taken 105 times.
✗ Branch 37 → 41 not taken.
432 else if (!cond)
2231 {
2232
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 29 → 30 taken 111 times.
✗ Branch 29 → 45 not taken.
✓ Branch 38 → 39 taken 111 times.
✗ Branch 38 → 60 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 29 → 30 taken 105 times.
✗ Branch 29 → 45 not taken.
✓ Branch 38 → 39 taken 105 times.
✗ Branch 38 → 60 not taken.
432 elsestatus[numif]=false;
2233 }
2234 2316 addedwstatus.cond = cond;
2235 }
2236 else if (type == c_elseif)
2237 {
2238
2/8
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 30 taken 141 times.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 58 not taken.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 38 taken 141 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 76 not taken.
282 if (!numif) throw_err_block(1, err_misplaced_elseif);
2239
5/14
✓ Branch 30 → 31 taken 141 times.
✗ Branch 30 → 58 not taken.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 35 taken 141 times.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 58 not taken.
✓ Branch 38 → 39 taken 141 times.
✗ Branch 38 → 76 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 141 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 46 taken 141 times.
✗ Branch 43 → 44 not taken.
✗ Branch 43 → 76 not taken.
282 if (whilestatus[numif - 1].iswhile) throw_err_block(1, err_elseif_in_while);
2240
4/4
✓ Branch 35 → 36 taken 54 times.
✓ Branch 35 → 37 taken 87 times.
✓ Branch 46 → 47 taken 54 times.
✓ Branch 46 → 48 taken 87 times.
282 if (numif==numtrue) numtrue--;
2241
15/18
✓ Branch 37 → 38 taken 54 times.
✓ Branch 37 → 41 taken 87 times.
✓ Branch 38 → 39 taken 54 times.
✗ Branch 38 → 58 not taken.
✓ Branch 39 → 40 taken 39 times.
✓ Branch 39 → 41 taken 15 times.
✓ Branch 42 → 43 taken 39 times.
✓ Branch 42 → 45 taken 102 times.
✓ Branch 48 → 49 taken 54 times.
✓ Branch 48 → 55 taken 87 times.
✓ Branch 49 → 50 taken 54 times.
✗ Branch 49 → 76 not taken.
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 54 times.
✓ Branch 53 → 54 taken 39 times.
✓ Branch 53 → 55 taken 15 times.
✓ Branch 56 → 57 taken 39 times.
✓ Branch 56 → 60 taken 102 times.
282 if (cond && !elsestatus[numif])
2242 {
2243 78 numtrue++;
2244
2/4
✓ Branch 43 → 44 taken 39 times.
✗ Branch 43 → 58 not taken.
✓ Branch 57 → 58 taken 39 times.
✗ Branch 57 → 76 not taken.
78 elsestatus[numif]=true;
2245 }
2246 }
2247
16/16
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 34 → 35 taken 219 times.
✓ Branch 34 → 37 taken 24 times.
✓ Branch 46 → 47 taken 219 times.
✓ Branch 46 → 48 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 47 → 48 taken 141 times.
✓ Branch 47 → 50 taken 24 times.
✓ Branch 62 → 63 taken 141 times.
✓ Branch 62 → 64 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 34 → 35 taken 939 times.
✓ Branch 34 → 37 taken 24 times.
✓ Branch 46 → 47 taken 939 times.
✓ Branch 46 → 48 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 88 → 89 taken 165 times.
✓ Branch 88 → 91 taken 9 times.
✓ Branch 168 → 169 taken 165 times.
✓ Branch 168 → 170 taken 9 times.
3132 }
2248
2249 template<cf_cmds type>
2250 2802 void cf_end(const char* par, int& single_line_for_tracker) {
2251
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 264 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 264 times.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 963 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 963 times.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 174 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 174 times.
2802 if(*par) throw_err_block(0, err_broken_command, "end<...>", "");
2252
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 264 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 264 times.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 963 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 963 times.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 174 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 174 times.
2802 if (!numif)
2253 throw_err_block(1, err_misplaced_endif);
2254 2802 whiletracker& thisws = whilestatus[numif - 1];
2255
2256
9/24
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 11 → 12 taken 963 times.
✗ Branch 11 → 13 not taken.
✓ Branch 12 → 13 taken 963 times.
✗ Branch 12 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 963 times.
✓ Branch 15 → 16 taken 963 times.
✗ Branch 15 → 20 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 963 times.
✓ Branch 19 → 20 taken 963 times.
✗ Branch 19 → 24 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 174 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 174 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 20 taken 174 times.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 19 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 24 not taken.
2802 if((!thisws.is_for && !thisws.iswhile && type != c_if) ||
2257
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 11 → 12 taken 264 times.
✗ Branch 11 → 13 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 264 times.
✓ Branch 15 → 16 taken 264 times.
✗ Branch 15 → 20 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 174 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 174 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 27 taken 174 times.
2802 (thisws.iswhile && type != c_while) ||
2258
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 264 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 264 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 23 taken 264 times.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 963 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 963 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 27 taken 963 times.
2454 (thisws.is_for && type != c_for))
2259 throw_err_block(1, err_misplaced_endif);
2260
2261
12/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 16 → 17 taken 87 times.
✓ Branch 16 → 18 taken 177 times.
✓ Branch 23 → 24 taken 87 times.
✓ Branch 23 → 25 taken 177 times.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 17 → 18 taken 834 times.
✓ Branch 17 → 19 taken 129 times.
✓ Branch 27 → 28 taken 834 times.
✓ Branch 27 → 29 taken 129 times.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 17 → 18 taken 123 times.
✓ Branch 17 → 19 taken 51 times.
✓ Branch 27 → 28 taken 123 times.
✓ Branch 27 → 29 taken 51 times.
2802 if (numif==numtrue) numtrue--;
2262 2802 numif--;
2263
2264
9/18
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 32 taken 264 times.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 264 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 70 taken 264 times.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 33 taken 963 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 963 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 74 taken 963 times.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 19 → 20 taken 174 times.
✗ Branch 19 → 33 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 174 times.
✓ Branch 32 → 33 taken 174 times.
✗ Branch 32 → 74 not taken.
2802 if(thisws.is_for)
2265 {
2266
4/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 21 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 33 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 22 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 37 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 20 → 21 taken 30 times.
✓ Branch 20 → 22 taken 144 times.
✓ Branch 34 → 35 taken 30 times.
✓ Branch 34 → 37 taken 144 times.
348 if(single_line_for_tracker == 2) single_line_for_tracker = 3;
2267
3/18
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 25 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 35 not taken.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 45 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 26 not taken.
✗ Branch 37 → 38 not taken.
✗ Branch 37 → 39 not taken.
✗ Branch 39 → 40 not taken.
✗ Branch 39 → 49 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 26 taken 174 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 174 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 49 taken 174 times.
348 if(moreonline)
2268 {
2269 // sabotage the whilestatus to prevent the loop running again
2270 // and spamming more of the same error
2271 thisws.for_cur = thisws.for_end;
2272 thisws.cond = false;
2273 throw_err_block(0, err_bad_single_line_for);
2274 }
2275
2276
5/18
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 32 not taken.
✗ Branch 46 → 47 not taken.
✗ Branch 46 → 48 not taken.
✗ Branch 48 → 49 not taken.
✗ Branch 48 → 70 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 33 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 74 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 26 → 27 taken 123 times.
✓ Branch 26 → 33 taken 51 times.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 174 times.
✓ Branch 52 → 53 taken 123 times.
✓ Branch 52 → 74 taken 51 times.
348 if(thisws.cond)
2277 {
2278
5/18
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 30 not taken.
✗ Branch 50 → 51 not taken.
✗ Branch 50 → 52 not taken.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 64 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 31 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 56 not taken.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 68 not taken.
void control_flow::cf_end<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 27 → 28 taken 96 times.
✓ Branch 27 → 31 taken 27 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 56 taken 123 times.
✓ Branch 56 → 57 taken 96 times.
✓ Branch 56 → 68 taken 27 times.
246 if(thisws.for_has_var_backup)
2279 192 defines.create(thisws.for_variable) = thisws.for_var_backup;
2280 else
2281 54 defines.remove(thisws.for_variable);
2282 }
2283 }
2284 2802 }
2285
2286 234 void cf_else(const char* par, int& single_line_for_tracker) {
2287
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 117 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 117 times.
234 if(*par) throw_err_block(0, err_broken_command, "else", "");
2288
2/4
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 117 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 117 times.
234 if (!numif) throw_err_block(1, err_misplaced_else);
2289
7/14
✓ Branch 11 → 12 taken 117 times.
✗ Branch 11 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 234 times.
✓ Branch 15 → 16 taken 117 times.
✗ Branch 15 → 21 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 117 times.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 117 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 117 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 27 taken 117 times.
234 if (whilestatus[numif - 1].iswhile || whilestatus[numif - 1].is_for) throw_err_block(1, err_else_in_while_loop);
2290
4/4
✓ Branch 20 → 21 taken 36 times.
✓ Branch 20 → 22 taken 81 times.
✓ Branch 27 → 28 taken 36 times.
✓ Branch 27 → 29 taken 81 times.
234 else if (numif==numtrue) numtrue--;
2291
13/14
✓ Branch 22 → 23 taken 75 times.
✓ Branch 22 → 26 taken 6 times.
✓ Branch 24 → 25 taken 30 times.
✓ Branch 24 → 26 taken 45 times.
✓ Branch 27 → 28 taken 30 times.
✓ Branch 27 → 30 taken 51 times.
✓ Branch 29 → 30 taken 75 times.
✓ Branch 29 → 36 taken 6 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 75 times.
✓ Branch 34 → 35 taken 30 times.
✓ Branch 34 → 36 taken 45 times.
✓ Branch 37 → 38 taken 30 times.
✓ Branch 37 → 41 taken 51 times.
162 else if (numif==numtrue+1 && !elsestatus[numif])
2292 {
2293 60 numtrue++;
2294 60 elsestatus[numif]=true;
2295 }
2296 234 }
2297
2298 }
2299
2300 static constexpr auto control_flow_commands = frozen::make_unordered_map<frozen::string, void(*)(const char*, int&)>({
2301 { "if", control_flow::cf_start<control_flow::c_if> },
2302 { "elseif", control_flow::cf_start<control_flow::c_elseif> },
2303 { "while", control_flow::cf_start<control_flow::c_while> },
2304 { "for", control_flow::cf_start<control_flow::c_for> },
2305 { "endif", control_flow::cf_end<control_flow::c_if> },
2306 { "endwhile", control_flow::cf_end<control_flow::c_while> },
2307 { "endfor", control_flow::cf_end<control_flow::c_for> },
2308 { "else", control_flow::cf_else },
2309 });
2310
2311 549 static void cmd_label_assign(const char* firstword, const char* params) {
2312
5/7
✓ Branch 2 → 3 taken 201 times.
✓ Branch 2 → 22 taken 72 times.
✓ Branch 3 → 4 taken 402 times.
✗ Branch 3 → 22 not taken.
✓ Branch 3 → 39 taken 75 times.
✓ Branch 6 → 7 taken 201 times.
✗ Branch 6 → 39 not taken.
549 if (firstword[0] == '\'' && firstword[1]) {
2313 201 int codepoint;
2314 402 const char* char_start = firstword + 1;
2315
2/4
✓ Branch 4 → 5 taken 201 times.
✗ Branch 4 → 75 not taken.
✓ Branch 9 → 10 taken 201 times.
✗ Branch 9 → 123 not taken.
402 const char* after = char_start + utf8_val(&codepoint, char_start);
2316
2/4
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 9 taken 201 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 201 times.
402 if (codepoint == -1)
2317 throw_err_block(0, err_invalid_utf8);
2318
4/8
✓ Branch 9 → 10 taken 201 times.
✗ Branch 9 → 19 not taken.
✓ Branch 10 → 11 taken 201 times.
✗ Branch 10 → 19 not taken.
✓ Branch 16 → 17 taken 201 times.
✗ Branch 16 → 36 not taken.
✓ Branch 19 → 20 taken 201 times.
✗ Branch 19 → 36 not taken.
402 if (after[0] == '\'' && after[1] == '\0') {
2319
10/16
✓ Branch 11 → 12 taken 198 times.
✓ Branch 11 → 73 taken 3 times.
✓ Branch 13 → 14 taken 198 times.
✗ Branch 13 → 71 not taken.
✓ Branch 14 → 15 taken 198 times.
✗ Branch 14 → 69 not taken.
✓ Branch 15 → 16 taken 198 times.
✗ Branch 15 → 69 not taken.
✓ Branch 23 → 24 taken 198 times.
✓ Branch 23 → 119 taken 3 times.
✓ Branch 26 → 27 taken 198 times.
✗ Branch 26 → 117 not taken.
✓ Branch 28 → 29 taken 198 times.
✗ Branch 28 → 115 not taken.
✓ Branch 29 → 30 taken 198 times.
✗ Branch 29 → 115 not taken.
405 thetable.set_val(codepoint, parse_math_expr(params + 2)->evaluate_static().get_integer());
2320 396 return;
2321 } else {
2322 throw_err_block(0, err_invalid_character);
2323 }
2324 }
2325 147 const char* newlabelname = firstword;
2326 147 bool ismacro = false;
2327
2328
4/4
✓ Branch 22 → 23 taken 3 times.
✓ Branch 22 → 24 taken 69 times.
✓ Branch 40 → 41 taken 3 times.
✓ Branch 40 → 43 taken 72 times.
147 if (newlabelname[0] == '?') {
2329 6 ismacro = true;
2330 6 newlabelname++;
2331 }
2332
2333
6/8
✓ Branch 24 → 25 taken 3 times.
✓ Branch 24 → 29 taken 69 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 3 times.
✓ Branch 43 → 44 taken 3 times.
✓ Branch 43 → 48 taken 72 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 48 taken 3 times.
147 if (ismacro && macrorecursion == 0) {
2334 throw_err_block(0, err_macro_label_outside_of_macro);
2335 }
2336
2337
3/6
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 72 times.
✓ Branch 48 → 49 taken 75 times.
✗ Branch 48 → 157 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 53 taken 75 times.
147 if (!confirmname(newlabelname))
2338 throw_err_block(0, err_invalid_label_name);
2339
2340 147 string completename;
2341
2342
4/4
✓ Branch 35 → 36 taken 3 times.
✓ Branch 35 → 47 taken 69 times.
✓ Branch 55 → 56 taken 3 times.
✓ Branch 55 → 76 taken 72 times.
147 if (ismacro) {
2343
10/20
✓ Branch 36 → 37 taken 3 times.
✗ Branch 36 → 85 not taken.
✓ Branch 38 → 39 taken 3 times.
✗ Branch 38 → 82 not taken.
✓ Branch 39 → 40 taken 3 times.
✗ Branch 39 → 80 not taken.
✓ Branch 40 → 41 taken 3 times.
✗ Branch 40 → 78 not taken.
✓ Branch 41 → 42 taken 3 times.
✗ Branch 41 → 76 not taken.
✓ Branch 59 → 60 taken 3 times.
✗ Branch 59 → 135 not taken.
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 131 not taken.
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 129 not taken.
✓ Branch 65 → 66 taken 3 times.
✗ Branch 65 → 127 not taken.
✓ Branch 67 → 68 taken 3 times.
✗ Branch 67 → 125 not taken.
6 completename += STR ":macro_" + dec(calledmacros) + "_";
2344 }
2345
2346
2/4
✓ Branch 47 → 48 taken 72 times.
✗ Branch 47 → 99 not taken.
✓ Branch 76 → 77 taken 75 times.
✗ Branch 76 → 155 not taken.
147 completename += newlabelname;
2347
2348
2/4
✓ Branch 48 → 49 taken 72 times.
✗ Branch 48 → 99 not taken.
✓ Branch 79 → 80 taken 75 times.
✗ Branch 79 → 155 not taken.
147 auto expr = parse_math_expr(params + 2);
2349
4/8
✓ Branch 50 → 51 taken 72 times.
✗ Branch 50 → 90 not taken.
✓ Branch 51 → 52 taken 72 times.
✗ Branch 51 → 88 not taken.
✓ Branch 82 → 83 taken 75 times.
✗ Branch 82 → 143 not taken.
✓ Branch 84 → 85 taken 75 times.
✗ Branch 84 → 141 not taken.
147 int64_t num = expr->evaluate_non_forward().get_integer();
2350
2/4
✓ Branch 54 → 55 taken 72 times.
✗ Branch 54 → 97 not taken.
✓ Branch 94 → 95 taken 75 times.
✗ Branch 94 → 153 not taken.
147 bool is_static = expr->has_label() <= 1;
2351
2352
2/12
✗ Branch 55 → 56 not taken.
✓ Branch 55 → 61 taken 72 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 93 not taken.
✗ Branch 58 → 59 not taken.
✗ Branch 58 → 91 not taken.
✗ Branch 95 → 96 not taken.
✓ Branch 95 → 103 taken 75 times.
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 147 not taken.
✗ Branch 100 → 101 not taken.
✗ Branch 100 → 145 not taken.
147 if (num&~0xFFFFFF) throw_err_block(1, err_snes_address_out_of_bounds, hex(num, 6).data());
2353
2354
4/8
✓ Branch 62 → 63 taken 72 times.
✗ Branch 62 → 96 not taken.
✓ Branch 63 → 64 taken 72 times.
✗ Branch 63 → 94 not taken.
✓ Branch 105 → 106 taken 75 times.
✗ Branch 105 → 151 not taken.
✓ Branch 106 → 107 taken 75 times.
✗ Branch 106 → 149 not taken.
147 setlabel(ns + completename, num, is_static);
2355 147 }
2356
2357 // single_line_for_tracker is:
2358 // 0 if not in first block of line, not in (single-line) for loop
2359 // 1 if first block of line
2360 // 2 if in single-line for loop
2361 // 3 if after endfor (of a single-line loop)
2362 59014 void assembleblock(const char *block, int &single_line_for_tracker) {
2363 // don't do this here; assembleline already did it for us
2364 // callstack_push cs_push(callstack_entry_type::BLOCK, block);
2365
4/4
✓ Branch 2 → 3 taken 9070 times.
✓ Branch 2 → 4 taken 20281 times.
✓ Branch 3 → 4 taken 9124 times.
✓ Branch 3 → 5 taken 20539 times.
59014 if (!*block) return;
2366
2367 // assumption: if the first word of a line contains quotes/spaces, it's going
2368 // to be invalid anyways. well, except for character assignment......
2369 40820 string firstword;
2370 40820 const char *params = block;
2371
2/4
✓ Branch 5 → 6 taken 20281 times.
✗ Branch 5 → 83 not taken.
✓ Branch 8 → 9 taken 20539 times.
✗ Branch 8 → 116 not taken.
40820 grab_until_space(firstword, params);
2372
2373 // when writing out the data for the addrToLine mapping,
2374 // we want to write out the snespos we had before writing opcodes
2375 40820 int addrToLinePos = realsnespos & 0xFFFFFF;
2376
2377
2/4
✓ Branch 6 → 7 taken 20281 times.
✗ Branch 6 → 83 not taken.
✓ Branch 10 → 11 taken 20539 times.
✗ Branch 10 → 116 not taken.
40820 string firstword_lower = firstword;
2378 40820 lower(firstword_lower);
2379
2380
6/8
✓ Branch 11 → 12 taken 20281 times.
✗ Branch 11 → 78 not taken.
✓ Branch 13 → 14 taken 3084 times.
✓ Branch 13 → 16 taken 17197 times.
✓ Branch 17 → 18 taken 20539 times.
✗ Branch 17 → 107 not taken.
✓ Branch 20 → 21 taken 3084 times.
✓ Branch 20 → 25 taken 17455 times.
40820 if (auto it = control_flow_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())); it != control_flow_commands.end()) {
2381
4/4
✓ Branch 14 → 15 taken 3063 times.
✓ Branch 14 → 81 taken 21 times.
✓ Branch 23 → 24 taken 3063 times.
✓ Branch 23 → 114 taken 21 times.
6168 return it->second(params, single_line_for_tracker);
2382
4/4
✓ Branch 16 → 17 taken 885 times.
✓ Branch 16 → 18 taken 16312 times.
✓ Branch 25 → 26 taken 885 times.
✓ Branch 25 → 27 taken 16570 times.
34652 } else if (numif != numtrue) {
2383 1770 return;
2384 }
2385
2386 32882 bool addlabeled = false;
2387 // while first word is non-empty,
2388 // and rest {is empty or doesn't start with " = "},
2389 // try to run addlabel
2390 33164 while (firstword[0]
2391
12/12
✓ Branch 24 → 25 taken 14620 times.
✓ Branch 24 → 28 taken 1830 times.
✓ Branch 25 → 26 taken 13510 times.
✓ Branch 25 → 28 taken 1110 times.
✓ Branch 27 → 28 taken 13237 times.
✓ Branch 27 → 32 taken 273 times.
✓ Branch 36 → 37 taken 14836 times.
✓ Branch 36 → 42 taken 1878 times.
✓ Branch 39 → 40 taken 13699 times.
✓ Branch 39 → 42 taken 1137 times.
✓ Branch 41 → 42 taken 13423 times.
✓ Branch 41 → 46 taken 276 times.
33164 && !(params[0] && params[1] && stribegin(params, "= "))
2392
14/16
✓ Branch 23 → 24 taken 16450 times.
✗ Branch 23 → 32 not taken.
✓ Branch 29 → 30 taken 16154 times.
✓ Branch 29 → 81 taken 23 times.
✓ Branch 30 → 31 taken 526 times.
✓ Branch 30 → 32 taken 15628 times.
✓ Branch 33 → 19 taken 526 times.
✓ Branch 33 → 34 taken 15901 times.
✓ Branch 34 → 35 taken 16714 times.
✗ Branch 34 → 46 not taken.
✓ Branch 43 → 44 taken 16415 times.
✓ Branch 43 → 114 taken 23 times.
✓ Branch 44 → 45 taken 547 times.
✓ Branch 44 → 46 taken 15868 times.
✓ Branch 47 → 28 taken 547 times.
✓ Branch 47 → 48 taken 16144 times.
66328 && addlabel(firstword)) {
2393 // addlabel was ok, move to the next word
2394 1073 addlabeled = true;
2395 // if there's no next word, we're done here
2396
4/4
✓ Branch 19 → 20 taken 388 times.
✓ Branch 19 → 21 taken 138 times.
✓ Branch 29 → 30 taken 403 times.
✓ Branch 29 → 31 taken 144 times.
1073 if (!*params) return;
2397 // otherwise pull next word into firstword
2398
2/4
✓ Branch 21 → 22 taken 138 times.
✗ Branch 21 → 81 not taken.
✓ Branch 31 → 32 taken 144 times.
✗ Branch 31 → 114 not taken.
282 grab_until_space(firstword, params);
2399 }
2400
2401
2/4
✓ Branch 34 → 35 taken 15901 times.
✗ Branch 34 → 81 not taken.
✓ Branch 48 → 49 taken 16144 times.
✗ Branch 48 → 114 not taken.
32045 firstword_lower = firstword;
2402 32045 lower(firstword_lower);
2403
2404 // recheck for any of the conditionals tested above
2405
12/20
✓ Branch 36 → 37 taken 138 times.
✓ Branch 36 → 44 taken 15763 times.
✓ Branch 40 → 41 taken 138 times.
✗ Branch 40 → 79 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 138 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 50 taken 15901 times.
✓ Branch 50 → 51 taken 144 times.
✓ Branch 50 → 60 taken 16000 times.
✓ Branch 56 → 57 taken 144 times.
✗ Branch 56 → 109 not taken.
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 144 times.
✓ Branch 61 → 62 taken 144 times.
✓ Branch 61 → 63 taken 16000 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 68 taken 16144 times.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 111 not taken.
32045 if (addlabeled && control_flow_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())) != control_flow_commands.end()) {
2406 throw_err_block(0, err_label_before_if, firstword.data());
2407 }
2408
2409
8/8
✓ Branch 50 → 51 taken 15890 times.
✓ Branch 50 → 81 taken 11 times.
✓ Branch 51 → 52 taken 5080 times.
✓ Branch 51 → 54 taken 10810 times.
✓ Branch 68 → 69 taken 16133 times.
✓ Branch 68 → 114 taken 11 times.
✓ Branch 69 → 70 taken 5095 times.
✓ Branch 69 → 72 taken 11038 times.
32045 if (asblock_pick(firstword_lower, params)) {
2410
2/4
✓ Branch 52 → 53 taken 5080 times.
✗ Branch 52 → 81 not taken.
✓ Branch 70 → 71 taken 5095 times.
✗ Branch 70 → 114 not taken.
10175 add_addr_to_line(addrToLinePos);
2411 10175 return;
2412 }
2413
2414
4/4
✓ Branch 55 → 56 taken 261 times.
✓ Branch 55 → 58 taken 10549 times.
✓ Branch 74 → 75 taken 261 times.
✓ Branch 74 → 80 taken 10777 times.
21848 if (firstword[0] == '%') {
2415 // imo using strchr here is jank, but it works i guess
2416 // (labels can't contain %)
2417
5/6
✓ Branch 56 → 57 taken 255 times.
✓ Branch 56 → 81 taken 6 times.
✗ Branch 75 → 76 not taken.
✓ Branch 75 → 77 taken 261 times.
✓ Branch 78 → 79 taken 255 times.
✓ Branch 78 → 114 taken 6 times.
522 return callmacro(strchr(block, '%') + 1);
2418 }
2419
2420
6/8
✓ Branch 61 → 62 taken 10549 times.
✗ Branch 61 → 80 not taken.
✓ Branch 63 → 64 taken 10270 times.
✓ Branch 63 → 66 taken 279 times.
✓ Branch 85 → 86 taken 10777 times.
✗ Branch 85 → 112 not taken.
✓ Branch 88 → 89 taken 10492 times.
✓ Branch 88 → 93 taken 285 times.
21326 if (auto it = normal_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())); it != normal_commands.end()) {
2421
4/4
✓ Branch 64 → 65 taken 5187 times.
✓ Branch 64 → 81 taken 5083 times.
✓ Branch 91 → 92 taken 5406 times.
✓ Branch 91 → 114 taken 5086 times.
20762 return it->second(params);
2422 }
2423
2424
8/8
✓ Branch 67 → 68 taken 273 times.
✓ Branch 67 → 71 taken 6 times.
✓ Branch 69 → 70 taken 270 times.
✓ Branch 69 → 81 taken 3 times.
✓ Branch 94 → 95 taken 276 times.
✓ Branch 94 → 98 taken 9 times.
✓ Branch 96 → 97 taken 273 times.
✓ Branch 96 → 114 taken 3 times.
564 if (stribegin(params, "= ")) return cmd_label_assign(firstword, params);
2425
2426
2/4
✓ Branch 71 → 72 taken 6 times.
✗ Branch 71 → 81 not taken.
✓ Branch 98 → 99 taken 9 times.
✗ Branch 98 → 114 not taken.
15 throw_err_block(1, err_unknown_command);
2427 51132 }
2428