From: Kevin Day Date: Fri, 30 Jan 2026 05:44:00 +0000 (-0600) Subject: Bugfix: Handle more cases of IPv6 addresses not being properly identified. X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=af0ab2bca4645b42bde6182e758a73dde866c2f4;p=fll Bugfix: Handle more cases of IPv6 addresses not being properly identified. I learned that `::` and `::/24` addresses are valid. Add a few more test cases. --- diff --git a/level_0/f_network/c/network.c b/level_0/f_network/c/network.c index d90a92aef..b0416623c 100644 --- a/level_0/f_network/c/network.c +++ b/level_0/f_network/c/network.c @@ -196,6 +196,9 @@ extern "C" { at.stop_1 = i; if (flag & 0x1) { + f_number_unsigned_t first_colon = 0; + f_number_unsigned_t second_colon = 0; + state->status = F_network_version_six_not; // IPv6 flag additions: 0x2 == has bracket open, 0x4 == has forward slash, 0x8 = has double-colon, 0x10 = has no leading digit and no bracket open. @@ -253,6 +256,7 @@ extern "C" { // Cannot have a colon to the right of a forward slash. if (flag & 0x4) return; + first_colon = i; at.start_2 = i + 1; // Must not end on a colon. @@ -277,10 +281,11 @@ extern "C" { // Cannot have three or more colons back to back. if (flag & 0x8) return; + second_colon = at.start_2++; flag |= 0x8; // Skip past NULL characters. - for (++at.start_2; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { + for (; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { if (state->interrupt) { state->interrupt((void *) state, 0); @@ -291,17 +296,36 @@ extern "C" { } } // for - // Must not end on a double-colon. - if (at.start_2 == address.used) return; + // Must not end on a double-colon, except when there are only two colons (and no opening bracket without a closing bracket). + if (at.start_2 == address.used) { + if (!digits && !set && !(flag & 0x2)) { + state->status = F_network_version_six; + + at.start_1 = first_colon; + at.stop_1 = second_colon; + at.start_2 = 1; + at.stop_2 = 0; + + if (where) { + *where = at; + } + } + + return; + } // When double-colons lead, then set the start position at the first double colon. if (!digits && !set) { - at.start_1 = i; + at.start_1 = first_colon; } } - // Colons must be followed by a hexidecimal digit or a forward slash. - if ((uint16_t) (address.string[at.start_2] - f_string_ascii_a_s.string[0]) > 5 && (uint16_t) (address.string[at.start_2] - f_string_ascii_A_s.string[0]) > 5 && (uint16_t) (address.string[at.start_2] - f_string_ascii_0_s.string[0]) > 9 && address.string[at.start_2] != f_string_ascii_slash_forward_s.string[0]) return; + // Colons must be followed by a hexidecimal digit or a forward slash (except when exactly two double colons). + if (!(flag & 0x2) || set && digits) { + if ((uint16_t) (address.string[at.start_2] - f_string_ascii_a_s.string[0]) > 5 && (uint16_t) (address.string[at.start_2] - f_string_ascii_A_s.string[0]) > 5) { + if ((uint16_t) (address.string[at.start_2] - f_string_ascii_0_s.string[0]) > 9 && address.string[at.start_2] != f_string_ascii_slash_forward_s.string[0]) return; + } + } at.stop_1 = at.start_2; @@ -319,6 +343,7 @@ extern "C" { digits = 0; at.start_2 = 1; + at.stop_2 = 0; } else if (address.string[i] == f_string_ascii_slash_forward_s.string[0]) { diff --git a/level_0/f_network/tests/unit/c/test-network-is_ip_address.c b/level_0/f_network/tests/unit/c/test-network-is_ip_address.c index b6f3a404e..6f883d0f3 100644 --- a/level_0/f_network/tests/unit/c/test-network-is_ip_address.c +++ b/level_0/f_network/tests/unit/c/test-network-is_ip_address.c @@ -197,122 +197,121 @@ void test__f_network_is_ip_address__returns_network_version_six_not(void **state const f_string_static_t ips[] = { macro_f_string_static_t_initialize_2(":", 1), // [0] - macro_f_string_static_t_initialize_2("::", 2), // [1] - macro_f_string_static_t_initialize_2(":/24", 4), // [2] - macro_f_string_static_t_initialize_2(":/2a", 4), // [3] - macro_f_string_static_t_initialize_2("::/2a", 5), // [4] - macro_f_string_static_t_initialize_2(":12345", 6), // [5] - macro_f_string_static_t_initialize_2("::12345", 7), // [6] - macro_f_string_static_t_initialize_2(":12345/24", 9), // [7] - macro_f_string_static_t_initialize_2("::12345/24", 10), // [8] - macro_f_string_static_t_initialize_2(":12345/2a", 9), // [9] - macro_f_string_static_t_initialize_2("::12345/2a", 10), // [10] - macro_f_string_static_t_initialize_2("::1/1234", 8), // [11] - macro_f_string_static_t_initialize_2("::1/12a", 7), // [12] - macro_f_string_static_t_initialize_2(":example", 8), // [13] - macro_f_string_static_t_initialize_2("::example", 9), // [14] - macro_f_string_static_t_initialize_2(":example/24", 11), // [15] - macro_f_string_static_t_initialize_2("::example/24", 12), // [16] - macro_f_string_static_t_initialize_2(":example/2a", 11), // [17] - macro_f_string_static_t_initialize_2("::example/2a", 12), // [18] - macro_f_string_static_t_initialize_2("[:", 2), // [19] - macro_f_string_static_t_initialize_2("[::", 3), // [20] - macro_f_string_static_t_initialize_2("[:/24", 5), // [21] - macro_f_string_static_t_initialize_2("[::/24", 6), // [22] - macro_f_string_static_t_initialize_2("[:/2a", 5), // [23] - macro_f_string_static_t_initialize_2("[::/2a", 6), // [24] - macro_f_string_static_t_initialize_2("[:1/24", 6), // [25] - macro_f_string_static_t_initialize_2("[::1/24", 7), // [26] - macro_f_string_static_t_initialize_2("[:12345", 7), // [27] - macro_f_string_static_t_initialize_2("[::12345", 8), // [28] - macro_f_string_static_t_initialize_2("[:12345/24", 10), // [29] - macro_f_string_static_t_initialize_2("[::12345/24", 11), // [30] - macro_f_string_static_t_initialize_2("[::1/1234", 9), // [31] - macro_f_string_static_t_initialize_2("[::1", 4), // [32] - macro_f_string_static_t_initialize_2("[::1/24", 7), // [33] - macro_f_string_static_t_initialize_2("[:example", 9), // [34] - macro_f_string_static_t_initialize_2("[::example", 10), // [35] - macro_f_string_static_t_initialize_2("[:example/24", 12), // [36] - macro_f_string_static_t_initialize_2("[::example/24", 13), // [37] - macro_f_string_static_t_initialize_2("[:example/2a", 12), // [38] - macro_f_string_static_t_initialize_2("[::example/2a", 13), // [39] - macro_f_string_static_t_initialize_2("[:]", 3), // [40] - macro_f_string_static_t_initialize_2("[:1/24]", 7), // [41] - macro_f_string_static_t_initialize_2("[:1]/24", 7), // [42] - macro_f_string_static_t_initialize_2("[:1/2a]", 7), // [43] - macro_f_string_static_t_initialize_2("[:1]/2a", 7), // [44] - macro_f_string_static_t_initialize_2("[::]", 2), // [45] - macro_f_string_static_t_initialize_2("[::1]/24", 8), // [46] - macro_f_string_static_t_initialize_2("[::1]/2a", 8), // [47] - macro_f_string_static_t_initialize_2("[:/24]", 4), // [48] - macro_f_string_static_t_initialize_2("[:/2a]", 4), // [49] - macro_f_string_static_t_initialize_2("[::/24]", 5), // [50] - macro_f_string_static_t_initialize_2("[::/2a]", 5), // [51] - macro_f_string_static_t_initialize_2("[:12345]", 6), // [52] - macro_f_string_static_t_initialize_2("[::12345]", 7), // [53] - macro_f_string_static_t_initialize_2("[:12345/24]", 9), // [54] - macro_f_string_static_t_initialize_2("[::12345/24]", 10), // [55] - macro_f_string_static_t_initialize_2("[:12345/2a]", 9), // [56] - macro_f_string_static_t_initialize_2("[::12345/2a]", 10), // [57] - macro_f_string_static_t_initialize_2("[::1/1234]", 8), // [58] - macro_f_string_static_t_initialize_2("[:example]", 10), // [59] - macro_f_string_static_t_initialize_2("[::example]", 11), // [60] - macro_f_string_static_t_initialize_2("[:example/24]", 13), // [61] - macro_f_string_static_t_initialize_2("[::example/24]", 14), // [62] - macro_f_string_static_t_initialize_2("[:example]/24", 13), // [63] - macro_f_string_static_t_initialize_2("[::example]/24", 14), // [64] - macro_f_string_static_t_initialize_2("[:example/2a]", 13), // [65] - macro_f_string_static_t_initialize_2("[::example/2a]", 14), // [66] - macro_f_string_static_t_initialize_2("[:example]/2a", 13), // [67] - macro_f_string_static_t_initialize_2("[::example]/2a", 14), // [68] - macro_f_string_static_t_initialize_2("[::example]:80_map", 18), // [69] - macro_f_string_static_t_initialize_2("1234::example", 13), // [70] - macro_f_string_static_t_initialize_2("1234:example", 12), // [71] - macro_f_string_static_t_initialize_2("1234:1234:1234:1234:1234:1234:1234:1234:1234", 44), // [72] - macro_f_string_static_t_initialize_2("1234::1234:1234:1234:1234::1234:1234:1234", 41), // [73] - macro_f_string_static_t_initialize_2("1234::1234::1234", 16), // [74] - macro_f_string_static_t_initialize_2("a234:1234:1234:1234:1234:1234:1234:1234:1234", 44), // [75] - macro_f_string_static_t_initialize_2("a234::1234:1234:1234:1234::1234:1234:1234", 41), // [76] - macro_f_string_static_t_initialize_2("a234::1234::1234", 16), // [77] - macro_f_string_static_t_initialize_2("1234:aaaa:1234:1234:1234:1234:1234:1234:1234", 44), // [78] - macro_f_string_static_t_initialize_2("1234::aaaa:1234:1234:1234::1234:1234:1234", 41), // [79] - macro_f_string_static_t_initialize_2("1234::aaaa::1234", 16), // [80] - macro_f_string_static_t_initialize_2("1234::www.example.com", 21), // [81] - macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234", 40), // [82] - macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a", 38), // [83] - macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF", 36), // [84] - macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234", 41), // [85] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234]", 42), // [86] - macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a", 39), // [87] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a]", 40), // [88] - macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF]", 38), // [89] - macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234]", 43), // [90] - macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a]", 41), // [91] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]a", 38), // [92] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]1", 38), // [93] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]hello", 42), // [94] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/24", 40), // [95] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/2a", 40), // [96] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/1234", 42), // [97] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80_map", 44), // [98] - macro_f_string_static_t_initialize_2("[::1]:80not", 11), // [99] - macro_f_string_static_t_initialize_2("[::1/24]:80ton", 14), // [100] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80ton", 43), // [101] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567::CDEF]:80not", 39), // [102] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123::CDEF]:80otn", 34), // [103] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::CDEF]:80nto", 30), // [104] - macro_f_string_static_t_initialize_2("[2001:0DB8:0::CDEF]:80ttt", 25), // [105] - macro_f_string_static_t_initialize_2("[2001:0DB8::CDEF]:80ooo", 23), // [106] - macro_f_string_static_t_initialize_2("[2001::CDEF]:80nnn", 18), // [107] - macro_f_string_static_t_initialize_2("[2001::0DB8:CDEF]:80_to", 23), // [108] - macro_f_string_static_t_initialize_2("[2001:0DB8::0:CDEF]:80_no", 25), // [109] - macro_f_string_static_t_initialize_2("[2001::0DB8:0:CD30:CDEF]:80*to", 30), // [110] - macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::123:4567:CDEF]:80$ot", 39), // [111] + macro_f_string_static_t_initialize_2(":/24", 4), // [1] + macro_f_string_static_t_initialize_2(":/2a", 4), // [2] + macro_f_string_static_t_initialize_2("::/2a", 5), // [3] + macro_f_string_static_t_initialize_2(":12345", 6), // [4] + macro_f_string_static_t_initialize_2("::12345", 7), // [5] + macro_f_string_static_t_initialize_2(":12345/24", 9), // [6] + macro_f_string_static_t_initialize_2("::12345/24", 10), // [7] + macro_f_string_static_t_initialize_2(":12345/2a", 9), // [8] + macro_f_string_static_t_initialize_2("::12345/2a", 10), // [9] + macro_f_string_static_t_initialize_2("::1/1234", 8), // [10] + macro_f_string_static_t_initialize_2("::1/12a", 7), // [11] + macro_f_string_static_t_initialize_2(":example", 8), // [12] + macro_f_string_static_t_initialize_2("::example", 9), // [13] + macro_f_string_static_t_initialize_2(":example/24", 11), // [14] + macro_f_string_static_t_initialize_2("::example/24", 12), // [15] + macro_f_string_static_t_initialize_2(":example/2a", 11), // [16] + macro_f_string_static_t_initialize_2("::example/2a", 12), // [17] + macro_f_string_static_t_initialize_2("[:", 2), // [18] + macro_f_string_static_t_initialize_2("[::", 3), // [19] + macro_f_string_static_t_initialize_2("[:/24", 5), // [20] + macro_f_string_static_t_initialize_2("[::/24", 6), // [21] + macro_f_string_static_t_initialize_2("[:/2a", 5), // [22] + macro_f_string_static_t_initialize_2("[::/2a", 6), // [23] + macro_f_string_static_t_initialize_2("[:1/24", 6), // [24] + macro_f_string_static_t_initialize_2("[::1/24", 7), // [25] + macro_f_string_static_t_initialize_2("[:12345", 7), // [26] + macro_f_string_static_t_initialize_2("[::12345", 8), // [27] + macro_f_string_static_t_initialize_2("[:12345/24", 10), // [28] + macro_f_string_static_t_initialize_2("[::12345/24", 11), // [29] + macro_f_string_static_t_initialize_2("[::1/1234", 9), // [30] + macro_f_string_static_t_initialize_2("[::1", 4), // [31] + macro_f_string_static_t_initialize_2("[::1/24", 7), // [32] + macro_f_string_static_t_initialize_2("[:example", 9), // [33] + macro_f_string_static_t_initialize_2("[::example", 10), // [34] + macro_f_string_static_t_initialize_2("[:example/24", 12), // [35] + macro_f_string_static_t_initialize_2("[::example/24", 13), // [36] + macro_f_string_static_t_initialize_2("[:example/2a", 12), // [37] + macro_f_string_static_t_initialize_2("[::example/2a", 13), // [38] + macro_f_string_static_t_initialize_2("[:]", 3), // [39] + macro_f_string_static_t_initialize_2("[:1/24]", 7), // [40] + macro_f_string_static_t_initialize_2("[:1]/24", 7), // [41] + macro_f_string_static_t_initialize_2("[:1/2a]", 7), // [42] + macro_f_string_static_t_initialize_2("[:1]/2a", 7), // [43] + macro_f_string_static_t_initialize_2("[::]", 2), // [44] + macro_f_string_static_t_initialize_2("[::1]/24", 8), // [45] + macro_f_string_static_t_initialize_2("[::1]/2a", 8), // [46] + macro_f_string_static_t_initialize_2("[:/24]", 4), // [47] + macro_f_string_static_t_initialize_2("[:/2a]", 4), // [48] + macro_f_string_static_t_initialize_2("[::/24]", 5), // [49] + macro_f_string_static_t_initialize_2("[::/2a]", 5), // [50] + macro_f_string_static_t_initialize_2("[:12345]", 6), // [51] + macro_f_string_static_t_initialize_2("[::12345]", 7), // [52] + macro_f_string_static_t_initialize_2("[:12345/24]", 9), // [53] + macro_f_string_static_t_initialize_2("[::12345/24]", 10), // [54] + macro_f_string_static_t_initialize_2("[:12345/2a]", 9), // [55] + macro_f_string_static_t_initialize_2("[::12345/2a]", 10), // [56] + macro_f_string_static_t_initialize_2("[::1/1234]", 8), // [57] + macro_f_string_static_t_initialize_2("[:example]", 10), // [58] + macro_f_string_static_t_initialize_2("[::example]", 11), // [59] + macro_f_string_static_t_initialize_2("[:example/24]", 13), // [60] + macro_f_string_static_t_initialize_2("[::example/24]", 14), // [61] + macro_f_string_static_t_initialize_2("[:example]/24", 13), // [62] + macro_f_string_static_t_initialize_2("[::example]/24", 14), // [63] + macro_f_string_static_t_initialize_2("[:example/2a]", 13), // [64] + macro_f_string_static_t_initialize_2("[::example/2a]", 14), // [65] + macro_f_string_static_t_initialize_2("[:example]/2a", 13), // [66] + macro_f_string_static_t_initialize_2("[::example]/2a", 14), // [67] + macro_f_string_static_t_initialize_2("[::example]:80_map", 18), // [68] + macro_f_string_static_t_initialize_2("1234::example", 13), // [69] + macro_f_string_static_t_initialize_2("1234:example", 12), // [70] + macro_f_string_static_t_initialize_2("1234:1234:1234:1234:1234:1234:1234:1234:1234", 44), // [71] + macro_f_string_static_t_initialize_2("1234::1234:1234:1234:1234::1234:1234:1234", 41), // [72] + macro_f_string_static_t_initialize_2("1234::1234::1234", 16), // [73] + macro_f_string_static_t_initialize_2("a234:1234:1234:1234:1234:1234:1234:1234:1234", 44), // [74] + macro_f_string_static_t_initialize_2("a234::1234:1234:1234:1234::1234:1234:1234", 41), // [75] + macro_f_string_static_t_initialize_2("a234::1234::1234", 16), // [76] + macro_f_string_static_t_initialize_2("1234:aaaa:1234:1234:1234:1234:1234:1234:1234", 44), // [77] + macro_f_string_static_t_initialize_2("1234::aaaa:1234:1234:1234::1234:1234:1234", 41), // [78] + macro_f_string_static_t_initialize_2("1234::aaaa::1234", 16), // [79] + macro_f_string_static_t_initialize_2("1234::www.example.com", 21), // [80] + macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234", 40), // [81] + macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a", 38), // [82] + macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF", 36), // [83] + macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234", 41), // [84] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234]", 42), // [85] + macro_f_string_static_t_initialize_2("2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a", 39), // [86] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a]", 40), // [87] + macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF]", 38), // [88] + macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234]", 43), // [89] + macro_f_string_static_t_initialize_2("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a]", 41), // [90] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]a", 38), // [91] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]1", 38), // [92] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]hello", 42), // [93] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/24", 40), // [94] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/2a", 40), // [95] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/1234", 42), // [96] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80_map", 44), // [97] + macro_f_string_static_t_initialize_2("[::1]:80not", 11), // [98] + macro_f_string_static_t_initialize_2("[::1/24]:80ton", 14), // [99] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80ton", 43), // [100] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123:4567::CDEF]:80not", 39), // [101] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123::CDEF]:80otn", 34), // [102] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::CDEF]:80nto", 30), // [103] + macro_f_string_static_t_initialize_2("[2001:0DB8:0::CDEF]:80ttt", 25), // [104] + macro_f_string_static_t_initialize_2("[2001:0DB8::CDEF]:80ooo", 23), // [105] + macro_f_string_static_t_initialize_2("[2001::CDEF]:80nnn", 18), // [106] + macro_f_string_static_t_initialize_2("[2001::0DB8:CDEF]:80_to", 23), // [107] + macro_f_string_static_t_initialize_2("[2001:0DB8::0:CDEF]:80_no", 25), // [108] + macro_f_string_static_t_initialize_2("[2001::0DB8:0:CD30:CDEF]:80*to", 30), // [109] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::123:4567:CDEF]:80$ot", 39), // [110] }; f_range_double_t where = f_range_double_t_initialize; - for (uint8_t i = 0; i < 112; ++i) { + for (uint8_t i = 0; i < 111; ++i) { state_data.status = F_okay; where.start_1 = 1; @@ -419,6 +418,12 @@ void test__f_network_is_ip_address__returns_network_version_six(void **state) { macro_f_string_static_t_initialize_2("::/96", 5) , // [75] macro_f_string_static_t_initialize_2("[::/96]", 7), // [76] macro_f_string_static_t_initialize_2("[::/96]:5", 9), // [77] + macro_f_string_static_t_initialize_2("2:003:45:8::772", 15), // [78] + macro_f_string_static_t_initialize_2("[2:003:45:8::772]", 17), // [79] + macro_f_string_static_t_initialize_2("[2:003:45:8::772]:9425", 22), // [80] + macro_f_string_static_t_initialize_2("::", 2), // [81] + macro_f_string_static_t_initialize_2("[::]", 4), // [82] + macro_f_string_static_t_initialize_2("[::]:4096", 9), // [83] }; const f_range_double_t wheres[] = { @@ -500,11 +505,17 @@ void test__f_network_is_ip_address__returns_network_version_six(void **state) { { .start_1 = 0, .stop_1 = 4, .start_2 = 1, .stop_2 = 0 }, // [75] "::/96" { .start_1 = 1, .stop_1 = 5, .start_2 = 1, .stop_2 = 0 }, // [76] "[::/96]" { .start_1 = 1, .stop_1 = 5, .start_2 = 8, .stop_2 = 8 }, // [77] "[::/96]:5" + { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, // [78] "2:003:45:8::772" + { .start_1 = 1, .stop_1 = 15, .start_2 = 1, .stop_2 = 0 }, // [79] "[2:003:45:8::772]" + { .start_1 = 1, .stop_1 = 15, .start_2 = 18, .stop_2 = 21 }, // [80] "[2:003:45:8::772]:9425" + { .start_1 = 0, .stop_1 = 1, .start_2 = 1, .stop_2 = 0 }, // [81] "::" + { .start_1 = 1, .stop_1 = 2, .start_2 = 1, .stop_2 = 0 }, // [82] "[::]" + { .start_1 = 1, .stop_1 = 2, .start_2 = 5, .stop_2 = 8 }, // [83] "[::]:4096" }; f_range_double_t where = f_range_double_t_initialize; - for (uint8_t i = 0; i < 78; ++i) { + for (uint8_t i = 0; i < 84; ++i) { state_data.status = F_okay; where.start_1 = 1;