Browse Source

Omit ns=0 if ns is 0

Stefan Profanter 6 years ago
parent
commit
929425ac89
2 changed files with 44 additions and 20 deletions
  1. 36 16
      src/ua_util.c
  2. 8 4
      tests/check_utils.c

+ 36 - 16
src/ua_util.c

@@ -133,49 +133,69 @@ UA_NodeId_toString(const UA_NodeId *nodeId, UA_String *nodeIdStr) {
     if (nodeId == NULL)
         return UA_STATUSCODE_GOOD;
 
+    char *nsStr = NULL;
+    size_t nsLen = 0;
+    if (nodeId->namespaceIndex != 0) {
+        nsStr = (char*)UA_malloc(9+1); // strlen("ns=XXXXX;") = 9 + Nullbyte
+        UA_snprintf(nsStr, 10, "ns=%d;", nodeId->namespaceIndex);
+        nsLen = strlen(nsStr);
+    }
+
 
     UA_ByteString byteStr = UA_BYTESTRING_NULL;
     switch (nodeId->identifierType) {
-        /* for all the lengths below we add the constant for: */
-        /* strlen("ns=XXXXXX;i=")=11 */
         case UA_NODEIDTYPE_NUMERIC:
             /* ns (2 byte, 65535) = 5 chars, numeric (4 byte, 4294967295) = 10 chars, delim = 1 , nullbyte = 1-> 17 chars */
-            nodeIdStr->length = 11 + 10 + 1;
+            nodeIdStr->length = nsLen + 2 + 10 + 1;
             nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL)
+            if (nodeIdStr->data == NULL) {
+                UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "ns=%d;i=%lu",
-                        nodeId->namespaceIndex, (unsigned long )nodeId->identifier.numeric);
+            }
+            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%si=%lu",
+                        nsLen > 0 ? nsStr : "",
+                        (unsigned long )nodeId->identifier.numeric);
             break;
         case UA_NODEIDTYPE_STRING:
             /* ns (16bit) = 5 chars, strlen + nullbyte */
-            nodeIdStr->length = 11 + nodeId->identifier.string.length + 1;
+            nodeIdStr->length = nsLen + 2 + nodeId->identifier.string.length + 1;
             nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL)
+            if (nodeIdStr->data == NULL) {
+                UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "ns=%d;s=%.*s", nodeId->namespaceIndex,
+            }
+            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%ss=%.*s",
+                        nsLen > 0 ? nsStr : "",
                         (int)nodeId->identifier.string.length, nodeId->identifier.string.data);
             break;
         case UA_NODEIDTYPE_GUID:
             /* ns (16bit) = 5 chars + strlen(A123456C-0ABC-1A2B-815F-687212AAEE1B)=36 + nullbyte */
-            nodeIdStr->length = 11 + 36 + 1;
+            nodeIdStr->length = nsLen + 2 + 36 + 1;
             nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL)
+            if (nodeIdStr->data == NULL) {
+                UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "ns=%d;g=" UA_PRINTF_GUID_FORMAT,
-        nodeId->namespaceIndex, UA_PRINTF_GUID_DATA(nodeId->identifier.guid));
+            }
+            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sg=" UA_PRINTF_GUID_FORMAT,
+                        nsLen > 0 ? nsStr : "",
+                        UA_PRINTF_GUID_DATA(nodeId->identifier.guid));
             break;
         case UA_NODEIDTYPE_BYTESTRING:
             UA_ByteString_toBase64String(&nodeId->identifier.byteString, &byteStr);
             /* ns (16bit) = 5 chars + LEN + nullbyte */
-            nodeIdStr->length = 11 + byteStr.length + 1;
+            nodeIdStr->length = nsLen + 2 + byteStr.length + 1;
             nodeIdStr->data = (UA_Byte*)UA_malloc(nodeIdStr->length);
-            if (nodeIdStr->data == NULL)
+            if (nodeIdStr->data == NULL) {
+                UA_free(nsStr);
                 return UA_STATUSCODE_BADOUTOFMEMORY;
-            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "ns=%d;b=%.*s", nodeId->namespaceIndex, (int)byteStr.length, byteStr.data);
+            }
+            UA_snprintf((char*)nodeIdStr->data, nodeIdStr->length, "%sb=%.*s",
+                        nsLen > 0 ? nsStr : "",
+                        (int)byteStr.length, byteStr.data);
             UA_String_deleteMembers(&byteStr);
             break;
     }
+    UA_free(nsStr);
     return UA_STATUSCODE_GOOD;
 }
 

+ 8 - 4
tests/check_utils.c

@@ -173,7 +173,7 @@ START_TEST(idToStringNumeric) {
 
     n = UA_NODEID_NUMERIC(0,0);
     UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=0;i=0");
+    assertNodeIdString(&str, "i=0");
 
     n = UA_NODEID_NUMERIC(12345,1234567890);
     UA_NodeId_toString(&n, &str);
@@ -192,12 +192,16 @@ START_TEST(idToStringString) {
 
     n = UA_NODEID_STRING(0,"");
     UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=0;s=");
+    assertNodeIdString(&str, "s=");
 
     n = UA_NODEID_STRING(54321,"Some String");
     UA_NodeId_toString(&n, &str);
     assertNodeIdString(&str, "ns=54321;s=Some String");
 
+    n = UA_NODEID_STRING(0,"Some String");
+    UA_NodeId_toString(&n, &str);
+    assertNodeIdString(&str, "s=Some String");
+
     UA_String_deleteMembers(&str);
 } END_TEST
 
@@ -209,7 +213,7 @@ START_TEST(idToStringGuid) {
 
     n = UA_NODEID_GUID(0,UA_GUID_NULL);
     UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=0;g=00000000-0000-0000-0000-000000000000");
+    assertNodeIdString(&str, "g=00000000-0000-0000-0000-000000000000");
 
     g.data1 = 0xA123456C;
     g.data2 = 0x0ABC;
@@ -255,7 +259,7 @@ START_TEST(idToStringByte) {
     n.identifier.byteString.data = NULL;
     n.identifier.byteString.length = 0;
     UA_NodeId_toString(&n, &str);
-    assertNodeIdString(&str, "ns=0;b=");
+    assertNodeIdString(&str, "b=");
 
     UA_ByteString bs = UA_BYTESTRING_NULL;