From: Kevin Day Date: Wed, 28 Jan 2026 05:44:03 +0000 (-0600) Subject: Bugfix: Invalid IPv6 addressdetection and improve IPv4 address detection in f_network... X-Git-Url: https://git.kevux.org/?a=commitdiff_plain;h=e434fd7318987873e16d719b4d02a9172dd6bd43;p=fll Bugfix: Invalid IPv6 addressdetection and improve IPv4 address detection in f_network_is_ip_address(). The `f_network_is_ip_address()` is not properly identifying bracketed IPv6 addresses. Digits to the left of double colons `::` should be supported. The forward slash `/` should be allowed after double colons `::`. Ending in a double colon `::` is in fact valid in situations, such as with `::/0`. Make the IPv6 logic easier to follow by adding additional comments. Also rename `count` to `digits` to further make the code logic more understandable. Improve IPv4 detection by checking if the number is between 0 and 255, inclusively. Add more unit tests to better catch the newly identified and now resolved problems. Update unit tests to use the newer `macro_f_string_static_t_initialize_2()` instead of `macro_f_string_static_t_initialize_1()`. Add additional comments to help identify rows. --- diff --git a/level_0/f_network/c/network.c b/level_0/f_network/c/network.c index 718ac28e4..034ed009c 100644 --- a/level_0/f_network/c/network.c +++ b/level_0/f_network/c/network.c @@ -118,9 +118,9 @@ extern "C" { } f_number_unsigned_t i = 0; - uint8_t flag = 0x0; // 0x1 == is IPv6. + uint8_t flag = 0x0; // 0x1 == is IPv6, 0x2 == has bracket open (IPv6 only), > 0x1 are dependent on IPv4 and IPv6. uint8_t set = 0; - uint8_t count = 0; + uint8_t digits = 0; f_range_double_t at = f_range_double_t_initialize; for (; i < address.used; ++i) { @@ -141,7 +141,7 @@ extern "C" { at.start_1 = at.stop_1 = i; } - ++count; + ++digits; continue; } @@ -160,9 +160,9 @@ extern "C" { if (address.string[i] == ':') { flag = 0x1; - count = 0; + digits = 0; - // Reset position to allow proper counting of double quotes in later loop. + // Reset position before the colon to properly check for leading data. if (i) { --i; } @@ -201,7 +201,7 @@ extern "C" { // IPv6 flag additions: 0x2 == has bracket open, 0x4 == has forward slash, 0x8 = has double-colon, 0x10 = has no leading digit and no bracket open. if (flag & 0x2) { at.start_1 = ++i; - count = 0; + digits = 0; // Skip past NULL characters. for (; i < address.used && !address.string[i]; ++i) { @@ -219,11 +219,11 @@ extern "C" { at.stop_1 = i; } - else if (!count) { + else if (!digits) { flag |= 0x10; } - if (count > 4 || i == address.used) return; + if (digits > 4 || i == address.used) return; // Process address, counting all sets. for (; i < address.used; ++i) { @@ -239,21 +239,48 @@ extern "C" { if (!address.string[i]) continue; if ((uint16_t) (address.string[i] - 'a') < 6 || (uint16_t) (address.string[i] - 'A') < 6 || (uint16_t) (address.string[i] - '0') < 10) { - if (++count > 4) return; + // There must be at max 4 digits in a single set. + if (++digits > 4) return; + + // After the forward slash may only have at most 3 base-10 digits. if (flag & 0x4) { - if ((uint16_t) (address.string[i] - '0') > 9 || count > 3) return; + if ((uint16_t) (address.string[i] - '0') > 9 || digits > 3) return; } } else if (address.string[i] == ':') { + + // Cannot have a colon to the right of a forward slash. if (flag & 0x4) return; at.start_2 = i + 1; - if (at.start_2 < address.used) { + // Must not end on a colon. + if (at.start_2 >= address.used) return; + + // Skip past NULL characters. + for (; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { + + if (state->interrupt) { + state->interrupt((void *) state, 0); + if (F_status_set_fine(state->status) == F_interrupt) return; + + // Restore status in case the interrupt callback changed it. + state->status = F_network_version_six_not; + } + } // for + + if (at.start_2 == address.used) return; + + if (address.string[at.start_2] == ':') { + + // Cannot have three or more colons back to back. + if (flag & 0x8) return; + + flag |= 0x8; // Skip past NULL characters. - for (; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { + for (++at.start_2; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { if (state->interrupt) { state->interrupt((void *) state, 0); @@ -264,48 +291,22 @@ extern "C" { } } // for + // Must not end on a double-colon. if (at.start_2 == address.used) return; - if (address.string[at.start_2] == ':') { - if (flag & 0x8) return; - - flag |= 0x8; - - // Skip past NULL characters. - for (++at.start_2; at.start_2 < address.used && !address.string[at.start_2]; ++at.start_2) { - - if (state->interrupt) { - state->interrupt((void *) state, 0); - if (F_status_set_fine(state->status) == F_interrupt) return; - - // Restore status in case the interrupt callback changed it. - state->status = F_network_version_six_not; - } - } // for - - // Must not end on a double-colon. - if (at.start_2 == address.used) return; + // When double-colons lead, then set the start position at the first double colon. + if (!digits && !set) { + at.start_1 = i; } + } - // Colons must be followed by a hexidecimal digit. - if ((uint16_t) (address.string[at.start_2] - 'a') > 5 && (uint16_t) (address.string[at.start_2] - 'A') > 5 && (uint16_t) (address.string[at.start_2] - '0') > 9) return; - - // When double-colons lead, then set the start position at this digit. - if (!count && !set) { - at.start_1 = at.stop_1 = at.start_2; - } - else { - at.stop_1 = at.start_2; - } + // Colons must be followed by a hexidecimal digit or a forward slash. + if ((uint16_t) (address.string[at.start_2] - 'a') > 5 && (uint16_t) (address.string[at.start_2] - 'A') > 5 && (uint16_t) (address.string[at.start_2] - '0') > 9 && address.string[at.start_2] != '/') return; - // Reset before the digit so that the outer loop properly handles digit. - i = at.start_2 - 1; - } - else { + at.stop_1 = at.start_2; - // Must not end on a colon. - return; - } + // Reset before the digit so that the outer loop properly handles digit. + i = at.start_2 - 1; if (set) { if (++set > 7) return; @@ -316,15 +317,20 @@ extern "C" { set = 2; } - count = 0; + digits = 0; at.start_2 = 1; } else if (address.string[i] == '/') { + + // Must only have a single forward slash. if (flag & 0x4) return; flag |= 0x4; + digits = 0; } else if (address.string[i] == ']') { + + // Must not have a closing bracket without an open bracket. if (!(flag & 0x2)) return; at.stop_1 = i - 1; @@ -388,7 +394,7 @@ extern "C" { } } } - else if (count || set) { + else if (digits || set) { // The double colon either must exist when set is smaller than 7 or the double colon must not exist at all. if (set < 7 && !(flag & 0x8) || set == 7 && (flag & 0x8)) return; @@ -416,7 +422,7 @@ extern "C" { // A close bracket must exist if there is an open bracket and this line should not be reached if a valid close bracket is found. if (flag & 0x2) return; - if (!(flag & 0x10) || set || count) { + if (!(flag & 0x10) || set || digits) { state->status = F_network_version_six; // When there is no port, then the address end is at the end of the string. @@ -439,7 +445,26 @@ extern "C" { // IPv4 flag additions: 0x2 == has port number (and all 4 proper sets), 0x4 == has forward slash, 0x8 = finished forward slash. state->status = F_network_version_four_not; - if (count > 3) return; + if (digits > 3) return; + + char digits_set[4] = { 0, 0, 0, 0 }; + int digit = 0; + + if (i) { + for (f_number_unsigned_t j = 0; digit < digits && j < address.used; ++j) { + + if (!address.string[j]) continue; + + digits_set[digit] = address.string[j]; + ++digit; + } // for + + digit = atoi(digits_set); + + if (digit > 255 || digit < 0) return; + + memset(digits_set, 0, 4); + } for (; i < address.used; ++i) { @@ -455,7 +480,9 @@ extern "C" { if ((uint16_t) (address.string[i] - '0') < 10) { if (flag & 0x4) { - if (!(flag & 0x8) && ++count > 3) return; + if (!(flag & 0x8) && ++digits > 3) return; + + digits_set[digits - 1] = address.string[i]; if (flag & 0x2) { at.stop_2 = i; @@ -465,17 +492,33 @@ extern "C" { at.stop_2 = i; } else { - if (++count > 3) return; + if (++digits > 3) return; + + digits_set[digits - 1] = address.string[i]; } } else if (address.string[i] == '.') { - if ((flag & 0x6) || !count || ++set > 3) return; + if ((flag & 0x6) || !digits || ++set > 3) return; + + digits = 0; + + if (set > 1) { + digit = atoi(digits_set); - count = 0; + if (digit > 255 || digit < 0) return; + } + + memset(digits_set, 0, 3); } else if (address.string[i] == ':') { if (set != 3 || (flag & 0x2)) return; + digit = atoi(digits_set); + + if (digit > 255 || digit < 0) return; + + memset(digits_set, 0, 4); + // The address ends before the colon. at.stop_1 = i - 1; @@ -505,7 +548,7 @@ extern "C" { if ((flag & 0x4) || set != 3) return; flag |= 0x4; - count = 0; + digits = 0; } else { return; @@ -517,6 +560,10 @@ extern "C" { // When there is no port, then the address end is at the end of the string. if (at.start_2 > at.stop_2) { at.stop_1 = i - 1; + + digit = atoi(digits_set); + + if (digit > 255 || digit < 0) return; } if (where) { diff --git a/level_0/f_network/c/network.h b/level_0/f_network/c/network.h index 8d0895375..558c16164 100644 --- a/level_0/f_network/c/network.h +++ b/level_0/f_network/c/network.h @@ -162,6 +162,8 @@ extern "C" { * This does not fully validate the numbers. * This only checks that the address is in the proper form. * + * There is partial validation on the IPv4 numbers to check if the number is inclusively between 0 and 255. + * * For IPv6, this only accepts port numbers when the IPv6 address is wrapped in brackets ('[' (U+005B) and ']' (U+005D)). * * This allows NULL characters to exist within the IP address, but the standard POSIX/libc does not. diff --git a/level_0/f_network/data/documentation/man/man3/f_network_is_ip_address.3 b/level_0/f_network/data/documentation/man/man3/f_network_is_ip_address.3 index 5a100e7de..0955a6f04 100644 --- a/level_0/f_network/data/documentation/man/man3/f_network_is_ip_address.3 +++ b/level_0/f_network/data/documentation/man/man3/f_network_is_ip_address.3 @@ -17,6 +17,8 @@ Identify whether or not a string is a valid IPv4 or IPv6 address, including the .PP This does not fully validate the numbers. This only checks that the address is in the proper form. .PP +There is partial validation on the IPv4 numbers to check if the number is inclusively between 0 and 255. +.PP For IPv6, this only accepts port numbers when the IPv6 address is wrapped in brackets ('[' (U+005B) and ']' (U+005D)). .PP This allows NULL characters to exist within the IP address, but the standard POSIX/libc does not. The address from this string should be sanitized to not have NULL characters before passing to a POSIX/libc function. 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 41d5d0c99..b6f3a404e 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 @@ -41,14 +41,14 @@ void test__f_network_is_ip_address__returns_false(void **state) { f_state_t state_data = f_state_t_initialize; const f_string_static_t ips[] = { - macro_f_string_static_t_initialize_1("127", 3, 0), - macro_f_string_static_t_initialize_1("a", 1, 0), - macro_f_string_static_t_initialize_1("www.example.com", 15, 0), - macro_f_string_static_t_initialize_1("www.example.com:80", 18, 0), - macro_f_string_static_t_initialize_1("localhost", 9, 0), - macro_f_string_static_t_initialize_1("___", 3, 0), - macro_f_string_static_t_initialize_1("]", 1, 0), - macro_f_string_static_t_initialize_1("[", 1, 0), + macro_f_string_static_t_initialize_2("127", 3), // [0] + macro_f_string_static_t_initialize_2("a", 1), // [1] + macro_f_string_static_t_initialize_2("www.example.com", 15), // [2] + macro_f_string_static_t_initialize_2("www.example.com:80", 18), // [3] + macro_f_string_static_t_initialize_2("localhost", 9), // [4] + macro_f_string_static_t_initialize_2("___", 3), // [5] + macro_f_string_static_t_initialize_2("]", 1), // [6] + macro_f_string_static_t_initialize_2("[", 1), // [7] }; f_range_double_t where = f_range_double_t_initialize; @@ -82,22 +82,34 @@ void test__f_network_is_ip_address__returns_network_version_four(void **state) { f_state_t state_data = f_state_t_initialize; const f_string_static_t ips[] = { - macro_f_string_static_t_initialize_1("127.0.0.1", 9, 0), - macro_f_string_static_t_initialize_1("127.0.0.1/24", 12, 0), - macro_f_string_static_t_initialize_1("127.0.0.1:80", 12, 0), - macro_f_string_static_t_initialize_1("127.0.0.1/24:80", 15, 0), + macro_f_string_static_t_initialize_2("127.0.0.1", 9), // [0] + macro_f_string_static_t_initialize_2("127.0.0.1/24", 12), // [1] + macro_f_string_static_t_initialize_2("127.0.0.1:80", 12), // [2] + macro_f_string_static_t_initialize_2("127.0.0.1/24:80", 15), // [3] + macro_f_string_static_t_initialize_2("63.255.255.255", 14), // [4] + macro_f_string_static_t_initialize_2("255.255.255.255", 15), // [5] + macro_f_string_static_t_initialize_2("63.255.255.255:901", 18), // [6] + macro_f_string_static_t_initialize_2("255.255.255.255:901", 19), // [7] + macro_f_string_static_t_initialize_2("0.0.0.0", 7), // [8] + macro_f_string_static_t_initialize_2("0.0.0.0:2", 9), // [9] }; const f_range_double_t wheres[] = { - { .start_1 = 0, .stop_1 = 8, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 0, .stop_1 = 11, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 0, .stop_1 = 8, .start_2 = 10, .stop_2 = 11 }, - { .start_1 = 0, .stop_1 = 11, .start_2 = 13, .stop_2 = 14 }, + { .start_1 = 0, .stop_1 = 8, .start_2 = 1, .stop_2 = 0 }, // [0] + { .start_1 = 0, .stop_1 = 11, .start_2 = 1, .stop_2 = 0 }, // [1] + { .start_1 = 0, .stop_1 = 8, .start_2 = 10, .stop_2 = 11 }, // [2] + { .start_1 = 0, .stop_1 = 11, .start_2 = 13, .stop_2 = 14 }, // [3] + { .start_1 = 0, .stop_1 = 13, .start_2 = 1, .stop_2 = 0 }, // [4] + { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, // [5] + { .start_1 = 0, .stop_1 = 13, .start_2 = 15, .stop_2 = 17 }, // [6] + { .start_1 = 0, .stop_1 = 14, .start_2 = 16, .stop_2 = 18 }, // [7] + { .start_1 = 0, .stop_1 = 6, .start_2 = 1, .stop_2 = 0 }, // [8] + { .start_1 = 0, .stop_1 = 6, .start_2 = 8, .stop_2 = 8 }, // [9] }; f_range_double_t where = f_range_double_t_initialize; - for (uint8_t i = 0; i < 4; ++i) { + for (uint8_t i = 0; i < 8; ++i) { state_data.status = F_okay; where.start_1 = 1; @@ -126,28 +138,36 @@ void test__f_network_is_ip_address__returns_network_version_four_not(void **stat f_state_t state_data = f_state_t_initialize; const f_string_static_t ips[] = { - macro_f_string_static_t_initialize_1("127.", 4, 0), - macro_f_string_static_t_initialize_1("127./24", 7, 0), - macro_f_string_static_t_initialize_1("127./2a", 7, 0), - macro_f_string_static_t_initialize_1("0..", 3, 0), - macro_f_string_static_t_initialize_1("0.1111", 6, 0), - macro_f_string_static_t_initialize_1("0.1.2.3.4.", 10, 0), - macro_f_string_static_t_initialize_1("0.1.2.3.4.5.6", 13, 0), - macro_f_string_static_t_initialize_1("1274.", 5, 0), - macro_f_string_static_t_initialize_1("127.1234", 8, 0), - macro_f_string_static_t_initialize_1("127.hello", 9, 0), - macro_f_string_static_t_initialize_1("a.0.0.1", 7, 0), - macro_f_string_static_t_initialize_1("a.b", 9, 0), - macro_f_string_static_t_initialize_1("127.0.0.1/1234", 14, 0), - macro_f_string_static_t_initialize_1("127.0.0.1/2a", 12, 0), - macro_f_string_static_t_initialize_1(".", 1, 0), - macro_f_string_static_t_initialize_1("..", 2, 0), - macro_f_string_static_t_initialize_1(".127.0.0.1", 10, 0), + macro_f_string_static_t_initialize_2("127.", 4), // [0] + macro_f_string_static_t_initialize_2("127./24", 7), // [1] + macro_f_string_static_t_initialize_2("127./2a", 7), // [2] + macro_f_string_static_t_initialize_2("0..", 3), // [3] + macro_f_string_static_t_initialize_2("0.1111", 6), // [4] + macro_f_string_static_t_initialize_2("0.1.2.3.4.", 10), // [5] + macro_f_string_static_t_initialize_2("0.1.2.3.4.5.6", 13), // [6] + macro_f_string_static_t_initialize_2("1274.", 5), // [7] + macro_f_string_static_t_initialize_2("127.1234", 8), // [8] + macro_f_string_static_t_initialize_2("127.hello", 9), // [9] + macro_f_string_static_t_initialize_2("a.0.0.1", 7), // [10] + macro_f_string_static_t_initialize_2("a.b", 9), // [11] + macro_f_string_static_t_initialize_2("127.0.0.1/1234", 14), // [12] + macro_f_string_static_t_initialize_2("127.0.0.1/2a", 12), // [13] + macro_f_string_static_t_initialize_2(".", 1), // [14] + macro_f_string_static_t_initialize_2("..", 2), // [15] + macro_f_string_static_t_initialize_2(".127.0.0.1", 10), // [16] + macro_f_string_static_t_initialize_2("512.255.255.255", 14), // [17] + macro_f_string_static_t_initialize_2("63.255.255.256", 14), // [18] + macro_f_string_static_t_initialize_2("512.255.255.255:80", 17), // [19] + macro_f_string_static_t_initialize_2("63.255.255.256:80", 17), // [20] + macro_f_string_static_t_initialize_2("2.0.999.0", 9), // [21] + macro_f_string_static_t_initialize_2("2.0.999.0:80", 12), // [22] + macro_f_string_static_t_initialize_2("4.-1.1.0", 8), // [23] + macro_f_string_static_t_initialize_2("4.-1.1.0:80", 11), // [24] }; f_range_double_t where = f_range_double_t_initialize; - for (uint8_t i = 0; i < 17; ++i) { + for (uint8_t i = 0; i < 25; ++i) { state_data.status = F_okay; where.start_1 = 1; @@ -176,119 +196,118 @@ void test__f_network_is_ip_address__returns_network_version_six_not(void **state f_state_t state_data = f_state_t_initialize; const f_string_static_t ips[] = { - macro_f_string_static_t_initialize_1(":", 1, 0), - macro_f_string_static_t_initialize_1("::", 2, 0), - macro_f_string_static_t_initialize_1(":/24", 4, 0), - macro_f_string_static_t_initialize_1("::/24", 5, 0), - macro_f_string_static_t_initialize_1(":/2a", 4, 0), - macro_f_string_static_t_initialize_1("::/2a", 5, 0), - macro_f_string_static_t_initialize_1(":12345", 6, 0), - macro_f_string_static_t_initialize_1("::12345", 7, 0), - macro_f_string_static_t_initialize_1(":12345/24", 9, 0), - macro_f_string_static_t_initialize_1("::12345/24", 10, 0), - macro_f_string_static_t_initialize_1(":12345/2a", 9, 0), - macro_f_string_static_t_initialize_1("::12345/2a", 10, 0), - macro_f_string_static_t_initialize_1("::1/1234", 8, 0), - macro_f_string_static_t_initialize_1("::1/12a", 7, 0), - macro_f_string_static_t_initialize_1(":example", 8, 0), - macro_f_string_static_t_initialize_1("::example", 9, 0), - macro_f_string_static_t_initialize_1(":example/24", 11, 0), - macro_f_string_static_t_initialize_1("::example/24", 12, 0), - macro_f_string_static_t_initialize_1(":example/2a", 11, 0), - macro_f_string_static_t_initialize_1("::example/2a", 12, 0), - macro_f_string_static_t_initialize_1("[:", 2, 0), - macro_f_string_static_t_initialize_1("[::", 3, 0), - macro_f_string_static_t_initialize_1("[:/24", 5, 0), - macro_f_string_static_t_initialize_1("[::/24", 6, 0), - macro_f_string_static_t_initialize_1("[:/2a", 5, 0), - macro_f_string_static_t_initialize_1("[::/2a", 6, 0), - macro_f_string_static_t_initialize_1("[:1/24", 6, 0), - macro_f_string_static_t_initialize_1("[::1/24", 7, 0), - macro_f_string_static_t_initialize_1("[:12345", 7, 0), - macro_f_string_static_t_initialize_1("[::12345", 8, 0), - macro_f_string_static_t_initialize_1("[:12345/24", 10, 0), - macro_f_string_static_t_initialize_1("[::12345/24", 11, 0), - macro_f_string_static_t_initialize_1("[::1/1234", 9, 0), - macro_f_string_static_t_initialize_1("[::1", 4, 0), - macro_f_string_static_t_initialize_1("[::1/24", 7, 0), - macro_f_string_static_t_initialize_1("[:example", 9, 0), - macro_f_string_static_t_initialize_1("[::example", 10, 0), - macro_f_string_static_t_initialize_1("[:example/24", 12, 0), - macro_f_string_static_t_initialize_1("[::example/24", 13, 0), - macro_f_string_static_t_initialize_1("[:example/2a", 12, 0), - macro_f_string_static_t_initialize_1("[::example/2a", 13, 0), - macro_f_string_static_t_initialize_1("[:]", 3, 0), - macro_f_string_static_t_initialize_1("[:1/24]", 7, 0), - macro_f_string_static_t_initialize_1("[:1]/24", 7, 0), - macro_f_string_static_t_initialize_1("[:1/2a]", 7, 0), - macro_f_string_static_t_initialize_1("[:1]/2a", 7, 0), - macro_f_string_static_t_initialize_1("[::]", 2, 0), - macro_f_string_static_t_initialize_1("[::1]/24", 8, 0), - macro_f_string_static_t_initialize_1("[::1]/2a", 8, 0), - macro_f_string_static_t_initialize_1("[:/24]", 4, 0), - macro_f_string_static_t_initialize_1("[:/2a]", 4, 0), - macro_f_string_static_t_initialize_1("[::/24]", 5, 0), - macro_f_string_static_t_initialize_1("[::/2a]", 5, 0), - macro_f_string_static_t_initialize_1("[:12345]", 6, 0), - macro_f_string_static_t_initialize_1("[::12345]", 7, 0), - macro_f_string_static_t_initialize_1("[:12345/24]", 9, 0), - macro_f_string_static_t_initialize_1("[::12345/24]", 10, 0), - macro_f_string_static_t_initialize_1("[:12345/2a]", 9, 0), - macro_f_string_static_t_initialize_1("[::12345/2a]", 10, 0), - macro_f_string_static_t_initialize_1("[::1/1234]", 8, 0), - macro_f_string_static_t_initialize_1("[:example]", 10, 0), - macro_f_string_static_t_initialize_1("[::example]", 11, 0), - macro_f_string_static_t_initialize_1("[:example/24]", 13, 0), - macro_f_string_static_t_initialize_1("[::example/24]", 14, 0), - macro_f_string_static_t_initialize_1("[:example]/24", 13, 0), - macro_f_string_static_t_initialize_1("[::example]/24", 14, 0), - macro_f_string_static_t_initialize_1("[:example/2a]", 13, 0), - macro_f_string_static_t_initialize_1("[::example/2a]", 14, 0), - macro_f_string_static_t_initialize_1("[:example]/2a", 13, 0), - macro_f_string_static_t_initialize_1("[::example]/2a", 14, 0), - macro_f_string_static_t_initialize_1("[::example]:80_map", 18, 0), - macro_f_string_static_t_initialize_1("1234::example", 13, 0), - macro_f_string_static_t_initialize_1("1234:example", 12, 0), - macro_f_string_static_t_initialize_1("1234:1234:1234:1234:1234:1234:1234:1234:1234", 44, 0), - macro_f_string_static_t_initialize_1("1234::1234:1234:1234:1234::1234:1234:1234", 41, 0), - macro_f_string_static_t_initialize_1("1234::1234::1234", 16, 0), - macro_f_string_static_t_initialize_1("a234:1234:1234:1234:1234:1234:1234:1234:1234", 44, 0), - macro_f_string_static_t_initialize_1("a234::1234:1234:1234:1234::1234:1234:1234", 41, 0), - macro_f_string_static_t_initialize_1("a234::1234::1234", 16, 0), - macro_f_string_static_t_initialize_1("1234:aaaa:1234:1234:1234:1234:1234:1234:1234", 44, 0), - macro_f_string_static_t_initialize_1("1234::aaaa:1234:1234:1234::1234:1234:1234", 41, 0), - macro_f_string_static_t_initialize_1("1234::aaaa::1234", 16, 0), - macro_f_string_static_t_initialize_1("1234::www.example.com", 21, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234", 40, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a", 38, 0), - macro_f_string_static_t_initialize_1("2001:0DB83:0:CD30:123:4567:89AB:CDEF", 36, 0), - macro_f_string_static_t_initialize_1("2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234", 41, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/1234]", 42, 0), - macro_f_string_static_t_initialize_1("2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a", 39, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF/2a]", 40, 0), - macro_f_string_static_t_initialize_1("[2001:0DB83:0:CD30:123:4567:89AB:CDEF]", 38, 0), - macro_f_string_static_t_initialize_1("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/1234]", 43, 0), - macro_f_string_static_t_initialize_1("[2001:0DB83:0:CD30:123:4567:89AB:CDEF/2a]", 41, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]a", 38, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]1", 38, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]hello", 42, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/24", 40, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/2a", 40, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]/1234", 42, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80_map", 44, 0), - macro_f_string_static_t_initialize_1("[::1]:80not", 11, 0), - macro_f_string_static_t_initialize_1("[::1/24]:80ton", 14, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567:89AB:CDEF]:80ton", 43, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123:4567::CDEF]:80not", 39, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123::CDEF]:80otn", 34, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::CDEF]:80nto", 30, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0::CDEF]:80ttt", 25, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::CDEF]:80ooo", 23, 0), - macro_f_string_static_t_initialize_1("[2001::CDEF]:80nnn", 18, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:CDEF]:80_to", 23, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::0:CDEF]:80_no", 25, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:0:CD30:CDEF]:80*to", 30, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::123:4567:CDEF]:80$ot", 39, 0), + 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] }; f_range_double_t where = f_range_double_t_initialize; @@ -322,98 +341,170 @@ void test__f_network_is_ip_address__returns_network_version_six(void **state) { f_state_t state_data = f_state_t_initialize; const f_string_static_t ips[] = { - macro_f_string_static_t_initialize_1("::1", 3, 0), - macro_f_string_static_t_initialize_1("[::1]", 5, 0), - macro_f_string_static_t_initialize_1("[::1]:80", 8, 0), - macro_f_string_static_t_initialize_1("::1/24", 6, 0), - macro_f_string_static_t_initialize_1("[::1/24]", 8, 0), - macro_f_string_static_t_initialize_1("[::1/24]:80", 11, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:CD30:123:4567:89AB:CDEF", 33, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30:123:4567:89AB:CDEF]", 35, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30:123:4567:89AB:CDEF]:80", 38, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:CD30:123:4567::CDEF", 29, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30:123:4567::CDEF]", 31, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30:123:4567::CDEF]:80", 34, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0:CD30:123::CDEF", 26, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123::CDEF]", 28, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30:123::CDEF]:80", 31, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0:CD30::CDEF", 22, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::CDEF]", 24, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::CDEF]:80", 27, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0::CDEF", 17, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0::CDEF]", 19, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0::CDEF]:80", 22, 0), - macro_f_string_static_t_initialize_1("2001:0DB8::CDEF", 15, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::CDEF]", 17, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::CDEF]:80", 20, 0), - macro_f_string_static_t_initialize_1("2001::CDEF", 10, 0), - macro_f_string_static_t_initialize_1("[2001::CDEF]", 12, 0), - macro_f_string_static_t_initialize_1("[2001::CDEF]:80", 15, 0), - macro_f_string_static_t_initialize_1("2001::0DB8:CDEF", 15, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:CDEF]", 17, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:CDEF]:80", 20, 0), - macro_f_string_static_t_initialize_1("2001:0DB8::0:CDEF", 17, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::0:CDEF]", 19, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8::0:CDEF]:80", 22, 0), - macro_f_string_static_t_initialize_1("2001::0DB8:0:CD30:CDEF", 22, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:0:CD30:CDEF]", 24, 0), - macro_f_string_static_t_initialize_1("[2001::0DB8:0:CD30:CDEF]:80", 27, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:0:CD30::123:CDEF", 26, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::123:CDEF]", 28, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:0:CD30::123:CDEF]:80", 31, 0), - macro_f_string_static_t_initialize_1("2001:0DB8:CD30::123:4567:CDEF", 29, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30::123:4567:CDEF]", 31, 0), - macro_f_string_static_t_initialize_1("[2001:0DB8:CD30::123:4567:CDEF]:80", 34, 0), + macro_f_string_static_t_initialize_2("::1", 3), // [0] + macro_f_string_static_t_initialize_2("[::1]", 5), // [1] + macro_f_string_static_t_initialize_2("[::1]:80", 8), // [2] + macro_f_string_static_t_initialize_2("::12A", 5), // [3] + macro_f_string_static_t_initialize_2("[::12A]", 7), // [4] + macro_f_string_static_t_initialize_2("[::12A]:80", 10), // [5] + macro_f_string_static_t_initialize_2("::1/24", 6), // [6] + macro_f_string_static_t_initialize_2("[::1/24]", 8), // [7] + macro_f_string_static_t_initialize_2("[::1/24]:80", 11), // [8] + macro_f_string_static_t_initialize_2("::12A/24", 8), // [9] + macro_f_string_static_t_initialize_2("[::12A/24]", 10), // [10] + macro_f_string_static_t_initialize_2("[::12A/24]:80", 13), // [11] + macro_f_string_static_t_initialize_2("2001:0DB8:CD30:123:4567:89AB:CDEF", 33), // [12] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30:123:4567:89AB:CDEF]", 35), // [13] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30:123:4567:89AB:CDEF]:80", 38), // [14] + macro_f_string_static_t_initialize_2("2001:0DB8:CD30:123:4567::CDEF", 29), // [15] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30:123:4567::CDEF]", 31), // [16] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30:123:4567::CDEF]:80", 34), // [17] + macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30:123::CDEF", 26), // [18] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123::CDEF]", 28), // [19] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30:123::CDEF]:80", 31), // [20] + macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30::CDEF", 22), // [21] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::CDEF]", 24), // [22] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::CDEF]:80", 27), // [23] + macro_f_string_static_t_initialize_2("2001:0DB8:0::CDEF", 17), // [24] + macro_f_string_static_t_initialize_2("[2001:0DB8:0::CDEF]", 19), // [25] + macro_f_string_static_t_initialize_2("[2001:0DB8:0::CDEF]:80", 22), // [26] + macro_f_string_static_t_initialize_2("2001:0DB8::CDEF", 15), // [27] + macro_f_string_static_t_initialize_2("[2001:0DB8::CDEF]", 17), // [28] + macro_f_string_static_t_initialize_2("[2001:0DB8::CDEF]:80", 20), // [29] + macro_f_string_static_t_initialize_2("2001::CDEF", 10), // [30] + macro_f_string_static_t_initialize_2("[2001::CDEF]", 12), // [31] + macro_f_string_static_t_initialize_2("[2001::CDEF]:80", 15), // [32] + macro_f_string_static_t_initialize_2("2001::0DB8:CDEF", 15), // [33] + macro_f_string_static_t_initialize_2("[2001::0DB8:CDEF]", 17), // [34] + macro_f_string_static_t_initialize_2("[2001::0DB8:CDEF]:80", 20), // [35] + macro_f_string_static_t_initialize_2("2001:0DB8::0:CDEF", 17), // [36] + macro_f_string_static_t_initialize_2("[2001:0DB8::0:CDEF]", 19), // [37] + macro_f_string_static_t_initialize_2("[2001:0DB8::0:CDEF]:80", 22), // [38] + macro_f_string_static_t_initialize_2("2001::0DB8:0:CD30:CDEF", 22), // [39] + macro_f_string_static_t_initialize_2("[2001::0DB8:0:CD30:CDEF]", 24), // [40] + macro_f_string_static_t_initialize_2("[2001::0DB8:0:CD30:CDEF]:80", 27), // [41] + macro_f_string_static_t_initialize_2("2001:0DB8:0:CD30::123:CDEF", 26), // [42] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::123:CDEF]", 28), // [43] + macro_f_string_static_t_initialize_2("[2001:0DB8:0:CD30::123:CDEF]:80", 31), // [44] + macro_f_string_static_t_initialize_2("2001:0DB8:CD30::123:4567:CDEF", 29), // [45] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30::123:4567:CDEF]", 31), // [46] + macro_f_string_static_t_initialize_2("[2001:0DB8:CD30::123:4567:CDEF]:80", 34), // [47] + macro_f_string_static_t_initialize_2("::789:1", 7), // [48] + macro_f_string_static_t_initialize_2("[::5:789]", 9), // [49] + macro_f_string_static_t_initialize_2("[::5:789]:80", 12), // [50] + macro_f_string_static_t_initialize_2("::B4:789", 8), // [51] + macro_f_string_static_t_initialize_2("[::B4:789]", 10), // [52] + macro_f_string_static_t_initialize_2("[::B4:789]:80", 13), // [53] + macro_f_string_static_t_initialize_2("::5:789/24", 10), // [54] + macro_f_string_static_t_initialize_2("[::5:789/24]", 12), // [55] + macro_f_string_static_t_initialize_2("[::5:789/24]:80", 15), // [56] + macro_f_string_static_t_initialize_2("::B4:789/24", 11), // [57] + macro_f_string_static_t_initialize_2("[::B4:789/24]", 13), // [58] + macro_f_string_static_t_initialize_2("[::B4:789/24]:80", 16), // [59] + macro_f_string_static_t_initialize_2("::/24", 5), // [60] + macro_f_string_static_t_initialize_2("[::/24]", 7), // [61] + macro_f_string_static_t_initialize_2("[::/24]:80", 10), // [62] + macro_f_string_static_t_initialize_2("::1/128", 7), // [63] + macro_f_string_static_t_initialize_2("[::1/128]", 9), // [64] + macro_f_string_static_t_initialize_2("[::1/128]:5", 11), // [65] + macro_f_string_static_t_initialize_2("::/0", 4), // [66] + macro_f_string_static_t_initialize_2("[::/0]", 6), // [67] + macro_f_string_static_t_initialize_2("[::/0]:5", 8), // [68] + macro_f_string_static_t_initialize_2("::ffff:0:0/96", 13), // [69] + macro_f_string_static_t_initialize_2("[::ffff:0:0/96]", 15), // [70] + macro_f_string_static_t_initialize_2("[::ffff:0:0/96]:5", 17), // [71] + macro_f_string_static_t_initialize_2("2001::/32", 9), // [72] + macro_f_string_static_t_initialize_2("[2001::/32]", 11), // [73] + macro_f_string_static_t_initialize_2("[2001::/32]:5", 13), // [74] + 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] }; const f_range_double_t wheres[] = { - { .start_1 = 2, .stop_1 = 2, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 3, .stop_1 = 3, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 3, .stop_1 = 3, .start_2 = 6, .stop_2 = 7 }, - { .start_1 = 2, .stop_1 = 5, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 3, .stop_1 = 6, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 3, .stop_1 = 6, .start_2 = 9, .stop_2 = 10 }, - { .start_1 = 0, .stop_1 = 32, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 33, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 33, .start_2 = 36, .stop_2 = 37 }, - { .start_1 = 0, .stop_1 = 28, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 29, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 29, .start_2 = 32, .stop_2 = 33 }, - { .start_1 = 0, .stop_1 = 25, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 26, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 26, .start_2 = 29, .stop_2 = 30 }, - { .start_1 = 0, .stop_1 = 21, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 22, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 22, .start_2 = 25, .stop_2 = 26 }, - { .start_1 = 0, .stop_1 = 16, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 17, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 17, .start_2 = 20, .stop_2 = 21 }, - { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 15, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 15, .start_2 = 18, .stop_2 = 19 }, - { .start_1 = 0, .stop_1 = 9, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 10, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 10, .start_2 = 13, .stop_2 = 14 }, - { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 15, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 15, .start_2 = 18, .stop_2 = 19 }, - { .start_1 = 0, .stop_1 = 16, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 17, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 17, .start_2 = 20, .stop_2 = 21 }, - { .start_1 = 0, .stop_1 = 21, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 22, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 22, .start_2 = 25, .stop_2 = 26 }, - { .start_1 = 0, .stop_1 = 25, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 26, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 26, .start_2 = 29, .stop_2 = 30 }, - { .start_1 = 0, .stop_1 = 28, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 29, .start_2 = 1, .stop_2 = 0 }, - { .start_1 = 1, .stop_1 = 29, .start_2 = 32, .stop_2 = 33 }, + { .start_1 = 0, .stop_1 = 2, .start_2 = 1, .stop_2 = 0 }, // [0] "::1" + { .start_1 = 1, .stop_1 = 3, .start_2 = 1, .stop_2 = 0 }, // [1] "[::1]" + { .start_1 = 1, .stop_1 = 3, .start_2 = 6, .stop_2 = 7 }, // [2] "[::1]:80" + { .start_1 = 0, .stop_1 = 4, .start_2 = 1, .stop_2 = 0 }, // [3] "::123" + { .start_1 = 1, .stop_1 = 5, .start_2 = 1, .stop_2 = 0 }, // [4] "[::123]" + { .start_1 = 1, .stop_1 = 5, .start_2 = 8, .stop_2 = 9 }, // [5] "[::123]:80" + { .start_1 = 0, .stop_1 = 5, .start_2 = 1, .stop_2 = 0 }, // [6] "::1/24" + { .start_1 = 1, .stop_1 = 6, .start_2 = 1, .stop_2 = 0 }, // [7] "[::1/24]" + { .start_1 = 1, .stop_1 = 6, .start_2 = 9, .stop_2 = 10 }, // [8] "[::1/24]:80" + { .start_1 = 0, .stop_1 = 7, .start_2 = 1, .stop_2 = 0 }, // [9] "::123/24" + { .start_1 = 1, .stop_1 = 8, .start_2 = 1, .stop_2 = 0 }, // [10] "[::123/24]" + { .start_1 = 1, .stop_1 = 8, .start_2 = 11, .stop_2 = 12 }, // [11] "[::123/24]:80" + { .start_1 = 0, .stop_1 = 32, .start_2 = 1, .stop_2 = 0 }, // [12] "2001:0DB8:CD30:123:4567:89AB:CDEF" + { .start_1 = 1, .stop_1 = 33, .start_2 = 1, .stop_2 = 0 }, // [13] "[2001:0DB8:CD30:123:4567:89AB:CDEF]" + { .start_1 = 1, .stop_1 = 33, .start_2 = 36, .stop_2 = 37 }, // [14] "[2001:0DB8:CD30:123:4567:89AB:CDEF]:80" + { .start_1 = 0, .stop_1 = 28, .start_2 = 1, .stop_2 = 0 }, // [15] "2001:0DB8:CD30:123:4567::CDEF" + { .start_1 = 1, .stop_1 = 29, .start_2 = 1, .stop_2 = 0 }, // [16] "[2001:0DB8:CD30:123:4567::CDEF]" + { .start_1 = 1, .stop_1 = 29, .start_2 = 32, .stop_2 = 33 }, // [17] "[2001:0DB8:CD30:123:4567::CDEF]:80" + { .start_1 = 0, .stop_1 = 25, .start_2 = 1, .stop_2 = 0 }, // [18] "2001:0DB8:0:CD30:123::CDEF" + { .start_1 = 1, .stop_1 = 26, .start_2 = 1, .stop_2 = 0 }, // [19] "[2001:0DB8:0:CD30:123::CDEF]" + { .start_1 = 1, .stop_1 = 26, .start_2 = 29, .stop_2 = 30 }, // [20] "[2001:0DB8:0:CD30:123::CDEF]:80" + { .start_1 = 0, .stop_1 = 21, .start_2 = 1, .stop_2 = 0 }, // [21] "2001:0DB8:0:CD30::CDEF" + { .start_1 = 1, .stop_1 = 22, .start_2 = 1, .stop_2 = 0 }, // [22] "[2001:0DB8:0:CD30::CDEF]" + { .start_1 = 1, .stop_1 = 22, .start_2 = 25, .stop_2 = 26 }, // [23] "[2001:0DB8:0:CD30::CDEF]:80" + { .start_1 = 0, .stop_1 = 16, .start_2 = 1, .stop_2 = 0 }, // [24] "2001:0DB8:0::CDEF" + { .start_1 = 1, .stop_1 = 17, .start_2 = 1, .stop_2 = 0 }, // [25] "[2001:0DB8:0::CDEF]" + { .start_1 = 1, .stop_1 = 17, .start_2 = 20, .stop_2 = 21 }, // [26] "[2001:0DB8:0::CDEF]:80" + { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, // [27] "2001:0DB8::CDEF" + { .start_1 = 1, .stop_1 = 15, .start_2 = 1, .stop_2 = 0 }, // [28] "[2001:0DB8::CDEF]" + { .start_1 = 1, .stop_1 = 15, .start_2 = 18, .stop_2 = 19 }, // [29] "[2001:0DB8::CDEF]:80" + { .start_1 = 0, .stop_1 = 9, .start_2 = 1, .stop_2 = 0 }, // [30] "2001::CDEF" + { .start_1 = 1, .stop_1 = 10, .start_2 = 1, .stop_2 = 0 }, // [31] "[2001::CDEF]" + { .start_1 = 1, .stop_1 = 10, .start_2 = 13, .stop_2 = 14 }, // [32] "[2001::CDEF]:80" + { .start_1 = 0, .stop_1 = 14, .start_2 = 1, .stop_2 = 0 }, // [33] "2001::0DB8:CDEF" + { .start_1 = 1, .stop_1 = 15, .start_2 = 1, .stop_2 = 0 }, // [34] "[2001::0DB8:CDEF]" + { .start_1 = 1, .stop_1 = 15, .start_2 = 18, .stop_2 = 19 }, // [35] "[2001::0DB8:CDEF]:80" + { .start_1 = 0, .stop_1 = 16, .start_2 = 1, .stop_2 = 0 }, // [36] "2001:0DB8::0:CDEF" + { .start_1 = 1, .stop_1 = 17, .start_2 = 1, .stop_2 = 0 }, // [37] "[2001:0DB8::0:CDEF]" + { .start_1 = 1, .stop_1 = 17, .start_2 = 20, .stop_2 = 21 }, // [38] "[2001:0DB8::0:CDEF]:80" + { .start_1 = 0, .stop_1 = 21, .start_2 = 1, .stop_2 = 0 }, // [39] "2001::0DB8:0:CD30:CDEF" + { .start_1 = 1, .stop_1 = 22, .start_2 = 1, .stop_2 = 0 }, // [40] "[2001::0DB8:0:CD30:CDEF]" + { .start_1 = 1, .stop_1 = 22, .start_2 = 25, .stop_2 = 26 }, // [41] "[2001::0DB8:0:CD30:CDEF]:80" + { .start_1 = 0, .stop_1 = 25, .start_2 = 1, .stop_2 = 0 }, // [42] "2001:0DB8:0:CD30::123:CDEF" + { .start_1 = 1, .stop_1 = 26, .start_2 = 1, .stop_2 = 0 }, // [43] "[2001:0DB8:0:CD30::123:CDEF]" + { .start_1 = 1, .stop_1 = 26, .start_2 = 29, .stop_2 = 30 }, // [44] "[2001:0DB8:0:CD30::123:CDEF]:80" + { .start_1 = 0, .stop_1 = 28, .start_2 = 1, .stop_2 = 0 }, // [45] "2001:0DB8:CD30::123:4567:CDEF" + { .start_1 = 1, .stop_1 = 29, .start_2 = 1, .stop_2 = 0 }, // [46] "[2001:0DB8:CD30::123:4567:CDEF]" + { .start_1 = 1, .stop_1 = 29, .start_2 = 32, .stop_2 = 33 }, // [47] "[2001:0DB8:CD30::123:4567:CDEF]:80" + { .start_1 = 0, .stop_1 = 6, .start_2 = 1, .stop_2 = 0 }, // [48] "::5:789" + { .start_1 = 1, .stop_1 = 7, .start_2 = 1, .stop_2 = 0 }, // [49] "[::5:789]" + { .start_1 = 1, .stop_1 = 7, .start_2 = 10, .stop_2 = 11 }, // [50] "[::5:789]:80" + { .start_1 = 0, .stop_1 = 7, .start_2 = 1, .stop_2 = 0 }, // [51] "::B4:789" + { .start_1 = 1, .stop_1 = 8, .start_2 = 1, .stop_2 = 0 }, // [52] "[::B4:789]" + { .start_1 = 1, .stop_1 = 8, .start_2 = 11, .stop_2 = 12 }, // [53] "[::B4:789]:80" + { .start_1 = 0, .stop_1 = 9, .start_2 = 1, .stop_2 = 0 }, // [54] "::5:789/24" + { .start_1 = 1, .stop_1 = 10, .start_2 = 1, .stop_2 = 0 }, // [55] "[::5:789/24]" + { .start_1 = 1, .stop_1 = 10, .start_2 = 13, .stop_2 = 14 }, // [56] "[::5:789/24]:80" + { .start_1 = 0, .stop_1 = 10, .start_2 = 1, .stop_2 = 0 }, // [57] "::B4:789/24" + { .start_1 = 1, .stop_1 = 11, .start_2 = 1, .stop_2 = 0 }, // [58] "[::B4:789/24]" + { .start_1 = 1, .stop_1 = 11, .start_2 = 14, .stop_2 = 15 }, // [59] "[::B4:789/24]:80" + { .start_1 = 0, .stop_1 = 4, .start_2 = 1, .stop_2 = 0 }, // [60] "::/24" + { .start_1 = 1, .stop_1 = 5, .start_2 = 1, .stop_2 = 0 }, // [61] "[::/24]" + { .start_1 = 1, .stop_1 = 5, .start_2 = 8, .stop_2 = 9 }, // [62] "[::/24]:80" + { .start_1 = 0, .stop_1 = 6, .start_2 = 1, .stop_2 = 0 }, // [63] "::1/128" + { .start_1 = 1, .stop_1 = 7, .start_2 = 1, .stop_2 = 0 }, // [64] "[::1/128]" + { .start_1 = 1, .stop_1 = 7, .start_2 = 10, .stop_2 = 10 }, // [65] "[::1/128]:5" + { .start_1 = 0, .stop_1 = 3, .start_2 = 1, .stop_2 = 0 }, // [66] "::/0" + { .start_1 = 1, .stop_1 = 4, .start_2 = 1, .stop_2 = 0 }, // [67] "[::/0]" + { .start_1 = 1, .stop_1 = 4, .start_2 = 7, .stop_2 = 7 }, // [68] "[::/0]:5" + { .start_1 = 0, .stop_1 = 12, .start_2 = 1, .stop_2 = 0 }, // [69] "::ffff:0:0/96" + { .start_1 = 1, .stop_1 = 13, .start_2 = 1, .stop_2 = 0 }, // [70] "[::ffff:0:0/96]" + { .start_1 = 1, .stop_1 = 13, .start_2 = 16, .stop_2 = 16 }, // [71] "[::ffff:0:0/96]:5" + { .start_1 = 0, .stop_1 = 8, .start_2 = 1, .stop_2 = 0 }, // [72] "2001::/32" + { .start_1 = 1, .stop_1 = 9, .start_2 = 1, .stop_2 = 0 }, // [73] "[2001::/32]" + { .start_1 = 1, .stop_1 = 9, .start_2 = 12, .stop_2 = 12 }, // [74] "[2001::/32]:5" + { .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" }; f_range_double_t where = f_range_double_t_initialize; - for (uint8_t i = 0; i < 42; ++i) { + for (uint8_t i = 0; i < 78; ++i) { state_data.status = F_okay; where.start_1 = 1;