asar coverage - build #259


src/asar/
File: src/asar/libstr.h
Date: 2025-02-26 19:38:12
Lines:
198/210
94.3%
Functions:
55/57
96.5%
Branches:
501/718
69.8%

Line Branch Exec Source
1 #pragma once
2
3 #include "std-includes.h"
4 #include "libmisc.h"
5 #include <cstdint>
6 #include <cstring>
7 #include <utility>
8 #include <string_view>
9
10 //ty alcaro
11 extern const unsigned char char_props[256];
12 6309747 static inline int to_lower(unsigned char c) { return c|(char_props[c]&0x20); }
13 static inline int to_upper(unsigned char c) { return c&~(char_props[c]&0x20); }
14
15
10/10
✓ Branch 0 taken 74856 times.
✓ Branch 1 taken 29100 times.
✓ Branch 2 taken 74766 times.
✓ Branch 3 taken 72 times.
✓ Branch 4 taken 288 times.
✓ Branch 5 taken 90 times.
✓ Branch 6 taken 2616 times.
✓ Branch 7 taken 6534 times.
✓ Branch 8 taken 2679 times.
✓ Branch 9 taken 2616 times.
786915 inline bool is_space(unsigned char c) { return char_props[c] & 0x80; } // C standard says \f \v are space, but this one disagrees
16 // TODO is this opaque table lookup really faster than c >= '0' && c <= '9'?
17 151082 inline bool is_digit(unsigned char c) { return char_props[c] & 0x40; }
18 inline bool is_alpha(unsigned char c) { return char_props[c] & 0x20; }
19 4200 inline bool is_lower(unsigned char c) { return char_props[c] & 0x04; }
20 5862 inline bool is_upper(unsigned char c) { return char_props[c] & 0x02; }
21 inline bool is_alnum(unsigned char c) { return char_props[c] & 0x60; }
22 42189 inline bool is_ualpha(unsigned char c) { return char_props[c] & 0x28; }
23 403427 inline bool is_ualnum(unsigned char c) { return char_props[c] & 0x68; }
24
4/4
✓ Branch 0 taken 9558 times.
✓ Branch 1 taken 10431 times.
✓ Branch 2 taken 810 times.
✓ Branch 3 taken 288 times.
42280 inline bool is_xdigit(unsigned char c) { return char_props[c] & 0x01; }
25
26 2289466 inline char *copy(const char *source, int copy_length, char *dest)
27 {
28 5079281 memcpy(dest, source, copy_length*sizeof(char));
29 2289466 return dest;
30 }
31
32 class string {
33 public:
34 5044849 const char *data() const
35 {
36
231/347
✓ Branch 0 taken 5276 times.
✓ Branch 1 taken 978136 times.
✓ Branch 2 taken 962964 times.
✓ Branch 3 taken 3177 times.
✓ Branch 4 taken 2016 times.
✓ Branch 5 taken 18187 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 4093 times.
✓ Branch 8 taken 870 times.
✓ Branch 9 taken 5280 times.
✓ Branch 10 taken 16995 times.
✓ Branch 11 taken 2547 times.
✓ Branch 12 taken 783 times.
✓ Branch 13 taken 16015 times.
✓ Branch 14 taken 387 times.
✓ Branch 15 taken 744 times.
✓ Branch 16 taken 16203 times.
✓ Branch 17 taken 684 times.
✓ Branch 18 taken 464 times.
✓ Branch 19 taken 11238 times.
✓ Branch 20 taken 288 times.
✓ Branch 21 taken 5500 times.
✓ Branch 22 taken 269 times.
✓ Branch 23 taken 381 times.
✓ Branch 24 taken 462 times.
✓ Branch 25 taken 948 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2079 times.
✓ Branch 28 taken 890 times.
✓ Branch 29 taken 90 times.
✓ Branch 30 taken 211 times.
✓ Branch 31 taken 664 times.
✓ Branch 32 taken 216 times.
✓ Branch 33 taken 1116 times.
✓ Branch 34 taken 953 times.
✓ Branch 35 taken 1008 times.
✓ Branch 36 taken 1056 times.
✓ Branch 37 taken 254 times.
✓ Branch 38 taken 18 times.
✓ Branch 39 taken 5328 times.
✓ Branch 40 taken 207 times.
✓ Branch 41 taken 6066 times.
✓ Branch 42 taken 1427 times.
✓ Branch 43 taken 36414 times.
✓ Branch 44 taken 27 times.
✓ Branch 45 taken 82230 times.
✓ Branch 46 taken 172 times.
✓ Branch 47 taken 18 times.
✓ Branch 48 taken 83415 times.
✓ Branch 49 taken 168 times.
✓ Branch 50 taken 27 times.
✓ Branch 51 taken 86919 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 855 times.
✓ Branch 54 taken 86136 times.
✓ Branch 55 taken 774 times.
✓ Branch 56 taken 18 times.
✓ Branch 57 taken 124 times.
✓ Branch 58 taken 336 times.
✓ Branch 59 taken 30 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 120 times.
✓ Branch 62 taken 27 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 90 times.
✓ Branch 65 taken 142 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1239 times.
✓ Branch 68 taken 28 times.
✓ Branch 69 taken 39 times.
✓ Branch 70 taken 67059 times.
✓ Branch 71 taken 15160 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 75 times.
✓ Branch 74 taken 16260 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 45 times.
✓ Branch 77 taken 16269 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 84 times.
✓ Branch 80 taken 584 times.
✓ Branch 81 taken 3 times.
✓ Branch 82 taken 442 times.
✓ Branch 83 taken 124 times.
✗ Branch 84 not taken.
✓ Branch 85 taken 15833 times.
✗ Branch 86 not taken.
✗ Branch 87 not taken.
✓ Branch 88 taken 61599 times.
✓ Branch 89 taken 15021 times.
✗ Branch 90 not taken.
✓ Branch 91 taken 36 times.
✓ Branch 92 taken 228 times.
✓ Branch 93 taken 15081 times.
✓ Branch 94 taken 84597 times.
✓ Branch 95 taken 411 times.
✓ Branch 96 taken 84674 times.
✓ Branch 97 taken 9 times.
✓ Branch 98 taken 402 times.
✓ Branch 99 taken 69264 times.
✓ Branch 100 taken 15414 times.
✓ Branch 101 taken 429 times.
✓ Branch 102 taken 162 times.
✓ Branch 103 taken 9 times.
✓ Branch 104 taken 38 times.
✓ Branch 105 taken 162 times.
✓ Branch 106 taken 9 times.
✓ Branch 107 taken 3923 times.
✗ Branch 108 not taken.
✓ Branch 109 taken 9 times.
✓ Branch 110 taken 20 times.
✓ Branch 111 taken 765 times.
✗ Branch 112 not taken.
✓ Branch 113 taken 105 times.
✓ Branch 114 taken 153 times.
✓ Branch 115 taken 54 times.
✓ Branch 116 taken 105 times.
✓ Branch 117 taken 54 times.
✓ Branch 118 taken 153 times.
✓ Branch 119 taken 150 times.
✓ Branch 120 taken 9 times.
✓ Branch 121 taken 153 times.
✓ Branch 122 taken 144 times.
✓ Branch 123 taken 9 times.
✓ Branch 124 taken 153 times.
✗ Branch 125 not taken.
✓ Branch 126 taken 90 times.
✓ Branch 127 taken 144 times.
✗ Branch 128 not taken.
✓ Branch 129 taken 2898 times.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✓ Branch 132 taken 2880 times.
✓ Branch 133 taken 9 times.
✗ Branch 134 not taken.
✓ Branch 135 taken 6 times.
✓ Branch 136 taken 9 times.
✗ Branch 137 not taken.
✓ Branch 138 taken 6 times.
✗ Branch 139 not taken.
✓ Branch 140 taken 9 times.
✓ Branch 141 taken 10828 times.
✓ Branch 142 taken 36 times.
✓ Branch 143 taken 9 times.
✗ Branch 144 not taken.
✓ Branch 145 taken 10828 times.
✗ Branch 146 not taken.
✓ Branch 147 taken 9 times.
✓ Branch 148 taken 10828 times.
✗ Branch 149 not taken.
✓ Branch 150 taken 9 times.
✓ Branch 151 taken 15586 times.
✗ Branch 152 not taken.
✓ Branch 153 taken 51 times.
✓ Branch 154 taken 45 times.
✓ Branch 155 taken 12 times.
✓ Branch 156 taken 345 times.
✓ Branch 157 taken 45 times.
✓ Branch 158 taken 348 times.
✗ Branch 159 not taken.
✓ Branch 160 taken 24 times.
✓ Branch 161 taken 5024 times.
✗ Branch 162 not taken.
✓ Branch 163 taken 24 times.
✓ Branch 164 taken 5024 times.
✗ Branch 165 not taken.
✓ Branch 166 taken 1423 times.
✓ Branch 167 taken 15552 times.
✗ Branch 168 not taken.
✓ Branch 169 taken 1165 times.
✓ Branch 170 taken 15651 times.
✗ Branch 171 not taken.
✓ Branch 172 taken 24 times.
✗ Branch 173 not taken.
✓ Branch 174 taken 186 times.
✗ Branch 175 not taken.
✓ Branch 176 taken 180 times.
✓ Branch 177 taken 48 times.
✗ Branch 178 not taken.
✓ Branch 179 taken 72 times.
✓ Branch 180 taken 12 times.
✗ Branch 181 not taken.
✓ Branch 182 taken 180 times.
✓ Branch 183 taken 12 times.
✗ Branch 184 not taken.
✓ Branch 185 taken 21 times.
✗ Branch 186 not taken.
✓ Branch 187 taken 21 times.
✗ Branch 188 not taken.
✓ Branch 189 taken 18 times.
✗ Branch 190 not taken.
✓ Branch 191 taken 27 times.
✗ Branch 192 not taken.
✓ Branch 193 taken 27 times.
✗ Branch 194 not taken.
✓ Branch 195 taken 9 times.
✗ Branch 196 not taken.
✓ Branch 197 taken 18 times.
✗ Branch 198 not taken.
✓ Branch 199 taken 27 times.
✗ Branch 200 not taken.
✓ Branch 201 taken 27 times.
✗ Branch 202 not taken.
✓ Branch 203 taken 9 times.
✗ Branch 204 not taken.
✓ Branch 205 taken 9 times.
✗ Branch 206 not taken.
✓ Branch 207 taken 18 times.
✗ Branch 208 not taken.
✓ Branch 209 taken 27 times.
✗ Branch 210 not taken.
✓ Branch 211 taken 27 times.
✗ Branch 212 not taken.
✓ Branch 213 taken 18 times.
✗ Branch 214 not taken.
✓ Branch 215 taken 27 times.
✗ Branch 216 not taken.
✓ Branch 217 taken 27 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 9 times.
✗ Branch 220 not taken.
✓ Branch 221 taken 9 times.
✗ Branch 222 not taken.
✓ Branch 223 taken 9 times.
✗ Branch 224 not taken.
✓ Branch 225 taken 18 times.
✗ Branch 226 not taken.
✓ Branch 227 taken 27 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 27 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 9 times.
✗ Branch 232 not taken.
✓ Branch 233 taken 18 times.
✗ Branch 234 not taken.
✓ Branch 235 taken 27 times.
✗ Branch 236 not taken.
✓ Branch 237 taken 27 times.
✗ Branch 238 not taken.
✓ Branch 239 taken 9 times.
✗ Branch 240 not taken.
✓ Branch 241 taken 9 times.
✗ Branch 242 not taken.
✓ Branch 243 taken 18 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 27 times.
✗ Branch 246 not taken.
✓ Branch 247 taken 27 times.
✗ Branch 248 not taken.
✓ Branch 249 taken 9 times.
✗ Branch 250 not taken.
✓ Branch 251 taken 9 times.
✗ Branch 252 not taken.
✓ Branch 253 taken 18 times.
✗ Branch 254 not taken.
✓ Branch 255 taken 27 times.
✗ Branch 256 not taken.
✓ Branch 257 taken 27 times.
✗ Branch 258 not taken.
✓ Branch 259 taken 27 times.
✗ Branch 260 not taken.
✓ Branch 261 taken 27 times.
✗ Branch 262 not taken.
✓ Branch 263 taken 9 times.
✗ Branch 264 not taken.
✓ Branch 265 taken 9 times.
✗ Branch 266 not taken.
✓ Branch 267 taken 9 times.
✗ Branch 268 not taken.
✓ Branch 269 taken 18 times.
✗ Branch 270 not taken.
✓ Branch 271 taken 27 times.
✗ Branch 272 not taken.
✓ Branch 273 taken 27 times.
✗ Branch 274 not taken.
✓ Branch 275 taken 9 times.
✗ Branch 276 not taken.
✓ Branch 277 taken 18 times.
✗ Branch 278 not taken.
✓ Branch 279 taken 27 times.
✗ Branch 280 not taken.
✓ Branch 281 taken 27 times.
✗ Branch 282 not taken.
✓ Branch 283 taken 54 times.
✗ Branch 284 not taken.
✓ Branch 285 taken 54 times.
✗ Branch 286 not taken.
✓ Branch 287 taken 54 times.
✗ Branch 288 not taken.
✓ Branch 289 taken 108 times.
✗ Branch 290 not taken.
✓ Branch 291 taken 162 times.
✗ Branch 292 not taken.
✓ Branch 293 taken 162 times.
✗ Branch 294 not taken.
✓ Branch 295 taken 54 times.
✗ Branch 296 not taken.
✓ Branch 297 taken 108 times.
✗ Branch 298 not taken.
✓ Branch 299 taken 162 times.
✗ Branch 300 not taken.
✓ Branch 301 taken 162 times.
✗ Branch 302 not taken.
✓ Branch 303 taken 54 times.
✗ Branch 304 not taken.
✓ Branch 305 taken 54 times.
✗ Branch 306 not taken.
✓ Branch 307 taken 54 times.
✗ Branch 308 not taken.
✓ Branch 309 taken 54 times.
✗ Branch 310 not taken.
✓ Branch 311 taken 9 times.
✗ Branch 312 not taken.
✓ Branch 313 taken 9 times.
✗ Branch 314 not taken.
✓ Branch 315 taken 9 times.
✗ Branch 316 not taken.
✓ Branch 317 taken 9 times.
✗ Branch 318 not taken.
✓ Branch 319 taken 9 times.
✗ Branch 320 not taken.
✓ Branch 321 taken 9 times.
✗ Branch 322 not taken.
✓ Branch 323 taken 9 times.
✗ Branch 324 not taken.
✓ Branch 325 taken 9 times.
✗ Branch 326 not taken.
✓ Branch 327 taken 9 times.
✗ Branch 328 not taken.
✓ Branch 329 taken 9 times.
✗ Branch 330 not taken.
✓ Branch 331 taken 9 times.
✗ Branch 332 not taken.
✓ Branch 333 taken 9 times.
✗ Branch 334 not taken.
✓ Branch 335 taken 9 times.
✗ Branch 336 not taken.
✓ Branch 337 taken 9 times.
✗ Branch 338 not taken.
✓ Branch 339 taken 9 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 9 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 9 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 9 times.
✗ Branch 346 not taken.
8202590 return data_ptr;
37 }
38
39 194023 char *temp_raw() const //things to cleanup and take a look at
40 {
41
3/6
✓ Branch 0 taken 166638 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 7176 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 63 times.
✗ Branch 5 not taken.
407582 return data_ptr;
42 }
43
44 350365 char *raw() const
45 {
46
3/5
✓ Branch 0 taken 2127 times.
✓ Branch 1 taken 81180 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
458091 return data_ptr;
47 }
48
49 5897078 int length() const
50 {
51
11/12
✓ Branch 0 taken 1215704 times.
✓ Branch 1 taken 123439 times.
✓ Branch 2 taken 964703 times.
✓ Branch 3 taken 97919 times.
✓ Branch 4 taken 22160 times.
✓ Branch 5 taken 3354 times.
✓ Branch 6 taken 930 times.
✓ Branch 7 taken 51 times.
✓ Branch 8 taken 975 times.
✓ Branch 9 taken 1393 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 132 times.
9491805 return len;
52 }
53
54 7496023 void resize(unsigned int new_length)
55 {
56
2/2
✓ Branch 0 taken 23547 times.
✓ Branch 1 taken 7472476 times.
7496023 if (new_length > capacity()) {
57 23547 reallocate_capacity(new_length);
58 }
59
60 7496023 len = new_length;
61 7496023 data_ptr[new_length] = 0; //always ensure null terminator
62 7496023 }
63
64 1188 void truncate(int newlen)
65 {
66
1/2
✓ Branch 0 taken 1188 times.
✗ Branch 1 not taken.
2376 resize(newlen);
67 2376 }
68
69 2490943 void assign(const char * newstr)
70 {
71
2/2
✓ Branch 0 taken 250 times.
✓ Branch 1 taken 2490693 times.
2490943 if (!newstr) newstr = "";
72 2490943 assign(newstr, strlen(newstr));
73 2490943 }
74
75 1435506 void assign(const string &newstr)
76 {
77 1435506 assign(newstr.data(), newstr.length());
78 1435506 }
79
80 4192924 void assign(const char * newstr, int end)
81 {
82 4192924 resize(end);
83 4192924 copy(newstr, end, data_ptr);
84 4192924 }
85
86
87 377208 string& operator=(const char * newstr)
88 {
89
14/26
✓ Branch 0 taken 945 times.
✓ Branch 1 taken 1530 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 705 times.
✓ Branch 6 taken 248 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 315 times.
✓ Branch 9 taken 4797 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2530 times.
✓ Branch 12 taken 9 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 142 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 16183 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 30657 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 270234 times.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 84669 times.
✗ Branch 25 not taken.
826966 assign(newstr);
90 791804 return *this;
91 }
92
93 618310 string& operator=(const string &newstr)
94 {
95
23/28
✓ Branch 0 taken 34374 times.
✓ Branch 1 taken 712 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 49521 times.
✓ Branch 4 taken 288 times.
✓ Branch 5 taken 248 times.
✓ Branch 6 taken 9 times.
✓ Branch 7 taken 288 times.
✓ Branch 8 taken 744 times.
✓ Branch 9 taken 9 times.
✓ Branch 10 taken 45 times.
✓ Branch 11 taken 765 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 18 times.
✓ Branch 14 taken 153 times.
✓ Branch 15 taken 12 times.
✓ Branch 16 taken 18 times.
✓ Branch 17 taken 81 times.
✓ Branch 18 taken 1707 times.
✓ Branch 19 taken 18 times.
✓ Branch 20 taken 6 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 18 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 36 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1074 times.
✗ Branch 27 not taken.
984932 assign(newstr);
96 971560 return *this;
97 }
98
99 string& append(const string& other, int start, int end)
100 {
101 int current_end = length();
102 resize(length() + end - start);
103 copy(other.data() + start, end - start, data_ptr + current_end);
104 return *this;
105 }
106
107 9678 string& append(const char *other, int start, int end)
108 {
109 4845 int current_end = length();
110 9678 resize(length() + end - start);
111 9678 copy(other + start, end - start, data_ptr + current_end);
112 9678 return *this;
113 }
114
115 224861 string& operator+=(const string& other)
116 {
117 89833 int current_end = length();
118 224861 resize(length() + other.length());
119 224861 copy(other.data(), other.length(), data_ptr + current_end);
120 224861 return *this;
121 }
122
123 633958 string& operator+=(const char *other)
124 {
125 283991 int current_end = length();
126 633958 int otherlen=(int)strlen(other);
127 633958 resize(length() + otherlen);
128 633958 copy(other, otherlen, data_ptr + current_end);
129 633958 return *this;
130 }
131
132 2430734 string& operator+=(char c)
133 {
134 2430734 resize(length() + 1);
135 2430734 data_ptr[length() - 1] = c;
136 2430734 return *this;
137 }
138
139 string operator+(char right) const
140 {
141 string ret=*this;
142 ret+=right;
143 return ret;
144 }
145
146 149431 string operator+(const char * right) const
147 {
148 61060 string ret=*this;
149
1/2
✓ Branch 0 taken 149431 times.
✗ Branch 1 not taken.
149431 ret+=right;
150 149431 return ret;
151 }
152
153 3819010 operator const char*() const
154 {
155 3819010 return data();
156 }
157
158 16995 explicit operator bool() const
159 {
160 16995 return length();
161 }
162
163 2350071 string()
164 4682414 {
165 4887612 data_ptr = inlined.data;
166 4887612 len = 0;
167
31/34
✓ Branch 0 taken 31750 times.
✓ Branch 1 taken 1176 times.
✓ Branch 2 taken 73245 times.
✓ Branch 3 taken 9202 times.
✓ Branch 4 taken 2388 times.
✓ Branch 5 taken 2329 times.
✓ Branch 6 taken 29 times.
✓ Branch 7 taken 23807 times.
✓ Branch 8 taken 3326 times.
✓ Branch 9 taken 5190 times.
✓ Branch 10 taken 82074 times.
✓ Branch 11 taken 45 times.
✓ Branch 12 taken 76941 times.
✓ Branch 13 taken 315 times.
✓ Branch 14 taken 2313 times.
✓ Branch 15 taken 3633 times.
✓ Branch 16 taken 15231 times.
✓ Branch 17 taken 90 times.
✓ Branch 18 taken 72 times.
✓ Branch 19 taken 9 times.
✓ Branch 20 taken 3063 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 48 times.
✓ Branch 23 taken 190 times.
✓ Branch 24 taken 3827 times.
✓ Branch 25 taken 1402 times.
✓ Branch 26 taken 94331 times.
✓ Branch 27 taken 25 times.
✓ Branch 28 taken 95040 times.
✓ Branch 29 taken 5024 times.
✓ Branch 30 taken 286422 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1707 times.
✗ Branch 33 not taken.
3798220 inlined.data[0] = '\0';
168 2352055 }
169 1308122 string(const char * newstr) : string()
170 {
171
1/2
✓ Branch 0 taken 1308122 times.
✗ Branch 1 not taken.
1308122 assign(newstr);
172
46/68
✓ Branch 0 taken 5166 times.
✓ Branch 1 taken 32433 times.
✓ Branch 2 taken 124 times.
✓ Branch 3 taken 18 times.
✓ Branch 4 taken 124 times.
✓ Branch 5 taken 15535 times.
✓ Branch 6 taken 774 times.
✓ Branch 7 taken 124 times.
✓ Branch 8 taken 124 times.
✓ Branch 9 taken 82023 times.
✓ Branch 10 taken 496 times.
✓ Branch 11 taken 124 times.
✓ Branch 12 taken 166692 times.
✓ Branch 13 taken 496 times.
✓ Branch 14 taken 124 times.
✓ Branch 15 taken 84795 times.
✓ Branch 16 taken 151 times.
✓ Branch 17 taken 124 times.
✓ Branch 18 taken 51 times.
✓ Branch 19 taken 81 times.
✓ Branch 20 taken 124 times.
✓ Branch 21 taken 180 times.
✓ Branch 22 taken 5396 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 18 times.
✓ Branch 25 taken 18 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 36 times.
✓ Branch 28 taken 5414 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 9 times.
✓ Branch 31 taken 15332 times.
✗ Branch 32 not taken.
✗ Branch 33 not taken.
✓ Branch 34 taken 63 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 45 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 9 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 45 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 18 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 9 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 81 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 27 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 117 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 45 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 54 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 36 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 15 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 186 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 48 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 12 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 12 times.
✗ Branch 67 not taken.
1896695 }
173 231430 string(const char * newstr, int newlen) : string()
174 {
175
1/2
✓ Branch 0 taken 231430 times.
✗ Branch 1 not taken.
231430 assign(newstr, newlen);
176
5/9
✓ Branch 0 taken 865 times.
✓ Branch 1 taken 744 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2133 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 54 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 63 times.
✗ Branch 8 not taken.
354676 }
177 355855 string(const string& old) : string()
178 {
179
1/2
✓ Branch 0 taken 355855 times.
✗ Branch 1 not taken.
355855 assign(old.data());
180
26/45
✓ Branch 0 taken 9360 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12289 times.
✓ Branch 3 taken 216 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 96 times.
✓ Branch 6 taken 969 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 222 times.
✓ Branch 9 taken 3 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 90 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 72 times.
✓ Branch 15 taken 3 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 99 times.
✓ Branch 18 taken 9 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 783 times.
✓ Branch 21 taken 6 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 117 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 6 times.
✓ Branch 26 taken 72 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1866 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 54 times.
✓ Branch 31 taken 6 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1935 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 27 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 525 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 51 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 3 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 969 times.
✗ Branch 44 not taken.
475685 }
181
182 93707 string(string &&move) noexcept : string()
183 {
184 44752 *this = move;
185 90779 }
186
187 391113 string& operator=(string&& other) noexcept
188 {
189
2/2
✓ Branch 0 taken 142295 times.
✓ Branch 1 taken 165 times.
391113 if (other.is_inlined()) {
190 // No resources to steal so just do a normal assignment
191 142295 *this = other;
192 } else {
193
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 99 times.
301 if (is_inlined()) {
194 113 data_ptr = other.data_ptr;
195 113 other.data_ptr = 0;
196 } else {
197 // Give our old allocation back so other can free it for us
198 99 std::swap(data_ptr, other.data_ptr);
199 }
200 301 len = other.len;
201 301 allocated = other.allocated;
202 }
203 391113 return *this;
204 }
205
206 12365371 ~string()
207 {
208
2/2
✓ Branch 0 taken 11336 times.
✓ Branch 1 taken 2253191 times.
7314949 if(!is_inlined()){
209 34270 free(data_ptr);
210 }
211 12365371 }
212
213 //maybe these should return refs to chain. but also good not to encourage chaining
214 5228 void strip_prefix(char c)
215 {
216
2/2
✓ Branch 0 taken 1492 times.
✓ Branch 1 taken 3736 times.
5228 if(data()[0] == c){
217 1492 std::memmove(data_ptr, data_ptr + 1, length() - 1);
218 1492 resize(length() - 1);
219 }
220 5228 }
221
222 void strip_suffix(char c)
223 {
224 if (data()[length() - 1] == c) {
225 truncate(length() - 1);
226 }
227 }
228
229 string& qreplace(const char * instr, const char * outstr);
230 string& qnormalize();
231
232 // RPG Hacker: My hack shmeck to get around no longer supporting text mode.
233 // Symbol files are currently the only thing that use text mode, anyways, and I don't even know
234 // if the emulators that read them care about line endings.
235 string& convert_line_endings_to_native()
236 {
237 #if defined(windows)
238 // RPG Hacker: This is quite stinky, but doing the replacement directly will lead to a dead-lock.
239 // \x08 = backspace should never appear inside a string, so I'm abusing it here.
240 return qreplace("\n", "\x08").qreplace("\x08", "\r\n");
241 #else
242 return *this;
243 #endif
244 }
245
246 #ifdef SERIALIZER
247 void serialize(serializer & s)
248 {
249 s(str, allocated.bufferlen);
250 resize(strlen(str));
251 }
252 #endif
253 #define SERIALIZER_BANNED
254
255 private:
256 static const int scale_factor = 4; //scale sso
257 static const int inline_capacity = ((sizeof(char *) + sizeof(int) * 2) * scale_factor) - 2;
258
259 // Points to a malloc'd data block or to inlined.data
260 char *data_ptr;
261 unsigned int len;
262 union {
263 struct {
264 // Actual allocated capacity is +1 this value, to cover for the terminating NUL
265 unsigned int capacity;
266 } allocated;
267 struct {
268 char data[inline_capacity + 1];
269 } inlined;
270 };
271
272 void reallocate_capacity(unsigned int new_length);
273
274 3342425 unsigned capacity() const
275 {
276
2/2
✓ Branch 0 taken 3332417 times.
✓ Branch 1 taken 10008 times.
3352949 return is_inlined() ? inline_capacity : allocated.capacity;
277 }
278
279 5761319 bool is_inlined() const
280 {
281
8/10
✓ Branch 0 taken 22890 times.
✓ Branch 1 taken 2514126 times.
✓ Branch 2 taken 248517 times.
✓ Branch 3 taken 136 times.
✓ Branch 4 taken 47 times.
✓ Branch 5 taken 89 times.
✓ Branch 6 taken 10524 times.
✓ Branch 7 taken 4143074 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
12700586 return data_ptr == inlined.data;
282 }
283 };
284 #define STR (string)
285
286 #define ASAR_STRCMP_OPERATORS(op) \
287 inline bool operator op(const string& left, const string& right) { \
288 return strcmp(left, right) op 0; \
289 } \
290 inline bool operator op(const string& left, const char* right) { \
291 return strcmp(left, right) op 0; \
292 } \
293 inline bool operator op(const char* left, const string& right) { \
294 return strcmp(left, right) op 0; \
295 }
296
297 369889 ASAR_STRCMP_OPERATORS(==)
298 28344 ASAR_STRCMP_OPERATORS(!=)
299 ASAR_STRCMP_OPERATORS(<)
300 ASAR_STRCMP_OPERATORS(<=)
301 ASAR_STRCMP_OPERATORS(>)
302 ASAR_STRCMP_OPERATORS(>=)
303 #undef ASAR_STRCMP_OPERATORS
304
305 template<>
306 struct std::hash<string> {
307 368609 size_t operator()(const ::string& s) const {
308 368609 return std::hash<std::string_view>()(std::string_view(s.data(), s.length()));
309 }
310 };
311
312 char * readfile(const char * fname, const char * basepath);
313 char * readfilenative(const char * fname);
314 bool readfile(const char * fname, const char * basepath, char ** data, int * len);//if you want an uchar*, cast it
315 char ** split(char * str, char key, int * len= nullptr);
316 char ** qsplit(char * str, char key, int * len= nullptr);
317 char ** qpsplit(char * str, char key, int * len= nullptr);
318 char ** qsplitstr(char * str, const char * key, int * len= nullptr);
319 bool confirmquotes(const char * str);
320 bool confirmqpar(const char * str);
321 char* strqpchr(char* str, char key);
322 char* strqpstr(char* str, const char* key);
323
324 inline string hex(unsigned int value)
325 {
326 char buffer[64];
327 if(0);
328 else if (value<=0x000000FF) snprintf(buffer, sizeof(buffer), "%.2X", value);
329 else if (value<=0x0000FFFF) snprintf(buffer, sizeof(buffer), "%.4X", value);
330 else if (value<=0x00FFFFFF) snprintf(buffer, sizeof(buffer), "%.6X", value);
331 else snprintf(buffer, sizeof(buffer), "%.8X", value);
332 return buffer;
333 }
334
335 6 inline string hex(unsigned int value, int width)
336 {
337 char buffer[64];
338 6 snprintf(buffer, sizeof(buffer), "%.*X", width, value);
339
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
9 return buffer;
340 }
341
342 21001 inline string dec(int value)
343 {
344 char buffer[64];
345 21001 snprintf(buffer, sizeof(buffer), "%i", value);
346
1/2
✓ Branch 0 taken 8835 times.
✗ Branch 1 not taken.
29836 return buffer;
347 }
348
349 6498 inline string ftostr(double value)
350 {
351 // randomdude999: With 100 digits of precision, the buffer needs to be approx. 311+100,
352 // but let's be safe here https://stackoverflow.com/questions/7235456
353 char rval[512];
354 // RPG Hacker: Ridiculously high precision, I know, but we're working with doubles
355 // here and can afford it, so no need to waste any precision
356 6498 snprintf(rval, sizeof(rval), "%.100f", value);
357
1/2
✓ Branch 0 taken 6498 times.
✗ Branch 1 not taken.
6498 if (strchr(rval, '.'))//nuke useless zeroes
358 {
359 6498 char * end=strrchr(rval, '\0')-1;
360
2/2
✓ Branch 0 taken 648756 times.
✓ Branch 1 taken 6498 times.
655254 while (*end=='0')
361 {
362 648756 *end='\0';
363 648756 end--;
364 }
365
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 18 times.
6498 if (*end=='.') *end='\0';
366 }
367
1/2
✓ Branch 0 taken 3249 times.
✗ Branch 1 not taken.
9747 return rval;
368 }
369
370 // Same as above, but with variable precision
371 54 inline string ftostrvar(double value, int precision)
372 {
373 27 int clampedprecision = precision;
374
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
27 if (clampedprecision < 0) clampedprecision = 0;
375
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
54 if (clampedprecision > 100) clampedprecision = 100;
376
377 // see above
378 char rval[512];
379 54 snprintf(rval, sizeof(rval), "%.*f", clampedprecision, (double)value);
380
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
54 if (strchr(rval, '.'))//nuke useless zeroes
381 {
382 48 char * end = strrchr(rval, '\0') - 1;
383
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 48 times.
186 while (*end == '0')
384 {
385 138 *end = '\0';
386 138 end--;
387 }
388
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 30 times.
48 if (*end == '.') *end = '\0';
389 }
390
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
81 return rval;
391 }
392
393 269591 inline bool stribegin(const char * str, const char * key)
394 {
395
2/2
✓ Branch 0 taken 932059 times.
✓ Branch 1 taken 26146 times.
958205 for (int i=0;key[i];i++)
396 {
397
2/2
✓ Branch 0 taken 576395 times.
✓ Branch 1 taken 355664 times.
932059 if (to_lower(str[i])!=to_lower(key[i])) return false;
398 }
399 5587 return true;
400 }
401
402 inline bool striend(const char * str, const char * key)
403 {
404 const char * keyend=strrchr(key, '\0');
405 const char * strend=strrchr(str, '\0');
406 if(keyend-key > strend-str) return false;
407
408 while (key!=keyend)
409 {
410 keyend--;
411 strend--;
412 if (to_lower(*strend)!=to_lower(*keyend)) return false;
413 }
414 return true;
415 }
416
417 inline bool stricmpwithupper(const char *word1, const char *word2)
418 {
419 while(*word2)
420 {
421 if(to_upper(*word1++) != *word2++) return true;
422 }
423 return *word1;
424 }
425
426 2263361 inline bool stricmpwithlower(const char *word1, const char *word2)
427 {
428
2/2
✓ Branch 0 taken 3020540 times.
✓ Branch 1 taken 117728 times.
3138268 while(*word2)
429 {
430
2/2
✓ Branch 0 taken 1440198 times.
✓ Branch 1 taken 1580342 times.
3020540 if(to_lower(*word1++) != *word2++) return true;
431 }
432 117728 return *word1;
433 }
434
435 //function: return the string without quotes around it, if any exists
436 //if they don't exist, return it unaltered
437 //it is not guaranteed to return str
438 //it is not guaranteed to not edit str
439 //the input must be freed even though it's garbage, the output must not
440 29841 inline const char * dequote(char * str)
441 {
442
2/2
✓ Branch 0 taken 17514 times.
✓ Branch 1 taken 12327 times.
29841 if (*str!='"') return str;
443 27573 char *end = strrchr(str, '"');
444
1/2
✓ Branch 0 taken 27573 times.
✗ Branch 1 not taken.
27573 if (end)
445 {
446 27573 *end = 0;
447 27573 char *quote = str+1;
448
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 27573 times.
28005 while((quote = strstr(quote, "\"\""))) memmove(quote, quote+1, strlen(quote));
449 11211 return str + 1;
450 }
451 return nullptr;
452 }
453
454 46066 inline char * strqchr(const char * str, char key)
455 {
456
2/2
✓ Branch 0 taken 407819 times.
✓ Branch 1 taken 34867 times.
442686 while (*str != '\0')
457 {
458
2/2
✓ Branch 0 taken 11193 times.
✓ Branch 1 taken 396626 times.
407819 if (*str == key) { return const_cast<char*>(str); }
459
4/4
✓ Branch 0 taken 394700 times.
✓ Branch 1 taken 1926 times.
✓ Branch 2 taken 546 times.
✓ Branch 3 taken 394154 times.
396626 else if (*str == '"' || *str == '\'')
460 {
461 // Special case hack for ''', which is currently our official way of handling the ' character.
462 // Even though it really stinks.
463
5/6
✓ Branch 0 taken 546 times.
✓ Branch 1 taken 1926 times.
✓ Branch 2 taken 36 times.
✓ Branch 3 taken 510 times.
✓ Branch 4 taken 36 times.
✗ Branch 5 not taken.
2472 if (str[0] == '\'' && str[1] == '\'' && str[2] == '\'') { str += 2; }
464 else
465 {
466 1253 char delimiter = *str;
467
468 do
469 {
470 27642 str++;
471
472 // If we want to support backslash escapes, we'll have to add that right here.
473
4/4
✓ Branch 0 taken 25212 times.
✓ Branch 1 taken 2430 times.
✓ Branch 2 taken 25206 times.
✓ Branch 3 taken 6 times.
27642 } while (*str != delimiter && *str != '\0');
474
475 // This feels like a superfluous check, but I can't really find a clean way to avoid it.
476
2/2
✓ Branch 0 taken 1183 times.
✓ Branch 1 taken 1253 times.
2436 if (*str == '\0') { return nullptr; }
477 }
478 }
479
480 396620 str++;
481 }
482
483 17481 return nullptr;
484 }
485
486 3870 inline string substr(const char * str, int len)
487 {
488 3870 return string(str, len);
489 }
490
491
492 209379 inline char *strip_whitespace(char *str)
493 {
494
2/2
✓ Branch 0 taken 11222 times.
✓ Branch 1 taken 209379 times.
220601 while(is_space(*str)) str++;
495
2/2
✓ Branch 0 taken 193597 times.
✓ Branch 1 taken 63202 times.
256799 for(int i = strlen(str) - 1; i >= 0; i--)
496 {
497
2/2
✓ Branch 0 taken 146177 times.
✓ Branch 1 taken 47420 times.
193597 if(!is_space(str[i]))
498 {
499 146177 str[i + 1] = 0;
500 146177 return str;
501 }
502 }
503 31641 return str;
504 }
505 6984 inline void strip_whitespace(string &str)
506 {
507
1/2
✓ Branch 0 taken 3506 times.
✗ Branch 1 not taken.
10462 str = string(strip_whitespace(str.temp_raw()));
508 6984 }
509
510 string &itrim(string &str, const char * left, const char * right);
511
512 34343 inline string &lower(string &old)
513 {
514 92 int length = old.length();
515
2/2
✓ Branch 0 taken 963116 times.
✓ Branch 1 taken 34343 times.
997459 for (int i=0;i<length;i++) old.raw()[i]=(char)to_lower(old.data()[i]);
516 34343 return old;
517 }
518
519
520 // Returns number of connected lines - 1
521 template<typename stringarraytype>
522 148293 inline int getconnectedlines(stringarraytype& lines, int startline, string& out)
523 {
524 71709 int count = 0;
525
526
1/2
✓ Branch 0 taken 148347 times.
✗ Branch 1 not taken.
148347 for (int i = startline; lines[i]; i++)
527 {
528 // The line should already be stripped of any comments at this point
529 148347 int linestartpos = (int)strlen(lines[i]);
530
531
4/4
✓ Branch 0 taken 108645 times.
✓ Branch 1 taken 39702 times.
✓ Branch 2 taken 54 times.
✓ Branch 3 taken 108591 times.
148347 if(linestartpos && lines[i][linestartpos - 1] == '\\')
532 {
533 54 count++;
534
2/4
✓ Branch 0 taken 54 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 27 times.
✗ Branch 3 not taken.
54 out += string(lines[i], linestartpos - 1);
535 27 continue;
536 }
537 else
538 {
539
2/4
✓ Branch 0 taken 148293 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 71709 times.
✗ Branch 3 not taken.
148293 out += string(lines[i], linestartpos);
540 148293 return count;
541 }
542 }
543
544 return count;
545 }
546