ir_linkdata_dlink_name
[henge/apc.git] / src / ir.c
index 12a7188..bdf0d36 100644 (file)
--- a/src/ir.c
+++ b/src/ir.c
@@ -747,6 +747,9 @@ ir_linkdata_dlink_name
   uint8_t*              bytep;\r
   size_t                bytes;\r
   char                  setpass;\r
+  uint8_t               delimiter;\r
+  static const uint8_t  dlink_prefix[] = { '/', '.', '.', '/' };\r
+# define                dlink_prefix_len 4\r
   assert_link(link);\r
   if (link->link.dlink != NULL)\r
     return link->link.dlink;\r
@@ -764,8 +767,8 @@ ir_linkdata_dlink_name
  count_bytes_in_namelist:\r
   while (namelist_iter != NULL)\r
     { bytep = namelist_iter->name;\r
-      while (*bytep++)\r
-       bytes++;\r
+      while (*bytep++);\r
+      bytes += (bytep - namelist_iter->name);\r
       namelist_iter = namelist_iter->nextsib;\r
     }\r
   if (setpass == 0)\r
@@ -773,22 +776,26 @@ ir_linkdata_dlink_name
       namelist_iter = setld->namelist;\r
       goto count_bytes_in_namelist;\r
     }\r
-  bytes += 2; //trailing '\0' and preceding '.'\r
+  bytes += dlink_prefix_len;\r
   link->link.dlink = stack_alloc(&namepages, bytes);\r
-  bytes = 0;\r
-  link->link.dlink[bytes++] = '.'; //dlinks start with '.'\r
+  for (bytes = 0; bytes < dlink_prefix_len; bytes++)\r
+    link->link.dlink[bytes] = dlink_prefix[bytes];\r
   namelist_iter = classld->namelist;\r
   setpass = 0;\r
+  delimiter = APC_CLASS_DELIMITER;\r
  copy_bytes_in_namelist:\r
   while (namelist_iter != NULL)\r
     { bytep = namelist_iter->name;\r
       while (*bytep)\r
        link->link.dlink[bytes++] = *bytep++;\r
+      link->link.dlink[bytes++] = delimiter;\r
       namelist_iter = namelist_iter->nextsib;\r
     }\r
   if (setpass == 0)\r
     { setpass = 1;\r
       namelist_iter = setld->namelist;\r
+      delimiter = APC_SET_DELIMITER;\r
+      link->link.dlink[bytes - 1] = delimiter; //overwrite last delimiter\r
       goto copy_bytes_in_namelist;\r
     }\r
   link->link.dlink[bytes] = '\0'; //tailing '\0' null termination\r