]> Kevux Git Server - fll/commitdiff
Bugfix: Invalid IPv6 addressdetection and improve IPv4 address detection in f_network...
authorKevin Day <Kevin@kevux.org>
Wed, 28 Jan 2026 05:44:03 +0000 (23:44 -0600)
committerKevin Day <Kevin@kevux.org>
Wed, 28 Jan 2026 05:52:00 +0000 (23:52 -0600)
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.

level_0/f_network/c/network.c
level_0/f_network/c/network.h
level_0/f_network/data/documentation/man/man3/f_network_is_ip_address.3
level_0/f_network/tests/unit/c/test-network-is_ip_address.c

index 718ac28e49a7fa76b695d256f01c03f14438966f..034ed009ce426890fcb320a8db3a1d35efe06149 100644 (file)
@@ -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) {
index 8d08953753ba0cc5c14cee30a2e1369166e59db2..558c161649ccc24075eb52c934cca0aad119a33d 100644 (file)
@@ -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.
index 5a100e7dee54a3f26bc484d82925706db75167c5..0955a6f046ae42622ab31dd792a790c2de600fc2 100644 (file)
@@ -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.
index 41d5d0c991df73bde3007402b92e1763a18f9a38..b6f3a404e2eafdda9b473a74af76cf8f2ca75331 100644 (file)
@@ -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;