asar coverage - build #226


src/asar/
File: src/asar/macro.cpp
Date: 2024-03-13 12:09:43
Lines:
170/188
90.4%
Functions:
5/5
100.0%
Branches:
203/364
55.8%

Line Branch Exec Source
1 #include "libstr.h"
2 #include "asar.h"
3 #include "autoarray.h"
4 #include "assocarr.h"
5 #include "errors.h"
6 #include "assembleblock.h"
7 #include "macro.h"
8 #include "asar_math.h"
9 #include "warnings.h"
10
11 assocarr<macrodata*> macros;
12 static string thisname;
13 static macrodata * thisone;
14 static int numlines;
15
16 int calledmacros;
17 int reallycalledmacros;
18 int macrorecursion;
19 bool inmacro;
20 int numvarargs;
21
22 macrodata* current_macro;
23 const char* const* current_macro_args;
24 int current_macro_numargs;
25
26 52 void startmacro(const char * line_)
27 {
28 52 thisone= nullptr;
29
3/6
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 26 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
52 if (!confirmqpar(line_)) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
30
1/2
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
26 string line=line_;
31
5/10
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 52 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 52 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 52 times.
✗ Branch 9 not taken.
52 clean_and_trim(line);
32 52 char * startpar=strqchr(line.data(), '(');
33
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
52 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
34 52 *startpar=0;
35
1/2
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
52 startpar++;
36
2/6
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 52 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
52 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_macro_name);
37
1/2
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
26 thisname=line;
38 52 char * endpar=strqrchr(startpar, ')');
39 //confirmqpar requires that all parentheses are matched, and a starting one exists, therefore it is harmless to not check for nullptrs
40
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 52 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
52 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
41 52 *endpar=0;
42
2/2
✓ Branch 0 taken 220 times.
✓ Branch 1 taken 52 times.
272 for (int i=0;startpar[i];i++)
43 {
44 110 char c=startpar[i];
45
8/12
✓ Branch 0 taken 96 times.
✓ Branch 1 taken 124 times.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 36 times.
✓ Branch 5 taken 44 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 36 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 110 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
220 if (!is_alnum(c) && c!='_' && c!=','&& c!='.') asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
46
4/8
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 204 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 110 times.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
220 if (c==',' && is_digit(startpar[i+1])) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
47 }
48
5/12
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 52 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 52 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 52 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 26 times.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
52 if (*startpar==',' || is_digit(*startpar) || strstr(startpar, ",,") || endpar[-1]==',') asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
49
3/6
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 26 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
52 if (macros.exists(thisname)) asar_throw_error(0, error_type_block, error_id_macro_redefined, thisname.data());
50 52 thisone=(macrodata*)malloc(sizeof(macrodata));
51
1/4
✓ Branch 0 taken 26 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
26 new(thisone) macrodata;
52
2/2
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 20 times.
52 if (*startpar)
53 {
54
1/2
✓ Branch 0 taken 32 times.
✗ Branch 1 not taken.
32 thisone->arguments=(const char* const*)qpsplit(duplicate_string(startpar), ",", &thisone->numargs);
55 }
56 else
57 {
58 20 const char ** noargs=(const char**)malloc(sizeof(const char**));
59 20 *noargs=nullptr;
60 20 thisone->arguments=noargs;
61 20 thisone->numargs=0;
62 }
63 52 thisone->variadic = false;
64 52 thisone->fname= duplicate_string(thisfilename);
65 52 thisone->startline=thisline;
66
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 50 times.
96 for (int i=0;thisone->arguments[i];i++)
67 {
68
4/4
✓ Branch 0 taken 24 times.
✓ Branch 1 taken 22 times.
✓ Branch 2 taken 22 times.
✓ Branch 3 taken 2 times.
46 if(!strcmp(thisone->arguments[i], "...") && !thisone->arguments[i+1]) thisone->variadic = true;
69
3/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
24 else if(!strcmp(thisone->arguments[i], "...")) asar_throw_error(0, error_type_block, error_id_vararg_must_be_last);
70
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 22 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
22 else if(strchr(thisone->arguments[i], '.')) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
71
2/6
✓ Branch 0 taken 22 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 22 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
22 else if (!confirmname(thisone->arguments[i])) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
72
2/2
✓ Branch 0 taken 14 times.
✓ Branch 1 taken 44 times.
58 for (int j=i+1;thisone->arguments[j];j++)
73 {
74
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
14 if (!strcmp(thisone->arguments[i], thisone->arguments[j])) asar_throw_error(0, error_type_block, error_id_macro_param_redefined, thisone->arguments[i]);
75 }
76 }
77 50 numlines=0;
78 77 }
79
80 128 void tomacro(const char * line)
81 {
82
2/2
✓ Branch 0 taken 64 times.
✓ Branch 1 taken 64 times.
128 if (!thisone) return;
83 128 thisone->lines[numlines++]=line;
84 }
85
86 52 void endmacro(bool insert)
87 {
88
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 26 times.
52 if (!thisone) return;
89 52 thisone->numlines=numlines;
90
1/2
✓ Branch 0 taken 52 times.
✗ Branch 1 not taken.
52 if (insert) macros.create(thisname) = thisone;
91 else delete thisone;
92 }
93
94
95 216 void callmacro(const char * data)
96 {
97 216 int prev_numvarargs = numvarargs;
98 macrodata * thismacro;
99
3/6
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 108 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 if (!confirmqpar(data)) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
100
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
108 string line=data;
101
5/10
✓ Branch 0 taken 216 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 216 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 216 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 216 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 216 times.
✗ Branch 9 not taken.
216 clean_and_trim(line);
102 216 char * startpar=strqchr(line.data(), '(');
103
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
216 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
104 216 *startpar=0;
105
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
216 startpar++;
106
2/6
✓ Branch 0 taken 216 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
107
3/6
✓ Branch 0 taken 108 times.
✓ Branch 1 taken 108 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 108 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 if (!macros.exists(line)) asar_throw_error(0, error_type_block, error_id_macro_not_found, line.data());
108
1/2
✓ Branch 0 taken 108 times.
✗ Branch 1 not taken.
216 thismacro = macros.find(line);
109 216 char * endpar=strqrchr(startpar, ')');
110
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 216 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
216 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
111
2/2
✓ Branch 0 taken 69 times.
✓ Branch 1 taken 39 times.
216 *endpar=0;
112 108 autoptr<const char * const*> args;
113 216 int numargs=0;
114
3/4
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 78 times.
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
216 if (*startpar) args=(const char* const*)qpsplit(startpar, ",", &numargs);
115
3/6
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 156 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 60 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
216 if (numargs != thismacro->numargs && !thismacro->variadic) asar_throw_error(1, error_type_block, error_id_macro_wrong_num_params);
116 // RPG Hacker: -1, because the ... is also counted as an argument, yet we want it to be entirely optional.
117
4/6
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 204 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
216 if (numargs < thismacro->numargs - 1 && thismacro->variadic) asar_throw_error(1, error_type_block, error_id_macro_wrong_min_params);
118
119 204 macrorecursion++;
120 204 inmacro=true;
121 204 int old_calledmacros = calledmacros;
122 204 calledmacros = reallycalledmacros++;
123 204 int startif=numif;
124
125 // RPG Hacker: -1 to take the ... into account, which is also being counted.
126
2/2
✓ Branch 0 taken 78 times.
✓ Branch 1 taken 126 times.
204 if(thismacro->variadic) numvarargs = numargs-(thismacro->numargs-1);
127 126 else numvarargs = -1;
128
129 204 autoarray<int>* oldmacroposlabels = macroposlabels;
130 204 autoarray<int>* oldmacroneglabels = macroneglabels;
131 204 autoarray<string>* oldmacrosublabels = macrosublabels;
132
133 102 autoarray<int> newmacroposlabels;
134 102 autoarray<int> newmacroneglabels;
135 102 autoarray<string> newmacrosublabels;
136
137 204 macroposlabels = &newmacroposlabels;
138 204 macroneglabels = &newmacroneglabels;
139 204 macrosublabels = &newmacrosublabels;
140
141 204 macrodata* old_macro = current_macro;
142 204 const char* const* old_macro_args = current_macro_args;
143 204 int old_numargs = current_macro_numargs;
144 204 current_macro = thismacro;
145 204 current_macro_args = args;
146 204 current_macro_numargs = numargs;
147
148
2/2
✓ Branch 0 taken 1032 times.
✓ Branch 1 taken 204 times.
1236 for (int i=0;i<thismacro->numlines;i++)
149 {
150 try
151 {
152
1/2
✓ Branch 0 taken 516 times.
✗ Branch 1 not taken.
1032 thisfilename= thismacro->fname;
153 1032 thisline= thismacro->startline+i+1;
154 1032 thisblock= nullptr;
155 516 string connectedline;
156
1/2
✓ Branch 0 taken 516 times.
✗ Branch 1 not taken.
1032 int skiplines = getconnectedlines<autoarray<string> >(thismacro->lines, i, connectedline);
157 //string out = replace_macro_args(connectedline); // done in assembleline
158
1/2
✓ Branch 0 taken 516 times.
✗ Branch 1 not taken.
1032 int prevnumif = numif;
159
1/2
✓ Branch 0 taken 1032 times.
✗ Branch 1 not taken.
1032 assembleline(thismacro->fname, thismacro->startline+i, connectedline);
160 1032 i += skiplines;
161
15/18
✓ Branch 0 taken 696 times.
✓ Branch 1 taken 336 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 696 times.
✓ Branch 4 taken 222 times.
✓ Branch 5 taken 114 times.
✓ Branch 6 taken 108 times.
✓ Branch 7 taken 114 times.
✓ Branch 8 taken 102 times.
✓ Branch 9 taken 66 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 54 times.
✓ Branch 12 taken 114 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 66 times.
✓ Branch 15 taken 48 times.
✓ Branch 16 taken 66 times.
✓ Branch 17 taken 450 times.
1200 if ((numif != prevnumif || single_line_for_tracker == 3) && (whilestatus[numif].iswhile || whilestatus[numif].is_for) && whilestatus[numif].cond)
162
1/2
✓ Branch 0 taken 66 times.
✗ Branch 1 not taken.
132 i = whilestatus[numif].startline - thismacro->startline - 1;
163 1032 }
164 catch(errline&){}
165 }
166
167 204 current_macro = old_macro;
168 204 current_macro_args = old_macro_args;
169 204 current_macro_numargs = old_numargs;
170
171 204 macroposlabels = oldmacroposlabels;
172 204 macroneglabels = oldmacroneglabels;
173 204 macrosublabels = oldmacrosublabels;
174
175 204 macrorecursion--;
176 204 inmacro = macrorecursion;
177 204 numvarargs = prev_numvarargs;
178 204 calledmacros = old_calledmacros;
179
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 204 times.
204 if (repeatnext!=1)
180 {
181 thisblock= nullptr;
182 repeatnext=1;
183 asar_throw_error(0, error_type_block, error_id_rep_at_macro_end);
184 }
185
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 204 times.
204 if (numif!=startif)
186 {
187 thisblock= nullptr;
188 numif=startif;
189 numtrue=startif;
190 asar_throw_error(0, error_type_block, error_id_unclosed_if);
191 }
192 330 }
193
194 948 string replace_macro_args(const char* line) {
195 474 string out;
196
2/2
✓ Branch 0 taken 11508 times.
✓ Branch 1 taken 906 times.
12414 for (const char * in=line;*in;)
197 {
198
3/6
✓ Branch 0 taken 348 times.
✓ Branch 1 taken 11160 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 348 times.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
11508 if (*in=='<' && in[1]=='<' && in[2] != ':')
199 {
200 out+="<<";
201 in+=2;
202 }
203
2/2
✓ Branch 0 taken 348 times.
✓ Branch 1 taken 11160 times.
11508 else if (*in=='<')
204 {
205 348 const char * end=in+1;
206 // RPG Hacker: Added checking for space here, because this code would consider
207 // if a < b && a > c
208 // a macro arg expansion. In practice, this is still a sloppy solution and is
209 // likely to fail in some edge case I can't think of right now. Should parse
210 // this in a much more robust way at some point...
211
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 264 times.
348 if (*end==' ')
212 {
213
1/2
✓ Branch 0 taken 42 times.
✗ Branch 1 not taken.
84 out += *(in++);
214 84 continue;
215 }
216
217
5/8
✓ Branch 0 taken 2058 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1794 times.
✓ Branch 3 taken 264 times.
✓ Branch 4 taken 1794 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1794 times.
✗ Branch 7 not taken.
2058 while (*end && *end!='>'&& *end!='<' && *(end+1)!=':') end++; //allow for conditionals and <:
218
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 264 times.
264 if (*end!='>')
219 {
220 out+=*(in++);
221 continue;
222 }
223
224 132 bool proper_variadic = false;
225
5/8
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 126 times.
✓ Branch 2 taken 138 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 138 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 138 times.
✗ Branch 7 not taken.
264 if (in[1] == '.' && in[2] == '.' && in[3] == '.' && in[4] == '[')
226 {
227
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 132 times.
138 if (end[-1] != ']')
228
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
6 asar_throw_error(0, error_type_block, error_id_unclosed_vararg);
229
230 66 proper_variadic = true;
231 132 in += 4;
232 132 end--;
233 }
234
235
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 258 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
258 if(!inmacro) asar_throw_error(0, error_type_block, error_id_macro_param_outside_macro);
236 //*end=0;
237 258 in++;
238 129 string param;
239
1/2
✓ Branch 0 taken 129 times.
✗ Branch 1 not taken.
258 string temp(in, end-in);
240
1/2
✓ Branch 0 taken 258 times.
✗ Branch 1 not taken.
258 resolvedefines(param, temp);
241 129 in = param.data();
242
1/2
✓ Branch 0 taken 258 times.
✗ Branch 1 not taken.
258 bool valid_named_param = confirmname(in);
243
5/6
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 132 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
258 if (!valid_named_param && !current_macro->variadic) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
244 126 bool found=false;
245
4/4
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 18 times.
✓ Branch 2 taken 156 times.
✓ Branch 3 taken 132 times.
306 for (int j=0;current_macro->arguments[j]&&!proper_variadic;j++)
246 {
247
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 54 times.
156 if (!strcmp(in, current_macro->arguments[j]))
248 {
249 51 found=true;
250
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 30 times.
102 if (current_macro_args[j][0]=='"')
251 {
252
1/2
✓ Branch 0 taken 36 times.
✗ Branch 1 not taken.
36 string s=current_macro_args[j];
253
2/4
✓ Branch 0 taken 72 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
72 out+=safedequote(s.temp_raw());
254 72 }
255
1/2
✓ Branch 0 taken 15 times.
✗ Branch 1 not taken.
30 else out+=current_macro_args[j];
256 51 break;
257 }
258 }
259
2/2
✓ Branch 0 taken 75 times.
✓ Branch 1 taken 51 times.
126 if (!found)
260 {
261 75 snes_label ret;
262
4/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 132 times.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 12 times.
150 if(valid_named_param && !current_macro->variadic)
263 {
264
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
6 if (proper_variadic) asar_throw_error(0, error_type_block, error_id_invalid_vararg, in);
265 else asar_throw_error(0, error_type_block, error_id_macro_param_not_found, in);
266 }
267
14/20
✓ Branch 0 taken 144 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12 times.
✓ Branch 3 taken 132 times.
✓ Branch 4 taken 12 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 6 times.
✓ Branch 9 taken 72 times.
✓ Branch 10 taken 6 times.
✓ Branch 11 taken 66 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 66 times.
✓ Branch 14 taken 3 times.
✓ Branch 15 taken 69 times.
✗ Branch 16 not taken.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
153 if(current_macro->variadic && valid_named_param && !labelval(in, &ret, false))
268 {
269
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
6 if (proper_variadic) asar_throw_error(0, error_type_block, error_id_invalid_vararg, in);
270 else asar_throw_error(0, error_type_block, error_id_macro_param_not_found, in);
271 }
272
3/4
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 120 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
138 if(!proper_variadic) asar_throw_warning(0, warning_id_feature_deprecated, "'<math>' syntax for variadic macro parameters", "Use '<...[math]>' instead.");
273
1/2
✓ Branch 0 taken 138 times.
✗ Branch 1 not taken.
138 int arg_num = getnum(in);
274
275
1/4
✗ Branch 0 not taken.
✓ Branch 1 taken 138 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
138 if(forwardlabel) asar_throw_error(0, error_type_block, error_id_label_forward);
276
277
1/2
✓ Branch 0 taken 138 times.
✗ Branch 1 not taken.
138 if(numif<=numtrue){
278
3/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 132 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
138 if (arg_num < 0) asar_throw_error(1, error_type_block, error_id_vararg_out_of_bounds);
279
3/4
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 120 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 12 times.
132 if (arg_num > current_macro_numargs-current_macro->numargs) asar_throw_error(1, error_type_block, error_id_vararg_out_of_bounds);
280
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 120 times.
120 if (current_macro_args[arg_num+current_macro->numargs-1][0]=='"')
281 {
282 string s=current_macro_args[arg_num+current_macro->numargs-1];
283 out+=safedequote(s.temp_raw());
284 }
285
1/2
✓ Branch 0 taken 60 times.
✗ Branch 1 not taken.
120 else out+=current_macro_args[arg_num+current_macro->numargs-1];
286 }
287 }
288 222 in=end+1;
289
2/2
✓ Branch 0 taken 102 times.
✓ Branch 1 taken 120 times.
222 if (proper_variadic) in++;
290 294 }
291
1/2
✓ Branch 0 taken 5580 times.
✗ Branch 1 not taken.
11160 else out+=*(in++);
292 }
293 906 return out;
294 42 }
295