asar coverage - build #130


src/asar/
File: src/asar/assembleblock.cpp
Date: 2024-01-22 10:47:55
Lines:
1349/1459
92.5%
Functions:
41/41
100.0%
Branches:
2042/3239
63.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 "platform/file-helpers.h"
7 #include "table.h"
8 #include "unicode.h"
9 #include <cinttypes>
10
11 #include "interface-shared.h"
12 #include "arch-shared.h"
13
14 int arch=arch_65816;
15
16 bool snespos_valid = false;
17 int snespos;
18 int realsnespos;
19 int startpos;
20 int realstartpos;
21
22 bool mapper_set = false;
23 bool warn_endwhile = true;
24 int label_counter = 0;
25
26 static int old_snespos;
27 static int old_startpos;
28 static int old_optimizeforbank;
29 static bool old_snespos_valid;
30 static int struct_base;
31 static string struct_name;
32 static string struct_parent;
33 static bool in_struct = false;
34 static bool in_sub_struct = false;
35 static bool static_struct = false;
36 static bool in_spcblock = false;
37
38 assocarr<snes_struct> structs;
39
40 static bool movinglabelspossible = false;
41
42 static bool disable_bank_cross_errors = false;
43 static bool check_half_banks_crossed = false;
44
45 int bytes;
46 static int freespaceuse=0;
47
48 static enum {
49 ratsmeta_ban,
50 ratsmeta_allow,
51 ratsmeta_used,
52 } ratsmetastate=ratsmeta_ban;
53
54 enum spcblock_type{
55 spcblock_nspc,
56 spcblock_custom
57 };
58
59 struct spcblock_data{
60 unsigned int destination;
61 spcblock_type type;
62 string macro_name;
63
64 unsigned int execute_address;
65 unsigned int size_address;
66 mapper_t old_mapper;
67 }spcblock;
68
69 600 int snestopc_pick(int addr)
70 {
71 1044 return snestopc(addr);
72 }
73
74 1310166 inline void verifysnespos()
75 {
76
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1310166 times.
1310166 if (!snespos_valid)
77 {
78 asar_throw_error(0, error_type_block, error_id_missing_org);
79 snespos=0x008000;
80 realsnespos=0x008000;
81 startpos=0x008000;
82 realstartpos=0x008000;
83 snespos_valid = true;
84 }
85 1310166 }
86
87 1656 static int fixsnespos(int inaddr, int step)
88 {
89 // randomdude999: turns out it wasn't very reliable at all.
90 /* // RPG Hacker: No idea how reliable this is.
91 // Might not work with some of the more exotic mappers.
92 return pctosnes(snestopc(inaddr) + step); */
93
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 1368 times.
1656 if (mapper == lorom) {
94
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 252 times.
288 if ((inaddr&0xFFFF)+step > 0xFFFF) {
95 // bank crossed
96 36 return inaddr+step+0x8000;
97 }
98 252 return inaddr+step;
99
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == hirom) {
100 if ((inaddr&0x400000) == 0) {
101 // system pages, need to account for low pages and stuff
102 if ((inaddr&0xFFFF)+step > 0xFFFF) {
103 return inaddr+step+0x8000;
104 }
105 }
106 return inaddr+step;
107
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exlorom) {
108 // exlorom has no mirroring so this should work fine
109 return pctosnes(snestopc(inaddr)+step);
110
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == exhirom) {
111 // apparently exhirom is pretty similar to hirom after all
112 if ((inaddr&0x400000) == 0) {
113 // system pages, need to account for low pages and stuff
114 if ((inaddr&0xFFFF)+step > 0xFFFF) {
115 return inaddr+step+0x8000;
116 }
117 }
118 return inaddr+step;
119
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sa1rom) {
120 if((inaddr&0x400000) == 0) {
121 // lorom area
122 if ((inaddr&0xFFFF)+step > 0xFFFF) {
123 return inaddr+step+0x8000;
124 }
125 return inaddr+step;
126 } else {
127 // hirom area
128 return inaddr+step;
129 }
130
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == sfxrom) {
131 if ((inaddr&0x400000) == 0) {
132 // lorom area
133 if ((inaddr&0xFFFF)+step > 0xFFFF) {
134 return inaddr+step+0x8000;
135 }
136 } else {
137 // hirom area
138 return inaddr+step;
139 }
140
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
684 } else if (mapper == bigsa1rom) {
141 // no mirrors here, so this should work
142 return pctosnes(snestopc(inaddr)+step);
143
1/2
✓ Branch 0 taken 684 times.
✗ Branch 1 not taken.
684 } else if (mapper == norom) {
144 1368 return inaddr+step;
145 }
146 return -1;
147 }
148
149 1309119 inline void step(int num)
150 {
151
2/2
✓ Branch 0 taken 828 times.
✓ Branch 1 taken 1308291 times.
1309119 if (disable_bank_cross_errors)
152 {
153 828 snespos = fixsnespos(snespos, num);
154 828 realsnespos = fixsnespos(realsnespos, num);
155
156 // RPG Hacker: Not adjusting startpos here will eventually throw
157 // an error in checkbankcross() if we set warn bankcross on again.
158 // As far as I can tell, those are pretty much just used for
159 // checking bank crossing, anyways, so it's hopefully save to just
160 // adjust them here.
161 828 startpos = snespos;
162 828 realstartpos = realsnespos;
163 }
164 else
165 {
166 1308291 snespos += num;
167 1308291 realsnespos += num;
168 }
169 1309119 bytes+=num;
170 1309119 }
171
172 1307319 inline void write1_65816(unsigned int num)
173 {
174 1307319 verifysnespos();
175
2/2
✓ Branch 0 taken 435683 times.
✓ Branch 1 taken 871636 times.
1307319 if (pass==2)
176 {
177 435683 int pcpos=snestopc(realsnespos&0xFFFFFF);
178
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435683 times.
435683 if (pcpos<0)
179 {
180 movinglabelspossible=true;
181 asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
182 }
183 435683 writeromdata_byte(pcpos, (unsigned char)num);
184
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 435683 times.
435683 if (pcpos>=romlen) romlen=pcpos+1;
185 }
186
4/4
✓ Branch 0 taken 435803 times.
✓ Branch 1 taken 871516 times.
✓ Branch 2 taken 26603 times.
✓ Branch 3 taken 409200 times.
1307319 if(pass == 1 && freespaceid == 0) {
187 26603 int pcpos = snestopc(realsnespos & 0xFFFFFF);
188
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 26603 times.
26603 if(pcpos < 0) asar_throw_error(pass, error_type_fatal, error_id_internal_error, "invalid pos in pass 1");
189 26603 addromwrite(pcpos, 1);
190
2/2
✓ Branch 0 taken 25724 times.
✓ Branch 1 taken 879 times.
26603 if (pcpos>=romlen) romlen=pcpos+1;
191 }
192 1307319 step(1);
193 1307319 ratsmetastate=ratsmeta_ban;
194 1307319 }
195
196 int recent_opcode_num = 0;
197
198 684816 void write1_pick(unsigned int num)
199 {
200
9/18
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 63 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 63 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 63 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 63 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 63 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 63 times.
✗ Branch 17 not taken.
685383 write1_65816(num);
201 1265229 }
202
203 85404 static bool asblock_pick(char** word, int numwords)
204 {
205 85404 recent_opcode_num = 1;
206
207
4/4
✓ Branch 0 taken 78366 times.
✓ Branch 1 taken 7038 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 78294 times.
85404 if (arch==arch_spc700 || in_spcblock) return asblock_spc700(word, numwords);
208
2/2
✓ Branch 0 taken 67332 times.
✓ Branch 1 taken 10962 times.
78294 if (arch==arch_65816) return asblock_65816(word, numwords);
209
1/2
✓ Branch 0 taken 10962 times.
✗ Branch 1 not taken.
10962 if (arch==arch_superfx) return asblock_superfx(word, numwords);
210 return true;
211 }
212
213 #define write1 write1_pick
214 #define snestopc snestopc_pick
215
216 29250 const char * safedequote(char * str)
217 {
218 29250 const char * tmp=dequote(str);
219
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 29250 times.
29250 if (!tmp) asar_throw_error(0, error_type_block, error_id_garbage_near_quoted_string);
220 29250 return tmp;
221 }
222
223 extern char romtitle[30];
224 extern bool stdlib;
225
226 5334 void write2(unsigned int num)
227 {
228 2670 write1(num);
229 5334 write1(num/256);
230 5334 }
231
232 3318 void write3(unsigned int num)
233 {
234 1659 write1(num);
235 3318 write1(num/256);
236 3318 write1(num/65536);
237 3318 }
238
239 342 void write4(unsigned int num)
240 {
241 171 write1(num);
242 342 write1(num/256);
243 342 write1(num/65536);
244 342 write1(num/16777216);
245 342 }
246
247 //these are NOT used by the math parser - see math.cpp for that
248 90 int read2(int insnespos)
249 {
250 45 int addr=snestopc(insnespos);
251
4/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 36 times.
90 if (addr<0 || addr+2>romlen_r) return -1;
252 return
253 72 romdata_r[addr ] |
254 72 (romdata_r[addr+1]<< 8);
255 }
256
257 198 int read3(int insnespos)
258 {
259 99 int addr=snestopc(insnespos);
260
3/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 99 times.
198 if (addr<0 || addr+3>romlen_r) return -1;
261 return
262 198 romdata_r[addr ] |
263 198 (romdata_r[addr+1]<< 8)|
264 198 (romdata_r[addr+2]<<16);
265 }
266
267 4266 int getlenfromchar(char c)
268 {
269 4266 c=(char)to_lower(c);
270
2/2
✓ Branch 0 taken 2133 times.
✓ Branch 1 taken 2133 times.
4266 if (c=='b') return 1;
271
2/2
✓ Branch 0 taken 1143 times.
✓ Branch 1 taken 1143 times.
2286 if (c=='w') return 2;
272
2/2
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 153 times.
306 if (c=='l') return 3;
273 18 asar_throw_error(0, error_type_block, error_id_invalid_opcode_length);
274 return -1;
275 }
276
277 assocarr<snes_label> labels;
278 static autoarray<int> poslabels;
279 static autoarray<int> neglabels;
280
281 autoarray<int>* macroposlabels;
282 autoarray<int>* macroneglabels;
283
284 autoarray<string> sublabels;
285 autoarray<string>* macrosublabels;
286
287 // randomdude999: ns is still the string to prefix to all labels, it's calculated whenever namespace_list is changed
288 string ns;
289 string ns_backup;
290 autoarray<string> namespace_list;
291
292 //bool fastrom=false;
293
294 autoarray<string> includeonce;
295
296 autoarray<freespace_data> freespaces;
297
298 // id of the next unused freespace.
299 static int freespaceidnext;
300 // id of the current freespace, or 0 if not in freespace.
301 int freespaceid;
302 // start address of the current freespace, used for computing the length of the
303 // current freespace.
304 static int freespacestart;
305
306
307 7377 bool confirmname(const char * name)
308 {
309
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7377 times.
7377 if (!name[0]) return false;
310
2/2
✓ Branch 0 taken 1836 times.
✓ Branch 1 taken 5541 times.
7377 if (is_digit(name[0])) return false;
311
2/2
✓ Branch 0 taken 46353 times.
✓ Branch 1 taken 5523 times.
51876 for (int i=0;name[i];i++)
312 {
313
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 46335 times.
46353 if (!is_ualnum(name[i])) return false;
314 }
315 2763 return true;
316 }
317
318 163428 string posneglabelname(const char ** input, bool define)
319 {
320 163428 const char* label = *input;
321
322 78614 string output;
323
324 78614 int depth = 0;
325 78614 bool ismacro = false;
326
327
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 163290 times.
163428 if (label[0] == '?')
328 {
329 69 ismacro = true;
330 138 label++;
331 }
332
4/4
✓ Branch 0 taken 78607 times.
✓ Branch 1 taken 84821 times.
✓ Branch 2 taken 583 times.
✓ Branch 3 taken 162682 times.
163428 if (label[0] == '-' || label[0] == '+')
333 {
334 380 char first = label[0];
335
4/4
✓ Branch 0 taken 926 times.
✓ Branch 1 taken 566 times.
✓ Branch 2 taken 746 times.
✓ Branch 3 taken 180 times.
1492 for (depth = 0; label[0] && label[0] == first; depth++) label++;
336
337
2/2
✓ Branch 0 taken 698 times.
✓ Branch 1 taken 48 times.
746 if (!ismacro)
338 {
339
2/2
✓ Branch 0 taken 559 times.
✓ Branch 1 taken 139 times.
698 if (first == '+')
340 {
341 559 *input = label;
342
8/16
✓ Branch 0 taken 283 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 283 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 283 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 283 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 283 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 283 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 283 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 283 times.
✗ Branch 15 not taken.
835 output = STR":pos_" + dec(depth) + "_" + dec(poslabels[depth]);
343
3/4
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 250 times.
✓ Branch 2 taken 156 times.
✗ Branch 3 not taken.
712 if (define) poslabels[depth]++;
344 }
345 else
346 {
347 139 *input = label;
348
3/4
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 118 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
148 if (define) neglabels[depth]++;
349
8/16
✓ Branch 0 taken 73 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 73 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 73 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 73 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 73 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 73 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 73 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 73 times.
✗ Branch 15 not taken.
205 output = STR":neg_" + dec(depth) + "_" + dec(neglabels[depth]);
350 }
351 }
352 else
353 {
354
3/6
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 48 times.
48 if (macrorecursion == 0 || macroposlabels == nullptr || macroneglabels == nullptr)
355 {
356 if (!macrorecursion) asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
357 }
358 else
359 {
360
2/2
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 24 times.
48 if (first == '+')
361 {
362 24 *input = label;
363
11/22
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 12 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
36 output = STR":macro_" + dec(calledmacros) + "_pos_" + dec(depth) + "_" + dec((*macroposlabels)[depth]);
364
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
24 if (define) (*macroposlabels)[depth]++;
365 }
366 else
367 {
368 24 *input = label;
369
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
33 if (define) (*macroneglabels)[depth]++;
370
11/22
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✓ 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.
✓ Branch 12 taken 12 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 12 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 12 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 12 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 12 times.
✗ Branch 21 not taken.
36 output = STR":macro_" + dec(calledmacros) + "_neg_" + dec(depth) + "_" + dec((*macroneglabels)[depth]);
371 }
372 }
373 }
374 }
375
376 163428 return output;
377 }
378
379 6715 static string labelname(const char ** rawname, bool define=false)
380 {
381 #define deref_rawname (*rawname)
382 3366 autoarray<string>* sublabellist = &sublabels;
383
384 6715 bool ismacro = (deref_rawname[0] == '?');
385 3366 bool issublabel = false;
386
387
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6643 times.
6715 if (ismacro)
388 {
389 72 deref_rawname++;
390 72 sublabellist = macrosublabels;
391 }
392
393 3366 string name;
394 3366 int i=-1;
395
396
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6715 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6715 if (is_digit(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
397
2/2
✓ Branch 0 taken 210 times.
✓ Branch 1 taken 6505 times.
6715 if (*deref_rawname ==':')
398 {
399 210 deref_rawname++;
400
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 name=":";
401 }
402
4/4
✓ Branch 0 taken 3258 times.
✓ Branch 1 taken 3247 times.
✓ Branch 2 taken 2961 times.
✓ Branch 3 taken 2950 times.
6505 else if (!in_struct && !in_sub_struct)
403 {
404
2/2
✓ Branch 0 taken 285 times.
✓ Branch 1 taken 5839 times.
6124 for (i=0;(*deref_rawname =='.');i++) deref_rawname++;
405
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5839 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
5839 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
406
2/2
✓ Branch 0 taken 267 times.
✓ Branch 1 taken 5572 times.
5839 if (i)
407 {
408
6/12
✓ Branch 0 taken 267 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 132 times.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 135 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
267 if (!sublabellist || !(*sublabellist)[i - 1]) asar_throw_error(2, error_type_block, error_id_label_missing_parent);
409
4/8
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
399 name+=STR(*sublabellist)[i-1]+"_";
410 135 issublabel = true;
411 }
412 }
413
414
4/4
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 6655 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 12 times.
6715 if (ismacro && !issublabel)
415 {
416 // RPG Hacker: Don't add the prefix for sublabels, because they already inherit it from
417 // their parents' names.
418
4/6
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
48 if (!macrorecursion || macrosublabels == nullptr) asar_throw_error(2, error_type_block, error_id_macro_label_outside_of_macro);
419
6/12
✓ 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.
✓ Branch 8 taken 15 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 15 times.
✗ Branch 11 not taken.
45 name = STR":macro_" + dec(calledmacros) + "_" + name;
420 }
421
422
423
4/4
✓ Branch 0 taken 6103 times.
✓ Branch 1 taken 594 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 6031 times.
6697 if (in_struct || in_sub_struct)
424 {
425
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 594 times.
666 if(in_sub_struct)
426 {
427
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 name += struct_parent + ".";
428 }
429
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += struct_name;
430
1/2
✓ Branch 0 taken 333 times.
✗ Branch 1 not taken.
666 name += '.';
431
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 648 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
666 if(*deref_rawname != '.') asar_throw_error(2, error_type_block, error_id_invalid_label_name); //probably should be a better error. TODO!!!
432 648 deref_rawname++;
433 }
434
435
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 6679 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
6679 if (!is_ualnum(*deref_rawname)) asar_throw_error(2, error_type_block, error_id_invalid_label_name);
436
437
6/6
✓ Branch 0 taken 27622 times.
✓ Branch 1 taken 27693 times.
✓ Branch 2 taken 678 times.
✓ Branch 3 taken 6679 times.
✓ Branch 4 taken 24362 times.
✓ Branch 5 taken 3348 times.
55315 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
438 {
439
1/2
✓ Branch 0 taken 24362 times.
✗ Branch 1 not taken.
48636 name+=*(deref_rawname++);
440 }
441
442
4/4
✓ Branch 0 taken 4198 times.
✓ Branch 1 taken 2481 times.
✓ Branch 2 taken 174 times.
✓ Branch 3 taken 4024 times.
6679 if(!define && *deref_rawname == '[')
443 {
444
3/4
✓ Branch 0 taken 570 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 396 times.
✓ Branch 3 taken 174 times.
570 while (*deref_rawname && *deref_rawname != ']') deref_rawname++;
445
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 174 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
174 if(*deref_rawname != ']') asar_throw_error(2, error_type_block, error_id_invalid_label_missing_closer);
446 174 deref_rawname++;
447 }
448
449
6/6
✓ Branch 0 taken 3768 times.
✓ Branch 1 taken 3751 times.
✓ Branch 2 taken 168 times.
✓ Branch 3 taken 6679 times.
✓ Branch 4 taken 420 times.
✓ Branch 5 taken 3348 times.
7519 while (is_ualnum(*deref_rawname) || *deref_rawname == '.')
450 {
451
1/2
✓ Branch 0 taken 420 times.
✗ Branch 1 not taken.
840 name+=*(deref_rawname++);
452 }
453
454
3/4
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 6607 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
6679 if(*deref_rawname == '[') asar_throw_error(2, error_type_block, error_id_invalid_subscript);
455
456
4/4
✓ Branch 0 taken 2094 times.
✓ Branch 1 taken 4513 times.
✓ Branch 2 taken 894 times.
✓ Branch 3 taken 315 times.
6607 if (define && i>=0)
457 {
458
1/2
✓ Branch 0 taken 894 times.
✗ Branch 1 not taken.
1779 (*sublabellist).reset(i);
459
2/4
✓ Branch 0 taken 894 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 894 times.
✗ Branch 3 not taken.
894 (*sublabellist)[i]=name;
460 }
461 6607 return name;
462 #undef deref_rawname
463 108 }
464
465 4054 inline bool labelvalcore(const char ** rawname, snes_label * rval, bool define, bool shouldthrow)
466 {
467
1/2
✓ Branch 0 taken 2031 times.
✗ Branch 1 not taken.
4054 string name=labelname(rawname, define);
468
14/20
✓ Branch 0 taken 2121 times.
✓ Branch 1 taken 1933 times.
✓ Branch 2 taken 140 times.
✓ Branch 3 taken 3914 times.
✓ Branch 4 taken 92 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 92 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 48 times.
✓ Branch 9 taken 44 times.
✓ Branch 10 taken 92 times.
✓ Branch 11 taken 1939 times.
✓ Branch 12 taken 48 times.
✓ Branch 13 taken 1983 times.
✓ Branch 14 taken 48 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 48 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
4192 if (ns && labels.exists(ns+name)) {*rval = labels.find(ns+name);}
469
5/6
✓ Branch 0 taken 3745 times.
✓ Branch 1 taken 213 times.
✓ Branch 2 taken 1769 times.
✓ Branch 3 taken 214 times.
✓ Branch 4 taken 1769 times.
✗ Branch 5 not taken.
3958 else if (labels.exists(name)) {*rval = labels.find(name);}
470 else
471 {
472
4/4
✓ Branch 0 taken 127 times.
✓ Branch 1 taken 300 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 120 times.
427 if (shouldthrow && pass)
473 {
474
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 7 times.
7 asar_throw_error(2, error_type_block, error_id_label_not_found, name.data());
475 }
476 420 rval->pos = (unsigned int)-1;
477 420 rval->freespace_id = 0;
478 420 rval->is_static = false;
479 420 return false;
480 }
481 1817 return true;
482 4054 }
483
484 1870 snes_label labelval(const char ** rawname, bool define)
485 {
486 936 snes_label rval;
487
2/2
✓ Branch 0 taken 932 times.
✓ Branch 1 taken 4 times.
1870 labelvalcore(rawname, &rval, define, true);
488 1863 return rval;
489 }
490
491 134 snes_label labelval(string name, bool define)
492 {
493 134 const char * rawname=name;
494 68 snes_label rval;
495
1/2
✓ Branch 0 taken 68 times.
✗ Branch 1 not taken.
134 labelvalcore(&rawname, &rval, define, true);
496 134 return rval;
497 }
498
499 1878 bool labelval(const char ** rawname, snes_label * rval, bool define)
500 {
501 1878 return labelvalcore(rawname, rval, define, false);
502 }
503
504 172 bool labelval(string name, snes_label * rval, bool define)
505 {
506 172 const char * str=name;
507
1/2
✓ Branch 0 taken 88 times.
✗ Branch 1 not taken.
260 return labelvalcore(&str, rval, define, false);
508 }
509
510 3369 static void setlabel(string name, int loc=-1, bool is_static=false, int freespace_id = -1)
511 {
512
2/2
✓ Branch 0 taken 2829 times.
✓ Branch 1 taken 540 times.
3369 if (loc==-1)
513 {
514
1/2
✓ Branch 0 taken 1422 times.
✗ Branch 1 not taken.
2829 verifysnespos();
515 2829 loc=snespos;
516 }
517
518 1692 snes_label label_data;
519 3369 label_data.pos = (unsigned int)loc;
520 3369 label_data.is_static = is_static;
521
1/2
✓ Branch 0 taken 3369 times.
✗ Branch 1 not taken.
3369 label_data.freespace_id = freespace_id == -1 ? freespaceid : freespace_id;
522
523 unsigned int labelpos;
524
2/2
✓ Branch 0 taken 1123 times.
✓ Branch 1 taken 2246 times.
3369 if (pass==0)
525 {
526
4/4
✓ Branch 0 taken 567 times.
✓ Branch 1 taken 556 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 561 times.
1123 if (labels.exists(name))
527 {
528 6 movinglabelspossible=true;
529
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
6 asar_throw_error(0, error_type_block, error_id_label_redefined, name.data());
530 }
531
1/2
✓ Branch 0 taken 561 times.
✗ Branch 1 not taken.
1117 labels.create(name) = label_data;
532 }
533
2/2
✓ Branch 0 taken 1123 times.
✓ Branch 1 taken 1123 times.
2246 else if (pass==1)
534 {
535
1/2
✓ Branch 0 taken 564 times.
✗ Branch 1 not taken.
1123 labels.create(name) = label_data;
536 }
537
1/2
✓ Branch 0 taken 1123 times.
✗ Branch 1 not taken.
1123 else if (pass==2)
538 {
539 //all label locations are known at this point, add a sanity check
540
3/6
✓ Branch 0 taken 564 times.
✓ Branch 1 taken 559 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 564 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1123 if (!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_label_on_third_pass);
541
1/2
✓ Branch 0 taken 564 times.
✗ Branch 1 not taken.
1123 labelpos = labels.find(name).pos;
542
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1111 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
1123 if ((int)labelpos != loc && !movinglabelspossible)
543 {
544
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
12 if((unsigned int)loc>>16 != labelpos>>16) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
545
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
12 else if(labelpos == (dp_base + 0xFFu)) asar_throw_error(2, error_type_block, error_id_label_ambiguous, name.raw());
546
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 else if(errored) return;
547 else asar_throw_error(2, error_type_block, error_id_label_moving);
548 }
549 }
550 }
551
552 table thetable;
553 static autoarray<table> tablestack;
554
555 2124 static void cleartable()
556 {
557
2/4
✓ Branch 0 taken 2124 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1092 times.
✗ Branch 3 not taken.
2124 thetable = table();
558 2124 }
559
560 struct pushable {
561 int arch;
562 int snespos;
563 int snesstart;
564 int snesposreal;
565 int snesstartreal;
566 int freeid;
567 int freest;
568 int arch1;
569 int arch2;
570 int arch3;
571 int arch4;
572 };
573 static autoarray<pushable> pushpc;
574 static int pushpcnum;
575
576 static autoarray<int> basestack;
577 static int basestacknum;
578
579 129 struct ns_pushable {
580 string ns;
581 autoarray<string> namespace_list;
582 bool nested_namespaces;
583 };
584
585 static autoarray<ns_pushable> pushns;
586 static int pushnsnum;
587
588
589 static unsigned char fillbyte[12];
590 static unsigned char padbyte[12];
591
592 static bool nested_namespaces = false;
593
594 4410 static int getfreespaceid()
595 {
596 /*static const int max_num_freespaces = 125;
597 if (freespaceidnext > max_num_freespaces) asar_throw_error(pass, error_type_fatal, error_id_freespace_limit_reached, max_num_freespaces);*/
598 4410 int newid = freespaceidnext++;
599
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 2940 times.
4410 if(newid >= freespaces.count) {
600 1470 freespaces[newid].leaked = true;
601 1470 freespaces[newid].orgpos = -2;
602 1470 freespaces[newid].orglen = -1;
603 1470 freespaces[newid].cleanbyte = 0x00;
604 }
605 4410 return newid;
606 }
607
608 133722 void checkbankcross()
609 {
610
2/2
✓ Branch 0 taken 66813 times.
✓ Branch 1 taken 66909 times.
133722 if (!snespos_valid) return;
611
2/2
✓ Branch 0 taken 53790 times.
✓ Branch 1 taken 53937 times.
107727 if (disable_bank_cross_errors) return;
612
2/2
✓ Branch 0 taken 53223 times.
✓ Branch 1 taken 53370 times.
106593 unsigned int mask = 0x7FFF0000 | (check_half_banks_crossed ? 0x8000 : 0);
613
4/4
✓ Branch 0 taken 1713 times.
✓ Branch 1 taken 104880 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1701 times.
106593 if (((snespos^startpos) & mask) && (((snespos - 1) ^ startpos) & mask))
614 {
615 12 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, snespos);
616 }
617 // don't verify realsnespos when using norom. this allows making custom mappers where the file layout doesn't follow bank borders
618
5/6
✓ Branch 0 taken 105705 times.
✓ Branch 1 taken 876 times.
✓ Branch 2 taken 1701 times.
✓ Branch 3 taken 104004 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1701 times.
106581 else if (mapper != norom && ((realsnespos^realstartpos) & mask) && (((realsnespos - 1) ^ realstartpos) & mask))
619 {
620 asar_throw_error(pass, error_type_fatal, error_id_bank_border_crossed, realsnespos);
621 }
622 }
623
624 8868 static void freespaceend()
625 {
626
2/2
✓ Branch 0 taken 4428 times.
✓ Branch 1 taken 4440 times.
8868 if (freespaceid > 0)
627 {
628 4428 freespaces[freespaceid].len = snespos-freespacestart;
629 4428 snespos=(int)0xFFFFFFFF;
630 4428 snespos_valid = false;
631 }
632 8868 freespaceid = 0;
633 8868 }
634
635 int numopcodes;
636
637
1/2
✓ Branch 0 taken 9605 times.
✗ Branch 1 not taken.
19408 static void adddefine(const string & key, string & value)
638 {
639
1/2
✓ Branch 0 taken 19408 times.
✗ Branch 1 not taken.
19408 if (!defines.exists(key)) defines.create(key) = value;
640 19408 }
641
642 2106 void initstuff()
643 {
644
2/2
✓ Branch 0 taken 722 times.
✓ Branch 1 taken 1384 times.
2106 if (pass==0)
645 {
646 722 freespaces.reset();
647 722 movinglabelspossible = false;
648 722 found_rats_tags_initialized = false;
649 722 found_rats_tags.clear();
650 }
651 2106 arch=arch_65816;
652 2106 mapper=lorom;
653 2106 mapper_set = false;
654 2106 calledmacros = 0;
655 2106 reallycalledmacros = 0;
656 2106 macrorecursion = 0;
657 2106 defines.reset();
658 2106 builtindefines.each(adddefine);
659 2106 clidefines.each(adddefine);
660 1083 ns="";
661 2106 namespace_list.reset();
662 2106 sublabels.reset();
663 2106 poslabels.reset();
664 2106 neglabels.reset();
665 2106 macroposlabels = nullptr;
666 2106 macroneglabels = nullptr;
667 2106 macrosublabels = nullptr;
668 2106 cleartable();
669 2106 pushpc.reset();
670 2106 pushpcnum=0;
671 2106 pushns.reset();
672 2106 pushnsnum = 0;
673 2106 bytes=0;
674 2106 freespaceuse=0;
675 2106 memset(fillbyte, 0, sizeof(fillbyte));
676 2106 memset(padbyte, 0, sizeof(padbyte));
677 2106 snespos_valid = false;
678 2106 snespos=(int)0xFFFFFFFF;
679 2106 realsnespos= (int)0xFFFFFFFF;
680 2106 startpos= (int)0xFFFFFFFF;
681 2106 realstartpos= (int)0xFFFFFFFF;
682 //fastrom=false;
683 2106 freespaceidnext=1;
684 2106 freespaceid=0;
685 2106 numopcodes=0;
686 2106 incsrcdepth = 0;
687
688 2106 optimizeforbank = -1;
689 2106 optimize_dp = optimize_dp_flag::NONE;
690 2106 dp_base = 0;
691 2106 optimize_address = optimize_address_flag::DEFAULT;
692
693 2106 in_struct = false;
694 2106 in_sub_struct = false;
695 2106 in_spcblock = false;
696
697
1/2
✓ Branch 0 taken 2106 times.
✗ Branch 1 not taken.
2106 if (arch==arch_65816) asinit_65816();
698
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2106 times.
2106 if (arch==arch_spc700) asinit_spc700();
699
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2106 times.
2106 if (arch==arch_superfx) asinit_superfx();
700
701 2106 disable_bank_cross_errors = false;
702 2106 check_half_banks_crossed = false;
703 2106 nested_namespaces = false;
704
705 2106 includeonce.reset();
706
707 extern AddressToLineMapping addressToLineMapping;
708 2106 addressToLineMapping.reset();
709
710 2106 push_warnings(false);
711
712 2106 initmathcore();
713
714 2106 callstack.reset();
715 #if defined(_WIN32) || !defined(NO_USE_THREADS)
716 2106 init_stack_use_check();
717 #endif
718 2106 }
719
720 1494 int get_freespace_pin_target(int target_id) {
721 // union-find algorithm
722
2/2
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1494 times.
2253 while(freespaces[target_id].pin_target_id != target_id) {
723 // i love programming
724 18 freespaces[target_id].pin_target_id =
725 12 freespaces[freespaces[target_id].pin_target_id].pin_target_id;
726 12 target_id = freespaces[target_id].pin_target_id;
727 }
728 1494 return target_id;
729 }
730
731 692 void resolve_pinned_freespaces() {
732
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 692 times.
2162 for(int i = 1; i < freespaces.count; i++)
733 // default to everyone being in a separate component
734 1470 freespaces[i].pin_target_id = i;
735
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 692 times.
2162 for(int i = 1; i < freespaces.count; i++) {
736
1/2
✓ Branch 0 taken 735 times.
✗ Branch 1 not taken.
735 freespace_data& fs = freespaces[i];
737
2/2
✓ Branch 0 taken 1446 times.
✓ Branch 1 taken 24 times.
1470 if(fs.pin_target == "") continue;
738 12 snes_label value;
739
5/16
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 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 taken 12 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 12 times.
✗ Branch 14 not taken.
✗ Branch 15 not taken.
24 if(fs.pin_target_ns && labels.exists(fs.pin_target_ns + fs.pin_target))
740 value = labels.find(fs.pin_target_ns + fs.pin_target);
741
2/4
✓ Branch 0 taken 24 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
24 else if(labels.exists(fs.pin_target))
742
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 value = labels.find(fs.pin_target);
743 else continue; // the error for this is thrown in the freespace command during pass 2
744
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
24 fs.pin_target_id = get_freespace_pin_target(value.freespace_id);
745 24 fs.len = 0;
746 }
747 692 }
748
749 692 void allocate_freespaces() {
750 // compute real size of all pinned freespace blocks
751
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 692 times.
2162 for(int i = 1; i < freespaces.count; i++) {
752 735 freespace_data& fs = freespaces[i];
753 // just in case the pin target changed again or something
754 1470 fs.pin_target_id = get_freespace_pin_target(fs.pin_target_id);
755 735 freespace_data& target = freespaces[fs.pin_target_id];
756 1470 target.total_len += fs.len;
757
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 735 times.
1470 target.search_start = std::max(fs.search_start, target.search_start);
758 }
759
760
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 692 times.
2162 for(int i = 1; i < freespaces.count; i++) {
761 735 freespace_data& fs = freespaces[i];
762
4/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1458 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 6 times.
1470 if(fs.is_static && fs.orgpos > 0) {
763 6 fs.pos = fs.orgpos;
764 6 continue;
765 }
766 // if this freespace is pinned to another one, set it later
767
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1446 times.
1464 if(fs.pin_target_id != i) continue;
768 // TODO: possibly fancier align
769 1446 fs.pos = getsnesfreespace(fs.total_len, fs.bank, true, true, fs.flag_align, fs.cleanbyte, fs.write_rats, fs.search_start);
770 1446 fs.used_len = fs.len;
771 }
772 // set pos for all pinned freespaces
773
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 692 times.
2162 for(int i = 1; i < freespaces.count; i++) {
774 735 freespace_data& fs = freespaces[i];
775
2/2
✓ Branch 0 taken 1452 times.
✓ Branch 1 taken 18 times.
1470 if(fs.pin_target_id == i) continue;
776 9 freespace_data& tgt = freespaces[fs.pin_target_id];
777 18 fs.pos = tgt.pos + tgt.used_len;
778 18 tgt.used_len += fs.len;
779 }
780
781 // relocate all labels that were in freespace to point them to their real location
782 692 labels.each([](const char * key, snes_label & val) {
783
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 937 times.
1117 if(val.freespace_id != 0) {
784 180 val.pos += freespaces[val.freespace_id].pos;
785 }
786 1117 });
787 692 }
788
789 //void nerf(const string& left, string& right){puts(S left+" = "+right);}
790
791 2076 void finishpass()
792 {
793 2076 verify_warnings();
794 2076 pull_warnings(false);
795
796 //defines.traverse(nerf);
797
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
2076 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_missing_endspcblock);
798
2/4
✓ Branch 0 taken 2076 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2076 times.
2076 if (in_struct || in_sub_struct) asar_throw_error(pass, error_type_null, error_id_struct_without_endstruct);
799
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2076 else if (pushpcnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushpc_without_pullpc);
800
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2076 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2076 else if (pushnsnum && pass == 0) asar_throw_error(pass, error_type_null, error_id_pushns_without_pullns);
801 2076 freespaceend();
802
2/2
✓ Branch 0 taken 1968 times.
✓ Branch 1 taken 108 times.
2076 if (arch==arch_65816) asend_65816();
803
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2004 times.
2076 if (arch==arch_spc700) asend_spc700();
804
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2040 times.
2076 if (arch==arch_superfx) asend_superfx();
805
806 2076 deinitmathcore();
807
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 1384 times.
2076 if(pass == 0) {
808 692 resolve_pinned_freespaces();
809
2/2
✓ Branch 0 taken 692 times.
✓ Branch 1 taken 692 times.
1384 } else if(pass == 1) {
810 692 allocate_freespaces();
811 692 handle_cleared_rats_tags();
812 }
813 #if defined(_WIN32) || !defined(NO_USE_THREADS)
814 2076 deinit_stack_use_check();
815 #endif
816 2076 }
817
818 147636 static bool addlabel(const char * label, int pos=-1, bool global_label = false)
819 {
820
4/4
✓ Branch 0 taken 101997 times.
✓ Branch 1 taken 45639 times.
✓ Branch 2 taken 54171 times.
✓ Branch 3 taken 47826 times.
147636 if (!label[0] || label[0]==':') return false;//colons are reserved for special labels
821
822 101997 const char* posneglabel = label;
823
1/2
✓ Branch 0 taken 47826 times.
✗ Branch 1 not taken.
101997 string posnegname = posneglabelname(&posneglabel, true);
824
825
4/4
✓ Branch 0 taken 48006 times.
✓ Branch 1 taken 53991 times.
✓ Branch 2 taken 186 times.
✓ Branch 3 taken 47640 times.
101997 if (posnegname.length() > 0)
826 {
827
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 186 times.
366 if (global_label) return false;
828
3/6
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 294 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
366 if (*posneglabel != '\0' && *posneglabel != ':') asar_throw_error(0, error_type_block, error_id_broken_label_definition);
829
2/4
✓ Branch 0 taken 366 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 186 times.
✗ Branch 3 not taken.
366 setlabel(posnegname, pos);
830 366 return true;
831 }
832
7/8
✓ Branch 0 taken 99189 times.
✓ Branch 1 taken 2442 times.
✓ Branch 2 taken 99006 times.
✓ Branch 3 taken 183 times.
✓ Branch 4 taken 98988 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 98988 times.
101631 if (label[strlen(label)-1]==':' || label[0]=='.' || label[0]=='?' || label[0] == '#')
833 {
834
2/2
✓ Branch 0 taken 1317 times.
✓ Branch 1 taken 1326 times.
2643 if (!label[1]) return false;
835
6/8
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 2481 times.
✓ Branch 2 taken 126 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 126 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 63 times.
✓ Branch 7 taken 63 times.
2607 if(global_label && (in_struct || in_sub_struct || label[0]=='?')) return false;
836
837 1299 bool define = true;
838
839
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 2517 times.
2589 if (label[0] == '#')
840 {
841 36 define = false;
842 72 label++;
843 }
844
845 // RPG Hacker: Also checking label[1] now, since it might be a macro sublabel.
846 // Also, apparently this here doesn't account for main labels. I guess because
847 // we don't even get here in the first place if they don't include a colon?
848
7/8
✓ Branch 0 taken 1704 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 1686 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 1668 times.
✓ Branch 5 taken 18 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 837 times.
2589 bool requirecolon = (label[0] != '.' && label[1] != '.') && (in_struct || in_sub_struct);
849
2/2
✓ Branch 0 taken 2481 times.
✓ Branch 1 taken 108 times.
2589 string name=labelname(&label, define);
850
2/2
✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 129 times.
2481 if (label[0]==':') label++;
851
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 129 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
129 else if (requirecolon) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
852
2/2
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 66 times.
129 else if (global_label) return false;
853
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2463 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2463 if (label[0]) asar_throw_error(0, error_type_block, error_id_broken_label_definition);
854
10/12
✓ Branch 0 taken 1398 times.
✓ Branch 1 taken 1065 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 1089 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 147 times.
✓ Branch 7 taken 1089 times.
✓ Branch 8 taken 147 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 147 times.
✗ Branch 11 not taken.
2607 if (ns && !global_label) name=ns+name;
855
9/10
✓ Branch 0 taken 1905 times.
✓ Branch 1 taken 558 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 1833 times.
✓ Branch 4 taken 1446 times.
✓ Branch 5 taken 96 times.
✓ Branch 6 taken 1236 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1230 times.
✓ Branch 9 taken 6 times.
2469 setlabel(name, pos, ((in_struct || in_sub_struct) && static_struct));
856 2451 return true;
857 2481 }
858 46314 return false;
859 101997 }
860
861 45069 static void add_addr_to_line(int pos)
862 {
863
2/2
✓ Branch 0 taken 15925 times.
✓ Branch 1 taken 29144 times.
45069 if (pass == 2)
864 15925 addressToLineMapping.includeMapping(get_current_file_name(), get_current_line() + 1, pos);
865 45069 }
866
867 static autoarray<bool> elsestatus;
868 int numtrue=0;//if 1 -> increase both
869 int numif = 0; //if 0 or inside if 0 -> increase only numif
870
871 autoarray<whiletracker> whilestatus;
872 int single_line_for_tracker;
873
874
875 270 static void push_pc()
876 {
877 270 pushpc[pushpcnum].arch=arch;
878 270 pushpc[pushpcnum].snespos=snespos;
879 270 pushpc[pushpcnum].snesstart=startpos;
880 270 pushpc[pushpcnum].snesposreal=realsnespos;
881 270 pushpc[pushpcnum].snesstartreal=realstartpos;
882 270 pushpc[pushpcnum].freeid=freespaceid;
883 270 pushpc[pushpcnum].freest=freespacestart;
884 270 pushpcnum++;
885 270 }
886
887 270 static void pop_pc()
888 {
889 270 pushpcnum--;
890 270 snespos=pushpc[pushpcnum].snespos;
891 270 startpos=pushpc[pushpcnum].snesstart;
892 270 realsnespos=pushpc[pushpcnum].snesposreal;
893 270 realstartpos=pushpc[pushpcnum].snesstartreal;
894 270 freespaceid=pushpc[pushpcnum].freeid;
895 270 freespacestart=pushpc[pushpcnum].freest;
896 270 }
897
898
899 984 string handle_print(char* input)
900 {
901 498 string out;
902
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 autoptr<char**> pars = qpsplit(input, ',');
903
1/2
✓ Branch 0 taken 984 times.
✗ Branch 1 not taken.
984 verify_paren(pars);
904
2/2
✓ Branch 0 taken 1659 times.
✓ Branch 1 taken 966 times.
2625 for (int i = 0; pars[i]; i++)
905 {
906 if (0);
907
4/6
✓ Branch 0 taken 1218 times.
✓ Branch 1 taken 441 times.
✓ Branch 2 taken 1218 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 615 times.
✗ Branch 5 not taken.
1659 else if (pars[i][0] == '"') out += safedequote(pars[i]);
908
5/6
✓ Branch 0 taken 234 times.
✓ Branch 1 taken 207 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 198 times.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
441 else if (!stricmp(pars[i], "bytes")) out += dec(bytes);
909
5/6
✓ Branch 0 taken 207 times.
✓ Branch 1 taken 198 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 189 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
405 else if (!stricmp(pars[i], "freespaceuse")) out += dec(freespaceuse);
910
3/6
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 189 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
387 else if (!stricmp(pars[i], "pc")) out += hex((unsigned int)(snespos & 0xFFFFFF), 6);
911
3/4
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✓ Branch 3 taken 36 times.
531 else if (!strncasecmp(pars[i], "bin(", strlen("bin(")) ||
912
4/4
✓ Branch 0 taken 258 times.
✓ Branch 1 taken 39 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 36 times.
405 !strncasecmp(pars[i], "dec(", strlen("dec(")) ||
913
6/6
✓ Branch 0 taken 297 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 252 times.
✓ Branch 5 taken 18 times.
792 !strncasecmp(pars[i], "hex(", strlen("hex(")) ||
914
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 9 times.
144 !strncasecmp(pars[i], "double(", strlen("double(")))
915 {
916 369 char * arg1pos = strchr(pars[i], '(') + 1;
917 369 char * endpos = strchr(arg1pos, '\0');
918
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 738 times.
✓ Branch 2 taken 369 times.
✓ Branch 3 taken 369 times.
738 while (*endpos == ' ' || *endpos == '\0') endpos--;
919
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (*endpos != ')') asar_throw_error(0, error_type_block, error_id_invalid_print_function_syntax);
920
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
369 string paramstr = string(arg1pos, (int)(endpos - arg1pos));
921
922 int numargs;
923
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 autoptr<char**> params = qpsplit(paramstr.temp_raw(), ',', &numargs);
924
1/2
✓ Branch 0 taken 369 times.
✗ Branch 1 not taken.
369 verify_paren(params);
925
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 369 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
369 if (numargs > 2) asar_throw_error(0, error_type_block, error_id_wrong_num_parameters);
926 189 int precision = 0;
927 369 bool hasprec = numargs == 2;
928
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 189 times.
369 if (hasprec)
929 {
930
1/2
✓ Branch 0 taken 234 times.
✗ Branch 1 not taken.
234 precision = getnum(params[1]);
931
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 234 times.
234 if (precision < 0) precision = 0;
932
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 117 times.
234 if (precision > 64) precision = 64;
933 }
934 369 *(arg1pos - 1) = '\0'; // allows more convenient comparsion functions
935
4/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 135 times.
369 if (!stricmp(pars[i], "bin"))
936 {
937 // sadly printf doesn't have binary, so let's roll our own
938
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 int64_t value = getnum(params[0]);
939 char buffer[65];
940
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 72 times.
90 if (value < 0) {
941
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 out += '-';
942 18 value = -value;
943 // decrement precision because we've output one char already
944 18 precision -= 1;
945
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (precision<0) precision = 0;
946 }
947
2/2
✓ Branch 0 taken 5760 times.
✓ Branch 1 taken 90 times.
5850 for (int j = 0; j < 64; j++) {
948 5760 buffer[63 - j] = '0' + ((value & (1ull << j)) >> j);
949 }
950 90 buffer[64] = 0;
951 45 int startidx = 0;
952
4/4
✓ Branch 0 taken 5184 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 5166 times.
✓ Branch 3 taken 18 times.
5256 while (startidx < 64 - precision && buffer[startidx] == '0') startidx++;
953
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
90 if (startidx == 64) startidx--; // always want to print at least one digit
954
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 out += buffer + startidx;
955 }
956
4/4
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 105 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 99 times.
279 else if (!stricmp(pars[i], "dec"))
957 {
958
1/2
✓ Branch 0 taken 75 times.
✗ Branch 1 not taken.
75 int64_t value = getnum(params[0]);
959 char buffer[65];
960
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
75 snprintf(buffer, 65, "%0*" PRId64, precision, value);
961
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
75 out += buffer;
962 }
963
4/4
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 63 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 63 times.
204 else if (!stricmp(pars[i], "hex"))
964 {
965
1/2
✓ Branch 0 taken 78 times.
✗ Branch 1 not taken.
78 int64_t value = getnum(params[0]);
966 char buffer[65];
967
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
78 snprintf(buffer, 65, "%0*" PRIX64, precision, value);
968
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
78 out += buffer;
969 }
970
2/4
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
126 else if (!stricmp(pars[i], "double"))
971 {
972
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 18 times.
126 if (!hasprec) precision = 5;
973
3/6
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 63 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
126 out += ftostrvar(getnumdouble(params[0]), precision);
974 }
975 369 }
976
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
977 }
978 1455 return out;
979 1002 }
980
981 // single_line_for_tracker is:
982 // 0 if not in first block of line, not in (single-line) for loop
983 // 1 if first block of line
984 // 2 if in single-line for loop
985 // 3 if after endfor (of a single-line loop)
986 158112 void assembleblock(const char * block, int& single_line_for_tracker)
987 {
988 #define is(test) (!stricmpwithlower(word[0], test))
989 #define is0(test) (numwords==1 && !stricmpwithlower(word[0], test))
990 #define is1(test) (numwords==2 && !stricmpwithlower(word[0], test))
991 #define is2(test) (numwords==3 && !stricmpwithlower(word[0], test))
992 #define is3(test) (numwords==4 && !stricmpwithlower(word[0], test))
993 #define par word[1]
994
995
1/2
✓ Branch 0 taken 75900 times.
✗ Branch 1 not taken.
75900 callstack_push cs_push(callstack_entry_type::BLOCK, block);
996
997 int numwords;
998
1/2
✓ Branch 0 taken 75900 times.
✗ Branch 1 not taken.
75900 string splitblock = block;
999
1/2
✓ Branch 0 taken 158112 times.
✗ Branch 1 not taken.
158112 char ** word = qsplit(splitblock.temp_raw(), ' ', &numwords);
1000 75900 autoptr<char **> scope_word = word;
1001 // when writing out the data for the addrToLine mapping,
1002 // we want to write out the snespos we had before writing opcodes
1003 158112 int addrToLinePos = realsnespos & 0xFFFFFF;
1004
1005
14/14
✓ Branch 0 taken 151155 times.
✓ Branch 1 taken 9684 times.
✓ Branch 2 taken 149004 times.
✓ Branch 3 taken 2151 times.
✓ Branch 4 taken 86517 times.
✓ Branch 5 taken 62487 times.
✓ Branch 6 taken 85023 times.
✓ Branch 7 taken 1494 times.
✓ Branch 8 taken 147390 times.
✓ Branch 9 taken 120 times.
✓ Branch 10 taken 2727 times.
✓ Branch 11 taken 144663 times.
✓ Branch 12 taken 1371 times.
✓ Branch 13 taken 75840 times.
160839 while (numif==numtrue && word[0] && (!word[1] || strcmp(word[1], "=")) && addlabel(word[0]))
1006 {
1007 2727 word++;
1008 2727 numwords--;
1009 }
1010
4/4
✓ Branch 0 taken 155841 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 81117 times.
✓ Branch 3 taken 74724 times.
157992 if (!word[0] || !word[0][0]) return;
1011
12/12
✓ Branch 0 taken 107766 times.
✓ Branch 1 taken 1644 times.
✓ Branch 2 taken 106776 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 106686 times.
✓ Branch 5 taken 90 times.
✓ Branch 6 taken 100908 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 53634 times.
✓ Branch 9 taken 47274 times.
✓ Branch 10 taken 4773 times.
✓ Branch 11 taken 46752 times.
109410 if (is("if") || is("elseif") || is("assert") || is("while") || is("for"))
1012 {
1013 4773 string errmsg;
1014 4773 whiletracker wstatus;
1015
1/2
✓ Branch 0 taken 9546 times.
✗ Branch 1 not taken.
9546 wstatus.startline = get_current_line();
1016 9546 wstatus.iswhile = is("while");
1017 9546 wstatus.cond = false;
1018 9546 wstatus.is_for = false;
1019 9546 wstatus.for_start = wstatus.for_end = wstatus.for_cur = 0;
1020 9546 wstatus.for_has_var_backup = false;
1021
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8502 times.
9546 if(is("for")) wstatus.is_for = true;
1022
1023 4773 bool is_for_cont = false;
1024 // if this is a for loop and a whilestatus entry already exists at this level,
1025 // and the for loop isn't finished, this is a continuation of the for loop
1026
6/6
✓ Branch 0 taken 1042 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 1019 times.
✓ Branch 3 taken 23 times.
✓ Branch 4 taken 498 times.
✓ Branch 5 taken 23 times.
6338 if (is("for") && whilestatus.count > numif && whilestatus[numif].is_for
1027
9/10
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 8502 times.
✓ Branch 2 taken 627 times.
✓ Branch 3 taken 369 times.
✓ Branch 4 taken 498 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 369 times.
✓ Branch 7 taken 129 times.
✓ Branch 8 taken 369 times.
✓ Branch 9 taken 4404 times.
10566 && whilestatus[numif].for_cur < whilestatus[numif].for_end)
1028 369 is_for_cont = true;
1029
5/8
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 4404 times.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4404 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4404 times.
✗ Branch 7 not taken.
9546 whiletracker& addedwstatus = is_for_cont ? whilestatus[numif] : (whilestatus[numif] = wstatus);
1030
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 9456 times.
9546 if (is("assert"))
1031 {
1032
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 autoptr<char**> tokens = qpsplit(word[numwords - 1], ',');
1033
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 verify_paren(tokens);
1034
5/6
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 27 times.
90 if (tokens[0] != NULL && tokens[1] != NULL)
1035 {
1036 18 string rawerrmsg;
1037 18 size_t pos = 1;
1038
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 36 times.
162 while (tokens[pos])
1039 {
1040
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
126 rawerrmsg += tokens[pos];
1041
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 36 times.
126 if (tokens[pos + 1] != NULL)
1042 {
1043
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 rawerrmsg += ",";
1044 }
1045 63 pos++;
1046 }
1047
1048
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 errmsg = handle_print(rawerrmsg.raw());
1049 36 }
1050 90 }
1051
1052 //handle nested if statements
1053
8/8
✓ Branch 0 taken 1008 times.
✓ Branch 1 taken 8538 times.
✓ Branch 2 taken 666 times.
✓ Branch 3 taken 342 times.
✓ Branch 4 taken 333 times.
✓ Branch 5 taken 333 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 4530 times.
9546 if (numtrue!=numif && !(is("elseif") && numtrue+1==numif))
1054 {
1055
8/8
✓ Branch 0 taken 342 times.
✓ Branch 1 taken 144 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 144 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 144 times.
✓ Branch 6 taken 171 times.
✓ Branch 7 taken 72 times.
486 if ((is("if") || is("while") || is("for"))) numif++;
1056 243 return;
1057 }
1058
8/8
✓ Branch 0 taken 7560 times.
✓ Branch 1 taken 1500 times.
✓ Branch 2 taken 1926 times.
✓ Branch 3 taken 5634 times.
✓ Branch 4 taken 990 times.
✓ Branch 5 taken 936 times.
✓ Branch 6 taken 4062 times.
✓ Branch 7 taken 468 times.
9060 if ((is("if") || is("while") || is("for"))) numif++;
1059
1060
2/2
✓ Branch 0 taken 15912 times.
✓ Branch 1 taken 9060 times.
24972 for(int i = 1; i < numwords - 1; i++)
1061 {
1062 15912 word[i][strlen(word[i])] = ' ';
1063 }
1064 9060 numwords = 2;
1065
1066 bool cond;
1067
2/2
✓ Branch 0 taken 8070 times.
✓ Branch 1 taken 990 times.
9060 if(!is("for"))
1068 {
1069
1/2
✓ Branch 0 taken 8070 times.
✗ Branch 1 not taken.
8070 cond = getnum(word[1]);
1070
8/10
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 7890 times.
✓ Branch 2 taken 90 times.
✓ Branch 3 taken 90 times.
✓ Branch 4 taken 90 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 45 times.
✓ Branch 7 taken 4035 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 45 times.
8070 if (foundlabel && !foundlabel_static && !is("assert")) asar_throw_error(1, error_type_block, error_id_label_in_conditional, word[0]);
1071 }
1072
1073
2/2
✓ Branch 0 taken 990 times.
✓ Branch 1 taken 7980 times.
8970 if (is("for"))
1074 {
1075
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 990 times.
990 if(single_line_for_tracker != 1)
1076 {
1077 numif--;
1078 asar_throw_error(0, error_type_line, error_id_bad_single_line_for);
1079 }
1080
1081
2/2
✓ Branch 0 taken 252 times.
✓ Branch 1 taken 738 times.
990 if(!is_for_cont)
1082 {
1083 252 char* past_eq = strchr(word[1], '=');
1084
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!past_eq)
1085 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "missing loop range");
1086
1087
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string varname(word[1], past_eq - word[1]);
1088 252 past_eq += 1;
1089
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(varname);
1090
2/4
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 252 times.
252 if(!validatedefinename(varname))
1091 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid define name");
1092
1093
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 char* range_sep = strqpstr(past_eq, "..");
1094
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
252 if(!range_sep)
1095 asar_throw_error(0, error_type_block, error_id_broken_for_loop, "invalid loop range");
1096
1097
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_start(past_eq, range_sep - past_eq);
1098
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_start);
1099
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 string for_end(range_sep+2);
1100
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 strip_whitespace(for_end);
1101
1102
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_start = getnum(for_start);
1103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1104 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1105
1/2
✓ Branch 0 taken 252 times.
✗ Branch 1 not taken.
252 addedwstatus.for_end = getnum(for_end);
1106
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
252 if(foundlabel && !foundlabel_static)
1107 asar_throw_error(0, error_type_block, error_id_label_in_conditional, "for");
1108
1109
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
252 addedwstatus.for_variable = varname;
1110 252 addedwstatus.for_cur = addedwstatus.for_start;
1111 252 }
1112 738 else addedwstatus.for_cur++;
1113
1114 990 addedwstatus.cond = addedwstatus.for_cur < addedwstatus.for_end;
1115 990 single_line_for_tracker = 2;
1116
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 252 times.
990 if(addedwstatus.cond)
1117 {
1118
2/2
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 81 times.
738 numtrue++;
1119
4/4
✓ Branch 0 taken 657 times.
✓ Branch 1 taken 81 times.
✓ Branch 2 taken 288 times.
✓ Branch 3 taken 81 times.
738 if(defines.exists(addedwstatus.for_variable))
1120 {
1121 576 addedwstatus.for_has_var_backup = true;
1122
2/4
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
576 addedwstatus.for_var_backup = defines.find(addedwstatus.for_variable);
1123 }
1124
3/6
✓ Branch 0 taken 738 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 369 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 369 times.
✗ Branch 5 not taken.
738 defines.create(addedwstatus.for_variable) = ftostr(addedwstatus.for_cur);
1125 }
1126 }
1127
6/6
✓ Branch 0 taken 6570 times.
✓ Branch 1 taken 1410 times.
✓ Branch 2 taken 3285 times.
✓ Branch 3 taken 3285 times.
✓ Branch 4 taken 3522 times.
✓ Branch 5 taken 468 times.
7980 else if (is("if") || is("while"))
1128 {
1129 if(0);
1130
2/2
✓ Branch 0 taken 5754 times.
✓ Branch 1 taken 1290 times.
7044 else if (cond)
1131 {
1132 5754 numtrue++;
1133
1/2
✓ Branch 0 taken 2877 times.
✗ Branch 1 not taken.
5754 elsestatus[numif]=true;
1134 }
1135
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
645 else if (!cond)
1136 {
1137
1/2
✓ Branch 0 taken 645 times.
✗ Branch 1 not taken.
1290 elsestatus[numif]=false;
1138 }
1139 7044 addedwstatus.cond = cond;
1140 }
1141
2/2
✓ Branch 0 taken 846 times.
✓ Branch 1 taken 90 times.
936 else if (is("elseif"))
1142 {
1143
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 846 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
846 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_elseif);
1144
3/6
✓ Branch 0 taken 423 times.
✓ Branch 1 taken 423 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 423 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
846 if (whilestatus[numif - 1].iswhile) asar_throw_error(1, error_type_block, error_id_elseif_in_while);
1145
2/2
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
846 if (numif==numtrue) numtrue--;
1146
8/8
✓ Branch 0 taken 324 times.
✓ Branch 1 taken 522 times.
✓ Branch 2 taken 279 times.
✓ Branch 3 taken 45 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 45 times.
✓ Branch 6 taken 117 times.
✓ Branch 7 taken 306 times.
1008 if (cond && !elsestatus[numif])
1147 {
1148 234 numtrue++;
1149
1/2
✓ Branch 0 taken 117 times.
✗ Branch 1 not taken.
234 elsestatus[numif]=true;
1150 }
1151 }
1152 // otherwise, must be assert command
1153
4/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 60 times.
✓ Branch 2 taken 24 times.
✓ Branch 3 taken 6 times.
90 else if (pass == 2 && !cond)
1154 {
1155
7/10
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 times.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
48 if (errmsg) asar_throw_error(2, error_type_block, error_id_assertion_failed, (string(": ") + errmsg).data());
1156
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
12 else asar_throw_error(2, error_type_block, error_id_assertion_failed, ".");
1157 }
1158
4/4
✓ Branch 0 taken 4473 times.
✓ Branch 1 taken 243 times.
✓ Branch 2 taken 4473 times.
✓ Branch 3 taken 243 times.
9903 }
1159
14/14
✓ Branch 0 taken 18405 times.
✓ Branch 1 taken 81459 times.
✓ Branch 2 taken 16761 times.
✓ Branch 3 taken 1644 times.
✓ Branch 4 taken 16761 times.
✓ Branch 5 taken 81459 times.
✓ Branch 6 taken 10983 times.
✓ Branch 7 taken 5778 times.
✓ Branch 8 taken 10983 times.
✓ Branch 9 taken 81459 times.
✓ Branch 10 taken 1044 times.
✓ Branch 11 taken 9939 times.
✓ Branch 12 taken 4233 times.
✓ Branch 13 taken 42519 times.
99864 else if (is0("endif") || is0("endwhile") || is0("endfor"))
1160 {
1161
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 8466 times.
8466 if (!numif)
1162 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1163
1/2
✓ Branch 0 taken 4233 times.
✗ Branch 1 not taken.
8466 whiletracker& thisws = whilestatus[numif - 1];
1164
1165
3/4
✓ Branch 0 taken 1644 times.
✓ Branch 1 taken 5778 times.
✓ Branch 2 taken 1644 times.
✗ Branch 3 not taken.
7422 if((!thisws.is_for && !thisws.iswhile && !is("endif")) ||
1166
7/8
✓ Branch 0 taken 7422 times.
✓ Branch 1 taken 1044 times.
✓ Branch 2 taken 5778 times.
✓ Branch 3 taken 2688 times.
✓ Branch 4 taken 5778 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 522 times.
✓ Branch 7 taken 7944 times.
20121 (thisws.iswhile && !is("endwhile")) ||
1167
3/4
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 4233 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 522 times.
4755 (thisws.is_for && !is("endfor")))
1168 asar_throw_error(1, error_type_block, error_id_misplaced_endif);
1169
1170
2/2
✓ Branch 0 taken 6258 times.
✓ Branch 1 taken 2208 times.
8466 if (numif==numtrue) numtrue--;
1171 8466 numif--;
1172
1173
2/2
✓ Branch 0 taken 1044 times.
✓ Branch 1 taken 7422 times.
8466 if(thisws.is_for)
1174 {
1175
2/2
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 864 times.
1044 if(single_line_for_tracker == 2) single_line_for_tracker = 3;
1176
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1044 times.
1044 if(moreonline)
1177 {
1178 // sabotage the whilestatus to prevent the loop running again
1179 // and spamming more of the same error
1180 thisws.for_cur = thisws.for_end;
1181 thisws.cond = false;
1182 asar_throw_error(0, error_type_block, error_id_bad_single_line_for);
1183 }
1184
1185
2/2
✓ Branch 0 taken 738 times.
✓ Branch 1 taken 306 times.
1044 if(thisws.cond)
1186 {
1187
2/2
✓ Branch 0 taken 576 times.
✓ Branch 1 taken 162 times.
738 if(thisws.for_has_var_backup)
1188
2/4
✓ Branch 0 taken 576 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 288 times.
✗ Branch 3 not taken.
576 defines.create(thisws.for_variable) = thisws.for_var_backup;
1189 else
1190
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 defines.remove(thisws.for_variable);
1191 }
1192 }
1193 }
1194
6/6
✓ Branch 0 taken 9939 times.
✓ Branch 1 taken 81459 times.
✓ Branch 2 taken 4956 times.
✓ Branch 3 taken 4983 times.
✓ Branch 4 taken 399 times.
✓ Branch 5 taken 42120 times.
91398 else if (is0("else"))
1195 {
1196
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 798 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
798 if (!numif) asar_throw_error(1, error_type_block, error_id_misplaced_else);
1197
5/12
✓ Branch 0 taken 798 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 798 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 399 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 399 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 399 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
798 if (whilestatus[numif - 1].iswhile || whilestatus[numif - 1].is_for) asar_throw_error(1, error_type_block, error_id_else_in_while_loop);
1198
2/2
✓ Branch 0 taken 318 times.
✓ Branch 1 taken 480 times.
798 else if (numif==numtrue) numtrue--;
1199
8/8
✓ Branch 0 taken 444 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 309 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 87 times.
✓ Branch 5 taken 135 times.
✓ Branch 6 taken 87 times.
✓ Branch 7 taken 153 times.
702 else if (numif==numtrue+1 && !elsestatus[numif])
1200 {
1201 174 numtrue++;
1202
1/2
✓ Branch 0 taken 87 times.
✗ Branch 1 not taken.
174 elsestatus[numif]=true;
1203 }
1204 }
1205
2/2
✓ Branch 0 taken 48480 times.
✓ Branch 1 taken 42120 times.
90600 else if (numif!=numtrue) return;
1206
4/4
✓ Branch 0 taken 85374 times.
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 29355 times.
✓ Branch 3 taken 56019 times.
85404 else if (asblock_pick(word, numwords))
1207 {
1208
1/2
✓ Branch 0 taken 29355 times.
✗ Branch 1 not taken.
29355 add_addr_to_line(addrToLinePos);
1209 29355 numopcodes += recent_opcode_num;
1210 }
1211
12/12
✓ Branch 0 taken 52590 times.
✓ Branch 1 taken 3429 times.
✓ Branch 2 taken 40992 times.
✓ Branch 3 taken 11598 times.
✓ Branch 4 taken 40830 times.
✓ Branch 5 taken 162 times.
✓ Branch 6 taken 39042 times.
✓ Branch 7 taken 1788 times.
✓ Branch 8 taken 288 times.
✓ Branch 9 taken 38754 times.
✓ Branch 10 taken 6939 times.
✓ Branch 11 taken 17886 times.
56019 else if (numwords > 1 && (is("db") || is("dw") || is("dl") || is("dd")))
1212 {
1213 6939 string line;
1214
2/2
✓ Branch 0 taken 13836 times.
✓ Branch 1 taken 13836 times.
27672 for(int i = 1; i < numwords; i++){
1215
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 13836 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
13836 if(i > 1) line += " ";
1216
1/2
✓ Branch 0 taken 6939 times.
✗ Branch 1 not taken.
13836 line += word[i];
1217 }
1218
1/2
✓ Branch 0 taken 13836 times.
✗ Branch 1 not taken.
13836 autoptr<char**> pars=qpsplit(line.temp_raw(), ',');
1219
1/2
✓ Branch 0 taken 13836 times.
✗ Branch 1 not taken.
13836 verify_paren(pars);
1220
1221 void (*do_write)(unsigned int);
1222 13836 char first = to_lower(word[0][1]);
1223
2/2
✓ Branch 0 taken 6939 times.
✓ Branch 1 taken 6897 times.
13836 if (first == 'b') do_write = &write1;
1224
2/2
✓ Branch 0 taken 1119 times.
✓ Branch 1 taken 1119 times.
2238 else if (first == 'w') do_write = &write2;
1225
2/2
✓ Branch 0 taken 1038 times.
✓ Branch 1 taken 1038 times.
2076 else if (first == 'l') do_write = &write3;
1226 144 else do_write = &write4;
1227
1228
2/2
✓ Branch 0 taken 16326 times.
✓ Branch 1 taken 13770 times.
30096 for (int i=0;pars[i];i++)
1229 {
1230
2/2
✓ Branch 0 taken 669 times.
✓ Branch 1 taken 15657 times.
16326 if (pars[i][0]=='"')
1231 {
1232
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 char * str=const_cast<char*>(safedequote(pars[i]));
1233 669 int codepoint = 0u;
1234
1/2
✓ Branch 0 taken 669 times.
✗ Branch 1 not taken.
669 str += utf8_val(&codepoint, str);
1235
3/4
✓ Branch 0 taken 2718 times.
✓ Branch 1 taken 669 times.
✓ Branch 2 taken 1368 times.
✗ Branch 3 not taken.
3387 while ( codepoint != 0 && codepoint != -1 )
1236 {
1237
2/4
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2718 times.
✗ Branch 3 not taken.
2718 do_write(thetable.get_val(codepoint));
1238
1/2
✓ Branch 0 taken 2718 times.
✗ Branch 1 not taken.
2718 str += utf8_val(&codepoint, str);
1239 }
1240
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 669 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
669 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1241 }
1242 else
1243 {
1244
5/6
✓ Branch 0 taken 5213 times.
✓ Branch 1 taken 10444 times.
✓ Branch 2 taken 5147 times.
✓ Branch 3 taken 66 times.
✓ Branch 4 taken 15591 times.
✗ Branch 5 not taken.
15657 do_write((pass==2)?getnum(pars[i]):0);
1245 }
1246 }
1247
1/2
✓ Branch 0 taken 13770 times.
✗ Branch 1 not taken.
13770 add_addr_to_line(addrToLinePos);
1248 13902 }
1249
2/2
✓ Branch 0 taken 1566 times.
✓ Branch 1 taken 40617 times.
42183 else if(word[0][0]=='%')
1250 {
1251
2/2
✓ Branch 0 taken 1530 times.
✓ Branch 1 taken 36 times.
1566 callmacro(strchr(block, '%')+1);
1252 }
1253
6/6
✓ Branch 0 taken 35934 times.
✓ Branch 1 taken 4683 times.
✓ Branch 2 taken 21186 times.
✓ Branch 3 taken 14748 times.
✓ Branch 4 taken 180 times.
✓ Branch 5 taken 16923 times.
40617 else if (is1("undef"))
1254 {
1255
2/4
✓ Branch 0 taken 360 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
360 string def = safedequote(par);
1256
1257
4/4
✓ Branch 0 taken 351 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 9 times.
360 if (defines.exists(def))
1258 {
1259
1/2
✓ Branch 0 taken 342 times.
✗ Branch 1 not taken.
342 defines.remove(def);
1260 }
1261 else
1262 {
1263
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_define_not_found, def.data());
1264 }
1265 360 }
1266
6/6
✓ Branch 0 taken 1881 times.
✓ Branch 1 taken 38376 times.
✓ Branch 2 taken 927 times.
✓ Branch 3 taken 954 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16914 times.
40257 else if (is0("error"))
1267 {
1268
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_error_command, ".");
1269 }
1270
6/6
✓ Branch 0 taken 1863 times.
✓ Branch 1 taken 38376 times.
✓ Branch 2 taken 918 times.
✓ Branch 3 taken 945 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 16905 times.
40239 else if (is0("warn"))
1271 {
1272
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 asar_throw_warning(2, warning_id_warn_command, ".");
1273 }
1274
6/6
✓ Branch 0 taken 35574 times.
✓ Branch 1 taken 4647 times.
✓ Branch 2 taken 21009 times.
✓ Branch 3 taken 14565 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16884 times.
40221 else if (is1("error"))
1275 {
1276
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1277 // RPG Hacker: This used to be on pass 0, which had its merits (you don't want to miss a potentially critical
1278 // user-generated error, just because a bazillion other errors are thrown in passes before it). However, I
1279 // don't see how to support print functions with this without moving it to pass 2. Suggestions are welcome.
1280
4/6
✓ Branch 0 taken 21 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 21 times.
99 asar_throw_error(2, error_type_block, error_id_error_command, (string(": ") + out).data());
1281 39 }
1282
6/6
✓ Branch 0 taken 35535 times.
✓ Branch 1 taken 4647 times.
✓ Branch 2 taken 20991 times.
✓ Branch 3 taken 14544 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 16863 times.
40182 else if (is1("warn"))
1283 {
1284
1/2
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
39 string out = handle_print(par);
1285
3/6
✓ Branch 0 taken 39 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
39 asar_throw_warning(2, warning_id_warn_command, (string(": ") + out).data());
1286 39 }
1287
6/6
✓ Branch 0 taken 35496 times.
✓ Branch 1 taken 4647 times.
✓ Branch 2 taken 20970 times.
✓ Branch 3 taken 14526 times.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 16791 times.
40143 else if (is1("warnings"))
1288 {
1289
4/4
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 36 times.
144 if (stricmp(word[1], "push") == 0)
1290 {
1291
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 push_warnings();
1292 }
1293
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 else if (stricmp(word[1], "pull") == 0)
1294 {
1295
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 18 times.
72 pull_warnings();
1296 }
1297 else
1298 {
1299 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1300 }
1301 }
1302
6/6
✓ Branch 0 taken 2604 times.
✓ Branch 1 taken 37395 times.
✓ Branch 2 taken 1302 times.
✓ Branch 3 taken 1302 times.
✓ Branch 4 taken 126 times.
✓ Branch 5 taken 16665 times.
39999 else if (is2("warnings"))
1303 {
1304
4/4
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 99 times.
252 if (stricmp(word[1], "enable") == 0)
1305 {
1306
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1307
1308
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (warnid != warning_id_end)
1309 {
1310
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 set_warning_enabled(warnid, true);
1311 }
1312 else
1313 {
1314
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings enable");
1315 }
1316 }
1317
2/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
198 else if (stricmp(word[1], "disable") == 0)
1318 {
1319
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 asar_warning_id warnid = parse_warning_id_from_string(word[2]);
1320
1321
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
198 if (warnid != warning_id_end)
1322 {
1323
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 set_warning_enabled(warnid, false);
1324 }
1325 else
1326 {
1327
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 asar_throw_error(0, error_type_block, error_id_invalid_warning_id, word[2], "warnings disable");
1328 }
1329 }
1330 else
1331 {
1332 asar_throw_error(0, error_type_block, error_id_broken_command, "warnings", "Unknown parameter");
1333 }
1334 }
1335
6/6
✓ Branch 0 taken 35352 times.
✓ Branch 1 taken 4395 times.
✓ Branch 2 taken 20898 times.
✓ Branch 3 taken 14454 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 16602 times.
39747 else if(is1("global"))
1336 {
1337
3/4
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 90 times.
126 if (!addlabel(word[1], -1, true))
1338 {
1339
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
36 asar_throw_error(1, error_type_block, error_id_invalid_global_label, word[1]);
1340 }
1341 }
1342
6/6
✓ Branch 0 taken 2352 times.
✓ Branch 1 taken 37269 times.
✓ Branch 2 taken 1176 times.
✓ Branch 3 taken 1176 times.
✓ Branch 4 taken 105 times.
✓ Branch 5 taken 16497 times.
39621 else if (is2("check"))
1343 {
1344
4/4
✓ Branch 0 taken 114 times.
✓ Branch 1 taken 96 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 96 times.
210 if (stricmp(word[1], "title") == 0)
1345 {
1346 // RPG Hacker: Removed trimming for now - I think requiring an exact match is probably
1347 // better here (not sure, though, it's worth discussing)
1348
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 string expected_title = safedequote(word[2]);
1349 // randomdude999: this also removes leading spaces because itrim gets stuck in an endless
1350 // loop when multi is true and one argument is empty
1351 // in hirom the rom needs to be an entire bank for it to have a title, other modes only need 0x8000 bytes
1352
3/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
18 if (romlen < ((mapper == hirom || mapper == exhirom) ? 0x10000 : 0x8000)) // too short
1353 {
1354 if (!ignoretitleerrors) // title errors shouldn't be ignored
1355 asar_throw_error(0, error_type_block, error_id_rom_too_short, expected_title.data());
1356 else // title errors should be ignored, throw a warning anyways
1357 asar_throw_warning(0, warning_id_rom_too_short, expected_title.data());
1358 }
1359 else {
1360 9 string actual_title;
1361 9 string actual_display_title;
1362
2/2
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 18 times.
396 for (int i = 0;i < 21;i++)
1363 {
1364
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
378 unsigned char c = romdata[snestopc(0x00FFC0 + i)];
1365
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_title += (char)c;
1366 // the replacements are from interface-cli.cpp
1367
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 7) c = 14;
1368
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 8) c = 27;
1369
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == 9) c = 26;
1370
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\r') c = 17;
1371
2/2
✓ Branch 0 taken 189 times.
✓ Branch 1 taken 189 times.
378 if (c == '\n') c = 25;
1372
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 378 times.
378 if (c == '\0') c = 155;
1373
1/2
✓ Branch 0 taken 189 times.
✗ Branch 1 not taken.
378 actual_display_title += (char)c;
1374 }
1375
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (strncmp(expected_title, actual_title, 21) != 0)
1376 {
1377 if (!ignoretitleerrors) // title errors shouldn't be ignored
1378 asar_throw_error(0, error_type_block, error_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1379 else // title errors should be ignored, throw a warning anyways
1380 asar_throw_warning(0, warning_id_rom_title_incorrect, expected_title.data(), actual_display_title.data());
1381 }
1382 18 }
1383 18 }
1384
2/4
✓ Branch 0 taken 192 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 96 times.
✗ Branch 3 not taken.
192 else if (stricmp(word[1], "bankcross") == 0)
1385 {
1386 if (0);
1387
4/4
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 51 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 51 times.
192 else if (!stricmp(word[2], "off"))
1388 {
1389 90 disable_bank_cross_errors = true;
1390 }
1391
4/4
✓ Branch 0 taken 99 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 48 times.
✓ Branch 3 taken 3 times.
102 else if (!stricmp(word[2], "half"))
1392 {
1393 96 disable_bank_cross_errors = false;
1394 96 check_half_banks_crossed = true;
1395 }
1396
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
6 else if (!stricmp(word[2], "full"))
1397 {
1398 6 disable_bank_cross_errors = false;
1399 6 check_half_banks_crossed = false;
1400 }
1401 else asar_throw_error(0, error_type_block, error_id_invalid_check);
1402
1403 }
1404 else
1405 {
1406 asar_throw_error(0, error_type_block, error_id_invalid_check);
1407 }
1408 }
1409
9/10
✓ Branch 0 taken 1845 times.
✓ Branch 1 taken 37566 times.
✓ Branch 2 taken 1845 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 35226 times.
✓ Branch 5 taken 4185 times.
✓ Branch 6 taken 108 times.
✓ Branch 7 taken 35118 times.
✓ Branch 8 taken 54 times.
✓ Branch 9 taken 16443 times.
39411 else if (is0("asar") || is1("asar"))
1410 {
1411
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1412
2/2
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
198 if (!par) return;
1413 54 int dots=0;
1414 54 int dig=0;
1415
2/2
✓ Branch 0 taken 450 times.
✓ Branch 1 taken 108 times.
558 for (int i=0;par[i];i++)
1416 {
1417
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 324 times.
450 if (par[i]=='.')
1418 {
1419
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (!dig) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1420 63 dig=0;
1421 126 dots++;
1422 }
1423
1/2
✓ Branch 0 taken 324 times.
✗ Branch 1 not taken.
324 else if (is_digit(par[i])) dig++;
1424 else asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1425 }
1426
4/8
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
108 if (!dig || !dots || dots>2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1427
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 autoptr<char**> vers=split(par, '.');
1428 108 int vermaj=atoi(vers[0]);
1429
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (vermaj > asarver_maj) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1430
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
108 if (vermaj<asarver_maj) return;
1431
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if (dots==1)
1432 {
1433 if (strlen(vers[1])!=2) asar_throw_error(0, error_type_block, error_id_invalid_version_number);
1434 //if (asarver_min<10 && asarver_bug<10 && strlen(vers[1])>2) error(0, "This version of Asar is too old for this patch.");
1435 int verminbug=atoi(vers[1]);
1436 int tmpver=asarver_bug;
1437 if (tmpver>9) tmpver=9;
1438 if (asarver_min*10+tmpver<verminbug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1439 }
1440 else
1441 {
1442 18 int vermin=atoi(vers[1]);
1443
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (vermin>asarver_min) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1444 18 int verbug=atoi(vers[2]);
1445
2/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (vermin==asarver_min && verbug>asarver_bug) asar_throw_error(pass, error_type_fatal, error_id_asar_too_old);
1446 }
1447
2/2
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 45 times.
108 }
1448
10/10
✓ Branch 0 taken 1845 times.
✓ Branch 1 taken 37458 times.
✓ Branch 2 taken 1839 times.
✓ Branch 3 taken 6 times.
✓ Branch 4 taken 35118 times.
✓ Branch 5 taken 4179 times.
✓ Branch 6 taken 18 times.
✓ Branch 7 taken 35100 times.
✓ Branch 8 taken 12 times.
✓ Branch 9 taken 16431 times.
39303 else if (is0("include") || is1("includefrom"))
1449 {
1450
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
24 if (!asarverallowed) asar_throw_error(0, error_type_block, error_id_start_of_file);
1451
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
6 if (in_top_level_file())
1452 {
1453
1/10
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
6 if (par) asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, (string(" The main file is '") + par + "'.").data());
1454
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 else asar_throw_error(pass, error_type_fatal, error_id_cant_be_main_file, "");
1455 }
1456 }
1457
6/6
✓ Branch 0 taken 1839 times.
✓ Branch 1 taken 37440 times.
✓ Branch 2 taken 906 times.
✓ Branch 3 taken 933 times.
✓ Branch 4 taken 45 times.
✓ Branch 5 taken 16386 times.
39279 else if (is0("includeonce"))
1458 {
1459
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 const char* current_file = get_current_file_name();
1460
2/4
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 90 times.
✗ Branch 3 not taken.
90 if (!file_included_once(current_file))
1461 {
1462
2/4
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 45 times.
✗ Branch 3 not taken.
90 includeonce.append(current_file);
1463 }
1464 }
1465
6/6
✓ Branch 0 taken 2142 times.
✓ Branch 1 taken 37047 times.
✓ Branch 2 taken 1818 times.
✓ Branch 3 taken 324 times.
✓ Branch 4 taken 324 times.
✓ Branch 5 taken 747 times.
39189 else if (numwords==3 && !stricmp(word[1], "="))
1466 {
1467
3/4
✓ Branch 0 taken 1206 times.
✓ Branch 1 taken 288 times.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1494 if(word[0][0] == '\'' && word[0][1])
1468 {
1469 int codepoint;
1470 1206 const char* char_start = word[0]+1;
1471
1/2
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
1206 const char* after = char_start + utf8_val(&codepoint, char_start);
1472
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1206 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
1206 if (codepoint == -1) asar_throw_error(0, error_type_block, error_id_invalid_utf8);
1473
2/4
✓ Branch 0 taken 1206 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1206 times.
✗ Branch 3 not taken.
1206 if(after[0] == '\'' && after[1] == '\0') {
1474
3/4
✓ Branch 0 taken 1188 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 1188 times.
✗ Branch 3 not taken.
1206 thetable.set_val(codepoint, getnum(word[2]));
1475
3/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1170 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1188 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1476 1188 return;
1477 } // todo: error checking here
1478 }
1479 // randomdude999: int cast b/c i'm too lazy to also mess with making setlabel()
1480 // unsigned, besides it wouldn't matter anyways.
1481
1/2
✓ Branch 0 taken 288 times.
✗ Branch 1 not taken.
288 int num=(int)getnum(word[2]);
1482
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
288 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_label_cross_assignment);
1483
1484 270 const char* newlabelname = word[0];
1485 135 bool ismacro = false;
1486
1487
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
270 if (newlabelname[0] == '?')
1488 {
1489 9 ismacro = true;
1490 18 newlabelname++;
1491 }
1492
1493
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
144 if (ismacro && macrorecursion == 0)
1494 {
1495 asar_throw_error(0, error_type_block, error_id_macro_label_outside_of_macro);
1496 }
1497
1498
3/7
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 90 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
270 if (!confirmname(newlabelname)) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1499
1500 135 string completename;
1501
1502
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
270 if (ismacro)
1503 {
1504
5/10
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
27 completename += STR":macro_" + dec(calledmacros) + "_";
1505 }
1506
1507
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 completename += newlabelname;
1508
1509
2/4
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
270 setlabel(ns + completename, num, true);
1510 270 }
1511
3/4
✓ Branch 0 taken 37695 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36990 times.
✓ Branch 3 taken 705 times.
37695 else if (assemblemapper(word, numwords)) {}
1512
6/6
✓ Branch 0 taken 35043 times.
✓ Branch 1 taken 1947 times.
✓ Branch 2 taken 20787 times.
✓ Branch 3 taken 14256 times.
✓ Branch 4 taken 1203 times.
✓ Branch 5 taken 14070 times.
36990 else if (is1("org"))
1513 {
1514
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2364 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1515
1/2
✓ Branch 0 taken 1203 times.
✗ Branch 1 not taken.
2364 freespaceend();
1516
1/2
✓ Branch 0 taken 2364 times.
✗ Branch 1 not taken.
2364 unsigned int num=getnum(par);
1517
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
2364 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_org_label_forward);
1518
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 2364 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
2364 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex(num, 6).data());
1519
5/10
✓ Branch 0 taken 813 times.
✓ Branch 1 taken 1551 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 795 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1569 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
2364 if ((mapper==lorom || mapper==exlorom) && (num&0x408000)==0x400000 && (num&0x700000)!=0x700000) asar_throw_warning(0, warning_id_set_middle_byte);
1520 //if (fastrom) num|=0x800000;
1521 2364 snespos=(int)num;
1522 2364 realsnespos=(int)num;
1523 2364 startpos=(int)num;
1524 2364 realstartpos=(int)num;
1525 2364 snespos_valid = true;
1526 }
1527 #define ret_error(errid) { asar_throw_error(0, error_type_block, errid); return; }
1528 #define ret_error_params(errid, ...) { asar_throw_error(0, error_type_block, errid, __VA_ARGS__); return; }
1529
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34356 times.
34626 else if (is("struct"))
1530 {
1531 //verifysnespos();
1532
2/6
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 270 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (in_struct || in_sub_struct) ret_error(error_id_nested_struct);
1533
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if (numwords < 2) ret_error(error_id_missing_struct_params);
1534
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if (numwords > 4) ret_error(error_id_too_many_struct_params);
1535
3/7
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 90 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
270 if (!confirmname(word[1])) ret_error(error_id_invalid_struct_name);
1536
1537
6/10
✓ Branch 0 taken 201 times.
✓ Branch 1 taken 69 times.
✓ Branch 2 taken 132 times.
✓ Branch 3 taken 69 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 66 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 135 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
270 if (structs.exists(word[1]) && pass == 0) ret_error_params(error_id_struct_redefined, word[1]);
1538
1539 270 static_struct = false;
1540 270 old_snespos = snespos;
1541 270 old_startpos = startpos;
1542 270 old_optimizeforbank = optimizeforbank;
1543 270 old_snespos_valid = snespos_valid;
1544 135 unsigned int base = 0;
1545
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1546 {
1547 90 static_struct = true;
1548
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 base = getnum(word[2]);
1549
1550
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if (foundlabel && !foundlabel_static) static_struct = false;
1551 }
1552
1553 270 bool old_in_struct = in_struct;
1554 270 bool old_in_sub_struct = in_sub_struct;
1555
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 36 times.
270 in_struct = numwords == 2 || numwords == 3;
1556 270 in_sub_struct = numwords == 4;
1557
1558 #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; }
1559 #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; }
1560
1561
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 180 times.
270 if (numwords == 3)
1562 {
1563
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
90 if (base&~0xFFFFFF) ret_error_params_cleanup(error_id_snes_address_out_of_bounds, hex((unsigned int)base, 6).data());
1564 90 snespos = (int)base;
1565 90 startpos = (int)base;
1566 }
1567
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 108 times.
180 else if (numwords == 4)
1568 {
1569
3/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
72 if (strcasecmp(word[2], "extends")) ret_error_cleanup(error_id_missing_extends);
1570
3/7
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 48 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
72 if (!confirmname(word[3])) ret_error_cleanup(error_id_struct_invalid_parent_name);
1571
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 string tmp_struct_parent = word[3];
1572
1573
3/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
72 if (!structs.exists(tmp_struct_parent)) ret_error_params_cleanup(error_id_struct_not_found, tmp_struct_parent.data());
1574
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 snes_struct structure = structs.find(tmp_struct_parent);
1575
1576 72 static_struct = structure.is_static;
1577
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 struct_parent = tmp_struct_parent;
1578 72 snespos = structure.base_end;
1579 72 startpos = structure.base_end;
1580
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 }
1581
1582
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 push_pc();
1583
1584 270 optimizeforbank = -1;
1585
1586
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 struct_name = word[1];
1587 270 struct_base = snespos;
1588 270 realsnespos = 0;
1589 270 realstartpos = 0;
1590 270 snespos_valid = true;
1591
1592
2/4
✓ Branch 0 taken 270 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
405 setlabel(ns + struct_name, snespos, static_struct);
1593
1594 #undef ret_error_cleanup
1595 #undef ret_error_params_cleanup
1596 }
1597
2/2
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 34086 times.
34356 else if (is("endstruct"))
1598 {
1599
3/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (numwords != 1 && numwords != 3) ret_error(error_id_invalid_endstruct_count);
1600
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
270 if (numwords == 3 && strcasecmp(word[1], "align")) ret_error(error_id_expected_align);
1601
3/6
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 72 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
270 if (!in_struct && !in_sub_struct) ret_error(error_id_endstruct_without_struct);
1602
1603
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 252 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
270 int alignment = numwords == 3 ? (int)getnum(word[2]) : 1;
1604
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
144 if (alignment < 1) ret_error(error_id_alignment_too_small);
1605
1606 135 snes_struct structure;
1607 270 structure.base_end = snespos;
1608 270 structure.struct_size = alignment * ((snespos - struct_base + alignment - 1) / alignment);
1609 270 structure.object_size = structure.struct_size;
1610 270 structure.is_static = static_struct;
1611
1612
2/2
✓ Branch 0 taken 198 times.
✓ Branch 1 taken 72 times.
270 if (in_struct)
1613 {
1614
2/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
198 structs.create(struct_name) = structure;
1615 }
1616
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (in_sub_struct)
1617 {
1618 36 snes_struct parent;
1619
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 parent = structs.find(struct_parent);
1620
1621
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 if (parent.object_size < parent.struct_size + structure.struct_size) {
1622 72 parent.object_size = parent.struct_size + structure.struct_size;
1623 }
1624
1625
4/8
✓ Branch 0 taken 72 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.
72 structs.create(struct_parent + "." + struct_name) = structure;
1626
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 structs.create(struct_parent) = parent;
1627 36 }
1628
1629
1/2
✓ Branch 0 taken 135 times.
✗ Branch 1 not taken.
270 pop_pc();
1630 270 in_struct = false;
1631 270 in_sub_struct = false;
1632 270 snespos = old_snespos;
1633 270 startpos = old_startpos;
1634 270 optimizeforbank = old_optimizeforbank;
1635 270 snespos_valid = old_snespos_valid;
1636 270 static_struct = false;
1637 135 }
1638 #undef ret_error
1639
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 34068 times.
34086 else if(is("spcblock"))
1640 {
1641 //banned features when active: org, freespace(and variants), arch, mapper,namespace,pushns
1642
2/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if(in_struct || in_sub_struct) asar_throw_error(0, error_type_block, error_id_spcblock_inside_struct);
1643
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(numwords < 2) asar_throw_error(0, error_type_block, error_id_spcblock_too_few_args);
1644
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(numwords > 4) asar_throw_error(0, error_type_block, error_id_spcblock_too_many_args);
1645
1646
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.destination = getnum(par);
1647 18 spcblock.type = spcblock_nspc;
1648
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 spcblock.macro_name = "";
1649
1650
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (spcblock.destination&~0xFFFF) asar_throw_error(0, error_type_block, error_id_snes_address_out_of_bounds, hex(spcblock.destination, 6).data());
1651
1652
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 if(numwords == 3)
1653 {
1654 if(!stricmp(word[2], "nspc")) spcblock.type = spcblock_nspc;
1655 else if(!stricmp(word[2], "custom")) asar_throw_error(0, error_type_block, error_id_custom_spcblock_missing_macro);
1656 else asar_throw_error(0, error_type_block, error_id_unknown_spcblock_type);
1657 }
1658
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 else if(numwords == 4)
1659 {
1660 if(!stricmp(word[2], "custom")) spcblock.type = spcblock_custom;
1661 else asar_throw_error(0, error_type_block, error_id_extra_spcblock_arg_for_type);
1662
1663 if(macros.exists(word[3]))
1664 {
1665 macrodata *macro = macros.find(word[3]);
1666 if(!macro->variadic) asar_throw_error(0, error_type_block, error_id_spcblock_macro_must_be_varadic);
1667 if(macro->numargs != 3) asar_throw_error(0, error_type_block, error_id_spcblock_macro_invalid_static_args);
1668 spcblock.macro_name = word[3];
1669 }
1670 else asar_throw_error(0, error_type_block, error_id_spcblock_macro_doesnt_exist);
1671 }
1672
1673
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1674 {
1675 18 case spcblock_nspc:
1676 18 spcblock.size_address=realsnespos;
1677
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1678
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(spcblock.destination);
1679 18 snespos=(int)spcblock.destination;
1680 18 startpos=(int)spcblock.destination;
1681 18 spcblock.execute_address = -1u;
1682
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
1683 9 break;
1684 case spcblock_custom:
1685 //this is a todo that probably won't be ready for 1.9
1686 //mostly so we can leverage some cleanups we make in 2.0 for practicality
1687 asar_throw_error(0, error_type_block, error_id_spcblock_custom_types_incomplete);
1688 push_pc();
1689 spcblock.old_mapper = mapper;
1690 mapper = norom;
1691 break;
1692 default:
1693 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1694 }
1695
1696
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns_backup = ns;
1697
3/6
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
18 ns = STR":SPCBLOCK:_" + ns_backup;
1698 18 in_spcblock = true;
1699 }
1700
6/6
✓ Branch 0 taken 849 times.
✓ Branch 1 taken 33219 times.
✓ Branch 2 taken 423 times.
✓ Branch 3 taken 426 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13782 times.
34068 else if(is0("endspcblock"))
1701 {
1702
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_endspcblock_without_spcblock);
1703
1704
1/3
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
18 switch(spcblock.type)
1705 {
1706 18 case spcblock_nspc:
1707
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
18 if (pass==2)
1708 {
1709
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
6 int pcpos=snestopc(spcblock.size_address&0xFFFFFF);
1710
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
6 if (pcpos<0) asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, hex((unsigned int)realsnespos, 6).data());
1711 6 int num=snespos-startpos;
1712
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos, (unsigned char)num);
1713
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 writeromdata_byte(pcpos+1, (unsigned char)(num >> 8));
1714 }
1715
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(spcblock.execute_address != -1u)
1716 {
1717
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2(0x0000);
1718
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write2((unsigned int)spcblock.execute_address);
1719 }
1720 9 break;
1721 case spcblock_custom:
1722 mapper = spcblock.old_mapper;
1723 pop_pc();
1724 break;
1725 default:
1726 asar_throw_error(0, error_type_fatal, error_id_internal_error, "invalid spcblock type");
1727 }
1728
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
9 ns = ns_backup;
1729 18 in_spcblock = false;
1730 }
1731
6/6
✓ Branch 0 taken 32553 times.
✓ Branch 1 taken 1497 times.
✓ Branch 2 taken 19521 times.
✓ Branch 3 taken 13032 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 13773 times.
34050 else if (is1("startpos"))
1732 {
1733
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(!in_spcblock) asar_throw_error(0, error_type_block, error_id_startpos_without_spcblock);
1734
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 spcblock.execute_address=getnum(par);
1735 }
1736
6/6
✓ Branch 0 taken 32535 times.
✓ Branch 1 taken 1497 times.
✓ Branch 2 taken 19512 times.
✓ Branch 3 taken 13023 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 13638 times.
34032 else if (is1("base"))
1737 {
1738
4/4
✓ Branch 0 taken 180 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 90 times.
270 if (!stricmp(par, "off"))
1739 {
1740 90 snespos=realsnespos;
1741 90 startpos=realstartpos;
1742 90 snespos_valid = realsnespos >= 0;
1743 90 return;
1744 }
1745
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 unsigned int num=getnum(par);
1746
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
180 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_base_label_invalid);
1747
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 180 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
180 if (num&~0xFFFFFF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num).data());
1748 180 snespos=(int)num;
1749 180 startpos=(int)num;
1750 180 optimizeforbank=-1;
1751 180 snespos_valid = realsnespos >= 0;
1752 }
1753
6/6
✓ Branch 0 taken 32265 times.
✓ Branch 1 taken 1497 times.
✓ Branch 2 taken 19377 times.
✓ Branch 3 taken 12888 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 13620 times.
33762 else if (is1("dpbase"))
1754 {
1755
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 unsigned int num=(int)getnum(par);
1756
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (forwardlabel) asar_throw_error(0, error_type_block, error_id_base_label_invalid);
1757
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if (num&~0xFF00) asar_throw_error(1, error_type_block, error_id_bad_dp_base, hex((unsigned int)num, 6).data());
1758 36 dp_base = (int)num;
1759 }
1760
6/6
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 33186 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 270 times.
✓ Branch 4 taken 117 times.
✓ Branch 5 taken 13503 times.
33726 else if (is2("optimize"))
1761 {
1762
4/4
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 72 times.
234 if (!stricmp(par, "dp"))
1763 {
1764
4/4
✓ Branch 0 taken 63 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 27 times.
90 if (!stricmp(word[2], "none"))
1765 {
1766 36 optimize_dp = optimize_dp_flag::NONE;
1767 36 return;
1768 }
1769
4/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 18 times.
54 if (!stricmp(word[2], "ram"))
1770 {
1771 18 optimize_dp = optimize_dp_flag::RAM;
1772 18 return;
1773 }
1774
2/4
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 if (!stricmp(word[2], "always"))
1775 {
1776 36 optimize_dp = optimize_dp_flag::ALWAYS;
1777 36 return;
1778 }
1779 asar_throw_error(1, error_type_block, error_id_bad_dp_optimize, word[2]);
1780 }
1781
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 if (!stricmp(par, "address"))
1782 {
1783
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 54 times.
144 if (!stricmp(word[2], "default"))
1784 {
1785 36 optimize_address = optimize_address_flag::DEFAULT;
1786 36 return;
1787 }
1788
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 27 times.
108 if (!stricmp(word[2], "ram"))
1789 {
1790 54 optimize_address = optimize_address_flag::RAM;
1791 54 return;
1792 }
1793
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 if (!stricmp(word[2], "mirrors"))
1794 {
1795 54 optimize_address = optimize_address_flag::MIRRORS;
1796 54 return;
1797 }
1798 asar_throw_error(1, error_type_block, error_id_bad_address_optimize, word[2]);
1799 }
1800 asar_throw_error(1, error_type_block, error_id_bad_optimize, par);
1801 }
1802
6/6
✓ Branch 0 taken 32229 times.
✓ Branch 1 taken 1263 times.
✓ Branch 2 taken 19359 times.
✓ Branch 3 taken 12870 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 13476 times.
33492 else if (is1("bank"))
1803 {
1804
4/4
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 18 times.
54 if (!stricmp(par, "auto"))
1805 {
1806 18 optimizeforbank=-1;
1807 18 return;
1808 }
1809
4/4
✓ Branch 0 taken 27 times.
✓ Branch 1 taken 9 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
36 if (!stricmp(par, "noassume"))
1810 {
1811 18 optimizeforbank=0x140;
1812 18 return;
1813 }
1814
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 unsigned int num=getnum(par);
1815 //if (forwardlabel) error(0, "bank Label is not valid");
1816 //if (foundlabel) num>>=16;
1817
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (num&~0x0000FF) asar_throw_error(1, error_type_block, error_id_snes_address_out_of_bounds, hex((unsigned int)num, 6).data());
1818 18 optimizeforbank=(int)num;
1819 }
1820
10/10
✓ Branch 0 taken 33420 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 30198 times.
✓ Branch 3 taken 3222 times.
✓ Branch 4 taken 29298 times.
✓ Branch 5 taken 900 times.
✓ Branch 6 taken 17892 times.
✓ Branch 7 taken 11406 times.
✓ Branch 8 taken 2205 times.
✓ Branch 9 taken 11271 times.
33438 else if (is("freespace") || is("freecode") || is("freedata") || is("segment"))
1821 {
1822
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4410 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4410 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1823 2205 string parstr;
1824
3/4
✓ Branch 0 taken 378 times.
✓ Branch 1 taken 4032 times.
✓ Branch 2 taken 189 times.
✗ Branch 3 not taken.
4410 if (numwords==1) parstr="\n";//crappy hack: impossible character to cut out extra commas
1825
2/4
✓ Branch 0 taken 4032 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2016 times.
✗ Branch 3 not taken.
4032 else if (numwords==2) parstr=word[1];
1826 else asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1827
5/8
✓ Branch 0 taken 3222 times.
✓ Branch 1 taken 1188 times.
✓ Branch 2 taken 1611 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1611 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1611 times.
✗ Branch 7 not taken.
6021 if (is("freecode")) parstr=STR"ram,"+parstr;
1828
5/8
✓ Branch 0 taken 900 times.
✓ Branch 1 taken 3510 times.
✓ Branch 2 taken 450 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 450 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 450 times.
✗ Branch 7 not taken.
4860 if (is("freedata")) parstr=STR"noram,"+parstr;
1829
5/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4140 times.
✓ Branch 2 taken 135 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 135 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 135 times.
✗ Branch 7 not taken.
4545 if (is("segment")) parstr = STR "norats," + parstr;
1830
1/2
✓ Branch 0 taken 4410 times.
✗ Branch 1 not taken.
4410 autoptr<char**> pars=split(parstr.temp_raw(), ',');
1831 2205 unsigned char fsbyte = 0x00;
1832 2205 bool fixedpos=false;
1833 2205 bool align=false;
1834 2205 bool leakwarn=true;
1835 2205 bool write_rats=true;
1836 2205 int target_bank = -3;
1837
1/2
✓ Branch 0 taken 2205 times.
✗ Branch 1 not taken.
2205 string pin_to_freespace = "";
1838 2205 int search_start_pos = -1;
1839
1840
2/2
✓ Branch 0 taken 8838 times.
✓ Branch 1 taken 4410 times.
13248 for (int i=0;pars[i];i++)
1841 {
1842
2/2
✓ Branch 0 taken 8460 times.
✓ Branch 1 taken 378 times.
8838 if (pars[i][0]=='\n') {}
1843
4/4
✓ Branch 0 taken 5841 times.
✓ Branch 1 taken 2619 times.
✓ Branch 2 taken 1611 times.
✓ Branch 3 taken 2619 times.
8460 else if (!stricmp(pars[i], "ram"))
1844 {
1845
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3222 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3222 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1846 1611 target_bank = -2;
1847 }
1848
4/4
✓ Branch 0 taken 3069 times.
✓ Branch 1 taken 2169 times.
✓ Branch 2 taken 450 times.
✓ Branch 3 taken 2169 times.
5238 else if (!stricmp(pars[i], "noram"))
1849 {
1850
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 900 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
900 if (target_bank!=-3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1851 450 target_bank = -1;
1852 }
1853
4/4
✓ Branch 0 taken 2187 times.
✓ Branch 1 taken 2151 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2151 times.
4338 else if (!stricmp(pars[i], "static"))
1854 {
1855
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (fixedpos) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1856 18 fixedpos=true;
1857 }
1858
4/4
✓ Branch 0 taken 2169 times.
✓ Branch 1 taken 2133 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 2133 times.
4302 else if (!stricmp(pars[i], "align"))
1859 {
1860
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (align) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1861 18 align=true;
1862 }
1863
4/4
✓ Branch 0 taken 4032 times.
✓ Branch 1 taken 234 times.
✓ Branch 2 taken 1899 times.
✓ Branch 3 taken 234 times.
4266 else if (!stricmp(pars[i], "cleaned"))
1864 {
1865
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3798 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
3798 if (!leakwarn) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1866 1899 leakwarn=false;
1867 }
1868
4/4
✓ Branch 0 taken 369 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 135 times.
468 else if (!stricmp(pars[i], "norats"))
1869 {
1870 135 write_rats=false;
1871 }
1872
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 108 times.
198 else if (stribegin(pars[i], "bank="))
1873 {
1874
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if(target_bank != -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1875
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 target_bank = getnum(pars[i] + 5);
1876
2/6
✓ Branch 0 taken 45 times.
✓ Branch 1 taken 45 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
90 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1877 }
1878
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 else if (stribegin(pars[i], "start="))
1879 {
1880
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 search_start_pos = getnum(pars[i] + 6);
1881
2/6
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
36 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1882 }
1883
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 else if (stribegin(pars[i], "pin="))
1884 {
1885 // TODO: should we handle posneg labels here too?
1886
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
72 string pin_to = pars[i] + 4;
1887 72 const char* pin_to_c = pin_to.data();
1888
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 pin_to_freespace = labelname(&pin_to_c);
1889
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
72 if(*pin_to_c) asar_throw_error(0, error_type_block, error_id_invalid_label_name);
1890 // this is to throw an "undefined label" error with the proper callstack
1891
4/6
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 48 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 24 times.
✗ Branch 5 not taken.
96 if(pass) labelval(pin_to);
1892 72 }
1893 else if (stribegin(pars[i], "cleanbyte="))
1894 {
1895 fsbyte = getnum(pars[i] + strlen("cleanbyte="));
1896 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
1897 }
1898 else
1899 {
1900 // for backwards compat i guess
1901 fsbyte = (unsigned char)getnum(pars[i]);
1902 }
1903 }
1904
3/4
✓ Branch 0 taken 2205 times.
✓ Branch 1 taken 2205 times.
✓ Branch 2 taken 99 times.
✗ Branch 3 not taken.
4410 if(target_bank == -3 && !write_rats) target_bank = -1;
1905
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4311 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
4311 if(target_bank == -3) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1906 // no point specifying anything about cleaning when not writing a rats tag
1907
4/8
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 4140 times.
✓ Branch 2 taken 270 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 135 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
4410 if(!write_rats && (!leakwarn || fixedpos)) asar_throw_error(0, error_type_block, error_id_invalid_freespace_request);
1908
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 2070 times.
2205 if(!write_rats) leakwarn = false;
1909
1/2
✓ Branch 0 taken 2205 times.
✗ Branch 1 not taken.
4410 freespaceend();
1910
1/2
✓ Branch 0 taken 2205 times.
✗ Branch 1 not taken.
4410 freespaceid=getfreespaceid();
1911
1/2
✓ Branch 0 taken 2205 times.
✗ Branch 1 not taken.
2205 freespace_data& thisfs = freespaces[freespaceid];
1912 4410 thisfs.cleanbyte = fsbyte;
1913
1914
1/2
✓ Branch 0 taken 2205 times.
✗ Branch 1 not taken.
4410 thisfs.pin_target = pin_to_freespace;
1915
5/6
✓ Branch 0 taken 2241 times.
✓ Branch 1 taken 2169 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 2169 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
4410 if(pin_to_freespace) thisfs.pin_target_ns = ns;
1916 4410 thisfs.write_rats = write_rats;
1917 4410 thisfs.search_start = search_start_pos;
1918 4410 thisfs.bank = target_bank;
1919 4410 thisfs.flag_align = align;
1920
1921
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 2940 times.
4410 if (pass==0) snespos=0;
1922
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 2940 times.
4410 if (pass==1)
1923 {
1924
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1458 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1470 if (fixedpos && thisfs.orgpos<0)
1925 {
1926 thisfs.pos = 0;
1927 thisfs.leaked = false;//mute some other errors
1928 asar_throw_error(1, error_type_block, error_id_static_freespace_autoclean);
1929 }
1930 1470 snespos = 0;
1931 }
1932
2/2
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 2940 times.
4410 if (pass==2)
1933 {
1934
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 1458 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
1470 if (fixedpos && thisfs.orgpos == -1) return;//to kill some errors
1935 1470 snespos=thisfs.pos;
1936
3/6
✓ Branch 0 taken 1350 times.
✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1350 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
1470 if (thisfs.leaked && leakwarn) asar_throw_warning(2, warning_id_freespace_leaked);
1937
2/2
✓ Branch 0 taken 735 times.
✓ Branch 1 taken 735 times.
1470 freespaceuse += (write_rats ? 8 : 0) + thisfs.len;
1938
1939 // add a mapping for the start of the rats tag
1940
3/4
✓ Branch 0 taken 1380 times.
✓ Branch 1 taken 90 times.
✓ Branch 2 taken 1380 times.
✗ Branch 3 not taken.
1470 if (write_rats) add_addr_to_line(snespos-8);
1941 }
1942 4410 thisfs.is_static = fixedpos;
1943
1/8
✗ Branch 0 not taken.
✓ Branch 1 taken 4410 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.
4410 if (snespos < 0 && mapper == sa1rom) asar_throw_error(pass, error_type_fatal, error_id_no_freespace_in_mapped_banks, dec(thisfs.len).data());
1944
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 4410 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
4410 if (snespos < 0) asar_throw_error(pass, error_type_fatal, error_id_no_freespace, dec(thisfs.len).data());
1945
2/2
✓ Branch 0 taken 2205 times.
✓ Branch 1 taken 2205 times.
4410 bytes+=write_rats ? 8 : 0;
1946 4410 freespacestart=snespos;
1947 4410 startpos=snespos;
1948 4410 realstartpos=snespos;
1949 4410 realsnespos=snespos;
1950 4410 optimizeforbank=-1;
1951
2/2
✓ Branch 0 taken 2205 times.
✓ Branch 1 taken 2205 times.
4410 ratsmetastate=write_rats ? ratsmeta_allow : ratsmeta_ban;
1952 4410 snespos_valid = true;
1953 // check this at the very end so that snespos gets set properly, to
1954 // prevent spurious errors later
1955 //...i guess this can still cause bankcross errors if the old freespace
1956 //happened to be very close to the end of a bank or something, but
1957 //whatever
1958
7/8
✓ Branch 0 taken 1470 times.
✓ Branch 1 taken 2940 times.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 1458 times.
✓ Branch 4 taken 6 times.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 6 times.
✗ Branch 7 not taken.
4410 if (pass == 2 && fixedpos && thisfs.orgpos > 0 && thisfs.len > thisfs.orglen)
1959
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 asar_throw_error(2, error_type_block, error_id_static_freespace_growing);
1960
3/6
✓ Branch 0 taken 2202 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2202 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2202 times.
✗ Branch 5 not taken.
4422 }
1961
6/6
✓ Branch 0 taken 28143 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 17316 times.
✓ Branch 3 taken 10827 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 11208 times.
29028 else if (is1("prot"))
1962 {
1963
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1964
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (!ratsmetastate) asar_throw_error(2, error_type_block, error_id_prot_not_at_freespace_start);
1965
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 90 times.
126 if (ratsmetastate==ratsmeta_used) step(-5);
1966 int num;
1967
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 autoptr<char**> pars=qpsplit(par, ',', &num);
1968
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 verify_paren(pars);
1969
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
1970
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('R');
1971
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
1972
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
1973
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 126 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
126 if (num * 3 > 255) asar_throw_error(0, error_type_block, error_id_prot_too_many_entries);
1974
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 write1((unsigned int)(num*3));
1975
2/2
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 126 times.
288 for (int i=0;i<num;i++)
1976 {
1977 //int num=getnum(pars[i]);
1978 162 const char * labeltest=pars[i];
1979
1/2
✓ Branch 0 taken 81 times.
✗ Branch 1 not taken.
81 string testlabel = labeltest;
1980
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 snes_label lblval = labelval(&labeltest);
1981
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 162 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
162 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, testlabel.data());
1982
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 write3(lblval.pos);
1983
3/4
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
162 if (pass==1) freespaces[lblval.freespace_id].leaked = false;
1984 162 }
1985
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('S');
1986
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('T');
1987
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('O');
1988
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1('P');
1989
1/2
✓ Branch 0 taken 63 times.
✗ Branch 1 not taken.
63 write1(0);
1990 126 ratsmetastate=ratsmeta_used;
1991
1992
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 add_addr_to_line(addrToLinePos);
1993 126 }
1994
9/10
✓ Branch 0 taken 28017 times.
✓ Branch 1 taken 885 times.
✓ Branch 2 taken 28017 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 306 times.
✓ Branch 5 taken 28596 times.
✓ Branch 6 taken 198 times.
✓ Branch 7 taken 108 times.
✓ Branch 8 taken 99 times.
✓ Branch 9 taken 11109 times.
28902 else if (is1("autoclean") || is2("autoclean"))
1995 {
1996
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
198 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
1997
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 if (numwords==3)
1998 {
1999
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
198 if(freespaceid > 0)
2000 asar_throw_error(0, error_type_block, error_id_autoclean_in_freespace);
2001 198 const char * labeltest = word[2];
2002
1/2
✓ Branch 0 taken 99 times.
✗ Branch 1 not taken.
99 string testlabel = labeltest;
2003
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 snes_label lblval = labelval(&labeltest);
2004
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
198 if (*labeltest) asar_throw_error(0, error_type_block, error_id_label_not_found, testlabel.data());
2005 198 int targetid= lblval.freespace_id;
2006
3/4
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 132 times.
✓ Branch 2 taken 33 times.
✗ Branch 3 not taken.
231 if (pass==1) freespaces[targetid].leaked = false;
2007 198 int num = lblval.pos;
2008
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 198 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
198 if (strlen(par)>3 && !stricmp(par+3, ".l")) par[3]=0;
2009
7/8
✓ Branch 0 taken 153 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 99 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 54 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 45 times.
198 if (!stricmp(par, "JSL") || !stricmp(par, "JML"))
2010 {
2011
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
180 int orgpos=read3(snespos+1);
2012
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
180 int ratsloc=freespaces[targetid].orgpos;
2013
4/4
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 45 times.
✓ Branch 2 taken 45 times.
✓ Branch 3 taken 45 times.
180 int firstbyte = ((!stricmp(par, "JSL")) ? 0x22 : 0x5C);
2014
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
180 int pcpos=snestopc(snespos);
2015
4/6
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 72 times.
✓ Branch 5 taken 108 times.
180 if (/*pass==1 && */pcpos>=0 && pcpos<romlen_r && romdata_r[pcpos]==firstbyte)
2016 {
2017
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 ratsloc=ratsstart(orgpos)+8;
2018
3/5
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 24 times.
✗ Branch 4 not taken.
72 freespaces[targetid].orglen=read2(ratsloc-4)+1;
2019
10/12
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 39 times.
✓ Branch 3 taken 27 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 21 times.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 27 times.
✓ Branch 8 taken 9 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 9 times.
✗ Branch 11 not taken.
81 if (!freespaces[targetid].is_static && pass==1) removerats(orgpos, freespaces[targetid].cleanbyte);
2020 }
2021
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 else if (ratsloc<0) ratsloc=0;
2022
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 write1((unsigned int)firstbyte);
2023
1/2
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
180 write3((unsigned int)num);
2024
2/2
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 120 times.
180 if (pass==2)
2025 {
2026
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
60 int start=ratsstart(num);
2027
3/4
✓ Branch 0 taken 30 times.
✓ Branch 1 taken 30 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 30 times.
60 if (start>=num || start<0)
2028 {
2029 asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
2030 }
2031
2032
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
60 add_addr_to_line(addrToLinePos);
2033 }
2034 //freespaceorglen[targetid]=read2(ratsloc-4)+1;
2035
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
180 freespaces[targetid].orgpos = ratsloc;
2036 90 }
2037
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 else if (!stricmp(par, "dl"))
2038 {
2039
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
18 int orgpos=read3(snespos);
2040
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 int ratsloc=freespaces[targetid].orgpos;
2041
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int start=ratsstart(num);
2042
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 12 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
18 if (pass==1 && num>=0)
2043 {
2044
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
6 ratsloc=ratsstart(orgpos)+8;
2045
4/8
✓ Branch 0 taken 6 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.
9 if (!freespaces[targetid].is_static) removerats(orgpos, freespaces[targetid].cleanbyte);
2046 }
2047
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
6 else if (!ratsloc) ratsloc=0;
2048
5/6
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
18 if ((start==num || start<0) && pass==2)
2049 asar_throw_error(2, error_type_block, error_id_autoclean_label_at_freespace_end);
2050
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 write3((unsigned int)num);
2051
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaces[targetid].orgpos = ratsloc;
2052
3/5
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
18 freespaces[targetid].orglen = read2(ratsloc-4)+1;
2053
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 add_addr_to_line(addrToLinePos);
2054 }
2055 else asar_throw_error(0, error_type_block, error_id_broken_autoclean);
2056 198 }
2057 // weird gotcha: we don't know the freespace id here, so we don't know what clean_byte to use
2058 else if (pass==0) removerats((int)getnum(word[1]), 0x00);
2059 }
2060
6/6
✓ Branch 0 taken 453 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 225 times.
✓ Branch 3 taken 228 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11100 times.
28704 else if (is0("pushpc"))
2061 {
2062
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 verifysnespos();
2063
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].arch=arch;
2064
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snespos=snespos;
2065
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstart=startpos;
2066
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesposreal=realsnespos;
2067
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].snesstartreal=realstartpos;
2068
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freeid=freespaceid;
2069
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 pushpc[pushpcnum].freest=freespacestart;
2070 18 pushpcnum++;
2071 18 snespos=(int)0xFFFFFFFF;
2072 18 startpos= (int)0xFFFFFFFF;
2073 18 realsnespos= (int)0xFFFFFFFF;
2074 18 realstartpos= (int)0xFFFFFFFF;
2075 18 snespos_valid = false;
2076 }
2077
6/6
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 216 times.
✓ Branch 3 taken 219 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11091 times.
28686 else if (is0("pullpc"))
2078 {
2079
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (!pushpcnum) asar_throw_error(0, error_type_block, error_id_pullpc_without_pushpc);
2080 18 pushpcnum--;
2081
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceend();
2082
3/6
✓ Branch 0 taken 9 times.
✓ Branch 1 taken 9 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if (arch != pushpc[pushpcnum].arch) asar_throw_error(0, error_type_block, error_id_pullpc_different_arch);
2083
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos=pushpc[pushpcnum].snespos;
2084
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos=pushpc[pushpcnum].snesstart;
2085
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realsnespos=pushpc[pushpcnum].snesposreal;
2086
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 realstartpos=pushpc[pushpcnum].snesstartreal;
2087
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespaceid=pushpc[pushpcnum].freeid;
2088
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 freespacestart=pushpc[pushpcnum].freest;
2089 18 snespos_valid = true;
2090 }
2091
6/6
✓ Branch 0 taken 417 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 207 times.
✓ Branch 3 taken 210 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11082 times.
28668 else if (is0("pushbase"))
2092 {
2093
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 basestack[basestacknum] = snespos;
2094 18 basestacknum++;
2095 }
2096
6/6
✓ Branch 0 taken 399 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 201 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 11073 times.
28650 else if (is0("pullbase"))
2097 {
2098
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (!basestacknum) asar_throw_error(0, error_type_block, error_id_pullbase_without_pushbase);
2099 18 basestacknum--;
2100
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 snespos = basestack[basestacknum];
2101
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
18 startpos = basestack[basestacknum];
2102
2103
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if (snespos != realstartpos)
2104 {
2105 18 optimizeforbank = -1;
2106 }
2107 }
2108
6/6
✓ Branch 0 taken 381 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 189 times.
✓ Branch 3 taken 192 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11055 times.
28632 else if (is0("pushns"))
2109 {
2110
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2111
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 pushns[pushnsnum].ns = ns;
2112
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 36 times.
72 for(int i = 0; i < namespace_list.count; i++)
2113 {
2114
3/6
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 18 times.
✗ Branch 5 not taken.
36 pushns[pushnsnum].namespace_list.append(namespace_list[i]);
2115 }
2116
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 pushns[pushnsnum].nested_namespaces = nested_namespaces;
2117 36 pushnsnum++;
2118
2119
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2120
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 ns = "";
2121 36 nested_namespaces = false;
2122 }
2123
6/6
✓ Branch 0 taken 345 times.
✓ Branch 1 taken 28251 times.
✓ Branch 2 taken 171 times.
✓ Branch 3 taken 174 times.
✓ Branch 4 taken 18 times.
✓ Branch 5 taken 11037 times.
28596 else if (is0("pullns"))
2124 {
2125
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2126
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
36 if (!pushnsnum) asar_throw_error(0, error_type_block, error_id_pullns_without_pushns);
2127 36 pushnsnum--;
2128
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
36 ns = pushns[pushnsnum].ns;
2129
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 nested_namespaces = pushns[pushnsnum].nested_namespaces;
2130
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2131
4/4
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 18 times.
108 for(int i = 0; i < pushns[pushnsnum].namespace_list.count; i++)
2132 {
2133
3/6
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
72 namespace_list.append(pushns[pushnsnum].namespace_list[i]);
2134 }
2135 }
2136
9/10
✓ Branch 0 taken 28017 times.
✓ Branch 1 taken 543 times.
✓ Branch 2 taken 27636 times.
✓ Branch 3 taken 381 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 28071 times.
✓ Branch 6 taken 108 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 246 times.
✓ Branch 9 taken 10791 times.
28560 else if (is1("namespace") || is2("namespace"))
2137 {
2138
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 489 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
489 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2139 246 bool leave = false;
2140
1/2
✓ Branch 0 taken 489 times.
✗ Branch 1 not taken.
489 if (par)
2141 {
2142
4/4
✓ Branch 0 taken 315 times.
✓ Branch 1 taken 174 times.
✓ Branch 2 taken 72 times.
✓ Branch 3 taken 171 times.
489 if (!stricmp(par, "off"))
2143 {
2144
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 144 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
144 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2145 72 leave = true;
2146 }
2147
4/4
✓ Branch 0 taken 225 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 117 times.
345 else if (!stricmp(par, "nested"))
2148 {
2149
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2150
4/4
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 27 times.
✓ Branch 2 taken 27 times.
✓ Branch 3 taken 27 times.
108 else if (!stricmp(word[2], "on")) nested_namespaces = true;
2151
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 else if (!stricmp(word[2], "off")) nested_namespaces = false;
2152 }
2153 else
2154 {
2155
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 237 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
237 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_namespace_use);
2156
1/2
✓ Branch 0 taken 237 times.
✗ Branch 1 not taken.
237 const char * tmpstr= safedequote(par);
2157
3/7
✓ Branch 0 taken 81 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 81 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
237 if (!confirmname(tmpstr)) asar_throw_error(0, error_type_block, error_id_invalid_namespace_name);
2158
2/2
✓ Branch 0 taken 93 times.
✓ Branch 1 taken 144 times.
237 if (!nested_namespaces)
2159 {
2160
1/2
✓ Branch 0 taken 48 times.
✗ Branch 1 not taken.
93 namespace_list.reset();
2161 }
2162
2/4
✓ Branch 0 taken 120 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 120 times.
✗ Branch 3 not taken.
237 namespace_list.append(tmpstr);
2163 }
2164 }
2165 else
2166 {
2167 leave = true;
2168 }
2169
2170
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 174 times.
246 if (leave)
2171 {
2172
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 36 times.
144 if (nested_namespaces)
2173 {
2174
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 namespace_list.remove(namespace_list.count - 1);
2175 }
2176 else
2177 {
2178
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
36 namespace_list.reset();
2179 }
2180 }
2181
2182 // recompute ns
2183
1/2
✓ Branch 0 taken 246 times.
✗ Branch 1 not taken.
246 ns = "";
2184
2/2
✓ Branch 0 taken 579 times.
✓ Branch 1 taken 489 times.
1068 for (int i = 0; i < namespace_list.count; i++)
2185 {
2186
2/4
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 291 times.
✗ Branch 3 not taken.
579 ns += namespace_list[i];
2187
1/2
✓ Branch 0 taken 291 times.
✗ Branch 1 not taken.
579 ns += "_";
2188 }
2189 }
2190
6/6
✓ Branch 0 taken 27636 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 17064 times.
✓ Branch 3 taken 10572 times.
✓ Branch 4 taken 36 times.
✓ Branch 5 taken 10755 times.
28071 else if (is1("warnpc"))
2191 {
2192
1/2
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
72 unsigned int maxpos=getnum(par);
2193
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
72 if (freespaceid > 0) asar_throw_error(0, error_type_block, error_id_warnpc_in_freespace);
2194
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
54 if ((unsigned int)maxpos & 0xFF000000) asar_throw_error(0, error_type_block, error_id_warnpc_broken_param);
2195
6/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✓ Branch 4 taken 9 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 9 times.
63 if ((unsigned int)snespos > maxpos) asar_throw_error(0, error_type_block, error_id_warnpc_failed, hex((unsigned int)snespos).data(), hex((unsigned int)maxpos, 6).data());
2196 }
2197 #ifdef SANDBOX
2198 else if (is("incsrc") || is("incbin") || is("table"))
2199 {
2200 asar_throw_error(0, error_type_block, error_id_command_disabled);
2201 }
2202 #endif
2203
6/6
✓ Branch 0 taken 27564 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 10530 times.
✓ Branch 3 taken 17034 times.
✓ Branch 4 taken 8739 times.
✓ Branch 5 taken 2016 times.
27999 else if (is1("incsrc"))
2204 {
2205 8739 string name;
2206 // RPG Hacker: Should this also throw on absolute paths?
2207 // E.g., on something starting with C:/ or whatever.
2208
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 23958 times.
23976 if (strchr(par, '\\'))
2209 {
2210
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2211 }
2212
2/4
✓ Branch 0 taken 23958 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 8730 times.
✗ Branch 3 not taken.
23958 name=safedequote(par);
2213
2/2
✓ Branch 0 taken 474 times.
✓ Branch 1 taken 23484 times.
23958 assemblefile(name);
2214 23976 }
2215
6/6
✓ Branch 0 taken 3588 times.
✓ Branch 1 taken 435 times.
✓ Branch 2 taken 1791 times.
✓ Branch 3 taken 1797 times.
✓ Branch 4 taken 108 times.
✓ Branch 5 taken 1908 times.
4023 else if (is1("incbin"))
2216 {
2217 int len;
2218 108 int start=0;
2219 108 int end=0;
2220
2/2
✓ Branch 0 taken 126 times.
✓ Branch 1 taken 90 times.
216 if (strqchr(par, ':'))
2221 {
2222 63 char * lengths=strqchr(par, ':');
2223 126 *lengths=0;
2224 126 lengths++;
2225
2226
1/2
✓ Branch 0 taken 126 times.
✗ Branch 1 not taken.
126 char* split = strqpstr(lengths, "..");
2227
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
126 if(!split) asar_throw_error(0, error_type_block, error_id_broken_incbin);
2228
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string start_str(lengths, split-lengths);
2229
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(start_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2230
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 start = getnum(start_str);
2231
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
108 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2232
1/2
✓ Branch 0 taken 45 times.
✗ Branch 1 not taken.
90 string end_str(split+2);
2233
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 90 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
90 if(end_str == "") asar_throw_error(0, error_type_block, error_id_broken_incbin);
2234
1/2
✓ Branch 0 taken 90 times.
✗ Branch 1 not taken.
90 end = getnum(end_str);
2235
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 54 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
90 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2236 126 }
2237
1/2
✓ Branch 0 taken 162 times.
✗ Branch 1 not taken.
162 const char* current_file = get_current_file_name();
2238 81 string name;
2239 // RPG Hacker: Should this also throw on absolute paths?
2240 // E.g., on something starting with C:/ or whatever.
2241
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 144 times.
162 if (strchr(par, '\\'))
2242 {
2243
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
18 asar_throw_error(0, error_type_block, error_id_platform_paths);
2244 }
2245
2/4
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 72 times.
✗ Branch 3 not taken.
144 name = safedequote(par);
2246 char * data;//I couldn't find a way to get this into an autoptr
2247
6/10
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 36 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 36 times.
144 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());
2248
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 36 times.
108 autoptr<char*> datacopy=data;
2249
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
108 if (!end) end=len;
2250
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if(start < 0) asar_throw_error(0, error_type_block, error_id_file_offset_out_of_bounds, dec(start).data(), name.data());
2251
3/10
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 108 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 108 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
108 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());
2252
2253
3/4
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 198 times.
✓ Branch 3 taken 108 times.
306 for (int i=start;i<end;i++) write1((unsigned int)data[i]);
2254
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 add_addr_to_line(addrToLinePos);
2255 162 }
2256
6/6
✓ Branch 0 taken 2043 times.
✓ Branch 1 taken 1764 times.
✓ Branch 2 taken 1017 times.
✓ Branch 3 taken 1026 times.
✓ Branch 4 taken 990 times.
✓ Branch 5 taken 918 times.
3807 else if (is("skip") || is("fill"))
2257 {
2258
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords != 2 && numwords != 3 && numwords != 5) asar_throw_error(0, error_type_block, error_id_unknown_command);
2259
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords > 2 && stricmp(word[1], "align")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2260
5/8
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
✓ Branch 2 taken 9 times.
✓ Branch 3 taken 9 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 9 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
1980 if(numwords == 5 && stricmp(word[3], "offset")) asar_throw_error(0, error_type_block, error_id_unknown_command);
2261 int amount;
2262
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 1962 times.
1980 if(numwords > 2)
2263 {
2264
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 int alignment = getnum(word[2]);
2265
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2266 9 int offset = 0;
2267
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 if(numwords==5)
2268 {
2269
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 offset = getnum(word[4]);
2270
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
18 if(foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2271 }
2272
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment > 0x800000) asar_throw_error(0, error_type_block, error_id_alignment_too_big);
2273
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment < 1) asar_throw_error(0, error_type_block, error_id_alignment_too_small);
2274
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if(alignment & (alignment-1)) asar_throw_error(0, error_type_block, error_id_invalid_alignment);
2275 // i just guessed this formula but it seems to work
2276 18 amount = (alignment - ((snespos - offset) & (alignment-1))) & (alignment-1);
2277 }
2278 else
2279 {
2280
1/2
✓ Branch 0 taken 1962 times.
✗ Branch 1 not taken.
1962 amount = (int)getnum(par);
2281
5/6
✓ Branch 0 taken 981 times.
✓ Branch 1 taken 981 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
1962 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2282 }
2283
2/2
✓ Branch 0 taken 1764 times.
✓ Branch 1 taken 198 times.
1962 if(is("skip")) step(amount);
2284 else
2285 {
2286
3/4
✓ Branch 0 taken 1221210 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1221210 times.
✓ Branch 3 taken 198 times.
1221408 for(int i=0; i < amount; i++) write1(fillbyte[i%12]);
2287
1/2
✓ Branch 0 taken 198 times.
✗ Branch 1 not taken.
198 add_addr_to_line(addrToLinePos);
2288 }
2289
2290 }
2291
6/6
✓ Branch 0 taken 309 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 153 times.
✓ Branch 3 taken 156 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 909 times.
1827 else if (is0("cleartable"))
2292 {
2293
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 cleartable();
2294 }
2295
6/6
✓ Branch 0 taken 291 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 144 times.
✓ Branch 3 taken 147 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 900 times.
1809 else if (is0("pushtable"))
2296 {
2297
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.append(thetable);
2298 }
2299
6/6
✓ Branch 0 taken 273 times.
✓ Branch 1 taken 1518 times.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 138 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 891 times.
1791 else if (is0("pulltable"))
2300 {
2301
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 18 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
18 if (tablestack.count <= 0) asar_throw_error(0, error_type_block, error_id_pulltable_without_table);
2302
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
18 thetable=tablestack[tablestack.count-1];
2303
1/2
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
18 tablestack.remove(tablestack.count-1);
2304 }
2305
6/6
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 1665 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 54 times.
✓ Branch 5 taken 837 times.
1773 else if (is("function") && numwords >= 3)
2306 {
2307
3/6
✓ Branch 0 taken 54 times.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if (stricmp(word[2], "=")) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2308
2/6
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 108 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
108 if (!confirmqpar(word[1])) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2309
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 string line=word[1];
2310
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 line.qnormalize();
2311 108 char * startpar=strqchr(line.data(), '(');
2312
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2313 108 *startpar=0;
2314
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
108 startpar++;
2315
3/7
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 72 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
108 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_function_name);
2316 108 char * endpar=strqchr(startpar, ')');
2317 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nulls
2318
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_function_declaration);
2319 108 *endpar=0;
2320
2321 54 string pars;
2322
2/2
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
216 for(int i = 3; i < numwords; i++){
2323
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
108 if(i > 3) pars += " ";
2324
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
108 pars += word[i];
2325 }
2326
2327
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 createuserfunc(line, startpar, pars.data());
2328 108 }
2329
6/6
✓ Branch 0 taken 1410 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 708 times.
✓ Branch 3 taken 702 times.
✓ Branch 4 taken 438 times.
✓ Branch 5 taken 399 times.
1665 else if (is1("print"))
2330 {
2331
2/2
✓ Branch 0 taken 852 times.
✓ Branch 1 taken 18 times.
870 string out = handle_print(par);
2332
3/4
✓ Branch 0 taken 284 times.
✓ Branch 1 taken 568 times.
✓ Branch 2 taken 284 times.
✗ Branch 3 not taken.
852 if (pass==2) print(out);
2333 852 }
2334
6/6
✓ Branch 0 taken 540 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 270 times.
✓ Branch 3 taken 270 times.
✓ Branch 4 taken 9 times.
✓ Branch 5 taken 390 times.
795 else if (is1("reset"))
2335 {
2336 if(0);
2337
2/4
✓ Branch 0 taken 18 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
✗ Branch 3 not taken.
18 else if (!stricmp(par, "bytes")) bytes=0;
2338 else if (!stricmp(par, "freespaceuse")) freespaceuse=0;
2339 else asar_throw_error(2, error_type_block, error_id_unknown_variable);
2340 }
2341
15/18
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 468 times.
✓ Branch 3 taken 54 times.
✓ Branch 4 taken 468 times.
✓ Branch 5 taken 255 times.
✓ Branch 6 taken 468 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 468 times.
✓ Branch 9 taken 255 times.
✓ Branch 10 taken 468 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 468 times.
✓ Branch 13 taken 255 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 468 times.
✓ Branch 16 taken 27 times.
✓ Branch 17 taken 363 times.
777 else if (is1("padbyte") || is1("padword") || is1("padlong") || is1("paddword"))
2342 {
2343 27 int len = 0;
2344
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 if (is("padbyte")) len=1;
2345
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padword")) len=2;
2346
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("padlong")) len=3;
2347
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
54 if (is("paddword")) len=4;
2348
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 unsigned int val=getnum(par);
2349
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
54 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2350
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 36 times.
468 for (int i=0;i<12;i+=len)
2351 {
2352 216 unsigned int tmpval=val;
2353
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 432 times.
864 for (int j=0;j<len;j++)
2354 {
2355 432 padbyte[i+j]=(unsigned char)tmpval;
2356 432 tmpval>>=8;
2357 }
2358 }
2359 }
2360
6/6
✓ Branch 0 taken 468 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 234 times.
✓ Branch 3 taken 234 times.
✓ Branch 4 taken 27 times.
✓ Branch 5 taken 336 times.
723 else if (is1("pad"))
2361 {
2362
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
54 if (freespaceid > 0) asar_throw_error(0, error_type_block, error_id_pad_in_freespace);
2363
1/2
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
54 int num=(int)getnum(par);
2364
1/6
✗ Branch 0 not taken.
✓ Branch 1 taken 54 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
54 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());
2365
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 18 times.
54 if (num>realsnespos)
2366 {
2367
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int end=snestopc(num);
2368
1/2
✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
18 int start=snestopc(realsnespos);
2369 36 int len=end-start;
2370
3/4
✓ Branch 0 taken 180 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 180 times.
✓ Branch 3 taken 36 times.
216 for (int i=0;i<len;i++) write1(padbyte[i%12]);
2371
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 add_addr_to_line(addrToLinePos);
2372 }
2373 }
2374
18/18
✓ Branch 0 taken 414 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 324 times.
✓ Branch 3 taken 90 times.
✓ Branch 4 taken 324 times.
✓ Branch 5 taken 255 times.
✓ Branch 6 taken 306 times.
✓ Branch 7 taken 18 times.
✓ Branch 8 taken 306 times.
✓ Branch 9 taken 255 times.
✓ Branch 10 taken 288 times.
✓ Branch 11 taken 18 times.
✓ Branch 12 taken 288 times.
✓ Branch 13 taken 255 times.
✓ Branch 14 taken 18 times.
✓ Branch 15 taken 270 times.
✓ Branch 16 taken 72 times.
✓ Branch 17 taken 264 times.
669 else if (is1("fillbyte") || is1("fillword") || is1("filllong") || is1("filldword"))
2375 {
2376 72 int len = 0;
2377
2/2
✓ Branch 0 taken 90 times.
✓ Branch 1 taken 54 times.
144 if (is("fillbyte")) len=1;
2378
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("fillword")) len=2;
2379
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filllong")) len=3;
2380
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 126 times.
144 if (is("filldword")) len=4;
2381
1/2
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
144 unsigned int val= getnum(par);
2382
5/6
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 108 times.
✓ Branch 2 taken 18 times.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 18 times.
144 if (foundlabel && !foundlabel_static) asar_throw_error(0, error_type_block, error_id_no_labels_here);
2383
2/2
✓ Branch 0 taken 1098 times.
✓ Branch 1 taken 126 times.
1224 for (int i=0;i<12;i+=len)
2384 {
2385 549 unsigned int tmpval=val;
2386
2/2
✓ Branch 0 taken 1512 times.
✓ Branch 1 taken 1098 times.
2610 for (int j=0;j<len;j++)
2387 {
2388 1512 fillbyte[i+j]=(unsigned char)tmpval;
2389 1512 tmpval>>=8;
2390 }
2391 }
2392 }
2393
6/6
✓ Branch 0 taken 270 times.
✓ Branch 1 taken 255 times.
✓ Branch 2 taken 135 times.
✓ Branch 3 taken 135 times.
✓ Branch 4 taken 135 times.
✓ Branch 5 taken 129 times.
525 else if (is1("arch"))
2394 {
2395
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 270 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
270 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2396
4/4
✓ Branch 0 taken 171 times.
✓ Branch 1 taken 99 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 99 times.
270 if (!stricmp(par, "65816")) { arch=arch_65816; return; }
2397
4/4
✓ Branch 0 taken 162 times.
✓ Branch 1 taken 36 times.
✓ Branch 2 taken 63 times.
✓ Branch 3 taken 36 times.
198 if (!stricmp(par, "spc700")) { arch=arch_spc700; return; }
2398
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 if (!stricmp(par, "superfx")) { arch=arch_superfx; return; }
2399 asar_throw_error(0, error_type_block, error_id_broken_command, "arch", "Invalid architecture, expected one of 65816, spc700, superfx");
2400 }
2401
8/10
✓ Branch 0 taken 255 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 147 times.
✓ Branch 3 taken 108 times.
✓ Branch 4 taken 147 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 72 times.
✓ Branch 7 taken 75 times.
✓ Branch 8 taken 21 times.
✓ Branch 9 taken 108 times.
255 else if (is0("{") || is0("}")) {}
2402 else
2403 {
2404
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 39 times.
39 asar_throw_error(1, error_type_block, error_id_unknown_command);
2405 }
2406
2407
6/6
✓ Branch 0 taken 38850 times.
✓ Branch 1 taken 28110 times.
✓ Branch 2 taken 38850 times.
✓ Branch 3 taken 28110 times.
✓ Branch 4 taken 38850 times.
✓ Branch 5 taken 28110 times.
263112 }
2408
2409 48657 bool assemblemapper(char** word, int numwords)
2410 {
2411 48657 auto previous_mapper = mapper;
2412 if(0);
2413
6/6
✓ Branch 0 taken 2379 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 291 times.
✓ Branch 3 taken 2088 times.
✓ Branch 4 taken 147 times.
✓ Branch 5 taken 20973 times.
48657 else if (is0("lorom"))
2414 {
2415 //this also makes xkas set snespos to $008000 for some reason
2416 291 mapper=lorom;
2417 }
2418
6/6
✓ Branch 0 taken 2088 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 1035 times.
✓ Branch 3 taken 1053 times.
✓ Branch 4 taken 63 times.
✓ Branch 5 taken 20910 times.
48366 else if (is0("hirom"))
2419 {
2420 //xkas makes this point to $C00000
2421 123 mapper=hirom;
2422 }
2423
6/6
✓ Branch 0 taken 1965 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 975 times.
✓ Branch 3 taken 990 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20898 times.
48243 else if (is0("exlorom"))
2424 {
2425 21 mapper = exlorom;
2426 }
2427
6/6
✓ Branch 0 taken 1944 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 966 times.
✓ Branch 3 taken 978 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20886 times.
48222 else if (is0("exhirom"))
2428 {
2429 21 mapper=exhirom;
2430 }
2431
6/6
✓ Branch 0 taken 1923 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 957 times.
✓ Branch 3 taken 966 times.
✓ Branch 4 taken 21 times.
✓ Branch 5 taken 20865 times.
48201 else if (is0("sfxrom"))
2432 {
2433 39 mapper=sfxrom;
2434 //fastrom=false;
2435 }
2436
6/6
✓ Branch 0 taken 1884 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 942 times.
✓ Branch 3 taken 942 times.
✓ Branch 4 taken 60 times.
✓ Branch 5 taken 20805 times.
48162 else if (is0("norom"))
2437 {
2438 //$000000 would be the best snespos for this, but I don't care
2439 114 mapper=norom;
2440 //fastrom=false;
2441
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 36 times.
114 if(!force_checksum_fix)
2442 78 checksum_fix_enabled = false;//we don't know where the header is, so don't set the checksum
2443 }
2444
6/6
✓ Branch 0 taken 1770 times.
✓ Branch 1 taken 46278 times.
✓ Branch 2 taken 885 times.
✓ Branch 3 taken 885 times.
✓ Branch 4 taken 12 times.
✓ Branch 5 taken 20793 times.
48048 else if (is0("fullsa1rom"))
2445 {
2446 21 mapper=bigsa1rom;
2447 //fastrom=false;
2448 }
2449
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 47952 times.
48027 else if (is("sa1rom"))
2450 {
2451 //fastrom=false;
2452
2/2
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 18 times.
75 if (par)
2453 {
2454
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
57 if (word[2]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2455
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
87 if (!is_digit(par[0]) || par[1]!=',' ||
2456
2/4
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
57 !is_digit(par[2]) || par[3]!=',' ||
2457
2/4
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
57 !is_digit(par[4]) || par[5]!=',' ||
2458
4/10
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 57 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 30 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
114 !is_digit(par[6]) || par[7]) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2459 int len;
2460
1/2
✓ Branch 0 taken 30 times.
✗ Branch 1 not taken.
57 autoptr<char**> pars=qpsplit(par, ',', &len);
2461
1/2
✓ Branch 0 taken 57 times.
✗ Branch 1 not taken.
57 verify_paren(pars);
2462
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 57 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
57 if (len!=4) asar_throw_error(0, error_type_block, error_id_invalid_mapper);
2463 57 sa1banks[0]=(par[0]-'0')<<20;
2464 57 sa1banks[1]=(par[2]-'0')<<20;
2465 57 sa1banks[4]=(par[4]-'0')<<20;
2466 57 sa1banks[5]=(par[6]-'0')<<20;
2467 57 }
2468 else
2469 {
2470 18 sa1banks[0]=0<<20;
2471 18 sa1banks[1]=1<<20;
2472 18 sa1banks[4]=2<<20;
2473 18 sa1banks[5]=3<<20;
2474 }
2475 75 mapper=sa1rom;
2476 }
2477 20754 else return false;
2478
2479
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 705 times.
705 if(in_spcblock) asar_throw_error(0, error_type_block, error_id_feature_unavaliable_in_spcblock);
2480
2/2
✓ Branch 0 taken 435 times.
✓ Branch 1 taken 270 times.
705 if(!mapper_set){
2481 435 mapper_set = true;
2482
2/2
✓ Branch 0 taken 135 times.
✓ Branch 1 taken 135 times.
270 }else if(previous_mapper != mapper){
2483 234 asar_throw_warning(1, warning_id_mapper_already_set);
2484 }
2485 366 return true;
2486 }
2487