asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
129 of 228, 0 excluded
56.6%
Functions:
4 of 4, 0 excluded
100.0%
Branches:
418 of 1262, 0 excluded
33.1%

interface-cli.cpp
Line Branch Exec Source
1 #include "asar.h"
2 #include "assocarr.h"
3 #include "libstr.h"
4 #include "libcon.h"
5 #include "libsmw.h"
6 #include "errors.h"
7 #include "warnings.h"
8 #include "platform/file-helpers.h"
9 #include "virtualfile.h"
10 #include "interface-shared.h"
11 #include "assembleblock.h"
12 #include "asar_math.h"
13
14 #ifdef TIMELIMIT
15 # if defined(linux)
16 # include <sys/resource.h>
17 # include <signal.h>
18 # elif defined(_WIN32)
19 //WARNING: The Windows equivalent of SIGXCPU, job limits, is very poorly suited for short-running
20 // tasks like this; it's only checked approximately every seven seconds on the machine I tested on,
21 // and it kills the process instantly once this happens. (Additionally, due to an implementation
22 // quirk, it'll bug up if you ask for anything above about seven minutes, so don't do that.)
23 # include <windows.h>
24 # else
25 # error Time limits not configured for this OS.
26 # endif
27 #endif
28
29 extern const char asarver[];
30
31 32 void print(const char * str)
32 {
33 32 puts(str);
34 32 }
35
36 static FILE * errloc=stderr;
37 static int errnum=0;
38
39 static int max_num_errors = 20;
40
41 218 void error_interface(int errid, int whichpass, const char * e_)
42 {
43 218 errored = true;
44
3/3
✓ Branch 2 → 3 taken 94 times.
✓ Branch 2 → 37 taken 62 times.
✓ Branch 2 → 59 taken 62 times.
218 if (pass == whichpass)
45 {
46 94 errnum++;
47 // don't show current block if the error came from an error command
48
4/4
✓ Branch 3 → 4 taken 68 times.
✓ Branch 3 → 6 taken 26 times.
✓ Branch 4 → 5 taken 62 times.
✓ Branch 4 → 6 taken 6 times.
94 bool show_block = (thisblock && (errid != error_id_error_command));
49
39/77
✓ Branch 7 → 8 taken 31 times.
✓ Branch 7 → 11 taken 16 times.
✓ Branch 8 → 9 taken 31 times.
✗ Branch 8 → 59 not taken.
✓ Branch 9 → 10 taken 31 times.
✗ Branch 9 → 59 not taken.
✓ Branch 10 → 11 taken 31 times.
✓ Branch 10 → 12 taken 31 times.
✓ Branch 10 → 16 taken 16 times.
✗ Branch 10 → 59 not taken.
✓ Branch 11 → 12 taken 16 times.
✗ Branch 11 → 59 not taken.
✓ Branch 13 → 14 taken 78 times.
✗ Branch 13 → 54 not taken.
✗ Branch 13 → 86 not taken.
✓ Branch 14 → 15 taken 78 times.
✗ Branch 14 → 52 not taken.
✗ Branch 14 → 86 not taken.
✓ Branch 15 → 16 taken 47 times.
✓ Branch 15 → 17 taken 31 times.
✗ Branch 15 → 50 not taken.
✗ Branch 15 → 86 not taken.
✓ Branch 16 → 17 taken 63 times.
✗ Branch 16 → 48 not taken.
✗ Branch 16 → 86 not taken.
✓ Branch 17 → 18 taken 47 times.
✗ Branch 17 → 46 not taken.
✓ Branch 18 → 19 taken 47 times.
✗ Branch 18 → 44 not taken.
✓ Branch 19 → 20 taken 47 times.
✗ Branch 19 → 42 not taken.
✓ Branch 20 → 21 taken 47 times.
✗ Branch 20 → 40 not taken.
✓ Branch 21 → 22 taken 47 times.
✗ Branch 21 → 78 not taken.
✓ Branch 22 → 23 taken 47 times.
✗ Branch 22 → 38 not taken.
✓ Branch 24 → 25 taken 47 times.
✗ Branch 24 → 74 not taken.
✓ Branch 25 → 26 taken 47 times.
✗ Branch 25 → 72 not taken.
✓ Branch 26 → 27 taken 47 times.
✗ Branch 26 → 70 not taken.
✓ Branch 27 → 28 taken 47 times.
✗ Branch 27 → 68 not taken.
✓ Branch 28 → 29 taken 47 times.
✗ Branch 28 → 66 not taken.
✓ Branch 29 → 30 taken 47 times.
✗ Branch 29 → 64 not taken.
✓ Branch 30 → 31 taken 47 times.
✗ Branch 30 → 62 not taken.
✓ Branch 31 → 32 taken 31 times.
✓ Branch 31 → 33 taken 16 times.
✓ Branch 32 → 33 taken 47 times.
✗ Branch 32 → 60 not taken.
✓ Branch 33 → 34 taken 31 times.
✓ Branch 33 → 35 taken 16 times.
✓ Branch 46 → 47 taken 31 times.
✓ Branch 46 → 48 taken 16 times.
✓ Branch 48 → 49 taken 31 times.
✓ Branch 48 → 50 taken 16 times.
✓ Branch 50 → 51 taken 31 times.
✓ Branch 50 → 52 taken 16 times.
✓ Branch 52 → 53 taken 31 times.
✓ Branch 52 → 54 taken 16 times.
✗ Branch 59 → 60 not taken.
✗ Branch 59 → 61 not taken.
✗ Branch 63 → 64 not taken.
✗ Branch 63 → 65 not taken.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 88 not taken.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 94 not taken.
✗ Branch 95 → 96 not taken.
✗ Branch 95 → 97 not taken.
94 fputs(STR getdecor() + "error: (" + get_error_name((asar_error_id)errid) + "): " + e_ + (show_block ? (STR" [" + thisblock + "]") : STR "") + "\n", errloc);
50
2/4
✗ Branch 35 → 36 not taken.
✓ Branch 35 → 37 taken 47 times.
✗ Branch 57 → 58 not taken.
✓ Branch 57 → 59 taken 47 times.
94 if (errnum == max_num_errors + 1) asar_throw_error(pass, error_type_fatal, error_id_limit_reached, max_num_errors);
51 }
52 218 }
53
54 static bool werror=false;
55 static bool warned=false;
56
57 92 void warn(int errid, const char * e_)
58 {
59 // don't show current block if the warning came from a warn command
60
4/4
✓ Branch 2 → 3 taken 82 times.
✓ Branch 2 → 5 taken 10 times.
✓ Branch 3 → 4 taken 76 times.
✓ Branch 3 → 5 taken 6 times.
92 bool show_block = (thisblock && (errid != warning_id_warn_command));
61
39/77
✓ Branch 6 → 7 taken 38 times.
✓ Branch 6 → 10 taken 8 times.
✓ Branch 7 → 8 taken 38 times.
✗ Branch 7 → 56 not taken.
✓ Branch 8 → 9 taken 38 times.
✗ Branch 8 → 56 not taken.
✓ Branch 9 → 10 taken 38 times.
✓ Branch 9 → 11 taken 38 times.
✓ Branch 9 → 15 taken 8 times.
✗ Branch 9 → 56 not taken.
✓ Branch 10 → 11 taken 8 times.
✗ Branch 10 → 56 not taken.
✓ Branch 12 → 13 taken 84 times.
✗ Branch 12 → 51 not taken.
✗ Branch 12 → 83 not taken.
✓ Branch 13 → 14 taken 84 times.
✗ Branch 13 → 49 not taken.
✗ Branch 13 → 83 not taken.
✓ Branch 14 → 15 taken 46 times.
✓ Branch 14 → 16 taken 38 times.
✗ Branch 14 → 47 not taken.
✗ Branch 14 → 83 not taken.
✓ Branch 15 → 16 taken 54 times.
✗ Branch 15 → 45 not taken.
✗ Branch 15 → 83 not taken.
✓ Branch 16 → 17 taken 46 times.
✗ Branch 16 → 43 not taken.
✓ Branch 17 → 18 taken 46 times.
✗ Branch 17 → 41 not taken.
✓ Branch 18 → 19 taken 46 times.
✗ Branch 18 → 39 not taken.
✓ Branch 19 → 20 taken 46 times.
✗ Branch 19 → 37 not taken.
✓ Branch 20 → 21 taken 46 times.
✗ Branch 20 → 75 not taken.
✓ Branch 21 → 22 taken 46 times.
✗ Branch 21 → 35 not taken.
✓ Branch 23 → 24 taken 46 times.
✗ Branch 23 → 71 not taken.
✓ Branch 24 → 25 taken 46 times.
✗ Branch 24 → 69 not taken.
✓ Branch 25 → 26 taken 46 times.
✗ Branch 25 → 67 not taken.
✓ Branch 26 → 27 taken 46 times.
✗ Branch 26 → 65 not taken.
✓ Branch 27 → 28 taken 46 times.
✗ Branch 27 → 63 not taken.
✓ Branch 28 → 29 taken 46 times.
✗ Branch 28 → 61 not taken.
✓ Branch 29 → 30 taken 46 times.
✗ Branch 29 → 59 not taken.
✓ Branch 30 → 31 taken 38 times.
✓ Branch 30 → 32 taken 8 times.
✓ Branch 31 → 32 taken 46 times.
✗ Branch 31 → 57 not taken.
✓ Branch 32 → 33 taken 38 times.
✓ Branch 32 → 34 taken 8 times.
✓ Branch 45 → 46 taken 38 times.
✓ Branch 45 → 47 taken 8 times.
✓ Branch 47 → 48 taken 38 times.
✓ Branch 47 → 49 taken 8 times.
✓ Branch 49 → 50 taken 38 times.
✓ Branch 49 → 51 taken 8 times.
✓ Branch 51 → 52 taken 38 times.
✓ Branch 51 → 53 taken 8 times.
✗ Branch 56 → 57 not taken.
✗ Branch 56 → 58 not taken.
✗ Branch 60 → 61 not taken.
✗ Branch 60 → 62 not taken.
✗ Branch 83 → 84 not taken.
✗ Branch 83 → 85 not taken.
✗ Branch 86 → 87 not taken.
✗ Branch 86 → 88 not taken.
✗ Branch 89 → 90 not taken.
✗ Branch 89 → 91 not taken.
✗ Branch 92 → 93 not taken.
✗ Branch 92 → 94 not taken.
92 fputs(STR getdecor()+"warning: (" + get_warning_name((asar_warning_id)errid) + "): " + e_ + (show_block ? (STR" [" + thisblock + "]") : STR "") + "\n", errloc);
62 92 warned=true;
63 92 }
64
65 #ifdef TIMELIMIT
66 #if defined(linux)
67 void onsigxcpu(int ignored)
68 {
69 error<errnull>(pass, "Time limit exceeded.");
70 exit(1);
71 }
72 #elif defined(_WIN32)
73 //null
74 #endif
75 #endif
76
77
78
79 200 int main(int argc, char * argv[])
80 {
81 #ifdef TIMELIMIT
82 #if defined(linux)
83 rlimit lim;
84 lim.rlim_cur=TIMELIMIT;
85 lim.rlim_max=RLIM_INFINITY;
86 setrlimit(RLIMIT_CPU, &lim);
87 signal(SIGXCPU, onsigxcpu);
88 #elif defined(_WIN32)
89 HANDLE hjob=CreateJobObject(NULL, nullptr);
90 AssignProcessToJobObject(hjob, GetCurrentProcess());
91 JOBOBJECT_BASIC_LIMIT_INFORMATION jbli;
92 jbli.LimitFlags=JOB_OBJECT_LIMIT_PROCESS_TIME;
93 jbli.PerProcessUserTimeLimit.LowPart=10*1000*1000*TIMELIMIT;
94 jbli.PerProcessUserTimeLimit.HighPart=0;
95 SetInformationJobObject(hjob, JobObjectBasicLimitInformation, &jbli, sizeof(jbli));
96 #endif
97 #endif
98 #define pause(sev) do { if (pause>=pause_##sev) libcon_pause(); } while(0)
99
100 enum {
101 pause_no,
102 pause_err,
103 pause_warn,
104 pause_yes,
105 200 } pause=pause_no;
106
107 enum cmdlparam
108 {
109 cmdlparam_none,
110
111 cmdlparam_addincludepath,
112 cmdlparam_adddefine,
113
114 cmdlparam_count
115 };
116
117 try
118 {
119 200 romdata_r = nullptr;
120
16/34
✓ Branch 7 → 8 taken 100 times.
✗ Branch 7 → 9 not taken.
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 100 times.
✓ Branch 11 → 12 taken 100 times.
✗ Branch 11 → 517 not taken.
✓ Branch 13 → 14 taken 200 times.
✗ Branch 13 → 15 not taken.
✗ Branch 13 → 512 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 100 times.
✓ Branch 15 → 16 taken 100 times.
✗ Branch 15 → 509 not taken.
✓ Branch 16 → 17 taken 100 times.
✗ Branch 16 → 507 not taken.
✓ Branch 17 → 18 taken 100 times.
✗ Branch 17 → 505 not taken.
✓ Branch 18 → 19 taken 100 times.
✗ Branch 18 → 503 not taken.
✓ Branch 19 → 20 taken 200 times.
✗ Branch 19 → 501 not taken.
✗ Branch 19 → 630 not taken.
✓ Branch 24 → 25 taken 100 times.
✗ Branch 24 → 622 not taken.
✓ Branch 27 → 28 taken 100 times.
✗ Branch 27 → 618 not taken.
✓ Branch 28 → 29 taken 100 times.
✗ Branch 28 → 616 not taken.
✓ Branch 29 → 30 taken 100 times.
✗ Branch 29 → 614 not taken.
✓ Branch 30 → 31 taken 100 times.
✗ Branch 30 → 612 not taken.
✓ Branch 31 → 32 taken 100 times.
✗ Branch 31 → 610 not taken.
600 string version=STR"Asar "+dec(asarver_maj)+"."+dec(asarver_min)+((asarver_bug>=10 || asarver_min>=10)?".":"")+
121
10/19
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 100 times.
✓ Branch 5 → 6 taken 100 times.
✓ Branch 5 → 7 taken 100 times.
✗ Branch 5 → 522 not taken.
✓ Branch 10 → 11 taken 100 times.
✗ Branch 10 → 638 not taken.
✓ Branch 20 → 21 taken 100 times.
✗ Branch 20 → 499 not taken.
✓ Branch 21 → 22 taken 100 times.
✗ Branch 21 → 497 not taken.
✓ Branch 22 → 23 taken 100 times.
✗ Branch 22 → 495 not taken.
✓ Branch 32 → 33 taken 100 times.
✗ Branch 32 → 608 not taken.
✓ Branch 33 → 34 taken 100 times.
✗ Branch 33 → 606 not taken.
✓ Branch 34 → 35 taken 100 times.
✗ Branch 34 → 604 not taken.
900 dec(asarver_bug)+(asarver_beta?"pre":"")+", originally developed by Alcaro, maintained by Asar devs.\n"+
122
2/4
✓ Branch 23 → 24 taken 100 times.
✗ Branch 23 → 493 not taken.
✓ Branch 35 → 36 taken 100 times.
✗ Branch 35 → 602 not taken.
300 "Source code: https://github.com/RPGHacker/asar\n";
123 200 char * myname=argv[0];
124
2/4
✓ Branch 35 → 36 taken 100 times.
✗ Branch 35 → 37 not taken.
✓ Branch 58 → 59 taken 100 times.
✗ Branch 58 → 60 not taken.
200 if (strrchr(myname, '/')) myname=strrchr(myname, '/')+1;
125 //char * dot=strrchr(myname, '.');
126 //if (dot) *dot='\0';
127
3/6
✓ Branch 37 → 38 taken 100 times.
✗ Branch 37 → 637 not taken.
✗ Branch 38 → 39 not taken.
✓ Branch 38 → 43 taken 100 times.
✗ Branch 60 → 61 not taken.
✓ Branch 60 → 64 taken 100 times.
200 if (!strncasecmp(myname, "xkas", strlen("xkas"))) {
128 // RPG Hacker: no asar_throw_Warning() here, because we didn't have a chance to disable warnings yet.
129 // Also seems like warning aren't even registered at this point yet.
130 puts("Warning: xkas support is being deprecated and will be removed in the next release of asar!!!");
131 puts("(this was triggered by renaming asar.exe to xkas.exe, which activated a compatibility feature.)");
132 errloc=stdout;
133 }
134 //if (dot) *dot='.';
135
2/4
✓ Branch 43 → 44 taken 100 times.
✗ Branch 43 → 637 not taken.
✓ Branch 64 → 65 taken 100 times.
✗ Branch 64 → 788 not taken.
200 libcon_init(argc, argv,
136 "[options] asm_file [rom_file]\n\n"
137 "Supported options:\n\n"
138 " --version \n"
139 " Display version information.\n\n"
140 " -v, --verbose \n"
141 " Enable verbose mode.\n\n"
142 " --symbols=<none/wla/nocash>\n"
143 " Specifies the format of the symbols output file. (Default is none for no symbols file)\n\n"
144 " --symbols-path=<filename>\n"
145 " Override the default path to the symbols output file. The default is the ROM's base name with an\n"
146 " extension of '.sym'.\n\n"
147 " --no-title-check\n"
148 " Disable verifying ROM title. (Note that irresponsible use will likely corrupt your ROM)\n\n"
149 " --pause-mode=<never/on-error/on-warning/always>\n"
150 " Specify when Asar should pause the application. (Never, on error, on warning or always)\n\n"
151 " --fix-checksum=<on/off>\n"
152 " Override Asar's checksum generation, allowing you to manually enable/disable generating a checksum\n\n"
153 " -I<path> \n"
154 " --include <path> \n"
155 " Add an include search path to Asar.\n\n"
156 " -D<def>[=<val>] \n"
157 " --define <def>[=<val>]\n"
158 " Add a define (optionally with a value) to Asar.\n\n"
159 " -werror \n"
160 " Treat warnings as errors.\n\n"
161 " -w<name> \n"
162 " Enable a specific warning.\n\n"
163 " -wno<name> \n"
164 " Disable a specific warning.\n\n"
165 " --error-limit=<N> \n"
166 " Stop after encountering this many errors, instead of the default 20\n\n"
167 );
168 200 ignoretitleerrors=false;
169 200 string par;
170 200 bool verbose=libcon_interactive;
171
2/4
✓ Branch 45 → 46 taken 100 times.
✗ Branch 45 → 635 not taken.
✓ Branch 68 → 69 taken 100 times.
✗ Branch 68 → 786 not taken.
200 string symbols="";
172
2/4
✓ Branch 46 → 47 taken 100 times.
✗ Branch 46 → 633 not taken.
✓ Branch 70 → 71 taken 100 times.
✗ Branch 70 → 784 not taken.
200 string symfilename="";
173
174 200 autoarray<string> includepaths;
175 200 autoarray<const char*> includepath_cstrs;
176
177
10/16
✓ Branch 206 → 207 taken 500 times.
✗ Branch 206 → 627 not taken.
✓ Branch 207 → 208 taken 500 times.
✗ Branch 207 → 627 not taken.
✓ Branch 208 → 209 taken 500 times.
✗ Branch 208 → 627 not taken.
✓ Branch 209 → 50 taken 400 times.
✓ Branch 209 → 210 taken 100 times.
✓ Branch 242 → 243 taken 500 times.
✗ Branch 242 → 778 not taken.
✓ Branch 243 → 244 taken 500 times.
✗ Branch 243 → 778 not taken.
✓ Branch 244 → 245 taken 500 times.
✗ Branch 244 → 778 not taken.
✓ Branch 245 → 76 taken 400 times.
✓ Branch 245 → 246 taken 100 times.
1000 while ((par=libcon_option()))
178 {
179 800 cmdlparam postprocess_param = cmdlparam_none;
180 800 const char* postprocess_arg = nullptr;
181
182 #define checkstartmatch(arg, stringliteral) (!strncmp(arg, stringliteral, strlen(stringliteral)))
183
184
2/4
✗ Branch 51 → 52 not taken.
✓ Branch 51 → 53 taken 400 times.
✗ Branch 77 → 78 not taken.
✓ Branch 77 → 79 taken 400 times.
800 if (par=="--no-title-check") ignoretitleerrors=true;
185
6/12
✓ Branch 54 → 55 taken 400 times.
✗ Branch 54 → 57 not taken.
✗ Branch 56 → 57 not taken.
✓ Branch 56 → 58 taken 400 times.
✗ Branch 59 → 60 not taken.
✓ Branch 59 → 61 taken 400 times.
✓ Branch 80 → 81 taken 400 times.
✗ Branch 80 → 83 not taken.
✗ Branch 82 → 83 not taken.
✓ Branch 82 → 84 taken 400 times.
✗ Branch 85 → 86 not taken.
✓ Branch 85 → 87 taken 400 times.
800 else if (par == "-v" || par=="--verbose") verbose=true;
186
2/4
✗ Branch 62 → 63 not taken.
✓ Branch 62 → 73 taken 400 times.
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 99 taken 400 times.
800 else if (checkstartmatch(par, "--symbols="))
187 {
188 if (par == "--symbols=none") symbols = "";
189 else if (par=="--symbols=wla") symbols="wla";
190 else if (par=="--symbols=nocash") symbols="nocash";
191 else libcon_badusage();
192 }
193
2/4
✗ Branch 74 → 75 not taken.
✓ Branch 74 → 77 taken 400 times.
✗ Branch 100 → 101 not taken.
✓ Branch 100 → 103 taken 400 times.
800 else if (checkstartmatch(par, "--symbols-path=")) {
194 symfilename=((const char*)par) + strlen("--symbols-path=");
195 }
196
2/4
✗ Branch 78 → 79 not taken.
✓ Branch 78 → 82 taken 400 times.
✗ Branch 104 → 105 not taken.
✓ Branch 104 → 109 taken 400 times.
800 else if (checkstartmatch(par, "--error-limit="))
197 {
198 char* out;
199 long lim = strtol((const char*)par + strlen("--error-limit="), &out, 10);
200 max_num_errors = lim;
201 }
202
2/4
✗ Branch 83 → 84 not taken.
✓ Branch 83 → 87 taken 400 times.
✗ Branch 110 → 111 not taken.
✓ Branch 110 → 114 taken 400 times.
800 else if (par=="--version")
203 {
204 puts(version);
205 return 0;
206 }
207
2/4
✗ Branch 88 → 89 not taken.
✓ Branch 88 → 102 taken 400 times.
✗ Branch 115 → 116 not taken.
✓ Branch 115 → 129 taken 400 times.
800 else if (checkstartmatch(par, "--pause-mode="))
208 {
209 if (par=="--pause-mode=never") pause=pause_no;
210 else if (par=="--pause-mode=on-error") pause=pause_err;
211 else if (par=="--pause-mode=on-warning") pause=pause_warn;
212 else if (par=="--pause-mode=always") pause=pause_yes;
213 else libcon_badusage();
214 }
215
2/4
✗ Branch 103 → 104 not taken.
✓ Branch 103 → 111 taken 400 times.
✗ Branch 130 → 131 not taken.
✓ Branch 130 → 138 taken 400 times.
800 else if(checkstartmatch(par, "--fix-checksum=")) {
216 if(par=="--fix-checksum=on") {
217 force_checksum_fix = true;
218 checksum_fix_enabled = true;
219 } else if(par=="--fix-checksum=off") {
220 force_checksum_fix = true;
221 checksum_fix_enabled = false;
222 } else libcon_badusage();
223 }
224
4/4
✓ Branch 112 → 113 taken 100 times.
✓ Branch 112 → 115 taken 300 times.
✓ Branch 139 → 140 taken 100 times.
✓ Branch 139 → 142 taken 300 times.
800 else if (checkstartmatch(par, "-I"))
225 {
226 200 postprocess_param = cmdlparam_addincludepath;
227 200 postprocess_arg = ((const char*)par) + strlen("-I");
228 }
229
4/4
✓ Branch 116 → 117 taken 200 times.
✓ Branch 116 → 119 taken 100 times.
✓ Branch 143 → 144 taken 200 times.
✓ Branch 143 → 146 taken 100 times.
600 else if (checkstartmatch(par, "-D"))
230 {
231 400 postprocess_param = cmdlparam_adddefine;
232 400 postprocess_arg = ((const char*)par) + strlen("-D");
233 }
234
2/4
✗ Branch 120 → 121 not taken.
✓ Branch 120 → 124 taken 100 times.
✗ Branch 147 → 148 not taken.
✓ Branch 147 → 151 taken 100 times.
200 else if (par == "--include")
235 {
236 postprocess_arg = libcon_option_value();
237 if (postprocess_arg != nullptr)
238 {
239 postprocess_param = cmdlparam_addincludepath;
240 }
241 }
242
2/4
✓ Branch 125 → 126 taken 100 times.
✗ Branch 125 → 129 not taken.
✓ Branch 152 → 153 taken 100 times.
✗ Branch 152 → 156 not taken.
200 else if (par == "--define")
243 {
244
2/4
✓ Branch 126 → 127 taken 100 times.
✗ Branch 126 → 627 not taken.
✓ Branch 153 → 154 taken 100 times.
✗ Branch 153 → 778 not taken.
200 postprocess_arg = libcon_option_value();
245
2/4
✓ Branch 127 → 128 taken 100 times.
✗ Branch 127 → 144 not taken.
✓ Branch 154 → 155 taken 100 times.
✗ Branch 154 → 171 not taken.
200 if (postprocess_arg != nullptr)
246 {
247 200 postprocess_param = cmdlparam_adddefine;
248 }
249 }
250 else if (checkstartmatch(par, "-w"))
251 {
252 const char* w_param = ((const char*)par) + strlen("-w");
253
254 if (checkstartmatch(w_param, "error"))
255 {
256 werror = true;
257 }
258 else if (checkstartmatch(w_param, "no"))
259 {
260 asar_warning_id warnid = parse_warning_id_from_string(w_param + strlen("no"), pass);
261
262 if (warnid != warning_id_end)
263 {
264 set_warning_enabled(warnid, false);
265 }
266 else
267 {
268 asar_throw_error(pass, error_type_null, error_id_invalid_warning_id, "-wno", (int)(warning_id_start + 1), (int)(warning_id_end - 1));
269 }
270 }
271 else
272 {
273 asar_warning_id warnid = parse_warning_id_from_string(w_param, pass);
274
275 if (warnid != warning_id_end)
276 {
277 set_warning_enabled(warnid, true);
278 }
279 else
280 {
281 asar_throw_error(pass, error_type_null, error_id_invalid_warning_id, "-w", (int)(warning_id_start + 1), (int)(warning_id_end - 1));
282 }
283 }
284
285 }
286 else libcon_badusage();
287
288
4/4
✓ Branch 144 → 145 taken 100 times.
✓ Branch 144 → 149 taken 300 times.
✓ Branch 171 → 172 taken 100 times.
✓ Branch 171 → 177 taken 300 times.
800 if (postprocess_param == cmdlparam_addincludepath)
289 {
290
4/8
✓ Branch 145 → 146 taken 100 times.
✗ Branch 145 → 528 not taken.
✓ Branch 146 → 147 taken 100 times.
✗ Branch 146 → 526 not taken.
✓ Branch 173 → 174 taken 100 times.
✗ Branch 173 → 648 not taken.
✓ Branch 174 → 175 taken 100 times.
✗ Branch 174 → 646 not taken.
200 includepaths.append(postprocess_arg);
291 }
292
2/4
✓ Branch 149 → 150 taken 300 times.
✗ Branch 149 → 205 not taken.
✓ Branch 177 → 178 taken 300 times.
✗ Branch 177 → 241 not taken.
600 else if (postprocess_param == cmdlparam_adddefine)
293 {
294
4/4
✓ Branch 150 → 151 taken 200 times.
✓ Branch 150 → 178 taken 100 times.
✓ Branch 178 → 179 taken 200 times.
✓ Branch 178 → 210 taken 100 times.
600 if (strchr(postprocess_arg, '=') != nullptr)
295 {
296 // argument contains value, not only name
297 400 const char* eq_loc = strchr(postprocess_arg, '=');
298
2/4
✓ Branch 151 → 152 taken 200 times.
✗ Branch 151 → 531 not taken.
✓ Branch 180 → 181 taken 200 times.
✗ Branch 180 → 652 not taken.
400 string name = string(postprocess_arg, (int)(eq_loc - postprocess_arg));
299
4/8
✓ Branch 152 → 153 taken 200 times.
✗ Branch 152 → 529 not taken.
✓ Branch 153 → 154 taken 200 times.
✗ Branch 153 → 529 not taken.
✓ Branch 181 → 182 taken 200 times.
✗ Branch 181 → 650 not taken.
✓ Branch 182 → 183 taken 200 times.
✗ Branch 182 → 650 not taken.
400 name = strip_whitespace(name);
300
4/8
✓ Branch 154 → 155 taken 200 times.
✗ Branch 154 → 529 not taken.
✓ Branch 155 → 156 taken 200 times.
✗ Branch 155 → 529 not taken.
✓ Branch 183 → 184 taken 200 times.
✗ Branch 183 → 650 not taken.
✓ Branch 184 → 185 taken 200 times.
✗ Branch 184 → 650 not taken.
400 name = strip_prefix(name, '!', false); // remove leading ! if present
301
302
4/12
✓ Branch 157 → 158 taken 200 times.
✗ Branch 157 → 529 not taken.
✗ Branch 158 → 159 not taken.
✓ Branch 158 → 161 taken 200 times.
✗ Branch 160 → 161 not taken.
✗ Branch 160 → 529 not taken.
✓ Branch 186 → 187 taken 200 times.
✗ Branch 186 → 650 not taken.
✗ Branch 187 → 188 not taken.
✓ Branch 187 → 190 taken 200 times.
✗ Branch 189 → 190 not taken.
✗ Branch 189 → 650 not taken.
400 if (!validatedefinename(name)) asar_throw_error(pass, error_type_null, error_id_cmdl_define_invalid, "command line defines", name.data());
303
304
4/8
✓ Branch 162 → 163 taken 200 times.
✗ Branch 162 → 529 not taken.
✗ Branch 163 → 164 not taken.
✓ Branch 163 → 169 taken 200 times.
✓ Branch 191 → 192 taken 200 times.
✗ Branch 191 → 650 not taken.
✗ Branch 192 → 193 not taken.
✓ Branch 192 → 198 taken 200 times.
400 if (clidefines.exists(name)) {
305 asar_throw_error(pass, error_type_null, error_id_cmdl_define_override, "Command line define", name.data());
306 pause(err);
307 return 1;
308 }
309
4/8
✓ Branch 170 → 171 taken 200 times.
✗ Branch 170 → 529 not taken.
✓ Branch 171 → 172 taken 200 times.
✗ Branch 171 → 529 not taken.
✓ Branch 199 → 200 taken 200 times.
✗ Branch 199 → 650 not taken.
✓ Branch 200 → 201 taken 200 times.
✗ Branch 200 → 650 not taken.
400 clidefines.create(name) = eq_loc + 1;
310
2/4
✓ Branch 174 → 175 taken 200 times.
✗ Branch 174 → 177 not taken.
✓ Branch 203 → 204 taken 200 times.
✗ Branch 203 → 205 not taken.
400 }
311 else
312 {
313 // argument doesn't have a value, only name
314
2/4
✓ Branch 178 → 179 taken 100 times.
✗ Branch 178 → 534 not taken.
✓ Branch 211 → 212 taken 100 times.
✗ Branch 211 → 656 not taken.
200 string name = postprocess_arg;
315
4/8
✓ Branch 179 → 180 taken 100 times.
✗ Branch 179 → 532 not taken.
✓ Branch 180 → 181 taken 100 times.
✗ Branch 180 → 532 not taken.
✓ Branch 212 → 213 taken 100 times.
✗ Branch 212 → 654 not taken.
✓ Branch 213 → 214 taken 100 times.
✗ Branch 213 → 654 not taken.
200 name = strip_whitespace(name);
316
4/8
✓ Branch 181 → 182 taken 100 times.
✗ Branch 181 → 532 not taken.
✓ Branch 182 → 183 taken 100 times.
✗ Branch 182 → 532 not taken.
✓ Branch 214 → 215 taken 100 times.
✗ Branch 214 → 654 not taken.
✓ Branch 215 → 216 taken 100 times.
✗ Branch 215 → 654 not taken.
200 name = strip_prefix(name, '!', false); // remove leading ! if present
317
318
4/12
✓ Branch 184 → 185 taken 100 times.
✗ Branch 184 → 532 not taken.
✗ Branch 185 → 186 not taken.
✓ Branch 185 → 188 taken 100 times.
✗ Branch 187 → 188 not taken.
✗ Branch 187 → 532 not taken.
✓ Branch 217 → 218 taken 100 times.
✗ Branch 217 → 654 not taken.
✗ Branch 218 → 219 not taken.
✓ Branch 218 → 221 taken 100 times.
✗ Branch 220 → 221 not taken.
✗ Branch 220 → 654 not taken.
200 if (!validatedefinename(name)) asar_throw_error(pass, error_type_null, error_id_cmdl_define_invalid, "command line defines", name.data());
319
320
4/8
✓ Branch 189 → 190 taken 100 times.
✗ Branch 189 → 532 not taken.
✗ Branch 190 → 191 not taken.
✓ Branch 190 → 196 taken 100 times.
✓ Branch 222 → 223 taken 100 times.
✗ Branch 222 → 654 not taken.
✗ Branch 223 → 224 not taken.
✓ Branch 223 → 229 taken 100 times.
200 if (clidefines.exists(name)) {
321 asar_throw_error(pass, error_type_null, error_id_cmdl_define_override, "Command line define", name.data());
322 pause(err);
323 return 1;
324 }
325
4/8
✓ Branch 197 → 198 taken 100 times.
✗ Branch 197 → 532 not taken.
✓ Branch 198 → 199 taken 100 times.
✗ Branch 198 → 532 not taken.
✓ Branch 230 → 231 taken 100 times.
✗ Branch 230 → 654 not taken.
✓ Branch 231 → 232 taken 100 times.
✗ Branch 231 → 654 not taken.
200 clidefines.create(name) = "";
326
2/4
✓ Branch 201 → 202 taken 100 times.
✗ Branch 201 → 204 not taken.
✓ Branch 234 → 235 taken 100 times.
✗ Branch 234 → 236 not taken.
200 }
327 }
328 }
329
2/4
✗ Branch 210 → 211 not taken.
✓ Branch 210 → 213 taken 100 times.
✗ Branch 246 → 247 not taken.
✓ Branch 246 → 249 taken 100 times.
200 if (verbose)
330 {
331 puts(version);
332 }
333
4/8
✓ Branch 213 → 214 taken 100 times.
✗ Branch 213 → 627 not taken.
✓ Branch 214 → 215 taken 100 times.
✗ Branch 214 → 627 not taken.
✓ Branch 250 → 251 taken 100 times.
✗ Branch 250 → 778 not taken.
✓ Branch 251 → 252 taken 100 times.
✗ Branch 251 → 778 not taken.
200 string asmname=libcon_require_filename("Enter patch name:");
334
4/8
✓ Branch 215 → 216 taken 100 times.
✗ Branch 215 → 625 not taken.
✓ Branch 216 → 217 taken 100 times.
✗ Branch 216 → 625 not taken.
✓ Branch 253 → 254 taken 100 times.
✗ Branch 253 → 776 not taken.
✓ Branch 254 → 255 taken 100 times.
✗ Branch 254 → 776 not taken.
200 string romname=libcon_optional_filename("Enter ROM name:", nullptr);
335 //char * outname=libcon_optional_filename("Enter output ROM name:", nullptr);
336
2/4
✓ Branch 217 → 218 taken 100 times.
✗ Branch 217 → 623 not taken.
✓ Branch 255 → 256 taken 100 times.
✗ Branch 255 → 774 not taken.
200 libcon_end();
337
4/20
✗ Branch 219 → 220 not taken.
✓ Branch 219 → 224 taken 100 times.
✗ Branch 221 → 222 not taken.
✗ Branch 221 → 623 not taken.
✗ Branch 222 → 223 not taken.
✗ Branch 222 → 224 not taken.
✗ Branch 225 → 226 not taken.
✓ Branch 225 → 227 taken 100 times.
✗ Branch 226 → 227 not taken.
✗ Branch 226 → 623 not taken.
✗ Branch 257 → 258 not taken.
✓ Branch 257 → 262 taken 100 times.
✗ Branch 259 → 260 not taken.
✗ Branch 259 → 774 not taken.
✗ Branch 260 → 261 not taken.
✗ Branch 260 → 262 not taken.
✗ Branch 263 → 264 not taken.
✓ Branch 263 → 265 taken 100 times.
✗ Branch 264 → 265 not taken.
✗ Branch 264 → 774 not taken.
200 if (!strchr(asmname, '.') && !file_exists(asmname)) asmname+=".asm";
338
4/8
✓ Branch 227 → 228 taken 100 times.
✗ Branch 227 → 623 not taken.
✗ Branch 228 → 229 not taken.
✓ Branch 228 → 257 taken 100 times.
✓ Branch 265 → 266 taken 100 times.
✗ Branch 265 → 774 not taken.
✗ Branch 266 → 267 not taken.
✓ Branch 266 → 305 taken 100 times.
200 if (!romname)
339 {
340 string romnametmp = get_base_name(asmname);
341 if (file_exists(romnametmp+".sfc")) romname=romnametmp+".sfc";
342 else if (file_exists(romnametmp+".smc")) romname=romnametmp+".smc";
343 else romname=STR romnametmp+".sfc";
344 }
345
4/16
✗ Branch 258 → 259 not taken.
✓ Branch 258 → 263 taken 100 times.
✗ Branch 260 → 261 not taken.
✗ Branch 260 → 623 not taken.
✗ Branch 261 → 262 not taken.
✗ Branch 261 → 263 not taken.
✗ Branch 264 → 265 not taken.
✓ Branch 264 → 281 taken 100 times.
✗ Branch 306 → 307 not taken.
✓ Branch 306 → 311 taken 100 times.
✗ Branch 308 → 309 not taken.
✗ Branch 308 → 774 not taken.
✗ Branch 309 → 310 not taken.
✗ Branch 309 → 311 not taken.
✗ Branch 312 → 313 not taken.
✓ Branch 312 → 337 taken 100 times.
200 else if (!strchr(romname, '.') && !file_exists(romname))
346 {
347 if (file_exists(STR romname+".sfc")) romname+=".sfc";
348 else if (file_exists(STR romname+".smc")) romname+=".smc";
349 }
350
4/8
✓ Branch 282 → 283 taken 100 times.
✗ Branch 282 → 623 not taken.
✗ Branch 283 → 284 not taken.
✓ Branch 283 → 289 taken 100 times.
✓ Branch 338 → 339 taken 100 times.
✗ Branch 338 → 774 not taken.
✗ Branch 339 → 340 not taken.
✓ Branch 339 → 345 taken 100 times.
200 if (!file_exists(romname))
351 {
352 FILE * f=fopen(romname, "wb");
353 if (!f)
354 {
355 asar_throw_error(pass, error_type_fatal, error_id_create_rom_failed);
356 }
357 fclose(f);
358 }
359
4/8
✓ Branch 290 → 291 taken 100 times.
✗ Branch 290 → 623 not taken.
✗ Branch 291 → 292 not taken.
✓ Branch 291 → 297 taken 100 times.
✓ Branch 346 → 347 taken 100 times.
✗ Branch 346 → 774 not taken.
✗ Branch 347 → 348 not taken.
✓ Branch 347 → 353 taken 100 times.
200 if (!openrom(romname, false))
360 {
361 thisfilename= nullptr;
362 asar_throw_error(pass, error_type_null, openromerror);
363 pause(err);
364 return 1;
365 }
366 //check if the ROM title and checksum looks sane
367
6/8
✓ Branch 297 → 298 taken 28 times.
✓ Branch 297 → 350 taken 72 times.
✓ Branch 298 → 299 taken 28 times.
✗ Branch 298 → 350 not taken.
✓ Branch 353 → 354 taken 28 times.
✓ Branch 353 → 422 taken 72 times.
✓ Branch 354 → 355 taken 28 times.
✗ Branch 354 → 422 not taken.
200 if (romlen>=32768 && !ignoretitleerrors)
368 {
369
2/4
✓ Branch 299 → 300 taken 28 times.
✗ Branch 299 → 623 not taken.
✓ Branch 355 → 356 taken 28 times.
✗ Branch 355 → 774 not taken.
56 bool validtitle=setmapper();
370
2/4
✗ Branch 300 → 301 not taken.
✓ Branch 300 → 350 taken 28 times.
✗ Branch 356 → 357 not taken.
✓ Branch 356 → 422 taken 28 times.
56 if (!validtitle)
371 {
372 string title;
373 for (int i=0;i<21;i++)
374 {
375 unsigned char c=romdata[snestopc(0x00FFC0+i)];
376 if (c==7) c=14;
377 if (c==8) c=27;//to not generate more hard-to-print characters than needed
378 if (c==9) c=26;//random characters are picked in accordance with the charset Windows-1252, but they should be garbage in all charsets
379 if (c=='\r') c=17;
380 if (c=='\n') c=25;
381 if (c=='\0') c=155;
382 title+=(char)c;
383 }
384 if (libcon_interactive)
385 {
386 if (!libcon_question_bool(STR"Warning: The ROM title appears to be \""+title+"\", which looks like garbage. "
387 "Is this your ROM title? (Note that inproperly answering \"yes\" will crash your ROM.)", false))
388 {
389 puts("Assembling aborted. snespurify should be able to fix your ROM.");
390 return 1;
391 }
392 }
393 else
394 {
395 puts(STR"Error: The ROM title appears to be \""+title+"\", which looks like garbage. "
396 "If this is the ROM title, add --no-title-check to the command line options. If the ROM title is something else, use snespurify on your ROM.");
397 pause(err);
398 return 1;
399 }
400 }
401 }
402
403
4/8
✓ Branch 350 → 351 taken 100 times.
✗ Branch 350 → 591 not taken.
✓ Branch 351 → 352 taken 100 times.
✗ Branch 351 → 589 not taken.
✓ Branch 424 → 425 taken 100 times.
✗ Branch 424 → 732 not taken.
✓ Branch 425 → 426 taken 100 times.
✗ Branch 425 → 730 not taken.
200 string stdincludespath = STR dir(argv[0]) + "stdincludes.txt";
404
2/4
✓ Branch 354 → 355 taken 100 times.
✗ Branch 354 → 621 not taken.
✓ Branch 429 → 430 taken 100 times.
✗ Branch 429 → 772 not taken.
200 parse_std_includes(stdincludespath, includepaths);
405
406
4/4
✓ Branch 360 → 356 taken 200 times.
✓ Branch 360 → 361 taken 100 times.
✓ Branch 437 → 431 taken 200 times.
✓ Branch 437 → 438 taken 100 times.
600 for (int i = 0; i < includepaths.count; ++i)
407 {
408
4/8
✓ Branch 356 → 357 taken 200 times.
✗ Branch 356 → 592 not taken.
✓ Branch 358 → 359 taken 200 times.
✗ Branch 358 → 592 not taken.
✓ Branch 432 → 433 taken 200 times.
✗ Branch 432 → 734 not taken.
✓ Branch 434 → 435 taken 200 times.
✗ Branch 434 → 734 not taken.
400 includepath_cstrs.append((const char*)includepaths[i]);
409 }
410
411 200 size_t includepath_count = (size_t)includepath_cstrs.count;
412
2/4
✓ Branch 361 → 362 taken 100 times.
✗ Branch 361 → 621 not taken.
✓ Branch 439 → 440 taken 100 times.
✗ Branch 439 → 772 not taken.
200 virtual_filesystem new_filesystem;
413
4/8
✓ Branch 362 → 363 taken 100 times.
✗ Branch 362 → 619 not taken.
✓ Branch 363 → 364 taken 100 times.
✗ Branch 363 → 619 not taken.
✓ Branch 440 → 441 taken 100 times.
✗ Branch 440 → 770 not taken.
✓ Branch 441 → 442 taken 100 times.
✗ Branch 441 → 770 not taken.
200 new_filesystem.initialize(&includepath_cstrs[0], includepath_count);
414 200 filesystem = &new_filesystem;
415
416
4/8
✓ Branch 364 → 365 taken 100 times.
✗ Branch 364 → 595 not taken.
✓ Branch 365 → 366 taken 100 times.
✗ Branch 365 → 593 not taken.
✓ Branch 444 → 445 taken 100 times.
✗ Branch 444 → 738 not taken.
✓ Branch 445 → 446 taken 100 times.
✗ Branch 445 → 736 not taken.
200 string stddefinespath = STR dir(argv[0]) + "stddefines.txt";
417
2/4
✓ Branch 368 → 369 taken 100 times.
✗ Branch 368 → 617 not taken.
✓ Branch 449 → 450 taken 100 times.
✗ Branch 449 → 768 not taken.
200 parse_std_defines(stddefinespath);
418
419
4/4
✓ Branch 375 → 370 taken 296 times.
✓ Branch 375 → 376 taken 98 times.
✓ Branch 456 → 451 taken 296 times.
✓ Branch 456 → 457 taken 98 times.
788 for (pass=0;pass<3;pass++)
420 {
421 //pass 1: find which bank all labels are in, for label optimizations
422 // freespaces are listed as above 0xFFFFFF, to find if it's in the ROM or if it's dynamic
423 //pass 2: find where exactly all labels are
424 //pass 3: assemble it all
425
2/4
✓ Branch 370 → 371 taken 296 times.
✗ Branch 370 → 617 not taken.
✓ Branch 451 → 452 taken 296 times.
✗ Branch 451 → 768 not taken.
592 initstuff();
426
4/4
✓ Branch 372 → 373 taken 294 times.
✓ Branch 372 → 617 taken 2 times.
✓ Branch 453 → 454 taken 294 times.
✓ Branch 453 → 768 taken 2 times.
592 assemblefile(asmname, true);
427
2/4
✓ Branch 373 → 374 taken 294 times.
✗ Branch 373 → 617 not taken.
✓ Branch 454 → 455 taken 294 times.
✗ Branch 454 → 768 not taken.
588 finishpass();
428 }
429
430
2/4
✓ Branch 376 → 377 taken 98 times.
✗ Branch 376 → 617 not taken.
✓ Branch 457 → 458 taken 98 times.
✗ Branch 457 → 768 not taken.
196 closecachedfiles(); // this needs the vfs so do it before destroying it
431
2/4
✓ Branch 377 → 378 taken 98 times.
✗ Branch 377 → 617 not taken.
✓ Branch 458 → 459 taken 98 times.
✗ Branch 458 → 768 not taken.
196 new_filesystem.destroy();
432 196 filesystem = nullptr;
433
434
2/12
✗ Branch 378 → 379 not taken.
✓ Branch 378 → 381 taken 98 times.
✗ Branch 379 → 380 not taken.
✗ Branch 379 → 381 not taken.
✗ Branch 380 → 381 not taken.
✗ Branch 380 → 617 not taken.
✗ Branch 459 → 460 not taken.
✓ Branch 459 → 462 taken 98 times.
✗ Branch 460 → 461 not taken.
✗ Branch 460 → 462 not taken.
✗ Branch 461 → 462 not taken.
✗ Branch 461 → 768 not taken.
196 if (werror && warned) asar_throw_error(pass, error_type_null, error_id_werror);
435
6/8
✓ Branch 381 → 382 taken 93 times.
✓ Branch 381 → 383 taken 5 times.
✓ Branch 382 → 383 taken 93 times.
✗ Branch 382 → 617 not taken.
✓ Branch 462 → 463 taken 93 times.
✓ Branch 462 → 464 taken 5 times.
✓ Branch 463 → 464 taken 93 times.
✗ Branch 463 → 768 not taken.
196 if (checksum_fix_enabled) fixchecksum();
436 //if (pcpos>romlen) romlen=pcpos;
437
4/4
✓ Branch 383 → 384 taken 20 times.
✓ Branch 383 → 390 taken 78 times.
✓ Branch 464 → 465 taken 20 times.
✓ Branch 464 → 471 taken 78 times.
196 if (errored)
438 {
439
2/4
✓ Branch 384 → 385 taken 20 times.
✗ Branch 384 → 617 not taken.
✓ Branch 465 → 466 taken 20 times.
✗ Branch 465 → 768 not taken.
40 puts("Errors were detected while assembling the patch. Assembling aborted. Your ROM has not been modified.");
440
2/4
✓ Branch 385 → 386 taken 20 times.
✗ Branch 385 → 617 not taken.
✓ Branch 466 → 467 taken 20 times.
✗ Branch 466 → 768 not taken.
40 closerom(false);
441
2/4
✓ Branch 386 → 387 taken 20 times.
✗ Branch 386 → 617 not taken.
✓ Branch 467 → 468 taken 20 times.
✗ Branch 467 → 768 not taken.
40 reseteverything();
442
2/8
✗ Branch 387 → 388 not taken.
✓ Branch 387 → 389 taken 20 times.
✗ Branch 388 → 389 not taken.
✗ Branch 388 → 617 not taken.
✗ Branch 468 → 469 not taken.
✓ Branch 468 → 470 taken 20 times.
✗ Branch 469 → 470 not taken.
✗ Branch 469 → 768 not taken.
40 pause(err);
443 40 return 1;
444 }
445
4/4
✓ Branch 390 → 391 taken 15 times.
✓ Branch 390 → 402 taken 63 times.
✓ Branch 471 → 472 taken 15 times.
✓ Branch 471 → 483 taken 63 times.
156 if (warned)
446 {
447
2/4
✗ Branch 391 → 392 not taken.
✓ Branch 391 → 398 taken 15 times.
✗ Branch 472 → 473 not taken.
✓ Branch 472 → 479 taken 15 times.
30 if (libcon_interactive)
448 {
449 if (!libcon_question_bool("One or more warnings were detected while assembling the patch. "
450 "Do you want insert the patch anyways? (Default: yes)", true))
451 {
452 puts("ROM left unchanged.");
453 closerom(false);
454 reseteverything();
455 return 1;
456 }
457 }
458 else
459 {
460
2/8
✗ Branch 398 → 399 not taken.
✓ Branch 398 → 400 taken 15 times.
✗ Branch 399 → 400 not taken.
✗ Branch 399 → 617 not taken.
✗ Branch 479 → 480 not taken.
✓ Branch 479 → 481 taken 15 times.
✗ Branch 480 → 481 not taken.
✗ Branch 480 → 768 not taken.
30 if (verbose) puts("Assembling completed, but one or more warnings were detected.");
461
2/8
✗ Branch 400 → 401 not taken.
✓ Branch 400 → 406 taken 15 times.
✗ Branch 401 → 406 not taken.
✗ Branch 401 → 617 not taken.
✗ Branch 481 → 482 not taken.
✓ Branch 481 → 487 taken 15 times.
✗ Branch 482 → 487 not taken.
✗ Branch 482 → 768 not taken.
30 pause(warn);
462 }
463 }
464 else
465 {
466
2/8
✗ Branch 402 → 403 not taken.
✓ Branch 402 → 404 taken 63 times.
✗ Branch 403 → 404 not taken.
✗ Branch 403 → 617 not taken.
✗ Branch 483 → 484 not taken.
✓ Branch 483 → 485 taken 63 times.
✗ Branch 484 → 485 not taken.
✗ Branch 484 → 768 not taken.
126 if (verbose) puts("Assembling completed without problems.");
467
2/8
✗ Branch 404 → 405 not taken.
✓ Branch 404 → 406 taken 63 times.
✗ Branch 405 → 406 not taken.
✗ Branch 405 → 617 not taken.
✗ Branch 485 → 486 not taken.
✓ Branch 485 → 487 taken 63 times.
✗ Branch 486 → 487 not taken.
✗ Branch 486 → 768 not taken.
126 pause(yes);
468 }
469
2/4
✓ Branch 406 → 407 taken 78 times.
✗ Branch 406 → 617 not taken.
✓ Branch 487 → 488 taken 78 times.
✗ Branch 487 → 768 not taken.
156 unsigned int romCrc = closerom();
470
4/8
✓ Branch 407 → 408 taken 78 times.
✗ Branch 407 → 617 not taken.
✗ Branch 408 → 409 not taken.
✓ Branch 408 → 445 taken 78 times.
✓ Branch 488 → 489 taken 78 times.
✗ Branch 488 → 768 not taken.
✗ Branch 489 → 490 not taken.
✓ Branch 489 → 541 taken 78 times.
156 if (symbols)
471 {
472 if (!symfilename) symfilename = get_base_name(romname)+".sym";
473 string contents = create_symbols_file(symbols, romCrc);
474 FILE * symfile = fopen(symfilename, "wt");
475 if (!symfile)
476 {
477 puts(STR"Failed to create symbols file: \"" + symfilename + "\".");
478 pause(err);
479 return 1;
480 }
481 else
482 {
483 fputs(contents, symfile);
484 fclose(symfile);
485 }
486 }
487
2/4
✓ Branch 445 → 446 taken 78 times.
✗ Branch 445 → 617 not taken.
✓ Branch 541 → 542 taken 78 times.
✗ Branch 541 → 768 not taken.
156 reseteverything();
488
44/44
✓ Branch 448 → 449 taken 78 times.
✓ Branch 448 → 450 taken 20 times.
✓ Branch 452 → 453 taken 78 times.
✓ Branch 452 → 454 taken 20 times.
✓ Branch 456 → 457 taken 78 times.
✓ Branch 456 → 458 taken 20 times.
✓ Branch 460 → 461 taken 78 times.
✓ Branch 460 → 462 taken 20 times.
✓ Branch 464 → 465 taken 78 times.
✓ Branch 464 → 466 taken 20 times.
✓ Branch 468 → 469 taken 78 times.
✓ Branch 468 → 470 taken 20 times.
✓ Branch 472 → 473 taken 78 times.
✓ Branch 472 → 474 taken 20 times.
✓ Branch 476 → 477 taken 78 times.
✓ Branch 476 → 478 taken 20 times.
✓ Branch 480 → 481 taken 78 times.
✓ Branch 480 → 482 taken 20 times.
✓ Branch 484 → 485 taken 78 times.
✓ Branch 484 → 486 taken 20 times.
✓ Branch 488 → 489 taken 78 times.
✓ Branch 488 → 491 taken 20 times.
✓ Branch 544 → 545 taken 78 times.
✓ Branch 544 → 546 taken 20 times.
✓ Branch 548 → 549 taken 78 times.
✓ Branch 548 → 550 taken 20 times.
✓ Branch 552 → 553 taken 78 times.
✓ Branch 552 → 554 taken 20 times.
✓ Branch 556 → 557 taken 78 times.
✓ Branch 556 → 558 taken 20 times.
✓ Branch 560 → 561 taken 78 times.
✓ Branch 560 → 562 taken 20 times.
✓ Branch 564 → 565 taken 78 times.
✓ Branch 564 → 566 taken 20 times.
✓ Branch 568 → 569 taken 78 times.
✓ Branch 568 → 570 taken 20 times.
✓ Branch 572 → 573 taken 78 times.
✓ Branch 572 → 574 taken 20 times.
✓ Branch 576 → 577 taken 78 times.
✓ Branch 576 → 578 taken 20 times.
✓ Branch 580 → 581 taken 78 times.
✓ Branch 580 → 582 taken 20 times.
✓ Branch 584 → 585 taken 78 times.
✓ Branch 584 → 586 taken 20 times.
640 }
489
2/4
✗ Branch 640 → 641 not taken.
✓ Branch 640 → 642 taken 2 times.
✗ Branch 802 → 803 not taken.
✓ Branch 802 → 804 taken 2 times.
4 catch(errfatal&)
490 {
491
2/4
✓ Branch 643 → 644 taken 2 times.
✗ Branch 643 → 649 not taken.
✓ Branch 805 → 806 taken 2 times.
✗ Branch 805 → 811 not taken.
4 puts("A fatal error was detected while assembling the patch. Assembling aborted. Your ROM has not been modified.");
492
2/4
✓ Branch 644 → 645 taken 2 times.
✗ Branch 644 → 649 not taken.
✓ Branch 806 → 807 taken 2 times.
✗ Branch 806 → 811 not taken.
4 closerom(false);
493
2/4
✓ Branch 645 → 646 taken 2 times.
✗ Branch 645 → 649 not taken.
✓ Branch 807 → 808 taken 2 times.
✗ Branch 807 → 811 not taken.
4 reseteverything();
494
2/8
✗ Branch 646 → 647 not taken.
✓ Branch 646 → 648 taken 2 times.
✗ Branch 647 → 648 not taken.
✗ Branch 647 → 649 not taken.
✗ Branch 808 → 809 not taken.
✓ Branch 808 → 810 taken 2 times.
✗ Branch 809 → 810 not taken.
✗ Branch 809 → 811 not taken.
4 pause(err);
495 4 return 1;
496 4 }
497 156 return 0;
498 }
499