asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
170 of 188, 0 excluded
90.4%
Functions:
5 of 5, 0 excluded
100.0%
Branches:
331 of 620, 0 excluded
53.4%

macro.cpp
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
2/8
✓ Branch 2 → 3 taken 52 times.
✗ Branch 2 → 92 not taken.
✗ Branch 2 → 94 not taken.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 52 times.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 92 not taken.
✗ Branch 4 → 94 not taken.
52 if (!confirmqpar(line_)) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
30
2/4
✓ Branch 5 → 6 taken 26 times.
✗ Branch 5 → 92 not taken.
✓ Branch 6 → 7 taken 26 times.
✗ Branch 6 → 94 not taken.
52 string line=line_;
31
6/16
✓ Branch 6 → 7 taken 26 times.
✗ Branch 6 → 90 not taken.
✓ Branch 7 → 8 taken 52 times.
✗ Branch 7 → 90 not taken.
✗ Branch 7 → 92 not taken.
✓ Branch 8 → 9 taken 52 times.
✗ Branch 8 → 90 not taken.
✗ Branch 8 → 92 not taken.
✓ Branch 9 → 10 taken 52 times.
✗ Branch 9 → 90 not taken.
✗ Branch 9 → 92 not taken.
✓ Branch 10 → 11 taken 52 times.
✗ Branch 10 → 90 not taken.
✗ Branch 10 → 92 not taken.
✓ Branch 11 → 12 taken 26 times.
✗ Branch 11 → 92 not taken.
52 clean_and_trim(line);
32 52 char * startpar=strqchr(line.data(), '(');
33
2/7
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 26 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 26 times.
✗ Branch 14 → 90 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 92 not taken.
52 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
34 52 *startpar=0;
35 52 startpar++;
36
4/10
✓ Branch 16 → 17 taken 26 times.
✗ Branch 16 → 90 not taken.
✓ Branch 17 → 18 taken 26 times.
✓ Branch 17 → 19 taken 26 times.
✗ Branch 17 → 92 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 26 times.
✗ Branch 18 → 90 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 92 not taken.
52 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_invalid_macro_name);
37
2/4
✓ Branch 19 → 20 taken 26 times.
✗ Branch 19 → 90 not taken.
✓ Branch 20 → 21 taken 26 times.
✗ Branch 20 → 92 not taken.
52 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
2/7
✗ Branch 21 → 22 not taken.
✓ Branch 21 → 23 taken 26 times.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 24 taken 26 times.
✗ Branch 22 → 90 not taken.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 92 not taken.
52 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
41 52 *endpar=0;
42
4/4
✓ Branch 41 → 24 taken 110 times.
✓ Branch 41 → 42 taken 26 times.
✓ Branch 42 → 25 taken 110 times.
✓ Branch 42 → 43 taken 26 times.
272 for (int i=0;startpar[i];i++)
43 {
44 220 char c=startpar[i];
45
14/20
✓ Branch 25 → 26 taken 48 times.
✓ Branch 25 → 30 taken 62 times.
✓ Branch 26 → 27 taken 92 times.
✓ Branch 26 → 30 taken 4 times.
✓ Branch 26 → 31 taken 62 times.
✓ Branch 27 → 28 taken 80 times.
✓ Branch 27 → 30 taken 8 times.
✓ Branch 27 → 31 taken 4 times.
✓ Branch 28 → 29 taken 36 times.
✓ Branch 28 → 30 taken 36 times.
✓ Branch 28 → 31 taken 8 times.
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 36 times.
✗ Branch 31 → 32 not taken.
✓ Branch 31 → 33 taken 110 times.
✗ Branch 32 → 33 not taken.
✓ Branch 32 → 34 taken 110 times.
✗ Branch 32 → 90 not taken.
✗ Branch 33 → 34 not taken.
✗ Branch 33 → 92 not taken.
220 if (!is_alnum(c) && c!='_' && c!=','&& c!='.') asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
46
8/15
✓ Branch 33 → 34 taken 8 times.
✓ Branch 33 → 37 taken 102 times.
✓ Branch 34 → 35 taken 8 times.
✓ Branch 34 → 38 taken 102 times.
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 8 times.
✗ Branch 36 → 37 not taken.
✓ Branch 36 → 38 taken 8 times.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 40 taken 110 times.
✗ Branch 39 → 40 not taken.
✓ Branch 39 → 41 taken 110 times.
✗ Branch 39 → 90 not taken.
✗ Branch 40 → 41 not taken.
✗ Branch 40 → 92 not taken.
220 if (c==',' && is_digit(startpar[i+1])) asar_throw_error(0, error_type_block, error_id_broken_macro_declaration);
47 }
48
9/20
✓ Branch 42 → 43 taken 26 times.
✗ Branch 42 → 47 not taken.
✓ Branch 43 → 44 taken 26 times.
✗ Branch 43 → 48 not taken.
✓ Branch 44 → 45 taken 26 times.
✗ Branch 44 → 47 not taken.
✓ Branch 45 → 46 taken 52 times.
✗ Branch 45 → 47 not taken.
✗ Branch 45 → 48 not taken.
✓ Branch 46 → 47 taken 26 times.
✓ Branch 46 → 48 taken 26 times.
✗ Branch 47 → 48 not taken.
✓ Branch 47 → 49 taken 26 times.
✗ Branch 49 → 50 not taken.
✓ Branch 49 → 51 taken 26 times.
✗ Branch 50 → 51 not taken.
✓ Branch 50 → 52 taken 26 times.
✗ Branch 50 → 90 not taken.
✗ Branch 51 → 52 not taken.
✗ Branch 51 → 92 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
4/11
✓ Branch 52 → 53 taken 26 times.
✗ Branch 52 → 90 not taken.
✓ Branch 53 → 54 taken 26 times.
✓ Branch 53 → 56 taken 26 times.
✗ Branch 53 → 92 not taken.
✗ Branch 54 → 55 not taken.
✓ Branch 54 → 57 taken 26 times.
✗ Branch 55 → 56 not taken.
✗ Branch 55 → 90 not taken.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 92 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
4/11
✓ Branch 57 → 58 taken 26 times.
✗ Branch 57 → 87 not taken.
✓ Branch 58 → 59 taken 26 times.
✓ Branch 58 → 60 taken 26 times.
✗ Branch 58 → 89 not taken.
✗ Branch 59 → 60 not taken.
✓ Branch 59 → 61 taken 26 times.
✗ Branch 87 → 88 not taken.
✗ Branch 87 → 89 not taken.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
52 new(thisone) macrodata;
52
4/4
✓ Branch 60 → 61 taken 16 times.
✓ Branch 60 → 64 taken 10 times.
✓ Branch 61 → 62 taken 16 times.
✓ Branch 61 → 65 taken 10 times.
52 if (*startpar)
53 {
54
2/4
✓ Branch 62 → 63 taken 16 times.
✗ Branch 62 → 90 not taken.
✓ Branch 63 → 64 taken 16 times.
✗ Branch 63 → 92 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
4/4
✓ Branch 84 → 68 taken 23 times.
✓ Branch 84 → 85 taken 25 times.
✓ Branch 85 → 69 taken 23 times.
✓ Branch 85 → 86 taken 25 times.
96 for (int i=0;thisone->arguments[i];i++)
67 {
68
7/7
✓ Branch 68 → 69 taken 12 times.
✓ Branch 68 → 71 taken 11 times.
✓ Branch 69 → 70 taken 23 times.
✓ Branch 69 → 71 taken 1 time.
✓ Branch 69 → 72 taken 11 times.
✓ Branch 70 → 71 taken 11 times.
✓ Branch 70 → 72 taken 1 time.
46 if(!strcmp(thisone->arguments[i], "...") && !thisone->arguments[i+1]) thisone->variadic = true;
69
6/8
✓ Branch 71 → 72 taken 1 time.
✓ Branch 71 → 73 taken 11 times.
✓ Branch 72 → 73 taken 1 time.
✓ Branch 72 → 74 taken 11 times.
✗ Branch 72 → 78 not taken.
✓ Branch 72 → 90 taken 1 time.
✗ Branch 73 → 79 not taken.
✓ Branch 73 → 92 taken 1 time.
24 else if(!strcmp(thisone->arguments[i], "...")) asar_throw_error(0, error_type_block, error_id_vararg_must_be_last);
70
2/8
✗ Branch 73 → 74 not taken.
✓ Branch 73 → 75 taken 11 times.
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 76 taken 11 times.
✗ Branch 74 → 78 not taken.
✗ Branch 74 → 90 not taken.
✗ Branch 75 → 79 not taken.
✗ Branch 75 → 92 not taken.
22 else if(strchr(thisone->arguments[i], '.')) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
71
4/10
✓ Branch 75 → 76 taken 11 times.
✗ Branch 75 → 90 not taken.
✓ Branch 76 → 77 taken 11 times.
✓ Branch 76 → 78 taken 11 times.
✗ Branch 76 → 92 not taken.
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 11 times.
✗ Branch 77 → 90 not taken.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 92 not taken.
22 else if (!confirmname(thisone->arguments[i])) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
72
4/4
✓ Branch 82 → 79 taken 7 times.
✓ Branch 82 → 83 taken 22 times.
✓ Branch 83 → 80 taken 7 times.
✓ Branch 83 → 84 taken 22 times.
58 for (int j=i+1;thisone->arguments[j];j++)
73 {
74
2/7
✗ Branch 79 → 80 not taken.
✓ Branch 79 → 81 taken 7 times.
✗ Branch 80 → 81 not taken.
✓ Branch 80 → 82 taken 7 times.
✗ Branch 80 → 90 not taken.
✗ Branch 81 → 82 not taken.
✗ Branch 81 → 92 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
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 128 times.
128 if (!thisone) return;
83 128 thisone->lines[numlines++]=line;
84 }
85
86 52 void endmacro(bool insert)
87 {
88
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 52 times.
52 if (!thisone) return;
89 52 thisone->numlines=numlines;
90
1/2
✓ Branch 4 → 5 taken 52 times.
✗ Branch 4 → 8 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
2/8
✓ Branch 2 → 3 taken 216 times.
✗ Branch 2 → 96 not taken.
✗ Branch 2 → 110 not taken.
✗ Branch 3 → 4 not taken.
✓ Branch 3 → 5 taken 216 times.
✗ Branch 4 → 5 not taken.
✗ Branch 4 → 96 not taken.
✗ Branch 4 → 110 not taken.
216 if (!confirmqpar(data)) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
100
2/4
✓ Branch 5 → 6 taken 108 times.
✗ Branch 5 → 96 not taken.
✓ Branch 6 → 7 taken 108 times.
✗ Branch 6 → 110 not taken.
216 string line=data;
101
6/16
✓ Branch 6 → 7 taken 108 times.
✗ Branch 6 → 94 not taken.
✓ Branch 7 → 8 taken 216 times.
✗ Branch 7 → 94 not taken.
✗ Branch 7 → 108 not taken.
✓ Branch 8 → 9 taken 216 times.
✗ Branch 8 → 94 not taken.
✗ Branch 8 → 108 not taken.
✓ Branch 9 → 10 taken 216 times.
✗ Branch 9 → 94 not taken.
✗ Branch 9 → 108 not taken.
✓ Branch 10 → 11 taken 216 times.
✗ Branch 10 → 94 not taken.
✗ Branch 10 → 108 not taken.
✓ Branch 11 → 12 taken 108 times.
✗ Branch 11 → 108 not taken.
216 clean_and_trim(line);
102 216 char * startpar=strqchr(line.data(), '(');
103
2/7
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 108 times.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 108 times.
✗ Branch 14 → 94 not taken.
✗ Branch 15 → 16 not taken.
✗ Branch 15 → 108 not taken.
216 if (!startpar) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
104 216 *startpar=0;
105 216 startpar++;
106
4/10
✓ Branch 16 → 17 taken 108 times.
✗ Branch 16 → 94 not taken.
✓ Branch 17 → 18 taken 108 times.
✓ Branch 17 → 19 taken 108 times.
✗ Branch 17 → 108 not taken.
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 108 times.
✗ Branch 18 → 94 not taken.
✗ Branch 19 → 20 not taken.
✗ Branch 19 → 108 not taken.
216 if (!confirmname(line)) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
107
4/11
✓ Branch 20 → 21 taken 108 times.
✗ Branch 20 → 94 not taken.
✓ Branch 21 → 22 taken 108 times.
✓ Branch 21 → 24 taken 108 times.
✗ Branch 21 → 108 not taken.
✗ Branch 22 → 23 not taken.
✓ Branch 22 → 25 taken 108 times.
✗ Branch 23 → 24 not taken.
✗ Branch 23 → 94 not taken.
✗ Branch 24 → 25 not taken.
✗ Branch 24 → 108 not taken.
216 if (!macros.exists(line)) asar_throw_error(0, error_type_block, error_id_macro_not_found, line.data());
108
2/4
✓ Branch 25 → 26 taken 108 times.
✗ Branch 25 → 94 not taken.
✓ Branch 26 → 27 taken 108 times.
✗ Branch 26 → 108 not taken.
216 thismacro = macros.find(line);
109 216 char * endpar=strqrchr(startpar, ')');
110
2/7
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 29 taken 108 times.
✗ Branch 28 → 29 not taken.
✓ Branch 28 → 30 taken 108 times.
✗ Branch 28 → 94 not taken.
✗ Branch 29 → 30 not taken.
✗ Branch 29 → 108 not taken.
216 if (endpar[1]) asar_throw_error(0, error_type_block, error_id_broken_macro_usage);
111 216 *endpar=0;
112 216 autoptr<const char * const*> args;
113 216 int numargs=0;
114
6/8
✓ Branch 30 → 31 taken 69 times.
✓ Branch 30 → 33 taken 39 times.
✓ Branch 31 → 32 taken 69 times.
✗ Branch 31 → 92 not taken.
✓ Branch 33 → 34 taken 69 times.
✓ Branch 33 → 36 taken 39 times.
✓ Branch 34 → 35 taken 69 times.
✗ Branch 34 → 106 not taken.
216 if (*startpar) args=(const char* const*)qpsplit(startpar, ",", &numargs);
115
6/12
✓ Branch 33 → 34 taken 30 times.
✓ Branch 33 → 36 taken 78 times.
✗ Branch 34 → 35 not taken.
✓ Branch 34 → 36 taken 30 times.
✗ Branch 35 → 36 not taken.
✗ Branch 35 → 92 not taken.
✓ Branch 36 → 37 taken 30 times.
✓ Branch 36 → 39 taken 78 times.
✗ Branch 37 → 38 not taken.
✓ Branch 37 → 39 taken 30 times.
✗ Branch 38 → 39 not taken.
✗ Branch 38 → 106 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
8/12
✓ Branch 36 → 37 taken 6 times.
✓ Branch 36 → 39 taken 102 times.
✓ Branch 37 → 38 taken 6 times.
✗ Branch 37 → 39 not taken.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 92 taken 6 times.
✓ Branch 39 → 40 taken 6 times.
✓ Branch 39 → 42 taken 102 times.
✓ Branch 40 → 41 taken 6 times.
✗ Branch 40 → 42 not taken.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 106 taken 6 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
4/4
✓ Branch 39 → 40 taken 39 times.
✓ Branch 39 → 41 taken 63 times.
✓ Branch 42 → 43 taken 39 times.
✓ Branch 42 → 44 taken 63 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 204 autoarray<int> newmacroposlabels;
134 204 autoarray<int> newmacroneglabels;
135 204 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
4/4
✓ Branch 68 → 47 taken 516 times.
✓ Branch 68 → 69 taken 102 times.
✓ Branch 75 → 53 taken 516 times.
✓ Branch 75 → 76 taken 102 times.
1236 for (int i=0;i<thismacro->numlines;i++)
149 {
150 try
151 {
152
2/4
✓ Branch 47 → 48 taken 516 times.
✗ Branch 47 → 81 not taken.
✓ Branch 53 → 54 taken 516 times.
✗ Branch 53 → 94 not taken.
1032 thisfilename= thismacro->fname;
153 1032 thisline= thismacro->startline+i+1;
154 1032 thisblock= nullptr;
155 1032 string connectedline;
156
2/4
✓ Branch 49 → 50 taken 516 times.
✗ Branch 49 → 79 not taken.
✓ Branch 56 → 57 taken 516 times.
✗ Branch 56 → 92 not taken.
1032 int skiplines = getconnectedlines<autoarray<string> >(thismacro->lines, i, connectedline);
157 //string out = replace_macro_args(connectedline); // done in assembleline
158 1032 int prevnumif = numif;
159
2/4
✓ Branch 51 → 52 taken 516 times.
✗ Branch 51 → 79 not taken.
✓ Branch 58 → 59 taken 516 times.
✗ Branch 58 → 92 not taken.
1032 assembleline(thismacro->fname, thismacro->startline+i, connectedline);
160 1032 i += skiplines;
161
22/32
✓ Branch 52 → 53 taken 348 times.
✓ Branch 52 → 54 taken 168 times.
✗ Branch 53 → 54 not taken.
✓ Branch 53 → 61 taken 348 times.
✓ Branch 54 → 55 taken 168 times.
✗ Branch 54 → 79 not taken.
✓ Branch 55 → 56 taken 54 times.
✓ Branch 55 → 58 taken 114 times.
✓ Branch 56 → 57 taken 54 times.
✗ Branch 56 → 79 not taken.
✗ Branch 57 → 58 not taken.
✓ Branch 57 → 61 taken 54 times.
✓ Branch 58 → 59 taken 114 times.
✗ Branch 58 → 79 not taken.
✓ Branch 59 → 60 taken 414 times.
✓ Branch 59 → 61 taken 216 times.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 68 taken 348 times.
✓ Branch 61 → 62 taken 168 times.
✗ Branch 61 → 92 not taken.
✓ Branch 62 → 63 taken 120 times.
✓ Branch 62 → 65 taken 564 times.
✓ Branch 63 → 64 taken 54 times.
✗ Branch 63 → 92 not taken.
✗ Branch 64 → 65 not taken.
✓ Branch 64 → 68 taken 54 times.
✓ Branch 65 → 66 taken 114 times.
✗ Branch 65 → 92 not taken.
✓ Branch 66 → 67 taken 66 times.
✓ Branch 66 → 68 taken 48 times.
✓ Branch 69 → 70 taken 66 times.
✓ Branch 69 → 72 taken 450 times.
1032 if ((numif != prevnumif || single_line_for_tracker == 3) && (whilestatus[numif].iswhile || whilestatus[numif].is_for) && whilestatus[numif].cond)
162
2/4
✓ Branch 63 → 64 taken 66 times.
✗ Branch 63 → 79 not taken.
✓ Branch 70 → 71 taken 66 times.
✗ Branch 70 → 92 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
2/4
✗ Branch 69 → 70 not taken.
✓ Branch 69 → 71 taken 102 times.
✗ Branch 76 → 77 not taken.
✓ Branch 76 → 78 taken 102 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
2/4
✗ Branch 71 → 72 not taken.
✓ Branch 71 → 73 taken 102 times.
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 80 taken 102 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 948 string out;
196
4/4
✓ Branch 101 → 4 taken 5754 times.
✓ Branch 101 → 102 taken 453 times.
✓ Branch 110 → 4 taken 5754 times.
✓ Branch 110 → 111 taken 453 times.
12414 for (const char * in=line;*in;)
197 {
198
3/6
✓ Branch 4 → 5 taken 348 times.
✓ Branch 4 → 9 taken 11160 times.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 9 taken 348 times.
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 9 not taken.
11508 if (*in=='<' && in[1]=='<' && in[2] != ':')
199 {
200 out+="<<";
201 in+=2;
202 }
203
3/3
✓ Branch 9 → 10 taken 348 times.
✓ Branch 9 → 99 taken 5580 times.
✓ Branch 9 → 108 taken 5580 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 10 → 11 taken 84 times.
✓ Branch 10 → 13 taken 264 times.
348 if (*end==' ')
212 {
213
1/3
✓ Branch 11 → 12 taken 84 times.
✗ Branch 11 → 119 not taken.
✗ Branch 11 → 133 not taken.
84 out += *(in++);
214 84 continue;
215 }
216
217
5/8
✓ Branch 15 → 16 taken 2058 times.
✗ Branch 15 → 19 not taken.
✓ Branch 16 → 17 taken 1794 times.
✓ Branch 16 → 19 taken 264 times.
✓ Branch 17 → 18 taken 1794 times.
✗ Branch 17 → 19 not taken.
✓ Branch 18 → 14 taken 1794 times.
✗ Branch 18 → 19 not taken.
2058 while (*end && *end!='>'&& *end!='<' && *(end+1)!=':') end++; //allow for conditionals and <:
218
1/2
✗ Branch 19 → 20 not taken.
✓ Branch 19 → 22 taken 264 times.
264 if (*end!='>')
219 {
220 out+=*(in++);
221 continue;
222 }
223
224 264 bool proper_variadic = false;
225
5/8
✓ Branch 22 → 23 taken 138 times.
✓ Branch 22 → 29 taken 126 times.
✓ Branch 23 → 24 taken 138 times.
✗ Branch 23 → 29 not taken.
✓ Branch 24 → 25 taken 138 times.
✗ Branch 24 → 29 not taken.
✓ Branch 25 → 26 taken 138 times.
✗ Branch 25 → 29 not taken.
264 if (in[1] == '.' && in[2] == '.' && in[3] == '.' && in[4] == '[')
226 {
227
2/2
✓ Branch 26 → 27 taken 6 times.
✓ Branch 26 → 28 taken 132 times.
138 if (end[-1] != ']')
228
2/3
✗ Branch 27 → 28 not taken.
✓ Branch 27 → 119 taken 3 times.
✓ Branch 27 → 133 taken 3 times.
6 asar_throw_error(0, error_type_block, error_id_unclosed_vararg);
229
230 132 proper_variadic = true;
231 132 in += 4;
232 132 end--;
233 }
234
235
1/5
✗ Branch 29 → 30 not taken.
✓ Branch 29 → 31 taken 258 times.
✗ Branch 30 → 31 not taken.
✗ Branch 30 → 119 not taken.
✗ Branch 30 → 133 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 258 string param;
239
2/4
✓ Branch 32 → 33 taken 129 times.
✗ Branch 32 → 117 not taken.
✓ Branch 34 → 35 taken 129 times.
✗ Branch 34 → 131 not taken.
258 string temp(in, end-in);
240
2/4
✓ Branch 34 → 35 taken 129 times.
✗ Branch 34 → 115 not taken.
✓ Branch 36 → 37 taken 129 times.
✗ Branch 36 → 129 not taken.
258 resolvedefines(param, temp);
241 258 in = param.data();
242
2/4
✓ Branch 36 → 37 taken 129 times.
✗ Branch 36 → 115 not taken.
✓ Branch 38 → 39 taken 129 times.
✗ Branch 38 → 129 not taken.
258 bool valid_named_param = confirmname(in);
243
10/11
✓ Branch 37 → 38 taken 69 times.
✓ Branch 37 → 40 taken 60 times.
✓ Branch 38 → 39 taken 3 times.
✓ Branch 38 → 40 taken 66 times.
✓ Branch 39 → 40 taken 69 times.
✓ Branch 39 → 42 taken 60 times.
✓ Branch 39 → 115 taken 3 times.
✓ Branch 40 → 41 taken 3 times.
✓ Branch 40 → 42 taken 66 times.
✗ Branch 41 → 42 not taken.
✓ Branch 41 → 129 taken 3 times.
258 if (!valid_named_param && !current_macro->variadic) asar_throw_error(0, error_type_block, error_id_invalid_macro_param_name);
244 252 bool found=false;
245
8/8
✓ Branch 52 → 53 taken 144 times.
✓ Branch 52 → 54 taken 9 times.
✓ Branch 53 → 41 taken 78 times.
✓ Branch 53 → 54 taken 66 times.
✓ Branch 55 → 56 taken 144 times.
✓ Branch 55 → 57 taken 9 times.
✓ Branch 56 → 43 taken 78 times.
✓ Branch 56 → 57 taken 66 times.
306 for (int j=0;current_macro->arguments[j]&&!proper_variadic;j++)
246 {
247
4/4
✓ Branch 41 → 42 taken 51 times.
✓ Branch 41 → 51 taken 27 times.
✓ Branch 43 → 44 taken 51 times.
✓ Branch 43 → 54 taken 27 times.
156 if (!strcmp(in, current_macro->arguments[j]))
248 {
249 102 found=true;
250
4/4
✓ Branch 42 → 43 taken 36 times.
✓ Branch 42 → 49 taken 15 times.
✓ Branch 44 → 45 taken 36 times.
✓ Branch 44 → 52 taken 15 times.
102 if (current_macro_args[j][0]=='"')
251 {
252
2/4
✓ Branch 43 → 44 taken 36 times.
✗ Branch 43 → 106 not taken.
✓ Branch 46 → 47 taken 36 times.
✗ Branch 46 → 115 not taken.
72 string s=current_macro_args[j];
253
4/8
✓ Branch 45 → 46 taken 36 times.
✗ Branch 45 → 104 not taken.
✓ Branch 46 → 47 taken 36 times.
✗ Branch 46 → 104 not taken.
✓ Branch 48 → 49 taken 36 times.
✗ Branch 48 → 113 not taken.
✓ Branch 49 → 50 taken 36 times.
✗ Branch 49 → 113 not taken.
72 out+=safedequote(s.temp_raw());
254 72 }
255
2/4
✓ Branch 49 → 50 taken 15 times.
✗ Branch 49 → 115 not taken.
✓ Branch 52 → 53 taken 15 times.
✗ Branch 52 → 129 not taken.
30 else out+=current_macro_args[j];
256 102 break;
257 }
258 }
259
4/4
✓ Branch 54 → 55 taken 75 times.
✓ Branch 54 → 93 taken 51 times.
✓ Branch 57 → 58 taken 75 times.
✓ Branch 57 → 101 taken 51 times.
252 if (!found)
260 {
261 150 snes_label ret;
262
8/8
✓ Branch 56 → 57 taken 9 times.
✓ Branch 56 → 61 taken 66 times.
✓ Branch 57 → 58 taken 3 times.
✓ Branch 57 → 61 taken 6 times.
✓ Branch 60 → 61 taken 9 times.
✓ Branch 60 → 65 taken 66 times.
✓ Branch 61 → 62 taken 3 times.
✓ Branch 61 → 65 taken 6 times.
150 if(valid_named_param && !current_macro->variadic)
263 {
264
4/8
✓ Branch 58 → 59 taken 3 times.
✗ Branch 58 → 60 not taken.
✗ Branch 59 → 61 not taken.
✓ Branch 59 → 114 taken 3 times.
✓ Branch 62 → 63 taken 3 times.
✗ Branch 62 → 64 not taken.
✗ Branch 63 → 65 not taken.
✓ Branch 63 → 127 taken 3 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
21/33
✓ Branch 61 → 62 taken 72 times.
✗ Branch 61 → 67 not taken.
✓ Branch 62 → 63 taken 6 times.
✓ Branch 62 → 67 taken 66 times.
✓ Branch 63 → 64 taken 6 times.
✗ Branch 63 → 107 not taken.
✓ Branch 64 → 65 taken 6 times.
✗ Branch 64 → 107 not taken.
✓ Branch 65 → 66 taken 75 times.
✓ Branch 65 → 67 taken 3 times.
✗ Branch 65 → 72 not taken.
✓ Branch 66 → 67 taken 6 times.
✓ Branch 66 → 72 taken 66 times.
✓ Branch 68 → 69 taken 12 times.
✓ Branch 68 → 70 taken 66 times.
✗ Branch 68 → 117 not taken.
✓ Branch 69 → 70 taken 6 times.
✗ Branch 69 → 117 not taken.
✓ Branch 70 → 71 taken 6 times.
✓ Branch 70 → 72 taken 3 times.
✓ Branch 70 → 74 taken 69 times.
✓ Branch 73 → 74 taken 6 times.
✓ Branch 73 → 75 taken 66 times.
✓ Branch 75 → 76 taken 6 times.
✓ Branch 75 → 77 taken 66 times.
✓ Branch 77 → 78 taken 3 times.
✓ Branch 77 → 81 taken 69 times.
✗ Branch 107 → 108 not taken.
✗ Branch 107 → 109 not taken.
✗ Branch 117 → 118 not taken.
✗ Branch 117 → 119 not taken.
✗ Branch 120 → 121 not taken.
✗ Branch 120 → 122 not taken.
144 if(current_macro->variadic && valid_named_param && !labelval(in, &ret, false))
268 {
269
4/8
✓ Branch 71 → 72 taken 3 times.
✗ Branch 71 → 73 not taken.
✗ Branch 72 → 74 not taken.
✓ Branch 72 → 114 taken 3 times.
✓ Branch 78 → 79 taken 3 times.
✗ Branch 78 → 80 not taken.
✗ Branch 79 → 81 not taken.
✓ Branch 79 → 127 taken 3 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
6/8
✓ Branch 74 → 75 taken 9 times.
✓ Branch 74 → 76 taken 60 times.
✓ Branch 75 → 76 taken 9 times.
✗ Branch 75 → 114 not taken.
✓ Branch 81 → 82 taken 9 times.
✓ Branch 81 → 83 taken 60 times.
✓ Branch 82 → 83 taken 9 times.
✗ Branch 82 → 127 not taken.
138 if(!proper_variadic) asar_throw_warning(0, warning_id_feature_deprecated, "'<math>' syntax for variadic macro parameters", "Use '<...[math]>' instead.");
273
2/4
✓ Branch 76 → 77 taken 69 times.
✗ Branch 76 → 114 not taken.
✓ Branch 83 → 84 taken 69 times.
✗ Branch 83 → 127 not taken.
138 int arg_num = getnum(in);
274
275
2/8
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 69 times.
✗ Branch 78 → 79 not taken.
✗ Branch 78 → 114 not taken.
✗ Branch 84 → 85 not taken.
✓ Branch 84 → 86 taken 69 times.
✗ Branch 85 → 86 not taken.
✗ Branch 85 → 127 not taken.
138 if(forwardlabel) asar_throw_error(0, error_type_block, error_id_label_forward);
276
277
2/4
✓ Branch 79 → 80 taken 69 times.
✗ Branch 79 → 92 not taken.
✓ Branch 86 → 87 taken 69 times.
✗ Branch 86 → 100 not taken.
138 if(numif<=numtrue){
278
6/8
✓ Branch 80 → 81 taken 3 times.
✓ Branch 80 → 82 taken 66 times.
✗ Branch 81 → 82 not taken.
✓ Branch 81 → 114 taken 3 times.
✓ Branch 87 → 88 taken 3 times.
✓ Branch 87 → 89 taken 66 times.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 127 taken 3 times.
138 if (arg_num < 0) asar_throw_error(1, error_type_block, error_id_vararg_out_of_bounds);
279
6/8
✓ Branch 82 → 83 taken 6 times.
✓ Branch 82 → 84 taken 60 times.
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 114 taken 6 times.
✓ Branch 89 → 90 taken 6 times.
✓ Branch 89 → 91 taken 60 times.
✗ Branch 90 → 91 not taken.
✓ Branch 90 → 127 taken 6 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
2/4
✗ Branch 84 → 85 not taken.
✓ Branch 84 → 91 taken 60 times.
✗ Branch 91 → 92 not taken.
✓ Branch 91 → 99 taken 60 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
2/4
✓ Branch 91 → 92 taken 60 times.
✗ Branch 91 → 114 not taken.
✓ Branch 99 → 100 taken 60 times.
✗ Branch 99 → 127 not taken.
120 else out+=current_macro_args[arg_num+current_macro->numargs-1];
286 }
287 }
288 222 in=end+1;
289
4/4
✓ Branch 93 → 94 taken 51 times.
✓ Branch 93 → 95 taken 60 times.
✓ Branch 101 → 102 taken 51 times.
✓ Branch 101 → 103 taken 60 times.
222 if (proper_variadic) in++;
290 294 }
291
2/4
✓ Branch 99 → 100 taken 5580 times.
✗ Branch 99 → 120 not taken.
✓ Branch 108 → 109 taken 5580 times.
✗ Branch 108 → 136 not taken.
11160 else out+=*(in++);
292 }
293 906 return out;
294 42 }
295