asar coverage - build #231


src/asar/
File: src/asar/libstr.h
Date: 2024-04-08 11:14:37
Lines:
264/287
92.0%
Functions:
60/64
93.8%
Branches:
437/660
66.2%

Line Branch Exec Source
1 #pragma once
2
3 #include "std-includes.h"
4 //ty alcaro
5 extern const unsigned char char_props[256];
6 27434984 static inline int to_lower(unsigned char c) { return c|(char_props[c]&0x20); }
7 266243 static inline int to_upper(unsigned char c) { return c&~(char_props[c]&0x20); }
8
9
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
864364 inline bool is_space(unsigned char c) { return char_props[c] & 0x80; } // C standard says \f \v are space, but this one disagrees
10 10071750 inline bool is_digit(unsigned char c) { return char_props[c] & 0x40; }
11 3424 inline bool is_alpha(unsigned char c) { return char_props[c] & 0x20; }
12 3570 inline bool is_lower(unsigned char c) { return char_props[c] & 0x04; }
13 4802 inline bool is_upper(unsigned char c) { return char_props[c] & 0x02; }
14 25578 inline bool is_alnum(unsigned char c) { return char_props[c] & 0x60; }
15 inline bool is_ualpha(unsigned char c) { return char_props[c] & 0x28; }
16 1341006 inline bool is_ualnum(unsigned char c) { return char_props[c] & 0x68; }
17
4/4
✓ Branch 0 taken 6444 times.
✓ Branch 1 taken 5387 times.
✓ Branch 2 taken 7428 times.
✓ Branch 3 taken 2368 times.
43254 inline bool is_xdigit(unsigned char c) { return char_props[c] & 0x01; }
18
19 8855193 inline char *copy(const char *source, int copy_length, char *dest)
20 {
21 17281498 memmove(dest, source, copy_length*sizeof(char));
22 8855193 return dest;
23 }
24
25 434900 inline int min_val(int a, int b)
26 {
27
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 434900 times.
434900 return a > b ? b : a;
28 }
29
30 440639 inline int bit_round(int v)
31 {
32 440639 v--;
33 440639 v |= v >> 1;
34 440639 v |= v >> 2;
35 440639 v |= v >> 4;
36 440639 v |= v >> 8;
37 440639 v |= v >> 16;
38 440639 v++;
39 440639 return v;
40 }
41
42 class string {
43 public:
44 28040570 const char *data() const
45 {
46
232/393
✓ Branch 0 taken 2051 times.
✓ Branch 1 taken 52421 times.
✓ Branch 2 taken 55130 times.
✓ Branch 3 taken 1221 times.
✓ Branch 4 taken 1575 times.
✓ Branch 5 taken 538342 times.
✓ Branch 6 taken 1258 times.
✓ Branch 7 taken 538995 times.
✓ Branch 8 taken 692 times.
✓ Branch 9 taken 327584 times.
✓ Branch 10 taken 66 times.
✓ Branch 11 taken 1033 times.
✓ Branch 12 taken 806 times.
✓ Branch 13 taken 326930 times.
✓ Branch 14 taken 208 times.
✓ Branch 15 taken 929 times.
✓ Branch 16 taken 2065301 times.
✓ Branch 17 taken 6442 times.
✓ Branch 18 taken 531 times.
✓ Branch 19 taken 305 times.
✓ Branch 20 taken 26 times.
✓ Branch 21 taken 396 times.
✓ Branch 22 taken 328 times.
✓ Branch 23 taken 100 times.
✓ Branch 24 taken 127 times.
✓ Branch 25 taken 74 times.
✓ Branch 26 taken 5748 times.
✓ Branch 27 taken 225 times.
✓ Branch 28 taken 124 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 109 times.
✓ Branch 31 taken 516 times.
✓ Branch 32 taken 6 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 115 times.
✓ Branch 35 taken 469 times.
✓ Branch 36 taken 2 times.
✓ Branch 37 taken 163 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 100 times.
✓ Branch 40 taken 436223 times.
✓ Branch 41 taken 254 times.
✓ Branch 42 taken 16 times.
✓ Branch 43 taken 436128 times.
✓ Branch 44 taken 223 times.
✓ Branch 45 taken 2176 times.
✓ Branch 46 taken 436965 times.
✓ Branch 47 taken 108 times.
✓ Branch 48 taken 6 times.
✓ Branch 49 taken 437760 times.
✓ Branch 50 taken 48 times.
✓ Branch 51 taken 55 times.
✓ Branch 52 taken 9 times.
✓ Branch 53 taken 19107 times.
✓ Branch 54 taken 54 times.
✓ Branch 55 taken 120 times.
✓ Branch 56 taken 108331 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 146 times.
✓ Branch 59 taken 30 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 57 times.
✓ Branch 62 taken 130 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 84 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 268 times.
✓ Branch 67 taken 2134 times.
✓ Branch 68 taken 21 times.
✓ Branch 69 taken 302 times.
✓ Branch 70 taken 17 times.
✓ Branch 71 taken 21 times.
✓ Branch 72 taken 48 times.
✓ Branch 73 taken 105502 times.
✗ Branch 74 not taken.
✓ Branch 75 taken 48 times.
✓ Branch 76 taken 105497 times.
✓ Branch 77 taken 2248 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 105497 times.
✓ Branch 80 taken 8 times.
✓ Branch 81 taken 3 times.
✓ Branch 82 taken 11 times.
✓ Branch 83 taken 48 times.
✓ Branch 84 taken 212007 times.
✓ Branch 85 taken 6 times.
✓ Branch 86 taken 212007 times.
✓ Branch 87 taken 48 times.
✓ Branch 88 taken 69 times.
✓ Branch 89 taken 2144 times.
✓ Branch 90 taken 50 times.
✓ Branch 91 taken 20 times.
✓ Branch 92 taken 42 times.
✓ Branch 93 taken 50 times.
✓ Branch 94 taken 69 times.
✓ Branch 95 taken 14 times.
✗ Branch 96 not taken.
✓ Branch 97 taken 63 times.
✗ Branch 98 not taken.
✓ Branch 99 taken 120 times.
✓ Branch 100 taken 2023 times.
✗ Branch 101 not taken.
✓ Branch 102 taken 10 times.
✓ Branch 103 taken 3 times.
✗ Branch 104 not taken.
✓ Branch 105 taken 60 times.
✓ Branch 106 taken 3 times.
✗ Branch 107 not taken.
✓ Branch 108 taken 60 times.
✓ Branch 109 taken 3 times.
✓ Branch 110 taken 60 times.
✓ Branch 111 taken 2080 times.
✓ Branch 112 taken 252 times.
✓ Branch 113 taken 60 times.
✓ Branch 114 taken 18 times.
✗ Branch 115 not taken.
✓ Branch 116 taken 10 times.
✓ Branch 117 taken 15 times.
✓ Branch 118 taken 3 times.
✓ Branch 119 taken 60 times.
✗ Branch 120 not taken.
✓ Branch 121 taken 6 times.
✓ Branch 122 taken 60 times.
✗ Branch 123 not taken.
✓ Branch 124 taken 2020 times.
✗ Branch 125 not taken.
✗ Branch 126 not taken.
✓ Branch 127 taken 89 times.
✓ Branch 128 taken 27 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 519 times.
✓ Branch 131 taken 3 times.
✗ Branch 132 not taken.
✓ Branch 133 taken 264 times.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✓ Branch 136 taken 519 times.
✗ Branch 137 not taken.
✗ Branch 138 not taken.
✓ Branch 139 taken 3 times.
✓ Branch 140 taken 1504 times.
✗ Branch 141 not taken.
✗ Branch 142 not taken.
✓ Branch 143 taken 13 times.
✗ Branch 144 not taken.
✓ Branch 145 taken 3 times.
✓ Branch 146 taken 78 times.
✗ Branch 147 not taken.
✓ Branch 148 taken 3 times.
✓ Branch 149 taken 66 times.
✗ Branch 150 not taken.
✗ Branch 151 not taken.
✓ Branch 152 taken 12 times.
✗ Branch 153 not taken.
✓ Branch 154 taken 3 times.
✗ Branch 155 not taken.
✗ Branch 156 not taken.
✓ Branch 157 taken 3 times.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 160 not taken.
✓ Branch 161 taken 15 times.
✗ Branch 162 not taken.
✓ Branch 163 taken 18 times.
✓ Branch 164 taken 6 times.
✓ Branch 165 taken 15 times.
✓ Branch 166 taken 3 times.
✓ Branch 167 taken 10 times.
✓ Branch 168 taken 16 times.
✗ Branch 169 not taken.
✓ Branch 170 taken 60 times.
✗ Branch 171 not taken.
✓ Branch 172 taken 3 times.
✓ Branch 173 taken 60 times.
✓ Branch 174 taken 2960 times.
✓ Branch 175 taken 3 times.
✓ Branch 176 taken 308 times.
✓ Branch 177 taken 184 times.
✗ Branch 178 not taken.
✓ Branch 179 taken 1360 times.
✗ Branch 180 not taken.
✓ Branch 181 taken 187 times.
✓ Branch 182 taken 1024 times.
✓ Branch 183 taken 184 times.
✓ Branch 184 taken 3 times.
✗ Branch 185 not taken.
✗ Branch 186 not taken.
✓ Branch 187 taken 973 times.
✓ Branch 188 taken 100 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 30 times.
✗ Branch 191 not taken.
✗ Branch 192 not taken.
✓ Branch 193 taken 63 times.
✗ Branch 194 not taken.
✗ Branch 195 not taken.
✓ Branch 196 taken 3 times.
✗ Branch 197 not taken.
✗ Branch 198 not taken.
✗ Branch 199 not taken.
✗ Branch 200 not taken.
✗ Branch 201 not taken.
✗ Branch 202 not taken.
✗ Branch 203 not taken.
✗ Branch 204 not taken.
✓ Branch 205 taken 60 times.
✗ Branch 206 not taken.
✗ Branch 207 not taken.
✓ Branch 208 taken 24 times.
✗ Branch 209 not taken.
✗ Branch 210 not taken.
✓ Branch 211 taken 60 times.
✗ Branch 212 not taken.
✗ Branch 213 not taken.
✗ Branch 214 not taken.
✗ Branch 215 not taken.
✗ Branch 216 not taken.
✓ Branch 217 taken 3 times.
✗ Branch 218 not taken.
✓ Branch 219 taken 3 times.
✗ Branch 220 not taken.
✓ Branch 221 taken 6 times.
✗ Branch 222 not taken.
✓ Branch 223 taken 9 times.
✗ Branch 224 not taken.
✓ Branch 225 taken 9 times.
✗ Branch 226 not taken.
✓ Branch 227 taken 3 times.
✗ Branch 228 not taken.
✓ Branch 229 taken 6 times.
✗ Branch 230 not taken.
✓ Branch 231 taken 9 times.
✗ Branch 232 not taken.
✓ Branch 233 taken 9 times.
✗ Branch 234 not taken.
✓ Branch 235 taken 3 times.
✗ Branch 236 not taken.
✓ Branch 237 taken 3 times.
✗ Branch 238 not taken.
✓ Branch 239 taken 6 times.
✗ Branch 240 not taken.
✓ Branch 241 taken 9 times.
✗ Branch 242 not taken.
✓ Branch 243 taken 9 times.
✗ Branch 244 not taken.
✓ Branch 245 taken 6 times.
✗ Branch 246 not taken.
✓ Branch 247 taken 9 times.
✗ Branch 248 not taken.
✓ Branch 249 taken 9 times.
✗ Branch 250 not taken.
✓ Branch 251 taken 3 times.
✗ Branch 252 not taken.
✓ Branch 253 taken 3 times.
✗ Branch 254 not taken.
✓ Branch 255 taken 3 times.
✗ Branch 256 not taken.
✓ Branch 257 taken 6 times.
✗ Branch 258 not taken.
✓ Branch 259 taken 9 times.
✗ Branch 260 not taken.
✓ Branch 261 taken 9 times.
✗ Branch 262 not taken.
✓ Branch 263 taken 3 times.
✗ Branch 264 not taken.
✓ Branch 265 taken 6 times.
✗ Branch 266 not taken.
✓ Branch 267 taken 9 times.
✗ Branch 268 not taken.
✓ Branch 269 taken 9 times.
✗ Branch 270 not taken.
✓ Branch 271 taken 3 times.
✗ Branch 272 not taken.
✓ Branch 273 taken 3 times.
✗ Branch 274 not taken.
✓ Branch 275 taken 6 times.
✗ Branch 276 not taken.
✓ Branch 277 taken 9 times.
✗ Branch 278 not taken.
✓ Branch 279 taken 9 times.
✗ Branch 280 not taken.
✓ Branch 281 taken 3 times.
✗ Branch 282 not taken.
✓ Branch 283 taken 3 times.
✗ Branch 284 not taken.
✓ Branch 285 taken 6 times.
✗ Branch 286 not taken.
✓ Branch 287 taken 9 times.
✗ Branch 288 not taken.
✓ Branch 289 taken 9 times.
✗ Branch 290 not taken.
✓ Branch 291 taken 9 times.
✗ Branch 292 not taken.
✓ Branch 293 taken 9 times.
✗ Branch 294 not taken.
✓ Branch 295 taken 3 times.
✗ Branch 296 not taken.
✓ Branch 297 taken 3 times.
✗ Branch 298 not taken.
✓ Branch 299 taken 3 times.
✗ Branch 300 not taken.
✓ Branch 301 taken 6 times.
✗ Branch 302 not taken.
✓ Branch 303 taken 9 times.
✗ Branch 304 not taken.
✓ Branch 305 taken 9 times.
✗ Branch 306 not taken.
✓ Branch 307 taken 3 times.
✗ Branch 308 not taken.
✓ Branch 309 taken 6 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 18 times.
✗ Branch 316 not taken.
✓ Branch 317 taken 18 times.
✗ Branch 318 not taken.
✓ Branch 319 taken 18 times.
✗ Branch 320 not taken.
✓ Branch 321 taken 36 times.
✗ Branch 322 not taken.
✓ Branch 323 taken 54 times.
✗ Branch 324 not taken.
✓ Branch 325 taken 54 times.
✗ Branch 326 not taken.
✓ Branch 327 taken 18 times.
✗ Branch 328 not taken.
✓ Branch 329 taken 36 times.
✗ Branch 330 not taken.
✓ Branch 331 taken 54 times.
✗ Branch 332 not taken.
✓ Branch 333 taken 54 times.
✗ Branch 334 not taken.
✓ Branch 335 taken 18 times.
✗ Branch 336 not taken.
✓ Branch 337 taken 18 times.
✗ Branch 338 not taken.
✓ Branch 339 taken 18 times.
✗ Branch 340 not taken.
✓ Branch 341 taken 18 times.
✗ Branch 342 not taken.
✓ Branch 343 taken 3 times.
✗ Branch 344 not taken.
✓ Branch 345 taken 3 times.
✗ Branch 346 not taken.
✓ Branch 347 taken 3 times.
✗ Branch 348 not taken.
✓ Branch 349 taken 3 times.
✗ Branch 350 not taken.
✓ Branch 351 taken 3 times.
✗ Branch 352 not taken.
✓ Branch 353 taken 3 times.
✗ Branch 354 not taken.
✓ Branch 355 taken 3 times.
✗ Branch 356 not taken.
✓ Branch 357 taken 3 times.
✗ Branch 358 not taken.
✓ Branch 359 taken 3 times.
✗ Branch 360 not taken.
✗ Branch 361 not taken.
✗ Branch 362 not taken.
✓ Branch 363 taken 3 times.
✗ Branch 364 not taken.
✓ Branch 365 taken 3 times.
✗ Branch 366 not taken.
✓ Branch 367 taken 3 times.
✗ Branch 368 not taken.
✗ Branch 369 not taken.
✗ Branch 370 not taken.
✓ Branch 371 taken 3 times.
✗ Branch 372 not taken.
✓ Branch 373 taken 3 times.
✗ Branch 374 not taken.
✗ Branch 375 not taken.
✗ Branch 376 not taken.
✓ Branch 377 taken 3 times.
✗ Branch 378 not taken.
✓ Branch 379 taken 3 times.
✗ Branch 380 not taken.
✓ Branch 381 taken 3 times.
✗ Branch 382 not taken.
✗ Branch 383 not taken.
✗ Branch 384 not taken.
✓ Branch 385 taken 3 times.
✗ Branch 386 not taken.
✗ Branch 387 not taken.
✗ Branch 388 not taken.
✗ Branch 389 not taken.
✗ Branch 390 not taken.
✗ Branch 391 not taken.
✗ Branch 392 not taken.
35043571 return cached_data;
47 }
48
49 878643 char *temp_raw() const //things to cleanup and take a look at
50 {
51
5/10
✓ Branch 0 taken 874909 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 36 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 465 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 19 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1784 times.
✗ Branch 9 not taken.
1757286 return cached_data;
52 }
53
54 27399467 char *raw() const
55 {
56
1/2
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
54782319 return cached_data;
57 }
58
59 27141411 int length() const
60 {
61
2/2
✓ Branch 0 taken 24018605 times.
✓ Branch 1 taken 3122806 times.
52507142 return is_inlined() ? inlined.len : allocated.len;
62 }
63
64 28273055 void set_length(int length)
65 {
66
2/2
✓ Branch 0 taken 1762403 times.
✓ Branch 1 taken 26510652 times.
28273055 if(length > max_inline_length_){
67 1762403 inlined.len = (unsigned char)-1;
68 1762403 allocated.len = length;
69 }else{
70 26510652 inlined.len = length;
71 }
72 28273055 }
73
74 873763 void truncate(int newlen)
75 {
76 1747526 resize(newlen);
77 1420672 }
78
79 5579048 void assign(const char * newstr)
80 {
81
2/2
✓ Branch 0 taken 200 times.
✓ Branch 1 taken 5578848 times.
5579048 if (!newstr) newstr = "";
82 5579048 assign(newstr, strlen(newstr));
83 5579048 }
84
85 5895590 void assign(const string &newstr)
86 {
87 5895590 assign(newstr, newstr.length());
88 5895590 }
89
90 15919202 void assign(const char * newstr, int end)
91 {
92 15919202 resize(end);
93 7958830 copy(newstr, length(), raw());
94 15919202 }
95
96
97 551932 string& operator=(const char * newstr)
98 {
99 1103864 assign(newstr);
100 1100499 return *this;
101 }
102
103 1533277 string& operator=(const string &newstr)
104 {
105 2856310 assign(newstr);
106 1539055 return *this;
107 }
108
109 875184 string& operator+=(const string& other)
110 {
111 437592 int current_end = length();
112 875184 resize(length() + other.length());
113 875184 copy(other.data(), other.length(), raw() + current_end);
114 875184 return *this;
115 }
116
117 46432 string& operator+=(const char *other)
118 {
119 23216 int current_end = length();
120 46432 int otherlen=(int)strlen(other);
121 46432 resize(length() + otherlen);
122 46432 copy(other, otherlen, raw() + current_end);
123 46432 return *this;
124 }
125
126 9683665 string& operator+=(char c)
127 {
128 9683665 resize(length() + 1);
129 9683665 raw()[length() - 1] = c;
130 9683665 return *this;
131 }
132
133 string operator+(char right) const
134 {
135 string ret=*this;
136 ret+=right;
137 return ret;
138 }
139
140 22195 string operator+(const char * right) const
141 {
142 22195 string ret=*this;
143
1/2
✓ Branch 0 taken 22195 times.
✗ Branch 1 not taken.
44390 ret+=right;
144 22269 return ret;
145 }
146
147 5460 bool operator==(const char * right) const
148 {
149 5460 return !strcmp(data(), right);
150 }
151
152 104 bool operator==(const string& right) const
153 {
154 104 return !strcmp(data(), right.data());
155 }
156
157 1674 bool operator!=(const char * right) const
158 {
159 1674 return (strcmp(data(), right) != 0);
160 }
161
162 bool operator!=(const string& right) const
163 {
164 return (strcmp(data(), right.data()) != 0);
165 }
166
167 9051334 operator const char*() const
168 {
169 9051334 return data();
170 }
171
172 429818 explicit operator bool() const
173 {
174 429818 return length();
175 }
176
177 16713720 string()
178 16713720 {
179 //todo reduce I know this isn't all needed
180 16713720 allocated.bufferlen = 0;
181 16713720 allocated.str = 0;
182 16713720 allocated.len = 0;
183 16713720 inlined.len = 0;
184 16713720 cached_data = inlined.str;
185 16713720 next_resize = max_inline_length_+1;
186
187 12927270 }
188 4003928 string(const char * newstr) : string()
189 {
190
1/2
✓ Branch 0 taken 2001964 times.
✗ Branch 1 not taken.
4003928 assign(newstr);
191 3566452 }
192 2616350 string(const char * newstr, int newlen) : string()
193 {
194
1/2
✓ Branch 0 taken 1308175 times.
✗ Branch 1 not taken.
2616350 assign(newstr, newlen);
195 2179876 }
196 471256 string(const string& old) : string()
197 {
198
1/2
✓ Branch 0 taken 235628 times.
✗ Branch 1 not taken.
471256 assign(old.data());
199 471068 }
200
201 1118 string(string &&move) : string()
202 {
203
1/2
✓ Branch 0 taken 559 times.
✗ Branch 1 not taken.
559 *this = move;
204 1118 }
205
206 2828652 string& operator=(string&& move)
207 {
208
2/2
✓ Branch 0 taken 470 times.
✓ Branch 1 taken 1413856 times.
1414676 if(!is_inlined()) free(allocated.str);
209
2/2
✓ Branch 0 taken 579 times.
✓ Branch 1 taken 1413747 times.
2828652 if(!move.is_inlined()){
210 1046 allocated.str = move.allocated.str;
211 1046 allocated.bufferlen = move.allocated.bufferlen;
212 1046 set_length(move.allocated.len);
213
214 1046 move.inlined.len = 0;
215 1046 move.inlined.str[0] = 0;
216 1046 cached_data = allocated.str;
217 1046 next_resize = move.next_resize;
218
219 }else{
220 2827606 inlined.len = 0;
221 2827606 cached_data = inlined.str;
222 2827606 next_resize = max_inline_length_+1;
223 2827606 assign(move);
224 }
225 2828652 return *this;
226 }
227
228 41659785 ~string()
229 {
230
2/2
✓ Branch 0 taken 433775 times.
✓ Branch 1 taken 7923074 times.
25008317 if(!is_inlined()){
231 442985 free(allocated.str);
232 }
233 41659785 }
234
235 string& replace(const char * instr, const char * outstr, bool all=true);
236 string& qreplace(const char * instr, const char * outstr, bool all=true);
237
238 #ifdef SERIALIZER
239 void serialize(serializer & s)
240 {
241 s(str, allocated.bufferlen);
242 set_length(strlen(str));
243 }
244 #endif
245 #define SERIALIZER_BANNED
246
247 private:
248 static const int scale_factor = 3; //scale sso
249 static const int max_inline_length_ = ((sizeof(char *) + sizeof(int) * 2) * scale_factor) - 2;
250 char *cached_data;
251 int next_resize;
252 struct si{
253 char str[max_inline_length_ + 1];
254 unsigned char len;
255 };
256
257 struct sa{
258 char *str;
259 int len;
260 int bufferlen ;
261 };
262 union{
263 si inlined;
264 sa allocated;
265 };
266
267
268 28272009 void resize(int new_length)
269 {
270 14136612 const char *old_data = data();
271
8/8
✓ Branch 0 taken 27831370 times.
✓ Branch 1 taken 440639 times.
✓ Branch 2 taken 1304654 times.
✓ Branch 3 taken 12413566 times.
✓ Branch 4 taken 655 times.
✓ Branch 5 taken 1303934 times.
✓ Branch 6 taken 435896 times.
✓ Branch 7 taken 13700716 times.
28288858 if(new_length >= next_resize || (!is_inlined() && new_length <= max_inline_length_)) {
272
7/8
✓ Branch 0 taken 440639 times.
✓ Branch 1 taken 720 times.
✓ Branch 2 taken 341 times.
✓ Branch 3 taken 435238 times.
✓ Branch 4 taken 341 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 435241 times.
✓ Branch 7 taken 655 times.
441697 if(new_length > max_inline_length_ && (is_inlined() || allocated.bufferlen <= new_length)){ //SSO or big to big
273 440639 int new_size = bit_round(new_length + 1);
274
2/2
✓ Branch 0 taken 439960 times.
✓ Branch 1 taken 679 times.
440639 if(old_data == inlined.str){
275
1/2
✓ Branch 0 taken 5060 times.
✗ Branch 1 not taken.
445020 allocated.str = copy(old_data, min_val(length(), new_length), (char *)malloc(new_size));
276 }else{
277 679 allocated.str = (char *)realloc(allocated.str, new_size);
278 341 old_data = inlined.str; //this will prevent freeing a dead realloc ptr
279 }
280 440639 allocated.bufferlen = new_size;
281 440639 cached_data = allocated.str;
282 440639 next_resize = allocated.bufferlen;
283
5/6
✓ Branch 0 taken 655 times.
✓ Branch 1 taken 65 times.
✓ Branch 2 taken 655 times.
✓ Branch 3 taken 65 times.
✓ Branch 4 taken 655 times.
✗ Branch 5 not taken.
720 }else if(length() > max_inline_length_ && new_length <= max_inline_length_){ //big to SSO
284 720 copy(old_data, new_length, inlined.str);
285 720 cached_data = inlined.str;
286 720 next_resize = max_inline_length_+1;
287 }
288
5/6
✓ Branch 0 taken 720 times.
✓ Branch 1 taken 440639 times.
✓ Branch 2 taken 720 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 655 times.
✓ Branch 5 taken 435241 times.
441359 if(old_data != inlined.str && old_data != data()){
289 720 free((char *)old_data);
290 }
291 }
292 28272009 set_length(new_length);
293
294 28272009 raw()[new_length] = 0; //always ensure null terminator
295 28272009 }
296
297 52463524 bool is_inlined() const
298 {
299
36/40
✓ Branch 0 taken 1205840 times.
✓ Branch 1 taken 14124170 times.
✓ Branch 2 taken 41771 times.
✓ Branch 3 taken 16010 times.
✓ Branch 4 taken 1819 times.
✓ Branch 5 taken 88 times.
✓ Branch 6 taken 548228 times.
✓ Branch 7 taken 8321339 times.
✓ Branch 8 taken 543623 times.
✓ Branch 9 taken 2854 times.
✓ Branch 10 taken 236 times.
✓ Branch 11 taken 546519 times.
✓ Branch 12 taken 438838 times.
✓ Branch 13 taken 544110 times.
✓ Branch 14 taken 270584 times.
✓ Branch 15 taken 1395 times.
✓ Branch 16 taken 5256335 times.
✓ Branch 17 taken 8955 times.
✓ Branch 18 taken 4784586 times.
✓ Branch 19 taken 8088 times.
✓ Branch 20 taken 7954190 times.
✓ Branch 21 taken 8524 times.
✓ Branch 22 taken 3379959 times.
✓ Branch 23 taken 4909 times.
✓ Branch 24 taken 437343 times.
✓ Branch 25 taken 249 times.
✓ Branch 26 taken 437132 times.
✓ Branch 27 taken 867590 times.
✓ Branch 28 taken 347 times.
✓ Branch 29 taken 867344 times.
✓ Branch 30 taken 10254 times.
✓ Branch 31 taken 2670 times.
✓ Branch 32 taken 10116 times.
✓ Branch 33 taken 2808 times.
✓ Branch 34 taken 129 times.
✓ Branch 35 taken 72 times.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 39 not taken.
101698572 return inlined.len != (unsigned char)-1;
300 }
301 };
302 #define STR (string)
303
304 char * readfile(const char * fname, const char * basepath);
305 char * readfilenative(const char * fname);
306 bool readfile(const char * fname, const char * basepath, char ** data, int * len);//if you want an uchar*, cast it
307 char ** nsplit(char * str, const char * key, int maxlen, int * len);
308 char ** qnsplit(char * str, const char * key, int maxlen, int * len);
309 char ** qpnsplit(char * str, const char * key, int maxlen, int * len);
310 1190 inline char ** split(char * str, const char * key, int * len= nullptr) { return nsplit(str, key, 0, len); }
311 1749528 inline char ** qsplit(char * str, const char * key, int * len= nullptr) { return qnsplit(str, key, 0, len); }
312 219998 inline char ** qpsplit(char * str, const char * key, int * len= nullptr) { return qpnsplit(str, key, 0, len); }
313 inline char ** split1(char * str, const char * key, int * len= nullptr) { return nsplit(str, key, 2, len); }
314 inline char ** qsplit1(char * str, const char * key, int * len= nullptr) { return qnsplit(str, key, 2, len); }
315 inline char ** qpsplit1(char * str, const char * key, int * len= nullptr) { return qpnsplit(str, key, 2, len); }
316 //void replace(string& str, const char * instr, const char * outstr, bool all);
317 //void qreplace(string& str, const char * instr, const char * outstr, bool all);
318 bool confirmquotes(const char * str);
319 bool confirmqpar(const char * str);
320 char* strqpchr(const char* str, char key);
321 char* strqpstr(const char* str, const char* key);
322
323 inline string hex(unsigned int value)
324 {
325 char buffer[64];
326 if(0);
327 else if (value<=0x000000FF) sprintf(buffer, "%.2X", value);
328 else if (value<=0x0000FFFF) sprintf(buffer, "%.4X", value);
329 else if (value<=0x00FFFFFF) sprintf(buffer, "%.6X", value);
330 else sprintf(buffer, "%.8X", value);
331 return buffer;
332 }
333
334 inline string hex(unsigned int value, int width)
335 {
336 char buffer[64];
337 sprintf(buffer, "%.*X", width, value);
338 return buffer;
339 }
340
341 inline string hex0(unsigned int value)
342 {
343 char buffer[64];
344 sprintf(buffer, "%X", value);
345 return buffer;
346 }
347
348 inline string hex2(unsigned int value)
349 {
350 char buffer[64];
351 sprintf(buffer, "%.2X", value);
352 return buffer;
353 }
354
355 inline string hex3(unsigned int value)
356 {
357 char buffer[64];
358 sprintf(buffer, "%.3X", value);
359 return buffer;
360 }
361
362 inline string hex4(unsigned int value)
363 {
364 char buffer[64];
365 sprintf(buffer, "%.4X", value);
366 return buffer;
367 }
368
369 inline string hex5(unsigned int value)
370 {
371 char buffer[64];
372 sprintf(buffer, "%.5X", value);
373 return buffer;
374 }
375
376 2 inline string hex6(unsigned int value)
377 {
378 1 char buffer[64];
379 2 sprintf(buffer, "%.6X", value);
380
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
3 return buffer;
381 }
382
383 inline string hex8(unsigned int value)
384 {
385 char buffer[64];
386 sprintf(buffer, "%.8X", value);
387 return buffer;
388 }
389
390 1764 inline string dec(int value)
391 {
392 882 char buffer[64];
393 1764 sprintf(buffer, "%i", value);
394
1/2
✓ Branch 0 taken 882 times.
✗ Branch 1 not taken.
2646 return buffer;
395 }
396
397 211206 inline string ftostr(double value)
398 {
399 // randomdude999: With 100 digits of precision, the buffer needs to be approx. 311+100,
400 // but let's be safe here https://stackoverflow.com/questions/7235456
401 105603 char rval[512];
402 // RPG Hacker: Ridiculously high precision, I know, but we're working with doubles
403 // here and can afford it, so no need to waste any precision
404 211206 sprintf(rval, "%.100f", value);
405
1/2
✓ Branch 0 taken 211206 times.
✗ Branch 1 not taken.
211206 if (strchr(rval, '.'))//nuke useless zeroes
406 {
407 211206 char * end=strrchr(rval, '\0')-1;
408
2/2
✓ Branch 0 taken 21120252 times.
✓ Branch 1 taken 211206 times.
21331458 while (*end=='0')
409 {
410 21120252 *end='\0';
411 21120252 end--;
412 }
413
2/2
✓ Branch 0 taken 211200 times.
✓ Branch 1 taken 6 times.
211206 if (*end=='.') *end='\0';
414 }
415
1/2
✓ Branch 0 taken 105603 times.
✗ Branch 1 not taken.
316809 return rval;
416 }
417
418 // Same as above, but with variable precision
419 18 inline string ftostrvar(double value, int precision)
420 {
421 9 int clampedprecision = precision;
422
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
9 if (clampedprecision < 0) clampedprecision = 0;
423
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 9 times.
18 if (clampedprecision > 100) clampedprecision = 100;
424
425 // see above
426 9 char rval[512];
427 18 sprintf(rval, "%.*f", clampedprecision, (double)value);
428
2/2
✓ Branch 0 taken 16 times.
✓ Branch 1 taken 2 times.
18 if (strchr(rval, '.'))//nuke useless zeroes
429 {
430 16 char * end = strrchr(rval, '\0') - 1;
431
2/2
✓ Branch 0 taken 46 times.
✓ Branch 1 taken 16 times.
62 while (*end == '0')
432 {
433 46 *end = '\0';
434 46 end--;
435 }
436
2/2
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 10 times.
16 if (*end == '.') *end = '\0';
437 }
438
1/2
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
27 return rval;
439 }
440
441 2818866 inline bool stribegin(const char * str, const char * key)
442 {
443
2/2
✓ Branch 0 taken 4075508 times.
✓ Branch 1 taken 225382 times.
4300890 for (int i=0;key[i];i++)
444 {
445
2/2
✓ Branch 0 taken 2037754 times.
✓ Branch 1 taken 2037754 times.
4075508 if (to_lower(str[i])!=to_lower(key[i])) return false;
446 }
447 112691 return true;
448 }
449
450 13942 inline bool striend(const char * str, const char * key)
451 {
452 13942 const char * keyend=strrchr(key, '\0');
453 13942 const char * strend=strrchr(str, '\0');
454
2/2
✓ Branch 0 taken 15708 times.
✓ Branch 1 taken 2866 times.
18574 while (key!=keyend)
455 {
456 15708 keyend--;
457 15708 strend--;
458
2/2
✓ Branch 0 taken 7854 times.
✓ Branch 1 taken 7854 times.
15708 if (to_lower(*strend)!=to_lower(*keyend)) return false;
459 }
460 1433 return true;
461 }
462
463 235079 inline bool stricmpwithupper(const char *word1, const char *word2)
464 {
465
2/2
✓ Branch 0 taken 266243 times.
✓ Branch 1 taken 8567 times.
274810 while(*word2)
466 {
467
2/2
✓ Branch 0 taken 147738 times.
✓ Branch 1 taken 118505 times.
266243 if(to_upper(*word1++) != *word2++) return true;
468 }
469 8567 return *word1;
470 }
471
472 10590986 inline bool stricmpwithlower(const char *word1, const char *word2)
473 {
474
2/2
✓ Branch 0 taken 19109692 times.
✓ Branch 1 taken 1703860 times.
20813552 while(*word2)
475 {
476
2/2
✓ Branch 0 taken 9607556 times.
✓ Branch 1 taken 9502136 times.
19109692 if(to_lower(*word1++) != *word2++) return true;
477 }
478 1703860 return *word1;
479 }
480
481 //function: return the string without quotes around it, if any exists
482 //if they don't exist, return it unaltered
483 //it is not guaranteed to return str
484 //it is not guaranteed to not edit str
485 //the input must be freed even though it's garbage, the output must not
486 1368 inline const char * dequote(char * str)
487 {
488
2/2
✓ Branch 0 taken 84 times.
✓ Branch 1 taken 1284 times.
1368 if (*str!='"') return str;
489 642 int inpos=1;
490 642 int outpos=0;
491 while (true)
492 {
493
2/2
✓ Branch 0 taken 1428 times.
✓ Branch 1 taken 14066 times.
15494 if (str[inpos]=='"')
494 {
495
2/2
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 1284 times.
1428 if (str[inpos+1]=='"') inpos++;
496
1/2
✓ Branch 0 taken 1284 times.
✗ Branch 1 not taken.
1284 else if (str[inpos+1]=='\0') break;
497 else return nullptr;
498 }
499
2/2
✓ Branch 0 taken 7105 times.
✓ Branch 1 taken 7105 times.
14210 if (!str[inpos]) return nullptr;
500 14210 str[outpos++]=str[inpos++];
501 }
502 1284 str[outpos]=0;
503 1284 return str;
504 }
505
506 24201 inline char * strqchr(const char * str, char key)
507 {
508
2/2
✓ Branch 0 taken 179265 times.
✓ Branch 1 taken 19074 times.
198339 while (*str != '\0')
509 {
510
2/2
✓ Branch 0 taken 5123 times.
✓ Branch 1 taken 174142 times.
179265 if (*str == key) { return const_cast<char*>(str); }
511
4/4
✓ Branch 0 taken 173302 times.
✓ Branch 1 taken 840 times.
✓ Branch 2 taken 144 times.
✓ Branch 3 taken 173158 times.
174142 else if (*str == '"' || *str == '\'')
512 {
513 // Special case hack for ''', which is currently our official way of handling the ' character.
514 // Even though it really stinks.
515
5/6
✓ Branch 0 taken 144 times.
✓ Branch 1 taken 840 times.
✓ Branch 2 taken 8 times.
✓ Branch 3 taken 136 times.
✓ Branch 4 taken 8 times.
✗ Branch 5 not taken.
984 if (str[0] == '\'' && str[1] == '\'' && str[2] == '\'') { str += 2; }
516 else
517 {
518 500 char delimiter = *str;
519
520 do
521 {
522 13483 str++;
523
524 // If we want to support backslash escapes, we'll have to add that right here.
525
4/4
✓ Branch 0 taken 12511 times.
✓ Branch 1 taken 972 times.
✓ Branch 2 taken 12507 times.
✓ Branch 3 taken 4 times.
13483 } while (*str != delimiter && *str != '\0');
526
527 // This feels like a superfluous check, but I can't really find a clean way to avoid it.
528
2/2
✓ Branch 0 taken 476 times.
✓ Branch 1 taken 500 times.
976 if (*str == '\0') { return nullptr; }
529 }
530 }
531
532 174138 str++;
533 }
534
535 9537 return nullptr;
536 }
537
538 // RPG Hacker: WOW, these functions are poopy!
539 12547 inline char * strqrchr(const char * str, char key)
540 {
541 6605 const char * ret= nullptr;
542
2/2
✓ Branch 0 taken 84133 times.
✓ Branch 1 taken 12547 times.
96680 while (*str)
543 {
544
4/4
✓ Branch 0 taken 83445 times.
✓ Branch 1 taken 688 times.
✓ Branch 2 taken 80 times.
✓ Branch 3 taken 83365 times.
84133 if (*str=='"' || *str=='\'')
545 {
546 433 char token = *str;
547
548 768 str++;
549
550 // Special case hack for '''
551
4/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 762 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 3 times.
768 if (str[0] == '\'' && str[1] == '\'') { str += 2; }
552 else
553 {
554
2/2
✓ Branch 0 taken 7428 times.
✓ Branch 1 taken 764 times.
8192 while (*str != token)
555 {
556
2/2
✓ Branch 0 taken 3160 times.
✓ Branch 1 taken 4268 times.
7428 if (!*str) return nullptr;
557 7428 str++;
558 }
559 764 str++;
560 }
561 433 }
562 else
563 {
564
2/2
✓ Branch 0 taken 2755 times.
✓ Branch 1 taken 80610 times.
83365 if (*str==key) ret=str;
565 83365 str++;
566 }
567 }
568 6605 return const_cast<char*>(ret);
569 }
570
571 1380 inline string substr(const char * str, int len)
572 {
573 1380 return string(str, len);
574 }
575
576 string &strip_prefix(string &str, char c, bool multi=false);
577 string &strip_suffix(string &str, char c, bool multi=false);
578 string &strip_both(string &str, char c, bool multi=false);
579 string &strip_whitespace(string &str);
580
581 char * itrim(char * str, const char * left, const char * right, bool multi=false);
582 string &itrim(string &str, const char * left, const char * right, bool multi=false);
583
584 inline string &upper(string &old)
585 {
586 int length = old.length();
587 for (int i=0;i<length;i++) old.raw()[i]=(char)to_upper(old.data()[i]);
588 return old;
589 }
590
591
2/2
✓ Branch 0 taken 1235 times.
✓ Branch 1 taken 195 times.
1430 inline string &lower(string &old)
592 {
593 int length = old.length();
594
2/2
✓ Branch 0 taken 50368 times.
✓ Branch 1 taken 1430 times.
51798 for (int i=0;i<length;i++) old.raw()[i]=(char)to_lower(old.data()[i]);
595 1430 return old;
596 }
597
598 inline const char * stristr(const char * string, const char * pattern)
599 {
600 if (!*pattern) return string;
601 const char * pptr;
602 const char * sptr;
603 const char * start;
604 for (start=string;*start!=0;start++)
605 {
606 for (;(*start && (to_lower(*start)!=to_lower(*pattern)));start++);
607 if (!*start) return nullptr;
608 pptr=pattern;
609 sptr=start;
610 while (to_lower(*sptr)==to_lower(*pptr))
611 {
612 sptr++;
613 pptr++;
614 if (!*pptr) return start;
615 }
616 }
617 return nullptr;
618 }
619
620
621
622 // Returns number of connected lines - 1
623 template<typename stringarraytype>
624 873968 inline int getconnectedlines(stringarraytype& lines, int startline, string& out)
625 {
626
2/4
✓ Branch 0 taken 436984 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 436984 times.
✗ Branch 3 not taken.
873968 out = string("");
627 436984 int count = 1;
628
629
2/4
✓ Branch 0 taken 873467 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 519 times.
✗ Branch 3 not taken.
874505 for (int i = startline; lines[i]; i++)
630 {
631 // The line should already be stripped of any comments at this point
632 873986 int linestartpos = (int)strlen(lines[i]);
633
634 436993 bool found = false;
635
636
2/2
✓ Branch 0 taken 1726628 times.
✓ Branch 1 taken 10762 times.
1737390 for (int j = linestartpos; j > 0; j--)
637 {
638
9/12
✓ Branch 0 taken 1725590 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 863743 times.
✓ Branch 3 taken 862885 times.
✓ Branch 4 taken 862705 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 431612 times.
✓ Branch 7 taken 431702 times.
✓ Branch 8 taken 519 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 519 times.
✓ Branch 11 taken 519 times.
1728185 if (!is_space(lines[i][j]) && lines[i][j] != '\0' && lines[i][j] != ';')
639 {
640
4/4
✓ Branch 0 taken 15 times.
✓ Branch 1 taken 862690 times.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 516 times.
863224 if (lines[i][j] == '\\')
641 {
642 18 count++;
643
4/7
✓ Branch 0 taken 9 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✓ Branch 3 taken 3 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3 times.
✗ Branch 6 not taken.
18 out += string(lines[i], j);
644 9 found = true;
645 18 break;
646 }
647 else
648 {
649
4/7
✓ Branch 0 taken 431603 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 431087 times.
✓ Branch 3 taken 516 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 516 times.
✗ Branch 6 not taken.
863722 out += string(lines[i], j + 1);
650 863206 return count - 1;
651 }
652 }
653 }
654
655
2/2
✓ Branch 0 taken 10762 times.
✓ Branch 1 taken 18 times.
10780 if (!found)
656 {
657
2/7
✓ Branch 0 taken 5381 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 5381 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
10762 out += string(lines[i], 1);
658 10762 return count - 1;
659 }
660 }
661
662 return count - 1;
663 }
664