asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
1736 of 1925, 0 excluded
90.2%
Functions:
130 of 135, 0 excluded
96.3%
Branches:
3392 of 6779, 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 438249 static inline void verifysnespos()
68 {
69
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 219219 times.
✓ Branch 2 → 6 taken 219030 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 219219 times.
438249 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 438249 }
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 437748 static inline void step(int num)
144 {
145
5/5
✓ Branch 2 → 3 taken 138 times.
✓ Branch 2 → 4 taken 218958 times.
✓ Branch 2 → 6 taken 218652 times.
✓ Branch 4 → 5 taken 138 times.
✓ Branch 4 → 8 taken 218820 times.
437748 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 437472 snespos += num;
161 437472 realsnespos += num;
162 }
163 437748 bytes+=num;
164 437748 }
165
166 437118 void write1(unsigned int num)
167 {
168 437118 verifysnespos();
169
3/3
✓ Branch 3 → 4 taken 145674 times.
✓ Branch 3 → 16 taken 145666 times.
✓ Branch 3 → 18 taken 145778 times.
437118 if (pass==2)
170 {
171 145674 int pcpos=snestopc(realsnespos&0xFFFFFF);
172
2/3
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 72809 times.
✓ Branch 5 → 13 taken 72865 times.
145674 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 145674 writeromdata_byte(pcpos, (unsigned char)num, freespaceid != 0);
178
4/4
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 16 taken 72808 times.
✓ Branch 14 → 15 taken 1 time.
✓ Branch 14 → 18 taken 72864 times.
145674 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 72832 times.
✓ Branch 16 → 30 taken 145643 times.
✓ Branch 17 → 18 taken 4571 times.
✓ Branch 17 → 30 taken 68261 times.
✓ Branch 18 → 19 taken 72888 times.
✓ Branch 18 → 34 taken 145755 times.
✓ Branch 19 → 20 taken 4627 times.
✓ Branch 19 → 34 taken 68261 times.
437118 if(pass == 1 && freespaceid == 0) {
184 9198 int pcpos = snestopc(realsnespos & 0xFFFFFF);
185
2/4
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 25 taken 4571 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 29 taken 4627 times.
9198 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 9198 addromwrite(pcpos, 1);
191
4/4
✓ Branch 26 → 27 taken 4362 times.
✓ Branch 26 → 30 taken 209 times.
✓ Branch 30 → 31 taken 4415 times.
✓ Branch 30 → 34 taken 212 times.
9198 if (pcpos>=romlen) {
192
4/4
✓ Branch 27 → 28 taken 42 times.
✓ Branch 27 → 29 taken 4320 times.
✓ Branch 31 → 32 taken 49 times.
✓ Branch 31 → 33 taken 4366 times.
8777 if(pcpos - romlen > 0) writeromdata_bytes(romlen, freespacebyte, pcpos - romlen, false);
193 8777 romlen=pcpos+1;
194 }
195 }
196 437118 step(1);
197 437118 ratsmetastate=ratsmeta_ban;
198 437118 }
199
200 32171 static bool asblock_pick(const string& firstword, const char* par)
201 {
202
8/8
✓ Branch 2 → 3 taken 29825 times.
✓ Branch 2 → 4 taken 1173 times.
✓ Branch 2 → 6 taken 1173 times.
✓ Branch 3 → 4 taken 15 times.
✓ Branch 3 → 5 taken 15034 times.
✓ Branch 3 → 16 taken 14776 times.
✓ Branch 5 → 6 taken 15 times.
✓ Branch 5 → 24 taken 15019 times.
32171 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 12949 times.
✓ Branch 16 → 19 taken 1827 times.
✓ Branch 24 → 25 taken 13192 times.
✓ Branch 24 → 27 taken 1827 times.
29795 if (arch==arch_65816) {
210 26141 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 1883 void write2(unsigned int num)
229 {
230 1883 write1(num);
231 1883 write1(num/256);
232 1883 }
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 1282 bool confirmname(const char * name)
307 {
308
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 638 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 644 times.
1282 if (!name[0]) return false;
309
2/4
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 638 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 644 times.
1282 if (is_digit(name[0])) return false;
310
4/4
✓ Branch 12 → 8 taken 6144 times.
✓ Branch 12 → 13 taken 638 times.
✓ Branch 18 → 10 taken 6162 times.
✓ Branch 18 → 19 taken 644 times.
13588 for (int i=0;name[i];i++)
311 {
312
2/4
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 6144 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 6162 times.
12306 if (!is_ualnum(name[i])) return false;
313 }
314 1282 return true;
315 }
316
317 53844 string posneglabelname(const char ** input, bool define)
318 {
319 53844 const char* label = *input;
320
321 53844 string output;
322
323 53844 int depth = 0;
324 53844 bool ismacro = false;
325
326
4/4
✓ Branch 3 → 4 taken 37 times.
✓ Branch 3 → 5 taken 26681 times.
✓ Branch 5 → 6 taken 37 times.
✓ Branch 5 → 8 taken 27089 times.
53844 if (label[0] == '?')
327 {
328 74 ismacro = true;
329 74 label++;
330 }
331
8/8
✓ Branch 5 → 6 taken 26692 times.
✓ Branch 5 → 7 taken 26 times.
✓ Branch 6 → 7 taken 66 times.
✓ Branch 6 → 114 taken 26626 times.
✓ Branch 9 → 10 taken 27094 times.
✓ Branch 9 → 12 taken 32 times.
✓ Branch 11 → 12 taken 72 times.
✓ Branch 11 → 215 taken 27022 times.
53844 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 53842 return output;
376 2 }
377
378 2473 string labelname(const char ** rawname, bool define, bool is_addlabel)
379 {
380 #define deref_rawname (*rawname)
381 2473 autoarray<string>* sublabellist = &sublabels;
382
383 2473 bool ismacro = (deref_rawname[0] == '?');
384 2473 bool issublabel = false;
385
386
4/4
✓ Branch 2 → 3 taken 12 times.
✓ Branch 2 → 4 taken 1215 times.
✓ Branch 4 → 5 taken 12 times.
✓ Branch 4 → 9 taken 1234 times.
2473 if (ismacro)
387 {
388 24 deref_rawname++;
389 24 sublabellist = macrosublabels;
390 }
391
392 2473 string name;
393 2473 int i=-1;
394
395
2/8
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 1227 times.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 119 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 1246 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 198 not taken.
2473 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 1227 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 24 taken 1246 times.
2473 if (*deref_rawname ==':')
397 {
398 deref_rawname++;
399 name=":";
400 }
401
10/12
✓ Branch 12 → 13 taken 1104 times.
✓ Branch 12 → 40 taken 123 times.
✓ Branch 13 → 14 taken 1092 times.
✓ Branch 13 → 40 taken 12 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 1246 times.
✓ Branch 26 → 27 taken 1123 times.
✓ Branch 26 → 72 taken 123 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 1123 times.
✓ Branch 29 → 30 taken 1111 times.
✓ Branch 29 → 72 taken 12 times.
2473 else if (!in_struct && !in_sub_struct)
402 {
403
4/4
✓ Branch 16 → 15 taken 47 times.
✓ Branch 16 → 17 taken 1092 times.
✓ Branch 37 → 31 taken 53 times.
✓ Branch 37 → 38 taken 1111 times.
2303 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
404
2/8
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 1092 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 119 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 1111 times.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 198 not taken.
2203 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 1048 times.
✓ Branch 45 → 46 taken 50 times.
✓ Branch 45 → 72 taken 1061 times.
2203 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 1215 times.
✓ Branch 41 → 42 taken 8 times.
✓ Branch 41 → 61 taken 4 times.
✓ Branch 72 → 73 taken 12 times.
✓ Branch 72 → 104 taken 1234 times.
✓ Branch 73 → 74 taken 8 times.
✓ Branch 73 → 104 taken 4 times.
2473 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 1101 times.
✓ Branch 61 → 63 taken 123 times.
✓ Branch 62 → 63 taken 12 times.
✓ Branch 62 → 76 taken 1089 times.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 106 taken 1243 times.
✓ Branch 106 → 107 taken 1120 times.
✓ Branch 106 → 110 taken 123 times.
✗ Branch 107 → 108 not taken.
✓ Branch 107 → 109 taken 1120 times.
✓ Branch 109 → 110 taken 12 times.
✓ Branch 109 → 134 taken 1108 times.
2467 if (in_struct || in_sub_struct)
423 {
424
10/12
✓ Branch 63 → 64 taken 126 times.
✓ Branch 63 → 68 taken 9 times.
✓ Branch 64 → 65 taken 6 times.
✓ Branch 64 → 68 taken 120 times.
✓ Branch 65 → 66 taken 6 times.
✗ Branch 65 → 119 not taken.
✓ Branch 110 → 111 taken 126 times.
✓ Branch 110 → 117 taken 9 times.
✓ Branch 113 → 114 taken 6 times.
✓ Branch 113 → 117 taken 120 times.
✓ Branch 114 → 115 taken 6 times.
✗ Branch 114 → 198 not taken.
270 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 126 times.
✓ Branch 68 → 76 taken 3 times.
✓ Branch 119 → 120 taken 126 times.
✓ Branch 119 → 134 taken 3 times.
258 if(*deref_rawname == '.') {
426 252 deref_rawname++;
427
5/6
✓ Branch 69 → 70 taken 12 times.
✓ Branch 69 → 74 taken 114 times.
✗ Branch 123 → 124 not taken.
✓ Branch 123 → 125 taken 126 times.
✓ Branch 125 → 126 taken 12 times.
✓ Branch 125 → 132 taken 114 times.
252 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 126 times.
✗ Branch 74 → 119 not taken.
✓ Branch 132 → 133 taken 126 times.
✗ Branch 132 → 198 not taken.
252 name += struct_name;
432
2/4
✓ Branch 75 → 76 taken 126 times.
✗ Branch 75 → 119 not taken.
✓ Branch 133 → 134 taken 126 times.
✗ Branch 133 → 198 not taken.
252 name += '.';
433 }
434 }
435
436
2/8
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 81 taken 1218 times.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 119 not taken.
✗ Branch 137 → 138 not taken.
✓ Branch 137 → 141 taken 1237 times.
✗ Branch 138 → 139 not taken.
✗ Branch 138 → 198 not taken.
2455 if (!is_ualnum(*deref_rawname)) throw_err_block(2, err_invalid_label_name);
437
438
12/12
✓ Branch 85 → 86 taken 1320 times.
✓ Branch 85 → 87 taken 8204 times.
✓ Branch 86 → 87 taken 102 times.
✓ Branch 86 → 88 taken 1218 times.
✓ Branch 89 → 82 taken 8306 times.
✓ Branch 89 → 90 taken 1218 times.
✓ Branch 151 → 152 taken 1339 times.
✓ Branch 151 → 155 taken 8279 times.
✓ Branch 154 → 155 taken 102 times.
✓ Branch 154 → 156 taken 1237 times.
✓ Branch 157 → 142 taken 8381 times.
✓ Branch 157 → 158 taken 1237 times.
19142 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
439 {
440
2/4
✓ Branch 82 → 83 taken 8306 times.
✗ Branch 82 → 119 not taken.
✓ Branch 146 → 147 taken 8381 times.
✗ Branch 146 → 198 not taken.
16687 name+=*(deref_rawname++);
441 }
442
443
8/8
✓ Branch 90 → 91 taken 495 times.
✓ Branch 90 → 95 taken 723 times.
✓ Branch 91 → 92 taken 375 times.
✓ Branch 91 → 95 taken 120 times.
✓ Branch 158 → 159 taken 510 times.
✓ Branch 158 → 166 taken 727 times.
✓ Branch 159 → 160 taken 390 times.
✓ Branch 159 → 166 taken 120 times.
2455 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 2455 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 1520 static void setlabel(string name, int loc=-1, bool is_static=false, int fsid=-1)
498 {
499
2/2
✓ Branch 2 → 3 taken 1496 times.
✓ Branch 2 → 7 taken 24 times.
1520 if(fsid == -1) {
500 1496 fsid = 0;
501
2/2
✓ Branch 3 → 4 taken 1125 times.
✓ Branch 3 → 7 taken 371 times.
1496 if (loc==-1)
502 {
503
1/3
✓ Branch 4 → 5 taken 1125 times.
✗ Branch 4 → 52 not taken.
✗ Branch 4 → 60 not taken.
1125 verifysnespos();
504 1125 loc = snespos;
505 // if base is not active:
506
2/2
✓ Branch 5 → 6 taken 873 times.
✓ Branch 5 → 7 taken 252 times.
1125 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 1520 snes_label label_data;
512 1520 label_data.pos = (unsigned int)loc;
513 1520 label_data.is_static = is_static;
514 1520 label_data.freespace_id = fsid;
515
516 unsigned int labelpos;
517
4/4
✓ Branch 8 → 9 taken 248 times.
✓ Branch 8 → 19 taken 500 times.
✓ Branch 9 → 10 taken 256 times.
✓ Branch 9 → 21 taken 516 times.
1520 if (pass==0)
518 {
519
5/7
✓ Branch 10 → 11 taken 248 times.
✗ Branch 10 → 52 not taken.
✓ Branch 11 → 12 taken 257 times.
✓ Branch 11 → 16 taken 247 times.
✗ Branch 11 → 60 not taken.
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 17 taken 255 times.
504 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 247 times.
✗ Branch 17 → 52 not taken.
✓ Branch 18 → 19 taken 255 times.
✗ Branch 18 → 60 not taken.
502 labels.create(name) = label_data;
525 }
526
4/4
✓ Branch 19 → 20 taken 250 times.
✓ Branch 19 → 23 taken 250 times.
✓ Branch 21 → 22 taken 258 times.
✓ Branch 21 → 26 taken 258 times.
1016 else if (pass==1)
527 {
528
2/4
✓ Branch 21 → 22 taken 250 times.
✗ Branch 21 → 52 not taken.
✓ Branch 23 → 24 taken 258 times.
✗ Branch 23 → 60 not taken.
508 labels.create(name) = label_data;
529 }
530
2/4
✓ Branch 23 → 24 taken 250 times.
✗ Branch 23 → 49 not taken.
✓ Branch 26 → 27 taken 258 times.
✗ Branch 26 → 57 not taken.
508 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 250 times.
✗ Branch 25 → 52 not taken.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 30 taken 250 times.
✗ Branch 27 → 28 not taken.
✗ Branch 27 → 52 not taken.
✓ Branch 28 → 29 taken 258 times.
✗ Branch 28 → 60 not taken.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 33 taken 258 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 60 not taken.
508 if (!labels.exists(name)) throw_err_block(2, err_internal_error, "label created on 3rd pass");
534
2/4
✓ Branch 31 → 32 taken 250 times.
✗ Branch 31 → 52 not taken.
✓ Branch 34 → 35 taken 258 times.
✗ Branch 34 → 60 not taken.
508 labelpos = labels.find(name).pos;
535
7/10
✓ Branch 32 → 33 taken 3 times.
✓ Branch 32 → 49 taken 247 times.
✓ Branch 33 → 34 taken 3 times.
✗ Branch 33 → 49 not taken.
✓ Branch 36 → 37 taken 3 times.
✓ Branch 36 → 57 taken 255 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 3 times.
✓ Branch 39 → 40 taken 3 times.
✗ Branch 39 → 57 not taken.
508 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 865 static void cleartable()
549 {
550
3/7
✓ Branch 2 → 3 taken 386 times.
✗ Branch 2 → 8 not taken.
✓ Branch 3 → 4 taken 865 times.
✗ Branch 3 → 6 not taken.
✗ Branch 3 → 11 not taken.
✓ Branch 5 → 6 taken 479 times.
✗ Branch 5 → 9 not taken.
865 thetable = table();
551 865 }
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 33296 void checkbankcross()
588 {
589
4/4
✓ Branch 2 → 3 taken 678 times.
✓ Branch 2 → 4 taken 32618 times.
✓ Branch 4 → 5 taken 729 times.
✓ Branch 4 → 6 taken 16051 times.
33296 if (!snespos_valid) return;
590
5/6
✓ Branch 4 → 5 taken 129 times.
✓ Branch 4 → 6 taken 15709 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 16051 times.
✓ Branch 8 → 9 taken 129 times.
✓ Branch 8 → 10 taken 15922 times.
31889 if (disable_bank_cross_errors) return;
591
5/6
✓ Branch 6 → 7 taken 77 times.
✓ Branch 6 → 8 taken 15632 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 15922 times.
✓ Branch 12 → 13 taken 77 times.
✓ Branch 12 → 14 taken 15845 times.
31631 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
592
8/8
✓ Branch 9 → 10 taken 268 times.
✓ Branch 9 → 14 taken 15441 times.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 14 taken 266 times.
✓ Branch 15 → 16 taken 286 times.
✓ Branch 15 → 20 taken 15636 times.
✓ Branch 16 → 17 taken 2 times.
✓ Branch 16 → 20 taken 284 times.
31631 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 15620 times.
✓ Branch 14 → 20 taken 87 times.
✓ Branch 15 → 16 taken 266 times.
✓ Branch 15 → 20 taken 15354 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 266 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 15920 times.
✓ Branch 22 → 23 taken 15800 times.
✓ Branch 22 → 28 taken 120 times.
✓ Branch 23 → 24 taken 281 times.
✓ Branch 23 → 28 taken 15519 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 28 taken 281 times.
31627 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 3387 static void freespaceend()
604 {
605
3/3
✓ Branch 2 → 3 taken 1620 times.
✓ Branch 2 → 5 taken 801 times.
✓ Branch 2 → 7 taken 966 times.
3387 if (freespaceid > 0)
606 {
607 1620 freespaces[freespaceid].len = realsnespos-freespacestart;
608 1620 snespos=(int)0xFFFFFFFF;
609 1620 snespos_valid = false;
610 }
611 3387 freespaceid = 0;
612 3387 }
613
614 2604 static void adddefine(const string & key, string & value)
615 {
616
2/4
✓ Branch 4 → 5 taken 1149 times.
✗ Branch 4 → 8 not taken.
✓ Branch 6 → 7 taken 1455 times.
✗ Branch 6 → 14 not taken.
2604 if (!defines.exists(key)) defines.create(key) = value;
617 2604 }
618
619 859 void initstuff()
620 {
621
3/3
✓ Branch 2 → 3 taken 293 times.
✓ Branch 2 → 5 taken 252 times.
✓ Branch 2 → 6 taken 314 times.
859 if (pass==0)
622 {
623 293 freespaces.reset();
624 293 movinglabelspossible = false;
625 293 found_rats_tags_initialized = false;
626 293 found_rats_tags.clear();
627 }
628 859 arch=arch_65816;
629 859 mapper=lorom;
630 859 mapper_set = false;
631 859 calledmacros = 0;
632 859 reallycalledmacros = 0;
633 859 macrorecursion = 0;
634 859 defines.reset();
635 859 builtindefines.each(adddefine);
636 859 clidefines.each(adddefine);
637 859 ns="";
638 859 namespace_list.reset();
639 859 sublabels.reset();
640 859 poslabels.reset();
641 859 neglabels.reset();
642 859 macroposlabels = nullptr;
643 859 macroneglabels = nullptr;
644 859 macrosublabels = nullptr;
645 859 cleartable();
646 859 pushpc.reset();
647 859 pushpcnum=0;
648 859 pushns.reset();
649 859 pushnsnum = 0;
650 859 bytes=0;
651 859 freespaceuse=0;
652
1/2
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 22 taken 476 times.
859 memset(fillbyte, 0, sizeof(fillbyte));
653
1/2
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 476 times.
859 memset(padbyte, 0, sizeof(padbyte));
654 859 snespos_valid = false;
655 859 snespos=(int)0xFFFFFFFF;
656 859 realsnespos= (int)0xFFFFFFFF;
657 859 startpos= (int)0xFFFFFFFF;
658 859 realstartpos= (int)0xFFFFFFFF;
659 859 freespaceidnext=1;
660 859 freespaceid=0;
661 859 freespacebyte=0x00;
662 859 incsrcdepth = 0;
663
664 859 optimizeforbank = -1;
665 859 optimize_dp = optimize_dp_flag::ALWAYS;
666 859 dp_base = 0;
667 859 optimize_address = optimize_address_flag::MIRRORS;
668
669 859 in_struct = false;
670 859 in_sub_struct = false;
671 859 in_spcblock = false;
672
673 859 disable_bank_cross_errors = false;
674 859 check_half_banks_crossed = false;
675 859 nested_namespaces = false;
676
677 859 includeonce.reset();
678
679 extern AddressToLineMapping addressToLineMapping;
680 859 addressToLineMapping.reset();
681
682 859 push_warnings(false);
683
684 859 initmathcore();
685
686 1335 default_freespace_settings = {};
687 859 default_freespace_settings.bank = -3;
688 859 default_freespace_settings.search_start = -1;
689 859 default_freespace_settings.write_rats = true;
690 // rest are initialized to false/0/empty string
691
692 859 callstack.clear();
693 #if defined(_WIN32) || !defined(NO_USE_THREADS)
694 859 init_stack_use_check();
695 #endif
696 859 }
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 283 static void resolve_pinned_freespaces() {
751
4/4
✓ Branch 5 → 3 taken 269 times.
✓ Branch 5 → 6 taken 126 times.
✓ Branch 7 → 3 taken 269 times.
✓ Branch 7 → 8 taken 157 times.
821 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 126 times.
✓ Branch 80 → 9 taken 269 times.
✓ Branch 80 → 81 taken 157 times.
821 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 126 times.
✓ Branch 89 → 82 taken 269 times.
✓ Branch 89 → 90 taken 157 times.
821 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 283 }
772
773 283 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 126 times.
✓ Branch 24 → 3 taken 269 times.
✓ Branch 24 → 25 taken 157 times.
821 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 126 times.
✓ Branch 65 → 26 taken 269 times.
✓ Branch 65 → 66 taken 157 times.
821 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 126 times.
✓ Branch 87 → 67 taken 269 times.
✓ Branch 87 → 88 taken 157 times.
821 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 283 labels.each([](const char * key, snes_label & val) {
805
4/4
✓ Branch 2 → 3 taken 52 times.
✓ Branch 2 → 5 taken 197 times.
✓ Branch 4 → 5 taken 52 times.
✓ Branch 4 → 12 taken 205 times.
506 if(val.freespace_id != 0) {
806 104 val.pos += freespaces[val.freespace_id].pos;
807 }
808 506 });
809 283 }
810
811 849 void finishpass()
812 {
813 849 verify_warnings();
814 849 pull_warnings(false);
815
816
3/5
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 471 times.
✓ Branch 4 → 8 taken 378 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 471 times.
849 if(in_spcblock) throw_err_block(0, err_missing_endspcblock);
817
6/12
✓ Branch 8 → 9 taken 378 times.
✗ Branch 8 → 10 not taken.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 378 times.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 471 times.
✓ Branch 12 → 13 taken 471 times.
✗ Branch 12 → 16 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 471 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 471 times.
849 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 378 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 471 times.
849 else if (pushpcnum) throw_err_null(0, err_pushpc_without_pullpc);
819
2/4
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 378 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 21 taken 471 times.
849 else if (pushnsnum) throw_err_null(0, err_pushns_without_pullns);
820 849 freespaceend();
821
822 849 deinitmathcore();
823
4/4
✓ Branch 17 → 18 taken 126 times.
✓ Branch 17 → 19 taken 252 times.
✓ Branch 23 → 24 taken 157 times.
✓ Branch 23 → 25 taken 314 times.
849 if(pass == 0) {
824 283 resolve_pinned_freespaces();
825
4/4
✓ Branch 19 → 20 taken 126 times.
✓ Branch 19 → 22 taken 126 times.
✓ Branch 25 → 26 taken 157 times.
✓ Branch 25 → 28 taken 157 times.
566 } else if(pass == 1) {
826 283 allocate_freespaces();
827 283 handle_cleared_rats_tags();
828 }
829 #if defined(_WIN32) || !defined(NO_USE_THREADS)
830 849 deinit_stack_use_check();
831 #endif
832 849 }
833
834 32789 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
835 {
836
4/7
✓ Branch 2 → 3 taken 16264 times.
✗ Branch 2 → 4 not taken.
✓ Branch 3 → 4 taken 16525 times.
✓ Branch 3 → 5 taken 16264 times.
✗ Branch 3 → 6 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 16525 times.
32789 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
837
838 32789 const char* posneglabel = label;
839
2/4
✓ Branch 5 → 6 taken 16264 times.
✗ Branch 5 → 89 not taken.
✓ Branch 9 → 10 taken 16525 times.
✗ Branch 9 → 139 not taken.
32789 string posnegname = posneglabelname(&posneglabel, true);
840
841
4/4
✓ Branch 7 → 8 taken 60 times.
✓ Branch 7 → 19 taken 16204 times.
✓ Branch 11 → 12 taken 66 times.
✓ Branch 11 → 27 taken 16459 times.
32789 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 15712 times.
✓ Branch 19 → 23 taken 492 times.
✓ Branch 20 → 21 taken 15682 times.
✓ Branch 20 → 23 taken 30 times.
✓ Branch 21 → 22 taken 15679 times.
✓ Branch 21 → 23 taken 3 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 73 taken 15679 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 16459 times.
✓ Branch 31 → 32 taken 15955 times.
✓ Branch 31 → 38 taken 504 times.
✓ Branch 33 → 34 taken 15922 times.
✓ Branch 33 → 38 taken 33 times.
✓ Branch 35 → 36 taken 15919 times.
✓ Branch 35 → 38 taken 3 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 118 taken 15919 times.
32663 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 519 times.
✓ Branch 40 → 41 taken 6 times.
✓ Branch 40 → 42 taken 534 times.
1065 if (!label[1]) return false;
851
14/20
✓ Branch 25 → 26 taken 21 times.
✓ Branch 25 → 30 taken 498 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 513 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.
1053 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
852
853 1047 bool define = true;
854
855
4/4
✓ Branch 30 → 31 taken 12 times.
✓ Branch 30 → 32 taken 504 times.
✓ Branch 53 → 54 taken 12 times.
✓ Branch 53 → 56 taken 519 times.
1047 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 159 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 165 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.
1047 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
865
4/4
✓ Branch 38 → 39 taken 507 times.
✓ Branch 38 → 86 taken 9 times.
✓ Branch 70 → 71 taken 522 times.
✓ Branch 70 → 135 taken 9 times.
1047 string name=labelname(&label, define, true);
866
4/4
✓ Branch 39 → 40 taken 474 times.
✓ Branch 39 → 41 taken 33 times.
✓ Branch 72 → 73 taken 486 times.
✓ Branch 72 → 75 taken 36 times.
1029 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 492 times.
✓ Branch 48 → 49 taken 12 times.
✗ Branch 48 → 84 not taken.
✓ Branch 82 → 83 taken 12 times.
✓ Branch 82 → 86 taken 507 times.
✓ Branch 83 → 84 taken 12 times.
✗ Branch 83 → 133 not taken.
1023 if (label[0]) throw_err_block(0, err_broken_label_definition);
870
14/16
✓ Branch 52 → 53 taken 54 times.
✓ Branch 52 → 55 taken 438 times.
✓ Branch 53 → 54 taken 48 times.
✓ Branch 53 → 55 taken 6 times.
✓ Branch 56 → 57 taken 48 times.
✓ Branch 56 → 62 taken 444 times.
✓ Branch 58 → 59 taken 48 times.
✗ Branch 58 → 80 not taken.
✓ Branch 87 → 88 taken 57 times.
✓ Branch 87 → 90 taken 450 times.
✓ Branch 88 → 89 taken 51 times.
✓ Branch 88 → 90 taken 6 times.
✓ Branch 91 → 92 taken 51 times.
✓ Branch 91 → 99 taken 456 times.
✓ Branch 94 → 95 taken 51 times.
✗ Branch 94 → 127 not taken.
999 if (ns && !global_label) name=ns+name;
871
21/26
✓ Branch 62 → 63 taken 387 times.
✓ Branch 62 → 64 taken 105 times.
✓ Branch 63 → 64 taken 12 times.
✓ Branch 63 → 66 taken 375 times.
✓ Branch 64 → 65 taken 87 times.
✓ Branch 64 → 66 taken 30 times.
✓ Branch 67 → 68 taken 492 times.
✗ Branch 67 → 83 not taken.
✓ Branch 68 → 69 taken 490 times.
✓ Branch 68 → 81 taken 2 times.
✗ Branch 99 → 100 not taken.
✓ Branch 99 → 101 taken 507 times.
✓ Branch 101 → 102 taken 402 times.
✓ Branch 101 → 105 taken 105 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 117 times.
✓ Branch 107 → 108 taken 87 times.
✓ Branch 107 → 109 taken 30 times.
✓ Branch 111 → 112 taken 507 times.
✗ Branch 111 → 131 not taken.
✓ Branch 112 → 113 taken 505 times.
✓ Branch 112 → 129 taken 2 times.
1003 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
872 995 return true;
873 1029 }
874 31598 return false;
875 32789 }
876
877 15692 static void add_addr_to_line(int pos)
878 {
879
3/3
✓ Branch 2 → 3 taken 5534 times.
✓ Branch 2 → 6 taken 5049 times.
✓ Branch 2 → 7 taken 5109 times.
15692 if (pass == 2)
880 5534 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
881 15692 }
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 118 static void push_pc()
891 {
892 118 pushpc[pushpcnum].arch=arch;
893 118 pushpc[pushpcnum].snespos=snespos;
894 118 pushpc[pushpcnum].snesstart=startpos;
895 118 pushpc[pushpcnum].snesposreal=realsnespos;
896 118 pushpc[pushpcnum].snesstartreal=realstartpos;
897 118 pushpc[pushpcnum].freeid=freespaceid;
898 118 pushpc[pushpcnum].freest=freespacestart;
899 118 pushpcnum++;
900 118 }
901
902 118 static void pop_pc()
903 {
904 118 pushpcnum--;
905 118 snespos=pushpc[pushpcnum].snespos;
906 118 startpos=pushpc[pushpcnum].snesstart;
907 118 realsnespos=pushpc[pushpcnum].snesposreal;
908 118 realstartpos=pushpc[pushpcnum].snesstartreal;
909 118 freespaceid=pushpc[pushpcnum].freeid;
910 118 freespacestart=pushpc[pushpcnum].freest;
911 118 }
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 372 void cmd_assert(const char* par) {
1002
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 183 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 189 times.
372 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 183 times.
✗ Branch 6 → 63 not taken.
✓ Branch 7 → 8 taken 189 times.
✗ Branch 7 → 89 not taken.
372 const char* message_start = strqpchr(par, ',');
1007
1008 372 string cond_str;
1009
4/4
✓ Branch 8 → 9 taken 15 times.
✓ Branch 8 → 11 taken 168 times.
✓ Branch 10 → 11 taken 15 times.
✓ Branch 10 → 14 taken 174 times.
372 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 168 times.
✗ Branch 11 → 61 not taken.
✓ Branch 14 → 15 taken 174 times.
✗ Branch 14 → 87 not taken.
342 cond_str = par;
1014 }
1015
1016
4/4
✓ Branch 12 → 13 taken 122 times.
✓ Branch 12 → 14 taken 61 times.
✓ Branch 15 → 16 taken 126 times.
✓ Branch 15 → 17 taken 63 times.
372 if(pass != 2) return;
1017
1018
8/12
✓ Branch 15 → 16 taken 61 times.
✗ Branch 15 → 50 not taken.
✓ Branch 18 → 19 taken 47 times.
✓ Branch 18 → 45 taken 14 times.
✓ Branch 19 → 20 taken 47 times.
✗ Branch 19 → 43 not taken.
✓ Branch 20 → 21 taken 63 times.
✗ Branch 20 → 71 not taken.
✓ Branch 28 → 29 taken 49 times.
✓ Branch 28 → 65 taken 14 times.
✓ Branch 30 → 31 taken 49 times.
✗ Branch 30 → 63 not taken.
332 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 122 times.
✓ Branch 57 → 58 taken 43 times.
✓ Branch 57 → 59 taken 126 times.
496 }
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 918 void cmd_org(const char* par) {
1203
3/9
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 495 times.
✓ Branch 2 → 6 taken 423 times.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 33 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 8 taken 495 times.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 48 not taken.
918 if(in_spcblock) throw_err_block(0, err_feature_unavaliable_in_spcblock);
1204
2/4
✓ Branch 6 → 7 taken 423 times.
✗ Branch 6 → 33 not taken.
✓ Branch 8 → 9 taken 495 times.
✗ Branch 8 → 48 not taken.
918 freespaceend();
1205
2/4
✓ Branch 7 → 8 taken 423 times.
✗ Branch 7 → 33 not taken.
✓ Branch 10 → 11 taken 495 times.
✗ Branch 10 → 48 not taken.
918 auto math_expr = parse_math_expr(par);
1206
6/8
✓ Branch 9 → 10 taken 422 times.
✓ Branch 9 → 27 taken 1 time.
✓ Branch 10 → 11 taken 422 times.
✗ Branch 10 → 25 not taken.
✓ Branch 13 → 14 taken 494 times.
✓ Branch 13 → 40 taken 1 time.
✓ Branch 15 → 16 taken 494 times.
✗ Branch 15 → 38 not taken.
918 int64_t num = math_expr->evaluate_non_forward().get_integer();
1207
2/12
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 18 taken 422 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 494 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 44 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 42 not taken.
916 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 284 times.
✓ Branch 19 → 20 taken 3 times.
✓ Branch 19 → 23 taken 135 times.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 23 taken 287 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 494 times.
✓ Branch 28 → 29 taken 150 times.
✓ Branch 28 → 32 taken 344 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 347 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 35 not taken.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 46 not taken.
916 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) throw_warning(0, warn_set_middle_byte);
1209 916 snespos=(int)num;
1210 916 realsnespos=(int)num;
1211 916 startpos=(int)num;
1212 916 realstartpos=(int)num;
1213 916 snespos_valid = true;
1214 1412 }
1215
1216 120 void cmd_struct(char** words, int numwords) {
1217 //verifysnespos();
1218
6/10
✓ Branch 2 → 3 taken 60 times.
✓ Branch 2 → 4 taken 60 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 60 times.
✓ Branch 4 → 5 taken 60 times.
✗ Branch 4 → 8 not taken.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 60 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 60 times.
120 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 60 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 60 times.
120 if (numwords < 1) throw_err_block(0, err_missing_struct_params);
1220
2/4
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 15 taken 60 times.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 60 times.
120 if (numwords > 3) throw_err_block(0, err_too_many_struct_params);
1221
2/4
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 60 times.
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 25 taken 60 times.
120 if (!confirmname(words[0])) throw_err_block(0, err_invalid_struct_name);
1222
1223
8/12
✓ Branch 21 → 22 taken 29 times.
✓ Branch 21 → 24 taken 31 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 29 times.
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 60 times.
✓ Branch 27 → 28 taken 29 times.
✓ Branch 27 → 30 taken 31 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 29 times.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 36 taken 60 times.
120 if (structs.exists(words[0]) && pass == 0) throw_err_block(0, err_struct_redefined, words[0]);
1224
1225 120 static_struct = false;
1226 120 old_snespos = snespos;
1227 120 old_startpos = startpos;
1228 120 old_optimizeforbank = optimizeforbank;
1229
1/2
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 60 times.
120 old_snespos_valid = snespos_valid;
1230 120 unsigned int base = 0;
1231
4/4
✓ Branch 29 → 30 taken 27 times.
✓ Branch 29 → 46 taken 33 times.
✓ Branch 38 → 39 taken 27 times.
✓ Branch 38 → 77 taken 33 times.
120 if (numwords == 2)
1232 {
1233 54 static_struct = true;
1234
2/5
✓ Branch 30 → 31 taken 27 times.
✗ Branch 30 → 108 not taken.
✗ Branch 30 → 109 not taken.
✓ Branch 42 → 43 taken 27 times.
✗ Branch 42 → 174 not taken.
54 auto base_expr = parse_math_expr(words[1]);
1235
6/10
✓ Branch 32 → 33 taken 26 times.
✗ Branch 32 → 104 not taken.
✓ Branch 32 → 105 taken 1 time.
✓ Branch 33 → 34 taken 26 times.
✗ Branch 33 → 102 not taken.
✗ Branch 33 → 103 not taken.
✓ Branch 45 → 46 taken 26 times.
✓ Branch 45 → 168 taken 1 time.
✓ Branch 47 → 48 taken 26 times.
✗ Branch 47 → 166 not taken.
54 base = base_expr->evaluate_non_forward().get_integer();
1236
1237
4/9
✓ Branch 36 → 37 taken 26 times.
✗ Branch 36 → 105 not taken.
✗ Branch 36 → 106 not taken.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 26 times.
✓ Branch 59 → 60 taken 26 times.
✗ Branch 59 → 170 not taken.
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 63 taken 26 times.
52 if (base_expr->has_label() > 1) static_struct = false;
1238
4/4
✓ Branch 39 → 40 taken 18 times.
✓ Branch 39 → 44 taken 8 times.
✓ Branch 63 → 64 taken 18 times.
✓ Branch 63 → 75 taken 8 times.
52 if (pass > 0) {
1239 // foundlabel_static isn't accurate anymore
1240
10/18
✓ Branch 40 → 41 taken 18 times.
✗ Branch 40 → 106 not taken.
✗ Branch 40 → 107 not taken.
✓ Branch 41 → 42 taken 17 times.
✓ Branch 41 → 44 taken 1 time.
✓ Branch 42 → 43 taken 17 times.
✗ Branch 42 → 106 not taken.
✗ Branch 42 → 107 not taken.
✓ Branch 65 → 66 taken 18 times.
✗ Branch 65 → 172 not taken.
✓ Branch 66 → 67 taken 17 times.
✓ Branch 66 → 75 taken 1 time.
✓ Branch 68 → 69 taken 17 times.
✗ Branch 68 → 172 not taken.
✗ Branch 70 → 71 not taken.
✓ Branch 70 → 72 taken 17 times.
✗ Branch 72 → 73 not taken.
✓ Branch 72 → 74 taken 17 times.
36 if(structs.exists(words[0])) static_struct &= structs.find(words[0]).is_static;
1241 }
1242 54 }
1243
1244
1/2
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 59 times.
118 bool old_in_struct = in_struct;
1245
1/2
✗ Branch 79 → 80 not taken.
✓ Branch 79 → 81 taken 59 times.
118 bool old_in_sub_struct = in_sub_struct;
1246
8/8
✓ Branch 46 → 47 taken 41 times.
✓ Branch 46 → 48 taken 18 times.
✓ Branch 47 → 48 taken 26 times.
✓ Branch 47 → 49 taken 15 times.
✓ Branch 81 → 82 taken 41 times.
✓ Branch 81 → 83 taken 18 times.
✓ Branch 82 → 83 taken 26 times.
✓ Branch 82 → 84 taken 15 times.
118 in_struct = numwords == 1 || numwords == 2;
1247 118 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 26 times.
✓ Branch 50 → 58 taken 33 times.
✓ Branch 85 → 86 taken 26 times.
✓ Branch 85 → 95 taken 33 times.
118 if (numwords == 2)
1252 {
1253
2/14
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 57 taken 26 times.
✗ Branch 52 → 53 not taken.
✗ Branch 52 → 111 not taken.
✗ Branch 52 → 112 not taken.
✗ Branch 54 → 55 not taken.
✗ Branch 54 → 109 not taken.
✗ Branch 54 → 110 not taken.
✗ Branch 86 → 87 not taken.
✓ Branch 86 → 94 taken 26 times.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 178 not taken.
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 176 not taken.
52 if (base&~0xFFFFFF) cleanup(), throw_err_block(0, err_snes_address_out_of_bounds, hex((unsigned int)base, 6).data());
1254 52 snespos = (int)base;
1255 52 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 95 → 96 taken 15 times.
✓ Branch 95 → 134 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 → 117 not taken.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 15 times.
✗ Branch 60 → 116 not taken.
✗ Branch 61 → 62 not taken.
✗ Branch 61 → 117 not taken.
✗ Branch 98 → 99 not taken.
✓ Branch 98 → 100 taken 15 times.
✗ Branch 100 → 101 not taken.
✓ Branch 100 → 104 taken 15 times.
✗ Branch 101 → 102 not taken.
✗ Branch 101 → 184 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 → 116 not taken.
✗ Branch 66 → 67 not taken.
✗ Branch 66 → 117 not taken.
✓ Branch 106 → 107 taken 15 times.
✗ Branch 106 → 184 not taken.
✗ Branch 107 → 108 not taken.
✓ Branch 107 → 111 taken 15 times.
✗ Branch 108 → 109 not taken.
✗ Branch 108 → 184 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 → 116 not taken.
✓ Branch 69 → 70 taken 15 times.
✗ Branch 69 → 117 not taken.
✓ Branch 114 → 115 taken 15 times.
✗ Branch 114 → 184 not taken.
30 string tmp_struct_parent = words[2];
1262
1263
4/17
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 114 not taken.
✓ Branch 71 → 72 taken 15 times.
✗ Branch 71 → 76 not taken.
✗ Branch 71 → 115 not taken.
✗ Branch 72 → 73 not taken.
✓ Branch 72 → 77 taken 15 times.
✗ Branch 73 → 74 not taken.
✗ Branch 73 → 114 not taken.
✗ Branch 74 → 75 not taken.
✗ Branch 74 → 115 not taken.
✓ Branch 116 → 117 taken 15 times.
✗ Branch 116 → 182 not taken.
✗ Branch 117 → 118 not taken.
✓ Branch 117 → 122 taken 15 times.
✗ Branch 119 → 120 not taken.
✗ Branch 119 → 182 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 → 114 not taken.
✓ Branch 78 → 79 taken 15 times.
✗ Branch 78 → 114 not taken.
✗ Branch 78 → 115 not taken.
✓ Branch 79 → 80 taken 15 times.
✗ Branch 79 → 115 not taken.
✓ Branch 124 → 125 taken 15 times.
✗ Branch 124 → 182 not taken.
✓ Branch 126 → 127 taken 15 times.
✗ Branch 126 → 182 not taken.
30 snes_struct structure = structs.find(tmp_struct_parent);
1265
1266
1/2
✗ Branch 127 → 128 not taken.
✓ Branch 127 → 129 taken 15 times.
30 static_struct = structure.is_static;
1267
2/6
✗ Branch 79 → 80 not taken.
✗ Branch 79 → 112 not taken.
✓ Branch 80 → 81 taken 15 times.
✗ Branch 80 → 113 not taken.
✓ Branch 129 → 130 taken 15 times.
✗ Branch 129 → 180 not taken.
30 struct_parent = tmp_struct_parent;
1268 30 snespos = structure.base_end;
1269 30 startpos = structure.base_end;
1270 30 }
1271
1272 118 push_pc();
1273
1274 118 optimizeforbank = -1;
1275
1276 118 struct_name = words[0];
1277 118 struct_base = snespos;
1278 118 realsnespos = 0;
1279 118 realstartpos = 0;
1280 118 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 44 times.
✗ Branch 137 → 138 not taken.
✓ Branch 137 → 139 taken 59 times.
✓ Branch 139 → 140 taken 15 times.
✓ Branch 139 → 157 taken 44 times.
118 if(in_sub_struct) {
1283
4/11
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 119 not taken.
✓ Branch 88 → 89 taken 15 times.
✗ Branch 88 → 117 not taken.
✗ Branch 88 → 120 not taken.
✓ Branch 89 → 90 taken 15 times.
✗ Branch 89 → 118 not taken.
✓ Branch 143 → 144 taken 15 times.
✗ Branch 143 → 189 not taken.
✓ Branch 144 → 145 taken 15 times.
✗ Branch 144 → 187 not taken.
30 string labelname = struct_parent + "." + struct_name;
1284
5/13
✗ Branch 91 → 92 not taken.
✗ Branch 91 → 122 not taken.
✓ Branch 92 → 93 taken 15 times.
✗ Branch 92 → 120 not taken.
✗ Branch 92 → 123 not taken.
✓ Branch 93 → 94 taken 15 times.
✗ Branch 93 → 121 not taken.
✗ Branch 147 → 148 not taken.
✓ Branch 147 → 149 taken 15 times.
✓ Branch 151 → 152 taken 15 times.
✗ Branch 151 → 193 not taken.
✓ Branch 152 → 153 taken 15 times.
✗ Branch 152 → 191 not taken.
30 setlabel(ns + labelname, snespos, static_struct);
1285 30 } else {
1286
5/13
✗ Branch 97 → 98 not taken.
✗ Branch 97 → 128 not taken.
✓ Branch 98 → 99 taken 44 times.
✗ Branch 98 → 126 not taken.
✗ Branch 98 → 129 not taken.
✓ Branch 99 → 100 taken 44 times.
✗ Branch 99 → 127 not taken.
✗ Branch 157 → 158 not taken.
✓ Branch 157 → 159 taken 44 times.
✓ Branch 161 → 162 taken 44 times.
✗ Branch 161 → 201 not taken.
✓ Branch 162 → 163 taken 44 times.
✗ Branch 162 → 199 not taken.
88 setlabel(ns + struct_name, snespos, static_struct);
1287 }
1288
1289 #undef cleanup
1290 118 }
1291
1292 120 void cmd_endstruct(char** words, int numwords) {
1293
3/7
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 7 taken 114 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 6 times.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 87 not taken.
✗ Branch 4 → 131 not taken.
120 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 57 times.
✓ Branch 7 → 12 taken 57 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 60 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 60 times.
✗ Branch 13 → 87 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 131 not taken.
120 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 44 times.
✓ Branch 17 → 18 taken 1 time.
✓ Branch 17 → 19 taken 60 times.
✓ Branch 17 → 21 taken 15 times.
✓ Branch 18 → 19 taken 1 time.
✗ Branch 18 → 87 not taken.
✓ Branch 19 → 20 taken 16 times.
✓ Branch 19 → 26 taken 44 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 → 131 not taken.
120 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 56 times.
✓ Branch 22 → 23 taken 3 times.
✗ Branch 22 → 87 not taken.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 31 taken 56 times.
✓ Branch 29 → 30 taken 3 times.
✗ Branch 29 → 131 not taken.
118 int alignment = numwords == 2 ? (int)getnum(words[1]) : 1;
1298
2/8
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 59 times.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 87 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 59 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 131 not taken.
118 if (alignment < 1) throw_err_block(0, err_alignment_too_small);
1299
1300 118 snes_struct structure;
1301 118 structure.base_end = snespos;
1302
1/2
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 59 times.
118 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1303 118 structure.object_size = structure.struct_size;
1304
1/2
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 42 taken 59 times.
118 structure.is_static = static_struct;
1305
1306
5/6
✓ Branch 30 → 31 taken 44 times.
✓ Branch 30 → 34 taken 15 times.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 59 times.
✓ Branch 44 → 45 taken 44 times.
✓ Branch 44 → 49 taken 15 times.
118 if (in_struct)
1307 {
1308
4/8
✓ Branch 32 → 33 taken 44 times.
✗ Branch 32 → 85 not taken.
✓ Branch 33 → 54 taken 44 times.
✗ Branch 33 → 85 not taken.
✓ Branch 46 → 47 taken 44 times.
✗ Branch 46 → 129 not taken.
✓ Branch 48 → 80 taken 44 times.
✗ Branch 48 → 129 not taken.
88 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 → 74 not taken.
✓ Branch 38 → 39 taken 15 times.
✗ Branch 38 → 74 not taken.
✓ Branch 55 → 56 taken 15 times.
✗ Branch 55 → 115 not taken.
✓ Branch 57 → 58 taken 15 times.
✗ Branch 57 → 115 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 → 72 not taken.
✓ Branch 43 → 44 taken 15 times.
✗ Branch 43 → 70 not taken.
✓ Branch 45 → 46 taken 15 times.
✗ Branch 45 → 68 not taken.
✓ Branch 46 → 47 taken 15 times.
✗ Branch 46 → 68 not taken.
✓ Branch 63 → 64 taken 15 times.
✗ Branch 63 → 111 not taken.
✓ Branch 64 → 65 taken 15 times.
✗ Branch 64 → 109 not taken.
✓ Branch 67 → 68 taken 15 times.
✗ Branch 67 → 107 not taken.
✓ Branch 69 → 70 taken 15 times.
✗ Branch 69 → 107 not taken.
30 structs.create(struct_parent + "." + struct_name) = structure;
1320
4/8
✓ Branch 50 → 51 taken 15 times.
✗ Branch 50 → 74 not taken.
✓ Branch 51 → 52 taken 15 times.
✗ Branch 51 → 74 not taken.
✓ Branch 75 → 76 taken 15 times.
✗ Branch 75 → 115 not taken.
✓ Branch 77 → 78 taken 15 times.
✗ Branch 77 → 115 not taken.
30 structs.create(struct_parent) = parent;
1321 30 }
1322
1323 // create a fake label for the end, so that datasize() acts nicer on the last label in the struct
1324
2/4
✓ Branch 54 → 55 taken 59 times.
✗ Branch 54 → 85 not taken.
✓ Branch 81 → 82 taken 59 times.
✗ Branch 81 → 129 not taken.
118 string endname = STR ":endstruct_";
1325
5/6
✓ Branch 55 → 56 taken 15 times.
✓ Branch 55 → 60 taken 44 times.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 59 times.
✓ Branch 84 → 85 taken 15 times.
✓ Branch 84 → 91 taken 44 times.
118 if(in_sub_struct) {
1326
4/8
✓ Branch 56 → 57 taken 15 times.
✗ Branch 56 → 79 not taken.
✓ Branch 57 → 58 taken 15 times.
✗ Branch 57 → 77 not taken.
✓ Branch 86 → 87 taken 15 times.
✗ Branch 86 → 121 not taken.
✓ Branch 88 → 89 taken 15 times.
✗ Branch 88 → 119 not taken.
30 endname += struct_parent + ".";
1327 }
1328
2/4
✓ Branch 60 → 61 taken 59 times.
✗ Branch 60 → 83 not taken.
✓ Branch 91 → 92 taken 59 times.
✗ Branch 91 → 127 not taken.
118 endname += struct_name;
1329
5/10
✓ Branch 61 → 62 taken 59 times.
✗ Branch 61 → 82 not taken.
✓ Branch 62 → 63 taken 59 times.
✗ Branch 62 → 80 not taken.
✗ Branch 92 → 93 not taken.
✓ Branch 92 → 94 taken 59 times.
✓ Branch 95 → 96 taken 59 times.
✗ Branch 95 → 125 not taken.
✓ Branch 96 → 97 taken 59 times.
✗ Branch 96 → 123 not taken.
118 setlabel(endname, snespos, static_struct);
1330
1331
2/4
✓ Branch 64 → 65 taken 59 times.
✗ Branch 64 → 83 not taken.
✓ Branch 99 → 100 taken 59 times.
✗ Branch 99 → 127 not taken.
118 pop_pc();
1332 118 in_struct = false;
1333 118 in_sub_struct = false;
1334 118 snespos = old_snespos;
1335 118 startpos = old_startpos;
1336 118 optimizeforbank = old_optimizeforbank;
1337
1/2
✗ Branch 100 → 101 not taken.
✓ Branch 100 → 102 taken 59 times.
118 snespos_valid = old_snespos_valid;
1338 118 static_struct = false;
1339 177 }
1340
1341 12 void cmd_spcblock(char** words, int num_words) {
1342 12 int addrToLinePos = realsnespos & 0xFFFFFF;
1343 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1344
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);
1345
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);
1346
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);
1347
1348 12 spcblock.destination = getnum(words[0]);
1349 12 spcblock.type = spcblock_nspc;
1350 12 spcblock.macro_name = "";
1351
1352
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());
1353
1354
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)
1355 {
1356 if(!stricmp(words[1], "nspc")) spcblock.type = spcblock_nspc;
1357 else if(!stricmp(words[1], "custom")) throw_err_block(0, err_custom_spcblock_missing_macro);
1358 else throw_err_block(0, err_unknown_spcblock_type);
1359 }
1360
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)
1361 {
1362 if(!stricmp(words[1], "custom")) spcblock.type = spcblock_custom;
1363 else throw_err_block(0, err_extra_spcblock_arg_for_type);
1364
1365 if(macros.exists(words[2]))
1366 {
1367 macrodata *macro = macros.find(words[2]);
1368 if(!macro->variadic) throw_err_block(0, err_spcblock_macro_must_be_varadic);
1369 if(macro->numargs != 3) throw_err_block(0, err_spcblock_macro_invalid_static_args);
1370 spcblock.macro_name = words[2];
1371 }
1372 else throw_err_block(0, err_spcblock_macro_doesnt_exist);
1373 }
1374
1375
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)
1376 {
1377 12 case spcblock_nspc:
1378 12 spcblock.size_address=realsnespos;
1379 12 write2(0x0000);
1380 12 write2(spcblock.destination);
1381 12 snespos=(int)spcblock.destination;
1382 12 startpos=(int)spcblock.destination;
1383 12 add_addr_to_line(addrToLinePos);
1384 12 break;
1385 case spcblock_custom:
1386 //this is a todo that probably won't be ready for 1.9
1387 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1388 throw_err_block(0, err_spcblock_custom_types_incomplete);
1389 push_pc();
1390 spcblock.old_mapper = mapper;
1391 mapper = norom;
1392 break;
1393 default:
1394 throw_err_fatal(0, err_internal_error, "invalid spcblock type");
1395 }
1396
1397 12 ns_backup = ns;
1398
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;
1399 12 in_spcblock = true;
1400 12 }
1401
1402 12 void cmd_endspcblock(char** words, int num_words) {
1403
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);
1404
1405
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)
1406 {
1407 12 case spcblock_nspc:
1408
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)
1409 {
1410 4 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1411
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());
1412 // compute number of bytes written;
1413 // offset by 4 for the spcblock header itself
1414 4 int num = realsnespos - ((int)spcblock.size_address + 4);
1415 4 writeromdata_byte(pcpos, (unsigned char)num);
1416 4 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1417 }
1418
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)
1419 {
1420 // todo allow spaces here
1421
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]);
1422 else
1423 {
1424 6 write2(0x0000);
1425
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);
1426 }
1427 }
1428
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)
1429 {
1430 throw_err_null(0, err_unknown_endspcblock_format);
1431 }
1432 12 break;
1433 case spcblock_custom:
1434 mapper = spcblock.old_mapper;
1435 pop_pc();
1436 break;
1437 default:
1438 throw_err_fatal(0, err_internal_error, "invalid spcblock type");
1439 }
1440 12 ns = ns_backup;
1441 12 in_spcblock = false;
1442 12 snespos=realsnespos;
1443 12 startpos=realstartpos;
1444 12 }
1445
1446 102 void cmd_base(const char* par) {
1447
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"))
1448 {
1449 30 snespos=realsnespos;
1450 30 startpos=realstartpos;
1451 30 snespos_valid = realsnespos >= 0;
1452 30 return;
1453 }
1454
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();
1455
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());
1456 72 snespos=(int)num;
1457 72 startpos=(int)num;
1458 72 optimizeforbank=-1;
1459 72 snespos_valid = realsnespos >= 0;
1460 }
1461
1462 12 void cmd_dpbase(const char* par) {
1463
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();
1464
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());
1465 12 dp_base = (int)num;
1466 12 }
1467
1468 108 void cmd_optimize(char** words, int num_words) {
1469
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, "");
1470
1471
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"))
1472 {
1473
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"))
1474 {
1475 24 optimize_dp = optimize_dp_flag::NONE;
1476 24 return;
1477 }
1478
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"))
1479 {
1480 6 optimize_dp = optimize_dp_flag::RAM;
1481 6 return;
1482 }
1483
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"))
1484 {
1485 12 optimize_dp = optimize_dp_flag::ALWAYS;
1486 12 return;
1487 }
1488 throw_err_block(1, err_bad_dp_optimize, words[1]);
1489 }
1490
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"))
1491 {
1492
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"))
1493 {
1494 24 optimize_address = optimize_address_flag::DEFAULT;
1495 24 return;
1496 }
1497
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"))
1498 {
1499 18 optimize_address = optimize_address_flag::RAM;
1500 18 return;
1501 }
1502
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"))
1503 {
1504 24 optimize_address = optimize_address_flag::MIRRORS;
1505 24 return;
1506 }
1507 throw_err_block(1, err_bad_address_optimize, words[1]);
1508 }
1509 throw_err_block(1, err_bad_optimize, words[0]);
1510 }
1511
1512 18 void cmd_bank(const char* par) {
1513
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"))
1514 {
1515 6 optimizeforbank=-1;
1516 6 return;
1517 }
1518
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"))
1519 {
1520 6 optimizeforbank=0x140;
1521 6 return;
1522 }
1523 6 unsigned int num=getnum(par);
1524 //if (forwardlabel) error(0, "bank Label is not valid");
1525 //if (foundlabel) num>>=16;
1526
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());
1527 6 optimizeforbank=(int)num;
1528 }
1529
1530 enum class freespace_cmds {
1531 freespace,
1532 freecode,
1533 freedata,
1534 segment,
1535 };
1536
1537 template<freespace_cmds the_cmd>
1538 1614 void cmd_freespace(const char* par) {
1539
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);
1540
1541
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;
1542 1122 if (the_cmd == freespace_cmds::freecode) this_fs_settings.bank = -2;
1543 336 if (the_cmd == freespace_cmds::freedata) this_fs_settings.bank = -1;
1544 150 if (the_cmd == freespace_cmds::segment) this_fs_settings.write_rats = false;
1545
1546
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;
1547
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);
1548
1549
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;
1550
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);
1551 // no point specifying anything about cleaning when not writing a rats tag
1552
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 &&
1553
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))
1554 throw_err_block(0, err_invalid_freespace_request);
1555
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;
1556
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();
1557 1614 freespaceid = freespaceidnext++;
1558
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];
1559
1560
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) {
1561
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;
1562 538 thisfs.pos = -1;
1563 538 thisfs.leaked = true;
1564 538 thisfs.orgpos = -2;
1565 538 thisfs.orglen = -1;
1566 538 snespos=0;
1567 }
1568
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)
1569 {
1570
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)
1571 {
1572 thisfs.pos = 0;
1573 thisfs.leaked = false;//mute some other errors
1574 throw_err_block(1, err_static_freespace_autoclean);
1575 }
1576 538 snespos = 0;
1577 }
1578
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)
1579 {
1580
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????)
1581 538 snespos=thisfs.pos;
1582
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);
1583
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;
1584
1585 // add a mapping for the start of the rats tag
1586
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);
1587 }
1588
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());
1589
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());
1590
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;
1591 1614 freespacestart=snespos;
1592 1614 startpos=snespos;
1593 1614 realstartpos=snespos;
1594 1614 realsnespos=snespos;
1595 1614 optimizeforbank=-1;
1596
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;
1597 1614 snespos_valid = true;
1598 // check this at the very end so that snespos gets set properly, to
1599 // prevent spurious errors later
1600 //...i guess this can still cause bankcross errors if the old freespace
1601 //happened to be very close to the end of a bank or something, but
1602 //whatever
1603
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)
1604
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);
1605
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 }
1606
1607 6 void cmd_freespace_settings(const char* par) {
1608
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;
1609
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);
1610 9 }
1611
1612 42 void cmd_prot(const char* par) {
1613 42 int addrToLinePos = realsnespos & 0xFFFFFF;
1614
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);
1615
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);
1616
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);
1617 21 int num;
1618
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;
1619
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);
1620
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);
1621
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');
1622
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');
1623
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');
1624
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');
1625
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);
1626
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));
1627
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++)
1628 {
1629 54 const char * labeltest=pars[i];
1630
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;
1631
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);
1632
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());
1633
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);
1634
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;
1635 54 }
1636
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');
1637
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');
1638
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');
1639
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');
1640
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);
1641 42 ratsmetastate=ratsmeta_used;
1642
1643
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);
1644 63 }
1645
1646 18 void cmd_autoclean(char** words, int num_words) {
1647
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);
1648
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)
1649 {
1650 18 const char * labeltest = words[1];
1651
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;
1652
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")) {
1653
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);
1654
1655
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);
1656
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);
1657 } else {
1658 // other ones are handled in arch-65816
1659 throw_err_block(0, err_broken_autoclean);
1660 }
1661 18 }
1662 else if (num_words == 1) {
1663 if(pass==0) removerats(parse_math_expr(words[0])->evaluate_static().get_integer(), freespacebyte);
1664 } else {
1665 throw_err_block(0, err_broken_autoclean);
1666 }
1667 18 }
1668
1669 6 void cmd_freespacebyte(const char* par) {
1670
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();
1671 6 }
1672
1673 6 void cmd_pushpc(const char* par) {
1674
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", "");
1675 6 verifysnespos();
1676 6 pushpc[pushpcnum].arch=arch;
1677 6 pushpc[pushpcnum].snespos=snespos;
1678 6 pushpc[pushpcnum].snesstart=startpos;
1679 6 pushpc[pushpcnum].snesposreal=realsnespos;
1680 6 pushpc[pushpcnum].snesstartreal=realstartpos;
1681 6 pushpc[pushpcnum].freeid=freespaceid;
1682 6 pushpc[pushpcnum].freest=freespacestart;
1683 6 pushpcnum++;
1684 6 snespos=(int)0xFFFFFFFF;
1685 6 startpos= (int)0xFFFFFFFF;
1686 6 realsnespos= (int)0xFFFFFFFF;
1687 6 realstartpos= (int)0xFFFFFFFF;
1688 6 snespos_valid = false;
1689 6 }
1690
1691 6 void cmd_pullpc(const char* par) {
1692
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", "");
1693
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);
1694 6 pushpcnum--;
1695 6 freespaceend();
1696
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);
1697 6 snespos=pushpc[pushpcnum].snespos;
1698 6 startpos=pushpc[pushpcnum].snesstart;
1699 6 realsnespos=pushpc[pushpcnum].snesposreal;
1700 6 realstartpos=pushpc[pushpcnum].snesstartreal;
1701 6 freespaceid=pushpc[pushpcnum].freeid;
1702 6 freespacestart=pushpc[pushpcnum].freest;
1703 6 snespos_valid = true;
1704 6 }
1705
1706 6 void cmd_pushbase(const char* par) {
1707
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", "");
1708 6 basestack[basestacknum] = snespos;
1709 6 basestacknum++;
1710 6 }
1711
1712 6 void cmd_pullbase(const char* par) {
1713
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", "");
1714
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);
1715 6 basestacknum--;
1716 6 snespos = basestack[basestacknum];
1717 6 startpos = basestack[basestacknum];
1718
1719
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)
1720 {
1721 6 optimizeforbank = -1;
1722 }
1723 6 }
1724
1725 12 void cmd_pushns(const char* par) {
1726
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", "");
1727
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);
1728 12 pushns[pushnsnum].ns = ns;
1729
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++)
1730 {
1731 12 pushns[pushnsnum].namespace_list.append(namespace_list[i]);
1732 }
1733
1/2
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 6 times.
12 pushns[pushnsnum].nested_namespaces = nested_namespaces;
1734 12 pushnsnum++;
1735
1736 12 namespace_list.reset();
1737 12 ns = "";
1738 12 nested_namespaces = false;
1739 12 }
1740
1741 12 void cmd_pullns(const char* par) {
1742
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", "");
1743
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);
1744
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);
1745 12 pushnsnum--;
1746 12 ns = pushns[pushnsnum].ns;
1747
1/2
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 6 times.
12 nested_namespaces = pushns[pushnsnum].nested_namespaces;
1748 12 namespace_list.reset();
1749
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++)
1750 {
1751 24 namespace_list.append(pushns[pushnsnum].namespace_list[i]);
1752 }
1753 12 }
1754
1755 165 void cmd_namespace(char** words, int num_words) {
1756
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);
1757 165 bool leave = false;
1758
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)
1759 {
1760
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"))
1761 {
1762
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);
1763 48 leave = true;
1764 }
1765
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"))
1766 {
1767
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);
1768
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;
1769
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;
1770 }
1771 else
1772 {
1773
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);
1774 81 const char * tmpstr= safedequote(words[0]);
1775
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);
1776
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)
1777 {
1778 33 namespace_list.reset();
1779 }
1780
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);
1781 }
1782 }
1783 else
1784 {
1785 throw_err_block(0, err_invalid_namespace_use);
1786 //leave = true;
1787 }
1788
1789
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)
1790 {
1791
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)
1792 {
1793 36 namespace_list.remove(namespace_list.count - 1);
1794 }
1795 else
1796 {
1797 12 namespace_list.reset();
1798 }
1799 }
1800
1801 // recompute ns
1802 165 ns = "";
1803
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++)
1804 {
1805 195 ns += namespace_list[i];
1806 195 ns += "_";
1807 }
1808 165 }
1809
1810 10171 void cmd_incsrc(const char* par) {
1811 // RPG Hacker: Should this also throw on absolute paths?
1812 // E.g., on something starting with C:/ or whatever.
1813
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, '\\'))
1814 {
1815
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);
1816 }
1817
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;
1818
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());
1819
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);
1820 10255 }
1821
1822 60 void cmd_incbin(const char* par) {
1823 60 int addrToLinePos = realsnespos & 0xFFFFFF;
1824 30 int len;
1825 60 int start=0;
1826 60 int end=0;
1827
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;
1828 60 const char* lengths = strqchr(temp, ':');
1829
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)
1830 {
1831 30 lengths++;
1832
1833
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, "..");
1834
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);
1835
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);
1836
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);
1837
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();
1838
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);
1839
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);
1840
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();
1841 // make temp just the filename without the lengths
1842
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());
1843 24 }
1844
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();
1845 // RPG Hacker: Should this also throw on absolute paths?
1846 // E.g., on something starting with C:/ or whatever.
1847
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, '\\'))
1848 {
1849
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);
1850 }
1851
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());
1852
1853 24 char * data;//I couldn't find a way to get this into an autoptr
1854
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);
1855 36 autoptr<char*> datacopy=data;
1856
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;
1857
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);
1858
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);
1859
1860
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]);
1861
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);
1862 78 }
1863
1864 template<bool is_fill>
1865 684 void cmd_skip_fill(char** words, int num_words) {
1866 684 const char* cmdname = is_fill ? "fill" : "skip";
1867
5/12
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✓ Branch 2 → 3 taken 6 times.
✓ Branch 2 → 8 taken 612 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.
684 if(num_words != 1 && num_words != 2 && num_words != 4) throw_err_block(0, err_broken_command, cmdname, "");
1868
9/24
void (anonymous namespace)::cmd_skip_fill<false>(char**, int):
✓ Branch 8 → 9 taken 6 times.
✓ Branch 8 → 12 taken 306 times.
✗ Branch 8 → 13 not taken.
✓ Branch 8 → 16 taken 306 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 309 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.
684 if(num_words > 1 && stricmp(words[0], "align")) throw_err_block(0, err_broken_command, cmdname, "expected \"align\"");
1869
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 306 times.
✓ Branch 17 → 18 taken 3 times.
✓ Branch 17 → 21 taken 306 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 309 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.
684 if(num_words == 4 && stricmp(words[2], "offset")) throw_err_block(0, err_broken_command, cmdname, "expected \"offset\"");
1870 int amount;
1871
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 306 times.
✓ Branch 26 → 27 taken 3 times.
✓ Branch 26 → 54 taken 306 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.
684 if(num_words > 1)
1872 {
1873
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();
1874 6 int offset = 0;
1875
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)
1876 {
1877
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();
1878 }
1879
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);
1880
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);
1881
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);
1882 // i just guessed this formula but it seems to work
1883 6 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
1884 // TODO: set current freespace align to at least alignment
1885 }
1886 else
1887 {
1888
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 306 times.
✗ Branch 54 → 79 not taken.
✓ Branch 56 → 57 taken 306 times.
✗ Branch 56 → 77 not taken.
✓ Branch 57 → 58 taken 306 times.
✗ Branch 57 → 75 not taken.
✓ Branch 71 → 72 taken 306 times.
✗ Branch 71 → 103 not taken.
✓ Branch 74 → 75 taken 306 times.
✗ Branch 74 → 101 not taken.
✓ Branch 76 → 77 taken 306 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.
678 amount = parse_math_expr(words[0])->evaluate_non_forward().get_integer();
1889 }
1890 618 if(!is_fill) step(amount);
1891 else
1892 {
1893 66 add_addr_to_line(realsnespos & 0xFFFFFF);
1894
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]);
1895 }
1896 684 }
1897
1898 6 void cmd_cleartable(const char* par) {
1899
2/4
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 3 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 3 times.
6 if(*par) throw_err_block(0, err_broken_command, "cleartable", "");
1900 6 cleartable();
1901 6 }
1902
1903 6 void cmd_pushtable(const char* par) {
1904
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", "");
1905 6 tablestack.append(thetable);
1906 6 }
1907
1908 6 void cmd_pulltable(const char* par) {
1909
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", "");
1910
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);
1911 6 thetable=tablestack[tablestack.count-1];
1912 6 tablestack.remove(tablestack.count-1);
1913 6 }
1914
1915 66 void cmd_function(const char* par) {
1916
2/4
✓ Branch 2 → 3 taken 33 times.
✗ Branch 2 → 37 not taken.
✓ Branch 3 → 4 taken 33 times.
✗ Branch 3 → 50 not taken.
66 string parbuf = par;
1917
2/4
✓ Branch 3 → 4 taken 33 times.
✗ Branch 3 → 35 not taken.
✓ Branch 4 → 5 taken 33 times.
✗ Branch 4 → 48 not taken.
66 parbuf.qnormalize(); // todo what's the point of doing this here in particular???
1918 66 char* name_and_args = parbuf.raw();
1919
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 33 times.
66 char* fn_body = strchr(name_and_args, '=');
1920
2/8
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 9 taken 33 times.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 35 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 12 taken 33 times.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 48 not taken.
66 if(!fn_body) throw_err_block(0, err_broken_function_declaration);
1921 66 *fn_body = 0;
1922 66 fn_body++;
1923
4/12
✓ Branch 9 → 10 taken 33 times.
✗ Branch 9 → 35 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 14 taken 33 times.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 35 not taken.
✓ Branch 14 → 15 taken 33 times.
✗ Branch 14 → 48 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 33 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 48 not taken.
66 if(!confirmqpar(name_and_args)) throw_err_block(0, err_broken_function_declaration);
1924 66 char* startpar = strqchr(name_and_args, '(');
1925
2/8
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 19 taken 33 times.
✗ Branch 16 → 17 not taken.
✗ Branch 16 → 35 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 33 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 48 not taken.
66 if (!startpar) throw_err_block(0, err_broken_function_declaration);
1926 66 *startpar = 0;
1927 66 startpar++;
1928
3/10
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 24 taken 33 times.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 35 not taken.
✓ Branch 26 → 27 taken 33 times.
✗ Branch 26 → 48 not taken.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 31 taken 33 times.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 48 not taken.
66 if(!confirmname(name_and_args)) throw_err_block(0, err_invalid_function_name);
1929 66 char* endpar = strqchr(startpar, ')');
1930 66 *endpar = 0;
1931 66 endpar++;
1932 // it's legal for there to be spaces between ) and =
1933
4/4
✓ Branch 27 → 26 taken 33 times.
✓ Branch 27 → 28 taken 33 times.
✓ Branch 38 → 35 taken 33 times.
✓ Branch 38 → 39 taken 33 times.
132 while(*endpar == ' ') endpar++;
1934
2/8
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 32 taken 33 times.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 35 not taken.
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 44 taken 33 times.
✗ Branch 41 → 42 not taken.
✗ Branch 41 → 48 not taken.
66 if(*endpar) throw_err_block(0, err_broken_function_declaration);
1935
1936
2/4
✓ Branch 32 → 33 taken 33 times.
✗ Branch 32 → 35 not taken.
✓ Branch 44 → 45 taken 33 times.
✗ Branch 44 → 48 not taken.
66 createuserfunc(name_and_args, startpar, fn_body);
1937 99 }
1938
1939 324 void cmd_print(const char* par) {
1940
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);
1941
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);
1942 477 }
1943
1944 6 void cmd_reset(const char* par) {
1945 if(0);
1946
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;
1947 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
1948 else throw_err_block(2, err_unknown_variable);
1949 6 }
1950
1951 template<int width, bool is_fill>
1952 54 void cmd_padbytes(const char* par) {
1953
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();
1954
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)
1955 {
1956 510 unsigned int tmpval=val;
1957
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++)
1958 {
1959 648 (is_fill ? fillbyte : padbyte)[i+j] = (unsigned char)tmpval;
1960 648 tmpval>>=8;
1961 }
1962 }
1963 54 }
1964
1965 12 void cmd_pad(const char* par) {
1966
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);
1967
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();
1968
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());
1969
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)
1970 {
1971 12 int end=snestopc(num);
1972 12 int start=snestopc(realsnespos);
1973 12 int len=end-start;
1974 12 add_addr_to_line(realsnespos & 0xFFFFFF);
1975
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]);
1976 }
1977 12 }
1978
1979 90 void cmd_arch(const char* par) {
1980
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);
1981
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; }
1982
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; }
1983
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; }
1984 throw_err_block(0, err_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
1985 }
1986
1987 72 void cmd_braces(const char* par) {
1988
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, "{ / }", "");
1989 72 }
1990
1991 template<void (*F)(const char*)>
1992 265 void wrap_mapper(const char* par) {
1993
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);
1994
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;
1995 F(par);
1996
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){
1997 175 mapper_set = true;
1998
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){
1999 78 throw_warning(1, warn_mapper_already_set);
2000 }
2001 265 }
2002
2003 template<mapper_t the_mapper>
2004 193 void mapper_simple(const char* par) {
2005
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);
2006 193 mapper = the_mapper;
2007 193 }
2008
2009 45 void mapper_norom(const char* par) {
2010
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);
2011 //$000000 would be the best snespos for this, but I don't care
2012 45 mapper = norom;
2013
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)
2014 6 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2015 45 }
2016
2017 27 void mapper_sa1rom(const char* par) {
2018
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) {
2019 // todo why doesn't this allow math?
2020
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]!=',' ||
2021
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]!=',' ||
2022
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]!=',' ||
2023
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);
2024 /*
2025 // this part is just useless ???
2026 int len;
2027 string parbuf = par;
2028 autoptr<char**> pars=qpsplit(parbuf.raw(), ',', &len);
2029 verify_paren(pars);
2030 if (len!=4) throw_err_block(0, err_invalid_mapper); */
2031
1/2
✗ Branch 40 → 41 not taken.
✓ Branch 40 → 43 taken 12 times.
21 sa1banks[0]=(par[0]-'0')<<20;
2032
1/2
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 54 taken 12 times.
21 sa1banks[1]=(par[2]-'0')<<20;
2033
1/2
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 67 taken 12 times.
21 sa1banks[4]=(par[4]-'0')<<20;
2034
1/2
✗ Branch 76 → 77 not taken.
✓ Branch 76 → 80 taken 12 times.
21 sa1banks[5]=(par[6]-'0')<<20;
2035 }
2036 else
2037 {
2038 6 sa1banks[0]=0<<20;
2039 6 sa1banks[1]=1<<20;
2040 6 sa1banks[4]=2<<20;
2041 6 sa1banks[5]=3<<20;
2042 }
2043 27 mapper=sa1rom;
2044 27 }
2045
2046 using command_fn_t = void(*)(const char*);
2047
2048 template<void (*F)(char**, int)>
2049 1441 void wrap_split(const char* par) {
2050
22/44
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 2 → 3 taken 60 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 60 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 60 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 60 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 309 times.
✗ Branch 2 → 22 not taken.
✓ Branch 3 → 4 taken 309 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.
1441 string temp(par);
2051 722 int num_words;
2052
22/44
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 4 → 5 taken 60 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 60 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 60 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 60 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 309 times.
✗ Branch 4 → 20 not taken.
✓ Branch 7 → 8 taken 309 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.
1441 autoptr<char**> word = qsplit(temp.raw(), ' ', &num_words);
2053
76/132
void (anonymous namespace)::wrap_split<&(anonymous namespace)::cmd_struct>(char const*):
✓ Branch 6 → 7 taken 18 times.
✓ Branch 6 → 10 taken 42 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 18 times.
✓ Branch 9 → 10 taken 18 times.
✓ Branch 9 → 15 taken 42 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 60 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 18 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 60 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 57 times.
✓ Branch 6 → 10 taken 3 times.
✓ Branch 8 → 9 taken 57 times.
✗ Branch 8 → 10 not taken.
✓ Branch 9 → 10 taken 57 times.
✓ Branch 9 → 15 taken 3 times.
✓ Branch 11 → 12 taken 57 times.
✓ Branch 11 → 13 taken 3 times.
✓ Branch 13 → 14 taken 57 times.
✗ Branch 13 → 15 not taken.
✓ Branch 16 → 17 taken 57 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 306 times.
✓ Branch 6 → 10 taken 3 times.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 306 times.
✓ Branch 9 → 10 taken 306 times.
✓ Branch 9 → 15 taken 3 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 309 times.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 306 times.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 309 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.
1441 if(num_words == 1 && word[0][0] == 0) num_words--;
2054 F(word, num_words);
2055 2168 }
2056
2057 }
2058
2059
13/18
✓ Branch 14 → 15 taken 714 times.
✓ Branch 14 → 18 taken 5 times.
✓ Branch 15 → 16 taken 450 times.
✗ Branch 15 → 49 not taken.
✓ Branch 19 → 20 taken 717 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.
9896 static constexpr auto normal_commands = frozen::make_unordered_map<frozen::string, command_fn_t>({
2060 { "db", cmd_write_data<write1> },
2061 { "dw", cmd_write_data<write2> },
2062 { "dl", cmd_write_data<write3> },
2063 { "dd", cmd_write_data<write4> },
2064 { "assert", cmd_assert },
2065 { "undef", cmd_undef },
2066 { "error", cmd_error },
2067 { "warn", cmd_warn },
2068 { "warnings", wrap_split<cmd_warnings> },
2069 { "global", cmd_global },
2070 { "check", wrap_split<cmd_check> },
2071 { "asar", cmd_asar },
2072 { "include", cmd_include },
2073 { "includefrom", cmd_includefrom },
2074 { "includeonce", cmd_includeonce },
2075 { "org", cmd_org },
2076 { "struct", wrap_split<cmd_struct> },
2077 { "endstruct", wrap_split<cmd_endstruct> },
2078 { "spcblock", wrap_split<cmd_spcblock> },
2079 { "endspcblock", wrap_split<cmd_endspcblock> },
2080 { "base", cmd_base },
2081 { "dpbase", cmd_dpbase },
2082 { "optimize", wrap_split<cmd_optimize> },
2083 { "bank", cmd_bank },
2084 { "freespace", cmd_freespace<freespace_cmds::freespace> },
2085 { "freecode", cmd_freespace<freespace_cmds::freecode> },
2086 { "freedata", cmd_freespace<freespace_cmds::freedata> },
2087 { "segment", cmd_freespace<freespace_cmds::segment> },
2088 { "freespace_settings", cmd_freespace_settings },
2089 { "prot", cmd_prot },
2090 { "autoclean", wrap_split<cmd_autoclean> },
2091 { "freespacebyte", cmd_freespacebyte },
2092 { "pushpc", cmd_pushpc },
2093 { "pullpc", cmd_pullpc },
2094 { "pushbase", cmd_pushbase },
2095 { "pullbase", cmd_pullbase },
2096 { "pushns", cmd_pushns },
2097 { "pullns", cmd_pullns },
2098 { "namespace", wrap_split<cmd_namespace> },
2099 { "incsrc", cmd_incsrc },
2100 { "incbin", cmd_incbin },
2101 { "skip", wrap_split<cmd_skip_fill<false>> },
2102 { "fill", wrap_split<cmd_skip_fill<true>> },
2103 { "cleartable", cmd_cleartable },
2104 { "pushtable", cmd_pushtable },
2105 { "pulltable", cmd_pulltable },
2106 { "function", cmd_function },
2107 { "print", cmd_print },
2108 { "reset", cmd_reset },
2109 { "padbyte", cmd_padbytes<1, false> },
2110 { "padword", cmd_padbytes<2, false> },
2111 { "padlong", cmd_padbytes<3, false> },
2112 { "paddword", cmd_padbytes<4, false> },
2113 { "fillbyte", cmd_padbytes<1, true> },
2114 { "fillword", cmd_padbytes<2, true> },
2115 { "filllong", cmd_padbytes<3, true> },
2116 { "filldword", cmd_padbytes<4, true> },
2117 { "pad", cmd_pad },
2118 { "arch", cmd_arch },
2119 { "{", cmd_braces },
2120 { "}", cmd_braces },
2121
2122 { "lorom", wrap_mapper<mapper_simple<lorom>> },
2123 { "hirom", wrap_mapper<mapper_simple<hirom>> },
2124 { "exlorom", wrap_mapper<mapper_simple<exlorom>> },
2125 { "exhirom", wrap_mapper<mapper_simple<exhirom>> },
2126 { "sfxrom", wrap_mapper<mapper_simple<sfxrom>> },
2127 { "norom", wrap_mapper<mapper_norom> },
2128 { "sa1rom", wrap_mapper<mapper_sa1rom> },
2129 { "fullsa1rom", wrap_mapper<mapper_simple<bigsa1rom>> },
2130 });
2131
2132 namespace control_flow {
2133
2134 enum cf_cmds {
2135 c_if,
2136 c_elseif,
2137 c_while,
2138 c_for,
2139 };
2140
2141 // todo possibly this would be cleaner if `for` was refactored out entirely?
2142 template<cf_cmds type>
2143 3138 void cf_start(const char* par, int& single_line_for_tracker) {
2144 3138 const char* typ_name =
2145 type == c_if ? "if" :
2146 type == c_elseif ? "elseif" :
2147 type == c_while ? "while" : "for";
2148 3138 whiletracker wstatus;
2149 3138 wstatus.startline = cur_logical_lineno;
2150 3138 wstatus.iswhile = type == c_while;
2151 3138 wstatus.cond = false;
2152 3138 wstatus.is_for = false;
2153 3138 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
2154 3138 wstatus.for_has_var_backup = false;
2155 348 if(type == c_for) wstatus.is_for = true;
2156
2157 3138 bool is_for_cont = false;
2158 // if this is a for loop and a whilestatus entry already exists at this level,
2159 // and the for loop isn't finished, this is a continuation of the for loop
2160 348 if ((type == c_for)
2161
6/9
✓ Branch 4 → 5 taken 174 times.
✗ Branch 4 → 116 not taken.
✓ Branch 5 → 6 taken 340 times.
✓ Branch 5 → 10 taken 8 times.
✗ Branch 5 → 207 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 174 times.
✓ Branch 9 → 10 taken 166 times.
✓ Branch 9 → 18 taken 8 times.
348 && whilestatus.count > numif && whilestatus[numif].is_for
2162
14/20
✓ Branch 3 → 4 taken 174 times.
✗ Branch 3 → 10 not taken.
✓ Branch 4 → 5 taken 174 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 166 times.
✗ Branch 6 → 116 not taken.
✓ Branch 7 → 8 taken 166 times.
✗ Branch 7 → 116 not taken.
✓ Branch 8 → 9 taken 123 times.
✓ Branch 8 → 10 taken 43 times.
✓ Branch 10 → 11 taken 166 times.
✗ Branch 10 → 207 not taken.
✓ Branch 11 → 12 taken 123 times.
✓ Branch 11 → 13 taken 51 times.
✓ Branch 13 → 14 taken 166 times.
✗ Branch 13 → 207 not taken.
✓ Branch 16 → 17 taken 123 times.
✓ Branch 16 → 18 taken 43 times.
✓ Branch 19 → 20 taken 123 times.
✓ Branch 19 → 21 taken 51 times.
696 && whilestatus[numif].for_cur < whilestatus[numif].for_end) {
2163 246 is_for_cont = true;
2164 }
2165
25/58
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 8 taken 267 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 267 times.
✗ Branch 6 → 44 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 59 not taken.
✓ Branch 8 → 9 taken 267 times.
✗ Branch 8 → 44 not taken.
✓ Branch 9 → 10 taken 534 times.
✗ Branch 9 → 44 not taken.
✗ Branch 9 → 59 not taken.
✓ Branch 11 → 12 taken 267 times.
✗ Branch 11 → 59 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 8 taken 165 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 165 times.
✗ Branch 6 → 57 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 75 not taken.
✓ Branch 8 → 9 taken 165 times.
✗ Branch 8 → 57 not taken.
✓ Branch 9 → 10 taken 330 times.
✗ Branch 9 → 57 not taken.
✗ Branch 9 → 75 not taken.
✓ Branch 11 → 12 taken 165 times.
✗ Branch 11 → 75 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 8 taken 963 times.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 9 taken 963 times.
✗ Branch 6 → 44 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 59 not taken.
✓ Branch 8 → 9 taken 963 times.
✗ Branch 8 → 44 not taken.
✓ Branch 9 → 10 taken 1926 times.
✗ Branch 9 → 44 not taken.
✗ Branch 9 → 59 not taken.
✓ Branch 11 → 12 taken 963 times.
✗ Branch 11 → 59 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 13 → 14 taken 123 times.
✓ Branch 13 → 16 taken 51 times.
✓ Branch 14 → 15 taken 123 times.
✗ Branch 14 → 116 not taken.
✓ Branch 16 → 17 taken 51 times.
✗ Branch 16 → 116 not taken.
✓ Branch 17 → 18 taken 51 times.
✗ Branch 17 → 116 not taken.
✓ Branch 21 → 22 taken 123 times.
✓ Branch 21 → 24 taken 51 times.
✓ Branch 22 → 23 taken 123 times.
✗ Branch 22 → 207 not taken.
✓ Branch 24 → 25 taken 51 times.
✗ Branch 24 → 207 not taken.
✓ Branch 26 → 27 taken 51 times.
✗ Branch 26 → 207 not taken.
3138 whiletracker& addedwstatus = is_for_cont ? whilestatus[numif] : (whilestatus[numif] = wstatus);
2166 //handle nested if statements
2167
20/20
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 11 → 12 taken 24 times.
✓ Branch 11 → 13 taken 243 times.
✓ Branch 13 → 14 taken 24 times.
✓ Branch 13 → 15 taken 243 times.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 11 → 12 taken 111 times.
✓ Branch 11 → 14 taken 54 times.
✓ Branch 12 → 13 taken 24 times.
✓ Branch 12 → 14 taken 87 times.
✓ Branch 13 → 14 taken 111 times.
✓ Branch 13 → 16 taken 54 times.
✓ Branch 14 → 15 taken 24 times.
✓ Branch 14 → 16 taken 87 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 11 → 12 taken 24 times.
✓ Branch 11 → 13 taken 939 times.
✓ Branch 13 → 14 taken 24 times.
✓ Branch 13 → 15 taken 939 times.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 19 → 20 taken 9 times.
✓ Branch 19 → 21 taken 165 times.
✓ Branch 28 → 29 taken 9 times.
✓ Branch 28 → 30 taken 165 times.
3138 if (numtrue!=numif && !(type == c_elseif && numtrue+1==numif))
2168 {
2169 114 if (type != c_elseif) numif++;
2170 162 return;
2171 }
2172 2694 if (type != c_elseif) numif++;
2173
2174 bool cond;
2175 if(type != c_for)
2176 {
2177
6/24
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 243 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 44 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 243 times.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 59 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 18 taken 141 times.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 57 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 21 taken 141 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 75 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 17 taken 939 times.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 44 not taken.
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 20 taken 939 times.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 59 not taken.
2646 if(!*par) throw_err_block(0, err_broken_command, typ_name, "Missing condition.");
2178
20/36
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 17 → 18 taken 243 times.
✗ Branch 17 → 42 not taken.
✓ Branch 19 → 20 taken 222 times.
✓ Branch 19 → 40 taken 21 times.
✓ Branch 20 → 21 taken 222 times.
✗ Branch 20 → 38 not taken.
✓ Branch 22 → 23 taken 243 times.
✗ Branch 22 → 55 not taken.
✓ Branch 25 → 26 taken 222 times.
✓ Branch 25 → 53 taken 21 times.
✓ Branch 27 → 28 taken 222 times.
✗ Branch 27 → 51 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 18 → 19 taken 141 times.
✗ Branch 18 → 55 not taken.
✓ Branch 20 → 21 taken 141 times.
✗ Branch 20 → 53 not taken.
✓ Branch 21 → 22 taken 141 times.
✗ Branch 21 → 51 not taken.
✓ Branch 23 → 24 taken 141 times.
✗ Branch 23 → 71 not taken.
✓ Branch 26 → 27 taken 141 times.
✗ Branch 26 → 69 not taken.
✓ Branch 28 → 29 taken 141 times.
✗ Branch 28 → 67 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 17 → 18 taken 939 times.
✗ Branch 17 → 42 not taken.
✓ Branch 19 → 20 taken 939 times.
✗ Branch 19 → 40 not taken.
✓ Branch 20 → 21 taken 939 times.
✗ Branch 20 → 38 not taken.
✓ Branch 22 → 23 taken 939 times.
✗ Branch 22 → 55 not taken.
✓ Branch 25 → 26 taken 939 times.
✗ Branch 25 → 53 not taken.
✓ Branch 27 → 28 taken 939 times.
✗ Branch 27 → 51 not taken.
2709 cond = parse_math_expr(par)->evaluate_static().get_bool();
2179 }
2180
2181 if (type == c_for)
2182 {
2183
2/8
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 26 taken 165 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 116 not taken.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 36 taken 165 times.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 207 not taken.
330 if(!*par) throw_err_block(0, err_broken_for_loop, "missing loop range");
2184
2/4
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 30 taken 165 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 41 taken 165 times.
330 if(single_line_for_tracker != 1)
2185 {
2186 numif--;
2187 throw_err_line(0, err_bad_single_line_for);
2188 }
2189
2190
4/4
✓ Branch 30 → 31 taken 42 times.
✓ Branch 30 → 73 taken 123 times.
✓ Branch 41 → 42 taken 42 times.
✓ Branch 41 → 118 taken 123 times.
330 if(!is_for_cont)
2191 {
2192
3/10
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 42 times.
✗ Branch 32 → 33 not taken.
✗ Branch 32 → 112 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 42 times.
✗ Branch 44 → 45 not taken.
✓ Branch 44 → 46 taken 42 times.
✗ Branch 45 → 46 not taken.
✗ Branch 45 → 199 not taken.
84 if(for_loop_expansion_warning) throw_warning(0, warn_for_loop_define);
2193
1/2
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 48 taken 42 times.
84 const char* past_eq = strchr(par, '=');
2194
2/4
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 37 taken 42 times.
✗ Branch 48 → 49 not taken.
✓ Branch 48 → 52 taken 42 times.
84 if(!past_eq)
2195 throw_err_block(0, err_broken_for_loop, "missing loop range");
2196
2197
2/4
✓ Branch 37 → 38 taken 42 times.
✗ Branch 37 → 112 not taken.
✓ Branch 53 → 54 taken 42 times.
✗ Branch 53 → 199 not taken.
84 string varname(par, past_eq - par);
2198 84 past_eq += 1;
2199
2/4
✓ Branch 38 → 39 taken 42 times.
✗ Branch 38 → 110 not taken.
✓ Branch 55 → 56 taken 42 times.
✗ Branch 55 → 197 not taken.
84 strip_whitespace(varname);
2200
4/8
✓ Branch 40 → 41 taken 42 times.
✗ Branch 40 → 110 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 42 times.
✓ Branch 57 → 58 taken 42 times.
✗ Branch 57 → 197 not taken.
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 62 taken 42 times.
84 if(!validatedefinename(varname))
2201 throw_err_block(0, err_broken_for_loop, "invalid define name");
2202
2203
2/4
✓ Branch 45 → 46 taken 42 times.
✗ Branch 45 → 110 not taken.
✓ Branch 62 → 63 taken 42 times.
✗ Branch 62 → 197 not taken.
84 const char* range_sep = strqpstr(past_eq, "..");
2204
2/4
✗ Branch 46 → 47 not taken.
✓ Branch 46 → 50 taken 42 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 67 taken 42 times.
84 if(!range_sep)
2205 throw_err_block(0, err_broken_for_loop, "invalid loop range");
2206
2207
2/4
✓ Branch 50 → 51 taken 42 times.
✗ Branch 50 → 110 not taken.
✓ Branch 68 → 69 taken 42 times.
✗ Branch 68 → 197 not taken.
84 string for_start(past_eq, range_sep - past_eq);
2208
2/4
✓ Branch 51 → 52 taken 42 times.
✗ Branch 51 → 108 not taken.
✓ Branch 69 → 70 taken 42 times.
✗ Branch 69 → 195 not taken.
84 strip_whitespace(for_start);
2209
2/4
✓ Branch 52 → 53 taken 42 times.
✗ Branch 52 → 108 not taken.
✓ Branch 72 → 73 taken 42 times.
✗ Branch 72 → 195 not taken.
84 string for_end(range_sep+2);
2210
2/4
✓ Branch 53 → 54 taken 42 times.
✗ Branch 53 → 106 not taken.
✓ Branch 73 → 74 taken 42 times.
✗ Branch 73 → 193 not taken.
84 strip_whitespace(for_end);
2211
2212
6/12
✓ Branch 55 → 56 taken 42 times.
✗ Branch 55 → 98 not taken.
✓ Branch 57 → 58 taken 42 times.
✗ Branch 57 → 96 not taken.
✓ Branch 58 → 59 taken 42 times.
✗ Branch 58 → 94 not taken.
✓ Branch 77 → 78 taken 42 times.
✗ Branch 77 → 181 not taken.
✓ Branch 80 → 81 taken 42 times.
✗ Branch 80 → 179 not taken.
✓ Branch 82 → 83 taken 42 times.
✗ Branch 82 → 177 not taken.
84 addedwstatus.for_start = parse_math_expr(for_start)->evaluate_static().get_integer();
2213
6/12
✓ Branch 62 → 63 taken 42 times.
✗ Branch 62 → 104 not taken.
✓ Branch 64 → 65 taken 42 times.
✗ Branch 64 → 102 not taken.
✓ Branch 65 → 66 taken 42 times.
✗ Branch 65 → 100 not taken.
✓ Branch 92 → 93 taken 42 times.
✗ Branch 92 → 189 not taken.
✓ Branch 95 → 96 taken 42 times.
✗ Branch 95 → 187 not taken.
✓ Branch 97 → 98 taken 42 times.
✗ Branch 97 → 185 not taken.
84 addedwstatus.for_end = parse_math_expr(for_end)->evaluate_static().get_integer();
2214
2215
2/4
✓ Branch 68 → 69 taken 42 times.
✗ Branch 68 → 106 not taken.
✓ Branch 107 → 108 taken 42 times.
✗ Branch 107 → 193 not taken.
84 addedwstatus.for_variable = varname;
2216 84 addedwstatus.for_cur = addedwstatus.for_start;
2217 84 }
2218 246 else addedwstatus.for_cur++;
2219
2220 330 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
2221 330 single_line_for_tracker = 2;
2222
5/6
✓ Branch 74 → 75 taken 123 times.
✓ Branch 74 → 87 taken 42 times.
✗ Branch 131 → 132 not taken.
✓ Branch 131 → 133 taken 165 times.
✓ Branch 133 → 134 taken 123 times.
✓ Branch 133 → 169 taken 42 times.
330 if(addedwstatus.cond)
2223 {
2224 246 numtrue++;
2225
6/8
✓ Branch 76 → 77 taken 123 times.
✗ Branch 76 → 116 not taken.
✓ Branch 77 → 78 taken 96 times.
✓ Branch 77 → 81 taken 27 times.
✓ Branch 139 → 140 taken 123 times.
✗ Branch 139 → 207 not taken.
✓ Branch 140 → 141 taken 96 times.
✓ Branch 140 → 154 taken 27 times.
246 if(defines.exists(addedwstatus.for_variable))
2226 {
2227 192 addedwstatus.for_has_var_backup = true;
2228
4/8
✓ Branch 79 → 80 taken 96 times.
✗ Branch 79 → 116 not taken.
✓ Branch 80 → 81 taken 96 times.
✗ Branch 80 → 116 not taken.
✓ Branch 148 → 149 taken 96 times.
✗ Branch 148 → 207 not taken.
✓ Branch 153 → 154 taken 96 times.
✗ Branch 153 → 207 not taken.
192 addedwstatus.for_var_backup = defines.find(addedwstatus.for_variable);
2229 }
2230
4/8
✓ Branch 81 → 82 taken 123 times.
✗ Branch 81 → 115 not taken.
✓ Branch 83 → 84 taken 123 times.
✗ Branch 83 → 113 not taken.
✓ Branch 157 → 158 taken 123 times.
✗ Branch 157 → 205 not taken.
✓ Branch 164 → 165 taken 123 times.
✗ Branch 164 → 203 not taken.
246 defines.create(addedwstatus.for_variable) = ftostr(addedwstatus.for_cur);
2231 }
2232 }
2233 else if (type == c_if || type == c_while)
2234 {
2235 if(0);
2236
8/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 24 → 25 taken 108 times.
✓ Branch 24 → 27 taken 114 times.
✓ Branch 32 → 33 taken 108 times.
✓ Branch 32 → 36 taken 114 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 24 → 25 taken 834 times.
✓ Branch 24 → 27 taken 105 times.
✓ Branch 32 → 33 taken 834 times.
✓ Branch 32 → 36 taken 105 times.
2322 else if (cond)
2237 {
2238 1884 numtrue++;
2239
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 25 → 26 taken 108 times.
✗ Branch 25 → 44 not taken.
✓ Branch 33 → 34 taken 108 times.
✗ Branch 33 → 59 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 25 → 26 taken 834 times.
✗ Branch 25 → 44 not taken.
✓ Branch 33 → 34 taken 834 times.
✗ Branch 33 → 59 not taken.
1884 elsestatus[numif]=true;
2240 }
2241
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 27 → 28 taken 114 times.
✗ Branch 27 → 30 not taken.
✓ Branch 36 → 37 taken 114 times.
✗ Branch 36 → 40 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 27 → 28 taken 105 times.
✗ Branch 27 → 30 not taken.
✓ Branch 36 → 37 taken 105 times.
✗ Branch 36 → 40 not taken.
438 else if (!cond)
2242 {
2243
4/8
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 28 → 29 taken 114 times.
✗ Branch 28 → 44 not taken.
✓ Branch 37 → 38 taken 114 times.
✗ Branch 37 → 59 not taken.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 28 → 29 taken 105 times.
✗ Branch 28 → 44 not taken.
✓ Branch 37 → 38 taken 105 times.
✗ Branch 37 → 59 not taken.
438 elsestatus[numif]=false;
2244 }
2245 2322 addedwstatus.cond = cond;
2246 }
2247 else if (type == c_elseif)
2248 {
2249
2/8
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 29 taken 141 times.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 57 not taken.
✗ Branch 33 → 34 not taken.
✓ Branch 33 → 37 taken 141 times.
✗ Branch 34 → 35 not taken.
✗ Branch 34 → 75 not taken.
282 if (!numif) throw_err_block(1, err_misplaced_elseif);
2250
5/14
✓ Branch 29 → 30 taken 141 times.
✗ Branch 29 → 57 not taken.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 141 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 57 not taken.
✓ Branch 37 → 38 taken 141 times.
✗ Branch 37 → 75 not taken.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 141 times.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 45 taken 141 times.
✗ Branch 42 → 43 not taken.
✗ Branch 42 → 75 not taken.
282 if (whilestatus[numif - 1].iswhile) throw_err_block(1, err_elseif_in_while);
2251
4/4
✓ Branch 34 → 35 taken 54 times.
✓ Branch 34 → 36 taken 87 times.
✓ Branch 45 → 46 taken 54 times.
✓ Branch 45 → 47 taken 87 times.
282 if (numif==numtrue) numtrue--;
2252
15/18
✓ Branch 36 → 37 taken 54 times.
✓ Branch 36 → 40 taken 87 times.
✓ Branch 37 → 38 taken 54 times.
✗ Branch 37 → 57 not taken.
✓ Branch 38 → 39 taken 39 times.
✓ Branch 38 → 40 taken 15 times.
✓ Branch 41 → 42 taken 39 times.
✓ Branch 41 → 44 taken 102 times.
✓ Branch 47 → 48 taken 54 times.
✓ Branch 47 → 54 taken 87 times.
✓ Branch 48 → 49 taken 54 times.
✗ Branch 48 → 75 not taken.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 54 times.
✓ Branch 52 → 53 taken 39 times.
✓ Branch 52 → 54 taken 15 times.
✓ Branch 55 → 56 taken 39 times.
✓ Branch 55 → 59 taken 102 times.
282 if (cond && !elsestatus[numif])
2253 {
2254 78 numtrue++;
2255
2/4
✓ Branch 42 → 43 taken 39 times.
✗ Branch 42 → 57 not taken.
✓ Branch 56 → 57 taken 39 times.
✗ Branch 56 → 75 not taken.
78 elsestatus[numif]=true;
2256 }
2257 }
2258
16/16
void control_flow::cf_start<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 33 → 34 taken 222 times.
✓ Branch 33 → 36 taken 24 times.
✓ Branch 45 → 46 taken 222 times.
✓ Branch 45 → 47 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)1>(char const*, int&):
✓ Branch 46 → 47 taken 141 times.
✓ Branch 46 → 49 taken 24 times.
✓ Branch 61 → 62 taken 141 times.
✓ Branch 61 → 63 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)2>(char const*, int&):
✓ Branch 33 → 34 taken 939 times.
✓ Branch 33 → 36 taken 24 times.
✓ Branch 45 → 46 taken 939 times.
✓ Branch 45 → 47 taken 24 times.
void control_flow::cf_start<(control_flow::cf_cmds)3>(char const*, int&):
✓ Branch 89 → 90 taken 165 times.
✓ Branch 89 → 92 taken 9 times.
✓ Branch 171 → 172 taken 165 times.
✓ Branch 171 → 173 taken 9 times.
3138 }
2259
2260 template<cf_cmds type>
2261 2808 void cf_end(const char* par, int& single_line_for_tracker) {
2262
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 267 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 7 taken 267 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.
2808 if(*par) throw_err_block(0, err_broken_command, "end<...>", "");
2263
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 10 taken 267 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 11 taken 267 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.
2808 if (!numif)
2264 throw_err_block(1, err_misplaced_endif);
2265 2808 whiletracker& thisws = whilestatus[numif - 1];
2266
2267
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.
2808 if((!thisws.is_for && !thisws.iswhile && type != c_if) ||
2268
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✓ Branch 11 → 12 taken 267 times.
✗ Branch 11 → 13 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 267 times.
✓ Branch 15 → 16 taken 267 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.
2808 (thisws.iswhile && type != c_while) ||
2269
6/12
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 16 taken 267 times.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 19 taken 267 times.
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 23 taken 267 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.
2460 (thisws.is_for && type != c_for))
2270 throw_err_block(1, err_misplaced_endif);
2271
2272
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 180 times.
✓ Branch 23 → 24 taken 87 times.
✓ Branch 23 → 25 taken 180 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.
2808 if (numif==numtrue) numtrue--;
2273 2808 numif--;
2274
2275
9/18
void control_flow::cf_end<(control_flow::cf_cmds)0>(char const*, int&):
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 32 taken 267 times.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 28 taken 267 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 70 taken 267 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.
2808 if(thisws.is_for)
2276 {
2277
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;
2278
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)
2279 {
2280 // sabotage the whilestatus to prevent the loop running again
2281 // and spamming more of the same error
2282 thisws.for_cur = thisws.for_end;
2283 thisws.cond = false;
2284 throw_err_block(0, err_bad_single_line_for);
2285 }
2286
2287
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)
2288 {
2289
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)
2290 192 defines.create(thisws.for_variable) = thisws.for_var_backup;
2291 else
2292 54 defines.remove(thisws.for_variable);
2293 }
2294 }
2295 2808 }
2296
2297 234 void cf_else(const char* par, int& single_line_for_tracker) {
2298
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", "");
2299
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);
2300
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);
2301
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--;
2302
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])
2303 {
2304 60 numtrue++;
2305 60 elsestatus[numif]=true;
2306 }
2307 234 }
2308
2309 }
2310
2311 static constexpr auto control_flow_commands = frozen::make_unordered_map<frozen::string, void(*)(const char*, int&)>({
2312 { "if", control_flow::cf_start<control_flow::c_if> },
2313 { "elseif", control_flow::cf_start<control_flow::c_elseif> },
2314 { "while", control_flow::cf_start<control_flow::c_while> },
2315 { "for", control_flow::cf_start<control_flow::c_for> },
2316 { "endif", control_flow::cf_end<control_flow::c_if> },
2317 { "endwhile", control_flow::cf_end<control_flow::c_while> },
2318 { "endfor", control_flow::cf_end<control_flow::c_for> },
2319 { "else", control_flow::cf_else },
2320 });
2321
2322 561 static void cmd_label_assign(const char* firstword, const char* params) {
2323
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]) {
2324 201 int codepoint;
2325 402 const char* char_start = firstword + 1;
2326
2/4
✓ Branch 4 → 5 taken 201 times.
✗ Branch 4 → 81 not taken.
✓ Branch 9 → 10 taken 201 times.
✗ Branch 9 → 138 not taken.
402 const char* after = char_start + utf8_val(&codepoint, char_start);
2327
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)
2328 throw_err_block(0, err_invalid_utf8);
2329
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') {
2330
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 → 134 taken 3 times.
✓ Branch 26 → 27 taken 198 times.
✗ Branch 26 → 132 not taken.
✓ Branch 28 → 29 taken 198 times.
✗ Branch 28 → 130 not taken.
✓ Branch 29 → 30 taken 198 times.
✗ Branch 29 → 130 not taken.
405 thetable.set_val(codepoint, parse_math_expr(params + 2)->evaluate_static().get_integer());
2331 396 return;
2332 } else {
2333 throw_err_block(0, err_invalid_character);
2334 }
2335 }
2336 159 const char* newlabelname = firstword;
2337 159 bool ismacro = false;
2338
2339
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] == '?') {
2340 6 ismacro = true;
2341 6 newlabelname++;
2342 }
2343
2344
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) {
2345 throw_err_block(0, err_macro_label_outside_of_macro);
2346 }
2347
2348
3/6
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 34 taken 78 times.
✓ Branch 48 → 49 taken 81 times.
✗ Branch 48 → 174 not taken.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 53 taken 81 times.
159 if (!confirmname(newlabelname))
2349 throw_err_block(0, err_invalid_label_name);
2350
2351 159 string completename;
2352
2353
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) {
2354
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 → 150 not taken.
✓ Branch 63 → 64 taken 3 times.
✗ Branch 63 → 146 not taken.
✓ Branch 64 → 65 taken 3 times.
✗ Branch 64 → 144 not taken.
✓ Branch 65 → 66 taken 3 times.
✗ Branch 65 → 142 not taken.
✓ Branch 67 → 68 taken 3 times.
✗ Branch 67 → 140 not taken.
6 completename += STR ":macro_" + dec(calledmacros) + "_";
2355 }
2356
2357
2/4
✓ Branch 47 → 48 taken 78 times.
✗ Branch 47 → 106 not taken.
✓ Branch 76 → 77 taken 81 times.
✗ Branch 76 → 172 not taken.
159 completename += newlabelname;
2358
2359
2/4
✓ Branch 48 → 49 taken 78 times.
✗ Branch 48 → 106 not taken.
✓ Branch 79 → 80 taken 81 times.
✗ Branch 79 → 172 not taken.
159 auto expr = parse_math_expr(params + 2);
2360
2/4
✓ Branch 50 → 51 taken 78 times.
✗ Branch 50 → 94 not taken.
✓ Branch 89 → 90 taken 81 times.
✗ Branch 89 → 156 not taken.
159 bool is_static = expr->has_label() <= 1;
2361 159 int fs_id = -1;
2362 int64_t num;
2363 159 snes_label base; int64_t offset;
2364
6/8
✓ Branch 53 → 54 taken 78 times.
✗ Branch 53 → 104 not taken.
✓ Branch 54 → 55 taken 12 times.
✓ Branch 54 → 56 taken 66 times.
✓ Branch 98 → 99 taken 81 times.
✗ Branch 98 → 170 not taken.
✓ Branch 99 → 100 taken 12 times.
✓ Branch 99 → 101 taken 69 times.
159 if (expr->is_label_offset(base, offset)) {
2365 24 num = base.pos + offset;
2366 24 fs_id = base.freespace_id;
2367 } else {
2368
4/8
✓ Branch 57 → 58 taken 66 times.
✗ Branch 57 → 97 not taken.
✓ Branch 58 → 59 taken 66 times.
✗ Branch 58 → 95 not taken.
✓ Branch 103 → 104 taken 69 times.
✗ Branch 103 → 160 not taken.
✓ Branch 105 → 106 taken 69 times.
✗ Branch 105 → 158 not taken.
135 num = expr->evaluate_non_forward().get_integer();
2369 }
2370
2371
2/12
✗ Branch 61 → 62 not taken.
✓ Branch 61 → 67 taken 78 times.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 100 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 98 not taken.
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 116 taken 81 times.
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 164 not taken.
✗ Branch 113 → 114 not taken.
✗ Branch 113 → 162 not taken.
159 if (num&~0xFFFFFF) throw_err_block(1, err_snes_address_out_of_bounds, hex(num, 6).data());
2372
2373
4/8
✓ Branch 68 → 69 taken 78 times.
✗ Branch 68 → 103 not taken.
✓ Branch 69 → 70 taken 78 times.
✗ Branch 69 → 101 not taken.
✓ Branch 118 → 119 taken 81 times.
✗ Branch 118 → 168 not taken.
✓ Branch 119 → 120 taken 81 times.
✗ Branch 119 → 166 not taken.
159 setlabel(ns + completename, num, is_static, fs_id);
2374 159 }
2375
2376 // single_line_for_tracker is:
2377 // 0 if not in first block of line, not in (single-line) for loop
2378 // 1 if first block of line
2379 // 2 if in single-line for loop
2380 // 3 if after endfor (of a single-line loop)
2381 43610 void assembleblock(const char *block, int &single_line_for_tracker) {
2382 // don't do this here; assembleline already did it for us
2383 // callstack_push cs_push(callstack_entry_type::BLOCK, block);
2384
4/4
✓ Branch 2 → 3 taken 1314 times.
✓ Branch 2 → 4 taken 20356 times.
✓ Branch 3 → 4 taken 1326 times.
✓ Branch 3 → 5 taken 20614 times.
43610 if (!*block) return;
2385
2386 // assumption: if the first word of a line contains quotes/spaces, it's going
2387 // to be invalid anyways. well, except for character assignment......
2388 40970 string firstword;
2389 40970 const char *params = block;
2390
2/4
✓ Branch 5 → 6 taken 20356 times.
✗ Branch 5 → 83 not taken.
✓ Branch 8 → 9 taken 20614 times.
✗ Branch 8 → 116 not taken.
40970 grab_until_space(firstword, params);
2391
2392 // when writing out the data for the addrToLine mapping,
2393 // we want to write out the snespos we had before writing opcodes
2394 40970 int addrToLinePos = realsnespos & 0xFFFFFF;
2395
2396
2/4
✓ Branch 6 → 7 taken 20356 times.
✗ Branch 6 → 83 not taken.
✓ Branch 10 → 11 taken 20614 times.
✗ Branch 10 → 116 not taken.
40970 string firstword_lower = firstword;
2397 40970 lower(firstword_lower);
2398
2399
6/8
✓ Branch 11 → 12 taken 20356 times.
✗ Branch 11 → 78 not taken.
✓ Branch 13 → 14 taken 3090 times.
✓ Branch 13 → 16 taken 17266 times.
✓ Branch 17 → 18 taken 20614 times.
✗ Branch 17 → 107 not taken.
✓ Branch 20 → 21 taken 3090 times.
✓ Branch 20 → 25 taken 17524 times.
40970 if (auto it = control_flow_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())); it != control_flow_commands.end()) {
2400
4/4
✓ Branch 14 → 15 taken 3069 times.
✓ Branch 14 → 81 taken 21 times.
✓ Branch 23 → 24 taken 3069 times.
✓ Branch 23 → 114 taken 21 times.
6180 return it->second(params, single_line_for_tracker);
2401
4/4
✓ Branch 16 → 17 taken 888 times.
✓ Branch 16 → 18 taken 16378 times.
✓ Branch 25 → 26 taken 888 times.
✓ Branch 25 → 27 taken 16636 times.
34790 } else if (numif != numtrue) {
2402 1776 return;
2403 }
2404
2405 33014 bool addlabeled = false;
2406 // while first word is non-empty,
2407 // and rest {is empty or doesn't start with " = "},
2408 // try to run addlabel
2409 33308 while (firstword[0]
2410
12/12
✓ Branch 24 → 25 taken 14683 times.
✓ Branch 24 → 28 taken 1839 times.
✓ Branch 25 → 26 taken 13564 times.
✓ Branch 25 → 28 taken 1119 times.
✓ Branch 27 → 28 taken 13285 times.
✓ Branch 27 → 32 taken 279 times.
✓ Branch 36 → 37 taken 14899 times.
✓ Branch 36 → 42 taken 1887 times.
✓ Branch 39 → 40 taken 13753 times.
✓ Branch 39 → 42 taken 1146 times.
✓ Branch 41 → 42 taken 13471 times.
✓ Branch 41 → 46 taken 282 times.
33308 && !(params[0] && params[1] && stribegin(params, "= "))
2411
14/16
✓ Branch 23 → 24 taken 16522 times.
✗ Branch 23 → 32 not taken.
✓ Branch 29 → 30 taken 16220 times.
✓ Branch 29 → 81 taken 23 times.
✓ Branch 30 → 31 taken 535 times.
✓ Branch 30 → 32 taken 15685 times.
✓ Branch 33 → 19 taken 535 times.
✓ Branch 33 → 34 taken 15964 times.
✓ Branch 34 → 35 taken 16786 times.
✗ Branch 34 → 46 not taken.
✓ Branch 43 → 44 taken 16481 times.
✓ Branch 43 → 114 taken 23 times.
✓ Branch 44 → 45 taken 556 times.
✓ Branch 44 → 46 taken 15925 times.
✓ Branch 47 → 28 taken 556 times.
✓ Branch 47 → 48 taken 16207 times.
66616 && addlabel(firstword)) {
2412 // addlabel was ok, move to the next word
2413 1091 addlabeled = true;
2414 // if there's no next word, we're done here
2415
4/4
✓ Branch 19 → 20 taken 391 times.
✓ Branch 19 → 21 taken 144 times.
✓ Branch 29 → 30 taken 406 times.
✓ Branch 29 → 31 taken 150 times.
1091 if (!*params) return;
2416 // otherwise pull next word into firstword
2417
2/4
✓ Branch 21 → 22 taken 144 times.
✗ Branch 21 → 81 not taken.
✓ Branch 31 → 32 taken 150 times.
✗ Branch 31 → 114 not taken.
294 grab_until_space(firstword, params);
2418 }
2419
2420
2/4
✓ Branch 34 → 35 taken 15964 times.
✗ Branch 34 → 81 not taken.
✓ Branch 48 → 49 taken 16207 times.
✗ Branch 48 → 114 not taken.
32171 firstword_lower = firstword;
2421 32171 lower(firstword_lower);
2422
2423 // recheck for any of the conditionals tested above
2424
12/20
✓ Branch 36 → 37 taken 144 times.
✓ Branch 36 → 44 taken 15820 times.
✓ Branch 40 → 41 taken 144 times.
✗ Branch 40 → 79 not taken.
✗ Branch 42 → 43 not taken.
✓ Branch 42 → 44 taken 144 times.
✗ Branch 45 → 46 not taken.
✓ Branch 45 → 50 taken 15964 times.
✓ Branch 50 → 51 taken 150 times.
✓ Branch 50 → 60 taken 16057 times.
✓ Branch 56 → 57 taken 150 times.
✗ Branch 56 → 109 not taken.
✗ Branch 58 → 59 not taken.
✓ Branch 58 → 60 taken 150 times.
✓ Branch 61 → 62 taken 150 times.
✓ Branch 61 → 63 taken 16057 times.
✗ Branch 63 → 64 not taken.
✓ Branch 63 → 68 taken 16207 times.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 111 not taken.
32171 if (addlabeled && control_flow_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())) != control_flow_commands.end()) {
2425 throw_err_block(0, err_label_before_if, firstword.data());
2426 }
2427
2428
8/8
✓ Branch 50 → 51 taken 15953 times.
✓ Branch 50 → 81 taken 11 times.
✓ Branch 51 → 52 taken 5092 times.
✓ Branch 51 → 54 taken 10861 times.
✓ Branch 68 → 69 taken 16196 times.
✓ Branch 68 → 114 taken 11 times.
✓ Branch 69 → 70 taken 5107 times.
✓ Branch 69 → 72 taken 11089 times.
32171 if (asblock_pick(firstword_lower, params)) {
2429
2/4
✓ Branch 52 → 53 taken 5092 times.
✗ Branch 52 → 81 not taken.
✓ Branch 70 → 71 taken 5107 times.
✗ Branch 70 → 114 not taken.
10199 add_addr_to_line(addrToLinePos);
2430 10199 return;
2431 }
2432
2433
4/4
✓ Branch 55 → 56 taken 261 times.
✓ Branch 55 → 58 taken 10600 times.
✓ Branch 74 → 75 taken 261 times.
✓ Branch 74 → 80 taken 10828 times.
21950 if (firstword[0] == '%') {
2434 // imo using strchr here is jank, but it works i guess
2435 // (labels can't contain %)
2436
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);
2437 }
2438
2439
6/8
✓ Branch 61 → 62 taken 10600 times.
✗ Branch 61 → 80 not taken.
✓ Branch 63 → 64 taken 10315 times.
✓ Branch 63 → 66 taken 285 times.
✓ Branch 85 → 86 taken 10828 times.
✗ Branch 85 → 112 not taken.
✓ Branch 88 → 89 taken 10537 times.
✓ Branch 88 → 93 taken 291 times.
21428 if (auto it = normal_commands.find(frozen::string(firstword_lower.data(), firstword_lower.length())); it != normal_commands.end()) {
2440
4/4
✓ Branch 64 → 65 taken 5231 times.
✓ Branch 64 → 81 taken 5084 times.
✓ Branch 91 → 92 taken 5450 times.
✓ Branch 91 → 114 taken 5087 times.
20852 return it->second(params);
2441 }
2442
2443
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);
2444
2445
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);
2446 51284 }
2447