asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
729 of 859, 0 excluded
84.9%
Functions:
83 of 102, 0 excluded
81.4%
Branches:
940 of 1987, 0 excluded
47.3%

asar_math.cpp
Line Branch Exec Source
1 //Don't try using this in your own project, it's got a lot of Asar-specific tweaks. Use mathlib.cpp instead.
2 #include "platform/file-helpers.h"
3 #include "std-includes.h"
4 #include "autoarray.h"
5 #include "assocarr.h"
6 #include "libstr.h"
7 #include "libsmw.h"
8 #include "asar.h"
9 #include "virtualfile.h"
10 #include "assembleblock.h"
11 #include "macro.h"
12 #include "asar_math.h"
13 #include "warnings.h"
14 #include <math.h>
15 #include <functional>
16 #include <algorithm>
17
18 bool math_pri=true;
19 bool math_round=false;
20 extern bool suppress_all_warnings;
21
22 static const char * str;
23 //save before calling eval if needed after
24 static const char * current_user_function_name;
25
26 static double getnumcore();
27 static double getnum();
28 static double eval(int depth);
29
30 //label (bool foundLabel) (bool forwardLabel)
31 //userfunction
32
33 bool foundlabel;
34 bool foundlabel_static;
35 bool forwardlabel;
36
37 struct cachedfile {
38 string filename;
39 virtual_file_handle filehandle;
40 size_t filesize;
41 bool used;
42 };
43
44 #define numcachedfiles 16
45
46 static cachedfile cachedfiles[numcachedfiles];
47 static int cachedfileindex = 0;
48
49 // Opens a file, trying to open it from cache first
50
51 84 static cachedfile * opencachedfile(string fname, bool should_error)
52 {
53 84 cachedfile * cachedfilehandle = nullptr;
54
55 // RPG Hacker: Only using a combined path here because that should
56 // hopefully result in a unique string for every file, whereas
57 // fname could be a relative path, which isn't guaranteed to be unique.
58 // Note that this does not affect how we open the file - this is
59 // handled by the filesystem and uses our include paths etc.
60
3/7
✓ Branch 4 → 5 taken 42 times.
✗ Branch 4 → 45 not taken.
✓ Branch 6 → 7 taken 84 times.
✗ Branch 6 → 43 not taken.
✗ Branch 6 → 48 not taken.
✓ Branch 8 → 9 taken 42 times.
✗ Branch 8 → 46 not taken.
84 string combinedname = filesystem->create_absolute_path(dir(thisfilename), fname);
61
62
4/4
✓ Branch 17 → 9 taken 266 times.
✓ Branch 17 → 18 taken 14 times.
✓ Branch 20 → 12 taken 266 times.
✓ Branch 20 → 21 taken 14 times.
560 for (int i = 0; i < numcachedfiles; i++)
63 {
64
10/10
✓ Branch 9 → 10 taken 52 times.
✓ Branch 9 → 13 taken 214 times.
✓ Branch 11 → 12 taken 28 times.
✓ Branch 11 → 13 taken 24 times.
✓ Branch 12 → 13 taken 52 times.
✓ Branch 12 → 16 taken 214 times.
✓ Branch 14 → 15 taken 56 times.
✓ Branch 14 → 16 taken 262 times.
✓ Branch 17 → 18 taken 28 times.
✓ Branch 17 → 19 taken 238 times.
532 if (cachedfiles[i].used && cachedfiles[i].filename == combinedname)
65 {
66 56 cachedfilehandle = &cachedfiles[i];
67 56 break;
68 }
69 }
70
71
4/4
✓ Branch 18 → 19 taken 14 times.
✓ Branch 18 → 23 taken 28 times.
✓ Branch 21 → 22 taken 14 times.
✓ Branch 21 → 26 taken 28 times.
84 if (cachedfilehandle == nullptr)
72 {
73
74
2/4
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 22 taken 14 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 25 taken 14 times.
28 if (cachedfiles[cachedfileindex].used)
75 {
76 filesystem->close_file(cachedfiles[cachedfileindex].filehandle);
77 cachedfiles[cachedfileindex].filehandle = INVALID_VIRTUAL_FILE_HANDLE;
78 cachedfiles[cachedfileindex].used = false;
79 }
80
81 28 cachedfilehandle = &cachedfiles[cachedfileindex];
82 }
83
84
2/4
✓ Branch 23 → 24 taken 42 times.
✗ Branch 23 → 33 not taken.
✓ Branch 26 → 27 taken 42 times.
✗ Branch 26 → 36 not taken.
84 if (cachedfilehandle != nullptr)
85 {
86
4/4
✓ Branch 24 → 25 taken 14 times.
✓ Branch 24 → 33 taken 28 times.
✓ Branch 27 → 28 taken 14 times.
✓ Branch 27 → 36 taken 28 times.
84 if (!cachedfilehandle->used)
87 {
88
2/4
✓ Branch 27 → 28 taken 14 times.
✗ Branch 27 → 46 not taken.
✓ Branch 30 → 31 taken 14 times.
✗ Branch 30 → 50 not taken.
28 cachedfilehandle->filehandle = filesystem->open_file(fname, thisfilename);
89
4/4
✓ Branch 28 → 29 taken 4 times.
✓ Branch 28 → 33 taken 10 times.
✓ Branch 31 → 32 taken 4 times.
✓ Branch 31 → 36 taken 10 times.
28 if (cachedfilehandle->filehandle != INVALID_VIRTUAL_FILE_HANDLE)
90 {
91 8 cachedfilehandle->used = true;
92
2/4
✓ Branch 29 → 30 taken 4 times.
✗ Branch 29 → 46 not taken.
✓ Branch 32 → 33 taken 4 times.
✗ Branch 32 → 50 not taken.
8 cachedfilehandle->filename = combinedname;
93
2/4
✓ Branch 30 → 31 taken 4 times.
✗ Branch 30 → 46 not taken.
✓ Branch 33 → 34 taken 4 times.
✗ Branch 33 → 50 not taken.
8 cachedfilehandle->filesize = filesystem->get_file_size(cachedfilehandle->filehandle);
94 8 cachedfileindex++;
95 // randomdude999: when we run out of cached files, just start overwriting ones from the start
96
2/4
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 4 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 4 times.
8 if (cachedfileindex >= numcachedfiles) cachedfileindex = 0;
97 }
98 }
99 }
100
101
8/12
✓ Branch 33 → 34 taken 42 times.
✗ Branch 33 → 35 not taken.
✓ Branch 34 → 35 taken 10 times.
✓ Branch 34 → 40 taken 32 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 40 taken 10 times.
✓ Branch 36 → 37 taken 42 times.
✗ Branch 36 → 38 not taken.
✓ Branch 37 → 38 taken 10 times.
✓ Branch 37 → 43 taken 32 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 43 taken 10 times.
84 if ((cachedfilehandle == nullptr || cachedfilehandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) && should_error)
102 {
103 asar_throw_error(2, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), fname.data());
104 }
105
106 84 return cachedfilehandle;
107 84 }
108
109
110 396 void closecachedfiles()
111 {
112
2/2
✓ Branch 9 → 3 taken 6336 times.
✓ Branch 9 → 10 taken 396 times.
6732 for (int i = 0; i < numcachedfiles; i++)
113 {
114
2/2
✓ Branch 3 → 4 taken 8 times.
✓ Branch 3 → 8 taken 6328 times.
6336 if (cachedfiles[i].used)
115 {
116
1/2
✓ Branch 4 → 5 taken 8 times.
✗ Branch 4 → 7 not taken.
8 if (cachedfiles[i].filehandle != INVALID_VIRTUAL_FILE_HANDLE)
117 {
118 8 filesystem->close_file(cachedfiles[i].filehandle);
119 8 cachedfiles[i].filehandle = INVALID_VIRTUAL_FILE_HANDLE;
120 }
121
122 8 cachedfiles[i].used = false;
123 }
124 }
125
126 396 cachedfileindex = 0;
127 396 }
128
129
130 16 static int struct_size(const char *name)
131 {
132
3/6
✓ Branch 2 → 3 taken 16 times.
✗ Branch 2 → 6 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 16 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 16 times.
16 if(pass && !structs.exists(name)) asar_throw_error(2, error_type_block, error_id_struct_not_found, name);
133
1/2
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 16 times.
16 else if(!structs.exists(name)) return 0;
134 16 return structs.find(name).struct_size;
135 }
136
137 76 static int object_size(const char *name)
138 {
139
4/6
✓ Branch 2 → 3 taken 60 times.
✓ Branch 2 → 6 taken 16 times.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 60 times.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 9 taken 76 times.
76 if(pass && !structs.exists(name)) asar_throw_error(2, error_type_block, error_id_struct_not_found, name);
140
1/2
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 76 times.
76 else if(!structs.exists(name)) return 0;
141 76 return structs.find(name).object_size;
142 }
143
144 20 static int data_size(const char *name)
145 {
146 unsigned int label;
147 20 unsigned int next_label = 0xFFFFFF;
148
4/10
✓ Branch 2 → 3 taken 10 times.
✗ Branch 2 → 13 not taken.
✓ Branch 3 → 4 taken 10 times.
✓ Branch 3 → 5 taken 10 times.
✗ Branch 3 → 14 not taken.
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 10 times.
✗ Branch 4 → 13 not taken.
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 14 not taken.
20 if(!labels.exists(name)) asar_throw_error(2, error_type_block, error_id_label_not_found, name);
149 20 foundlabel = true;
150
2/4
✓ Branch 5 → 6 taken 10 times.
✗ Branch 5 → 13 not taken.
✓ Branch 6 → 7 taken 10 times.
✗ Branch 6 → 14 not taken.
20 snes_label label_data = labels.find(name);
151 20 foundlabel_static &= label_data.is_static;
152 20 label = label_data.pos & 0xFFFFFF;
153
2/4
✓ Branch 6 → 7 taken 10 times.
✗ Branch 6 → 13 not taken.
✓ Branch 7 → 8 taken 10 times.
✗ Branch 7 → 14 not taken.
20 labels.each([&next_label, label](const char *key, snes_label current_label){
154 60 current_label.pos &= 0xFFFFFF;
155
4/4
✓ Branch 2 → 3 taken 16 times.
✓ Branch 2 → 5 taken 44 times.
✓ Branch 3 → 4 taken 12 times.
✓ Branch 3 → 5 taken 4 times.
60 if(label < current_label.pos && current_label.pos < next_label){
156 12 next_label = current_label.pos;
157 }
158 60 });
159
5/7
✓ Branch 7 → 8 taken 4 times.
✓ Branch 7 → 9 taken 6 times.
✓ Branch 8 → 9 taken 8 times.
✓ Branch 8 → 10 taken 6 times.
✗ Branch 8 → 13 not taken.
✓ Branch 9 → 10 taken 4 times.
✗ Branch 9 → 14 not taken.
20 if(next_label == 0xFFFFFF) asar_throw_warning(2, warning_id_datasize_last_label, name);
160
5/7
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 11 taken 6 times.
✓ Branch 10 → 11 taken 8 times.
✓ Branch 10 → 12 taken 6 times.
✗ Branch 10 → 13 not taken.
✓ Branch 11 → 12 taken 4 times.
✗ Branch 11 → 14 not taken.
20 if(next_label-label > 0xFFFF) asar_throw_warning(2, warning_id_datasize_exceeds_size, name);
161 20 return next_label-label;
162 }
163
164
165 296 string get_string_argument()
166 {
167
1/2
✗ Branch 4 → 3 not taken.
✓ Branch 4 → 5 taken 296 times.
296 while (*str==' ') str++;
168
1/3
✓ Branch 5 → 6 taken 296 times.
✗ Branch 5 → 23 not taken.
✗ Branch 5 → 24 not taken.
296 if (*str=='"')
169 {
170 296 const char * strpos = str;
171 296 str++;
172
4/6
✓ Branch 8 → 9 taken 3788 times.
✓ Branch 8 → 11 taken 296 times.
✓ Branch 9 → 10 taken 3788 times.
✗ Branch 9 → 11 not taken.
✓ Branch 10 → 7 taken 3788 times.
✗ Branch 10 → 11 not taken.
4084 while (*str!='"' && *str!='\0' && *str!='\n') str++;
173
1/3
✓ Branch 11 → 12 taken 296 times.
✗ Branch 11 → 22 not taken.
✗ Branch 11 → 23 not taken.
296 if (*str == '"')
174 {
175
2/4
✓ Branch 12 → 13 taken 148 times.
✗ Branch 12 → 28 not taken.
✓ Branch 13 → 14 taken 148 times.
✗ Branch 13 → 29 not taken.
296 string tempname(strpos, (int)(str - strpos + 1));
176 296 str++;
177
2/4
✗ Branch 15 → 14 not taken.
✓ Branch 15 → 16 taken 148 times.
✗ Branch 16 → 15 not taken.
✓ Branch 16 → 17 taken 148 times.
296 while (*str==' ') str++; //eat space
178
3/7
✓ Branch 17 → 18 taken 148 times.
✗ Branch 17 → 26 not taken.
✓ Branch 18 → 19 taken 296 times.
✗ Branch 18 → 26 not taken.
✗ Branch 18 → 27 not taken.
✓ Branch 19 → 20 taken 148 times.
✗ Branch 19 → 27 not taken.
296 return string(safedequote(tempname.temp_raw()));
179 296 }
180 // RPG Hacker: AFAIK, this is never actually triggered, since unmatched quotes are already detected earlier,
181 // but since it does no harm here, I'll keep it in, just to be safe
182 else asar_throw_error(2, error_type_block, error_id_string_literal_not_terminated);
183 }//make this error a better one later
184
185 asar_throw_error(2, error_type_block, error_id_string_literal_not_terminated);
186 return ""; //never actually called, but I don't feel like figuring out __attribute__ ((noreturn)) on MSVC
187 }
188
189 //only returns alphanumeric (and _) starting with alpha or _
190 256 string get_symbol_argument()
191 {
192
1/2
✗ Branch 4 → 3 not taken.
✓ Branch 4 → 5 taken 256 times.
256 while (*str==' ') str++; //is this proper? Dunno yet.
193 256 const char * strpos = str;
194 // hack: for backwards compat, allow strings as symbols
195
2/2
✓ Branch 5 → 6 taken 8 times.
✓ Branch 5 → 35 taken 248 times.
256 if(*str=='"') {
196
1/3
✓ Branch 6 → 7 taken 8 times.
✗ Branch 6 → 67 not taken.
✗ Branch 6 → 68 not taken.
8 asar_throw_warning(2, warning_id_feature_deprecated, "quoted symbolic arguments", "Remove the quotations");
197
1/7
✓ Branch 7 → 8 taken 8 times.
✗ Branch 7 → 67 not taken.
✗ Branch 7 → 68 not taken.
✗ Branch 62 → 63 not taken.
✗ Branch 62 → 64 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
8 string arg = get_string_argument();
198 8 int i = 0;
199
2/6
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 13 taken 8 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
✓ Branch 15 → 16 taken 8 times.
✗ Branch 15 → 17 not taken.
8 if(is_alpha(arg[i]) || arg[i] == '_') i++;
200
7/8
✓ Branch 21 → 22 taken 12 times.
✓ Branch 21 → 26 taken 44 times.
✓ Branch 23 → 24 taken 12 times.
✗ Branch 23 → 26 not taken.
✓ Branch 25 → 26 taken 4 times.
✓ Branch 25 → 27 taken 8 times.
✓ Branch 28 → 18 taken 48 times.
✓ Branch 28 → 29 taken 8 times.
56 while(is_alnum(arg[i]) || arg[i] == '_' || arg[i] == '.') i++;
201
1/5
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 32 taken 8 times.
✗ Branch 31 → 32 not taken.
✗ Branch 31 → 62 not taken.
✗ Branch 31 → 63 not taken.
8 if(arg[i] != '\0') asar_throw_error(2, error_type_block, error_id_invalid_label_name);
202
1/2
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 8 times.
8 return arg;
203 }
204
5/6
✓ Branch 36 → 37 taken 204 times.
✓ Branch 36 → 38 taken 44 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 204 times.
✓ Branch 40 → 41 taken 44 times.
✓ Branch 40 → 42 taken 204 times.
248 if(is_alpha(*str) || *str == '_') str++;
205
8/8
✓ Branch 45 → 46 taken 892 times.
✓ Branch 45 → 48 taken 284 times.
✓ Branch 46 → 47 taken 876 times.
✓ Branch 46 → 48 taken 16 times.
✓ Branch 47 → 48 taken 628 times.
✓ Branch 47 → 49 taken 248 times.
✓ Branch 50 → 43 taken 928 times.
✓ Branch 50 → 51 taken 248 times.
1176 while (is_alnum(*str) || *str == '_' || *str == '.') str++;
206
1/2
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 248 times.
248 if(strpos == str){
207 //error nothing was read, this is a placeholder error
208 asar_throw_error(2, error_type_block, error_id_string_literal_not_terminated);
209 }
210
211
2/4
✓ Branch 53 → 54 taken 124 times.
✗ Branch 53 → 67 not taken.
✓ Branch 54 → 55 taken 124 times.
✗ Branch 54 → 68 not taken.
248 string symbol = string(strpos, (int)(str - strpos));
212
2/4
✗ Branch 56 → 55 not taken.
✓ Branch 56 → 57 taken 124 times.
✗ Branch 57 → 56 not taken.
✓ Branch 57 → 58 taken 124 times.
248 while (*str==' ') str++; //eat spaces
213
2/4
✓ Branch 57 → 58 taken 124 times.
✗ Branch 57 → 65 not taken.
✓ Branch 58 → 59 taken 124 times.
✗ Branch 58 → 66 not taken.
248 return symbol;
214 248 }
215
216 592 double get_double_argument()
217 {
218
1/2
✗ Branch 4 → 3 not taken.
✓ Branch 4 → 5 taken 592 times.
592 while (*str==' ') str++;
219 592 double result = eval(0);
220
1/2
✗ Branch 8 → 7 not taken.
✓ Branch 8 → 9 taken 592 times.
592 while (*str==' ') str++; //eat spaces
221 592 return result;
222 }
223
224 //will eat the comma
225 122 bool has_next_parameter()
226 {
227
2/2
✓ Branch 2 → 3 taken 30 times.
✓ Branch 2 → 4 taken 92 times.
122 if (*str==',')
228 {
229 30 str++;
230 30 return true;
231 }
232 92 return false;
233 }
234
235 234 void require_next_parameter()
236 {
237
1/2
✓ Branch 2 → 3 taken 234 times.
✗ Branch 2 → 4 not taken.
234 if (*str==',')
238 {
239 234 str++;
240 234 return;
241 }
242 asar_throw_error(2, error_type_block, error_id_require_parameter);
243 }
244
245 4 template <typename F> double asar_unary_wrapper()
246 {
247
2/4
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 7 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 10 not taken.
4 return F()(get_double_argument());
248 }
249
250 4 template <double (*F)(double)> double asar_unary_wrapper()
251 {
252 4 return F(get_double_argument());
253 }
254
255 //possibly restrict type T in the future....
256 //first a case for functors
257 44 template <typename F> double asar_binary_wrapper()
258 {
259
12/24
double asar_binary_wrapper<std::less_equal<double> >():
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 18 not taken.
double asar_binary_wrapper<std::not_equal_to<double> >():
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 18 not taken.
double asar_binary_wrapper<std::greater_equal<double> >():
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 18 not taken.
double asar_binary_wrapper<std::less<double> >():
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 18 not taken.
double asar_binary_wrapper<std::greater<double> >():
✓ Branch 2 → 3 taken 3 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 18 not taken.
double asar_binary_wrapper<std::equal_to<double> >():
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 18 not taken.
44 double first = get_double_argument();
260
12/24
double asar_binary_wrapper<std::less_equal<double> >():
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
double asar_binary_wrapper<std::not_equal_to<double> >():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
double asar_binary_wrapper<std::greater_equal<double> >():
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
double asar_binary_wrapper<std::less<double> >():
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
double asar_binary_wrapper<std::greater<double> >():
✓ Branch 3 → 4 taken 3 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 18 not taken.
double asar_binary_wrapper<std::equal_to<double> >():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 11 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 18 not taken.
44 require_next_parameter();
261
16/32
double asar_binary_wrapper<std::less_equal<double> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 14 not taken.
double asar_binary_wrapper<std::logical_or<unsigned int> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 14 not taken.
double asar_binary_wrapper<std::logical_and<unsigned int> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 6 → 7 taken 3 times.
✗ Branch 6 → 14 not taken.
double asar_binary_wrapper<std::not_equal_to<double> >():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 14 not taken.
double asar_binary_wrapper<std::greater_equal<double> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 14 not taken.
double asar_binary_wrapper<std::less<double> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 14 not taken.
double asar_binary_wrapper<std::greater<double> >():
✓ Branch 4 → 5 taken 3 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 3 times.
✗ Branch 7 → 14 not taken.
double asar_binary_wrapper<std::equal_to<double> >():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 9 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 14 not taken.
60 return F()(first, get_double_argument());
262 }
263 //this could be DRY with if constexpr....oh well
264 26 template <double (*F)(double, double)> double asar_binary_wrapper()
265 {
266 26 double first = get_double_argument();
267 26 require_next_parameter();
268 26 return F(first, get_double_argument());
269 }
270
271 4 double asar_bank(double a)
272 {
273 4 return (int)a >> 16;
274 }
275
276
277 6 double asar_logical_nand(double a, double b)
278 {
279
3/4
✓ Branch 2 → 3 taken 2 times.
✓ Branch 2 → 4 taken 4 times.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 2 times.
6 return !(a && b);
280 }
281
282
283 6 double asar_logical_nor(double a, double b)
284 {
285
4/4
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 5 taken 2 times.
✓ Branch 3 → 4 taken 2 times.
✓ Branch 3 → 5 taken 2 times.
6 return !(a || b);
286 }
287
288
289 6 double asar_logical_xor(double a, double b)
290 {
291 6 return !!a ^ !!b;
292 }
293
294 10 double asar_max(double a, double b)
295 {
296
2/2
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 4 taken 6 times.
10 return a > b ? a : b;
297 }
298
299 10 double asar_min(double a, double b)
300 {
301
2/2
✓ Branch 2 → 3 taken 4 times.
✓ Branch 2 → 4 taken 6 times.
10 return a < b ? a : b;
302 }
303
304 6 double asar_clamp()
305 {
306 6 double value = get_double_argument();
307 6 require_next_parameter();
308 6 double low = get_double_argument();
309 6 require_next_parameter();
310 6 double high = get_double_argument();
311
312 6 return asar_max(low, asar_min(high, value));
313 }
314
315 4 double asar_safediv()
316 {
317 4 double dividend = get_double_argument();
318 4 require_next_parameter();
319 4 double divisor = get_double_argument();
320 4 require_next_parameter();
321 4 double default_value = get_double_argument();
322
323
2/2
✓ Branch 7 → 8 taken 2 times.
✓ Branch 7 → 9 taken 2 times.
4 return divisor == 0.0 ? default_value : dividend / divisor;
324 }
325
326 22 double asar_select()
327 {
328 22 double selector = get_double_argument();
329 22 require_next_parameter();
330 22 double a = get_double_argument();
331 22 require_next_parameter();
332 22 double b = get_double_argument();
333
334
2/2
✓ Branch 7 → 8 taken 2 times.
✓ Branch 7 → 9 taken 20 times.
22 return selector == 0.0 ? b : a;
335 }
336
337 114 double asar_snestopc_wrapper()
338 {
339 114 return snestopc(get_double_argument());
340 }
341
342 82 double asar_pctosnes_wrapper()
343 {
344 82 return pctosnes(get_double_argument());
345 }
346
347 12 double asar_realbase_wrapper()
348 {
349 //need a better way to do this to make sure it is useful...
350 //foundlabel=true; //Going to consider this an implicit label because we don't really have a better system
351 12 return realsnespos;
352 }
353
354 36 double asar_pc_wrapper()
355 {
356 // while this really should set foundlabel, not doing it right now for symmetry with realbase.
357 // we should rework the way foundlabel works anyways.
358 //foundlabel = true;
359 36 return snespos;
360 }
361
362 42 template <int count> double asar_read()
363 {
364 42 int target = get_double_argument();
365 42 int addr=snestopc_pick(target);
366
4/8
double asar_read<1>():
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 30 times.
double asar_read<2>():
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 4 times.
double asar_read<3>():
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 4 times.
double asar_read<4>():
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 11 taken 4 times.
42 if(has_next_parameter())
367 {
368 double default_value = get_double_argument();
369 if (addr<0) return default_value;
370 else if (addr+count>romlen_r) return default_value;
371 }
372 else
373 {
374
8/56
double asar_read<1>():
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 19 taken 15 times.
✓ Branch 11 → 22 taken 15 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 36 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 34 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 42 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 32 not taken.
✗ Branch 15 → 40 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 38 not taken.
double asar_read<2>():
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 19 taken 2 times.
✓ Branch 11 → 22 taken 2 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 36 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 34 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 42 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 32 not taken.
✗ Branch 15 → 40 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 38 not taken.
double asar_read<3>():
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 19 taken 2 times.
✓ Branch 11 → 22 taken 2 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 36 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 34 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 42 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 32 not taken.
✗ Branch 15 → 40 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 38 not taken.
double asar_read<4>():
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 19 taken 2 times.
✓ Branch 11 → 22 taken 2 times.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 36 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 34 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 42 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 32 not taken.
✗ Branch 15 → 40 not taken.
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 38 not taken.
42 if (addr<0) asar_throw_error(2, error_type_block, error_id_snes_address_doesnt_map_to_rom, (hex6((unsigned int)target) + " in read function").data());
375
16/64
double asar_read<1>():
✓ Branch 19 → 20 taken 1 time.
✓ Branch 19 → 27 taken 14 times.
✓ Branch 20 → 21 taken 1 time.
✗ Branch 20 → 42 not taken.
✓ Branch 21 → 22 taken 1 time.
✗ Branch 21 → 40 not taken.
✓ Branch 22 → 23 taken 1 time.
✓ Branch 22 → 33 taken 14 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 38 taken 1 time.
✓ Branch 25 → 26 taken 1 time.
✗ Branch 25 → 50 not taken.
✓ Branch 26 → 27 taken 1 time.
✗ Branch 26 → 48 not taken.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 46 taken 1 time.
double asar_read<2>():
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 27 taken 2 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 42 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 40 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 33 taken 2 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 38 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 50 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 48 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 46 not taken.
double asar_read<3>():
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 27 taken 2 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 42 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 40 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 33 taken 2 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 38 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 50 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 48 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 46 not taken.
double asar_read<4>():
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 27 taken 2 times.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 42 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 40 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 33 taken 2 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 38 not taken.
✗ Branch 25 → 26 not taken.
✗ Branch 25 → 50 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 48 not taken.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 46 not taken.
47 else if (addr+count>romlen_r) asar_throw_error(2, error_type_block, error_id_snes_address_out_of_bounds, (hex6(target) + " in read function").data());
376 }
377
378 40 unsigned int value = 0;
379
16/16
double asar_read<1>():
✓ Branch 29 → 28 taken 14 times.
✓ Branch 29 → 30 taken 14 times.
✓ Branch 35 → 34 taken 14 times.
✓ Branch 35 → 36 taken 14 times.
double asar_read<2>():
✓ Branch 29 → 28 taken 4 times.
✓ Branch 29 → 30 taken 2 times.
✓ Branch 35 → 34 taken 4 times.
✓ Branch 35 → 36 taken 2 times.
double asar_read<3>():
✓ Branch 29 → 28 taken 6 times.
✓ Branch 29 → 30 taken 2 times.
✓ Branch 35 → 34 taken 6 times.
✓ Branch 35 → 36 taken 2 times.
double asar_read<4>():
✓ Branch 29 → 28 taken 8 times.
✓ Branch 29 → 30 taken 2 times.
✓ Branch 35 → 34 taken 8 times.
✓ Branch 35 → 36 taken 2 times.
104 for(int i = 0; i < count; i++)
380 {
381 64 value |= romdata_r[addr+i] << (8 * i);
382 }
383 40 return value;
384 }
385
386 24 template <int count> double asar_canread()
387 {
388 24 int length = count;
389
1/10
double asar_canread<0>():
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 5 not taken.
double asar_canread<1>():
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 5 taken 24 times.
double asar_canread<2>():
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 5 not taken.
double asar_canread<3>():
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 5 not taken.
double asar_canread<4>():
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 5 not taken.
24 if(!length)
390 {
391 length = get_double_argument();
392 }
393 24 int addr=snestopc_pick(get_double_argument());
394
3/20
double asar_canread<0>():
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
double asar_canread<1>():
✓ Branch 7 → 8 taken 24 times.
✗ Branch 7 → 9 not taken.
✓ Branch 8 → 9 taken 12 times.
✓ Branch 8 → 10 taken 12 times.
double asar_canread<2>():
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
double asar_canread<3>():
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
double asar_canread<4>():
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 10 not taken.
24 if (addr<0 || addr+length-1>=romlen_r) return 0;
395 12 else return 1;
396 }
397
398 38 template <size_t count> double asar_readfile()
399 {
400 static_assert(count && count <= 4, "invalid count"); //1-4 inclusive
401
402
8/16
double asar_readfile<1ul>():
✓ Branch 3 → 4 taken 14 times.
✗ Branch 3 → 53 not taken.
double asar_readfile<2ul>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 53 not taken.
double asar_readfile<3ul>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 53 not taken.
double asar_readfile<4ul>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 53 not taken.
double asar_readfile<1ull>():
✓ Branch 2 → 3 taken 14 times.
✗ Branch 2 → 45 not taken.
double asar_readfile<2ull>():
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 45 not taken.
double asar_readfile<3ull>():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 45 not taken.
double asar_readfile<4ull>():
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 45 not taken.
38 string name = get_string_argument();
403
8/16
double asar_readfile<1ul>():
✓ Branch 4 → 5 taken 14 times.
✗ Branch 4 → 51 not taken.
double asar_readfile<2ul>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 51 not taken.
double asar_readfile<3ul>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 51 not taken.
double asar_readfile<4ul>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 51 not taken.
double asar_readfile<1ull>():
✓ Branch 3 → 4 taken 14 times.
✗ Branch 3 → 43 not taken.
double asar_readfile<2ull>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 43 not taken.
double asar_readfile<3ull>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 43 not taken.
double asar_readfile<4ull>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 43 not taken.
38 require_next_parameter();
404
8/16
double asar_readfile<1ul>():
✓ Branch 5 → 6 taken 14 times.
✗ Branch 5 → 51 not taken.
double asar_readfile<2ul>():
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 51 not taken.
double asar_readfile<3ul>():
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 51 not taken.
double asar_readfile<4ul>():
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 51 not taken.
double asar_readfile<1ull>():
✓ Branch 4 → 5 taken 14 times.
✗ Branch 4 → 43 not taken.
double asar_readfile<2ull>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 43 not taken.
double asar_readfile<3ull>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 43 not taken.
double asar_readfile<4ull>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 43 not taken.
38 size_t offset = get_double_argument();
405 38 bool should_error = !has_next_parameter();
406
16/32
double asar_readfile<1ul>():
✓ Branch 8 → 9 taken 14 times.
✗ Branch 8 → 45 not taken.
✓ Branch 9 → 10 taken 14 times.
✗ Branch 9 → 43 not taken.
double asar_readfile<2ul>():
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 45 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 43 not taken.
double asar_readfile<3ul>():
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 45 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 43 not taken.
double asar_readfile<4ul>():
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 45 not taken.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 43 not taken.
double asar_readfile<1ull>():
✓ Branch 6 → 7 taken 14 times.
✗ Branch 6 → 39 not taken.
✓ Branch 7 → 8 taken 14 times.
✗ Branch 7 → 37 not taken.
double asar_readfile<2ull>():
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 39 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 37 not taken.
double asar_readfile<3ull>():
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 39 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 37 not taken.
double asar_readfile<4ull>():
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 39 not taken.
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 37 not taken.
38 cachedfile * fhandle = opencachedfile(name, should_error);
407
14/16
double asar_readfile<1ul>():
✓ Branch 12 → 13 taken 7 times.
✓ Branch 12 → 19 taken 7 times.
double asar_readfile<2ul>():
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 19 taken 1 time.
double asar_readfile<3ul>():
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 19 taken 1 time.
double asar_readfile<4ul>():
✓ Branch 12 → 13 taken 1 time.
✓ Branch 12 → 19 taken 1 time.
double asar_readfile<1ull>():
✓ Branch 9 → 10 taken 7 times.
✓ Branch 9 → 16 taken 7 times.
double asar_readfile<2ull>():
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 16 taken 1 time.
double asar_readfile<3ull>():
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 16 taken 1 time.
double asar_readfile<4ull>():
✓ Branch 9 → 10 taken 1 time.
✓ Branch 9 → 16 taken 1 time.
38 if(!should_error)
408 {
409
6/16
double asar_readfile<1ul>():
✓ Branch 13 → 14 taken 7 times.
✗ Branch 13 → 51 not taken.
double asar_readfile<2ul>():
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 51 not taken.
double asar_readfile<3ul>():
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 51 not taken.
double asar_readfile<4ul>():
✓ Branch 13 → 14 taken 1 time.
✗ Branch 13 → 51 not taken.
double asar_readfile<1ull>():
✓ Branch 10 → 11 taken 7 times.
✗ Branch 10 → 43 not taken.
double asar_readfile<2ull>():
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
double asar_readfile<3ull>():
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 43 not taken.
double asar_readfile<4ull>():
✓ Branch 10 → 11 taken 1 time.
✗ Branch 10 → 43 not taken.
18 double default_value = get_double_argument();
410
14/32
double asar_readfile<1ul>():
✓ Branch 14 → 15 taken 7 times.
✗ Branch 14 → 16 not taken.
✓ Branch 15 → 16 taken 2 times.
✓ Branch 15 → 17 taken 5 times.
double asar_readfile<2ul>():
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 16 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 1 time.
double asar_readfile<3ul>():
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 16 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
double asar_readfile<4ul>():
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 16 not taken.
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 1 time.
double asar_readfile<1ull>():
✓ Branch 11 → 12 taken 7 times.
✗ Branch 11 → 13 not taken.
✓ Branch 12 → 13 taken 2 times.
✓ Branch 12 → 14 taken 5 times.
double asar_readfile<2ull>():
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 13 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 1 time.
double asar_readfile<3ull>():
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
double asar_readfile<4ull>():
✓ Branch 11 → 12 taken 1 time.
✗ Branch 11 → 13 not taken.
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 1 time.
18 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) return default_value;
411
8/16
double asar_readfile<1ul>():
✓ Branch 17 → 18 taken 2 times.
✓ Branch 17 → 33 taken 3 times.
double asar_readfile<2ul>():
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 33 taken 1 time.
double asar_readfile<3ul>():
✗ Branch 17 → 18 not taken.
✗ Branch 17 → 33 not taken.
double asar_readfile<4ul>():
✓ Branch 17 → 18 taken 1 time.
✗ Branch 17 → 33 not taken.
double asar_readfile<1ull>():
✓ Branch 14 → 15 taken 2 times.
✓ Branch 14 → 29 taken 3 times.
double asar_readfile<2ull>():
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 29 taken 1 time.
double asar_readfile<3ull>():
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 29 not taken.
double asar_readfile<4ull>():
✓ Branch 14 → 15 taken 1 time.
✗ Branch 14 → 29 not taken.
14 if (offset < 0 || offset + count > fhandle->filesize) return default_value;
412 }
413 else
414 {
415
16/80
double asar_readfile<1ul>():
✓ Branch 19 → 20 taken 7 times.
✗ Branch 19 → 21 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 25 taken 7 times.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 51 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 51 not taken.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 51 not taken.
double asar_readfile<2ul>():
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 21 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 25 taken 1 time.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 51 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 51 not taken.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 51 not taken.
double asar_readfile<3ul>():
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 21 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 25 taken 1 time.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 51 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 51 not taken.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 51 not taken.
double asar_readfile<4ul>():
✓ Branch 19 → 20 taken 1 time.
✗ Branch 19 → 21 not taken.
✗ Branch 20 → 21 not taken.
✓ Branch 20 → 25 taken 1 time.
✗ Branch 22 → 23 not taken.
✗ Branch 22 → 51 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 51 not taken.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 51 not taken.
double asar_readfile<1ull>():
✓ Branch 16 → 17 taken 7 times.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 22 taken 7 times.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 43 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 43 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 43 not taken.
double asar_readfile<2ull>():
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 22 taken 1 time.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 43 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 43 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 43 not taken.
double asar_readfile<3ull>():
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 22 taken 1 time.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 43 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 43 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 43 not taken.
double asar_readfile<4ull>():
✓ Branch 16 → 17 taken 1 time.
✗ Branch 16 → 18 not taken.
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 22 taken 1 time.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 43 not taken.
✗ Branch 20 → 21 not taken.
✗ Branch 20 → 43 not taken.
✗ Branch 21 → 22 not taken.
✗ Branch 21 → 43 not taken.
20 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) asar_throw_error(2, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), name.data());
416
8/48
double asar_readfile<1ul>():
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 33 taken 7 times.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 49 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 47 not taken.
double asar_readfile<2ul>():
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 33 taken 1 time.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 49 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 47 not taken.
double asar_readfile<3ul>():
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 33 taken 1 time.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 49 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 47 not taken.
double asar_readfile<4ul>():
✗ Branch 25 → 26 not taken.
✓ Branch 25 → 33 taken 1 time.
✗ Branch 28 → 29 not taken.
✗ Branch 28 → 49 not taken.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 47 not taken.
double asar_readfile<1ull>():
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 29 taken 7 times.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 42 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 40 not taken.
double asar_readfile<2ull>():
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 29 taken 1 time.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 42 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 40 not taken.
double asar_readfile<3ull>():
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 29 taken 1 time.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 42 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 40 not taken.
double asar_readfile<4ull>():
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 29 taken 1 time.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 42 not taken.
✗ Branch 26 → 27 not taken.
✗ Branch 26 → 40 not taken.
20 if (offset < 0 || offset + count > fhandle->filesize) asar_throw_error(2, error_type_block, error_id_file_offset_out_of_bounds, dec(offset).data(), name.data());
417 }
418
419 28 unsigned char data[4] = { 0, 0, 0, 0 };
420
8/16
double asar_readfile<1ul>():
✓ Branch 34 → 35 taken 10 times.
✗ Branch 34 → 51 not taken.
double asar_readfile<2ul>():
✓ Branch 34 → 35 taken 2 times.
✗ Branch 34 → 51 not taken.
double asar_readfile<3ul>():
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 51 not taken.
double asar_readfile<4ul>():
✓ Branch 34 → 35 taken 1 time.
✗ Branch 34 → 51 not taken.
double asar_readfile<1ull>():
✓ Branch 29 → 30 taken 10 times.
✗ Branch 29 → 43 not taken.
double asar_readfile<2ull>():
✓ Branch 29 → 30 taken 2 times.
✗ Branch 29 → 43 not taken.
double asar_readfile<3ull>():
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 43 not taken.
double asar_readfile<4ull>():
✓ Branch 29 → 30 taken 1 time.
✗ Branch 29 → 43 not taken.
28 filesystem->read_file(fhandle->filehandle, data, offset, count);
421
422 28 unsigned int value = 0;
423
16/16
double asar_readfile<1ul>():
✓ Branch 37 → 36 taken 10 times.
✓ Branch 37 → 38 taken 10 times.
double asar_readfile<2ul>():
✓ Branch 37 → 36 taken 4 times.
✓ Branch 37 → 38 taken 2 times.
double asar_readfile<3ul>():
✓ Branch 37 → 36 taken 3 times.
✓ Branch 37 → 38 taken 1 time.
double asar_readfile<4ul>():
✓ Branch 37 → 36 taken 4 times.
✓ Branch 37 → 38 taken 1 time.
double asar_readfile<1ull>():
✓ Branch 32 → 31 taken 10 times.
✓ Branch 32 → 33 taken 10 times.
double asar_readfile<2ull>():
✓ Branch 32 → 31 taken 4 times.
✓ Branch 32 → 33 taken 2 times.
double asar_readfile<3ull>():
✓ Branch 32 → 31 taken 3 times.
✓ Branch 32 → 33 taken 1 time.
double asar_readfile<4ull>():
✓ Branch 32 → 31 taken 4 times.
✓ Branch 32 → 33 taken 1 time.
70 for(size_t i = 0; i < count; i++)
424 {
425 42 value |= data[i] << (8 * i);
426 }
427
428 28 return value;
429 38 }
430
431 18 template <size_t count> double asar_canreadfile()
432 {
433
8/20
double asar_canreadfile<0ul>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 28 not taken.
double asar_canreadfile<1ul>():
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 27 not taken.
double asar_canreadfile<2ul>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 27 not taken.
double asar_canreadfile<3ul>():
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 27 not taken.
double asar_canreadfile<4ul>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 27 not taken.
double asar_canreadfile<0ull>():
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 24 not taken.
double asar_canreadfile<1ull>():
✓ Branch 2 → 3 taken 5 times.
✗ Branch 2 → 23 not taken.
double asar_canreadfile<2ull>():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 23 not taken.
double asar_canreadfile<3ull>():
✗ Branch 2 → 3 not taken.
✗ Branch 2 → 23 not taken.
double asar_canreadfile<4ull>():
✓ Branch 2 → 3 taken 1 time.
✗ Branch 2 → 23 not taken.
18 string name = get_string_argument();
434
8/20
double asar_canreadfile<0ul>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 26 not taken.
double asar_canreadfile<1ul>():
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 25 not taken.
double asar_canreadfile<2ul>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 25 not taken.
double asar_canreadfile<3ul>():
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 25 not taken.
double asar_canreadfile<4ul>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 25 not taken.
double asar_canreadfile<0ull>():
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 22 not taken.
double asar_canreadfile<1ull>():
✓ Branch 3 → 4 taken 5 times.
✗ Branch 3 → 21 not taken.
double asar_canreadfile<2ull>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 21 not taken.
double asar_canreadfile<3ull>():
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 21 not taken.
double asar_canreadfile<4ull>():
✓ Branch 3 → 4 taken 1 time.
✗ Branch 3 → 21 not taken.
18 require_next_parameter();
435
8/20
double asar_canreadfile<0ul>():
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 26 not taken.
double asar_canreadfile<1ul>():
✓ Branch 5 → 6 taken 5 times.
✗ Branch 5 → 25 not taken.
double asar_canreadfile<2ul>():
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 25 not taken.
double asar_canreadfile<3ul>():
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 25 not taken.
double asar_canreadfile<4ul>():
✓ Branch 5 → 6 taken 1 time.
✗ Branch 5 → 25 not taken.
double asar_canreadfile<0ull>():
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 22 not taken.
double asar_canreadfile<1ull>():
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 21 not taken.
double asar_canreadfile<2ull>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 21 not taken.
double asar_canreadfile<3ull>():
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 21 not taken.
double asar_canreadfile<4ull>():
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 21 not taken.
18 size_t offset = get_double_argument();
436 18 size_t length = count;
437 if(!count)
438 {
439
2/4
double asar_canreadfile<0ul>():
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 26 not taken.
double asar_canreadfile<0ull>():
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 22 not taken.
4 require_next_parameter();
440
2/4
double asar_canreadfile<0ul>():
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 26 not taken.
double asar_canreadfile<0ull>():
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 22 not taken.
4 length = get_double_argument();
441 }
442
16/40
double asar_canreadfile<0ul>():
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 24 not taken.
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 22 not taken.
double asar_canreadfile<1ul>():
✓ Branch 8 → 9 taken 5 times.
✗ Branch 8 → 23 not taken.
✓ Branch 9 → 10 taken 5 times.
✗ Branch 9 → 21 not taken.
double asar_canreadfile<2ul>():
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 23 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 21 not taken.
double asar_canreadfile<3ul>():
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 23 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 21 not taken.
double asar_canreadfile<4ul>():
✓ Branch 8 → 9 taken 1 time.
✗ Branch 8 → 23 not taken.
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 21 not taken.
double asar_canreadfile<0ull>():
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 21 not taken.
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 19 not taken.
double asar_canreadfile<1ull>():
✓ Branch 6 → 7 taken 5 times.
✗ Branch 6 → 20 not taken.
✓ Branch 7 → 8 taken 5 times.
✗ Branch 7 → 18 not taken.
double asar_canreadfile<2ull>():
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 20 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 18 not taken.
double asar_canreadfile<3ull>():
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 20 not taken.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 18 not taken.
double asar_canreadfile<4ull>():
✓ Branch 6 → 7 taken 1 time.
✗ Branch 6 → 20 not taken.
✓ Branch 7 → 8 taken 1 time.
✗ Branch 7 → 18 not taken.
18 cachedfile * fhandle = opencachedfile(name, false);
443
18/40
double asar_canreadfile<0ul>():
✓ Branch 13 → 14 taken 2 times.
✗ Branch 13 → 15 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 2 times.
double asar_canreadfile<1ul>():
✓ Branch 12 → 13 taken 5 times.
✗ Branch 12 → 14 not taken.
✓ Branch 13 → 14 taken 2 times.
✓ Branch 13 → 15 taken 3 times.
double asar_canreadfile<2ul>():
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 1 time.
double asar_canreadfile<3ul>():
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 15 not taken.
double asar_canreadfile<4ul>():
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 14 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 1 time.
double asar_canreadfile<0ull>():
✓ Branch 10 → 11 taken 2 times.
✗ Branch 10 → 12 not taken.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 2 times.
double asar_canreadfile<1ull>():
✓ Branch 9 → 10 taken 5 times.
✗ Branch 9 → 11 not taken.
✓ Branch 10 → 11 taken 2 times.
✓ Branch 10 → 12 taken 3 times.
double asar_canreadfile<2ull>():
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 1 time.
double asar_canreadfile<3ull>():
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 10 → 12 not taken.
double asar_canreadfile<4ull>():
✓ Branch 9 → 10 taken 1 time.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 1 time.
18 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) return 0;
444
10/20
double asar_canreadfile<0ul>():
✓ Branch 16 → 17 taken 1 time.
✓ Branch 16 → 18 taken 1 time.
double asar_canreadfile<1ul>():
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 3 times.
double asar_canreadfile<2ul>():
✗ Branch 15 → 16 not taken.
✓ Branch 15 → 17 taken 1 time.
double asar_canreadfile<3ul>():
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 17 not taken.
double asar_canreadfile<4ul>():
✓ Branch 15 → 16 taken 1 time.
✗ Branch 15 → 17 not taken.
double asar_canreadfile<0ull>():
✓ Branch 13 → 14 taken 1 time.
✓ Branch 13 → 15 taken 1 time.
double asar_canreadfile<1ull>():
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 3 times.
double asar_canreadfile<2ull>():
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 1 time.
double asar_canreadfile<3ull>():
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 14 not taken.
double asar_canreadfile<4ull>():
✓ Branch 12 → 13 taken 1 time.
✗ Branch 12 → 14 not taken.
14 if (offset < 0 || offset + length > fhandle->filesize) return 0;
445 10 return 1;
446 18 }
447
448 // returns 0 if the file is OK, 1 if the file doesn't exist, 2 if it couldn't be opened for some other reason
449 24 static double asar_filestatus()
450 {
451
3/7
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 15 not taken.
✓ Branch 3 → 4 taken 24 times.
✗ Branch 3 → 13 not taken.
✗ Branch 3 → 17 not taken.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 15 not taken.
24 cachedfile * fhandle = opencachedfile(get_string_argument(), false);
452
6/8
✓ Branch 5 → 6 taken 12 times.
✗ Branch 5 → 7 not taken.
✓ Branch 6 → 7 taken 6 times.
✓ Branch 6 → 11 taken 6 times.
✓ Branch 7 → 8 taken 12 times.
✗ Branch 7 → 9 not taken.
✓ Branch 8 → 9 taken 6 times.
✓ Branch 8 → 13 taken 6 times.
24 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE)
453 {
454
2/4
✓ Branch 8 → 9 taken 6 times.
✗ Branch 8 → 10 not taken.
✓ Branch 10 → 11 taken 6 times.
✗ Branch 10 → 12 not taken.
12 if (filesystem->get_last_error() == vfe_doesnt_exist)
455 {
456 12 return 1;
457 }
458 else
459 {
460 return 2;
461 }
462 }
463 12 return 0;
464 }
465
466 // Returns the size of the specified file.
467 4 static double asar_filesize()
468 {
469
2/4
✓ Branch 2 → 3 taken 2 times.
✗ Branch 2 → 20 not taken.
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 24 not taken.
4 string name = get_string_argument();
470
4/8
✓ Branch 3 → 4 taken 2 times.
✗ Branch 3 → 17 not taken.
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 15 not taken.
✓ Branch 5 → 6 taken 2 times.
✗ Branch 5 → 20 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 18 not taken.
4 cachedfile * fhandle = opencachedfile(name, false);
471
4/18
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 8 not taken.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 12 taken 2 times.
✓ Branch 9 → 10 taken 2 times.
✗ Branch 9 → 11 not taken.
✗ Branch 9 → 18 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 15 taken 2 times.
✗ Branch 10 → 18 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 18 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 12 → 22 not taken.
✗ Branch 13 → 14 not taken.
✗ Branch 13 → 22 not taken.
✗ Branch 14 → 15 not taken.
✗ Branch 14 → 22 not taken.
4 if (fhandle == nullptr || fhandle->filehandle == INVALID_VIRTUAL_FILE_HANDLE) asar_throw_error(2, error_type_block, vfile_error_to_error_id(asar_get_last_io_error()), name.data());
472 4 return (double)fhandle->filesize;
473 4 }
474
475 // Checks whether the specified define is defined.
476 124 static double asar_isdefined()
477 {
478
4/8
✓ Branch 2 → 3 taken 62 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 62 times.
✗ Branch 3 → 12 not taken.
✓ Branch 4 → 5 taken 62 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 62 times.
✗ Branch 5 → 10 not taken.
124 return defines.exists(get_string_argument());
479 }
480
481 // RPG Hacker: What exactly makes this function overly complicated, you ask?
482 // Well, it converts a double to a string and then back to a double.
483 // It was the quickest reliable solution I could find, though, so there's that.
484 4 static double asar_round()
485 {
486
1/3
✓ Branch 2 → 3 taken 4 times.
✗ Branch 2 → 13 not taken.
✗ Branch 2 → 14 not taken.
4 double number = get_double_argument();
487
1/3
✓ Branch 3 → 4 taken 4 times.
✗ Branch 3 → 13 not taken.
✗ Branch 3 → 14 not taken.
4 require_next_parameter();
488
489 // Hue hue hue... ass!
490 // OK, sorry, I apologize.
491
3/7
✓ Branch 4 → 5 taken 2 times.
✗ Branch 4 → 13 not taken.
✓ Branch 5 → 6 taken 4 times.
✗ Branch 5 → 13 not taken.
✗ Branch 5 → 14 not taken.
✓ Branch 6 → 7 taken 2 times.
✗ Branch 6 → 14 not taken.
4 string asstring = ftostrvar(number, get_double_argument());
492
493 // Some hacky shenanigans with variables going on here
494 4 const char * strbackup = str;
495 4 str = asstring;
496
2/4
✓ Branch 7 → 8 taken 2 times.
✗ Branch 7 → 11 not taken.
✓ Branch 8 → 9 taken 2 times.
✗ Branch 8 → 12 not taken.
4 double asdouble = (double)getnum();
497 4 str = strbackup;
498
499 4 return asdouble;
500 4 }
501
502 220 static double asar_structsize_wrapper()
503 {
504
2/4
✓ Branch 2 → 3 taken 110 times.
✗ Branch 2 → 18 not taken.
✓ Branch 3 → 4 taken 110 times.
✗ Branch 3 → 19 not taken.
220 string symbol = get_symbol_argument();
505
4/4
✓ Branch 4 → 5 taken 102 times.
✓ Branch 4 → 10 taken 8 times.
✓ Branch 5 → 6 taken 102 times.
✓ Branch 5 → 11 taken 8 times.
220 if(symbol == "..."){
506
6/7
✓ Branch 5 → 6 taken 1 time.
✓ Branch 5 → 7 taken 101 times.
✓ Branch 6 → 7 taken 1 time.
✓ Branch 6 → 8 taken 101 times.
✓ Branch 6 → 16 taken 1 time.
✗ Branch 7 → 8 not taken.
✓ Branch 7 → 17 taken 1 time.
204 if(!inmacro) asar_throw_error(2, error_type_block, error_id_vararg_sizeof_nomacro);
507
6/7
✓ Branch 7 → 8 taken 1 time.
✓ Branch 7 → 9 taken 100 times.
✓ Branch 8 → 9 taken 1 time.
✓ Branch 8 → 10 taken 100 times.
✓ Branch 8 → 16 taken 1 time.
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 17 taken 1 time.
202 if(numvarargs == -1) asar_throw_error(2, error_type_block, error_id_macro_not_varadic);
508 200 return numvarargs;
509 }
510
2/4
✓ Branch 11 → 12 taken 8 times.
✗ Branch 11 → 16 not taken.
✓ Branch 12 → 13 taken 8 times.
✗ Branch 12 → 17 not taken.
16 return (double)struct_size(symbol);
511 220 }
512
513 16 static double asar_objectsize_wrapper()
514 {
515
4/8
✓ Branch 2 → 3 taken 8 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 8 times.
✗ Branch 3 → 12 not taken.
✓ Branch 4 → 5 taken 8 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 8 times.
✗ Branch 5 → 10 not taken.
16 return (double)object_size(get_symbol_argument());
516 }
517
518 20 static double asar_datasize_wrapper()
519 {
520
4/8
✓ Branch 2 → 3 taken 10 times.
✗ Branch 2 → 11 not taken.
✓ Branch 3 → 4 taken 10 times.
✗ Branch 3 → 12 not taken.
✓ Branch 4 → 5 taken 10 times.
✗ Branch 4 → 9 not taken.
✓ Branch 5 → 6 taken 10 times.
✗ Branch 5 → 10 not taken.
20 return (double)data_size(get_symbol_argument());
521 }
522
523 24 static double asar_stringsequal()
524 {
525
2/4
✓ Branch 2 → 3 taken 12 times.
✗ Branch 2 → 18 not taken.
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 22 not taken.
24 string string1 = get_string_argument();
526
2/4
✓ Branch 3 → 4 taken 12 times.
✗ Branch 3 → 16 not taken.
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 20 not taken.
24 require_next_parameter();
527
6/8
✓ Branch 4 → 5 taken 12 times.
✗ Branch 4 → 15 not taken.
✓ Branch 6 → 7 taken 12 times.
✗ Branch 6 → 18 not taken.
✓ Branch 7 → 8 taken 6 times.
✓ Branch 7 → 9 taken 6 times.
✓ Branch 9 → 10 taken 6 times.
✓ Branch 9 → 11 taken 6 times.
48 return (strcmp(string1, get_string_argument()) == 0 ? 1.0 : 0.0);
528 24 }
529
530 12 static double asar_stringsequalnocase()
531 {
532
2/4
✓ Branch 2 → 3 taken 6 times.
✗ Branch 2 → 21 not taken.
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 22 not taken.
12 string string1 = get_string_argument();
533
2/4
✓ Branch 3 → 4 taken 6 times.
✗ Branch 3 → 19 not taken.
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 20 not taken.
12 require_next_parameter();
534
5/10
✓ Branch 4 → 5 taken 6 times.
✗ Branch 4 → 18 not taken.
✓ Branch 6 → 7 taken 6 times.
✗ Branch 6 → 18 not taken.
✓ Branch 7 → 8 taken 6 times.
✗ Branch 7 → 16 not taken.
✓ Branch 8 → 9 taken 6 times.
✗ Branch 8 → 10 not taken.
✓ Branch 9 → 10 taken 6 times.
✗ Branch 9 → 11 not taken.
24 return (stricmp(string1, get_string_argument()) == 0 ? 1.0 : 0.0);
535 12 }
536
537 42 string copy_arg()
538 {
539
3/3
✓ Branch 2 → 3 taken 8 times.
✓ Branch 2 → 13 taken 17 times.
✓ Branch 2 → 18 taken 17 times.
42 if(*str == '"')
540 {
541
2/4
✓ Branch 3 → 4 taken 4 times.
✗ Branch 3 → 47 not taken.
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 59 not taken.
8 string t = "\"";
542
7/15
✓ Branch 4 → 5 taken 4 times.
✗ Branch 4 → 43 not taken.
✓ Branch 5 → 6 taken 4 times.
✗ Branch 5 → 41 not taken.
✓ Branch 6 → 7 taken 4 times.
✗ Branch 6 → 39 not taken.
✓ Branch 7 → 8 taken 8 times.
✗ Branch 7 → 39 not taken.
✗ Branch 7 → 53 not taken.
✓ Branch 8 → 9 taken 4 times.
✗ Branch 8 → 51 not taken.
✓ Branch 9 → 10 taken 4 times.
✗ Branch 9 → 49 not taken.
✓ Branch 10 → 11 taken 4 times.
✗ Branch 10 → 49 not taken.
12 return (t += get_string_argument() + "\"");
543 8 }
544
545 34 string result;
546 34 bool is_symbolic = true;
547 34 int parlevel=0;
548 34 int i = 0;
549
10/12
✗ Branch 21 → 15 not taken.
✓ Branch 21 → 22 taken 34 times.
✓ Branch 22 → 23 taken 32 times.
✓ Branch 22 → 24 taken 2 times.
✓ Branch 23 → 15 taken 17 times.
✓ Branch 23 → 24 taken 15 times.
✗ Branch 27 → 21 not taken.
✓ Branch 27 → 28 taken 34 times.
✓ Branch 28 → 29 taken 32 times.
✓ Branch 28 → 30 taken 2 times.
✓ Branch 29 → 21 taken 17 times.
✓ Branch 29 → 30 taken 15 times.
68 while(parlevel > 0 || (str[i] != ',' && str[i] != ')'))
550 {
551 34 is_symbolic &= is_ualnum(str[i]);
552
2/4
✗ Branch 16 → 17 not taken.
✓ Branch 16 → 18 taken 17 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 17 times.
34 if(str[i] == '(') parlevel++;
553
2/4
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 17 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 17 times.
34 else if(str[i] == ')') parlevel--;
554 34 i++;
555 }
556
4/8
✓ Branch 24 → 25 taken 17 times.
✗ Branch 24 → 50 not taken.
✓ Branch 25 → 26 taken 17 times.
✗ Branch 25 → 48 not taken.
✓ Branch 31 → 32 taken 17 times.
✗ Branch 31 → 63 not taken.
✓ Branch 32 → 33 taken 17 times.
✗ Branch 32 → 61 not taken.
34 result += string(str, i);
557 34 str += i;
558
559
2/4
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 34 taken 17 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 44 taken 17 times.
34 if(!is_symbolic)
560 {
561 const char *oldstr=str;
562 str = (const char *)result;
563 result = ftostr(eval(0));
564 str = oldstr;
565 }
566
2/4
✓ Branch 34 → 35 taken 17 times.
✗ Branch 34 → 54 not taken.
✓ Branch 44 → 45 taken 17 times.
✗ Branch 44 → 69 not taken.
34 return result;
567 34 }
568
569 assocarr<double (*)()> builtin_functions =
570 {
571 {"sqrt", asar_unary_wrapper<sqrt>},
572 {"sin", asar_unary_wrapper<sin>},
573 {"cos", asar_unary_wrapper<cos>},
574 {"tan", asar_unary_wrapper<tan>},
575 {"asin", asar_unary_wrapper<asin>},
576 {"acos", asar_unary_wrapper<acos>},
577 {"atan", asar_unary_wrapper<atan>},
578 {"arcsin", asar_unary_wrapper<asin>},
579 {"arccos", asar_unary_wrapper<acos>},
580 {"arctan", asar_unary_wrapper<atan>},
581 {"log", asar_unary_wrapper<log>},
582 {"log10", asar_unary_wrapper<log10>},
583 {"log2", asar_unary_wrapper<log2>},
584
585 {"ceil", asar_unary_wrapper<ceil>},
586 {"floor", asar_unary_wrapper<floor>},
587
588 {"read1", asar_read<1>}, //This handles the safe and unsafe variant
589 {"read2", asar_read<2>},
590 {"read3", asar_read<3>},
591 {"read4", asar_read<4>},
592 {"canread", asar_canread<0>},
593 {"canread1", asar_canread<1>},
594 {"canread2", asar_canread<2>},
595 {"canread3", asar_canread<3>},
596 {"canread4", asar_canread<4>},
597
598 {"readfile1", asar_readfile<1>},
599 {"readfile2", asar_readfile<2>},
600 {"readfile3", asar_readfile<3>},
601 {"readfile4", asar_readfile<4>},
602 {"canreadfile", asar_canreadfile<0>},
603 {"canreadfile1", asar_canreadfile<1>},
604 {"canreadfile2", asar_canreadfile<2>},
605 {"canreadfile3", asar_canreadfile<3>},
606 {"canreadfile4", asar_canreadfile<4>},
607
608 {"filesize", asar_filesize},
609 {"getfilestatus", asar_filestatus},
610
611 {"defined", asar_isdefined},
612
613 {"snestopc", asar_snestopc_wrapper},
614 {"pctosnes", asar_pctosnes_wrapper},
615 {"realbase", asar_realbase_wrapper},
616 {"pc", asar_pc_wrapper},
617
618 {"max", asar_binary_wrapper<asar_max>},
619 {"min", asar_binary_wrapper<asar_min>},
620 {"clamp", asar_clamp},
621
622 {"safediv", asar_safediv},
623
624 {"select", asar_select},
625 {"bank", asar_unary_wrapper<asar_bank>},
626 {"not", asar_unary_wrapper<std::logical_not<unsigned int>>},
627 {"equal", asar_binary_wrapper<std::equal_to<double>>},
628 {"notequal", asar_binary_wrapper<std::not_equal_to<double>>},
629 {"less", asar_binary_wrapper<std::less<double>>},
630 {"lessequal", asar_binary_wrapper<std::less_equal<double>>},
631 {"greater", asar_binary_wrapper<std::greater<double>>},
632 {"greaterequal", asar_binary_wrapper<std::greater_equal<double>>},
633
634 {"and", asar_binary_wrapper<std::logical_and<unsigned int>>},
635 {"or", asar_binary_wrapper<std::logical_or<unsigned int>>},
636 {"nand", asar_binary_wrapper<asar_logical_nand>},
637 {"nor", asar_binary_wrapper<asar_logical_nor>},
638 {"xor", asar_binary_wrapper<asar_logical_xor>},
639
640 {"round", asar_round},
641
642 {"sizeof", asar_structsize_wrapper},
643 {"objectsize", asar_objectsize_wrapper},
644 {"datasize", asar_datasize_wrapper},
645
646 {"stringsequal", asar_stringsequal},
647 {"stringsequalnocase", asar_stringsequalnocase}
648 30 };
649
650 assocarr<double (*)()> functions;
651
652 struct funcdat {
653 autoptr<char*> name;
654 int numargs;
655 autoptr<char*> argbuf;//this one isn't used, it's just to free it up
656 autoptr<char**> arguments;
657 autoptr<char*> content;
658 };
659 static assocarr<funcdat> user_functions;
660
661 30 static double asar_call_user_function()
662 {
663 30 autoarray<string> args;
664
2/4
✓ Branch 3 → 4 taken 15 times.
✗ Branch 3 → 76 not taken.
✓ Branch 4 → 5 taken 15 times.
✗ Branch 4 → 82 not taken.
30 funcdat &user_function = user_functions[current_user_function_name];
665 30 string real_content;
666
667
2/4
✗ Branch 7 → 6 not taken.
✓ Branch 7 → 8 taken 15 times.
✗ Branch 9 → 8 not taken.
✓ Branch 9 → 10 taken 15 times.
30 while (*str==' ') str++;
668 30 bool has_next = *str != ')';
669
670
4/4
✓ Branch 17 → 9 taken 21 times.
✓ Branch 17 → 18 taken 15 times.
✓ Branch 21 → 11 taken 21 times.
✓ Branch 21 → 22 taken 15 times.
72 for (int i=0;i<user_function.numargs;i++)
671 {
672
2/4
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 21 times.
✗ Branch 11 → 12 not taken.
✓ Branch 11 → 13 taken 21 times.
42 if(!has_next)
673 {
674 asar_throw_error(2, error_type_block, error_id_expected_parameter, current_user_function_name);
675 }
676
6/12
✓ Branch 11 → 12 taken 21 times.
✗ Branch 11 → 73 not taken.
✓ Branch 12 → 13 taken 21 times.
✗ Branch 12 → 71 not taken.
✓ Branch 13 → 14 taken 21 times.
✗ Branch 13 → 71 not taken.
✓ Branch 14 → 15 taken 21 times.
✗ Branch 14 → 78 not taken.
✓ Branch 15 → 16 taken 21 times.
✗ Branch 15 → 76 not taken.
✓ Branch 16 → 17 taken 21 times.
✗ Branch 16 → 76 not taken.
42 args[i] = copy_arg();
677 42 has_next = has_next_parameter();
678 }
679
680
2/4
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 15 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 15 times.
30 if(has_next)
681 {
682 asar_throw_error(2, error_type_block, error_id_unexpected_parameter, current_user_function_name);
683 }
684
685
4/4
✓ Branch 64 → 21 taken 62 times.
✓ Branch 64 → 65 taken 15 times.
✓ Branch 68 → 25 taken 62 times.
✓ Branch 68 → 69 taken 15 times.
154 for(int i=0; user_function.content[i]; i++)
686 {
687
10/12
✓ Branch 23 → 24 taken 37 times.
✓ Branch 23 → 27 taken 25 times.
✓ Branch 25 → 26 taken 37 times.
✗ Branch 25 → 27 not taken.
✓ Branch 27 → 28 taken 37 times.
✓ Branch 27 → 31 taken 25 times.
✓ Branch 28 → 29 taken 37 times.
✓ Branch 28 → 32 taken 25 times.
✓ Branch 29 → 30 taken 37 times.
✗ Branch 29 → 31 not taken.
✓ Branch 32 → 33 taken 37 times.
✓ Branch 32 → 36 taken 25 times.
124 if(!is_alpha(user_function.content[i]) && user_function.content[i] != '_')
688 {
689
2/4
✓ Branch 30 → 31 taken 37 times.
✗ Branch 30 → 74 not taken.
✓ Branch 34 → 35 taken 37 times.
✗ Branch 34 → 80 not taken.
74 real_content += user_function.content[i];
690 74 continue;
691 }
692 50 bool found = false;
693
4/4
✓ Branch 51 → 33 taken 41 times.
✓ Branch 51 → 52 taken 25 times.
✓ Branch 55 → 37 taken 41 times.
✓ Branch 55 → 56 taken 25 times.
132 for (int j=0;user_function.arguments[j];j++)
694 {
695 //this should *always* have a null term or another character after
696 82 bool potential_arg = stribegin(user_function.content+i, user_function.arguments[j]);
697 82 int next_char = i+strlen(user_function.arguments[j]);
698
12/16
✓ Branch 37 → 38 taken 21 times.
✓ Branch 37 → 44 taken 20 times.
✓ Branch 40 → 41 taken 21 times.
✗ Branch 40 → 44 not taken.
✓ Branch 41 → 42 taken 21 times.
✓ Branch 41 → 48 taken 20 times.
✓ Branch 42 → 43 taken 21 times.
✗ Branch 42 → 44 not taken.
✓ Branch 44 → 45 taken 21 times.
✗ Branch 44 → 48 not taken.
✓ Branch 45 → 46 taken 21 times.
✓ Branch 45 → 49 taken 20 times.
✓ Branch 46 → 47 taken 21 times.
✗ Branch 46 → 48 not taken.
✓ Branch 49 → 50 taken 21 times.
✓ Branch 49 → 53 taken 20 times.
82 if(potential_arg && (!is_alnum(user_function.content[next_char]) && user_function.content[next_char] != '_'))
699 {
700
4/8
✓ Branch 46 → 47 taken 21 times.
✗ Branch 46 → 74 not taken.
✓ Branch 47 → 48 taken 21 times.
✗ Branch 47 → 74 not taken.
✓ Branch 50 → 51 taken 21 times.
✗ Branch 50 → 80 not taken.
✓ Branch 51 → 52 taken 21 times.
✗ Branch 51 → 80 not taken.
42 real_content += args[j];
701 42 i = next_char - 1;
702 42 found = true;
703 }
704 }
705
706
4/4
✓ Branch 52 → 53 taken 4 times.
✓ Branch 52 → 62 taken 21 times.
✓ Branch 56 → 57 taken 4 times.
✓ Branch 56 → 66 taken 21 times.
50 if(!found){
707
4/4
✓ Branch 59 → 54 taken 36 times.
✓ Branch 59 → 60 taken 4 times.
✓ Branch 63 → 58 taken 36 times.
✓ Branch 63 → 64 taken 4 times.
80 for(; is_ualnum(user_function.content[i]); i++){
708
2/4
✓ Branch 55 → 56 taken 36 times.
✗ Branch 55 → 74 not taken.
✓ Branch 59 → 60 taken 36 times.
✗ Branch 59 → 80 not taken.
72 real_content += user_function.content[i];
709 }
710
2/4
✓ Branch 61 → 62 taken 4 times.
✗ Branch 61 → 74 not taken.
✓ Branch 65 → 66 taken 4 times.
✗ Branch 65 → 80 not taken.
8 real_content += user_function.content[i];
711 }
712 }
713 30 const char * oldstr=str;
714 30 str = (const char *)real_content;
715
2/4
✓ Branch 66 → 67 taken 15 times.
✗ Branch 66 → 74 not taken.
✓ Branch 70 → 71 taken 15 times.
✗ Branch 70 → 80 not taken.
30 double result = eval(0);
716 30 str = oldstr;
717 30 return result;
718 30 }
719
720 30 void createuserfunc(const char * name, const char * arguments, const char * content)
721 {
722
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 30 times.
30 if (!confirmqpar(content)) asar_throw_error(0, error_type_block, error_id_mismatched_parentheses);
723
1/2
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 30 times.
30 if(functions.exists(name)) //functions holds both types.
724 {
725 //asar_throw_error(0, error_type_block, error_id_function_redefined, name);
726 asar_throw_warning(1, warning_id_feature_deprecated, "overwriting a previously defined function", "change the function name");
727 }
728 30 funcdat& user_function=user_functions[name];
729 30 user_function.name= duplicate_string(name);
730 30 user_function.argbuf= duplicate_string(arguments);
731 30 user_function.arguments=qsplit(user_function.argbuf, ",", &(user_function.numargs));
732 30 user_function.content= duplicate_string(content);
733
4/4
✓ Branch 39 → 19 taken 21 times.
✓ Branch 39 → 40 taken 15 times.
✓ Branch 40 → 19 taken 21 times.
✓ Branch 40 → 41 taken 15 times.
72 for (int i=0;user_function.arguments[i];i++)
734 {
735
4/4
✓ Branch 31 → 20 taken 33 times.
✓ Branch 31 → 32 taken 21 times.
✓ Branch 32 → 20 taken 33 times.
✓ Branch 32 → 33 taken 21 times.
108 for(int j=0;user_function.arguments[j];j++)
736 {
737
7/11
✓ Branch 20 → 21 taken 24 times.
✓ Branch 20 → 25 taken 21 times.
✓ Branch 20 → 26 taken 21 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 25 taken 12 times.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 12 times.
✗ Branch 26 → 27 not taken.
✓ Branch 26 → 29 taken 33 times.
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 30 taken 33 times.
66 if(i!=j && !stricmp(user_function.arguments[i], user_function.arguments[j]))
738 {
739 asar_throw_error(0, error_type_block, error_id_duplicate_param_name, user_function.arguments[i], name);
740 }
741 }
742
2/4
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 37 taken 21 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 38 taken 21 times.
42 if (!confirmname(user_function.arguments[i]))
743 {
744 user_functions.remove(name);
745 asar_throw_error(0, error_type_block, error_id_invalid_param_name);
746 }
747 }
748
749 30 functions[name] = asar_call_user_function;
750 30 }
751
752 1837864 static double getnumcore()
753 {
754
2/2
✓ Branch 2 → 3 taken 536 times.
✓ Branch 2 → 7 taken 1837328 times.
1837864 if (*str=='(')
755 {
756 536 str++;
757 536 double rval=eval(0);
758
1/2
✗ Branch 4 → 5 not taken.
✓ Branch 4 → 6 taken 536 times.
536 if (*str != ')') asar_throw_error(2, error_type_block, error_id_mismatched_parentheses);
759 536 str++;
760 536 return rval;
761 }
762
2/2
✓ Branch 7 → 8 taken 7178 times.
✓ Branch 7 → 16 taken 1830150 times.
1837328 if (*str=='$')
763 {
764
1/2
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 7178 times.
7178 if (!is_xdigit(str[1])) asar_throw_error(2, error_type_block, error_id_invalid_hex_value);
765
1/2
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 7178 times.
7178 if (to_lower(str[2])=='x') return -42;//let str get an invalid value so it'll throw an invalid operator later on
766 7178 return strtoull(str+1, const_cast<char**>(&str), 16);
767 }
768
2/2
✓ Branch 16 → 17 taken 16 times.
✓ Branch 16 → 22 taken 1830134 times.
1830150 if (*str=='%')
769 {
770
1/4
✗ Branch 17 → 18 not taken.
✓ Branch 17 → 20 taken 16 times.
✗ Branch 18 → 19 not taken.
✗ Branch 18 → 20 not taken.
16 if (str[1] != '0' && str[1] != '1') asar_throw_error(2, error_type_block, error_id_invalid_binary_value);
771 16 return strtoull(str+1, const_cast<char**>(&str), 2);
772 }
773
2/2
✓ Branch 22 → 23 taken 48 times.
✓ Branch 22 → 27 taken 1830086 times.
1830134 if (*str=='\'')
774 {
775
2/4
✓ Branch 23 → 24 taken 48 times.
✗ Branch 23 → 25 not taken.
✗ Branch 24 → 25 not taken.
✓ Branch 24 → 26 taken 48 times.
48 if (!str[1] || str[2] != '\'') asar_throw_error(2, error_type_block, error_id_invalid_character);
776 48 unsigned int rval=table.table[(unsigned char)str[1]];
777 48 str+=3;
778 48 return rval;
779 }
780
3/3
✓ Branch 28 → 29 taken 1828202 times.
✓ Branch 28 → 43 taken 942 times.
✓ Branch 28 → 44 taken 942 times.
1830086 if (is_digit(*str))
781 {
782 1828202 const char* end = str;
783
6/6
✓ Branch 32 → 33 taken 1828244 times.
✓ Branch 32 → 34 taken 6397446 times.
✓ Branch 33 → 34 taken 42 times.
✓ Branch 33 → 35 taken 1828202 times.
✓ Branch 36 → 30 taken 6397488 times.
✓ Branch 36 → 37 taken 1828202 times.
8225690 while (is_digit(*end) || *end == '.') end++;
784 1828202 string number;
785
2/4
✓ Branch 38 → 39 taken 914101 times.
✗ Branch 38 → 116 not taken.
✓ Branch 39 → 40 taken 914101 times.
✗ Branch 39 → 127 not taken.
1828202 number.assign(str, (int)(end - str));
786 1828202 str = end;
787 1828202 return atof(number);
788 1828202 }
789
14/16
✓ Branch 44 → 45 taken 11 times.
✓ Branch 44 → 48 taken 931 times.
✓ Branch 45 → 46 taken 22 times.
✗ Branch 45 → 48 not taken.
✓ Branch 45 → 49 taken 931 times.
✓ Branch 46 → 47 taken 20 times.
✓ Branch 46 → 48 taken 2 times.
✗ Branch 46 → 49 not taken.
✓ Branch 47 → 48 taken 15 times.
✓ Branch 47 → 49 taken 5 times.
✓ Branch 48 → 49 taken 6 times.
✓ Branch 48 → 50 taken 3 times.
✓ Branch 50 → 51 taken 939 times.
✓ Branch 50 → 113 taken 3 times.
✓ Branch 51 → 52 taken 939 times.
✓ Branch 51 → 124 taken 3 times.
1884 if (is_alpha(*str) || *str=='_' || *str=='.' || *str=='?')
790 {
791 1878 const char * start=str;
792
15/15
✓ Branch 54 → 55 taken 1177 times.
✓ Branch 54 → 57 taken 7551 times.
✓ Branch 55 → 56 taken 1037 times.
✓ Branch 55 → 57 taken 140 times.
✓ Branch 56 → 57 taken 1275 times.
✓ Branch 56 → 58 taken 939 times.
✓ Branch 56 → 59 taken 7551 times.
✓ Branch 57 → 58 taken 1037 times.
✓ Branch 57 → 59 taken 140 times.
✓ Branch 58 → 59 taken 98 times.
✓ Branch 58 → 60 taken 939 times.
✓ Branch 59 → 52 taken 7789 times.
✓ Branch 59 → 60 taken 939 times.
✓ Branch 61 → 54 taken 7789 times.
✓ Branch 61 → 62 taken 939 times.
17456 while (is_alnum(*str) || *str == '_' || *str == '.') str++;
793 1878 int len=(int)(str-start);
794
2/4
✗ Branch 62 → 61 not taken.
✓ Branch 62 → 63 taken 939 times.
✗ Branch 64 → 63 not taken.
✓ Branch 64 → 65 taken 939 times.
1878 while (*str==' ') str++;
795
4/4
✓ Branch 63 → 64 taken 477 times.
✓ Branch 63 → 88 taken 462 times.
✓ Branch 65 → 66 taken 477 times.
✓ Branch 65 → 96 taken 462 times.
1878 if (*str=='(')
796 {
797 954 str++;
798 // RPG Hacker: This is only here to assure that all strings are still
799 // alive in memory when we call our functions further down
800 double result;
801 while (true)
802 {
803
2/4
✗ Branch 67 → 66 not taken.
✓ Branch 67 → 68 taken 477 times.
✗ Branch 69 → 68 not taken.
✓ Branch 69 → 70 taken 477 times.
954 while (*str==' ') str++;
804
2/4
✓ Branch 68 → 69 taken 477 times.
✗ Branch 68 → 121 not taken.
✓ Branch 71 → 72 taken 477 times.
✗ Branch 71 → 133 not taken.
954 string function_name = string(start, len);
805
4/8
✓ Branch 70 → 71 taken 477 times.
✗ Branch 70 → 119 not taken.
✓ Branch 71 → 72 taken 477 times.
✗ Branch 71 → 77 not taken.
✓ Branch 73 → 74 taken 477 times.
✗ Branch 73 → 131 not taken.
✓ Branch 74 → 75 taken 477 times.
✗ Branch 74 → 80 not taken.
954 if(functions.exists(function_name))
806 {
807 954 current_user_function_name = function_name;
808
6/8
✓ Branch 74 → 75 taken 477 times.
✗ Branch 74 → 119 not taken.
✓ Branch 75 → 76 taken 474 times.
✓ Branch 75 → 119 taken 3 times.
✓ Branch 77 → 78 taken 477 times.
✗ Branch 77 → 131 not taken.
✓ Branch 78 → 79 taken 474 times.
✓ Branch 78 → 131 taken 3 times.
954 result = functions[function_name]();
809 }
810 else
811 {
812 str++;
813 break;
814 }
815
816
2/4
✓ Branch 78 → 79 taken 474 times.
✗ Branch 78 → 80 not taken.
✓ Branch 81 → 82 taken 474 times.
✗ Branch 81 → 83 not taken.
948 if (*str==')')
817 {
818 948 str++;
819 948 return result;
820 }
821 asar_throw_error(2, error_type_block, error_id_malformed_function_call);
822
2/6
✗ Branch 83 → 84 not taken.
✗ Branch 83 → 86 not taken.
✓ Branch 83 → 87 taken 474 times.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 88 not taken.
✓ Branch 86 → 89 taken 474 times.
954 }
823
824 asar_throw_error(2, error_type_block, error_id_function_not_found, start);
825 }
826 else
827 {
828 924 foundlabel=true;
829
830 924 const char *old_start = start;
831
2/4
✓ Branch 88 → 89 taken 462 times.
✗ Branch 88 → 125 not taken.
✓ Branch 96 → 97 taken 462 times.
✗ Branch 96 → 139 not taken.
924 snes_label label_data = labelval(&start);
832 924 int i=(int)label_data.pos;
833 924 foundlabel_static &= label_data.is_static;
834 924 bool scope_passed = false;
835 924 bool subscript_passed = false;
836
4/4
✓ Branch 107 → 90 taken 300 times.
✓ Branch 107 → 108 taken 462 times.
✓ Branch 117 → 98 taken 300 times.
✓ Branch 117 → 118 taken 462 times.
1524 while (str < start)
837 {
838
4/4
✓ Branch 90 → 91 taken 32 times.
✓ Branch 90 → 92 taken 268 times.
✓ Branch 98 → 99 taken 32 times.
✓ Branch 98 → 100 taken 268 times.
600 if (*str == '.') scope_passed = true;
839
4/4
✓ Branch 92 → 93 taken 30 times.
✓ Branch 92 → 106 taken 270 times.
✓ Branch 100 → 101 taken 30 times.
✓ Branch 100 → 116 taken 270 times.
600 if (*(str++) == '[')
840 {
841
2/4
✗ Branch 93 → 94 not taken.
✓ Branch 93 → 96 taken 30 times.
✗ Branch 101 → 102 not taken.
✓ Branch 101 → 104 taken 30 times.
60 if (subscript_passed)
842 {
843 asar_throw_error(2, error_type_block, error_id_multiple_subscript_operators);
844 break;
845 }
846 60 subscript_passed = true;
847
2/4
✗ Branch 96 → 97 not taken.
✓ Branch 96 → 99 taken 30 times.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 107 taken 30 times.
60 if (scope_passed)
848 {
849 asar_throw_error(2, error_type_block, error_id_invalid_subscript);
850 break;
851 }
852
2/4
✓ Branch 99 → 100 taken 30 times.
✗ Branch 99 → 124 not taken.
✓ Branch 108 → 109 taken 30 times.
✗ Branch 108 → 137 not taken.
60 string struct_name = substr(old_start, (int)(str - old_start - 1));
853
4/8
✓ Branch 100 → 101 taken 30 times.
✗ Branch 100 → 122 not taken.
✓ Branch 102 → 103 taken 30 times.
✗ Branch 102 → 122 not taken.
✓ Branch 109 → 110 taken 30 times.
✗ Branch 109 → 135 not taken.
✓ Branch 111 → 112 taken 30 times.
✗ Branch 111 → 135 not taken.
60 i += (int)(eval(0) * object_size(struct_name));
854 60 }
855 }
856
857 924 str=start;
858
2/4
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 110 taken 462 times.
✗ Branch 118 → 119 not taken.
✓ Branch 118 → 120 taken 462 times.
924 if (i==-1) forwardlabel=true;
859 924 return (int)i&0xFFFFFF;
860 }
861 }
862 6 asar_throw_error(2, error_type_block, error_id_invalid_number);
863 return 0.0;
864 }
865
866 2259358 static double sanitize(double val)
867 {
868
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 2259358 times.
2259358 if (val != val) asar_throw_error(2, error_type_block, error_id_nan);
869
3/4
✓ Branch 4 → 5 taken 2259358 times.
✗ Branch 4 → 7 not taken.
✓ Branch 5 → 6 taken 2254468 times.
✓ Branch 5 → 7 taken 4890 times.
2259358 if (math_round && !default_math_round_off) return trunc(val); // originally used int cast, but that broke numbers > $8000_0000
870 4890 return val;
871 }
872
873 1837924 static double getnum()
874 {
875
1/2
✗ Branch 4 → 3 not taken.
✓ Branch 4 → 5 taken 1837924 times.
1837924 while (*str==' ') str++;
876 #define prefix(sym, func) if (*str == sym) { str+=1; double val=getnum(); return sanitize(func); }
877 #define prefix_dep(sym, func) if (*str == sym) { str+=1; asar_throw_warning(2, warning_id_feature_deprecated, "xkas style numbers ", "remove the #"); double val=getnum(); return sanitize(func); }
878 #define prefix2(sym, sym2, func) if (*str == sym && *(str+1) == sym2) { str+=2; double val=getnum(); return sanitize(func); }
879
2/2
✓ Branch 5 → 6 taken 48 times.
✓ Branch 5 → 9 taken 1837876 times.
1837924 prefix('-', -val);
880
2/2
✓ Branch 9 → 10 taken 4 times.
✓ Branch 9 → 13 taken 1837872 times.
1837876 prefix('~', ~(int)val);
881
3/4
✓ Branch 13 → 14 taken 8 times.
✓ Branch 13 → 18 taken 1837864 times.
✓ Branch 14 → 15 taken 8 times.
✗ Branch 14 → 18 not taken.
1837872 prefix2('<', ':', (int)val>>16);
882
1/2
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 22 taken 1837864 times.
1837864 prefix('+', val);
883
3/4
✓ Branch 22 → 23 taken 6 times.
✓ Branch 22 → 28 taken 1837858 times.
✗ Branch 23 → 24 not taken.
✓ Branch 23 → 28 taken 6 times.
1837864 prefix_dep('#' && emulatexkas, val);
884 #undef prefix
885 1837864 return sanitize(getnumcore());
886 }
887
888 75292 int64_t getnum(const char* instr)
889 {
890 75292 return getnum64(instr);
891
892 // randomdude999: perform manual bounds-checking and 2's complement,
893 // to prevent depending on UB
894 double num = math(instr);
895 if(num < 0) {
896 // manual 2's complement
897 if((-num) > (double)UINT32_MAX) {
898 // out of bounds, return closest inbounds value
899 // (this value is the most negative value possible)
900 return ((uint32_t)INT32_MAX)+1;
901 }
902 return ~((uint32_t)(-num))+1;
903 } else {
904 if(num > (double)UINT32_MAX) {
905 // out of bounds, return closest inbounds value
906 return UINT32_MAX;
907 }
908 return (uint32_t)num;
909 }
910 }
911
912 75606 int64_t getnum64(const char* instr)
913 {
914 // randomdude999: perform manual bounds-checking
915 // to prevent depending on UB
916 75606 double num = math(instr);
917
1/2
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 75582 times.
75582 if(num < (double)INT64_MIN) {
918 return INT64_MIN;
919
1/2
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 75582 times.
75582 } else if(num > (double)INT64_MAX) {
920 return INT64_MAX;
921 }
922 75582 return (int64_t)num;
923 }
924
925 // RPG Hacker: Same function as above, but doesn't truncate our number via int conversion
926 633572 double getnumdouble(const char * instr)
927 {
928 633572 return math(instr);
929 }
930
931
932 static double oper_wrapped_throw(asar_error_id errid)
933 {
934 asar_throw_error(2, error_type_block, errid);
935 return 0.0;
936 }
937
938 1627576 static double eval(int depth)
939 {
940 1627576 const char* posneglabel = str;
941
2/4
✓ Branch 2 → 3 taken 813788 times.
✗ Branch 2 → 195 not taken.
✓ Branch 4 → 5 taken 813788 times.
✗ Branch 4 → 203 not taken.
1627576 string posnegname = posneglabelname(&posneglabel, false);
942
943
6/8
✓ Branch 3 → 4 taken 813788 times.
✗ Branch 3 → 193 not taken.
✓ Branch 4 → 5 taken 813736 times.
✓ Branch 4 → 6 taken 52 times.
✓ Branch 5 → 6 taken 813788 times.
✗ Branch 5 → 201 not taken.
✓ Branch 6 → 7 taken 52 times.
✓ Branch 6 → 18 taken 813736 times.
1627576 if (posnegname.length() > 0)
944 {
945
5/7
✓ Branch 6 → 7 taken 24 times.
✓ Branch 6 → 9 taken 28 times.
✓ Branch 7 → 8 taken 48 times.
✗ Branch 7 → 9 not taken.
✓ Branch 7 → 10 taken 28 times.
✓ Branch 8 → 9 taken 24 times.
✗ Branch 8 → 10 not taken.
104 if (*posneglabel != '\0' && *posneglabel != ')') goto notposneglabel;
946
947 56 str = posneglabel;
948
949 56 foundlabel=true;
950
4/4
✓ Branch 9 → 10 taken 24 times.
✓ Branch 9 → 11 taken 4 times.
✓ Branch 10 → 11 taken 24 times.
✓ Branch 10 → 12 taken 4 times.
56 if (*(posneglabel-1) == '+') forwardlabel=true;
951
4/8
✓ Branch 11 → 12 taken 28 times.
✗ Branch 11 → 189 not taken.
✓ Branch 12 → 13 taken 28 times.
✗ Branch 12 → 187 not taken.
✓ Branch 13 → 14 taken 28 times.
✗ Branch 13 → 197 not taken.
✓ Branch 14 → 15 taken 28 times.
✗ Branch 14 → 195 not taken.
56 snes_label label_data = labelval(posnegname);
952 56 foundlabel_static &= label_data.is_static;
953 56 return label_data.pos & 0xFFFFFF;
954 }
955 1627496 notposneglabel:
956
2/4
✓ Branch 16 → 17 taken 813760 times.
✗ Branch 16 → 193 not taken.
✓ Branch 22 → 23 taken 813760 times.
✗ Branch 22 → 201 not taken.
3255040 recurseblock rec;
957
4/4
✓ Branch 17 → 18 taken 813754 times.
✓ Branch 17 → 191 taken 6 times.
✓ Branch 23 → 24 taken 813754 times.
✓ Branch 23 → 199 taken 6 times.
1627520 double left=getnum();
958 double right;
959
2/4
✗ Branch 20 → 19 not taken.
✓ Branch 20 → 21 taken 813754 times.
✗ Branch 26 → 25 not taken.
✓ Branch 26 → 27 taken 813754 times.
1627508 while (*str==' ') str++;
960
16/16
✓ Branch 178 → 179 taken 211336 times.
✓ Branch 178 → 182 taken 813141 times.
✓ Branch 179 → 180 taken 210842 times.
✓ Branch 179 → 182 taken 494 times.
✓ Branch 180 → 181 taken 210762 times.
✓ Branch 180 → 182 taken 80 times.
✓ Branch 181 → 22 taken 210732 times.
✓ Branch 181 → 182 taken 30 times.
✓ Branch 184 → 185 taken 211336 times.
✓ Branch 184 → 188 taken 813141 times.
✓ Branch 185 → 186 taken 210842 times.
✓ Branch 185 → 188 taken 494 times.
✓ Branch 186 → 187 taken 210762 times.
✓ Branch 186 → 188 taken 80 times.
✓ Branch 187 → 28 taken 210732 times.
✓ Branch 187 → 188 taken 30 times.
2048954 while (*str && *str != ')' && *str != ','&& *str != ']')
961 {
962
2/4
✗ Branch 24 → 23 not taken.
✓ Branch 24 → 25 taken 210732 times.
✗ Branch 30 → 29 not taken.
✓ Branch 30 → 31 taken 210732 times.
421464 while (*str==' ') str++;
963 // why was this an int cast
964
6/8
✓ Branch 25 → 26 taken 210732 times.
✗ Branch 25 → 28 not taken.
✓ Branch 26 → 27 taken 210349 times.
✓ Branch 26 → 28 taken 383 times.
✓ Branch 31 → 32 taken 210732 times.
✗ Branch 31 → 34 not taken.
✓ Branch 32 → 33 taken 210349 times.
✓ Branch 32 → 34 taken 383 times.
421464 if (math_round && !default_math_round_off) left=trunc(left);
965 #define oper(name, thisdepth, contents) \
966 if (!strncmp(str, name, strlen(name))) \
967 { \
968 if (math_pri || default_math_pri) \
969 { \
970 if (depth<=thisdepth) \
971 { \
972 str+=strlen(name); \
973 right=eval(thisdepth+1); \
974 } \
975 else return left; \
976 } \
977 else \
978 { \
979 str+=strlen(name); \
980 right=getnum(); \
981 } \
982 left=sanitize(contents); \
983 continue; \
984 }
985
17/26
✓ Branch 28 → 29 taken 6 times.
✓ Branch 28 → 40 taken 210726 times.
✓ Branch 29 → 30 taken 3 times.
✓ Branch 29 → 31 taken 3 times.
✗ Branch 30 → 31 not taken.
✓ Branch 30 → 36 taken 3 times.
✓ Branch 31 → 32 taken 3 times.
✗ Branch 31 → 34 not taken.
✓ Branch 32 → 33 taken 3 times.
✗ Branch 32 → 191 not taken.
✓ Branch 34 → 35 taken 6 times.
✓ Branch 34 → 46 taken 210726 times.
✓ Branch 35 → 36 taken 3 times.
✓ Branch 35 → 37 taken 3 times.
✓ Branch 36 → 37 taken 3 times.
✓ Branch 36 → 42 taken 3 times.
✗ Branch 36 → 191 not taken.
✓ Branch 37 → 38 taken 3 times.
✗ Branch 37 → 40 not taken.
✓ Branch 38 → 39 taken 9 times.
✗ Branch 38 → 191 not taken.
✗ Branch 38 → 199 not taken.
✓ Branch 42 → 43 taken 3 times.
✗ Branch 42 → 199 not taken.
✓ Branch 44 → 45 taken 6 times.
✗ Branch 44 → 199 not taken.
421464 oper("**", 4, pow((double)left, (double)right));
986
18/26
✓ Branch 40 → 41 taken 12 times.
✓ Branch 40 → 52 taken 210714 times.
✓ Branch 41 → 42 taken 8 times.
✓ Branch 41 → 43 taken 4 times.
✓ Branch 42 → 43 taken 4 times.
✓ Branch 42 → 48 taken 4 times.
✓ Branch 43 → 44 taken 8 times.
✗ Branch 43 → 46 not taken.
✓ Branch 44 → 45 taken 8 times.
✗ Branch 44 → 191 not taken.
✓ Branch 46 → 47 taken 12 times.
✓ Branch 46 → 58 taken 210714 times.
✓ Branch 47 → 48 taken 8 times.
✓ Branch 47 → 49 taken 4 times.
✓ Branch 48 → 49 taken 8 times.
✓ Branch 48 → 54 taken 4 times.
✗ Branch 48 → 191 not taken.
✓ Branch 49 → 50 taken 8 times.
✗ Branch 49 → 52 not taken.
✓ Branch 50 → 51 taken 20 times.
✗ Branch 50 → 191 not taken.
✗ Branch 50 → 199 not taken.
✓ Branch 54 → 55 taken 4 times.
✗ Branch 54 → 199 not taken.
✓ Branch 56 → 57 taken 12 times.
✗ Branch 56 → 199 not taken.
421452 oper("*", 3, left*right);
987
18/33
✓ Branch 52 → 53 taken 6 times.
✓ Branch 52 → 68 taken 210708 times.
✓ Branch 53 → 54 taken 3 times.
✓ Branch 53 → 55 taken 3 times.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 60 taken 3 times.
✓ Branch 55 → 56 taken 3 times.
✗ Branch 55 → 58 not taken.
✓ Branch 56 → 57 taken 3 times.
✗ Branch 56 → 191 not taken.
✓ Branch 58 → 59 taken 6 times.
✓ Branch 58 → 74 taken 210708 times.
✓ Branch 59 → 60 taken 3 times.
✓ Branch 59 → 61 taken 3 times.
✓ Branch 60 → 61 taken 3 times.
✓ Branch 60 → 66 taken 3 times.
✗ Branch 60 → 191 not taken.
✓ Branch 61 → 62 taken 3 times.
✗ Branch 61 → 64 not taken.
✓ Branch 62 → 63 taken 9 times.
✗ Branch 62 → 64 not taken.
✗ Branch 62 → 199 not taken.
✗ Branch 64 → 65 not taken.
✗ Branch 64 → 191 not taken.
✓ Branch 66 → 67 taken 9 times.
✗ Branch 66 → 191 not taken.
✗ Branch 66 → 199 not taken.
✓ Branch 68 → 69 taken 6 times.
✗ Branch 68 → 70 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 199 not taken.
✓ Branch 72 → 73 taken 6 times.
✗ Branch 72 → 199 not taken.
421428 oper("/", 3, right != 0.0 ? left / right : oper_wrapped_throw(error_id_division_by_zero));
988
2/33
✗ Branch 68 → 69 not taken.
✓ Branch 68 → 84 taken 210708 times.
✗ Branch 69 → 70 not taken.
✗ Branch 69 → 71 not taken.
✗ Branch 70 → 71 not taken.
✗ Branch 70 → 76 not taken.
✗ Branch 71 → 72 not taken.
✗ Branch 71 → 74 not taken.
✗ Branch 72 → 73 not taken.
✗ Branch 72 → 191 not taken.
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 90 taken 210708 times.
✗ Branch 75 → 76 not taken.
✗ Branch 75 → 77 not taken.
✗ Branch 76 → 77 not taken.
✗ Branch 76 → 82 not taken.
✗ Branch 76 → 191 not taken.
✗ Branch 77 → 78 not taken.
✗ Branch 77 → 80 not taken.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 80 not taken.
✗ Branch 78 → 199 not taken.
✗ Branch 80 → 81 not taken.
✗ Branch 80 → 191 not taken.
✗ Branch 82 → 83 not taken.
✗ Branch 82 → 191 not taken.
✗ Branch 82 → 199 not taken.
✗ Branch 84 → 85 not taken.
✗ Branch 84 → 86 not taken.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 199 not taken.
✗ Branch 88 → 89 not taken.
✗ Branch 88 → 199 not taken.
421416 oper("%", 3, right != 0.0 ? fmod((double)left, (double)right) : oper_wrapped_throw(error_id_modulo_by_zero));
989
20/26
✓ Branch 84 → 85 taken 210616 times.
✓ Branch 84 → 96 taken 92 times.
✓ Branch 85 → 86 taken 105472 times.
✓ Branch 85 → 87 taken 105144 times.
✓ Branch 86 → 87 taken 334 times.
✓ Branch 86 → 92 taken 105138 times.
✓ Branch 87 → 88 taken 105472 times.
✓ Branch 87 → 90 taken 6 times.
✓ Branch 88 → 89 taken 105472 times.
✗ Branch 88 → 191 not taken.
✓ Branch 90 → 91 taken 210616 times.
✓ Branch 90 → 102 taken 92 times.
✓ Branch 91 → 92 taken 105472 times.
✓ Branch 91 → 93 taken 105144 times.
✓ Branch 92 → 93 taken 105472 times.
✓ Branch 92 → 98 taken 105138 times.
✗ Branch 92 → 191 not taken.
✓ Branch 93 → 94 taken 105472 times.
✓ Branch 93 → 96 taken 6 times.
✓ Branch 94 → 95 taken 316082 times.
✗ Branch 94 → 191 not taken.
✗ Branch 94 → 199 not taken.
✓ Branch 98 → 99 taken 105138 times.
✗ Branch 98 → 199 not taken.
✓ Branch 100 → 101 taken 210610 times.
✗ Branch 100 → 199 not taken.
421416 oper("+", 2, left+right);
990
18/26
✓ Branch 96 → 97 taken 89 times.
✓ Branch 96 → 108 taken 3 times.
✓ Branch 97 → 98 taken 67 times.
✓ Branch 97 → 99 taken 22 times.
✓ Branch 98 → 99 taken 45 times.
✓ Branch 98 → 104 taken 22 times.
✓ Branch 99 → 100 taken 67 times.
✗ Branch 99 → 102 not taken.
✓ Branch 100 → 101 taken 67 times.
✗ Branch 100 → 191 not taken.
✓ Branch 102 → 103 taken 89 times.
✓ Branch 102 → 114 taken 3 times.
✓ Branch 103 → 104 taken 67 times.
✓ Branch 103 → 105 taken 22 times.
✓ Branch 104 → 105 taken 67 times.
✓ Branch 104 → 110 taken 22 times.
✗ Branch 104 → 191 not taken.
✓ Branch 105 → 106 taken 67 times.
✗ Branch 105 → 108 not taken.
✓ Branch 106 → 107 taken 156 times.
✗ Branch 106 → 191 not taken.
✗ Branch 106 → 199 not taken.
✓ Branch 110 → 111 taken 22 times.
✗ Branch 110 → 199 not taken.
✓ Branch 112 → 113 taken 89 times.
✗ Branch 112 → 199 not taken.
184 oper("-", 2, left-right);
991
2/33
✗ Branch 108 → 109 not taken.
✓ Branch 108 → 124 taken 3 times.
✗ Branch 109 → 110 not taken.
✗ Branch 109 → 111 not taken.
✗ Branch 110 → 111 not taken.
✗ Branch 110 → 116 not taken.
✗ Branch 111 → 112 not taken.
✗ Branch 111 → 114 not taken.
✗ Branch 112 → 113 not taken.
✗ Branch 112 → 191 not taken.
✗ Branch 114 → 115 not taken.
✓ Branch 114 → 130 taken 3 times.
✗ Branch 115 → 116 not taken.
✗ Branch 115 → 117 not taken.
✗ Branch 116 → 117 not taken.
✗ Branch 116 → 122 not taken.
✗ Branch 116 → 191 not taken.
✗ Branch 117 → 118 not taken.
✗ Branch 117 → 120 not taken.
✗ Branch 118 → 119 not taken.
✗ Branch 118 → 120 not taken.
✗ Branch 118 → 199 not taken.
✗ Branch 120 → 121 not taken.
✗ Branch 120 → 191 not taken.
✗ Branch 122 → 123 not taken.
✗ Branch 122 → 191 not taken.
✗ Branch 122 → 199 not taken.
✗ Branch 124 → 125 not taken.
✗ Branch 124 → 126 not taken.
✗ Branch 126 → 127 not taken.
✗ Branch 126 → 199 not taken.
✗ Branch 128 → 129 not taken.
✗ Branch 128 → 199 not taken.
6 oper("<<", 1, right >= 0.0 ? (int64_t)left<<(uint64_t)right : oper_wrapped_throw(error_id_negative_shift));
992
2/33
✗ Branch 124 → 125 not taken.
✓ Branch 124 → 140 taken 3 times.
✗ Branch 125 → 126 not taken.
✗ Branch 125 → 127 not taken.
✗ Branch 126 → 127 not taken.
✗ Branch 126 → 132 not taken.
✗ Branch 127 → 128 not taken.
✗ Branch 127 → 130 not taken.
✗ Branch 128 → 129 not taken.
✗ Branch 128 → 191 not taken.
✗ Branch 130 → 131 not taken.
✓ Branch 130 → 146 taken 3 times.
✗ Branch 131 → 132 not taken.
✗ Branch 131 → 133 not taken.
✗ Branch 132 → 133 not taken.
✗ Branch 132 → 138 not taken.
✗ Branch 132 → 191 not taken.
✗ Branch 133 → 134 not taken.
✗ Branch 133 → 136 not taken.
✗ Branch 134 → 135 not taken.
✗ Branch 134 → 136 not taken.
✗ Branch 134 → 199 not taken.
✗ Branch 136 → 137 not taken.
✗ Branch 136 → 191 not taken.
✗ Branch 138 → 139 not taken.
✗ Branch 138 → 191 not taken.
✗ Branch 138 → 199 not taken.
✗ Branch 140 → 141 not taken.
✗ Branch 140 → 142 not taken.
✗ Branch 142 → 143 not taken.
✗ Branch 142 → 199 not taken.
✗ Branch 144 → 145 not taken.
✗ Branch 144 → 199 not taken.
6 oper(">>", 1, right >= 0.0 ? (int64_t)left>>(uint64_t)right : oper_wrapped_throw(error_id_negative_shift));
993
2/26
✗ Branch 140 → 141 not taken.
✓ Branch 140 → 152 taken 3 times.
✗ Branch 141 → 142 not taken.
✗ Branch 141 → 143 not taken.
✗ Branch 142 → 143 not taken.
✗ Branch 142 → 148 not taken.
✗ Branch 143 → 144 not taken.
✗ Branch 143 → 146 not taken.
✗ Branch 144 → 145 not taken.
✗ Branch 144 → 191 not taken.
✗ Branch 146 → 147 not taken.
✓ Branch 146 → 158 taken 3 times.
✗ Branch 147 → 148 not taken.
✗ Branch 147 → 149 not taken.
✗ Branch 148 → 149 not taken.
✗ Branch 148 → 154 not taken.
✗ Branch 148 → 191 not taken.
✗ Branch 149 → 150 not taken.
✗ Branch 149 → 152 not taken.
✗ Branch 150 → 151 not taken.
✗ Branch 150 → 191 not taken.
✗ Branch 150 → 199 not taken.
✗ Branch 154 → 155 not taken.
✗ Branch 154 → 199 not taken.
✗ Branch 156 → 157 not taken.
✗ Branch 156 → 199 not taken.
6 oper("&", 0, (int64_t)left&(int64_t)right);
994
2/26
✗ Branch 152 → 153 not taken.
✓ Branch 152 → 164 taken 3 times.
✗ Branch 153 → 154 not taken.
✗ Branch 153 → 155 not taken.
✗ Branch 154 → 155 not taken.
✗ Branch 154 → 160 not taken.
✗ Branch 155 → 156 not taken.
✗ Branch 155 → 158 not taken.
✗ Branch 156 → 157 not taken.
✗ Branch 156 → 191 not taken.
✗ Branch 158 → 159 not taken.
✓ Branch 158 → 170 taken 3 times.
✗ Branch 159 → 160 not taken.
✗ Branch 159 → 161 not taken.
✗ Branch 160 → 161 not taken.
✗ Branch 160 → 166 not taken.
✗ Branch 160 → 191 not taken.
✗ Branch 161 → 162 not taken.
✗ Branch 161 → 164 not taken.
✗ Branch 162 → 163 not taken.
✗ Branch 162 → 191 not taken.
✗ Branch 162 → 199 not taken.
✗ Branch 166 → 167 not taken.
✗ Branch 166 → 199 not taken.
✗ Branch 168 → 169 not taken.
✗ Branch 168 → 199 not taken.
6 oper("|", 0, (int64_t)left|(int64_t)right);
995
2/26
✗ Branch 164 → 165 not taken.
✓ Branch 164 → 176 taken 3 times.
✗ Branch 165 → 166 not taken.
✗ Branch 165 → 167 not taken.
✗ Branch 166 → 167 not taken.
✗ Branch 166 → 172 not taken.
✗ Branch 167 → 168 not taken.
✗ Branch 167 → 170 not taken.
✗ Branch 168 → 169 not taken.
✗ Branch 168 → 191 not taken.
✗ Branch 170 → 171 not taken.
✓ Branch 170 → 182 taken 3 times.
✗ Branch 171 → 172 not taken.
✗ Branch 171 → 173 not taken.
✗ Branch 172 → 173 not taken.
✗ Branch 172 → 178 not taken.
✗ Branch 172 → 191 not taken.
✗ Branch 173 → 174 not taken.
✗ Branch 173 → 176 not taken.
✗ Branch 174 → 175 not taken.
✗ Branch 174 → 191 not taken.
✗ Branch 174 → 199 not taken.
✗ Branch 178 → 179 not taken.
✗ Branch 178 → 199 not taken.
✗ Branch 180 → 181 not taken.
✗ Branch 180 → 199 not taken.
6 oper("^", 0, (int64_t)left^(int64_t)right);
996
2/4
✗ Branch 176 → 177 not taken.
✓ Branch 176 → 191 taken 3 times.
✗ Branch 182 → 183 not taken.
✓ Branch 182 → 199 taken 3 times.
6 asar_throw_error(2, error_type_block, error_id_unknown_operator);
997 #undef oper
998 }
999 1627490 return left;
1000 1627576 }
1001
1002 //static autoptr<char*> freeme;
1003 709178 double math(const char * s)
1004 {
1005 //free(freeme);
1006 //freeme=NULL;
1007 709178 foundlabel=false;
1008 709178 foundlabel_static=true;
1009 709178 forwardlabel=false;
1010 double rval;
1011
1012
3/4
✓ Branch 2 → 3 taken 709178 times.
✗ Branch 2 → 4 not taken.
✓ Branch 3 → 4 taken 3086 times.
✓ Branch 3 → 6 taken 706092 times.
709178 if(math_pri || default_math_pri)
1013 {
1014 3086 str = s;
1015 3086 rval = eval(0);
1016 }
1017 else
1018 {
1019 706092 str = s;
1020 706092 rval = eval(0);
1021
1022 706074 double pri_rval = NAN;
1023
1024 706074 suppress_all_warnings = true;
1025 706074 math_pri = true;
1026 try
1027 {
1028 706074 str = s;
1029
1/2
✓ Branch 7 → 8 taken 706074 times.
✗ Branch 7 → 17 not taken.
706074 pri_rval = eval(0);
1030 }
1031 catch (errfatal&) {}
1032 706074 suppress_all_warnings = false;
1033 706074 math_pri = false;
1034
1035
1/2
✗ Branch 9 → 10 not taken.
✓ Branch 9 → 11 taken 706074 times.
706074 if (pri_rval != rval)
1036 {
1037 asar_throw_warning(2, warning_id_feature_deprecated, "xkas style left to right math ", "apply order of operations");
1038 }
1039 }
1040
2/2
✓ Branch 11 → 12 taken 6 times.
✓ Branch 11 → 15 taken 709154 times.
709160 if (*str)
1041 {
1042
1/2
✗ Branch 12 → 13 not taken.
✓ Branch 12 → 14 taken 6 times.
6 if (*str == ',') asar_throw_error(2, error_type_block, error_id_invalid_input);
1043 6 else asar_throw_error(2, error_type_block, error_id_mismatched_parentheses);
1044 }
1045 709154 return rval;
1046 }
1047
1048 592 void initmathcore()
1049 {
1050 592 functions.reset();
1051 592 builtin_functions.each([](const char* key, double (*val)()) {
1052 37888 functions[key] = val;
1053
5/11
✓ Branch 3 → 4 taken 18944 times.
✗ Branch 3 → 14 not taken.
✓ Branch 4 → 5 taken 18944 times.
✗ Branch 4 → 12 not taken.
✓ Branch 5 → 6 taken 18944 times.
✗ Branch 5 → 18 not taken.
✓ Branch 6 → 7 taken 37888 times.
✗ Branch 6 → 10 not taken.
✗ Branch 6 → 16 not taken.
✓ Branch 8 → 9 taken 18944 times.
✗ Branch 8 → 14 not taken.
37888 functions[STR "_" + key] = val;
1054 37888 });
1055 592 user_functions.reset();
1056 592 }
1057
1058 588 void deinitmathcore()
1059 {
1060 //not needed
1061 588 }
1062