asar coverage - build #274


src/asar/
File: src/asar/assembleblock.cpp
Date: 2025-03-04 15:06:12
Lines:
1271/1375
92.4%
Functions:
38/40
95.0%
Branches:
2660/4253
62.5%

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