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:3504
3504
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:253138
yes
Evaluation Count:17129
17129-253138
22 if (*src >= 0x7f)
evaluated: *src >= 0x7f
TRUEFALSE
yes
Evaluation Count:199
yes
Evaluation Count:252961
199-252961
23 return false;
executed: return false;
Execution Count:199
199
24 *dst++ = *src++; -
25 }
executed: }
Execution Count:253027
253027
26 *dst = '\0'; -
27 return true;
executed: return true;
Execution Count:17131
17131
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:16792
199-16792
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:16792
16792
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:22205
no
Evaluation Count:0
0-22205
47 if (!acceptLeadingZero && *ptr == '0' &&
evaluated: !acceptLeadingZero
TRUEFALSE
yes
Evaluation Count:148
yes
Evaluation Count:22056
evaluated: *ptr == '0'
TRUEFALSE
yes
Evaluation Count:32
yes
Evaluation Count:116
32-22056
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:15056
yes
Evaluation Count:7146
partially evaluated: endptr == ptr
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7146
partially evaluated: ll != x
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:7146
0-15056
56 return false;
executed: return false;
Execution Count:15054
15054
57 -
58 if (*endptr == '.' || dotCount == 3) {
evaluated: *endptr == '.'
TRUEFALSE
yes
Evaluation Count:5323
yes
Evaluation Count:1823
evaluated: dotCount == 3
TRUEFALSE
yes
Evaluation Count:1772
yes
Evaluation Count:51
51-5323
59 if (x & ~0xff)
evaluated: x & ~0xff
TRUEFALSE
yes
Evaluation Count:3
yes
Evaluation Count:7092
3-7092
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:7092
12-7092
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:1778
yes
Evaluation Count:5365
evaluated: *endptr != '\0'
TRUEFALSE
yes
Evaluation Count:19
yes
Evaluation Count:1759
19-5365
74 return false;
executed: return false;
Execution Count:19
19
75 else if (dotCount == 3 || *endptr == '\0')
evaluated: dotCount == 3
TRUEFALSE
yes
Evaluation Count:1759
yes
Evaluation Count:5365
evaluated: *endptr == '\0'
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:5360
5-5365
76 return true;
executed: return true;
Execution Count:1764
1764
77 ++dotCount; -
78 ptr = endptr + 1; -
79 }
executed: }
Execution Count:5360
5360
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:876
876
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:338
0-338
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:5236
yes
Evaluation Count:338
338-5236
109 if (*ptr == ':')
evaluated: *ptr == ':'
TRUEFALSE
yes
Evaluation Count:1322
yes
Evaluation Count:3914
1322-3914
110 ++colonCount;
executed: ++colonCount;
Execution Count:1322
1322
111 if (*ptr == '.')
evaluated: *ptr == '.'
TRUEFALSE
yes
Evaluation Count:165
yes
Evaluation Count:5071
165-5071
112 ++dotCount;
executed: ++dotCount;
Execution Count:165
165
113 ++ptr; -
114 }
executed: }
Execution Count:5236
5236
115 -
116 if (dotCount != 0 && dotCount != 3)
evaluated: dotCount != 0
TRUEFALSE
yes
Evaluation Count:55
yes
Evaluation Count:283
evaluated: dotCount != 3
TRUEFALSE
yes
Evaluation Count:5
yes
Evaluation Count:50
5-283
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:210
evaluated: end - begin == 2
TRUEFALSE
yes
Evaluation Count:14
yes
Evaluation Count:109
14-210
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:204
evaluated: ptr[1] == ':'
TRUEFALSE
yes
Evaluation Count:110
yes
Evaluation Count:5
5-204
130 (ptr[end - begin - 2] == ':' && ptr[end - begin - 1] == ':')) {
evaluated: ptr[end - begin - 2] == ':'
TRUEFALSE
yes
Evaluation Count:88
yes
Evaluation Count:121
evaluated: ptr[end - begin - 1] == ':'
TRUEFALSE
yes
Evaluation Count:51
yes
Evaluation Count:37
37-121
131 zeroWordsToFill = 9 - colonCount; -
132 } else if (colonCount < 2 || colonCount > 7) {
evaluated: colonCount < 2
TRUEFALSE
yes
Evaluation Count:12
yes
Evaluation Count:146
evaluated: colonCount > 7
TRUEFALSE
yes
Evaluation Count:2
yes
Evaluation Count:144
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:144
144
137 if (dotCount)
evaluated: dotCount
TRUEFALSE
yes
Evaluation Count:47
yes
Evaluation Count:258
47-258
138 --zeroWordsToFill;
executed: --zeroWordsToFill;
Execution Count:47
47
139 -
140 int pos = 0; -
141 while (pos < 15) {
evaluated: pos < 15
TRUEFALSE
yes
Evaluation Count:1361
yes
Evaluation Count:45
45-1361
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:260
yes
Evaluation Count:1101
260-1101
148 -
149 if (zeroWordsToFill < 1)
evaluated: zeroWordsToFill < 1
TRUEFALSE
yes
Evaluation Count:23
yes
Evaluation Count:237
23-237
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:125
partially evaluated: pos == colonCount * 2
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:125
0-125
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:235
235
160 } -
161 if (!ok || ll != x)
partially evaluated: !ok
TRUEFALSE
no
Evaluation Count:0
yes
Evaluation Count:1101
evaluated: ll != x
TRUEFALSE
yes
Evaluation Count:4
yes
Evaluation Count:1097
0-1101
162 return false;
executed: return false;
Execution Count:4
4
163 -
164 if (*endptr == '.') {
evaluated: *endptr == '.'
TRUEFALSE
yes
Evaluation Count:41
yes
Evaluation Count:1056
41-1056
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:169
yes
Evaluation Count:887
169-887
185 break;
executed: break;
Execution Count:169
169
186 if (*endptr != ':')
evaluated: *endptr != ':'
TRUEFALSE
yes
Evaluation Count:21
yes
Evaluation Count:866
21-866
187 return false;
executed: return false;
Execution Count:21
21
188 ptr = endptr + 1; -
189 }
executed: }
Execution Count:866
866
190 return pos == 16;
executed: return pos == 16;
Execution Count:214
214
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:2232
2232
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:136
84-136
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:842
yes
Evaluation Count:189
189-842
238 if (address[i] == 0 && address[i + 1] == 0) {
evaluated: address[i] == 0
TRUEFALSE
yes
Evaluation Count:441
yes
Evaluation Count:401
evaluated: address[i + 1] == 0
TRUEFALSE
yes
Evaluation Count:199
yes
Evaluation Count:242
199-441
239 -
240 int j; -
241 for (j = i; j < 16; j += 2) {
evaluated: j < 16
TRUEFALSE
yes
Evaluation Count:881
yes
Evaluation Count:43
43-881
242 if (address[j] != 0 || address[j+1] != 0)
evaluated: address[j] != 0
TRUEFALSE
yes
Evaluation Count:59
yes
Evaluation Count:822
evaluated: address[j+1] != 0
TRUEFALSE
yes
Evaluation Count:97
yes
Evaluation Count:725
59-822
243 break;
executed: break;
Execution Count:156
156
244 }
executed: }
Execution Count:725
725
245 -
246 if (j - i > zeroRunLength) {
evaluated: j - i > zeroRunLength
TRUEFALSE
yes
Evaluation Count:181
yes
Evaluation Count:18
18-181
247 zeroRunLength = j - i; -
248 zeroRunOffset = i; -
249 i = j; -
250 }
executed: }
Execution Count:181
181
251 }
executed: }
Execution Count:199
199
252 }
executed: }
Execution Count:842
842
253 -
254 const QChar colon = ushort(':'); -
255 if (zeroRunLength < 4)
evaluated: zeroRunLength < 4
TRUEFALSE
yes
Evaluation Count:47
yes
Evaluation Count:142
47-142
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:89
53-89
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:966
yes
Evaluation Count:167
167-966
261 if (i == zeroRunOffset) {
evaluated: i == zeroRunOffset
TRUEFALSE
yes
Evaluation Count:142
yes
Evaluation Count:824
142-824
262 appendTo.append(colon); -
263 i += zeroRunLength - 2; -
264 continue;
executed: continue;
Execution Count:142
142
265 } -
266 -
267 if (i == 12 && embeddedIp4) {
evaluated: i == 12
TRUEFALSE
yes
Evaluation Count:122
yes
Evaluation Count:702
evaluated: embeddedIp4
TRUEFALSE
yes
Evaluation Count:22
yes
Evaluation Count:100
22-702
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:420
yes
Evaluation Count:382
382-420
277 if (address[i] >> 4) {
evaluated: address[i] >> 4
TRUEFALSE
yes
Evaluation Count:369
yes
Evaluation Count:51
51-369
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:369
partially evaluated: address[i] & 0xf
TRUEFALSE
yes
Evaluation Count:51
no
Evaluation Count:0
0-369
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:51
51
287 } else if (address[i + 1] >> 4) {
evaluated: address[i + 1] >> 4
TRUEFALSE
yes
Evaluation Count:221
yes
Evaluation Count:161
161-221
288 appendTo.append(toHex(address[i + 1] >> 4)); -
289 appendTo.append(toHex(address[i + 1] & 0xf)); -
290 } else {
executed: }
Execution Count:221
221
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:666
yes
Evaluation Count:136
136-666
295 appendTo.append(colon);
executed: appendTo.append(colon);
Execution Count:666
666
296 }
executed: }
Execution Count:802
802
297}
executed: }
Execution Count:167
167
298 -
299} -
300 -
301 -
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial