]> Kevux Git Server - fll/commitdiff
Bugfix: Handle more cases of IPv6 addresses not being properly identified.
authorKevin Day <Kevin@kevux.org>
Fri, 30 Jan 2026 05:44:00 +0000 (23:44 -0600)
committerKevin Day <Kevin@kevux.org>
Fri, 30 Jan 2026 05:46:33 +0000 (23:46 -0600)
I learned that `::` and `::/24` addresses are valid.

Add a few more test cases.

level_0/f_network/c/network.c
level_0/f_network/tests/unit/c/test-network-is_ip_address.c

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