io/qipaddress.cpp

Switch to Source codePreprocessed file
LineSource CodeCoverage
1 -
2 -
3namespace QIPAddressUtils { -
4 -
5static QString number(quint8 val, int base = 10) -
6{ -
7 QChar zero(0x30); -
8 return val ? qulltoa(val, base, zero) : zero;
executed: return val ? qulltoa(val, base, zero) : zero;
Execution Count:3480
3480
9} -
10 -
11typedef QVarLengthArray<char, 64> Buffer; -
12static bool checkedToAscii(Buffer &buffer, const QChar *begin, const QChar *end) -
13{ -
14 const ushort *const ubegin = reinterpret_cast<const ushort *>(begin); -
15 const ushort *const uend = reinterpret_cast<const ushort *>(end); -
16 const ushort *src = ubegin; -
17 -
18 buffer.resize(uend - ubegin + 1); -
19 char *dst = buffer.data(); -
20 -
21 while (src != uend) {
evaluated: src != uend
TRUEFALSE
yes
Evaluation Count:262201
yes
Evaluation Count:17475
17475-262201
22 if (*src >= 0x7f)
evaluated: *src >= 0x7f
TRUEFALSE
yes
Evaluation Count:199
yes
Evaluation Count:262034
199-262034
23 return false;
executed: return false;
Execution Count:199
199
24 *dst++ = *src++; -
25 }
executed: }
Execution Count:262069
262069
26 *dst = '\0'; -
27 return true;
executed: return true;
Execution Count:17476
17476
28} -
29 -
30static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptLeadingZero); -
31bool parseIp4(IPv4Address &address, const QChar *begin, const QChar *end) -
32{ -
33 qt_noop(); -
34 Buffer buffer; -
35 if (!checkedToAscii(buffer, begin, end))
evaluated: !checkedToAscii(buffer, begin, end)
TRUEFALSE
yes
Evaluation Count:199
yes
Evaluation Count:17140
199-17140
36 return false;
executed: return false;
Execution Count:199
199
37 -
38 const char *ptr = buffer.data(); -
39 return parseIp4Internal(address, ptr, true);
executed: return parseIp4Internal(address, ptr, true);
Execution Count:17140
17140
40} -
41 -
42static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptLeadingZero) -
43{ -
44 address = 0; -
45 int dotCount = 0; -
46 while (dotCount < 4) {
partially evaluated: dotCount < 4
TRUEFALSE
yes
Evaluation Count:22535
no
Evaluation Count:0
0-22535
47 if (!acceptLeadingZero && *ptr == '0' &&
evaluated: !acceptLeadingZero
TRUEFALSE
yes
Evaluation Count:148
yes
Evaluation Count:22383
evaluated: *ptr == '0'
TRUEFALSE
yes
Evaluation Count:32
yes
Evaluation Count:116
32-22383
48 ptr[1] != '.' && ptr[1] != '\0')
evaluated: ptr[1] != '.'
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:29
partially evaluated: ptr[1] != '\0'
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:3
0-29
49 return false;
never executed: return false;
0
50 -
51 const char *endptr; -
52 bool ok; -
53 quint64 ll = qstrtoull(ptr, &endptr, 0, &ok); -
54 quint32 x = ll; -
55 if (!ok || endptr == ptr || ll != x)
evaluated: !ok
TRUEFALSE
yes
Evaluation Count:15311
yes
Evaluation Count:7137
partially evaluated: endptr == ptr
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7137
partially evaluated: ll != x
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7137
0-15311
56 return false;
executed: return false;
Execution Count:15298
15298
57 -
58 if (*endptr == '.' || dotCount == 3) {
evaluated: *endptr == '.'
TRUEFALSE
yes
Evaluation Count:5317
yes
Evaluation Count:1821
evaluated: dotCount == 3
TRUEFALSE
yes
Evaluation Count:1770
yes
Evaluation Count:51
51-5317
59 if (x & ~0xff)
evaluated: x & ~0xff
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:7083
3-7083
60 return false;
executed: return false;
Execution Count:3
3
61 address <<= 8; -
62 } else if (dotCount == 2) {
evaluated: dotCount == 2
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:39
executed: }
Execution Count:7083
12-7083
63 if (x & ~0xffff)
partially evaluated: x & ~0xffff
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:12
0-12
64 return false;
never executed: return false;
0
65 address <<= 16; -
66 } else if (dotCount == 1) {
executed: }
Execution Count:12
evaluated: dotCount == 1
TRUEFALSE
yes
Evaluation Count:14
yes
Evaluation Count:25
12-25
67 if (x & ~0xffffff)
partially evaluated: x & ~0xffffff
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:14
0-14
68 return false;
never executed: return false;
0
69 address <<= 24; -
70 }
executed: }
Execution Count:14
14
71 address |= x; -
72 -
73 if (dotCount == 3 && *endptr != '\0')
evaluated: dotCount == 3
TRUEFALSE
yes
Evaluation Count:1776
yes
Evaluation Count:5359
evaluated: *endptr != '\0'
TRUEFALSE
yes
Evaluation Count:19
yes
Evaluation Count:1757
19-5359
74 return false;
executed: return false;
Execution Count:19
19
75 else if (dotCount == 3 || *endptr == '\0')
evaluated: dotCount == 3
TRUEFALSE
yes
Evaluation Count:1757
yes
Evaluation Count:5359
evaluated: *endptr == '\0'
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:5354
5-5359
76 return true;
executed: return true;
Execution Count:1762
1762
77 ++dotCount; -
78 ptr = endptr + 1; -
79 }
executed: }
Execution Count:5354
5354
80 return false;
never executed: return false;
0
81} -
82 -
83void toString(QString &appendTo, IPv4Address address) -
84{ -
85 -
86 -
87 appendTo += number(address >> 24) -
88 % QLatin1Char('.') -
89 % number(address >> 16) -
90 % QLatin1Char('.') -
91 % number(address >> 8) -
92 % QLatin1Char('.') -
93 % number(address); -
94}
executed: }
Execution Count:870
870
95 -
96bool parseIp6(IPv6Address &address, const QChar *begin, const QChar *end) -
97{ -
98 qt_noop(); -
99 Buffer buffer; -
100 if (!checkedToAscii(buffer, begin, end))
partially evaluated: !checkedToAscii(buffer, begin, end)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:336
0-336
101 return false;
never executed: return false;
0
102 -
103 const char *ptr = buffer.data(); -
104 -
105 -
106 int colonCount = 0; -
107 int dotCount = 0; -
108 while (*ptr) {
evaluated: *ptr
TRUEFALSE
yes
Evaluation Count:5194
yes
Evaluation Count:336
336-5194
109 if (*ptr == ':')
evaluated: *ptr == ':'
TRUEFALSE
yes
Evaluation Count:1312
yes
Evaluation Count:3882
1312-3882
110 ++colonCount;
executed: ++colonCount;
Execution Count:1312
1312
111 if (*ptr == '.')
evaluated: *ptr == '.'
TRUEFALSE
yes
Evaluation Count:165
yes
Evaluation Count:5029
165-5029
112 ++dotCount;
executed: ++dotCount;
Execution Count:165
165
113 ++ptr; -
114 }
executed: }
Execution Count:5194
5194
115 -
116 if (dotCount != 0 && dotCount != 3)
evaluated: dotCount != 0
TRUEFALSE
yes
Evaluation Count:55
yes
Evaluation Count:281
evaluated: dotCount != 3
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:50
5-281
117 return false;
executed: return false;
Execution Count:5
5
118 -
119 memset(address, 0, sizeof address); -
120 if (colonCount == 2 && end - begin == 2)
evaluated: colonCount == 2
TRUEFALSE
yes
Evaluation Count:123
yes
Evaluation Count:208
evaluated: end - begin == 2
TRUEFALSE
yes
Evaluation Count:14
yes
Evaluation Count:109
14-208
121 return true;
executed: return true;
Execution Count:14
14
122 -
123 -
124 int zeroWordsToFill; -
125 ptr = buffer.data(); -
126 -
127 -
128 -
129 if ((ptr[0] == ':' && ptr[1] == ':') ||
evaluated: ptr[0] == ':'
TRUEFALSE
yes
Evaluation Count:115
yes
Evaluation Count:202
evaluated: ptr[1] == ':'
TRUEFALSE
yes
Evaluation Count:110
yes
Evaluation Count:5
5-202
130 (ptr[end - begin - 2] == ':' && ptr[end - begin - 1] == ':')) {
evaluated: ptr[end - begin - 2] == ':'
TRUEFALSE
yes
Evaluation Count:88
yes
Evaluation Count:119
evaluated: ptr[end - begin - 1] == ':'
TRUEFALSE
yes
Evaluation Count:51
yes
Evaluation Count:37
37-119
131 zeroWordsToFill = 9 - colonCount; -
132 } else if (colonCount < 2 || colonCount > 7) {
evaluated: colonCount < 2
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:144
evaluated: colonCount > 7
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:142
executed: }
Execution Count:161
2-161
133 return false;
executed: return false;
Execution Count:14
14
134 } else { -
135 zeroWordsToFill = 8 - colonCount; -
136 }
executed: }
Execution Count:142
142
137 if (dotCount)
evaluated: dotCount
TRUEFALSE
yes
Evaluation Count:47
yes
Evaluation Count:256
47-256
138 --zeroWordsToFill;
executed: --zeroWordsToFill;
Execution Count:47
47
139 -
140 int pos = 0; -
141 while (pos < 15) {
evaluated: pos < 15
TRUEFALSE
yes
Evaluation Count:1349
yes
Evaluation Count:45
45-1349
142 const char *endptr; -
143 bool ok; -
144 quint64 ll = qstrtoull(ptr, &endptr, 16, &ok); -
145 quint16 x = ll; -
146 -
147 if (ptr == endptr) {
evaluated: ptr == endptr
TRUEFALSE
yes
Evaluation Count:258
yes
Evaluation Count:1091
258-1091
148 -
149 if (zeroWordsToFill < 1)
evaluated: zeroWordsToFill < 1
TRUEFALSE
yes
Evaluation Count:23
yes
Evaluation Count:235
23-235
150 return false;
executed: return false;
Execution Count:23
23
151 if (pos == 0 || pos == colonCount * 2) {
evaluated: pos == 0
TRUEFALSE
yes
Evaluation Count:112
yes
Evaluation Count:123
partially evaluated: pos == colonCount * 2
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:123
0-123
152 if (ptr[0] == '\0' || ptr[1] != ':')
partially evaluated: ptr[0] == '\0'
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:112
evaluated: ptr[1] != ':'
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:110
0-112
153 return false;
executed: return false;
Execution Count:2
2
154 ++ptr; -
155 }
executed: }
Execution Count:110
110
156 pos += zeroWordsToFill * 2; -
157 zeroWordsToFill = 0; -
158 ++ptr; -
159 continue;
executed: continue;
Execution Count:233
233
160 } -
161 if (!ok || ll != x)
partially evaluated: !ok
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1091
evaluated: ll != x
TRUEFALSE
yes
Evaluation Count:4
yes
Evaluation Count:1087
0-1091
162 return false;
executed: return false;
Execution Count:4
4
163 -
164 if (*endptr == '.') {
evaluated: *endptr == '.'
TRUEFALSE
yes
Evaluation Count:41
yes
Evaluation Count:1046
41-1046
165 -
166 -
167 if (pos != 12)
evaluated: pos != 12
TRUEFALSE
yes
Evaluation Count:4
yes
Evaluation Count:37
4-37
168 return false;
executed: return false;
Execution Count:4
4
169 -
170 IPv4Address ip4; -
171 if (!parseIp4Internal(ip4, ptr, false))
partially evaluated: !parseIp4Internal(ip4, ptr, false)
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:37
0-37
172 return false;
never executed: return false;
0
173 -
174 address[12] = ip4 >> 24; -
175 address[13] = ip4 >> 16; -
176 address[14] = ip4 >> 8; -
177 address[15] = ip4; -
178 return true;
executed: return true;
Execution Count:37
37
179 } -
180 -
181 address[pos++] = x >> 8; -
182 address[pos++] = x & 0xff; -
183 -
184 if (*endptr == '\0')
evaluated: *endptr == '\0'
TRUEFALSE
yes
Evaluation Count:167
yes
Evaluation Count:879
167-879
185 break;
executed: break;
Execution Count:167
167
186 if (*endptr != ':')
evaluated: *endptr != ':'
TRUEFALSE
yes
Evaluation Count:21
yes
Evaluation Count:858
21-858
187 return false;
executed: return false;
Execution Count:21
21
188 ptr = endptr + 1; -
189 }
executed: }
Execution Count:858
858
190 return pos == 16;
executed: return pos == 16;
Execution Count:212
212
191} -
192 -
193static inline QChar toHex(uchar c) -
194{ -
195 return ushort(c > 9 ? c + 'a' - 0xA : c + '0');
executed: return ushort(c > 9 ? c + 'a' - 0xA : c + '0');
Execution Count:2184
2184
196} -
197 -
198void toString(QString &appendTo, IPv6Address address) -
199{ -
200 -
201 -
202 -
203 -
204 -
205 -
206 -
207 static const int Ip6AddressMaxLen = sizeof "1111:2222:3333:4444:5555:6666:7777:8888"; -
208 static const int Ip6WithIp4AddressMaxLen = sizeof "::ffff:255.255.255.255"; -
209 -
210 -
211 const quint64 zeroes[] = { 0, 0 }; -
212 bool embeddedIp4 = false; -
213 -
214 -
215 -
216 -
217 if (memcmp(address, zeroes, 10) == 0) {
evaluated: memcmp(address, zeroes, 10) == 0
TRUEFALSE
yes
Evaluation Count:84
yes
Evaluation Count:133
84-133
218 if (address[10] == 0xff && address[11] == 0xff) {
evaluated: address[10] == 0xff
TRUEFALSE
yes
Evaluation Count:17
yes
Evaluation Count:67
partially evaluated: address[11] == 0xff
TRUEFALSE
yes
Evaluation Count:17
no
Evaluation Count:0
0-67
219 embeddedIp4 = true; -
220 } else if (address[10] == 0 && address[11] == 0) {
partially evaluated: address[10] == 0
TRUEFALSE
yes
Evaluation Count:67
no
Evaluation Count:0
partially evaluated: address[11] == 0
TRUEFALSE
yes
Evaluation Count:67
no
Evaluation Count:0
executed: }
Execution Count:17
0-67
221 if (address[12] != 0 || address[13] != 0 || address[14] != 0) {
evaluated: address[12] != 0
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:62
partially evaluated: address[13] != 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:62
partially evaluated: address[14] != 0
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:62
0-62
222 embeddedIp4 = true; -
223 } else if (address[15] == 0) {
executed: }
Execution Count:5
evaluated: address[15] == 0
TRUEFALSE
yes
Evaluation Count:31
yes
Evaluation Count:31
5-31
224 appendTo.append(QLatin1String("::")); -
225 return;
executed: return;
Execution Count:31
31
226 } -
227 } -
228 } -
229 -
230 -
231 appendTo.reserve(appendTo.size() + -
232 (embeddedIp4 ? Ip6WithIp4AddressMaxLen : Ip6AddressMaxLen)); -
233 -
234 -
235 int zeroRunLength = 0; -
236 int zeroRunOffset = 0; -
237 for (int i = 0; i < 16; i += 2) {
evaluated: i < 16
TRUEFALSE
yes
Evaluation Count:827
yes
Evaluation Count:186
186-827
238 if (address[i] == 0 && address[i + 1] == 0) {
evaluated: address[i] == 0
TRUEFALSE
yes
Evaluation Count:438
yes
Evaluation Count:389
evaluated: address[i + 1] == 0
TRUEFALSE
yes
Evaluation Count:196
yes
Evaluation Count:242
196-438
239 -
240 int j; -
241 for (j = i; j < 16; j += 2) {
evaluated: j < 16
TRUEFALSE
yes
Evaluation Count:869
yes
Evaluation Count:43
43-869
242 if (address[j] != 0 || address[j+1] != 0)
evaluated: address[j] != 0
TRUEFALSE
yes
Evaluation Count:59
yes
Evaluation Count:810
evaluated: address[j+1] != 0
TRUEFALSE
yes
Evaluation Count:94
yes
Evaluation Count:716
59-810
243 break;
executed: break;
Execution Count:153
153
244 }
executed: }
Execution Count:716
716
245 -
246 if (j - i > zeroRunLength) {
evaluated: j - i > zeroRunLength
TRUEFALSE
yes
Evaluation Count:178
yes
Evaluation Count:18
18-178
247 zeroRunLength = j - i; -
248 zeroRunOffset = i; -
249 i = j; -
250 }
executed: }
Execution Count:178
178
251 }
executed: }
Execution Count:196
196
252 }
executed: }
Execution Count:827
827
253 -
254 const QChar colon = ushort(':'); -
255 if (zeroRunLength < 4)
evaluated: zeroRunLength < 4
TRUEFALSE
yes
Evaluation Count:47
yes
Evaluation Count:139
47-139
256 zeroRunOffset = -1;
executed: zeroRunOffset = -1;
Execution Count:47
47
257 else if (zeroRunOffset == 0)
evaluated: zeroRunOffset == 0
TRUEFALSE
yes
Evaluation Count:53
yes
Evaluation Count:86
53-86
258 appendTo.append(colon);
executed: appendTo.append(colon);
Execution Count:53
53
259 -
260 for (int i = 0; i < 16; i += 2) {
evaluated: i < 16
TRUEFALSE
yes
Evaluation Count:948
yes
Evaluation Count:164
164-948
261 if (i == zeroRunOffset) {
evaluated: i == zeroRunOffset
TRUEFALSE
yes
Evaluation Count:139
yes
Evaluation Count:809
139-809
262 appendTo.append(colon); -
263 i += zeroRunLength - 2; -
264 continue;
executed: continue;
Execution Count:139
139
265 } -
266 -
267 if (i == 12 && embeddedIp4) {
evaluated: i == 12
TRUEFALSE
yes
Evaluation Count:122
yes
Evaluation Count:687
evaluated: embeddedIp4
TRUEFALSE
yes
Evaluation Count:22
yes
Evaluation Count:100
22-687
268 IPv4Address ip4 = address[12] << 24 | -
269 address[13] << 16 | -
270 address[14] << 8 | -
271 address[15]; -
272 toString(appendTo, ip4); -
273 return;
executed: return;
Execution Count:22
22
274 } -
275 -
276 if (address[i]) {
evaluated: address[i]
TRUEFALSE
yes
Evaluation Count:408
yes
Evaluation Count:379
379-408
277 if (address[i] >> 4) {
evaluated: address[i] >> 4
TRUEFALSE
yes
Evaluation Count:363
yes
Evaluation Count:45
45-363
278 appendTo.append(toHex(address[i] >> 4)); -
279 appendTo.append(toHex(address[i] & 0xf)); -
280 appendTo.append(toHex(address[i + 1] >> 4)); -
281 appendTo.append(toHex(address[i + 1] & 0xf)); -
282 } else if (address[i] & 0xf) {
executed: }
Execution Count:363
partially evaluated: address[i] & 0xf
TRUEFALSE
yes
Evaluation Count:45
no
Evaluation Count:0
0-363
283 appendTo.append(toHex(address[i] & 0xf)); -
284 appendTo.append(toHex(address[i + 1] >> 4)); -
285 appendTo.append(toHex(address[i + 1] & 0xf)); -
286 }
executed: }
Execution Count:45
45
287 } else if (address[i + 1] >> 4) {
evaluated: address[i + 1] >> 4
TRUEFALSE
yes
Evaluation Count:218
yes
Evaluation Count:161
161-218
288 appendTo.append(toHex(address[i + 1] >> 4)); -
289 appendTo.append(toHex(address[i + 1] & 0xf)); -
290 } else {
executed: }
Execution Count:218
218
291 appendTo.append(toHex(address[i + 1] & 0xf)); -
292 }
executed: }
Execution Count:161
161
293 -
294 if (i != 14)
evaluated: i != 14
TRUEFALSE
yes
Evaluation Count:654
yes
Evaluation Count:133
133-654
295 appendTo.append(colon);
executed: appendTo.append(colon);
Execution Count:654
654
296 }
executed: }
Execution Count:787
787
297}
executed: }
Execution Count:164
164
298 -
299} -
300 -
301 -
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial