Line | Source Code | Coverage |
---|
1 | /**************************************************************************** | - |
2 | ** | - |
3 | ** Copyright (C) 2012 Intel Corporation | - |
4 | ** Contact: http://www.qt-project.org/legal | - |
5 | ** | - |
6 | ** This file is part of the QtCore module of the Qt Toolkit. | - |
7 | ** | - |
8 | ** $QT_BEGIN_LICENSE:LGPL$ | - |
9 | ** Commercial License Usage | - |
10 | ** Licensees holding valid commercial Qt licenses may use this file in | - |
11 | ** accordance with the commercial license agreement provided with the | - |
12 | ** Software or, alternatively, in accordance with the terms contained in | - |
13 | ** a written agreement between you and Digia. For licensing terms and | - |
14 | ** conditions see http://qt.digia.com/licensing. For further information | - |
15 | ** use the contact form at http://qt.digia.com/contact-us. | - |
16 | ** | - |
17 | ** GNU Lesser General Public License Usage | - |
18 | ** Alternatively, this file may be used under the terms of the GNU Lesser | - |
19 | ** General Public License version 2.1 as published by the Free Software | - |
20 | ** Foundation and appearing in the file LICENSE.LGPL included in the | - |
21 | ** packaging of this file. Please review the following information to | - |
22 | ** ensure the GNU Lesser General Public License version 2.1 requirements | - |
23 | ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | - |
24 | ** | - |
25 | ** In addition, as a special exception, Digia gives you certain additional | - |
26 | ** rights. These rights are described in the Digia Qt LGPL Exception | - |
27 | ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. | - |
28 | ** | - |
29 | ** GNU General Public License Usage | - |
30 | ** Alternatively, this file may be used under the terms of the GNU | - |
31 | ** General Public License version 3.0 as published by the Free Software | - |
32 | ** Foundation and appearing in the file LICENSE.GPL included in the | - |
33 | ** packaging of this file. Please review the following information to | - |
34 | ** ensure the GNU General Public License version 3.0 requirements will be | - |
35 | ** met: http://www.gnu.org/copyleft/gpl.html. | - |
36 | ** | - |
37 | ** | - |
38 | ** $QT_END_LICENSE$ | - |
39 | ** | - |
40 | ****************************************************************************/ | - |
41 | | - |
42 | #include "qipaddress_p.h" | - |
43 | #include "private/qlocale_tools_p.h" | - |
44 | #include "qvarlengtharray.h" | - |
45 | | - |
46 | QT_BEGIN_NAMESPACE | - |
47 | namespace QIPAddressUtils { | - |
48 | | - |
49 | static QString number(quint8 val, int base = 10) | - |
50 | { | - |
51 | QChar zero(0x30); executed (the execution status of this line is deduced): QChar zero(0x30); | - |
52 | return val ? qulltoa(val, base, zero) : zero; executed: return val ? qulltoa(val, base, zero) : zero; Execution Count:3480 | 3480 |
53 | } | - |
54 | | - |
55 | typedef QVarLengthArray<char, 64> Buffer; | - |
56 | static bool checkedToAscii(Buffer &buffer, const QChar *begin, const QChar *end) | - |
57 | { | - |
58 | const ushort *const ubegin = reinterpret_cast<const ushort *>(begin); executed (the execution status of this line is deduced): const ushort *const ubegin = reinterpret_cast<const ushort *>(begin); | - |
59 | const ushort *const uend = reinterpret_cast<const ushort *>(end); executed (the execution status of this line is deduced): const ushort *const uend = reinterpret_cast<const ushort *>(end); | - |
60 | const ushort *src = ubegin; executed (the execution status of this line is deduced): const ushort *src = ubegin; | - |
61 | | - |
62 | buffer.resize(uend - ubegin + 1); executed (the execution status of this line is deduced): buffer.resize(uend - ubegin + 1); | - |
63 | char *dst = buffer.data(); executed (the execution status of this line is deduced): char *dst = buffer.data(); | - |
64 | | - |
65 | while (src != uend) { evaluated: src != uend yes Evaluation Count:262201 | yes Evaluation Count:17475 |
| 17475-262201 |
66 | if (*src >= 0x7f) evaluated: *src >= 0x7f yes Evaluation Count:199 | yes Evaluation Count:262034 |
| 199-262034 |
67 | return false; executed: return false; Execution Count:199 | 199 |
68 | *dst++ = *src++; executed (the execution status of this line is deduced): *dst++ = *src++; | - |
69 | } executed: } Execution Count:262069 | 262069 |
70 | *dst = '\0'; executed (the execution status of this line is deduced): *dst = '\0'; | - |
71 | return true; executed: return true; Execution Count:17476 | 17476 |
72 | } | - |
73 | | - |
74 | static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptLeadingZero); | - |
75 | bool parseIp4(IPv4Address &address, const QChar *begin, const QChar *end) | - |
76 | { | - |
77 | Q_ASSERT(begin != end); executed (the execution status of this line is deduced): qt_noop(); | - |
78 | Buffer buffer; executed (the execution status of this line is deduced): Buffer buffer; | - |
79 | if (!checkedToAscii(buffer, begin, end)) evaluated: !checkedToAscii(buffer, begin, end) yes Evaluation Count:199 | yes Evaluation Count:17140 |
| 199-17140 |
80 | return false; executed: return false; Execution Count:199 | 199 |
81 | | - |
82 | const char *ptr = buffer.data(); executed (the execution status of this line is deduced): const char *ptr = buffer.data(); | - |
83 | return parseIp4Internal(address, ptr, true); executed: return parseIp4Internal(address, ptr, true); Execution Count:17140 | 17140 |
84 | } | - |
85 | | - |
86 | static bool parseIp4Internal(IPv4Address &address, const char *ptr, bool acceptLeadingZero) | - |
87 | { | - |
88 | address = 0; executed (the execution status of this line is deduced): address = 0; | - |
89 | int dotCount = 0; executed (the execution status of this line is deduced): int dotCount = 0; | - |
90 | while (dotCount < 4) { partially evaluated: dotCount < 4 yes Evaluation Count:22535 | no Evaluation Count:0 |
| 0-22535 |
91 | if (!acceptLeadingZero && *ptr == '0' && evaluated: !acceptLeadingZero yes Evaluation Count:148 | yes Evaluation Count:22383 |
evaluated: *ptr == '0' yes Evaluation Count:32 | yes Evaluation Count:116 |
| 32-22383 |
92 | ptr[1] != '.' && ptr[1] != '\0') evaluated: ptr[1] != '.' yes Evaluation Count:3 | yes Evaluation Count:29 |
partially evaluated: ptr[1] != '\0' no Evaluation Count:0 | yes Evaluation Count:3 |
| 0-29 |
93 | return false; never executed: return false; | 0 |
94 | | - |
95 | const char *endptr; executed (the execution status of this line is deduced): const char *endptr; | - |
96 | bool ok; executed (the execution status of this line is deduced): bool ok; | - |
97 | quint64 ll = qstrtoull(ptr, &endptr, 0, &ok); executed (the execution status of this line is deduced): quint64 ll = qstrtoull(ptr, &endptr, 0, &ok); | - |
98 | quint32 x = ll; executed (the execution status of this line is deduced): quint32 x = ll; | - |
99 | if (!ok || endptr == ptr || ll != x) evaluated: !ok yes Evaluation Count:15311 | yes Evaluation Count:7137 |
partially evaluated: endptr == ptr no Evaluation Count:0 | yes Evaluation Count:7137 |
partially evaluated: ll != x no Evaluation Count:0 | yes Evaluation Count:7137 |
| 0-15311 |
100 | return false; executed: return false; Execution Count:15298 | 15298 |
101 | | - |
102 | if (*endptr == '.' || dotCount == 3) { evaluated: *endptr == '.' yes Evaluation Count:5317 | yes Evaluation Count:1821 |
evaluated: dotCount == 3 yes Evaluation Count:1770 | yes Evaluation Count:51 |
| 51-5317 |
103 | if (x & ~0xff) evaluated: x & ~0xff yes Evaluation Count:3 | yes Evaluation Count:7083 |
| 3-7083 |
104 | return false; executed: return false; Execution Count:3 | 3 |
105 | address <<= 8; executed (the execution status of this line is deduced): address <<= 8; | - |
106 | } else if (dotCount == 2) { executed: } Execution Count:7083 evaluated: dotCount == 2 yes Evaluation Count:12 | yes Evaluation Count:39 |
| 12-7083 |
107 | if (x & ~0xffff) partially evaluated: x & ~0xffff no Evaluation Count:0 | yes Evaluation Count:12 |
| 0-12 |
108 | return false; never executed: return false; | 0 |
109 | address <<= 16; executed (the execution status of this line is deduced): address <<= 16; | - |
110 | } else if (dotCount == 1) { executed: } Execution Count:12 evaluated: dotCount == 1 yes Evaluation Count:14 | yes Evaluation Count:25 |
| 12-25 |
111 | if (x & ~0xffffff) partially evaluated: x & ~0xffffff no Evaluation Count:0 | yes Evaluation Count:14 |
| 0-14 |
112 | return false; never executed: return false; | 0 |
113 | address <<= 24; executed (the execution status of this line is deduced): address <<= 24; | - |
114 | } executed: } Execution Count:14 | 14 |
115 | address |= x; executed (the execution status of this line is deduced): address |= x; | - |
116 | | - |
117 | if (dotCount == 3 && *endptr != '\0') evaluated: dotCount == 3 yes Evaluation Count:1776 | yes Evaluation Count:5359 |
evaluated: *endptr != '\0' yes Evaluation Count:19 | yes Evaluation Count:1757 |
| 19-5359 |
118 | return false; executed: return false; Execution Count:19 | 19 |
119 | else if (dotCount == 3 || *endptr == '\0') evaluated: dotCount == 3 yes Evaluation Count:1757 | yes Evaluation Count:5359 |
evaluated: *endptr == '\0' yes Evaluation Count:5 | yes Evaluation Count:5354 |
| 5-5359 |
120 | return true; executed: return true; Execution Count:1762 | 1762 |
121 | ++dotCount; executed (the execution status of this line is deduced): ++dotCount; | - |
122 | ptr = endptr + 1; executed (the execution status of this line is deduced): ptr = endptr + 1; | - |
123 | } executed: } Execution Count:5354 | 5354 |
124 | return false; never executed: return false; | 0 |
125 | } | - |
126 | | - |
127 | void toString(QString &appendTo, IPv4Address address) | - |
128 | { | - |
129 | // reconstructing is easy | - |
130 | // use the fast operator% that pre-calculates the size | - |
131 | appendTo += number(address >> 24) executed (the execution status of this line is deduced): appendTo += number(address >> 24) | - |
132 | % QLatin1Char('.') executed (the execution status of this line is deduced): % QLatin1Char('.') | - |
133 | % number(address >> 16) executed (the execution status of this line is deduced): % number(address >> 16) | - |
134 | % QLatin1Char('.') executed (the execution status of this line is deduced): % QLatin1Char('.') | - |
135 | % number(address >> 8) executed (the execution status of this line is deduced): % number(address >> 8) | - |
136 | % QLatin1Char('.') executed (the execution status of this line is deduced): % QLatin1Char('.') | - |
137 | % number(address); executed (the execution status of this line is deduced): % number(address); | - |
138 | } executed: } Execution Count:870 | 870 |
139 | | - |
140 | bool parseIp6(IPv6Address &address, const QChar *begin, const QChar *end) | - |
141 | { | - |
142 | Q_ASSERT(begin != end); executed (the execution status of this line is deduced): qt_noop(); | - |
143 | Buffer buffer; executed (the execution status of this line is deduced): Buffer buffer; | - |
144 | if (!checkedToAscii(buffer, begin, end)) partially evaluated: !checkedToAscii(buffer, begin, end) no Evaluation Count:0 | yes Evaluation Count:336 |
| 0-336 |
145 | return false; never executed: return false; | 0 |
146 | | - |
147 | const char *ptr = buffer.data(); executed (the execution status of this line is deduced): const char *ptr = buffer.data(); | - |
148 | | - |
149 | // count the colons | - |
150 | int colonCount = 0; executed (the execution status of this line is deduced): int colonCount = 0; | - |
151 | int dotCount = 0; executed (the execution status of this line is deduced): int dotCount = 0; | - |
152 | while (*ptr) { evaluated: *ptr yes Evaluation Count:5194 | yes Evaluation Count:336 |
| 336-5194 |
153 | if (*ptr == ':') evaluated: *ptr == ':' yes Evaluation Count:1312 | yes Evaluation Count:3882 |
| 1312-3882 |
154 | ++colonCount; executed: ++colonCount; Execution Count:1312 | 1312 |
155 | if (*ptr == '.') evaluated: *ptr == '.' yes Evaluation Count:165 | yes Evaluation Count:5029 |
| 165-5029 |
156 | ++dotCount; executed: ++dotCount; Execution Count:165 | 165 |
157 | ++ptr; executed (the execution status of this line is deduced): ++ptr; | - |
158 | } executed: } Execution Count:5194 | 5194 |
159 | // IPv4-in-IPv6 addresses are stricter in what they accept | - |
160 | if (dotCount != 0 && dotCount != 3) evaluated: dotCount != 0 yes Evaluation Count:55 | yes Evaluation Count:281 |
evaluated: dotCount != 3 yes Evaluation Count:5 | yes Evaluation Count:50 |
| 5-281 |
161 | return false; executed: return false; Execution Count:5 | 5 |
162 | | - |
163 | memset(address, 0, sizeof address); executed (the execution status of this line is deduced): memset(address, 0, sizeof address); | - |
164 | if (colonCount == 2 && end - begin == 2) // "::" evaluated: colonCount == 2 yes Evaluation Count:123 | yes Evaluation Count:208 |
evaluated: end - begin == 2 yes Evaluation Count:14 | yes Evaluation Count:109 |
| 14-208 |
165 | return true; executed: return true; Execution Count:14 | 14 |
166 | | - |
167 | // if there's a double colon ("::"), this is how many zeroes it means | - |
168 | int zeroWordsToFill; executed (the execution status of this line is deduced): int zeroWordsToFill; | - |
169 | ptr = buffer.data(); executed (the execution status of this line is deduced): ptr = buffer.data(); | - |
170 | | - |
171 | // there are two cases where 8 colons are allowed: at the ends | - |
172 | // so test that before the colon-count test | - |
173 | if ((ptr[0] == ':' && ptr[1] == ':') || evaluated: ptr[0] == ':' yes Evaluation Count:115 | yes Evaluation Count:202 |
evaluated: ptr[1] == ':' yes Evaluation Count:110 | yes Evaluation Count:5 |
| 5-202 |
174 | (ptr[end - begin - 2] == ':' && ptr[end - begin - 1] == ':')) { evaluated: ptr[end - begin - 2] == ':' yes Evaluation Count:88 | yes Evaluation Count:119 |
evaluated: ptr[end - begin - 1] == ':' yes Evaluation Count:51 | yes Evaluation Count:37 |
| 37-119 |
175 | zeroWordsToFill = 9 - colonCount; executed (the execution status of this line is deduced): zeroWordsToFill = 9 - colonCount; | - |
176 | } else if (colonCount < 2 || colonCount > 7) { executed: } Execution Count:161 evaluated: colonCount < 2 yes Evaluation Count:12 | yes Evaluation Count:144 |
evaluated: colonCount > 7 yes Evaluation Count:2 | yes Evaluation Count:142 |
| 2-161 |
177 | return false; executed: return false; Execution Count:14 | 14 |
178 | } else { | - |
179 | zeroWordsToFill = 8 - colonCount; executed (the execution status of this line is deduced): zeroWordsToFill = 8 - colonCount; | - |
180 | } executed: } Execution Count:142 | 142 |
181 | if (dotCount) evaluated: dotCount yes Evaluation Count:47 | yes Evaluation Count:256 |
| 47-256 |
182 | --zeroWordsToFill; executed: --zeroWordsToFill; Execution Count:47 | 47 |
183 | | - |
184 | int pos = 0; executed (the execution status of this line is deduced): int pos = 0; | - |
185 | while (pos < 15) { evaluated: pos < 15 yes Evaluation Count:1349 | yes Evaluation Count:45 |
| 45-1349 |
186 | const char *endptr; executed (the execution status of this line is deduced): const char *endptr; | - |
187 | bool ok; executed (the execution status of this line is deduced): bool ok; | - |
188 | quint64 ll = qstrtoull(ptr, &endptr, 16, &ok); executed (the execution status of this line is deduced): quint64 ll = qstrtoull(ptr, &endptr, 16, &ok); | - |
189 | quint16 x = ll; executed (the execution status of this line is deduced): quint16 x = ll; | - |
190 | | - |
191 | if (ptr == endptr) { evaluated: ptr == endptr yes Evaluation Count:258 | yes Evaluation Count:1091 |
| 258-1091 |
192 | // empty field, we hope it's "::" | - |
193 | if (zeroWordsToFill < 1) evaluated: zeroWordsToFill < 1 yes Evaluation Count:23 | yes Evaluation Count:235 |
| 23-235 |
194 | return false; executed: return false; Execution Count:23 | 23 |
195 | if (pos == 0 || pos == colonCount * 2) { evaluated: pos == 0 yes Evaluation Count:112 | yes Evaluation Count:123 |
partially evaluated: pos == colonCount * 2 no Evaluation Count:0 | yes Evaluation Count:123 |
| 0-123 |
196 | if (ptr[0] == '\0' || ptr[1] != ':') partially evaluated: ptr[0] == '\0' no Evaluation Count:0 | yes Evaluation Count:112 |
evaluated: ptr[1] != ':' yes Evaluation Count:2 | yes Evaluation Count:110 |
| 0-112 |
197 | return false; executed: return false; Execution Count:2 | 2 |
198 | ++ptr; executed (the execution status of this line is deduced): ++ptr; | - |
199 | } executed: } Execution Count:110 | 110 |
200 | pos += zeroWordsToFill * 2; executed (the execution status of this line is deduced): pos += zeroWordsToFill * 2; | - |
201 | zeroWordsToFill = 0; executed (the execution status of this line is deduced): zeroWordsToFill = 0; | - |
202 | ++ptr; executed (the execution status of this line is deduced): ++ptr; | - |
203 | continue; executed: continue; Execution Count:233 | 233 |
204 | } | - |
205 | if (!ok || ll != x) partially evaluated: !ok no Evaluation Count:0 | yes Evaluation Count:1091 |
evaluated: ll != x yes Evaluation Count:4 | yes Evaluation Count:1087 |
| 0-1091 |
206 | return false; executed: return false; Execution Count:4 | 4 |
207 | | - |
208 | if (*endptr == '.') { evaluated: *endptr == '.' yes Evaluation Count:41 | yes Evaluation Count:1046 |
| 41-1046 |
209 | // this could be an IPv4 address | - |
210 | // it's only valid in the last element | - |
211 | if (pos != 12) evaluated: pos != 12 yes Evaluation Count:4 | yes Evaluation Count:37 |
| 4-37 |
212 | return false; executed: return false; Execution Count:4 | 4 |
213 | | - |
214 | IPv4Address ip4; executed (the execution status of this line is deduced): IPv4Address ip4; | - |
215 | if (!parseIp4Internal(ip4, ptr, false)) partially evaluated: !parseIp4Internal(ip4, ptr, false) no Evaluation Count:0 | yes Evaluation Count:37 |
| 0-37 |
216 | return false; never executed: return false; | 0 |
217 | | - |
218 | address[12] = ip4 >> 24; executed (the execution status of this line is deduced): address[12] = ip4 >> 24; | - |
219 | address[13] = ip4 >> 16; executed (the execution status of this line is deduced): address[13] = ip4 >> 16; | - |
220 | address[14] = ip4 >> 8; executed (the execution status of this line is deduced): address[14] = ip4 >> 8; | - |
221 | address[15] = ip4; executed (the execution status of this line is deduced): address[15] = ip4; | - |
222 | return true; executed: return true; Execution Count:37 | 37 |
223 | } | - |
224 | | - |
225 | address[pos++] = x >> 8; executed (the execution status of this line is deduced): address[pos++] = x >> 8; | - |
226 | address[pos++] = x & 0xff; executed (the execution status of this line is deduced): address[pos++] = x & 0xff; | - |
227 | | - |
228 | if (*endptr == '\0') evaluated: *endptr == '\0' yes Evaluation Count:167 | yes Evaluation Count:879 |
| 167-879 |
229 | break; executed: break; Execution Count:167 | 167 |
230 | if (*endptr != ':') evaluated: *endptr != ':' yes Evaluation Count:21 | yes Evaluation Count:858 |
| 21-858 |
231 | return false; executed: return false; Execution Count:21 | 21 |
232 | ptr = endptr + 1; executed (the execution status of this line is deduced): ptr = endptr + 1; | - |
233 | } executed: } Execution Count:858 | 858 |
234 | return pos == 16; executed: return pos == 16; Execution Count:212 | 212 |
235 | } | - |
236 | | - |
237 | static inline QChar toHex(uchar c) | - |
238 | { | - |
239 | return ushort(c > 9 ? c + 'a' - 0xA : c + '0'); executed: return ushort(c > 9 ? c + 'a' - 0xA : c + '0'); Execution Count:2184 | 2184 |
240 | } | - |
241 | | - |
242 | void toString(QString &appendTo, IPv6Address address) | - |
243 | { | - |
244 | // the longest IPv6 address possible is: | - |
245 | // "1111:2222:3333:4444:5555:6666:255.255.255.255" | - |
246 | // however, this function never generates that. The longest it does | - |
247 | // generate without an IPv4 address is: | - |
248 | // "1111:2222:3333:4444:5555:6666:7777:8888" | - |
249 | // and the longest with an IPv4 address is: | - |
250 | // "::ffff:255.255.255.255" | - |
251 | static const int Ip6AddressMaxLen = sizeof "1111:2222:3333:4444:5555:6666:7777:8888"; | - |
252 | static const int Ip6WithIp4AddressMaxLen = sizeof "::ffff:255.255.255.255"; | - |
253 | | - |
254 | // check for the special cases | - |
255 | const quint64 zeroes[] = { 0, 0 }; executed (the execution status of this line is deduced): const quint64 zeroes[] = { 0, 0 }; | - |
256 | bool embeddedIp4 = false; executed (the execution status of this line is deduced): bool embeddedIp4 = false; | - |
257 | | - |
258 | // we consider embedded IPv4 for: | - |
259 | // ::ffff:x.x.x.x | - |
260 | // ::x.x.x.y except if the x are 0 too | - |
261 | if (memcmp(address, zeroes, 10) == 0) { evaluated: memcmp(address, zeroes, 10) == 0 yes Evaluation Count:84 | yes Evaluation Count:133 |
| 84-133 |
262 | if (address[10] == 0xff && address[11] == 0xff) { evaluated: address[10] == 0xff yes Evaluation Count:17 | yes Evaluation Count:67 |
partially evaluated: address[11] == 0xff yes Evaluation Count:17 | no Evaluation Count:0 |
| 0-67 |
263 | embeddedIp4 = true; executed (the execution status of this line is deduced): embeddedIp4 = true; | - |
264 | } else if (address[10] == 0 && address[11] == 0) { executed: } Execution Count:17 partially evaluated: address[10] == 0 yes Evaluation Count:67 | no Evaluation Count:0 |
partially evaluated: address[11] == 0 yes Evaluation Count:67 | no Evaluation Count:0 |
| 0-67 |
265 | if (address[12] != 0 || address[13] != 0 || address[14] != 0) { evaluated: address[12] != 0 yes Evaluation Count:5 | yes Evaluation Count:62 |
partially evaluated: address[13] != 0 no Evaluation Count:0 | yes Evaluation Count:62 |
partially evaluated: address[14] != 0 no Evaluation Count:0 | yes Evaluation Count:62 |
| 0-62 |
266 | embeddedIp4 = true; executed (the execution status of this line is deduced): embeddedIp4 = true; | - |
267 | } else if (address[15] == 0) { executed: } Execution Count:5 evaluated: address[15] == 0 yes Evaluation Count:31 | yes Evaluation Count:31 |
| 5-31 |
268 | appendTo.append(QLatin1String("::")); executed (the execution status of this line is deduced): appendTo.append(QLatin1String("::")); | - |
269 | return; executed: return; Execution Count:31 | 31 |
270 | } | - |
271 | } | - |
272 | } | - |
273 | | - |
274 | // QString::reserve doesn't shrink, so it's fine to us | - |
275 | appendTo.reserve(appendTo.size() + executed (the execution status of this line is deduced): appendTo.reserve(appendTo.size() + | - |
276 | (embeddedIp4 ? Ip6WithIp4AddressMaxLen : Ip6AddressMaxLen)); executed (the execution status of this line is deduced): (embeddedIp4 ? Ip6WithIp4AddressMaxLen : Ip6AddressMaxLen)); | - |
277 | | - |
278 | // for finding where to place the "::" | - |
279 | int zeroRunLength = 0; // in octets executed (the execution status of this line is deduced): int zeroRunLength = 0; | - |
280 | int zeroRunOffset = 0; // in octets executed (the execution status of this line is deduced): int zeroRunOffset = 0; | - |
281 | for (int i = 0; i < 16; i += 2) { evaluated: i < 16 yes Evaluation Count:827 | yes Evaluation Count:186 |
| 186-827 |
282 | if (address[i] == 0 && address[i + 1] == 0) { evaluated: address[i] == 0 yes Evaluation Count:438 | yes Evaluation Count:389 |
evaluated: address[i + 1] == 0 yes Evaluation Count:196 | yes Evaluation Count:242 |
| 196-438 |
283 | // found a zero, scan forward to see how many more there are | - |
284 | int j; executed (the execution status of this line is deduced): int j; | - |
285 | for (j = i; j < 16; j += 2) { evaluated: j < 16 yes Evaluation Count:869 | yes Evaluation Count:43 |
| 43-869 |
286 | if (address[j] != 0 || address[j+1] != 0) evaluated: address[j] != 0 yes Evaluation Count:59 | yes Evaluation Count:810 |
evaluated: address[j+1] != 0 yes Evaluation Count:94 | yes Evaluation Count:716 |
| 59-810 |
287 | break; executed: break; Execution Count:153 | 153 |
288 | } executed: } Execution Count:716 | 716 |
289 | | - |
290 | if (j - i > zeroRunLength) { evaluated: j - i > zeroRunLength yes Evaluation Count:178 | yes Evaluation Count:18 |
| 18-178 |
291 | zeroRunLength = j - i; executed (the execution status of this line is deduced): zeroRunLength = j - i; | - |
292 | zeroRunOffset = i; executed (the execution status of this line is deduced): zeroRunOffset = i; | - |
293 | i = j; executed (the execution status of this line is deduced): i = j; | - |
294 | } executed: } Execution Count:178 | 178 |
295 | } executed: } Execution Count:196 | 196 |
296 | } executed: } Execution Count:827 | 827 |
297 | | - |
298 | const QChar colon = ushort(':'); executed (the execution status of this line is deduced): const QChar colon = ushort(':'); | - |
299 | if (zeroRunLength < 4) evaluated: zeroRunLength < 4 yes Evaluation Count:47 | yes Evaluation Count:139 |
| 47-139 |
300 | zeroRunOffset = -1; executed: zeroRunOffset = -1; Execution Count:47 | 47 |
301 | else if (zeroRunOffset == 0) evaluated: zeroRunOffset == 0 yes Evaluation Count:53 | yes Evaluation Count:86 |
| 53-86 |
302 | appendTo.append(colon); executed: appendTo.append(colon); Execution Count:53 | 53 |
303 | | - |
304 | for (int i = 0; i < 16; i += 2) { evaluated: i < 16 yes Evaluation Count:948 | yes Evaluation Count:164 |
| 164-948 |
305 | if (i == zeroRunOffset) { evaluated: i == zeroRunOffset yes Evaluation Count:139 | yes Evaluation Count:809 |
| 139-809 |
306 | appendTo.append(colon); executed (the execution status of this line is deduced): appendTo.append(colon); | - |
307 | i += zeroRunLength - 2; executed (the execution status of this line is deduced): i += zeroRunLength - 2; | - |
308 | continue; executed: continue; Execution Count:139 | 139 |
309 | } | - |
310 | | - |
311 | if (i == 12 && embeddedIp4) { evaluated: i == 12 yes Evaluation Count:122 | yes Evaluation Count:687 |
evaluated: embeddedIp4 yes Evaluation Count:22 | yes Evaluation Count:100 |
| 22-687 |
312 | IPv4Address ip4 = address[12] << 24 | executed (the execution status of this line is deduced): IPv4Address ip4 = address[12] << 24 | | - |
313 | address[13] << 16 | executed (the execution status of this line is deduced): address[13] << 16 | | - |
314 | address[14] << 8 | executed (the execution status of this line is deduced): address[14] << 8 | | - |
315 | address[15]; executed (the execution status of this line is deduced): address[15]; | - |
316 | toString(appendTo, ip4); executed (the execution status of this line is deduced): toString(appendTo, ip4); | - |
317 | return; executed: return; Execution Count:22 | 22 |
318 | } | - |
319 | | - |
320 | if (address[i]) { evaluated: address[i] yes Evaluation Count:408 | yes Evaluation Count:379 |
| 379-408 |
321 | if (address[i] >> 4) { evaluated: address[i] >> 4 yes Evaluation Count:363 | yes Evaluation Count:45 |
| 45-363 |
322 | appendTo.append(toHex(address[i] >> 4)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i] >> 4)); | - |
323 | appendTo.append(toHex(address[i] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i] & 0xf)); | - |
324 | appendTo.append(toHex(address[i + 1] >> 4)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] >> 4)); | - |
325 | appendTo.append(toHex(address[i + 1] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] & 0xf)); | - |
326 | } else if (address[i] & 0xf) { executed: } Execution Count:363 partially evaluated: address[i] & 0xf yes Evaluation Count:45 | no Evaluation Count:0 |
| 0-363 |
327 | appendTo.append(toHex(address[i] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i] & 0xf)); | - |
328 | appendTo.append(toHex(address[i + 1] >> 4)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] >> 4)); | - |
329 | appendTo.append(toHex(address[i + 1] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] & 0xf)); | - |
330 | } executed: } Execution Count:45 | 45 |
331 | } else if (address[i + 1] >> 4) { evaluated: address[i + 1] >> 4 yes Evaluation Count:218 | yes Evaluation Count:161 |
| 161-218 |
332 | appendTo.append(toHex(address[i + 1] >> 4)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] >> 4)); | - |
333 | appendTo.append(toHex(address[i + 1] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] & 0xf)); | - |
334 | } else { executed: } Execution Count:218 | 218 |
335 | appendTo.append(toHex(address[i + 1] & 0xf)); executed (the execution status of this line is deduced): appendTo.append(toHex(address[i + 1] & 0xf)); | - |
336 | } executed: } Execution Count:161 | 161 |
337 | | - |
338 | if (i != 14) evaluated: i != 14 yes Evaluation Count:654 | yes Evaluation Count:133 |
| 133-654 |
339 | appendTo.append(colon); executed: appendTo.append(colon); Execution Count:654 | 654 |
340 | } executed: } Execution Count:787 | 787 |
341 | } executed: } Execution Count:164 | 164 |
342 | | - |
343 | } | - |
344 | QT_END_NAMESPACE | - |
345 | | - |
| | |