asar coverage - build #266


src/asar/
File: src/asar/assembleblock.cpp
Date: 2025-03-01 20:27:29
Lines:
1319/1423
92.7%
Functions:
38/40
95.0%
Branches:
2699/3969
68.0%

Line Branch Exec Source
1 #include "addr2line.h"
2 #include "asar.h"
3 #include "assembleblock.h"
4 #include "asar_math.h"
5 #include "macro.h"
6 #include "table.h"
7 #include "unicode.h"
8 #include <cinttypes>
9
10 #include "interface-shared.h"
11 #include "arch-shared.h"
12
13 int arch=arch_65816;
14
15 bool snespos_valid = false;
16 int snespos;
17 int realsnespos;
18 int startpos;
19 int realstartpos;
20
21 static bool mapper_set = false;
22 int label_counter = 0;
23
24 static int old_snespos;
25 static int old_startpos;
26 static int old_optimizeforbank;
27 static bool old_snespos_valid;
28 static int struct_base;
29 static string struct_name;
30 static string struct_parent;
31 static bool in_struct = false;
32 static bool in_sub_struct = false;
33 static bool static_struct = false;
34 static bool in_spcblock = false;
35
36 assocarr<snes_struct> structs;
37
38 static bool movinglabelspossible = false;
39
40 static bool disable_bank_cross_errors = false;
41 static bool check_half_banks_crossed = false;
42
43 int bytes;
44 static int freespaceuse=0;
45
46 static enum {
47 ratsmeta_ban,
48 ratsmeta_allow,
49 ratsmeta_used,
50 } ratsmetastate=ratsmeta_ban;
51
52 enum spcblock_type{
53 spcblock_nspc,
54 spcblock_custom
55 };
56
57 static struct spcblock_data{
58 unsigned int destination;
59 spcblock_type type;
60 string macro_name;
61
62 unsigned int size_address;
63 mapper_t old_mapper;
64 }spcblock;
65
66 437899 static inline void verifysnespos()
67 {
68
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 437899 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 219053 times.
437899 if (!snespos_valid)
69 {
70 asar_throw_error(0, error_type_block, error_id_missing_org);
71 snespos=0x008000;
72 realsnespos=0x008000;
73 startpos=0x008000;
74 realstartpos=0x008000;
75 snespos_valid = true;
76 }
77 437899 }
78
79 552 static int fixsnespos(int inaddr, int step)
80 {
81 // randomdude999: turns out it wasn't very reliable at all.
82 /* // RPG Hacker: No idea how reliable this is.
83 // Might not work with some of the more exotic mappers.
84 return pctosnes(snestopc(inaddr) + step); */
85
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) {
86
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 84 times.
96 if ((inaddr&0xFFFF)+step > 0xFFFF) {
87 // bank crossed
88 12 return inaddr+step+0x8000;
89 }
90 84 return inaddr+step;
91
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) {
92 if ((inaddr&0x400000) == 0 && freespaceid == 0) {
93 // we shouldn't get here in pass 2 inside a freespace anyways i think
94 // system pages, need to account for low pages and stuff
95 if ((inaddr&0xFFFF)+step > 0xFFFF) {
96 return inaddr+step+0x8000;
97 }
98 }
99 return inaddr+step;
100
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) {
101 // exlorom has no mirroring so this should work fine
102 return pctosnes(snestopc(inaddr)+step);
103
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) {
104 // apparently exhirom is pretty similar to hirom after all
105 if ((inaddr&0x400000) == 0) {
106 // system pages, need to account for low pages and stuff
107 if ((inaddr&0xFFFF)+step > 0xFFFF) {
108 return inaddr+step+0x8000;
109 }
110 }
111 return inaddr+step;
112
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) {
113 if((inaddr&0x400000) == 0) {
114 // lorom area
115 if ((inaddr&0xFFFF)+step > 0xFFFF) {
116 return inaddr+step+0x8000;
117 }
118 return inaddr+step;
119 } else {
120 // hirom area
121 return inaddr+step;
122 }
123
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) {
124 if ((inaddr&0x400000) == 0) {
125 // lorom area
126 if ((inaddr&0xFFFF)+step > 0xFFFF) {
127 return inaddr+step+0x8000;
128 }
129 } else {
130 // hirom area
131 return inaddr+step;
132 }
133
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) {
134 // no mirrors here, so this should work
135 return pctosnes(snestopc(inaddr)+step);
136
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) {
137 456 return inaddr+step;
138 }
139 return -1;
140 }
141
142 437410 static inline void step(int num)
143 {
144
4/4
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 437272 times.
✓ Branch 2 taken 138 times.
✓ Branch 3 taken 218657 times.
437410 if (disable_bank_cross_errors)
145 {
146 276 snespos = fixsnespos(snespos, num);
147 276 realsnespos = fixsnespos(realsnespos, num);
148
149 // RPG Hacker: Not adjusting startpos here will eventually throw
150 // an error in checkbankcross() if we set warn bankcross on again.
151 // As far as I can tell, those are pretty much just used for
152 // checking bank crossing, anyways, so it's hopefully save to just
153 // adjust them here.
154 276 startpos = snespos;
155 276 realstartpos = realsnespos;
156 }
157 else
158 {
159 437134 snespos += num;
160 437134 realsnespos += num;
161 }
162 437410 bytes+=num;
163 437410 }
164
165 436810 void write1(unsigned int num)
166 {
167 436810 verifysnespos();
168
2/2
✓ Branch 0 taken 145580 times.
✓ Branch 1 taken 291230 times.
436810 if (pass==2)
169 {
170 145580 int pcpos=snestopc(realsnespos&0xFFFFFF);
171
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 145580 times.
145580 if (pcpos<0)
172 {
173 movinglabelspossible=true;
174 asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
175 }
176 145580 writeromdata_byte(pcpos, (unsigned char)num, freespaceid != 0);
177
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 145578 times.
145580 if (pcpos>=romlen) {
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 if(pcpos - romlen > 0) writeromdata_bytes(romlen, freespacebyte, pcpos - romlen, false);
179 2 romlen=pcpos+1;
180 }
181 }
182
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) {
183 9160 int pcpos = snestopc(realsnespos & 0xFFFFFF);
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9160 times.
9160 if(pcpos < 0)
185 {
186 movinglabelspossible=true;
187 asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
188 }
189 9160 addromwrite(pcpos, 1);
190
2/2
✓ Branch 0 taken 8743 times.
✓ Branch 1 taken 417 times.
9160 if (pcpos>=romlen) {
191
2/2
✓ Branch 0 taken 88 times.
✓ Branch 1 taken 8655 times.
8743 if(pcpos - romlen > 0) writeromdata_bytes(romlen, freespacebyte, pcpos - romlen, false);
192 8743 romlen=pcpos+1;
193 }
194 }
195 436810 step(1);
196 436810 ratsmetastate=ratsmeta_ban;
197 436810 }
198
199 25318 static bool asblock_pick(char** word, int numwords)
200 {
201
6/6
✓ Branch 0 taken 22972 times.
✓ Branch 1 taken 2346 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 22957 times.
✓ Branch 4 taken 15 times.
✓ Branch 5 taken 11073 times.
25318 if (arch==arch_spc700 || in_spcblock) return asblock_spc700(word, numwords);
202
2/2
✓ Branch 0 taken 19288 times.
✓ Branch 1 taken 3654 times.
22942 if (arch==arch_65816) return asblock_65816(word, numwords);
203
1/2
✓ Branch 0 taken 3654 times.
✗ Branch 1 not taken.
3654 if (arch==arch_superfx) return asblock_superfx(word, numwords);
204 return true;
205 }
206
207 5214 const char * safedequote(char * str)
208 {
209 5214 const char * tmp=dequote(str);
210
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5214 times.
5214 if (!tmp) asar_throw_error(0, error_type_block, error_id_garbage_near_quoted_string);
211 5214 return tmp;
212 }
213
214 1855 void write2(unsigned int num)
215 {
216 1855 write1(num);
217 1855 write1(num/256);
218 1855 }
219
220 1210 void write3(unsigned int num)
221 {
222 1210 write1(num);
223 1210 write1(num/256);
224 1210 write1(num/65536);
225 1210 }
226
227 114 void write4(unsigned int num)
228 {
229 114 write1(num);
230 114 write1(num/256);
231 114 write1(num/65536);
232 114 write1(num/16777216);
233 114 }
234
235 //these are NOT used by the math parser - see asar_math.cpp for that
236 22 static int read2(int insnespos)
237 {
238 22 int addr=snestopc(insnespos);
239
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;
240 return
241 22 romdata_r[addr ] |
242
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
33 (romdata_r[addr+1]<< 8);
243 }
244
245 54 static int read3(int insnespos)
246 {
247 54 int addr=snestopc(insnespos);
248
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;
249 return
250 54 romdata_r[addr ] |
251 81 (romdata_r[addr+1]<< 8)|
252
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);
253 }
254
255 1452 int getlenfromchar(char c)
256 {
257 1452 c=(char)to_lower(c);
258
2/2
✓ Branch 0 taken 660 times.
✓ Branch 1 taken 792 times.
1452 if (c=='b') return 1;
259
2/2
✓ Branch 0 taken 690 times.
✓ Branch 1 taken 102 times.
792 if (c=='w') return 2;
260
2/2
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 6 times.
102 if (c=='l') return 3;
261 6 asar_throw_error(0, error_type_block, error_id_invalid_opcode_length);
262 }
263
264 assocarr<snes_label> labels;
265 static autoarray<int> poslabels;
266 static autoarray<int> neglabels;
267
268 autoarray<int>* macroposlabels;
269 autoarray<int>* macroneglabels;
270
271 autoarray<string> sublabels;
272 autoarray<string>* macrosublabels;
273
274 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
275 string ns;
276 static string ns_backup;
277 autoarray<string> namespace_list;
278
279 autoarray<string> includeonce;
280
281 autoarray<freespace_data> freespaces;
282
283 // id of the next unused freespace.
284 static int freespaceidnext;
285 // id of the current freespace, or 0 if not in freespace.
286 int freespaceid;
287 // start address of the current freespace, used for computing the length of the
288 // current freespace.
289 static int freespacestart;
290 static freespace_data default_freespace_settings;
291
292 2546 bool confirmname(const char * name)
293 {
294
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 1256 times.
✓ Branch 2 taken 1290 times.
2546 if (!name[0]) return false;
295
3/3
✓ Branch 0 taken 306 times.
✓ Branch 1 taken 1256 times.
✓ Branch 2 taken 984 times.
2546 if (is_digit(name[0])) return false;
296
4/4
✓ Branch 0 taken 7911 times.
✓ Branch 1 taken 947 times.
✓ Branch 2 taken 7957 times.
✓ Branch 3 taken 981 times.
17796 for (int i=0;name[i];i++)
297 {
298
4/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 7908 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 7954 times.
15868 if (!is_ualnum(name[i])) return false;
299 }
300 1928 return true;
301 }
302
303 46764 string posneglabelname(const char ** input, bool define)
304 {
305 46764 const char* label = *input;
306
307 46764 string output;
308
309 46764 int depth = 0;
310 46764 bool ismacro = false;
311
312
3/3
✓ Branch 0 taken 23 times.
✓ Branch 1 taken 23686 times.
✓ Branch 2 taken 23055 times.
46764 if (label[0] == '?')
313 {
314 46 ismacro = true;
315 46 label++;
316 }
317
6/6
✓ Branch 0 taken 23655 times.
✓ Branch 1 taken 23072 times.
✓ Branch 2 taken 103 times.
✓ Branch 3 taken 23589 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 22969 times.
46764 if (label[0] == '-' || label[0] == '+')
318 {
319 206 char first = label[0];
320
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++;
321
322
2/2
✓ Branch 0 taken 190 times.
✓ Branch 1 taken 16 times.
206 if (!ismacro)
323 {
324
2/2
✓ Branch 0 taken 130 times.
✓ Branch 1 taken 60 times.
190 if (first == '+')
325 {
326 130 *input = label;
327
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]);
328
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]++;
329 }
330 else
331 {
332 60 *input = label;
333
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]++;
334
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]);
335 }
336 }
337 else
338 {
339
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)
340 {
341 if (!macrorecursion) asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
342 }
343 else
344 {
345
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 8 times.
16 if (first == '+')
346 {
347 8 *input = label;
348
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]);
349
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]++;
350 }
351 else
352 {
353 8 *input = label;
354
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]++;
355
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]);
356 }
357 }
358 }
359 }
360
361 46764 return output;
362 }
363
364 2349 string labelname(const char ** rawname, bool define)
365 {
366 #define deref_rawname (*rawname)
367 2349 autoarray<string>* sublabellist = &sublabels;
368
369 2349 bool ismacro = (deref_rawname[0] == '?');
370 2349 bool issublabel = false;
371
372
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 2325 times.
2349 if (ismacro)
373 {
374 24 deref_rawname++;
375 24 sublabellist = macrosublabels;
376 }
377
378 2349 string name;
379 2349 int i=-1;
380
381
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1189 times.
2349 if (is_digit(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
382
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1189 times.
2349 if (*deref_rawname ==':')
383 {
384 deref_rawname++;
385 name=":";
386 }
387
7/8
✓ Branch 0 taken 1061 times.
✓ Branch 1 taken 1288 times.
✓ Branch 2 taken 2139 times.
✓ Branch 3 taken 111 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1090 times.
✓ Branch 6 taken 1078 times.
✓ Branch 7 taken 12 times.
2349 else if (!in_struct && !in_sub_struct)
388 {
389
4/4
✓ Branch 0 taken 47 times.
✓ Branch 1 taken 1049 times.
✓ Branch 2 taken 53 times.
✓ Branch 3 taken 1078 times.
2227 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
390
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1049 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1078 times.
2127 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
391
2/2
✓ Branch 0 taken 94 times.
✓ Branch 1 taken 2033 times.
2127 if (i)
392 {
393
7/11
✓ 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.
94 if (!sublabellist || !(*sublabellist)[i - 1]) asar_throw_error(2, error_type_block, error_id_label_missing_parent);
394
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]+"_";
395 94 issublabel = true;
396 }
397 }
398
399
4/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 2325 times.
✓ Branch 2 taken 16 times.
✓ Branch 3 taken 8 times.
2349 if (ismacro && !issublabel)
400 {
401 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
402 // their parents' names.
403
3/4
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 10 times.
16 if (!macrorecursion || macrosublabels == nullptr) asar_throw_error(2, error_type_block, error_id_macro_label_outside_of_macro);
404
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;
405 }
406
407
408
7/8
✓ Branch 0 taken 1058 times.
✓ Branch 1 taken 1285 times.
✓ Branch 2 taken 1099 times.
✓ Branch 3 taken 1145 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1087 times.
✓ Branch 6 taken 12 times.
✓ Branch 7 taken 1075 times.
2343 if (in_struct || in_sub_struct)
409 {
410
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 210 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 99 times.
222 if(in_sub_struct)
411 {
412
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 + ".";
413 }
414
1/2
✓ Branch 0 taken 222 times.
✗ Branch 1 not taken.
222 name += struct_name;
415
1/2
✓ Branch 0 taken 222 times.
✗ Branch 1 not taken.
222 name += '.';
416
4/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 108 times.
222 if(*deref_rawname != '.') asar_throw_error(2, error_type_block, error_id_invalid_label_name); //probably should be a better error. TODO!!!
417 216 deref_rawname++;
418 }
419
420
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1154 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1183 times.
2337 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
421
422
10/10
✓ Branch 0 taken 1250 times.
✓ Branch 1 taken 7798 times.
✓ Branch 2 taken 1375 times.
✓ Branch 3 taken 9064 times.
✓ Branch 4 taken 7894 times.
✓ Branch 5 taken 1154 times.
✓ Branch 6 taken 96 times.
✓ Branch 7 taken 1183 times.
✓ Branch 8 taken 8006 times.
✓ Branch 9 taken 1183 times.
18237 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
423 {
424
2/4
✓ Branch 0 taken 7894 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8006 times.
✗ Branch 3 not taken.
15900 name+=*(deref_rawname++);
425 }
426
427
4/4
✓ Branch 0 taken 963 times.
✓ Branch 1 taken 1374 times.
✓ Branch 2 taken 747 times.
✓ Branch 3 taken 216 times.
2337 if (define && i>=0)
428 {
429 747 (*sublabellist).reset(i);
430
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;
431 }
432 2337 return name;
433 #undef deref_rawname
434 12 }
435
436 194 static inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
437 {
438
2/3
✓ Branch 0 taken 95 times.
✓ Branch 1 taken 99 times.
✗ Branch 2 not taken.
194 string name=labelname(rawname, define);
439
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);}
440
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);}
441 else
442 {
443
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)
444 {
445 2 asar_throw_error(2, error_type_block, error_id_label_not_found, name.data());
446 }
447 22 rval->pos = (unsigned int)-1;
448 22 rval->freespace_id = 0;
449 22 rval->is_static = false;
450 22 return false;
451 }
452 170 return true;
453 194 }
454
455 172 snes_label labelval(const char ** rawname, bool define)
456 {
457 172 snes_label rval;
458
2/2
✓ Branch 0 taken 86 times.
✓ Branch 1 taken 2 times.
172 labelvalcore(rawname, &rval, define, true);
459 170 return rval;
460 }
461
462 22 snes_label labelval(string name, bool define)
463 {
464 22 const char * rawname=name;
465 22 snes_label rval;
466
1/2
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
22 labelvalcore(&rawname, &rval, define, true);
467 44 return rval;
468 }
469
470 bool labelval(const char ** rawname, snes_label * rval, bool define)
471 {
472 return labelvalcore(rawname, rval, define, false);
473 }
474
475 bool labelval(string name, snes_label * rval, bool define)
476 {
477 const char * str=name;
478 return labelvalcore(&str, rval, define, false);
479 }
480
481 1302 static void setlabel(string name, int loc=-1, bool is_static=false)
482 {
483 1302 int lbl_fs_id = 0;
484
2/2
✓ Branch 0 taken 1083 times.
✓ Branch 1 taken 219 times.
1302 if (loc==-1)
485 {
486
1/2
✓ Branch 0 taken 1083 times.
✗ Branch 1 not taken.
1083 verifysnespos();
487 1083 loc = snespos;
488 // if base is not active:
489
2/2
✓ Branch 0 taken 843 times.
✓ Branch 1 taken 240 times.
1083 if(snespos == realsnespos) lbl_fs_id = freespaceid;
490 // if base is active, always treat the label as freespace 0, i.e. not freespace.
491 }
492
493 1302 snes_label label_data;
494 1302 label_data.pos = (unsigned int)loc;
495 1302 label_data.is_static = is_static;
496 1302 label_data.freespace_id = lbl_fs_id;
497
498 unsigned int labelpos;
499
2/2
✓ Branch 0 taken 434 times.
✓ Branch 1 taken 868 times.
1302 if (pass==0)
500 {
501
3/4
✓ Branch 0 taken 434 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 432 times.
434 if (labels.exists(name))
502 {
503 2 movinglabelspossible=true;
504 2 asar_throw_error(0, error_type_block, error_id_label_redefined, name.data());
505 }
506
1/2
✓ Branch 0 taken 432 times.
✗ Branch 1 not taken.
432 labels.create(name) = label_data;
507 }
508
2/2
✓ Branch 0 taken 434 times.
✓ Branch 1 taken 434 times.
868 else if (pass==1)
509 {
510
1/2
✓ Branch 0 taken 434 times.
✗ Branch 1 not taken.
434 labels.create(name) = label_data;
511 }
512
1/2
✓ Branch 0 taken 434 times.
✗ Branch 1 not taken.
434 else if (pass==2)
513 {
514 //all label locations are known at this point, add a sanity check
515
2/4
✓ Branch 0 taken 434 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 434 times.
434 if (!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_internal_error, "label created on 3rd pass");
516
1/2
✓ Branch 0 taken 434 times.
✗ Branch 1 not taken.
434 labelpos = labels.find(name).pos;
517
5/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 428 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
434 if ((int)labelpos != loc && !movinglabelspossible)
518 {
519
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if((unsigned int)loc>>16 != labelpos>>16) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
520
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
6 else if(labelpos == (dp_base + 0xFFu)) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
521
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;
522 else asar_throw_error(2, error_type_block, error_id_internal_error, "moving label");
523 }
524 }
525 }
526
527 table thetable;
528 static autoarray<table> tablestack;
529
530 832 static void cleartable()
531 {
532
4/7
✓ Branch 0 taken 368 times.
✓ Branch 1 taken 464 times.
✓ Branch 2 taken 368 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 464 times.
✗ Branch 6 not taken.
832 thetable = table();
533 832 }
534
535 struct pushable {
536 int arch;
537 int snespos;
538 int snesstart;
539 int snesposreal;
540 int snesstartreal;
541 int freeid;
542 int freest;
543 int arch1;
544 int arch2;
545 int arch3;
546 int arch4;
547 };
548 static autoarray<pushable> pushpc;
549 static int pushpcnum;
550
551 static autoarray<int> basestack;
552 static int basestacknum;
553
554 struct ns_pushable {
555 string ns;
556 autoarray<string> namespace_list;
557 bool nested_namespaces;
558 };
559
560 static autoarray<ns_pushable> pushns;
561 static int pushnsnum;
562
563
564 static unsigned char fillbyte[12];
565 static unsigned char padbyte[12];
566
567 static bool nested_namespaces = false;
568
569 46854 void checkbankcross()
570 {
571
4/4
✓ Branch 0 taken 4744 times.
✓ Branch 1 taken 42110 times.
✓ Branch 2 taken 4819 times.
✓ Branch 3 taken 18788 times.
46854 if (!snespos_valid) return;
572
4/4
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 37102 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 18599 times.
37291 if (disable_bank_cross_errors) return;
573
4/4
✓ Branch 0 taken 146 times.
✓ Branch 1 taken 36767 times.
✓ Branch 2 taken 146 times.
✓ Branch 3 taken 18453 times.
36913 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
574
4/4
✓ Branch 0 taken 591 times.
✓ Branch 1 taken 36322 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 587 times.
36913 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
575 {
576 4 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, snespos);
577 }
578 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
579
7/8
✓ Branch 0 taken 18171 times.
✓ Branch 1 taken 18738 times.
✓ Branch 2 taken 18703 times.
✓ Branch 3 taken 18065 times.
✓ Branch 4 taken 301 times.
✓ Branch 5 taken 18402 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 301 times.
36909 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
580 {
581 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, realsnespos);
582 }
583 }
584
585 3297 static void freespaceend()
586 {
587
2/2
✓ Branch 0 taken 1572 times.
✓ Branch 1 taken 1725 times.
3297 if (freespaceid > 0)
588 {
589 1572 freespaces[freespaceid].len = realsnespos-freespacestart;
590 1572 snespos=(int)0xFFFFFFFF;
591 1572 snespos_valid = false;
592 }
593 3297 freespaceid = 0;
594 3297 }
595
596 2508 static void adddefine(const string & key, string & value)
597 {
598
2/4
✓ Branch 0 taken 1095 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1413 times.
✗ Branch 3 not taken.
2508 if (!defines.exists(key)) defines.create(key) = value;
599 2508 }
600
601 826 void initstuff()
602 {
603
2/2
✓ Branch 0 taken 282 times.
✓ Branch 1 taken 544 times.
826 if (pass==0)
604 {
605 282 freespaces.reset();
606 282 movinglabelspossible = false;
607 282 found_rats_tags_initialized = false;
608 282 found_rats_tags.clear();
609 }
610 826 arch=arch_65816;
611 826 mapper=lorom;
612 826 mapper_set = false;
613 826 calledmacros = 0;
614 826 reallycalledmacros = 0;
615 826 macrorecursion = 0;
616 826 defines.reset();
617 826 builtindefines.each(adddefine);
618 826 clidefines.each(adddefine);
619 826 ns="";
620 826 namespace_list.reset();
621 826 sublabels.reset();
622 826 poslabels.reset();
623 826 neglabels.reset();
624 826 macroposlabels = nullptr;
625 826 macroneglabels = nullptr;
626 826 macrosublabels = nullptr;
627 826 cleartable();
628 826 pushpc.reset();
629 826 pushpcnum=0;
630 826 pushns.reset();
631 826 pushnsnum = 0;
632 826 bytes=0;
633 826 freespaceuse=0;
634
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
826 memset(fillbyte, 0, sizeof(fillbyte));
635
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 461 times.
826 memset(padbyte, 0, sizeof(padbyte));
636 826 snespos_valid = false;
637 826 snespos=(int)0xFFFFFFFF;
638 826 realsnespos= (int)0xFFFFFFFF;
639 826 startpos= (int)0xFFFFFFFF;
640 826 realstartpos= (int)0xFFFFFFFF;
641 826 freespaceidnext=1;
642 826 freespaceid=0;
643 826 freespacebyte=0x00;
644 826 incsrcdepth = 0;
645
646 826 optimizeforbank = -1;
647 826 optimize_dp = optimize_dp_flag::ALWAYS;
648 826 dp_base = 0;
649 826 optimize_address = optimize_address_flag::MIRRORS;
650
651 826 in_struct = false;
652 826 in_sub_struct = false;
653 826 in_spcblock = false;
654
655 826 disable_bank_cross_errors = false;
656 826 check_half_banks_crossed = false;
657 826 nested_namespaces = false;
658
659 826 includeonce.reset();
660
661 extern AddressToLineMapping addressToLineMapping;
662 826 addressToLineMapping.reset();
663
664 826 push_warnings(false);
665
666 826 initmathcore();
667
668 1287 default_freespace_settings = {};
669 826 default_freespace_settings.bank = -3;
670 826 default_freespace_settings.search_start = -1;
671 826 default_freespace_settings.write_rats = true;
672 // rest are initialized to false/0/empty string
673
674 826 callstack.reset();
675 #if defined(_WIN32) || !defined(NO_USE_THREADS)
676 826 init_stack_use_check();
677 #endif
678 826 }
679
680 1572 static void parse_freespace_arguments(freespace_data& thisfs, string& arguments) {
681
3/3
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 786 times.
✓ Branch 2 taken 681 times.
1572 if(arguments == "") return;
682
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(), ',');
683
684
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++)
685 {
686
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; }
687
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; }
688
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; }
689
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; }
690
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; }
691
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; }
692
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; }
693
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; }
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], "rats")) { thisfs.write_rats = true; }
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], "norats")) { thisfs.write_rats = false; }
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], "bankcross")) { thisfs.allow_bankcross = true; }
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], "nobankcross")) { thisfs.allow_bankcross = false; }
698
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="))
699 {
700
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();
701 }
702
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="))
703 {
704
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();
705 }
706
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="))
707 {
708 // TODO: should we handle posneg labels here too?
709
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;
710 24 const char* pin_to_c = pin_to.data();
711
2/3
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
24 thisfs.pin_target = labelname(&pin_to_c);
712
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 12 times.
24 if(*pin_to_c) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
713 // this is to throw an "undefined label" error with the proper callstack
714
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);
715
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;
716 24 }
717 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
718 }
719 1362 }
720
721 530 static int get_freespace_pin_target(int target_id) {
722 // union-find algorithm
723
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) {
724 // i love programming
725 6 freespaces[target_id].pin_target_id =
726 4 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
727 4 target_id = freespaces[target_id].pin_target_id;
728 }
729 530 return target_id;
730 }
731
732 272 static void resolve_pinned_freespaces() {
733
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 272 times.
794 for(int i = 1; i < freespaces.count; i++)
734 // default to everyone being in a separate component
735 522 freespaces[i].pin_target_id = i;
736
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 272 times.
794 for(int i = 1; i < freespaces.count; i++) {
737
1/2
✓ Branch 0 taken 522 times.
✗ Branch 1 not taken.
522 freespace_data& fs = freespaces[i];
738
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;
739 8 snes_label value;
740
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))
741 value = labels.find(fs.pin_target_ns + fs.pin_target);
742
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))
743
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);
744 else continue; // the error for this is thrown in the freespace command during pass 2
745
1/2
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
8 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
746 8 fs.len = 0;
747 }
748 272 }
749
750 272 static void allocate_freespaces() {
751 // compute real size of all pinned freespace blocks
752
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 272 times.
794 for(int i = 1; i < freespaces.count; i++) {
753 522 freespace_data& fs = freespaces[i];
754 // just in case the pin target changed again or something
755 522 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
756 522 freespace_data& target = freespaces[fs.pin_target_id];
757 522 target.total_len += fs.len;
758 522 target.search_start = std::max(fs.search_start, target.search_start);
759 }
760
761
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 272 times.
794 for(int i = 1; i < freespaces.count; i++) {
762 522 freespace_data& fs = freespaces[i];
763
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) {
764 2 fs.pos = fs.orgpos;
765 2 continue;
766 }
767 // if this freespace is pinned to another one, set it later
768
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;
769 // TODO: possibly fancier align
770
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);
771 514 fs.used_len = fs.len;
772 }
773 // set pos for all pinned freespaces
774
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 272 times.
794 for(int i = 1; i < freespaces.count; i++) {
775 522 freespace_data& fs = freespaces[i];
776
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;
777 6 freespace_data& tgt = freespaces[fs.pin_target_id];
778 6 fs.pos = tgt.pos + tgt.used_len;
779 6 tgt.used_len += fs.len;
780 }
781
782 // relocate all labels that were in freespace to point them to their real location
783 272 labels.each([](const char * key, snes_label & val) {
784
4/4
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 166 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 176 times.
432 if(val.freespace_id != 0) {
785 90 val.pos += freespaces[val.freespace_id].pos;
786 }
787 432 });
788 272 }
789
790 816 void finishpass()
791 {
792 816 verify_warnings();
793 816 pull_warnings(false);
794
795
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 816 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 456 times.
816 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_missing_endspcblock);
796
6/8
✓ Branch 0 taken 360 times.
✓ Branch 1 taken 456 times.
✓ Branch 2 taken 456 times.
✓ Branch 3 taken 360 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 456 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 456 times.
816 if (in_struct || in_sub_struct) asar_throw_error(0, error_type_null, error_id_struct_without_endstruct);
797
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 816 times.
816 else if (pushpcnum) asar_throw_error(0, error_type_null, error_id_pushpc_without_pullpc);
798
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 816 times.
816 else if (pushnsnum) asar_throw_error(0, error_type_null, error_id_pushns_without_pullns);
799 816 freespaceend();
800
801 816 deinitmathcore();
802
2/2
✓ Branch 0 taken 272 times.
✓ Branch 1 taken 544 times.
816 if(pass == 0) {
803 272 resolve_pinned_freespaces();
804
2/2
✓ Branch 0 taken 272 times.
✓ Branch 1 taken 272 times.
544 } else if(pass == 1) {
805 272 allocate_freespaces();
806 272 handle_cleared_rats_tags();
807 }
808 #if defined(_WIN32) || !defined(NO_USE_THREADS)
809 816 deinit_stack_use_check();
810 #endif
811 816 }
812
813 25924 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
814 {
815
4/6
✓ Branch 0 taken 13348 times.
✓ Branch 1 taken 12576 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 13348 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12576 times.
25924 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
816
817 25924 const char* posneglabel = label;
818
2/3
✓ Branch 0 taken 13348 times.
✓ Branch 1 taken 12576 times.
✗ Branch 2 not taken.
25924 string posnegname = posneglabelname(&posneglabel, true);
819
820
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 25798 times.
25924 if (posnegname.length() > 0)
821 {
822
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (global_label) return false;
823
5/6
✓ 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.
126 if (*posneglabel != '\0' && *posneglabel != ':') asar_throw_error(0, error_type_block, error_id_broken_label_definition);
824
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);
825 126 return true;
826 }
827
11/13
✓ Branch 0 taken 12823 times.
✓ Branch 1 taken 12975 times.
✓ Branch 2 taken 12793 times.
✓ Branch 3 taken 30 times.
✓ Branch 4 taken 24817 times.
✓ Branch 5 taken 486 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 24784 times.
✓ Branch 8 taken 33 times.
✓ Branch 9 taken 11991 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 11991 times.
25798 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
828 {
829
4/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 492 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 513 times.
1017 if (!label[1]) return false;
830
10/12
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 963 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.
1005 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
831
832 999 bool define = true;
833
834
3/3
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 489 times.
✓ Branch 2 taken 498 times.
999 if (label[0] == '#')
835 {
836 24 define = false;
837 24 label++;
838 }
839
840 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
841 // Also, apparently this here doesn't account for main labels. I guess because
842 // we don't even get here in the first place if they don't include a colon?
843
13/15
✓ Branch 0 taken 342 times.
✓ Branch 1 taken 504 times.
✓ Branch 2 taken 492 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 336 times.
✓ Branch 5 taken 357 times.
✓ Branch 6 taken 3 times.
✓ Branch 7 taken 336 times.
✓ Branch 8 taken 354 times.
✓ Branch 9 taken 351 times.
✓ Branch 10 taken 3 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 351 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 351 times.
999 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
844
3/3
✓ Branch 0 taken 483 times.
✓ Branch 1 taken 510 times.
✓ Branch 2 taken 6 times.
999 string name=labelname(&label, define);
845
3/3
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 501 times.
✓ Branch 2 taken 36 times.
987 if (label[0]==':') label++;
846
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 69 times.
69 else if (requirecolon) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
847
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 63 times.
69 else if (global_label) return false;
848
3/3
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 480 times.
✓ Branch 2 taken 489 times.
981 if (label[0]) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
849
8/9
✓ Branch 0 taken 111 times.
✓ Branch 1 taken 846 times.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 99 times.
✓ Branch 5 taken 858 times.
✓ Branch 6 taken 48 times.
✓ Branch 7 taken 51 times.
✗ Branch 8 not taken.
957 if (ns && !global_label) name=ns+name;
850
15/16
✓ Branch 0 taken 375 times.
✓ Branch 1 taken 582 times.
✓ Branch 2 taken 408 times.
✓ Branch 3 taken 456 times.
✓ Branch 4 taken 75 times.
✓ Branch 5 taken 426 times.
✓ Branch 6 taken 480 times.
✓ Branch 7 taken 384 times.
✓ Branch 8 taken 466 times.
✓ Branch 9 taken 107 times.
✓ Branch 10 taken 75 times.
✓ Branch 11 taken 30 times.
✓ Branch 12 taken 489 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 487 times.
✓ Branch 15 taken 2 times.
961 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
851 953 return true;
852 987 }
853 24781 return false;
854 25924 }
855
856 15581 static void add_addr_to_line(int pos)
857 {
858
2/2
✓ Branch 0 taken 5501 times.
✓ Branch 1 taken 10080 times.
15581 if (pass == 2)
859 5501 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
860 15581 }
861
862 static autoarray<bool> elsestatus;
863 int numtrue=0;//if 1 -> increase both
864 int numif = 0; //if 0 or inside if 0 -> increase only numif
865
866 autoarray<whiletracker> whilestatus;
867
868
869 96 static void push_pc()
870 {
871 96 pushpc[pushpcnum].arch=arch;
872 96 pushpc[pushpcnum].snespos=snespos;
873 96 pushpc[pushpcnum].snesstart=startpos;
874 96 pushpc[pushpcnum].snesposreal=realsnespos;
875 96 pushpc[pushpcnum].snesstartreal=realstartpos;
876 96 pushpc[pushpcnum].freeid=freespaceid;
877 96 pushpc[pushpcnum].freest=freespacestart;
878 96 pushpcnum++;
879 96 }
880
881 96 static void pop_pc()
882 {
883 96 pushpcnum--;
884 96 snespos=pushpc[pushpcnum].snespos;
885 96 startpos=pushpc[pushpcnum].snesstart;
886 96 realsnespos=pushpc[pushpcnum].snesposreal;
887 96 realstartpos=pushpc[pushpcnum].snesstartreal;
888 96 freespaceid=pushpc[pushpcnum].freeid;
889 96 freespacestart=pushpc[pushpcnum].freest;
890 96 }
891
892
893 372 static string handle_print(char* input)
894 {
895 // evaluating this math can be unsafe in pass 0
896
3/4
✓ Branch 0 taken 244 times.
✓ Branch 1 taken 128 times.
✓ Branch 2 taken 244 times.
✗ Branch 3 not taken.
372 if(pass != 2) return "";
897 128 string out;
898
2/3
✓ Branch 0 taken 61 times.
✓ Branch 1 taken 67 times.
✗ Branch 2 not taken.
128 autoptr<char**> pars = qpsplit(input, ',');
899
1/2
✓ Branch 0 taken 128 times.
✗ Branch 1 not taken.
128 verify_paren(pars);
900
4/4
✓ Branch 0 taken 100 times.
✓ Branch 1 taken 57 times.
✓ Branch 2 taken 109 times.
✓ Branch 3 taken 63 times.
329 for (int i = 0; pars[i]; i++)
901 {
902 if (0);
903
7/11
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 28 times.
✓ Branch 2 taken 150 times.
✓ Branch 3 taken 31 times.
✓ Branch 4 taken 72 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 78 times.
✗ Branch 10 not taken.
209 else if (pars[i][0] == '"') out += safedequote(pars[i]);
904
8/12
✓ Branch 0 taken 28 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 57 times.
✓ Branch 4 taken 4 times.
✓ Branch 5 taken 29 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.
59 else if (!stricmp(pars[i], "bytes")) out += dec(bytes);
905
8/12
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 28 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.
55 else if (!stricmp(pars[i], "freespaceuse")) out += dec(freespaceuse);
906
3/12
✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 53 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 28 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.
53 else if (!stricmp(pars[i], "pc")) out += hex((unsigned int)(snespos & 0xFFFFFF), 6);
907
2/2
✓ Branch 0 taken 25 times.
✓ Branch 1 taken 28 times.
53 else if (!strncasecmp(pars[i], "bin(", strlen("bin(")) ||
908
5/6
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✓ Branch 3 taken 30 times.
✓ Branch 4 taken 15 times.
✓ Branch 5 taken 8 times.
43 !strncasecmp(pars[i], "dec(", strlen("dec(")) ||
909
9/10
✓ Branch 0 taken 43 times.
✓ Branch 1 taken 10 times.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 20 times.
✓ Branch 6 taken 32 times.
✓ Branch 7 taken 8 times.
✓ Branch 8 taken 27 times.
✓ Branch 9 taken 1 times.
112 !strncasecmp(pars[i], "hex(", strlen("hex(")) ||
910
5/6
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 1 times.
16 !strncasecmp(pars[i], "double(", strlen("double(")))
911 {
912
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
51 char * arg1pos = strchr(pars[i], '(') + 1;
913
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
51 char * endpos = strchr(arg1pos, '\0');
914
5/6
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 78 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 27 times.
102 while (*endpos == ' ' || *endpos == '\0') endpos--;
915
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 27 times.
51 if (*endpos != ')') asar_throw_error(2, error_type_block, error_id_invalid_print_function_syntax);
916
2/3
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
51 string paramstr = string(arg1pos, (int)(endpos - arg1pos));
917
918 27 int numargs;
919
2/3
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
51 autoptr<char**> params = qpsplit(paramstr.temp_raw(), ',', &numargs);
920
1/2
✓ Branch 0 taken 51 times.
✗ Branch 1 not taken.
51 verify_paren(params);
921
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 51 times.
51 if (numargs > 2) asar_throw_error(2, error_type_block, error_id_wrong_num_parameters);
922 51 int precision = 0;
923 51 bool hasprec = numargs == 2;
924
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 25 times.
51 if (hasprec)
925 {
926
2/4
✓ Branch 0 taken 13 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
✗ Branch 3 not taken.
26 precision = getnum(params[1]);
927
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 if (precision < 0) precision = 0;
928
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26 times.
26 if (precision > 64) precision = 64;
929 }
930 51 *(arg1pos - 1) = '\0'; // allows more convenient comparsion functions
931
5/6
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 46 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 22 times.
51 if (!stricmp(pars[i], "bin"))
932 {
933 // sadly printf doesn't have binary, so let's roll our own
934
2/3
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
10 int64_t value = getnum(params[0]);
935 5 char buffer[65];
936
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 8 times.
10 if (value < 0) {
937
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 out += '-';
938 2 value = -value;
939 // decrement precision because we've output one char already
940 2 precision -= 1;
941
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 if (precision<0) precision = 0;
942 }
943
2/2
✓ Branch 0 taken 640 times.
✓ Branch 1 taken 10 times.
650 for (int j = 0; j < 64; j++) {
944
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 320 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 320 times.
640 buffer[63 - j] = '0' + ((value & (1ull << j)) >> j);
945 }
946 10 buffer[64] = 0;
947 10 int startidx = 0;
948
6/6
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 287 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 287 times.
✓ Branch 5 taken 1 times.
584 while (startidx < 64 - precision && buffer[startidx] == '0') startidx++;
949
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 10 times.
10 if (startidx == 64) startidx--; // always want to print at least one digit
950
2/3
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
10 out += buffer + startidx;
951 }
952
5/6
✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 8 times.
✓ Branch 5 taken 14 times.
41 else if (!stricmp(pars[i], "dec"))
953 {
954
3/3
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
✓ Branch 2 taken 3 times.
15 int64_t value = getnum(params[0]);
955 5 char buffer[65];
956
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
9 snprintf(buffer, 65, "%0*" PRId64, precision, value);
957
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 out += buffer;
958 }
959
5/6
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 21 times.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 7 times.
26 else if (!stricmp(pars[i], "hex"))
960 {
961
2/3
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
12 int64_t value = getnum(params[0]);
962 7 char buffer[65];
963
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
12 snprintf(buffer, 65, "%0*" PRIX64, precision, value);
964
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 out += buffer;
965 }
966
4/6
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 7 times.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
14 else if (!stricmp(pars[i], "double"))
967 {
968
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 2 times.
14 if (!hasprec) precision = 5;
969
5/11
✓ Branch 0 taken 7 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 7 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 7 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 7 times.
✗ Branch 10 not taken.
28 double val = parse_math_expr(params[0])->evaluate().get_double();
970
4/7
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 7 times.
✓ Branch 2 taken 7 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 7 times.
✗ Branch 6 not taken.
14 out += ftostrvar(val, precision);
971 }
972 57 }
973 2 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
974 }
975 120 return out;
976 150 }
977
978 114 void handle_autoclean(string& arg, int checkbyte, int write_pos)
979 {
980
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 114 times.
114 if(freespaceid > 0) asar_throw_error(0, error_type_block, error_id_autoclean_in_freespace);
981
982 114 const char* labeltest = arg.data();
983
1/2
✓ Branch 0 taken 114 times.
✗ Branch 1 not taken.
114 snes_label lblval = labelval(&labeltest);
984
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 57 times.
✓ Branch 2 taken 57 times.
114 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, arg.data());
985 114 int num = lblval.pos;
986
1/2
✓ Branch 0 taken 114 times.
✗ Branch 1 not taken.
114 auto& targetfs = freespaces[lblval.freespace_id];
987
988
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 60 times.
114 if (pass == 1) {
989 54 targetfs.leaked = false;
990
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
54 int orig_pos = read3(checkbyte != -1 ? write_pos+1 : write_pos);
991 54 int write_pos_pc = snestopc(write_pos);
992 54 targetfs.orgpos = targetfs.orglen = -1;
993
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)) {
994
1/2
✓ Branch 0 taken 28 times.
✗ Branch 1 not taken.
28 int rats_loc = ratsstart(orig_pos);
995
2/2
✓ Branch 0 taken 22 times.
✓ Branch 1 taken 6 times.
28 if(rats_loc != -1) {
996 22 targetfs.orgpos = rats_loc + 8;
997 22 targetfs.orglen = read2(rats_loc + 4) + 1;
998
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);
999 }
1000 }
1001
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 6 times.
60 } else if(pass == 2) {
1002
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 int start = ratsstart(num);
1003
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
54 if(start >= num || start < 0) asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
1004 }
1005 114 }
1006
1007 // single_line_for_tracker is:
1008 // 0 if not in first block of line, not in (single-line) for loop
1009 // 1 if first block of line
1010 // 2 if in single-line for loop
1011 // 3 if after endfor (of a single-line loop)
1012 50727 void assembleblock(const char * block, int& single_line_for_tracker)
1013 {
1014 #define is(test) (!stricmpwithlower(word[0], test))
1015 #define is0(test) (numwords==1 && !stricmpwithlower(word[0], test))
1016 #define is1(test) (numwords==2 && !stricmpwithlower(word[0], test))
1017 #define is2(test) (numwords==3 && !stricmpwithlower(word[0], test))
1018 #define is3(test) (numwords==4 && !stricmpwithlower(word[0], test))
1019 #define par word[1]
1020
1021
2/3
✓ Branch 0 taken 25718 times.
✓ Branch 1 taken 25009 times.
✗ Branch 2 not taken.
50727 callstack_push cs_push(callstack_entry_type::BLOCK, block);
1022
1023 25009 int numwords;
1024
2/3
✓ Branch 0 taken 25718 times.
✓ Branch 1 taken 25009 times.
✗ Branch 2 not taken.
50727 string splitblock = block;
1025
1/2
✓ Branch 0 taken 50727 times.
✗ Branch 1 not taken.
50727 char ** word = qsplit(splitblock.temp_raw(), ' ', &numwords);
1026 50727 autoptr<char **> scope_word = word;
1027 // when writing out the data for the addrToLine mapping,
1028 // we want to write out the snespos we had before writing opcodes
1029 50727 int addrToLinePos = realsnespos & 0xFFFFFF;
1030
1031
6/6
✓ Branch 0 taken 25718 times.
✓ Branch 1 taken 25009 times.
✓ Branch 2 taken 8293 times.
✓ Branch 3 taken 17425 times.
✓ Branch 4 taken 8359 times.
✓ Branch 5 taken 16650 times.
50727 if (!word[0] || !word[0][0]) return;
1032
14/16
✓ Branch 0 taken 17161 times.
✓ Branch 1 taken 16650 times.
✓ Branch 2 taken 17260 times.
✓ Branch 3 taken 165 times.
✓ Branch 4 taken 16033 times.
✓ Branch 5 taken 17184 times.
✓ Branch 6 taken 339 times.
✓ Branch 7 taken 15859 times.
✓ Branch 8 taken 16824 times.
✓ Branch 9 taken 16822 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 174 times.
✓ Branch 13 taken 15084 times.
✓ Branch 14 taken 1566 times.
✓ Branch 15 taken 15084 times.
34075 if (is("if") || is("elseif") || is("while") || is("for"))
1033 {
1034 3132 whiletracker wstatus;
1035
1/2
✓ Branch 0 taken 3132 times.
✗ Branch 1 not taken.
3132 wstatus.startline = get_current_line();
1036 3132 wstatus.iswhile = is("while");
1037 3132 wstatus.cond = false;
1038 3132 wstatus.is_for = false;
1039 3132 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
1040 3132 wstatus.for_has_var_backup = false;
1041
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;
1042
1043 3132 bool is_for_cont = false;
1044 // if this is a for loop and a whilestatus entry already exists at this level,
1045 // and the for loop isn't finished, this is a continuation of the for loop
1046
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
1047
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)
1048 246 is_for_cont = true;
1049
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);
1050 //handle nested if statements
1051
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))
1052 {
1053
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++;
1054 162 return;
1055 }
1056
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++;
1057
1058
2/2
✓ Branch 0 taken 5304 times.
✓ Branch 1 taken 2970 times.
8274 for(int i = 1; i < numwords - 1; i++)
1059 {
1060
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2652 times.
5304 word[i][strlen(word[i])] = ' ';
1061 }
1062 2970 numwords = 2;
1063
1064 bool cond;
1065
3/3
✓ Branch 0 taken 1320 times.
✓ Branch 1 taken 1485 times.
✓ Branch 2 taken 165 times.
2970 if(!is("for"))
1066 {
1067
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1320 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1320 times.
2640 if(word[1] == NULL) asar_throw_error(0, error_type_block, error_id_broken_command, word[0], "Missing condition.");
1068
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();
1069 }
1070
1071
3/3
✓ Branch 0 taken 165 times.
✓ Branch 1 taken 1464 times.
✓ Branch 2 taken 1299 times.
2928 if (is("for"))
1072 {
1073
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 165 times.
330 if(word[1] == NULL) asar_throw_error(0, error_type_block, error_id_broken_command, word[0], "Missing loop range.");
1074
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 165 times.
✓ Branch 2 taken 165 times.
330 if(single_line_for_tracker != 1)
1075 {
1076 numif--;
1077 asar_throw_error(0, error_type_line, error_id_bad_single_line_for);
1078 }
1079
1080
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 246 times.
330 if(!is_for_cont)
1081 {
1082
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
84 char* past_eq = strchr(word[1], '=');
1083
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 84 times.
84 if(!past_eq)
1084 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "missing loop range");
1085
1086
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]);
1087 84 past_eq += 1;
1088
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 strip_whitespace(varname);
1089
2/4
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 84 times.
84 if(!validatedefinename(varname))
1090 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid define name");
1091
1092
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 char* range_sep = strqpstr(past_eq, "..");
1093
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 84 times.
84 if(!range_sep)
1094 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid loop range");
1095
1096
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);
1097
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 strip_whitespace(for_start);
1098
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);
1099
1/2
✓ Branch 0 taken 84 times.
✗ Branch 1 not taken.
84 strip_whitespace(for_end);
1100
1101
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();
1102
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();
1103
1104
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;
1105 84 addedwstatus.for_cur = addedwstatus.for_start;
1106 84 }
1107 246 else addedwstatus.for_cur++;
1108
1109 330 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
1110 330 single_line_for_tracker = 2;
1111
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)
1112 {
1113 246 numtrue++;
1114
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))
1115 {
1116 192 addedwstatus.for_has_var_backup = true;
1117
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);
1118 }
1119
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);
1120 }
1121 }
1122
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"))
1123 {
1124 if(0);
1125
2/2
✓ Branch 0 taken 1884 times.
✓ Branch 1 taken 432 times.
2316 else if (cond)
1126 {
1127 1884 numtrue++;
1128
1/2
✓ Branch 0 taken 1884 times.
✗ Branch 1 not taken.
1884 elsestatus[numif]=true;
1129 }
1130
1/2
✓ Branch 0 taken 432 times.
✗ Branch 1 not taken.
432 else if (!cond)
1131 {
1132
1/2
✓ Branch 0 taken 432 times.
✗ Branch 1 not taken.
432 elsestatus[numif]=false;
1133 }
1134 2316 addedwstatus.cond = cond;
1135 }
1136
2/3
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 141 times.
✗ Branch 2 not taken.
282 else if (is("elseif"))
1137 {
1138
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 282 times.
282 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_elseif);
1139
4/7
✓ 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.
282 if (whilestatus[numif - 1].iswhile) asar_throw_error(1, error_type_block, error_id_elseif_in_while);
1140
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 174 times.
282 if (numif==numtrue) numtrue--;
1141
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])
1142 {
1143 78 numtrue++;
1144
1/2
✓ Branch 0 taken 78 times.
✗ Branch 1 not taken.
78 elsestatus[numif]=true;
1145 }
1146 }
1147 2928 return;
1148 3132 }
1149
18/19
✓ Branch 0 taken 7128 times.
✓ Branch 1 taken 23815 times.
✓ Branch 2 taken 3267 times.
✓ Branch 3 taken 3597 times.
✓ Branch 4 taken 3531 times.
✓ Branch 5 taken 15661 times.
✓ Branch 6 taken 13791 times.
✓ Branch 7 taken 963 times.
✓ Branch 8 taken 2304 times.
✓ Branch 9 taken 14698 times.
✓ Branch 10 taken 1137 times.
✓ Branch 11 taken 4500 times.
✓ Branch 12 taken 12888 times.
✓ Branch 13 taken 14458 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 174 times.
✓ Branch 16 taken 2196 times.
✓ Branch 17 taken 1401 times.
✓ Branch 18 taken 13683 times.
30943 else if (is0("endif") || is0("endwhile") || is0("endfor"))
1150 {
1151
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2802 times.
2802 if (!numif)
1152 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1153
1/2
✓ Branch 0 taken 2802 times.
✗ Branch 1 not taken.
2802 whiletracker& thisws = whilestatus[numif - 1];
1154
1155
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")) ||
1156
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")) ||
1157
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")))
1158 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1159
1160
2/2
✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 714 times.
2802 if (numif==numtrue) numtrue--;
1161 2802 numif--;
1162
1163
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)
1164 {
1165
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;
1166
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 348 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 174 times.
348 if(moreonline)
1167 {
1168 // sabotage the whilestatus to prevent the loop running again
1169 // and spamming more of the same error
1170 thisws.for_cur = thisws.for_end;
1171 thisws.cond = false;
1172 asar_throw_error(0, error_type_block, error_id_bad_single_line_for);
1173 }
1174
1175
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)
1176 {
1177
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)
1178
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;
1179 else
1180
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);
1181 }
1182 }
1183 2802 return;
1184 }
1185
7/7
✓ Branch 0 taken 4326 times.
✓ Branch 1 taken 23815 times.
✓ Branch 2 taken 117 times.
✓ Branch 3 taken 2130 times.
✓ Branch 4 taken 2196 times.
✓ Branch 5 taken 14458 times.
✓ Branch 6 taken 13566 times.
28141 else if (is0("else"))
1186 {
1187
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 234 times.
234 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_else);
1188
10/17
✓ 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.
234 if (whilestatus[numif - 1].iswhile || whilestatus[numif - 1].is_for) asar_throw_error(1, error_type_block, error_id_else_in_while_loop);
1189
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 162 times.
234 else if (numif==numtrue) numtrue--;
1190
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])
1191 {
1192 60 numtrue++;
1193
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
60 elsestatus[numif]=true;
1194 }
1195 234 return;
1196 }
1197
2/2
✓ Branch 0 taken 1770 times.
✓ Branch 1 taken 26137 times.
27907 else if (numif!=numtrue) return;
1198
1199
19/19
✓ Branch 0 taken 13588 times.
✓ Branch 1 taken 13198 times.
✓ Branch 2 taken 12197 times.
✓ Branch 3 taken 1791 times.
✓ Branch 4 taken 11536 times.
✓ Branch 5 taken 11223 times.
✓ Branch 6 taken 15164 times.
✓ Branch 7 taken 20 times.
✓ Branch 8 taken 511 times.
✓ Branch 9 taken 12796 times.
✓ Branch 10 taken 11473 times.
✓ Branch 11 taken 24134 times.
✓ Branch 12 taken 264 times.
✓ Branch 13 taken 12535 times.
✓ Branch 14 taken 20 times.
✓ Branch 15 taken 538 times.
✓ Branch 16 taken 11997 times.
✓ Branch 17 taken 538 times.
✓ Branch 18 taken 12661 times.
27186 while (word[0] && (!word[1] || strcmp(word[1], "=")) && addlabel(word[0]))
1200 {
1201 1049 word++;
1202 1049 numwords--;
1203 }
1204
5/6
✓ Branch 0 taken 13057 times.
✓ Branch 1 taken 12640 times.
✓ Branch 2 taken 400 times.
✓ Branch 3 taken 13057 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 12261 times.
26097 if (!word[0] || !word[0][0]) return;
1205
1206 // recheck for any of the conditionals tested above
1207
5/9
✓ Branch 0 taken 13057 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 25318 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 13057 times.
✓ Branch 5 taken 12261 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12261 times.
✗ Branch 8 not taken.
50636 if(is("if") || is("elseif") || is("while") || is("for")
1208
19/27
✓ Branch 0 taken 25318 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2829 times.
✓ Branch 3 taken 22489 times.
✓ Branch 4 taken 1392 times.
✓ Branch 5 taken 1437 times.
✓ Branch 6 taken 1392 times.
✓ Branch 7 taken 13102 times.
✓ Branch 8 taken 12216 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1392 times.
✓ Branch 11 taken 13102 times.
✓ Branch 12 taken 1392 times.
✓ Branch 13 taken 1437 times.
✓ Branch 14 taken 12216 times.
✓ Branch 15 taken 11665 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2829 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 14494 times.
✓ Branch 20 taken 10824 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1437 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 12261 times.
50636 || is0("endif") || is0("endwhile") || is0("endfor") || is0("else"))
1209 {
1210 asar_throw_error(0, error_type_block, error_id_label_before_if, word[0]);
1211 }
1212
4/4
✓ Branch 0 taken 25298 times.
✓ Branch 1 taken 20 times.
✓ Branch 2 taken 10105 times.
✓ Branch 3 taken 15193 times.
25318 else if (asblock_pick(word, numwords))
1213 {
1214
1/2
✓ Branch 0 taken 10105 times.
✗ Branch 1 not taken.
10105 add_addr_to_line(addrToLinePos);
1215 }
1216
16/18
✓ Branch 0 taken 13924 times.
✓ Branch 1 taken 1269 times.
✓ Branch 2 taken 5398 times.
✓ Branch 3 taken 6450 times.
✓ Branch 4 taken 7444 times.
✓ Branch 5 taken 30 times.
✓ Branch 6 taken 5068 times.
✓ Branch 7 taken 4728 times.
✓ Branch 8 taken 78 times.
✓ Branch 9 taken 5020 times.
✓ Branch 10 taken 6498 times.
✓ Branch 11 taken 5932 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 48 times.
✓ Branch 15 taken 4080 times.
✓ Branch 16 taken 2454 times.
✓ Branch 17 taken 4737 times.
15193 else if (numwords > 1 && (is("db") || is("dw") || is("dl") || is("dd")))
1217 {
1218 4824 string line;
1219
2/2
✓ Branch 0 taken 4824 times.
✓ Branch 1 taken 4824 times.
9648 for(int i = 1; i < numwords; i++){
1220
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4824 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4824 if(i > 1) line += " ";
1221
2/4
✓ Branch 0 taken 2370 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2454 times.
✗ Branch 3 not taken.
4824 line += word[i];
1222 }
1223
2/3
✓ Branch 0 taken 2370 times.
✓ Branch 1 taken 2454 times.
✗ Branch 2 not taken.
4824 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
1224
1/2
✓ Branch 0 taken 4824 times.
✗ Branch 1 not taken.
4824 verify_paren(pars);
1225
1226 void (*do_write)(unsigned int);
1227 4824 char first = to_lower(word[0][1]);
1228
2/2
✓ Branch 0 taken 4068 times.
✓ Branch 1 taken 756 times.
4824 if (first == 'b') do_write = &write1;
1229
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 696 times.
756 else if (first == 'w') do_write = &write2;
1230
2/2
✓ Branch 0 taken 600 times.
✓ Branch 1 taken 96 times.
696 else if (first == 'l') do_write = &write3;
1231 96 else do_write = &write4;
1232
1233
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++)
1234 {
1235
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]=='"')
1236 {
1237
2/4
✓ Branch 0 taken 111 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 114 times.
✗ Branch 3 not taken.
225 char * str=const_cast<char*>(safedequote(pars[i]));
1238 225 int codepoint = 0u;
1239
1/2
✓ Branch 0 taken 225 times.
✗ Branch 1 not taken.
225 str += utf8_val(&codepoint, str);
1240
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 )
1241 {
1242
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));
1243
1/2
✓ Branch 0 taken 918 times.
✗ Branch 1 not taken.
918 str += utf8_val(&codepoint, str);
1244 }
1245
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 225 times.
225 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1246 }
1247 else
1248 {
1249
7/9
✓ Branch 0 taken 1813 times.
✓ Branch 1 taken 3632 times.
✓ Branch 2 taken 875 times.
✓ Branch 3 taken 11 times.
✓ Branch 4 taken 3566 times.
✓ Branch 5 taken 11 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2773 times.
✗ Branch 8 not taken.
5445 do_write((pass==2)?getnum(pars[i]):0);
1250 }
1251 }
1252
1/2
✓ Branch 0 taken 4802 times.
✗ Branch 1 not taken.
4802 add_addr_to_line(addrToLinePos);
1253 4846 }
1254
3/3
✓ Branch 0 taken 129 times.
✓ Branch 1 taken 5638 times.
✓ Branch 2 taken 4602 times.
10369 else if (is("assert"))
1255 {
1256 264 string errmsg;
1257
1/2
✓ Branch 0 taken 264 times.
✗ Branch 1 not taken.
264 if(numwords > 1) {
1258
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 264 times.
696 for(int i = 1; i < numwords - 1; i++)
1259 {
1260
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
432 word[i][strlen(word[i])] = ' ';
1261 }
1262 264 numwords = 2;
1263
2/4
✓ Branch 0 taken 129 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
264 autoptr<char**> tokens = qpsplit(word[1], ',');
1264
1/2
✓ Branch 0 taken 264 times.
✗ Branch 1 not taken.
264 verify_paren(tokens);
1265
10/10
✓ Branch 0 taken 129 times.
✓ Branch 1 taken 135 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 114 times.
✓ Branch 4 taken 15 times.
✓ Branch 5 taken 114 times.
✓ Branch 6 taken 15 times.
✓ Branch 7 taken 120 times.
✓ Branch 8 taken 15 times.
✓ Branch 9 taken 120 times.
264 if (tokens[0] != NULL && tokens[1] != NULL)
1266 {
1267 30 size_t pos = 1;
1268
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])
1269 {
1270
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 errmsg += tokens[pos];
1271
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)
1272 {
1273
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 errmsg += ",";
1274 }
1275 72 pos++;
1276 }
1277 }
1278 264 }
1279
1280
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 129 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 135 times.
264 if(word[1] == NULL) asar_throw_error(0, error_type_block, error_id_broken_command, "assert", "Missing condition.");
1281
4/4
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 27 times.
264 bool cond = getnum(word[1]);
1282
4/4
✓ Branch 0 taken 70 times.
✓ Branch 1 taken 140 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 58 times.
210 if (pass == 2 && !cond)
1283 {
1284
7/13
✓ 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 not taken.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 3 times.
✗ Branch 12 not taken.
36 if (errmsg) asar_throw_error(2, error_type_block, error_id_assertion_failed, (string(": ") + handle_print(errmsg.raw())).data());
1285 6 else asar_throw_error(2, error_type_block, error_id_assertion_failed, ".");
1286 }
1287 264 }
1288
4/4
✓ Branch 0 taken 261 times.
✓ Branch 1 taken 5242 times.
✓ Branch 2 taken 273 times.
✓ Branch 3 taken 4329 times.
10105 else if(word[0][0]=='%')
1289 {
1290
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);
1291 }
1292
7/7
✓ Branch 0 taken 7869 times.
✓ Branch 1 taken 1702 times.
✓ Branch 2 taken 60 times.
✓ Branch 3 taken 4409 times.
✓ Branch 4 taken 3460 times.
✓ Branch 5 taken 5242 times.
✓ Branch 6 taken 4269 times.
9571 else if (is1("undef"))
1293 {
1294
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);
1295
1296
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))
1297 {
1298
2/3
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
114 defines.remove(def);
1299 }
1300 else
1301 {
1302 6 asar_throw_error(0, error_type_block, error_id_define_not_found, def.data());
1303 }
1304 120 }
1305
7/7
✓ Branch 0 taken 741 times.
✓ Branch 1 taken 8710 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 354 times.
✓ Branch 4 taken 387 times.
✓ Branch 5 taken 5182 times.
✓ Branch 6 taken 4266 times.
9451 else if (is0("error"))
1306 {
1307 6 asar_throw_error(0, error_type_block, error_id_error_command, ".");
1308 }
1309
7/7
✓ Branch 0 taken 735 times.
✓ Branch 1 taken 8710 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 351 times.
✓ Branch 4 taken 384 times.
✓ Branch 5 taken 5179 times.
✓ Branch 6 taken 4263 times.
9445 else if (is0("warn"))
1310 {
1311
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 asar_throw_warning(2, warning_id_warn_command, ".");
1312 }
1313
7/7
✓ Branch 0 taken 7749 times.
✓ Branch 1 taken 1690 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 4352 times.
✓ Branch 4 taken 3397 times.
✓ Branch 5 taken 5179 times.
✓ Branch 6 taken 4254 times.
9439 else if (is1("error"))
1314 {
1315
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);
1316 // RPG Hacker: This used to be on pass 0, which had its merits (you don't want to miss a potentially critical
1317 // user-generated error, just because a bazillion other errors are thrown in passes before it). However, I
1318 // don't see how to support print functions with this without moving it to pass 2. Suggestions are welcome.
1319
3/7
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
54 asar_throw_error(2, error_type_block, error_id_error_command, (string(": ") + out).data());
1320 15 }
1321
7/7
✓ Branch 0 taken 7734 times.
✓ Branch 1 taken 1690 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 4352 times.
✓ Branch 4 taken 3382 times.
✓ Branch 5 taken 5179 times.
✓ Branch 6 taken 4233 times.
9424 else if (is1("warn"))
1322 {
1323
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);
1324
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 asar_throw_warning(2, warning_id_warn_command, (string(": ") + out).data());
1325 33 }
1326
7/7
✓ Branch 0 taken 7701 times.
✓ Branch 1 taken 1690 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 4331 times.
✓ Branch 4 taken 3370 times.
✓ Branch 5 taken 5158 times.
✓ Branch 6 taken 4209 times.
9391 else if (is1("warnings"))
1327 {
1328
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)
1329 {
1330
1/2
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
24 push_warnings();
1331 }
1332
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)
1333 {
1334
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
24 pull_warnings();
1335 }
1336 else
1337 {
1338 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1339 }
1340 }
1341
7/7
✓ Branch 0 taken 877 times.
✓ Branch 1 taken 8466 times.
✓ Branch 2 taken 42 times.
✓ Branch 3 taken 437 times.
✓ Branch 4 taken 440 times.
✓ Branch 5 taken 5134 times.
✓ Branch 6 taken 4167 times.
9343 else if (is2("warnings"))
1342 {
1343
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)
1344 {
1345
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]);
1346
1347
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if (warnid != warning_id_end)
1348 {
1349
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 set_warning_enabled(warnid, true);
1350 }
1351 else
1352 {
1353
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
6 asar_throw_warning(0, warning_id_invalid_warning_id, word[2], "warnings enable");
1354 }
1355 }
1356
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)
1357 {
1358
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]);
1359
1360
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 12 times.
66 if (warnid != warning_id_end)
1361 {
1362
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 set_warning_enabled(warnid, false);
1363 }
1364 else
1365 {
1366
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
12 asar_throw_warning(0, warning_id_invalid_warning_id, word[2], "warnings disable");
1367 }
1368 }
1369 else
1370 {
1371 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1372 }
1373 }
1374
7/7
✓ Branch 0 taken 7653 times.
✓ Branch 1 taken 1606 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 4307 times.
✓ Branch 4 taken 3346 times.
✓ Branch 5 taken 5092 times.
✓ Branch 6 taken 4146 times.
9259 else if(is1("global"))
1375 {
1376
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))
1377 {
1378 12 asar_throw_error(1, error_type_block, error_id_invalid_global_label, word[1]);
1379 }
1380 }
1381
7/7
✓ Branch 0 taken 793 times.
✓ Branch 1 taken 8424 times.
✓ Branch 2 taken 35 times.
✓ Branch 3 taken 395 times.
✓ Branch 4 taken 398 times.
✓ Branch 5 taken 5071 times.
✓ Branch 6 taken 4111 times.
9217 else if (is2("check"))
1382 {
1383
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)
1384 {
1385 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1386 // better here (not sure, though, it's worth discussing)
1387
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]);
1388 // randomdude999: this also removes leading spaces because itrim gets stuck in an endless
1389 // loop when multi is true and one argument is empty
1390 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1391
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
1392 {
1393 if (!ignoretitleerrors) // title errors shouldn't be ignored
1394 asar_throw_error(0, error_type_block, error_id_rom_too_short, expected_title.data());
1395 else // title errors should be ignored, throw a warning anyways
1396 asar_throw_warning(0, warning_id_rom_too_short, expected_title.data());
1397 }
1398 else {
1399 6 string actual_title;
1400 6 string actual_display_title;
1401
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 6 times.
132 for (int i = 0;i < 21;i++)
1402 {
1403 126 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1404
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 actual_title += (char)c;
1405 // the replacements are from interface-cli.cpp
1406
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == 7) c = 14;
1407
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == 8) c = 27;
1408
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == 9) c = 26;
1409
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == '\r') c = 17;
1410
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == '\n') c = 25;
1411
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
126 if (c == '\0') c = 155;
1412
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 actual_display_title += (char)c;
1413 }
1414
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)
1415 {
1416 if (!ignoretitleerrors) // title errors shouldn't be ignored
1417 asar_throw_error(0, error_type_block, error_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1418 else // title errors should be ignored, throw a warning anyways
1419 asar_throw_warning(0, warning_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1420 }
1421 6 }
1422 6 }
1423
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)
1424 {
1425 if (0);
1426
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"))
1427 {
1428 30 disable_bank_cross_errors = true;
1429 }
1430
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"))
1431 {
1432 32 disable_bank_cross_errors = false;
1433 32 check_half_banks_crossed = true;
1434 }
1435
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"))
1436 {
1437 2 disable_bank_cross_errors = false;
1438 2 check_half_banks_crossed = false;
1439 }
1440 else asar_throw_error(0, error_type_block, error_id_invalid_check);
1441
1442 }
1443 else
1444 {
1445 asar_throw_error(0, error_type_block, error_id_invalid_check);
1446 }
1447 }
1448
13/13
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 8418 times.
✓ Branch 2 taken 348 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 4286 times.
✓ Branch 5 taken 4075 times.
✓ Branch 6 taken 804 times.
✓ Branch 7 taken 4268 times.
✓ Branch 8 taken 18 times.
✓ Branch 9 taken 5036 times.
✓ Branch 10 taken 3307 times.
✓ Branch 11 taken 18 times.
✓ Branch 12 taken 4093 times.
9147 else if (is0("asar") || is1("asar"))
1449 {
1450
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
36 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1451
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
51 if (!par) return;
1452 36 int dots=0;
1453 36 int dig=0;
1454
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++)
1455 {
1456
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]=='.')
1457 {
1458
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
42 if (!dig) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1459 42 dig=0;
1460 42 dots++;
1461 }
1462
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++;
1463 else asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1464 }
1465
3/6
✓ 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.
36 if (!dig || !dots || dots>2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1466
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, '.');
1467
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
36 int vermaj=atoi(vers[0]);
1468
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 if (vermaj > asarver_maj) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1469
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 6 times.
36 if (vermaj<asarver_maj) return;
1470
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (dots==1)
1471 {
1472 if (strlen(vers[1])!=2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1473 //if (asarver_min<10 && asarver_bug<10 && strlen(vers[1])>2) error(0, "This version of Asar is too old for this patch.");
1474 int verminbug=atoi(vers[1]);
1475 int tmpver=asarver_bug;
1476 if (tmpver>9) tmpver=9;
1477 if (asarver_min*10+tmpver<verminbug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1478 }
1479 else
1480 {
1481
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
6 int vermin=atoi(vers[1]);
1482
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (vermin>asarver_min) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1483
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
6 int verbug=atoi(vers[2]);
1484
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
6 if (vermin==asarver_min && verbug>asarver_bug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1485 }
1486
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 30 times.
36 }
1487
13/13
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 8382 times.
✓ Branch 2 taken 347 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 4269 times.
✓ Branch 5 taken 4056 times.
✓ Branch 6 taken 788 times.
✓ Branch 7 taken 4265 times.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 5017 times.
✓ Branch 10 taken 3304 times.
✓ Branch 11 taken 4 times.
✓ Branch 12 taken 4089 times.
9111 else if (is0("include") || is1("includefrom"))
1488 {
1489
4/4
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 5 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 times.
8 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1490
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())
1491 {
1492
2/14
✗ 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.
2 if (par) asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, (string(" The main file is '") + par + "'.").data());
1493 2 else asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, "");
1494 }
1495 }
1496
7/7
✓ Branch 0 taken 727 times.
✓ Branch 1 taken 8376 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 347 times.
✓ Branch 4 taken 380 times.
✓ Branch 5 taken 5014 times.
✓ Branch 6 taken 4074 times.
9103 else if (is0("includeonce"))
1497 {
1498
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 const char* current_file = get_current_file_name();
1499
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))
1500 {
1501
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);
1502 }
1503 }
1504
7/8
✓ Branch 0 taken 723 times.
✓ Branch 1 taken 8350 times.
✓ Branch 2 taken 360 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 261 times.
✓ Branch 5 taken 462 times.
✓ Branch 6 taken 525 times.
✓ Branch 7 taken 4837 times.
9073 else if (numwords==3 && !stricmp(word[1], "="))
1505 {
1506
5/6
✓ Branch 0 taken 201 times.
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 402 times.
✓ Branch 3 taken 63 times.
✓ Branch 4 taken 201 times.
✗ Branch 5 not taken.
525 if(word[0][0] == '\'' && word[0][1])
1507 {
1508 201 int codepoint;
1509 402 const char* char_start = word[0]+1;
1510
1/2
✓ Branch 0 taken 402 times.
✗ Branch 1 not taken.
402 const char* after = char_start + utf8_val(&codepoint, char_start);
1511
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 402 times.
402 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1512
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') {
1513
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());
1514 396 return;
1515 } // todo: error checking here
1516 }
1517
2/4
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
123 auto expr = parse_math_expr(word[2]);
1518
4/7
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 60 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 63 times.
✗ Branch 6 not taken.
123 int num = expr->evaluate_non_forward().get_integer();
1519
2/4
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
123 bool is_static = expr->has_label() <= 1;
1520
1521 123 const char* newlabelname = word[0];
1522 123 bool ismacro = false;
1523
1524
3/3
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 60 times.
123 if (newlabelname[0] == '?')
1525 {
1526 6 ismacro = true;
1527 6 newlabelname++;
1528 }
1529
1530
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 117 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
123 if (ismacro && macrorecursion == 0)
1531 {
1532 asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
1533 }
1534
1535
3/4
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 60 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 63 times.
123 if (!confirmname(newlabelname)) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1536
1537 123 string completename;
1538
1539
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 117 times.
123 if (ismacro)
1540 {
1541
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) + "_";
1542 }
1543
1544
1/2
✓ Branch 0 taken 123 times.
✗ Branch 1 not taken.
123 completename += newlabelname;
1545
1546
4/6
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 60 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
123 setlabel(ns + completename, num, is_static);
1547 186 }
1548
3/4
✓ Branch 0 taken 8548 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8289 times.
✓ Branch 3 taken 259 times.
8548 else if (assemblemapper(word, numwords)) {}
1549
7/7
✓ Branch 0 taken 7548 times.
✓ Branch 1 taken 741 times.
✓ Branch 2 taken 414 times.
✓ Branch 3 taken 4337 times.
✓ Branch 4 taken 3211 times.
✓ Branch 5 taken 4706 times.
✓ Branch 6 taken 3169 times.
8289 else if (is1("org"))
1550 {
1551
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 909 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 495 times.
909 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1552
1/2
✓ Branch 0 taken 909 times.
✗ Branch 1 not taken.
909 freespaceend();
1553
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);
1554
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();
1555
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 907 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
907 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex(num, 6).data());
1556
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) asar_throw_warning(0, warning_id_set_middle_byte);
1557 907 snespos=(int)num;
1558 907 realsnespos=(int)num;
1559 907 startpos=(int)num;
1560 907 realstartpos=(int)num;
1561 907 snespos_valid = true;
1562 909 }
1563 #define ret_error(errid) { asar_throw_error(0, error_type_block, errid); return; }
1564 #define ret_error_params(errid, ...) { asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1565
3/3
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4211 times.
✓ Branch 2 taken 3121 times.
7380 else if (is("struct"))
1566 {
1567 //verifysnespos();
1568
6/8
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 48 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 48 times.
96 if (in_struct || in_sub_struct) ret_error(error_id_nested_struct);
1569
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 96 times.
96 if (numwords < 2) ret_error(error_id_missing_struct_params);
1570
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 96 times.
96 if (numwords > 4) ret_error(error_id_too_many_struct_params);
1571
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
96 if (!confirmname(word[1])) ret_error(error_id_invalid_struct_name);
1572
1573
7/10
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 70 times.
✓ Branch 3 taken 26 times.
✓ Branch 4 taken 22 times.
✓ Branch 5 taken 48 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 70 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 48 times.
96 if (structs.exists(word[1]) && pass == 0) ret_error_params(error_id_struct_redefined, word[1]);
1574
1575 96 static_struct = false;
1576 96 old_snespos = snespos;
1577 96 old_startpos = startpos;
1578 96 old_optimizeforbank = optimizeforbank;
1579
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 old_snespos_valid = snespos_valid;
1580 96 unsigned int base = 0;
1581
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 66 times.
96 if (numwords == 3)
1582 {
1583 30 static_struct = true;
1584
2/4
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 15 times.
✗ Branch 3 not taken.
30 auto base_expr = parse_math_expr(word[2]);
1585
4/8
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✓ 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.
60 base = base_expr->evaluate().get_integer();
1586
1587
4/8
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 15 times.
✓ Branch 4 taken 15 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
30 if (base_expr->has_label() > 1) static_struct = false;
1588
2/2
✓ Branch 0 taken 20 times.
✓ Branch 1 taken 10 times.
30 if (pass > 0) {
1589 // foundlabel_static isn't accurate anymore
1590
6/13
✓ Branch 0 taken 10 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 10 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✓ Branch 10 taken 10 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 10 times.
20 if(structs.exists(word[1])) static_struct &= structs.find(word[1]).is_static;
1591 }
1592 30 }
1593
1594
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 bool old_in_struct = in_struct;
1595
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 bool old_in_sub_struct = in_sub_struct;
1596
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 30 times.
✓ Branch 3 taken 30 times.
96 in_struct = numwords == 2 || numwords == 3;
1597 96 in_sub_struct = numwords == 4;
1598
1599 #define ret_error_cleanup(errid) { in_struct = old_in_struct; in_sub_struct = old_in_sub_struct; asar_throw_error(0, error_type_block, errid); return; }
1600 #define ret_error_params_cleanup(errid, ...) { in_struct = old_in_struct; in_sub_struct = old_in_sub_struct; asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1601
1602
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 66 times.
96 if (numwords == 3)
1603 {
1604
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
30 if (base&~0xFFFFFF) ret_error_params_cleanup(error_id_snes_address_out_of_bounds, hex((unsigned int)base, 6).data());
1605 30 snespos = (int)base;
1606 30 startpos = (int)base;
1607 }
1608
2/2
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 36 times.
66 else if (numwords == 4)
1609 {
1610
3/6
✓ 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.
30 if (strcasecmp(word[2], "extends")) ret_error_cleanup(error_id_missing_extends);
1611
3/6
✗ 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.
30 if (!confirmname(word[3])) ret_error_cleanup(error_id_struct_invalid_parent_name);
1612
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];
1613
1614
2/4
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
30 if (!structs.exists(tmp_struct_parent)) ret_error_params_cleanup(error_id_struct_not_found, tmp_struct_parent.data());
1615
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);
1616
1617
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 15 times.
30 static_struct = structure.is_static;
1618
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 struct_parent = tmp_struct_parent;
1619 30 snespos = structure.base_end;
1620 30 startpos = structure.base_end;
1621
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
30 }
1622
1623
1/2
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
96 push_pc();
1624
1625 96 optimizeforbank = -1;
1626
1627
2/4
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
96 struct_name = word[1];
1628 96 struct_base = snespos;
1629 96 realsnespos = 0;
1630 96 realstartpos = 0;
1631 96 snespos_valid = true;
1632
1633
4/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 33 times.
96 if(in_sub_struct) {
1634
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;
1635
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);
1636 30 } else {
1637
5/8
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 33 times.
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 33 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 33 times.
✗ Branch 7 not taken.
66 setlabel(ns + struct_name, snespos, static_struct);
1638 }
1639
1640 #undef ret_error_cleanup
1641 #undef ret_error_params_cleanup
1642 }
1643
3/3
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 4163 times.
✓ Branch 2 taken 3073 times.
7284 else if (is("endstruct"))
1644 {
1645
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
96 if (numwords != 1 && numwords != 3) ret_error(error_id_invalid_endstruct_count);
1646
5/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 90 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 51 times.
96 if (numwords == 3 && strcasecmp(word[1], "align")) ret_error(error_id_expected_align);
1647
6/8
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 15 times.
✓ Branch 3 taken 48 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 15 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 15 times.
96 if (!in_struct && !in_sub_struct) ret_error(error_id_endstruct_without_struct);
1648
1649
4/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
96 int alignment = numwords == 3 ? (int)getnum(word[2]) : 1;
1650
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 96 times.
96 if (alignment < 1) ret_error(error_id_alignment_too_small);
1651
1652 96 snes_struct structure;
1653 96 structure.base_end = snespos;
1654
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1655 96 structure.object_size = structure.struct_size;
1656
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 structure.is_static = static_struct;
1657
1658
4/4
✓ Branch 0 taken 33 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 15 times.
96 if (in_struct)
1659 {
1660
3/5
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 33 times.
✓ Branch 3 taken 33 times.
✗ Branch 4 not taken.
66 structs.create(struct_name) = structure;
1661 }
1662
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)
1663 {
1664 30 snes_struct parent;
1665
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);
1666
1667
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 6 times.
30 if (parent.object_size < parent.struct_size + structure.struct_size) {
1668 24 parent.object_size = parent.struct_size + structure.struct_size;
1669 }
1670
1671
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;
1672
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;
1673 30 }
1674
1675
1/2
✓ Branch 0 taken 96 times.
✗ Branch 1 not taken.
96 pop_pc();
1676 96 in_struct = false;
1677 96 in_sub_struct = false;
1678 96 snespos = old_snespos;
1679 96 startpos = old_startpos;
1680 96 optimizeforbank = old_optimizeforbank;
1681
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
96 snespos_valid = old_snespos_valid;
1682 96 static_struct = false;
1683 96 }
1684 #undef ret_error
1685
3/3
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4115 times.
✓ Branch 2 taken 3067 times.
7188 else if(is("spcblock"))
1686 {
1687 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1688
6/8
✓ 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.
12 if(in_struct || in_sub_struct) asar_throw_error(0, error_type_block, error_id_spcblock_inside_struct);
1689
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if(numwords < 2) asar_throw_error(0, error_type_block, error_id_spcblock_too_few_args);
1690
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if(numwords > 4) asar_throw_error(0, error_type_block, error_id_spcblock_too_many_args);
1691
1692
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);
1693 12 spcblock.type = spcblock_nspc;
1694
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 spcblock.macro_name = "";
1695
1696
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 if (spcblock.destination&~0xFFFF) asar_throw_error(0, error_type_block, error_id_snes_address_out_of_bounds, hex(spcblock.destination, 6).data());
1697
1698
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if(numwords == 3)
1699 {
1700 if(!stricmp(word[2], "nspc")) spcblock.type = spcblock_nspc;
1701 else if(!stricmp(word[2], "custom")) asar_throw_error(0, error_type_block, error_id_custom_spcblock_missing_macro);
1702 else asar_throw_error(0, error_type_block, error_id_unknown_spcblock_type);
1703 }
1704
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 else if(numwords == 4)
1705 {
1706 if(!stricmp(word[2], "custom")) spcblock.type = spcblock_custom;
1707 else asar_throw_error(0, error_type_block, error_id_extra_spcblock_arg_for_type);
1708
1709 if(macros.exists(word[3]))
1710 {
1711 macrodata *macro = macros.find(word[3]);
1712 if(!macro->variadic) asar_throw_error(0, error_type_block, error_id_spcblock_macro_must_be_varadic);
1713 if(macro->numargs != 3) asar_throw_error(0, error_type_block, error_id_spcblock_macro_invalid_static_args);
1714 spcblock.macro_name = word[3];
1715 }
1716 else asar_throw_error(0, error_type_block, error_id_spcblock_macro_doesnt_exist);
1717 }
1718
1719
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)
1720 {
1721 12 case spcblock_nspc:
1722 12 spcblock.size_address=realsnespos;
1723
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 write2(0x0000);
1724
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 write2(spcblock.destination);
1725 12 snespos=(int)spcblock.destination;
1726 12 startpos=(int)spcblock.destination;
1727
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 add_addr_to_line(addrToLinePos);
1728 12 break;
1729 case spcblock_custom:
1730 //this is a todo that probably won't be ready for 1.9
1731 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1732 asar_throw_error(0, error_type_block, error_id_spcblock_custom_types_incomplete);
1733 push_pc();
1734 spcblock.old_mapper = mapper;
1735 mapper = norom;
1736 break;
1737 default:
1738 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1739 }
1740
1741
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 ns_backup = ns;
1742
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;
1743 12 in_spcblock = true;
1744 }
1745
3/3
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4109 times.
✓ Branch 2 taken 3061 times.
7176 else if(is("endspcblock"))
1746 {
1747
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
12 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_endspcblock_without_spcblock);
1748
1749
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)
1750 {
1751 12 case spcblock_nspc:
1752
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 8 times.
12 if (pass==2)
1753 {
1754 4 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1755
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
4 if (pcpos<0) asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
1756 4 int num=snespos-startpos;
1757
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 writeromdata_byte(pcpos, (unsigned char)num);
1758
1/2
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
4 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1759 }
1760
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
12 if (numwords == 3)
1761 {
1762
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")) asar_throw_error(0, error_type_null, error_id_invalid_endspcblock_arg, par);
1763 else
1764 {
1765
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 write2(0x0000);
1766
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);
1767 }
1768 }
1769
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 else if (numwords != 1)
1770 {
1771 asar_throw_error(0, error_type_null, error_id_unknown_endspcblock_format);
1772 }
1773 12 break;
1774 case spcblock_custom:
1775 mapper = spcblock.old_mapper;
1776 pop_pc();
1777 break;
1778 default:
1779 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1780 }
1781
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 ns = ns_backup;
1782 12 in_spcblock = false;
1783 }
1784
7/7
✓ Branch 0 taken 6591 times.
✓ Branch 1 taken 573 times.
✓ Branch 2 taken 51 times.
✓ Branch 3 taken 3818 times.
✓ Branch 4 taken 2773 times.
✓ Branch 5 taken 4103 times.
✓ Branch 6 taken 3010 times.
7164 else if (is1("base"))
1785 {
1786
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"))
1787 {
1788 30 snespos=realsnespos;
1789 30 startpos=realstartpos;
1790 30 snespos_valid = realsnespos >= 0;
1791 30 return;
1792 }
1793
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();
1794
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
72 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num).data());
1795 72 snespos=(int)num;
1796 72 startpos=(int)num;
1797 72 optimizeforbank=-1;
1798 72 snespos_valid = realsnespos >= 0;
1799 }
1800
7/7
✓ Branch 0 taken 6489 times.
✓ Branch 1 taken 573 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 3767 times.
✓ Branch 4 taken 2722 times.
✓ Branch 5 taken 4052 times.
✓ Branch 6 taken 3004 times.
7062 else if (is1("dpbase"))
1801 {
1802
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();
1803
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
12 if (num&~0xFF00) asar_throw_error(1, error_type_block, error_id_bad_dp_base, hex((unsigned int)num, 6).data());
1804 12 dp_base = (int)num;
1805 }
1806
7/7
✓ Branch 0 taken 156 times.
✓ Branch 1 taken 6894 times.
✓ Branch 2 taken 51 times.
✓ Branch 3 taken 78 times.
✓ Branch 4 taken 78 times.
✓ Branch 5 taken 4046 times.
✓ Branch 6 taken 2953 times.
7050 else if (is2("optimize"))
1807 {
1808
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"))
1809 {
1810
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"))
1811 {
1812 24 optimize_dp = optimize_dp_flag::NONE;
1813 24 return;
1814 }
1815
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"))
1816 {
1817 6 optimize_dp = optimize_dp_flag::RAM;
1818 6 return;
1819 }
1820
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"))
1821 {
1822 12 optimize_dp = optimize_dp_flag::ALWAYS;
1823 12 return;
1824 }
1825 asar_throw_error(1, error_type_block, error_id_bad_dp_optimize, word[2]);
1826 }
1827
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"))
1828 {
1829
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"))
1830 {
1831 24 optimize_address = optimize_address_flag::DEFAULT;
1832 24 return;
1833 }
1834
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"))
1835 {
1836 18 optimize_address = optimize_address_flag::RAM;
1837 18 return;
1838 }
1839
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"))
1840 {
1841 18 optimize_address = optimize_address_flag::MIRRORS;
1842 18 return;
1843 }
1844 asar_throw_error(1, error_type_block, error_id_bad_address_optimize, word[2]);
1845 }
1846 asar_throw_error(1, error_type_block, error_id_bad_optimize, par);
1847 }
1848
7/7
✓ Branch 0 taken 6477 times.
✓ Branch 1 taken 471 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 3761 times.
✓ Branch 4 taken 2716 times.
✓ Branch 5 taken 3995 times.
✓ Branch 6 taken 2944 times.
6948 else if (is1("bank"))
1849 {
1850
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"))
1851 {
1852 6 optimizeforbank=-1;
1853 6 return;
1854 }
1855
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"))
1856 {
1857 6 optimizeforbank=0x140;
1858 6 return;
1859 }
1860
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);
1861 //if (forwardlabel) error(0, "bank Label is not valid");
1862 //if (foundlabel) num>>=16;
1863
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
6 if (num&~0x0000FF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num, 6).data());
1864 6 optimizeforbank=(int)num;
1865 }
1866
14/16
✓ Branch 0 taken 3983 times.
✓ Branch 1 taken 2944 times.
✓ Branch 2 taken 3425 times.
✓ Branch 3 taken 561 times.
✓ Branch 4 taken 3254 times.
✓ Branch 5 taken 2548 times.
✓ Branch 6 taken 612 times.
✓ Branch 7 taken 3203 times.
✓ Branch 8 taken 2995 times.
✓ Branch 9 taken 3371 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 51 times.
✓ Branch 13 taken 2161 times.
✓ Branch 14 taken 783 times.
✓ Branch 15 taken 2161 times.
6930 else if (is("freespace") || is("freecode") || is("freedata") || is("segment"))
1867 {
1868
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1566 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 783 times.
1566 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1869
1870
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;
1871
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;
1872
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;
1873
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;
1874
1875 1566 string parstr;
1876
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="";
1877
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];
1878 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1879
1/2
✓ Branch 0 taken 1566 times.
✗ Branch 1 not taken.
1566 parse_freespace_arguments(this_fs_settings, parstr);
1880
1881
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;
1882
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1566 times.
1566 if(this_fs_settings.bank == -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1883 // no point specifying anything about cleaning when not writing a rats tag
1884
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 &&
1885
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))
1886 asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1887
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;
1888
1/2
✓ Branch 0 taken 1566 times.
✗ Branch 1 not taken.
1566 freespaceend();
1889 1566 freespaceid = freespaceidnext++;
1890
1/2
✓ Branch 0 taken 1566 times.
✗ Branch 1 not taken.
1566 freespace_data& thisfs = freespaces[freespaceid];
1891
1892
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 1044 times.
1566 if (pass==0) {
1893
2/3
✓ Branch 0 taken 261 times.
✓ Branch 1 taken 261 times.
✗ Branch 2 not taken.
522 thisfs = this_fs_settings;
1894 522 thisfs.pos = -1;
1895 522 thisfs.leaked = true;
1896 522 thisfs.orgpos = -2;
1897 522 thisfs.orglen = -1;
1898 522 snespos=0;
1899 }
1900
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 1044 times.
1566 if (pass==1)
1901 {
1902
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)
1903 {
1904 thisfs.pos = 0;
1905 thisfs.leaked = false;//mute some other errors
1906 asar_throw_error(1, error_type_block, error_id_static_freespace_autoclean);
1907 }
1908 522 snespos = 0;
1909 }
1910
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 1044 times.
1566 if (pass==2)
1911 {
1912
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????)
1913 522 snespos=thisfs.pos;
1914
7/11
✓ 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 taken 228 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 228 times.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
522 if (thisfs.leaked && !thisfs.flag_cleaned) asar_throw_warning(2, warning_id_freespace_leaked);
1915
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;
1916
1917 // add a mapping for the start of the rats tag
1918
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);
1919 }
1920
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 && mapper == sa1rom) asar_throw_error(pass, error_type_fatal, error_id_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1921
1/6
✗ 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.
1566 if (snespos < 0) asar_throw_error(pass, error_type_fatal, error_id_no_freespace, dec(thisfs.len).data());
1922
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;
1923 1566 freespacestart=snespos;
1924 1566 startpos=snespos;
1925 1566 realstartpos=snespos;
1926 1566 realsnespos=snespos;
1927 1566 optimizeforbank=-1;
1928
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;
1929 1566 snespos_valid = true;
1930 // check this at the very end so that snespos gets set properly, to
1931 // prevent spurious errors later
1932 //...i guess this can still cause bankcross errors if the old freespace
1933 //happened to be very close to the end of a bank or something, but
1934 //whatever
1935
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)
1936 2 asar_throw_error(2, error_type_block, error_id_static_freespace_growing);
1937
2/4
✓ Branch 0 taken 1564 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1564 times.
✗ Branch 3 not taken.
1568 }
1938
7/7
✓ Branch 0 taken 5103 times.
✓ Branch 1 taken 261 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3074 times.
✓ Branch 4 taken 2029 times.
✓ Branch 5 taken 3203 times.
✓ Branch 6 taken 2158 times.
5364 else if (is1("freespace_settings"))
1939 {
1940
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];
1941
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 parse_freespace_arguments(default_freespace_settings, arg);
1942 6 }
1943
7/7
✓ Branch 0 taken 5097 times.
✓ Branch 1 taken 261 times.
✓ Branch 2 taken 21 times.
✓ Branch 3 taken 3071 times.
✓ Branch 4 taken 2026 times.
✓ Branch 5 taken 3200 times.
✓ Branch 6 taken 2137 times.
5358 else if (is1("prot"))
1944 {
1945
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
42 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1946
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 21 times.
42 if (!ratsmetastate) asar_throw_error(2, error_type_block, error_id_prot_not_at_freespace_start);
1947
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);
1948 21 int num;
1949
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);
1950
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 verify_paren(pars);
1951
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('P');
1952
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('R');
1953
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('O');
1954
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('T');
1955
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 42 times.
42 if (num * 3 > 255) asar_throw_error(0, error_type_block, error_id_prot_too_many_entries);
1956
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1((unsigned int)(num*3));
1957
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 42 times.
96 for (int i=0;i<num;i++)
1958 {
1959 54 const char * labeltest=pars[i];
1960
2/3
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
54 string testlabel = labeltest;
1961
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 snes_label lblval = labelval(&labeltest);
1962
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
54 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, testlabel.data());
1963
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 write3(lblval.pos);
1964
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;
1965 54 }
1966
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('S');
1967
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('T');
1968
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('O');
1969
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1('P');
1970
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 write1(0);
1971 42 ratsmetastate=ratsmeta_used;
1972
1973
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 add_addr_to_line(addrToLinePos);
1974 42 }
1975
13/13
✓ Branch 0 taken 5055 times.
✓ Branch 1 taken 261 times.
✓ Branch 2 taken 3050 times.
✓ Branch 3 taken 2005 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 3179 times.
✓ Branch 6 taken 2119 times.
✓ Branch 7 taken 18 times.
✓ Branch 8 taken 9 times.
✓ Branch 9 taken 3179 times.
✓ Branch 10 taken 18 times.
✓ Branch 11 taken 9 times.
✓ Branch 12 taken 2128 times.
5316 else if (is1("autoclean") || is2("autoclean"))
1976 {
1977
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
18 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1978
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (numwords==3)
1979 {
1980 18 const char * labeltest = word[2];
1981
2/3
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
18 string testlabel = labeltest;
1982
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")) {
1983
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 handle_autoclean(testlabel, -1, snespos);
1984
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);
1985
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
1986 } else {
1987 // other ones are handled in arch-65816
1988 asar_throw_error(0, error_type_block, error_id_broken_autoclean);
1989 }
1990 18 }
1991 else if (pass==0) removerats(parse_math_expr(word[1])->evaluate_static().get_integer(), freespacebyte);
1992 }
1993
7/7
✓ Branch 0 taken 5055 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3050 times.
✓ Branch 4 taken 2005 times.
✓ Branch 5 taken 3170 times.
✓ Branch 6 taken 2125 times.
5298 else if (is1("freespacebyte"))
1994 {
1995
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();
1996 }
1997
7/7
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 75 times.
✓ Branch 4 taken 78 times.
✓ Branch 5 taken 3167 times.
✓ Branch 6 taken 2122 times.
5292 else if (is0("pushpc"))
1998 {
1999
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 verifysnespos();
2000
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].arch=arch;
2001
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].snespos=snespos;
2002
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].snesstart=startpos;
2003
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].snesposreal=realsnespos;
2004
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].snesstartreal=realstartpos;
2005
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].freeid=freespaceid;
2006
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 pushpc[pushpcnum].freest=freespacestart;
2007 6 pushpcnum++;
2008 6 snespos=(int)0xFFFFFFFF;
2009 6 startpos= (int)0xFFFFFFFF;
2010 6 realsnespos= (int)0xFFFFFFFF;
2011 6 realstartpos= (int)0xFFFFFFFF;
2012 6 snespos_valid = false;
2013 }
2014
7/7
✓ Branch 0 taken 147 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 72 times.
✓ Branch 4 taken 75 times.
✓ Branch 5 taken 3164 times.
✓ Branch 6 taken 2119 times.
5286 else if (is0("pullpc"))
2015 {
2016
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!pushpcnum) asar_throw_error(0, error_type_block, error_id_pullpc_without_pushpc);
2017 6 pushpcnum--;
2018
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 freespaceend();
2019
3/5
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 3 times.
6 if (arch != pushpc[pushpcnum].arch) asar_throw_error(0, error_type_block, error_id_pullpc_different_arch);
2020
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 snespos=pushpc[pushpcnum].snespos;
2021
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 startpos=pushpc[pushpcnum].snesstart;
2022
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 realsnespos=pushpc[pushpcnum].snesposreal;
2023
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 realstartpos=pushpc[pushpcnum].snesstartreal;
2024
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 freespaceid=pushpc[pushpcnum].freeid;
2025
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 freespacestart=pushpc[pushpcnum].freest;
2026 6 snespos_valid = true;
2027 }
2028
7/7
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 69 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 3161 times.
✓ Branch 6 taken 2116 times.
5280 else if (is0("pushbase"))
2029 {
2030
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 basestack[basestacknum] = snespos;
2031 6 basestacknum++;
2032 }
2033
7/7
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 69 times.
✓ Branch 5 taken 3158 times.
✓ Branch 6 taken 2113 times.
5274 else if (is0("pullbase"))
2034 {
2035
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (!basestacknum) asar_throw_error(0, error_type_block, error_id_pullbase_without_pushbase);
2036 6 basestacknum--;
2037
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 snespos = basestack[basestacknum];
2038
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 startpos = basestack[basestacknum];
2039
2040
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if (snespos != realstartpos)
2041 {
2042 6 optimizeforbank = -1;
2043 }
2044 }
2045
7/7
✓ Branch 0 taken 129 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 63 times.
✓ Branch 4 taken 66 times.
✓ Branch 5 taken 3155 times.
✓ Branch 6 taken 2107 times.
5268 else if (is0("pushns"))
2046 {
2047
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
12 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2048
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;
2049
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
24 for(int i = 0; i < namespace_list.count; i++)
2050 {
2051
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]);
2052 }
2053
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;
2054 12 pushnsnum++;
2055
2056 12 namespace_list.reset();
2057
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 ns = "";
2058 12 nested_namespaces = false;
2059 }
2060
7/7
✓ Branch 0 taken 117 times.
✓ Branch 1 taken 5139 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 57 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 3149 times.
✓ Branch 6 taken 2101 times.
5256 else if (is0("pullns"))
2061 {
2062
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
12 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2063
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 if (!pushnsnum) asar_throw_error(0, error_type_block, error_id_pullns_without_pushns);
2064 12 pushnsnum--;
2065
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;
2066
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;
2067 12 namespace_list.reset();
2068
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++)
2069 {
2070
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]);
2071 }
2072 }
2073
11/13
✓ Branch 0 taken 5049 times.
✓ Branch 1 taken 195 times.
✓ Branch 2 taken 2984 times.
✓ Branch 3 taken 1999 times.
✓ Branch 4 taken 84 times.
✓ Branch 5 taken 3080 times.
✓ Branch 6 taken 2035 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 81 times.
✓ Branch 9 taken 3080 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 84 times.
✓ Branch 12 taken 2017 times.
5244 else if (is1("namespace") || is2("namespace"))
2074 {
2075
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 165 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 84 times.
165 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2076 165 bool leave = false;
2077
2/4
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 84 times.
✗ Branch 3 not taken.
165 if (par)
2078 {
2079
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"))
2080 {
2081
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
48 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2082 48 leave = true;
2083 }
2084
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"))
2085 {
2086
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
36 if (!word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2087
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;
2088
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;
2089 }
2090 else
2091 {
2092
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
81 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2093
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);
2094
3/4
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 39 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 42 times.
81 if (!confirmname(tmpstr)) asar_throw_error(0, error_type_block, error_id_invalid_namespace_name);
2095
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)
2096 {
2097 33 namespace_list.reset();
2098 }
2099
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);
2100 }
2101 }
2102 else
2103 {
2104 leave = true;
2105 }
2106
2107
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 117 times.
165 if (leave)
2108 {
2109
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)
2110 {
2111 36 namespace_list.remove(namespace_list.count - 1);
2112 }
2113 else
2114 {
2115 12 namespace_list.reset();
2116 }
2117 }
2118
2119 // recompute ns
2120
1/2
✓ Branch 0 taken 165 times.
✗ Branch 1 not taken.
165 ns = "";
2121
2/2
✓ Branch 0 taken 195 times.
✓ Branch 1 taken 165 times.
360 for (int i = 0; i < namespace_list.count; i++)
2122 {
2123
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];
2124
1/2
✓ Branch 0 taken 195 times.
✗ Branch 1 not taken.
195 ns += "_";
2125 }
2126 }
2127
7/7
✓ Branch 0 taken 4920 times.
✓ Branch 1 taken 159 times.
✓ Branch 2 taken 2375 times.
✓ Branch 3 taken 1930 times.
✓ Branch 4 taken 2990 times.
✓ Branch 5 taken 2008 times.
✓ Branch 6 taken 696 times.
5079 else if (is1("incsrc"))
2128 {
2129 3696 string name;
2130 // RPG Hacker: Should this also throw on absolute paths?
2131 // E.g., on something starting with C:/ or whatever.
2132
5/6
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 2372 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1321 times.
✓ Branch 4 taken 3 times.
✓ Branch 5 taken 1318 times.
3696 if (strchr(par, '\\'))
2133 {
2134 6 asar_throw_error(0, error_type_block, error_id_platform_paths);
2135 }
2136
3/7
✓ Branch 0 taken 2372 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3690 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 1318 times.
✗ Branch 6 not taken.
3690 name=safedequote(par);
2137
2/2
✓ Branch 0 taken 165 times.
✓ Branch 1 taken 3525 times.
3690 assemblefile(name);
2138 3696 }
2139
7/7
✓ Branch 0 taken 1224 times.
✓ Branch 1 taken 159 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 609 times.
✓ Branch 4 taken 615 times.
✓ Branch 5 taken 687 times.
✓ Branch 6 taken 660 times.
1383 else if (is1("incbin"))
2140 {
2141 36 int len;
2142 72 int start=0;
2143 72 int end=0;
2144
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, ':'))
2145 {
2146 42 char * lengths=strqchr(par, ':');
2147 42 *lengths=0;
2148 42 lengths++;
2149
2150
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
42 char* split = strqpstr(lengths, "..");
2151
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 36 times.
42 if(!split) asar_throw_error(0, error_type_block, error_id_broken_incbin);
2152
2/3
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
36 string start_str(lengths, split-lengths);
2153
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 if(start_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2154
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();
2155
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);
2156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 30 times.
30 if(end_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2157
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();
2158 42 }
2159
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 const char* current_file = get_current_file_name();
2160 54 string name;
2161 // RPG Hacker: Should this also throw on absolute paths?
2162 // E.g., on something starting with C:/ or whatever.
2163
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, '\\'))
2164 {
2165 6 asar_throw_error(0, error_type_block, error_id_platform_paths);
2166 }
2167
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);
2168 24 char * data;//I couldn't find a way to get this into an autoptr
2169
7/12
✓ 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 taken 12 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 12 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 12 times.
✗ Branch 11 not taken.
48 if (!readfile(name, current_file, &data, &len)) asar_throw_error(0, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), name.data());
2170 36 autoptr<char*> datacopy=data;
2171
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 24 times.
36 if (!end) end=len;
2172
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
36 if(start < 0) asar_throw_error(0, error_type_block, error_id_file_offset_out_of_bounds, dec(start).data(), name.data());
2173
3/9
✓ 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.
36 if (end < start || end > len || end < 0) asar_throw_error(0, error_type_block, error_id_file_offset_out_of_bounds, dec(end).data(), name.data());
2174
2175
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]);
2176
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
2177 54 }
2178
9/9
✓ Branch 0 taken 357 times.
✓ Branch 1 taken 660 times.
✓ Branch 2 taken 330 times.
✓ Branch 3 taken 321 times.
✓ Branch 4 taken 330 times.
✓ Branch 5 taken 357 times.
✓ Branch 6 taken 330 times.
✓ Branch 7 taken 330 times.
✓ Branch 8 taken 330 times.
1311 else if (is("skip") || is("fill"))
2179 {
2180
4/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 654 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
660 if(numwords != 2 && numwords != 3 && numwords != 5) asar_throw_error(0, error_type_block, error_id_unknown_command);
2181
5/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 654 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 333 times.
660 if(numwords > 2 && stricmp(word[1], "align")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2182
5/8
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 654 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 333 times.
660 if(numwords == 5 && stricmp(word[3], "offset")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2183 int amount;
2184
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 654 times.
660 if(numwords > 2)
2185 {
2186
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();
2187 6 int offset = 0;
2188
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 if(numwords==5)
2189 {
2190
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();
2191 }
2192
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if(alignment > 0x800000) asar_throw_error(0, error_type_block, error_id_alignment_too_big);
2193
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if(alignment < 1) asar_throw_error(0, error_type_block, error_id_alignment_too_small);
2194
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if(alignment & (alignment-1)) asar_throw_error(0, error_type_block, error_id_invalid_alignment);
2195 // i just guessed this formula but it seems to work
2196 6 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
2197 }
2198 else
2199 {
2200
7/10
✓ Branch 0 taken 327 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 651 times.
✓ Branch 3 taken 3 times.
✓ Branch 4 taken 324 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 324 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 324 times.
✗ Branch 9 not taken.
663 amount = parse_math_expr(par)->evaluate_static().get_integer();
2201 }
2202
3/3
✓ Branch 0 taken 294 times.
✓ Branch 1 taken 327 times.
✓ Branch 2 taken 33 times.
654 if(is("skip")) step(amount);
2203 else
2204 {
2205
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]);
2206
1/2
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
66 add_addr_to_line(addrToLinePos);
2207 }
2208
2209 }
2210
7/7
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 546 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 51 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 321 times.
✓ Branch 6 taken 327 times.
651 else if (is0("cleartable"))
2211 {
2212
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 cleartable();
2213 }
2214
7/7
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 546 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 48 times.
✓ Branch 4 taken 51 times.
✓ Branch 5 taken 318 times.
✓ Branch 6 taken 324 times.
645 else if (is0("pushtable"))
2215 {
2216
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 tablestack.append(thetable);
2217 }
2218
7/7
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 546 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 48 times.
✓ Branch 5 taken 315 times.
✓ Branch 6 taken 321 times.
639 else if (is0("pulltable"))
2219 {
2220
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 if (tablestack.count <= 0) asar_throw_error(0, error_type_block, error_id_pulltable_without_table);
2221
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];
2222
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 tablestack.remove(tablestack.count-1);
2223 }
2224
7/7
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 312 times.
✓ Branch 2 taken 321 times.
✓ Branch 3 taken 24 times.
✓ Branch 4 taken 24 times.
✓ Branch 5 taken 312 times.
✓ Branch 6 taken 297 times.
633 else if (is("function") && numwords >= 3)
2225 {
2226
3/6
✓ 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.
48 if (stricmp(word[2], "=")) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2227
4/6
✓ 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.
48 if (!confirmqpar(word[1])) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2228
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];
2229
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 line.qnormalize();
2230 48 char * startpar=strqchr(line.data(), '(');
2231
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 48 times.
48 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2232 48 *startpar=0;
2233 48 startpar++;
2234
3/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
48 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_function_name);
2235 48 char * endpar=strqchr(startpar, ')');
2236 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nulls
2237
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
48 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2238 48 *endpar=0;
2239
2240 48 string pars;
2241
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 48 times.
108 for(int i = 3; i < numwords; i++){
2242
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 += " ";
2243
2/4
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 30 times.
✗ Branch 3 not taken.
60 pars += word[i];
2244 }
2245
2246
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
48 createuserfunc(line, startpar, pars.data());
2247 48 }
2248
7/7
✓ Branch 0 taken 498 times.
✓ Branch 1 taken 87 times.
✓ Branch 2 taken 156 times.
✓ Branch 3 taken 252 times.
✓ Branch 4 taken 246 times.
✓ Branch 5 taken 294 times.
✓ Branch 6 taken 135 times.
585 else if (is1("print"))
2249 {
2250
4/4
✓ Branch 0 taken 152 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 158 times.
✓ Branch 3 taken 4 times.
318 string out = handle_print(par);
2251
3/4
✓ Branch 0 taken 98 times.
✓ Branch 1 taken 212 times.
✓ Branch 2 taken 98 times.
✗ Branch 3 not taken.
310 if (pass==2) print(out);
2252 310 }
2253
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"))
2254 {
2255 if(0);
2256
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;
2257 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
2258 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
2259 }
2260
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"))
2261 {
2262 18 int len = 0;
2263
2/3
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
18 if (is("padbyte")) len=1;
2264
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
18 if (is("padword")) len=2;
2265
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
18 if (is("padlong")) len=3;
2266
2/3
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
18 if (is("paddword")) len=4;
2267
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();
2268
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 12 times.
156 for (int i=0;i<12;i+=len)
2269 {
2270 144 unsigned int tmpval=val;
2271
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 144 times.
288 for (int j=0;j<len;j++)
2272 {
2273 144 padbyte[i+j]=(unsigned char)tmpval;
2274 144 tmpval>>=8;
2275 }
2276 }
2277 }
2278
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"))
2279 {
2280
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (freespaceid > 0) asar_throw_error(0, error_type_block, error_id_pad_in_freespace);
2281
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);
2282
1/5
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
18 if ((unsigned int)num & 0xFF000000) asar_throw_error(0, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)num, 6).data());
2283
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
18 if (num>realsnespos)
2284 {
2285 12 int end=snestopc(num);
2286 12 int start=snestopc(realsnespos);
2287 12 int len=end-start;
2288
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]);
2289
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
12 add_addr_to_line(addrToLinePos);
2290 }
2291 }
2292
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"))
2293 {
2294 48 int len = 0;
2295
3/3
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 9 times.
48 if (is("fillbyte")) len=1;
2296
3/3
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
48 if (is("fillword")) len=2;
2297
3/3
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
48 if (is("filllong")) len=3;
2298
3/3
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 21 times.
48 if (is("filldword")) len=4;
2299
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();
2300
2/2
✓ Branch 0 taken 366 times.
✓ Branch 1 taken 42 times.
408 for (int i=0;i<12;i+=len)
2301 {
2302 366 unsigned int tmpval=val;
2303
2/2
✓ Branch 0 taken 504 times.
✓ Branch 1 taken 366 times.
870 for (int j=0;j<len;j++)
2304 {
2305 504 fillbyte[i+j]=(unsigned char)tmpval;
2306 504 tmpval>>=8;
2307 }
2308 }
2309 }
2310
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"))
2311 {
2312
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 45 times.
90 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2313
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; }
2314
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; }
2315
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; }
2316 asar_throw_error(0, error_type_block, error_id_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
2317 }
2318
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("}")) {}
2319 else
2320 {
2321 15 asar_throw_error(1, error_type_block, error_id_unknown_command);
2322 }
2323
2324
6/6
✓ Branch 0 taken 20867 times.
✓ Branch 1 taken 25987 times.
✓ Branch 2 taken 20867 times.
✓ Branch 3 taken 25987 times.
✓ Branch 4 taken 20867 times.
✓ Branch 5 taken 25987 times.
110477 }
2325
2326 12202 bool assemblemapper(char** word, int numwords)
2327 {
2328
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 5637 times.
12202 auto previous_mapper = mapper;
2329 if(0);
2330
7/7
✓ Branch 0 taken 907 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 440 times.
✓ Branch 4 taken 467 times.
✓ Branch 5 taken 6568 times.
✓ Branch 6 taken 5586 times.
12202 else if (is0("lorom"))
2331 {
2332 //this also makes xkas set snespos to $008000 for some reason
2333 99 mapper=lorom;
2334 }
2335
7/7
✓ Branch 0 taken 808 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 20 times.
✓ Branch 3 taken 395 times.
✓ Branch 4 taken 413 times.
✓ Branch 5 taken 6523 times.
✓ Branch 6 taken 5560 times.
12103 else if (is0("hirom"))
2336 {
2337 //xkas makes this point to $C00000
2338 46 mapper=hirom;
2339 }
2340
7/7
✓ Branch 0 taken 762 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 372 times.
✓ Branch 4 taken 390 times.
✓ Branch 5 taken 6500 times.
✓ Branch 6 taken 5554 times.
12057 else if (is0("exlorom"))
2341 {
2342 9 mapper = exlorom;
2343 }
2344
7/7
✓ Branch 0 taken 753 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 369 times.
✓ Branch 4 taken 384 times.
✓ Branch 5 taken 6497 times.
✓ Branch 6 taken 5548 times.
12048 else if (is0("exhirom"))
2345 {
2346 9 mapper=exhirom;
2347 }
2348
7/7
✓ Branch 0 taken 744 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 366 times.
✓ Branch 4 taken 378 times.
✓ Branch 5 taken 6494 times.
✓ Branch 6 taken 5539 times.
12039 else if (is0("sfxrom"))
2349 {
2350 15 mapper=sfxrom;
2351 }
2352
7/7
✓ Branch 0 taken 729 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 366 times.
✓ Branch 4 taken 363 times.
✓ Branch 5 taken 6494 times.
✓ Branch 6 taken 5512 times.
12024 else if (is0("norom"))
2353 {
2354 //$000000 would be the best snespos for this, but I don't care
2355 45 mapper=norom;
2356
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)
2357 6 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2358 }
2359
7/7
✓ Branch 0 taken 684 times.
✓ Branch 1 taken 11295 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 342 times.
✓ Branch 4 taken 342 times.
✓ Branch 5 taken 6470 times.
✓ Branch 6 taken 5506 times.
11979 else if (is0("fullsa1rom"))
2360 {
2361 9 mapper=bigsa1rom;
2362 }
2363
3/3
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6467 times.
✓ Branch 2 taken 5491 times.
11970 else if (is("sa1rom"))
2364 {
2365
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)
2366 {
2367
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
21 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2368
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]!=',' ||
2369
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]!=',' ||
2370
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]!=',' ||
2371
7/12
✓ 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 taken 12 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 12 times.
42 !is_digit(par[6]) || par[7]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2372 12 int len;
2373
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);
2374
1/2
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
21 verify_paren(pars);
2375
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 21 times.
21 if (len!=4) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2376
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
21 sa1banks[0]=(par[0]-'0')<<20;
2377
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
21 sa1banks[1]=(par[2]-'0')<<20;
2378
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
21 sa1banks[4]=(par[4]-'0')<<20;
2379
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
21 sa1banks[5]=(par[6]-'0')<<20;
2380 21 }
2381 else
2382 {
2383 6 sa1banks[0]=0<<20;
2384 6 sa1banks[1]=1<<20;
2385 6 sa1banks[4]=2<<20;
2386 6 sa1banks[5]=3<<20;
2387 }
2388 27 mapper=sa1rom;
2389 }
2390 11943 else return false;
2391
2392
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 259 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 146 times.
259 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2393
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){
2394 169 mapper_set = true;
2395
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){
2396 78 asar_throw_warning(1, warning_id_mapper_already_set);
2397 }
2398 259 return true;
2399 }
2400