asar coverage - build #


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