asar coverage - build #


src/asar/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
54 of 103, 0 excluded
52.4%
Functions:
10 of 15, 0 excluded
66.7%
Branches:
30 of 169, 0 excluded
17.8%

libcon.cpp
Line Branch Exec Source
1 #include "libcon.h"
2 #include "libstr.h"
3 #include "unicode.h"
4 #include <csignal>
5
6 #ifdef windows
7 // for readconsole
8 #include <windows.h>
9 #endif
10
11 static const char * progname;
12 static const char ** args;
13 static int argsleft;
14 bool libcon_interactive;
15 static const char * usage;
16
17 static bool confirmclose=true;
18 void libcon_pause()
19 {
20 if (confirmclose)
21 {
22 confirmclose=false;
23 #if defined(_WIN32)
24 system("pause");
25 #else
26 printf("Press Enter to continue");
27 fflush(stdout);
28 getchar();
29 #endif
30 confirmclose=true;
31 }
32 }
33
34 void libcon_badusage()
35 {
36 printf("usage: %s %s", progname, usage);
37 exit(1);
38 }
39
40 8 static const char * getarg(bool tellusage, const char * defval= nullptr)
41 {
42
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 6 taken 8 times.
8 if (!argsleft)
43 {
44 if (tellusage) libcon_badusage();
45 return defval;
46 }
47 8 args++;
48 8 argsleft--;
49 8 return args[0];
50 }
51
52 2 static bool u8_fgets(char* buffer, int buffer_size, FILE* handle)
53 {
54 #if defined(windows)
55 // RPG Hacker: Using buffer_size * 2 here to account for potential surrogate pairs.
56 // The idea is that our buffer here should be able to at least hold the same amount
57 // of characters as the old ANSI version would have supported.
58 DWORD num_chars = buffer_size * 2;
59 wchar_t* w_buf = (wchar_t*)malloc(num_chars * sizeof(wchar_t));
60 // this was originally using fgetws, but it was broken on mingw for some
61 // weird reason. (or, more specifically, msvcrt.dll is broken. msvc itself
62 // doesn't use that one.)
63 BOOL res = ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), w_buf, num_chars-1, &num_chars, nullptr);
64 if(!res) { free(w_buf); return false; }
65 w_buf[num_chars] = 0;
66 //(void)fgetws(w_buf, num_chars, stdin);
67 string u8_str;
68 if (utf16_to_utf8(&u8_str, w_buf))
69 {
70 strncpy(buffer, u8_str, buffer_size);
71 buffer[buffer_size-1] = '\0';
72 // no point doing more than 1 since the next function cuts off input at the first newline anyways
73 if(strchr(buffer, '\r')) *(strchr(buffer, '\r')) = '\n';
74 }
75 free(w_buf);
76 return true;
77 #else
78
1/2
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 2 times.
2 char* out = fgets(buffer, buffer_size, handle);
79 2 return (out != NULL);
80 #endif
81 }
82
83 1 static const char * requirestrfromuser(const char * question, bool filename)
84 {
85 1 confirmclose=false;
86 1 char * rval=(char*)malloc(256);
87 1 *rval=0;
88
4/13
✗ Branch 9 → 3 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 10 → 3 not taken.
✗ Branch 10 → 11 not taken.
✗ Branch 12 → 3 not taken.
✗ Branch 12 → 13 not taken.
✗ Branch 13 → 3 not taken.
✗ Branch 13 → 14 not taken.
✓ Branch 13 → 15 taken 2 times.
✓ Branch 15 → 4 taken 1 time.
✓ Branch 15 → 16 taken 1 time.
✗ Branch 17 → 4 not taken.
✓ Branch 17 → 18 taken 1 time.
2 while (!strchr(rval, '\n') || *rval=='\n')
89 {
90 1 *rval=0;
91 1 printf("%s ", question);
92 1 fflush(stdout);
93
1/5
✗ Branch 6 → 7 not taken.
✗ Branch 6 → 9 not taken.
✗ Branch 8 → 9 not taken.
✗ Branch 8 → 12 not taken.
✓ Branch 8 → 13 taken 1 time.
1 if(!u8_fgets(rval, 250, stdin)) {
94 fprintf(stderr, "Unexpected end of input\n");
95 exit(1);
96 }
97 }
98
1/2
✗ Branch 18 → 19 not taken.
✓ Branch 18 → 20 taken 1 time.
1 *strchr(rval, '\n')=0;
99 1 confirmclose=true;
100 #ifdef _WIN32
101 if (filename && rval[0]=='"' && rval[2]==':')
102 {
103 char * rvalend=strchr(rval, '\0');
104 if (rvalend[-1]=='"') rvalend[-1]='\0';
105 return rval+1;
106 }
107 #endif
108 1 return rval;
109 }
110
111 1 static const char * requeststrfromuser(const char * question, bool filename, const char * defval)
112 {
113 1 confirmclose=false;
114 1 char * rval=(char*)malloc(256);
115 1 *rval=0;
116 1 printf("%s ", question);
117 1 fflush(stdout);
118
1/6
✗ Branch 5 → 6 not taken.
✗ Branch 5 → 7 not taken.
✗ Branch 6 → 7 not taken.
✓ Branch 6 → 8 taken 1 time.
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
1 if(!u8_fgets(rval, 250, stdin)) return defval;
119
1/2
✗ Branch 8 → 9 not taken.
✓ Branch 8 → 10 taken 1 time.
1 char *eol = strchr(rval, '\n');
120
1/6
✗ Branch 7 → 8 not taken.
✗ Branch 7 → 9 not taken.
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 10 → 11 not taken.
✓ Branch 10 → 12 taken 1 time.
1 if(!eol) return defval;
121 1 *eol = 0;
122 1 confirmclose=true;
123
1/6
✗ Branch 9 → 10 not taken.
✗ Branch 9 → 11 not taken.
✗ Branch 11 → 12 not taken.
✗ Branch 11 → 13 not taken.
✗ Branch 14 → 15 not taken.
✓ Branch 14 → 16 taken 1 time.
1 if (!*rval) return defval;
124 #ifdef _WIN32
125 if (filename && rval[0]=='"' && rval[2]==':')
126 {
127 char * rvalend=strchr(rval, '\0');
128 if (rvalend[-1]=='"') rvalend[-1]='\0';
129 return rval+1;
130 }
131 #endif
132 1 return rval;
133 }
134
135 3 void libcon_init(int argc, const char ** argv, const char * usage_)
136 {
137 3 progname=argv[0];
138 3 args=argv;
139 3 argsleft=argc-1;
140 3 usage=usage_;
141 3 libcon_interactive=(!argsleft);
142 #if defined(_WIN32)
143 if (libcon_interactive) atexit(libcon_pause);
144 #endif
145 3 }
146
147 3 const char * libcon_require_filename(const char * desc)
148 {
149
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 3 times.
✗ Branch 2 → 5 not taken.
✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 7 taken 2 times.
3 if (libcon_interactive) return requirestrfromuser(desc, true);
150 2 else return getarg(true);
151 }
152
153 const char * libcon_optional(const char * desc, const char * defval)
154 {
155 if (libcon_interactive) return requeststrfromuser(desc, false, defval);
156 else return getarg(false, defval);
157 }
158
159 3 const char * libcon_optional_filename(const char * desc, const char * defval)
160 {
161
3/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 3 times.
✗ Branch 2 → 5 not taken.
✓ Branch 4 → 5 taken 1 time.
✓ Branch 4 → 7 taken 2 times.
3 if (libcon_interactive) return requeststrfromuser(desc, true, defval);
162 2 else return getarg(false, defval);
163 }
164
165 6 const char * libcon_option()
166 {
167
6/12
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 6 times.
✗ Branch 2 → 7 not taken.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 7 not taken.
✓ Branch 4 → 5 taken 5 times.
✗ Branch 4 → 7 not taken.
✓ Branch 4 → 12 taken 1 time.
✓ Branch 5 → 6 taken 5 times.
✗ Branch 5 → 12 not taken.
✓ Branch 9 → 10 taken 3 times.
✓ Branch 9 → 12 taken 2 times.
6 if (!libcon_interactive && argsleft && args[1][0]=='-') return getarg(false);
168 3 return nullptr;
169 }
170
171 1 const char * libcon_option_value()
172 {
173
2/5
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 1 time.
✗ Branch 2 → 5 not taken.
✓ Branch 4 → 5 taken 1 time.
✗ Branch 4 → 7 not taken.
1 if (!libcon_interactive) return getarg(false);
174 return nullptr;
175 }
176
177 bool libcon_question_bool(const char * desc, bool defval)
178 {
179 if (!libcon_interactive) return defval;
180 while (true)
181 {
182 const char * answer=requeststrfromuser(desc, false, defval?"y":"n");
183 if (!stricmp(answer, "y") || !stricmp(answer, "yes")) return true;
184 if (!stricmp(answer, "n") || !stricmp(answer, "no")) return false;
185 }
186 }
187
188 3 void libcon_end()
189 {
190
4/9
✗ Branch 2 → 3 not taken.
✓ Branch 2 → 4 taken 3 times.
✗ Branch 2 → 5 not taken.
✗ Branch 3 → 4 not taken.
✗ Branch 3 → 5 not taken.
✓ Branch 4 → 5 taken 2 times.
✓ Branch 4 → 7 taken 1 time.
✗ Branch 5 → 6 not taken.
✓ Branch 5 → 7 taken 2 times.
3 if (!libcon_interactive && argsleft) libcon_badusage();
191 3 }
192