asar coverage - build #257


src/asar/
File: src/asar/libstr.h
Date: 2025-02-24 20:21:35
Lines:
198/210
94.3%
Functions:
54/56
96.4%
Branches:
482/697
69.2%

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 6310635 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 150646 inline bool is_digit(unsigned char c) { return char_props[c] & 0x40; }
17 inline bool is_alpha(unsigned char c) { return char_props[c] & 0x20; }
18 4200 inline bool is_lower(unsigned char c) { return char_props[c] & 0x04; }
19 5862 inline bool is_upper(unsigned char c) { return char_props[c] & 0x02; }
20 inline bool is_alnum(unsigned char c) { return char_props[c] & 0x60; }
21 41835 inline bool is_ualpha(unsigned char c) { return char_props[c] & 0x28; }
22 408534 inline bool is_ualnum(unsigned char c) { return char_props[c] & 0x68; }
23
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; }
24
25 2369540 inline char *copy(const char *source, int copy_length, char *dest)
26 {
27 5227083 memcpy(dest, source, copy_length*sizeof(char));
28 2369540 return dest;
29 }
30
31 class string {
32 public:
33 5203623 const char *data() const
34 {
35
231/348
✓ 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 6567 times.
✓ Branch 40 taken 126 times.
✓ Branch 41 taken 6066 times.
✓ Branch 42 taken 2666 times.
✓ Branch 43 taken 36414 times.
✓ Branch 44 taken 27 times.
✓ Branch 45 taken 82281 times.
✓ Branch 46 taken 172 times.
✓ Branch 47 taken 18 times.
✓ Branch 48 taken 83415 times.
✓ Branch 49 taken 159 times.
✓ Branch 50 taken 60 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 133 times.
✓ Branch 58 taken 252 times.
✓ Branch 59 taken 39 times.
✓ Branch 60 taken 9 times.
✓ Branch 61 taken 93 times.
✓ Branch 62 taken 42 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 90 times.
✓ Branch 65 taken 151 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 1239 times.
✓ Branch 68 taken 37 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 67059 times.
✓ Branch 71 taken 15166 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 45 times.
✓ Branch 74 taken 16338 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 45 times.
✓ Branch 77 taken 16269 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 45 times.
✓ Branch 80 taken 584 times.
✓ Branch 81 taken 87 times.
✗ Branch 82 not taken.
✓ Branch 83 taken 442 times.
✓ Branch 84 taken 151 times.
✗ Branch 85 not taken.
✓ Branch 86 taken 15833 times.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 61599 times.
✓ Branch 90 taken 15021 times.
✗ Branch 91 not taken.
✓ Branch 92 taken 36 times.
✓ Branch 93 taken 228 times.
✓ Branch 94 taken 15081 times.
✓ Branch 95 taken 84597 times.
✓ Branch 96 taken 411 times.
✓ Branch 97 taken 84674 times.
✓ Branch 98 taken 9 times.
✓ Branch 99 taken 402 times.
✓ Branch 100 taken 69264 times.
✓ Branch 101 taken 15414 times.
✓ Branch 102 taken 429 times.
✓ Branch 103 taken 162 times.
✓ Branch 104 taken 9 times.
✓ Branch 105 taken 38 times.
✓ Branch 106 taken 162 times.
✓ Branch 107 taken 9 times.
✓ Branch 108 taken 3923 times.
✗ Branch 109 not taken.
✓ Branch 110 taken 9 times.
✓ Branch 111 taken 20 times.
✓ Branch 112 taken 765 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 105 times.
✓ Branch 115 taken 153 times.
✓ Branch 116 taken 54 times.
✓ Branch 117 taken 105 times.
✓ Branch 118 taken 54 times.
✓ Branch 119 taken 153 times.
✓ Branch 120 taken 150 times.
✓ Branch 121 taken 9 times.
✓ Branch 122 taken 153 times.
✓ Branch 123 taken 144 times.
✓ Branch 124 taken 9 times.
✓ Branch 125 taken 153 times.
✗ Branch 126 not taken.
✓ Branch 127 taken 90 times.
✓ Branch 128 taken 144 times.
✗ Branch 129 not taken.
✓ Branch 130 taken 2898 times.
✗ Branch 131 not taken.
✗ Branch 132 not taken.
✓ Branch 133 taken 2880 times.
✓ Branch 134 taken 9 times.
✗ Branch 135 not taken.
✓ Branch 136 taken 6 times.
✓ Branch 137 taken 9 times.
✗ Branch 138 not taken.
✓ Branch 139 taken 6 times.
✗ Branch 140 not taken.
✓ Branch 141 taken 9 times.
✓ Branch 142 taken 10828 times.
✓ Branch 143 taken 36 times.
✓ Branch 144 taken 9 times.
✗ Branch 145 not taken.
✓ Branch 146 taken 10828 times.
✗ Branch 147 not taken.
✓ Branch 148 taken 9 times.
✓ Branch 149 taken 10828 times.
✗ Branch 150 not taken.
✓ Branch 151 taken 9 times.
✓ Branch 152 taken 15586 times.
✗ Branch 153 not taken.
✓ Branch 154 taken 51 times.
✓ Branch 155 taken 90 times.
✓ Branch 156 taken 12 times.
✓ Branch 157 taken 345 times.
✓ Branch 158 taken 90 times.
✓ Branch 159 taken 348 times.
✗ Branch 160 not taken.
✓ Branch 161 taken 60 times.
✓ Branch 162 taken 5024 times.
✗ Branch 163 not taken.
✓ Branch 164 taken 60 times.
✓ Branch 165 taken 5024 times.
✗ Branch 166 not taken.
✓ Branch 167 taken 2278 times.
✓ Branch 168 taken 15552 times.
✗ Branch 169 not taken.
✓ Branch 170 taken 2017 times.
✓ Branch 171 taken 15651 times.
✗ Branch 172 not taken.
✓ Branch 173 taken 24 times.
✗ Branch 174 not taken.
✓ Branch 175 taken 186 times.
✗ Branch 176 not taken.
✓ Branch 177 taken 180 times.
✓ Branch 178 taken 48 times.
✗ Branch 179 not taken.
✓ Branch 180 taken 72 times.
✓ Branch 181 taken 12 times.
✗ Branch 182 not taken.
✓ Branch 183 taken 180 times.
✓ Branch 184 taken 12 times.
✗ Branch 185 not taken.
✓ Branch 186 taken 21 times.
✗ Branch 187 not taken.
✓ Branch 188 taken 21 times.
✗ Branch 189 not taken.
✓ Branch 190 taken 18 times.
✗ Branch 191 not taken.
✓ Branch 192 taken 27 times.
✗ Branch 193 not taken.
✓ Branch 194 taken 27 times.
✗ Branch 195 not taken.
✓ Branch 196 taken 9 times.
✗ Branch 197 not taken.
✓ Branch 198 taken 18 times.
✗ Branch 199 not taken.
✓ Branch 200 taken 27 times.
✗ Branch 201 not taken.
✓ Branch 202 taken 27 times.
✗ Branch 203 not taken.
✓ Branch 204 taken 9 times.
✗ Branch 205 not taken.
✓ Branch 206 taken 9 times.
✗ Branch 207 not taken.
✓ Branch 208 taken 18 times.
✗ Branch 209 not taken.
✓ Branch 210 taken 27 times.
✗ Branch 211 not taken.
✓ Branch 212 taken 27 times.
✗ Branch 213 not taken.
✓ Branch 214 taken 18 times.
✗ Branch 215 not taken.
✓ Branch 216 taken 27 times.
✗ Branch 217 not taken.
✓ Branch 218 taken 27 times.
✗ Branch 219 not taken.
✓ Branch 220 taken 9 times.
✗ Branch 221 not taken.
✓ Branch 222 taken 9 times.
✗ Branch 223 not taken.
✓ Branch 224 taken 9 times.
✗ Branch 225 not taken.
✓ Branch 226 taken 18 times.
✗ Branch 227 not taken.
✓ Branch 228 taken 27 times.
✗ Branch 229 not taken.
✓ Branch 230 taken 27 times.
✗ Branch 231 not taken.
✓ Branch 232 taken 9 times.
✗ Branch 233 not taken.
✓ Branch 234 taken 18 times.
✗ Branch 235 not taken.
✓ Branch 236 taken 27 times.
✗ Branch 237 not taken.
✓ Branch 238 taken 27 times.
✗ Branch 239 not taken.
✓ Branch 240 taken 9 times.
✗ Branch 241 not taken.
✓ Branch 242 taken 9 times.
✗ Branch 243 not taken.
✓ Branch 244 taken 18 times.
✗ Branch 245 not taken.
✓ Branch 246 taken 27 times.
✗ Branch 247 not taken.
✓ Branch 248 taken 27 times.
✗ Branch 249 not taken.
✓ Branch 250 taken 9 times.
✗ Branch 251 not taken.
✓ Branch 252 taken 9 times.
✗ Branch 253 not taken.
✓ Branch 254 taken 18 times.
✗ Branch 255 not taken.
✓ Branch 256 taken 27 times.
✗ Branch 257 not taken.
✓ Branch 258 taken 27 times.
✗ Branch 259 not taken.
✓ Branch 260 taken 27 times.
✗ Branch 261 not taken.
✓ Branch 262 taken 27 times.
✗ Branch 263 not taken.
✓ Branch 264 taken 9 times.
✗ Branch 265 not taken.
✓ Branch 266 taken 9 times.
✗ Branch 267 not taken.
✓ Branch 268 taken 9 times.
✗ Branch 269 not taken.
✓ Branch 270 taken 18 times.
✗ Branch 271 not taken.
✓ Branch 272 taken 27 times.
✗ Branch 273 not taken.
✓ Branch 274 taken 27 times.
✗ Branch 275 not taken.
✓ Branch 276 taken 9 times.
✗ Branch 277 not taken.
✓ Branch 278 taken 18 times.
✗ Branch 279 not taken.
✓ Branch 280 taken 27 times.
✗ Branch 281 not taken.
✓ Branch 282 taken 27 times.
✗ Branch 283 not taken.
✓ Branch 284 taken 54 times.
✗ Branch 285 not taken.
✓ Branch 286 taken 54 times.
✗ Branch 287 not taken.
✓ Branch 288 taken 54 times.
✗ Branch 289 not taken.
✓ Branch 290 taken 108 times.
✗ Branch 291 not taken.
✓ Branch 292 taken 162 times.
✗ Branch 293 not taken.
✓ Branch 294 taken 162 times.
✗ Branch 295 not taken.
✓ Branch 296 taken 54 times.
✗ Branch 297 not taken.
✓ Branch 298 taken 108 times.
✗ Branch 299 not taken.
✓ Branch 300 taken 162 times.
✗ Branch 301 not taken.
✓ Branch 302 taken 162 times.
✗ Branch 303 not taken.
✓ Branch 304 taken 54 times.
✗ Branch 305 not taken.
✓ Branch 306 taken 54 times.
✗ Branch 307 not taken.
✓ Branch 308 taken 54 times.
✗ Branch 309 not taken.
✓ Branch 310 taken 54 times.
✗ Branch 311 not taken.
✓ Branch 312 taken 9 times.
✗ Branch 313 not taken.
✓ Branch 314 taken 9 times.
✗ Branch 315 not taken.
✓ Branch 316 taken 9 times.
✗ Branch 317 not taken.
✓ Branch 318 taken 9 times.
✗ Branch 319 not taken.
✓ Branch 320 taken 9 times.
✗ Branch 321 not taken.
✓ Branch 322 taken 9 times.
✗ Branch 323 not taken.
✓ Branch 324 taken 9 times.
✗ Branch 325 not taken.
✓ Branch 326 taken 9 times.
✗ Branch 327 not taken.
✓ Branch 328 taken 9 times.
✗ Branch 329 not taken.
✓ Branch 330 taken 9 times.
✗ Branch 331 not taken.
✓ Branch 332 taken 9 times.
✗ Branch 333 not taken.
✓ Branch 334 taken 9 times.
✗ Branch 335 not taken.
✓ Branch 336 taken 9 times.
✗ Branch 337 not taken.
✓ Branch 338 taken 9 times.
✗ Branch 339 not taken.
✓ Branch 340 taken 9 times.
✗ Branch 341 not taken.
✓ Branch 342 taken 9 times.
✗ Branch 343 not taken.
✓ Branch 344 taken 9 times.
✗ Branch 345 not taken.
✓ Branch 346 taken 9 times.
✗ Branch 347 not taken.
8437939 return data_ptr;
36 }
37
38 194023 char *temp_raw() const //things to cleanup and take a look at
39 {
40
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;
41 }
42
43 350311 char *raw() const
44 {
45
3/5
✓ Branch 0 taken 2127 times.
✓ Branch 1 taken 81126 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 36 times.
✗ Branch 4 not taken.
457983 return data_ptr;
46 }
47
48 6055364 int length() const
49 {
50
10/12
✓ Branch 0 taken 1215704 times.
✓ Branch 1 taken 122572 times.
✓ Branch 2 taken 964703 times.
✓ Branch 3 taken 97919 times.
✓ Branch 4 taken 22160 times.
✓ Branch 5 taken 3315 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 12 times.
✓ Branch 8 taken 90 times.
✓ Branch 9 taken 2239 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 132 times.
9697537 return len;
51 }
52
53 7644319 void resize(unsigned int new_length)
54 {
55
2/2
✓ Branch 0 taken 23551 times.
✓ Branch 1 taken 7620768 times.
7644319 if (new_length > capacity()) {
56 23551 reallocate_capacity(new_length);
57 }
58
59 7644319 len = new_length;
60 7644319 data_ptr[new_length] = 0; //always ensure null terminator
61 7644319 }
62
63 1188 void truncate(int newlen)
64 {
65
1/2
✓ Branch 0 taken 1188 times.
✗ Branch 1 not taken.
2376 resize(newlen);
66 2376 }
67
68 2491085 void assign(const char * newstr)
69 {
70
2/2
✓ Branch 0 taken 250 times.
✓ Branch 1 taken 2490835 times.
2491085 if (!newstr) newstr = "";
71 2491085 assign(newstr, strlen(newstr));
72 2491085 }
73
74 1584736 void assign(const string &newstr)
75 {
76 1584736 assign(newstr.data(), newstr.length());
77 1584736 }
78
79 4340624 void assign(const char * newstr, int end)
80 {
81 4340624 resize(end);
82 4340624 copy(newstr, end, data_ptr);
83 4340624 }
84
85
86 377252 string& operator=(const char * newstr)
87 {
88
15/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 taken 42 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 84669 times.
✗ Branch 25 not taken.
827052 assign(newstr);
89 791890 return *this;
90 }
91
92 696155 string& operator=(const string &newstr)
93 {
94
19/28
✓ Branch 0 taken 34383 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 6 times.
✓ Branch 7 taken 288 times.
✓ Branch 8 taken 744 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 45 times.
✓ Branch 11 taken 765 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 18 times.
✓ Branch 14 taken 153 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 18 times.
✓ Branch 17 taken 81 times.
✗ Branch 18 not taken.
✓ 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 1047 times.
✗ Branch 27 not taken.
1061016 assign(newstr);
95 1047644 return *this;
96 }
97
98 string& append(const string& other, int start, int end)
99 {
100 int current_end = length();
101 resize(length() + end - start);
102 copy(other.data() + start, end - start, data_ptr + current_end);
103 return *this;
104 }
105
106 9678 string& append(const char *other, int start, int end)
107 {
108 4845 int current_end = length();
109 9678 resize(length() + end - start);
110 9678 copy(other + start, end - start, data_ptr + current_end);
111 9678 return *this;
112 }
113
114 225065 string& operator+=(const string& other)
115 {
116 89935 int current_end = length();
117 225065 resize(length() + other.length());
118 225065 copy(other.data(), other.length(), data_ptr + current_end);
119 225065 return *this;
120 }
121
122 633856 string& operator+=(const char *other)
123 {
124 283940 int current_end = length();
125 633856 int otherlen=(int)strlen(other);
126 633856 resize(length() + otherlen);
127 633856 copy(other, otherlen, data_ptr + current_end);
128 633856 return *this;
129 }
130
131 2431228 string& operator+=(char c)
132 {
133 2431228 resize(length() + 1);
134 2431228 data_ptr[length() - 1] = c;
135 2431228 return *this;
136 }
137
138 string operator+(char right) const
139 {
140 string ret=*this;
141 ret+=right;
142 return ret;
143 }
144
145 149329 string operator+(const char * right) const
146 {
147 61009 string ret=*this;
148
1/2
✓ Branch 0 taken 149329 times.
✗ Branch 1 not taken.
149329 ret+=right;
149 149329 return ret;
150 }
151
152 3898254 operator const char*() const
153 {
154 3898254 return data();
155 }
156
157 15942 explicit operator bool() const
158 {
159 15942 return length();
160 }
161
162 2396923 string()
163 4773507 {
164 4969105 data_ptr = inlined.data;
165 4969105 len = 0;
166
29/31
✓ Branch 0 taken 31750 times.
✓ Branch 1 taken 1098 times.
✓ Branch 2 taken 73245 times.
✓ Branch 3 taken 9202 times.
✓ Branch 4 taken 2376 times.
✓ Branch 5 taken 18580 times.
✓ Branch 6 taken 29 times.
✓ Branch 7 taken 392 times.
✓ Branch 8 taken 3326 times.
✓ Branch 9 taken 5190 times.
✓ Branch 10 taken 82071 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 15228 times.
✓ Branch 17 taken 90 times.
✓ Branch 18 taken 72 times.
✓ Branch 19 taken 3063 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 42 times.
✓ Branch 22 taken 190 times.
✓ Branch 23 taken 3842 times.
✓ Branch 24 taken 160 times.
✓ Branch 25 taken 93464 times.
✓ Branch 26 taken 25 times.
✓ Branch 27 taken 95040 times.
✓ Branch 28 taken 5024 times.
✓ Branch 29 taken 270162 times.
✗ Branch 30 not taken.
3809447 inlined.data[0] = '\0';
167 2398940 }
168 1467432 string(const char * newstr) : string()
169 {
170
1/2
✓ Branch 0 taken 1467432 times.
✗ Branch 1 not taken.
1467432 assign(newstr);
171
45/68
✓ Branch 0 taken 5166 times.
✓ Branch 1 taken 32382 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 81969 times.
✓ Branch 10 taken 496 times.
✓ Branch 11 taken 124 times.
✓ Branch 12 taken 166638 times.
✓ Branch 13 taken 496 times.
✓ Branch 14 taken 124 times.
✓ Branch 15 taken 84795 times.
✓ Branch 16 taken 124 times.
✓ Branch 17 taken 124 times.
✓ Branch 18 taken 51 times.
✗ Branch 19 not taken.
✓ 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.
2140749 }
172 232260 string(const char * newstr, int newlen) : string()
173 {
174
1/2
✓ Branch 0 taken 232260 times.
✗ Branch 1 not taken.
232260 assign(newstr, newlen);
175
6/9
✓ Branch 0 taken 865 times.
✓ Branch 1 taken 744 times.
✓ Branch 2 taken 45 times.
✓ 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.
355923 }
176 196601 string(const string& old) : string()
177 {
178
1/2
✓ Branch 0 taken 196601 times.
✗ Branch 1 not taken.
196601 assign(old.data());
179
13/26
✓ Branch 0 taken 1047 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 12289 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 99 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 231 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 96 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 102 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 789 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 144 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 114 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1869 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 57 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1935 times.
✗ Branch 25 not taken.
303771 }
180
181 246463 string(string &&move) noexcept : string()
182 {
183 124362 *this = move;
184 246463 }
185
186 391101 string& operator=(string&& other) noexcept
187 {
188
2/2
✓ Branch 0 taken 142289 times.
✓ Branch 1 taken 165 times.
391101 if (other.is_inlined()) {
189 // No resources to steal so just do a normal assignment
190 142289 *this = other;
191 } else {
192
2/2
✓ Branch 0 taken 66 times.
✓ Branch 1 taken 99 times.
301 if (is_inlined()) {
193 113 data_ptr = other.data_ptr;
194 113 other.data_ptr = 0;
195 } else {
196 // Give our old allocation back so other can free it for us
197 99 std::swap(data_ptr, other.data_ptr);
198 }
199 301 len = other.len;
200 301 allocated = other.allocated;
201 }
202 391101 return *this;
203 }
204
205 12517564 ~string()
206 {
207
2/2
✓ Branch 0 taken 11336 times.
✓ Branch 1 taken 2300052 times.
7414476 if(!is_inlined()){
208 34270 free(data_ptr);
209 }
210 12517564 }
211
212 //maybe these should return refs to chain. but also good not to encourage chaining
213 5228 void strip_prefix(char c)
214 {
215
2/2
✓ Branch 0 taken 1492 times.
✓ Branch 1 taken 3736 times.
5228 if(data()[0] == c){
216 1492 std::memmove(data_ptr, data_ptr + 1, length() - 1);
217 1492 resize(length() - 1);
218 }
219 5228 }
220
221 void strip_suffix(char c)
222 {
223 if (data()[length() - 1] == c) {
224 truncate(length() - 1);
225 }
226 }
227
228 string& qreplace(const char * instr, const char * outstr);
229 string& qnormalize();
230
231 // RPG Hacker: My hack shmeck to get around no longer supporting text mode.
232 // Symbol files are currently the only thing that use text mode, anyways, and I don't even know
233 // if the emulators that read them care about line endings.
234 string& convert_line_endings_to_native()
235 {
236 #if defined(windows)
237 // RPG Hacker: This is quite stinky, but doing the replacement directly will lead to a dead-lock.
238 // \x08 = backspace should never appear inside a string, so I'm abusing it here.
239 return qreplace("\n", "\x08").qreplace("\x08", "\r\n");
240 #else
241 return *this;
242 #endif
243 }
244
245 #ifdef SERIALIZER
246 void serialize(serializer & s)
247 {
248 s(str, allocated.bufferlen);
249 resize(strlen(str));
250 }
251 #endif
252 #define SERIALIZER_BANNED
253
254 private:
255 static const int scale_factor = 4; //scale sso
256 static const int inline_capacity = ((sizeof(char *) + sizeof(int) * 2) * scale_factor) - 2;
257
258 // Points to a malloc'd data block or to inlined.data
259 char *data_ptr;
260 unsigned int len;
261 union {
262 struct {
263 // Actual allocated capacity is +1 this value, to cover for the terminating NUL
264 unsigned int capacity;
265 } allocated;
266 struct {
267 char data[inline_capacity + 1];
268 } inlined;
269 };
270
271 void reallocate_capacity(unsigned int new_length);
272
273 3422753 unsigned capacity() const
274 {
275
2/2
✓ Branch 0 taken 3412745 times.
✓ Branch 1 taken 10008 times.
3433277 return is_inlined() ? inline_capacity : allocated.capacity;
276 }
277
278 5888504 bool is_inlined() const
279 {
280
8/10
✓ Branch 0 taken 22890 times.
✓ Branch 1 taken 2540461 times.
✓ Branch 2 taken 248511 times.
✓ Branch 3 taken 136 times.
✓ Branch 4 taken 47 times.
✓ Branch 5 taken 89 times.
✓ Branch 6 taken 10524 times.
✓ Branch 7 taken 4211042 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
12922068 return data_ptr == inlined.data;
281 }
282 };
283 #define STR (string)
284
285 #define ASAR_STRCMP_OPERATORS(op) \
286 inline bool operator op(const string& left, const string& right) { \
287 return strcmp(left, right) op 0; \
288 } \
289 inline bool operator op(const string& left, const char* right) { \
290 return strcmp(left, right) op 0; \
291 } \
292 inline bool operator op(const char* left, const string& right) { \
293 return strcmp(left, right) op 0; \
294 }
295
296 358014 ASAR_STRCMP_OPERATORS(==)
297 28344 ASAR_STRCMP_OPERATORS(!=)
298 ASAR_STRCMP_OPERATORS(<)
299 ASAR_STRCMP_OPERATORS(<=)
300 ASAR_STRCMP_OPERATORS(>)
301 ASAR_STRCMP_OPERATORS(>=)
302 #undef ASAR_STRCMP_OPERATORS
303
304 template<>
305 struct std::hash<string> {
306 525249 size_t operator()(const ::string& s) const {
307 525249 return std::hash<std::string_view>()(std::string_view(s.data(), s.length()));
308 }
309 };
310
311 char * readfile(const char * fname, const char * basepath);
312 char * readfilenative(const char * fname);
313 bool readfile(const char * fname, const char * basepath, char ** data, int * len);//if you want an uchar*, cast it
314 char ** split(char * str, char key, int * len= nullptr);
315 char ** qsplit(char * str, char key, int * len= nullptr);
316 char ** qpsplit(char * str, char key, int * len= nullptr);
317 char ** qsplitstr(char * str, const char * key, int * len= nullptr);
318 bool confirmquotes(const char * str);
319 bool confirmqpar(const char * str);
320 char* strqpchr(char* str, char key);
321 char* strqpstr(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) snprintf(buffer, sizeof(buffer), "%.2X", value);
328 else if (value<=0x0000FFFF) snprintf(buffer, sizeof(buffer), "%.4X", value);
329 else if (value<=0x00FFFFFF) snprintf(buffer, sizeof(buffer), "%.6X", value);
330 else snprintf(buffer, sizeof(buffer), "%.8X", value);
331 return buffer;
332 }
333
334 6 inline string hex(unsigned int value, int width)
335 {
336 char buffer[64];
337 6 snprintf(buffer, sizeof(buffer), "%.*X", width, value);
338
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
9 return buffer;
339 }
340
341 21001 inline string dec(int value)
342 {
343 char buffer[64];
344 21001 snprintf(buffer, sizeof(buffer), "%i", value);
345
1/2
✓ Branch 0 taken 8835 times.
✗ Branch 1 not taken.
29836 return buffer;
346 }
347
348 6498 inline string ftostr(double value)
349 {
350 // randomdude999: With 100 digits of precision, the buffer needs to be approx. 311+100,
351 // but let's be safe here https://stackoverflow.com/questions/7235456
352 char rval[512];
353 // RPG Hacker: Ridiculously high precision, I know, but we're working with doubles
354 // here and can afford it, so no need to waste any precision
355 6498 snprintf(rval, sizeof(rval), "%.100f", value);
356
1/2
✓ Branch 0 taken 6498 times.
✗ Branch 1 not taken.
6498 if (strchr(rval, '.'))//nuke useless zeroes
357 {
358 6498 char * end=strrchr(rval, '\0')-1;
359
2/2
✓ Branch 0 taken 648756 times.
✓ Branch 1 taken 6498 times.
655254 while (*end=='0')
360 {
361 648756 *end='\0';
362 648756 end--;
363 }
364
2/2
✓ Branch 0 taken 6480 times.
✓ Branch 1 taken 18 times.
6498 if (*end=='.') *end='\0';
365 }
366
1/2
✓ Branch 0 taken 3249 times.
✗ Branch 1 not taken.
9747 return rval;
367 }
368
369 // Same as above, but with variable precision
370 54 inline string ftostrvar(double value, int precision)
371 {
372 27 int clampedprecision = precision;
373
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
27 if (clampedprecision < 0) clampedprecision = 0;
374
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 27 times.
54 if (clampedprecision > 100) clampedprecision = 100;
375
376 // see above
377 char rval[512];
378 54 snprintf(rval, sizeof(rval), "%.*f", clampedprecision, (double)value);
379
2/2
✓ Branch 0 taken 48 times.
✓ Branch 1 taken 6 times.
54 if (strchr(rval, '.'))//nuke useless zeroes
380 {
381 48 char * end = strrchr(rval, '\0') - 1;
382
2/2
✓ Branch 0 taken 138 times.
✓ Branch 1 taken 48 times.
186 while (*end == '0')
383 {
384 138 *end = '\0';
385 138 end--;
386 }
387
2/2
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 30 times.
48 if (*end == '.') *end = '\0';
388 }
389
1/2
✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
81 return rval;
390 }
391
392 269789 inline bool stribegin(const char * str, const char * key)
393 {
394
2/2
✓ Branch 0 taken 932503 times.
✓ Branch 1 taken 26248 times.
958751 for (int i=0;key[i];i++)
395 {
396
2/2
✓ Branch 0 taken 576617 times.
✓ Branch 1 taken 355886 times.
932503 if (to_lower(str[i])!=to_lower(key[i])) return false;
397 }
398 5638 return true;
399 }
400
401 inline bool striend(const char * str, const char * key)
402 {
403 const char * keyend=strrchr(key, '\0');
404 const char * strend=strrchr(str, '\0');
405 if(keyend-key > strend-str) return false;
406
407 while (key!=keyend)
408 {
409 keyend--;
410 strend--;
411 if (to_lower(*strend)!=to_lower(*keyend)) return false;
412 }
413 return true;
414 }
415
416 inline bool stricmpwithupper(const char *word1, const char *word2)
417 {
418 while(*word2)
419 {
420 if(to_upper(*word1++) != *word2++) return true;
421 }
422 return *word1;
423 }
424
425 2263361 inline bool stricmpwithlower(const char *word1, const char *word2)
426 {
427
2/2
✓ Branch 0 taken 3020540 times.
✓ Branch 1 taken 117728 times.
3138268 while(*word2)
428 {
429
2/2
✓ Branch 0 taken 1440198 times.
✓ Branch 1 taken 1580342 times.
3020540 if(to_lower(*word1++) != *word2++) return true;
430 }
431 117728 return *word1;
432 }
433
434 //function: return the string without quotes around it, if any exists
435 //if they don't exist, return it unaltered
436 //it is not guaranteed to return str
437 //it is not guaranteed to not edit str
438 //the input must be freed even though it's garbage, the output must not
439 29841 inline const char * dequote(char * str)
440 {
441
2/2
✓ Branch 0 taken 17514 times.
✓ Branch 1 taken 12327 times.
29841 if (*str!='"') return str;
442 27573 char *end = strrchr(str, '"');
443
1/2
✓ Branch 0 taken 27573 times.
✗ Branch 1 not taken.
27573 if (end)
444 {
445 27573 *end = 0;
446 27573 char *quote = str+1;
447
2/2
✓ Branch 0 taken 432 times.
✓ Branch 1 taken 27573 times.
28005 while((quote = strstr(quote, "\"\""))) memmove(quote, quote+1, strlen(quote));
448 11211 return str + 1;
449 }
450 return nullptr;
451 }
452
453 46066 inline char * strqchr(const char * str, char key)
454 {
455
2/2
✓ Branch 0 taken 407819 times.
✓ Branch 1 taken 34867 times.
442686 while (*str != '\0')
456 {
457
2/2
✓ Branch 0 taken 11193 times.
✓ Branch 1 taken 396626 times.
407819 if (*str == key) { return const_cast<char*>(str); }
458
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 == '\'')
459 {
460 // Special case hack for ''', which is currently our official way of handling the ' character.
461 // Even though it really stinks.
462
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; }
463 else
464 {
465 1253 char delimiter = *str;
466
467 do
468 {
469 27642 str++;
470
471 // If we want to support backslash escapes, we'll have to add that right here.
472
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');
473
474 // This feels like a superfluous check, but I can't really find a clean way to avoid it.
475
2/2
✓ Branch 0 taken 1183 times.
✓ Branch 1 taken 1253 times.
2436 if (*str == '\0') { return nullptr; }
476 }
477 }
478
479 396620 str++;
480 }
481
482 17481 return nullptr;
483 }
484
485 3921 inline string substr(const char * str, int len)
486 {
487 3921 return string(str, len);
488 }
489
490
491 209379 inline char *strip_whitespace(char *str)
492 {
493
2/2
✓ Branch 0 taken 11222 times.
✓ Branch 1 taken 209379 times.
220601 while(is_space(*str)) str++;
494
2/2
✓ Branch 0 taken 193597 times.
✓ Branch 1 taken 63202 times.
256799 for(int i = strlen(str) - 1; i >= 0; i--)
495 {
496
2/2
✓ Branch 0 taken 146177 times.
✓ Branch 1 taken 47420 times.
193597 if(!is_space(str[i]))
497 {
498 146177 str[i + 1] = 0;
499 146177 return str;
500 }
501 }
502 31641 return str;
503 }
504 6984 inline void strip_whitespace(string &str)
505 {
506
1/2
✓ Branch 0 taken 3506 times.
✗ Branch 1 not taken.
10462 str = string(strip_whitespace(str.temp_raw()));
507 6984 }
508
509 string &itrim(string &str, const char * left, const char * right);
510
511 34343 inline string &lower(string &old)
512 {
513 92 int length = old.length();
514
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]);
515 34343 return old;
516 }
517
518
519 // Returns number of connected lines - 1
520 template<typename stringarraytype>
521 148293 inline int getconnectedlines(stringarraytype& lines, int startline, string& out)
522 {
523 71709 int count = 0;
524
525
1/2
✓ Branch 0 taken 148347 times.
✗ Branch 1 not taken.
148347 for (int i = startline; lines[i]; i++)
526 {
527 // The line should already be stripped of any comments at this point
528 148347 int linestartpos = (int)strlen(lines[i]);
529
530
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] == '\\')
531 {
532 54 count++;
533
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);
534 27 continue;
535 }
536 else
537 {
538
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);
539 148293 return count;
540 }
541 }
542
543 return count;
544 }
545