Переглянути джерело

Refactoring using MemRef.

Ambroz Bizjak 11 роки тому
батько
коміт
e06adb7720

+ 16 - 33
misc/ipaddr.h

@@ -42,18 +42,16 @@
 #include <misc/parse_number.h>
 #include <misc/find_char.h>
 #include <misc/print_macros.h>
+#include <misc/memref.h>
 
 struct ipv4_ifaddr {
     uint32_t addr;
     int prefix;
 };
 
-static int ipaddr_parse_ipv4_addr_bin (const char *name, size_t name_len, uint32_t *out_addr);
-static int ipaddr_parse_ipv4_addr (const char *name, uint32_t *out_addr);
-static int ipaddr_parse_ipv4_prefix_bin (const char *str, size_t str_len, int *num);
-static int ipaddr_parse_ipv4_prefix (const char *str, int *num);
-static int ipaddr_parse_ipv4_ifaddr_bin (const char *str, size_t str_len, struct ipv4_ifaddr *out);
-static int ipaddr_parse_ipv4_ifaddr (const char *str, struct ipv4_ifaddr *out);
+static int ipaddr_parse_ipv4_addr (MemRef name, uint32_t *out_addr);
+static int ipaddr_parse_ipv4_prefix (MemRef str, int *num);
+static int ipaddr_parse_ipv4_ifaddr (MemRef str, struct ipv4_ifaddr *out);
 static int ipaddr_ipv4_ifaddr_from_addr_mask (uint32_t addr, uint32_t mask, struct ipv4_ifaddr *out);
 static uint32_t ipaddr_ipv4_mask_from_prefix (int prefix);
 static int ipaddr_ipv4_prefix_from_mask (uint32_t mask, int *out_prefix);
@@ -64,13 +62,13 @@ static int ipaddr_ipv4_addrs_in_network (uint32_t addr1, uint32_t addr2, int net
 static void ipaddr_print_addr (uint32_t addr, char *out);
 static void ipaddr_print_ifaddr (struct ipv4_ifaddr ifaddr, char *out);
 
-int ipaddr_parse_ipv4_addr_bin (const char *name, size_t name_len, uint32_t *out_addr)
+int ipaddr_parse_ipv4_addr (MemRef name, uint32_t *out_addr)
 {
     for (size_t i = 0; ; i++) {
         size_t j;
-        for (j = 0; j < name_len && name[j] != '.'; j++);
+        for (j = 0; j < name.len && name.ptr[j] != '.'; j++);
         
-        if ((j == name_len && i < 3) || (j < name_len && i == 3)) {
+        if ((j == name.len && i < 3) || (j < name.len && i == 3)) {
             return 0;
         }
         
@@ -79,7 +77,7 @@ int ipaddr_parse_ipv4_addr_bin (const char *name, size_t name_len, uint32_t *out
         }
         
         uintmax_t d;
-        if (!parse_unsigned_integer_bin(name, j, &d)) {
+        if (!parse_unsigned_integer_bin(name.ptr, j, &d)) {
             return 0;
         }
         
@@ -93,20 +91,15 @@ int ipaddr_parse_ipv4_addr_bin (const char *name, size_t name_len, uint32_t *out
             return 1;
         }
         
-        name += j + 1;
-        name_len -= j + 1;
+        name.ptr += j + 1;
+        name.len -= j + 1;
     }
 }
 
-int ipaddr_parse_ipv4_addr (const char *name, uint32_t *out_addr)
-{
-    return ipaddr_parse_ipv4_addr_bin(name, strlen(name), out_addr);
-}
-
-int ipaddr_parse_ipv4_prefix_bin (const char *str, size_t str_len, int *num)
+int ipaddr_parse_ipv4_prefix (MemRef str, int *num)
 {
     uintmax_t d;
-    if (!parse_unsigned_integer_bin(str, str_len, &d)) {
+    if (!parse_unsigned_integer_bin(str.ptr, str.len, &d)) {
         return 0;
     }
     if (d > 32) {
@@ -117,25 +110,15 @@ int ipaddr_parse_ipv4_prefix_bin (const char *str, size_t str_len, int *num)
     return 1;
 }
 
-int ipaddr_parse_ipv4_prefix (const char *str, int *num)
-{
-    return ipaddr_parse_ipv4_prefix_bin(str, strlen(str), num);
-}
-
-int ipaddr_parse_ipv4_ifaddr_bin (const char *str, size_t str_len, struct ipv4_ifaddr *out)
+int ipaddr_parse_ipv4_ifaddr (MemRef str, struct ipv4_ifaddr *out)
 {
     size_t slash_pos;
-    if (!b_find_char_bin(str, str_len, '/', &slash_pos)) {
+    if (!MemRef_FindChar(str, '/', &slash_pos)) {
         return 0;
     }
     
-    return (ipaddr_parse_ipv4_addr_bin(str, slash_pos, &out->addr) &&
-            ipaddr_parse_ipv4_prefix_bin(str + slash_pos + 1, str_len - slash_pos - 1, &out->prefix));
-}
-
-int ipaddr_parse_ipv4_ifaddr (const char *str, struct ipv4_ifaddr *out)
-{
-    return ipaddr_parse_ipv4_ifaddr_bin(str, strlen(str), out);
+    return (ipaddr_parse_ipv4_addr(MemRef_SubTo(str, slash_pos), &out->addr) &&
+            ipaddr_parse_ipv4_prefix(MemRef_SubFrom(str, slash_pos + 1), &out->prefix));
 }
 
 int ipaddr_ipv4_ifaddr_from_addr_mask (uint32_t addr, uint32_t mask, struct ipv4_ifaddr *out)

+ 16 - 0
misc/memref.h

@@ -53,6 +53,7 @@ static MemRef MemRef_Sub (MemRef o, size_t offset, size_t length);
 static char * MemRef_StrDup (MemRef o);
 static void MemRef_CopyOut (MemRef o, char *out);
 static int MemRef_Equal (MemRef o, MemRef other);
+static int MemRef_FindChar (MemRef o, char ch, size_t *out_index);
 
 #define MEMREF_LOOP_CHARS__BODY(char_rel_pos_var, char_var, body) \
 { \
@@ -156,4 +157,19 @@ static int MemRef_Equal (MemRef o, MemRef other)
     return (o.len == other.len) && !memcmp(o.ptr, other.ptr, o.len);
 }
 
+static int MemRef_FindChar (MemRef o, char ch, size_t *out_index)
+{
+    ASSERT(o.ptr)
+    
+    for (size_t i = 0; i < o.len; i++) {
+        if (o.ptr[i] == ch) {
+            if (out_index) {
+                *out_index = i;
+            }
+            return 1;
+        }
+    }
+    return 0;
+}
+
 #endif

+ 1 - 3
ncd/NCDVal.c

@@ -1093,9 +1093,7 @@ int NCDVal_StringHasNulls (NCDValRef string)
         
         case STOREDSTRING_TYPE:
         case EXTERNALSTRING_TYPE: {
-            const char *data = NCDVal_StringData(string);
-            size_t length = NCDVal_StringLength(string);
-            return !!memchr(data, '\0', length);
+            return MemRef_FindChar(NCDVal_StringMemRef(string), '\0', NULL);
         } break;
         
         default:

+ 1 - 1
ncd/extra/address_utils.h

@@ -84,7 +84,7 @@ static int ncd_read_baddr (NCDValRef val, BAddr *out)
         
         addr.type = BADDR_TYPE_IPV4;
         
-        if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(ipaddr_val), NCDVal_StringLength(ipaddr_val), &addr.ipv4.ip)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(ipaddr_val), &addr.ipv4.ip)) {
             goto fail;
         }
         

+ 1 - 1
ncd/modules/net_dns.c

@@ -264,7 +264,7 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
         }
         
         uint32_t addr;
-        if (!ipaddr_parse_ipv4_addr_bin((char *)NCDVal_StringData(server_arg), NCDVal_StringLength(server_arg), &addr)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(server_arg), &addr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong addr");
             goto fail1;
         }

+ 3 - 3
ncd/modules/net_ipv4_addr.c

@@ -84,17 +84,17 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     }
     
     if (NCDVal_IsInvalid(prefix_arg)) {
-        if (!ipaddr_parse_ipv4_ifaddr_bin(NCDVal_StringData(addr_arg), NCDVal_StringLength(addr_arg), &o->ifaddr)) {
+        if (!ipaddr_parse_ipv4_ifaddr(NCDVal_StringMemRef(addr_arg), &o->ifaddr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation address");
             goto fail1;
         }
     } else {
-        if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(addr_arg), NCDVal_StringLength(addr_arg), &o->ifaddr.addr)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(addr_arg), &o->ifaddr.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong address");
             goto fail1;
         }
         
-        if (!ipaddr_parse_ipv4_prefix_bin(NCDVal_StringData(prefix_arg), NCDVal_StringLength(prefix_arg), &o->ifaddr.prefix)) {
+        if (!ipaddr_parse_ipv4_prefix(NCDVal_StringMemRef(prefix_arg), &o->ifaddr.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong prefix");
             goto fail1;
         }

+ 4 - 4
ncd/modules/net_ipv4_addr_in_network.c

@@ -82,7 +82,7 @@ static void func_new_common (void *vo, NCDModuleInst *i, const struct NCDModuleI
     
     // parse addr
     uint32_t addr;
-    if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(arg_addr), NCDVal_StringLength(arg_addr), &addr)) {
+    if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(arg_addr), &addr)) {
         ModuleLog(o->i, BLOG_ERROR, "bad address");
         goto fail0;
     }
@@ -90,16 +90,16 @@ static void func_new_common (void *vo, NCDModuleInst *i, const struct NCDModuleI
     // parse network
     struct ipv4_ifaddr network;
     if (NCDVal_IsInvalid(arg_net_prefix)) {
-        if (!ipaddr_parse_ipv4_ifaddr_bin(NCDVal_StringData(arg_net_addr), NCDVal_StringLength(arg_net_addr), &network)) {
+        if (!ipaddr_parse_ipv4_ifaddr(NCDVal_StringMemRef(arg_net_addr), &network)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network in CIDR notation");
             goto fail0;
         }
     } else {
-        if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(arg_net_addr), NCDVal_StringLength(arg_net_addr), &network.addr)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(arg_net_addr), &network.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network address");
             goto fail0;
         }
-        if (!ipaddr_parse_ipv4_prefix_bin(NCDVal_StringData(arg_net_prefix), NCDVal_StringLength(arg_net_prefix), &network.prefix)) {
+        if (!ipaddr_parse_ipv4_prefix(NCDVal_StringMemRef(arg_net_prefix), &network.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network prefix");
             goto fail0;
         }

+ 1 - 1
ncd/modules/net_ipv4_arp_probe.c

@@ -133,7 +133,7 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     
     // parse address
     uint32_t addr;
-    if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(arg_addr), NCDVal_StringLength(arg_addr), &addr)) {
+    if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(arg_addr), &addr)) {
         ModuleLog(o->i, BLOG_ERROR, "wrong address");
         goto fail0;
     }

+ 4 - 4
ncd/modules/net_ipv4_route.c

@@ -93,16 +93,16 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     
     // read dest
     if (NCDVal_IsInvalid(dest_prefix_arg)) {
-        if (!ipaddr_parse_ipv4_ifaddr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest)) {
+        if (!ipaddr_parse_ipv4_ifaddr(NCDVal_StringMemRef(dest_arg), &o->dest)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation dest");
             goto fail0;
         }
     } else {
-        if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest.addr)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(dest_arg), &o->dest.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong dest addr");
             goto fail0;
         }
-        if (!ipaddr_parse_ipv4_prefix_bin(NCDVal_StringData(dest_prefix_arg), NCDVal_StringLength(dest_prefix_arg), &o->dest.prefix)) {
+        if (!ipaddr_parse_ipv4_prefix(NCDVal_StringMemRef(dest_prefix_arg), &o->dest.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong dest prefix");
             goto fail0;
         }
@@ -115,7 +115,7 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     else if (NCDVal_StringEquals(gateway_arg, "blackhole")) {
         o->type = TYPE_BLACKHOLE;
     } else {
-        if (!ipaddr_parse_ipv4_addr_bin(NCDVal_StringData(gateway_arg), NCDVal_StringLength(gateway_arg), &o->gateway)) {
+        if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(gateway_arg), &o->gateway)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong gateway");
             goto fail0;
         }

+ 4 - 4
ncd/modules/netmask.c

@@ -98,7 +98,7 @@ static void prefix_to_mask_func_init (void *vo, NCDModuleInst *i, const struct N
     
     // parse prefix
     int prefix;
-    if (!ipaddr_parse_ipv4_prefix_bin((char *)NCDVal_StringData(prefix_arg), NCDVal_StringLength(prefix_arg), &prefix)) {
+    if (!ipaddr_parse_ipv4_prefix(NCDVal_StringMemRef(prefix_arg), &prefix)) {
         ModuleLog(i, BLOG_ERROR, "bad prefix");
         goto fail0;
     }
@@ -129,14 +129,14 @@ static void ipv4_net_from_addr_and_prefix_func_init (void *vo, NCDModuleInst *i,
     
     // parse addr
     uint32_t addr;
-    if (!ipaddr_parse_ipv4_addr_bin((char *)NCDVal_StringData(addr_arg), NCDVal_StringLength(addr_arg), &addr)) {
+    if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(addr_arg), &addr)) {
         ModuleLog(i, BLOG_ERROR, "bad addr");
         goto fail0;
     }
     
     // parse prefix
     int prefix;
-    if (!ipaddr_parse_ipv4_prefix_bin((char *)NCDVal_StringData(prefix_arg), NCDVal_StringLength(prefix_arg), &prefix)) {
+    if (!ipaddr_parse_ipv4_prefix(NCDVal_StringMemRef(prefix_arg), &prefix)) {
         ModuleLog(i, BLOG_ERROR, "bad prefix");
         goto fail0;
     }
@@ -191,7 +191,7 @@ static void mask_to_prefix_func_init (void *vo, NCDModuleInst *i, const struct N
     
     // parse mask
     uint32_t mask;
-    if (!ipaddr_parse_ipv4_addr_bin((char *)NCDVal_StringData(mask_arg), NCDVal_StringLength(mask_arg), &mask)) {
+    if (!ipaddr_parse_ipv4_addr(NCDVal_StringMemRef(mask_arg), &mask)) {
         ModuleLog(i, BLOG_ERROR, "bad mask");
         goto fail0;
     }

+ 2 - 2
ncd/modules/parse.c

@@ -118,7 +118,7 @@ static int parse_value (NCDModuleInst *i, const char *str, size_t str_len, NCDVa
 static int parse_ipv4_addr (NCDModuleInst *i, const char *str, size_t str_len, NCDValMem *mem, NCDValRef *out)
 {
     uint32_t addr;
-    if (!ipaddr_parse_ipv4_addr_bin(str, str_len, &addr)) {
+    if (!ipaddr_parse_ipv4_addr(MemRef_Make(str, str_len), &addr)) {
         ModuleLog(i, BLOG_ERROR, "failed to parse ipv4 addresss");
         return 0;
     }
@@ -245,7 +245,7 @@ static void ipv4_cidr_addr_func_new (void *vo, NCDModuleInst *i, const struct NC
         goto fail0;
     }
     
-    o->succeeded = ipaddr_parse_ipv4_ifaddr_bin(NCDVal_StringData(str_arg), NCDVal_StringLength(str_arg), &o->ifaddr);
+    o->succeeded = ipaddr_parse_ipv4_ifaddr(NCDVal_StringMemRef(str_arg), &o->ifaddr);
     
     NCDModuleInst_Backend_Up(i);
     return;

+ 1 - 1
tuntap/tapwin32-funcs.c

@@ -104,7 +104,7 @@ int tapwin32_parse_tun_spec (char *name, char **out_component_id, char **out_hum
     }
     
     for (int i = 0; i < 3; i++) {
-        if (!ipaddr_parse_ipv4_addr(addr_strs[i], &out_addrs[i])) {
+        if (!ipaddr_parse_ipv4_addr(MemRef_MakeCstr(addr_strs[i]), &out_addrs[i])) {
             goto fail1;
         }
     }