From 0927f23ee7cf319660507d0fefe1a79562ee7aba Mon Sep 17 00:00:00 2001 From: Stefan Wahren Date: Sun, 31 Jan 2016 17:55:09 +0000 Subject: [PATCH] Let mbus_str_xml_encode return a resultcode --- mbus/mbus-protocol.c | 82 ++++++++++++++++++++++++-------------------- mbus/mbus-protocol.h | 4 +-- 2 files changed, 46 insertions(+), 40 deletions(-) diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c index 3ee1461..6aa7529 100755 --- a/mbus/mbus-protocol.c +++ b/mbus/mbus-protocol.c @@ -3654,7 +3654,7 @@ mbus_data_error_print(int error) /// Encode string to XML /// //------------------------------------------------------------------------------ -void +int mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len) { size_t i, len; @@ -3663,49 +3663,55 @@ mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len len = 0; if (dst == NULL) - return; - - if (src != NULL) { - while((len+6) < max_len) + return -1; + } + + if (src == NULL) + { + dst[len] = '\0'; + return -2; + } + + while((len+6) < max_len) + { + if (src[i] == '\0') { - if (src[i] == '\0') - { - break; - } - - if (iscntrl(src[i])) - { - // convert all control chars into spaces - dst[len++] = ' '; - } - else - { - switch (src[i]) - { - case '&': - len += snprintf(&dst[len], max_len - len, "&"); - break; - case '<': - len += snprintf(&dst[len], max_len - len, "<"); - break; - case '>': - len += snprintf(&dst[len], max_len - len, ">"); - break; - case '"': - len += snprintf(&dst[len], max_len - len, """); - break; - default: - dst[len++] = src[i]; - break; - } - } - - i++; + break; } + + if (iscntrl(src[i])) + { + // convert all control chars into spaces + dst[len++] = ' '; + } + else + { + switch (src[i]) + { + case '&': + len += snprintf(&dst[len], max_len - len, "&"); + break; + case '<': + len += snprintf(&dst[len], max_len - len, "<"); + break; + case '>': + len += snprintf(&dst[len], max_len - len, ">"); + break; + case '"': + len += snprintf(&dst[len], max_len - len, """); + break; + default: + dst[len++] = src[i]; + break; + } + } + + i++; } dst[len] = '\0'; + return 0; } //------------------------------------------------------------------------------ diff --git a/mbus/mbus-protocol.h b/mbus/mbus-protocol.h index 0c4d7d1..60b7424 100755 --- a/mbus/mbus-protocol.h +++ b/mbus/mbus-protocol.h @@ -498,7 +498,7 @@ typedef struct _mbus_data_secondary_address { // unsigned int mbus_manufacturer_id(char *manufacturer); -// Since libmbus writes some special characters (ASCII > 0x7F) into the XML output (e.g. °C for centigrade == ASCII 0xB0) +// Since libmbus writes some special characters (ASCII > 0x7F) into the XML output (e.g. �C for centigrade == ASCII 0xB0) // it is useful to attach the appropriate code page for postprocessing. #define MBUS_XML_PROCESSING_INSTRUCTION "\n" @@ -569,7 +569,7 @@ mbus_slave_data *mbus_slave_data_get(size_t i); // // XML generating functions // -void mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len); +int mbus_str_xml_encode(unsigned char *dst, const unsigned char *src, size_t max_len); char *mbus_data_xml(mbus_frame_data *data); char *mbus_data_variable_xml(mbus_data_variable *data); char *mbus_data_fixed_xml(mbus_data_fixed *data);