Prechádzať zdrojové kódy

fixed UA_NodeId_copycstring

Leon Urbas 10 rokov pred
rodič
commit
24d80b7df0
1 zmenil súbory, kde vykonal 12 pridanie a 11 odobranie
  1. 12 11
      src/ua_xml.c

+ 12 - 11
src/ua_xml.c

@@ -79,32 +79,27 @@ UA_Int32 UA_NodeSet_new(UA_NodeSet** p, UA_UInt32 nsid) {
 	return UA_SUCCESS;
 }
 
-UA_Int32 UA_NodeId_copycstring(cstring src, UA_NodeId* dst, UA_NodeSetAliases* aliases) {
+UA_Int32 _UA_NodeId_copycstring(cstring src, UA_NodeId* dst, UA_NodeSetAliases* aliases) {
 	UA_Int32 retval = UA_SUCCESS;
 	if (src != UA_NULL && dst != UA_NULL ) {
 		if (src[0] == 'i' && src[1] == '=') { // namespace zero numeric identifier
-			dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
 			dst->identifier.numeric = atoi(&src[2]);
 		} else if (src[0] == 'n' && src[1] == 's' && src[2] == '=') { // namespace
 			dst->namespace = atoi(&src[3]);
 			src = strchr(&src[3],';');
 			if (src != UA_NULL)
-				retval = UA_NodeId_copycstring(src+1,dst,aliases);
+				retval = _UA_NodeId_copycstring(src+1,dst,aliases);  // +1 to start beyond ;
 			else
 				retval = UA_ERR_INVALID_VALUE;
 		} else if (aliases != UA_NULL ) { // try for aliases
 			UA_Int32 i;
 			for (i = 0; i < aliases->size && dst->identifier.numeric == 0; ++i) {
-				if (0
-						== strncmp((char const*) src, (char const*) aliases->aliases[i]->alias.data,
+				if (0 == strncmp((char const*) src, (char const*) aliases->aliases[i]->alias.data,
 								aliases->aliases[i]->alias.length)) {
-					dst->identifier.numeric = atoi((char const*) &(aliases->aliases[i]->value.data[2]));
-					dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
+					_UA_NodeId_copycstring((cstring)aliases->aliases[i]->alias.data,dst,UA_NULL); // substitute text of alias
 				}
 			}
 		} else {
-			dst->namespace = 0;
-			dst->identifier.numeric = 0;
 			retval = UA_ERR_NOT_IMPLEMENTED;
 		}
 	} else {
@@ -114,6 +109,12 @@ UA_Int32 UA_NodeId_copycstring(cstring src, UA_NodeId* dst, UA_NodeSetAliases* a
 	return retval;
 }
 
+UA_Int32 UA_NodeId_copycstring(cstring src, UA_NodeId* dst, UA_NodeSetAliases* aliases) {
+	dst->encodingByte = UA_NODEIDTYPE_FOURBYTE;
+	dst->namespace = 0;
+	dst->identifier.numeric = 0;
+	return _UA_NodeId_copycstring(src,dst,aliases);
+}
 
 UA_Int32 UA_ReferenceNode_println(cstring label, UA_ReferenceNode *a) {
 	printf("%s{referenceType=%d, target=%d, isInverse=%d}\n",
@@ -1142,7 +1143,7 @@ UA_Int32 Namespace_loadXml(Namespace **ns,UA_UInt32 nsid,const char* rootName, X
 	XML_SetElementHandler(parser, XML_Stack_startElement, XML_Stack_endElement);
 	XML_SetCharacterDataHandler(parser, XML_Stack_handleText);
 	while ((len = getNextBufferFull(buf, XML_BUFFER_LEN)) > 0) {
-		if (!XML_Parse(parser, buf, len, (len < XML_BUFFER_LEN))) {
+		if (XML_Parse(parser, buf, len, (len < XML_BUFFER_LEN)) == XML_STATUS_ERROR) {
 			retval = UA_ERR_INVALID_VALUE;
 			break;
 		}
@@ -1176,7 +1177,7 @@ static const char* theBufferEnd = UA_NULL;
 UA_Int32 readFromTheBuffer(char*buf,int len) {
 	if (len == 0) return 0;
 	if (theBuffer + XML_BUFFER_LEN > theBufferEnd)
-		len = theBufferEnd - theBuffer;
+		len = theBufferEnd - theBuffer + 1;
 	else
 		len = XML_BUFFER_LEN;
 	memcpy(buf,theBuffer,len);