diff --git a/bin/mbus-serial-request-data-multi-reply.c b/bin/mbus-serial-request-data-multi-reply.c
index 35eb473..9dd1648 100644
--- a/bin/mbus-serial-request-data-multi-reply.c
+++ b/bin/mbus-serial-request-data-multi-reply.c
@@ -169,7 +169,9 @@ main(int argc, char **argv)
fprintf(stderr, "Failed to generate XML representation of MBUS frames: %s\n", mbus_error_str());
return 1;
}
+
printf("%s", xml_result);
+ free(xml_result);
mbus_disconnect(handle);
return 0;
diff --git a/bin/mbus-serial-request-data.c b/bin/mbus-serial-request-data.c
index 5816c3c..d60a777 100644
--- a/bin/mbus-serial-request-data.c
+++ b/bin/mbus-serial-request-data.c
@@ -29,7 +29,7 @@ main(int argc, char **argv)
mbus_frame_data reply_data;
mbus_handle *handle = NULL;
- char *device, *addr_str;
+ char *device, *addr_str, *xml_result;
int address, baudrate = 9600;
if (argc == 3)
@@ -145,8 +145,15 @@ main(int argc, char **argv)
fprintf(stderr, "M-bus data parse error.\n");
return 1;
}
-
- printf("%s", mbus_frame_data_xml(&reply_data));
+
+ if ((xml_result = mbus_frame_data_xml(&reply_data)) == NULL)
+ {
+ fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str());
+ return 1;
+ }
+
+ printf("%s", xml_result);
+ free(xml_result);
// manual free
if (reply_data.data_var.record)
diff --git a/mbus/mbus-protocol-aux.c b/mbus/mbus-protocol-aux.c
index aa0cf39..2323bec 100644
--- a/mbus/mbus-protocol-aux.c
+++ b/mbus/mbus-protocol-aux.c
@@ -1214,44 +1214,58 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data)
{
mbus_data_record *record;
mbus_record *norm_record;
- static char buff[8192];
+ char *buff = NULL;
char str_encoded[768];
- size_t len = 0;
+ size_t len = 0, buff_size = 8192;
size_t i;
if (data)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "\n\n");
+ buff = (char*) malloc(buff_size);
- len += snprintf(&buff[len], sizeof(buff) - len, "%s", mbus_data_variable_header_xml(&(data->header)));
+ if (buff == NULL)
+ return NULL;
+
+ len += snprintf(&buff[len], buff_size - len, "\n\n");
+
+ len += snprintf(&buff[len], buff_size - len, "%s", mbus_data_variable_header_xml(&(data->header)));
for (record = data->record, i = 0; record; record = record->next, i++)
{
norm_record = mbus_parse_variable_record(record);
- len += snprintf(&buff[len], sizeof(buff) - len, " \n", i);
+ if ((buff_size - len) < 1024)
+ {
+ buff_size *= 2;
+ buff = (char*) realloc(buff,buff_size);
+
+ if (buff == NULL)
+ return NULL;
+ }
+
+ len += snprintf(&buff[len], buff_size - len, " \n", i);
if (norm_record != NULL)
{
mbus_str_xml_encode(str_encoded, norm_record->function_medium, sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
mbus_str_xml_encode(str_encoded, norm_record->unit, sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
mbus_str_xml_encode(str_encoded, norm_record->quantity, sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
if (norm_record->is_numeric)
{
- len += snprintf(&buff[len], sizeof(buff) - len, " %f\n", norm_record->value.real_val);
+ len += snprintf(&buff[len], buff_size - len, " %f\n", norm_record->value.real_val);
}
else
{
mbus_str_xml_encode(str_encoded, norm_record->value.str_val.value, sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
}
mbus_record_free(norm_record);
@@ -1260,15 +1274,15 @@ mbus_data_variable_xml_normalized(mbus_data_variable *data)
{
}
- len += snprintf(&buff[len], sizeof(buff) - len, " \n\n");
+ len += snprintf(&buff[len], buff_size - len, " \n\n");
}
- len += snprintf(&buff[len], sizeof(buff) - len, "\n");
+ len += snprintf(&buff[len], buff_size - len, "\n");
return buff;
}
- return "";
+ return NULL;
}
//------------------------------------------------------------------------------
@@ -1290,7 +1304,7 @@ mbus_frame_data_xml_normalized(mbus_frame_data *data)
}
}
- return "";
+ return NULL;
}
mbus_handle *
diff --git a/mbus/mbus-protocol.c b/mbus/mbus-protocol.c
index bd7d38f..af5118b 100644
--- a/mbus/mbus-protocol.c
+++ b/mbus/mbus-protocol.c
@@ -3358,29 +3358,42 @@ char *
mbus_data_variable_xml(mbus_data_variable *data)
{
mbus_data_record *record;
- static char buff[8192];
- char str_encoded[768];
- size_t len = 0;
+ char *buff = NULL;
+ size_t len = 0, buff_size = 8192;
int i;
if (data)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "\n\n");
+ buff = (char*) malloc(buff_size);
- len += snprintf(&buff[len], sizeof(buff) - len, "%s",
+ if (buff == NULL)
+ return NULL;
+
+ len += snprintf(&buff[len], buff_size - len, "\n\n");
+
+ len += snprintf(&buff[len], buff_size - len, "%s",
mbus_data_variable_header_xml(&(data->header)));
for (record = data->record, i = 0; record; record = record->next, i++)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "%s",
+ if ((buff_size - len) < 1024)
+ {
+ buff_size *= 2;
+ buff = (char*) realloc(buff,buff_size);
+
+ if (buff == NULL)
+ return NULL;
+ }
+
+ len += snprintf(&buff[len], buff_size - len, "%s",
mbus_data_variable_record_xml(record, i, -1, &(data->header)));
}
- len += snprintf(&buff[len], sizeof(buff) - len, "\n");
+ len += snprintf(&buff[len], buff_size - len, "\n");
return buff;
}
- return "";
+ return NULL;
}
//------------------------------------------------------------------------------
@@ -3389,64 +3402,69 @@ mbus_data_variable_xml(mbus_data_variable *data)
char *
mbus_data_fixed_xml(mbus_data_fixed *data)
{
- static char buff[8192];
+ char *buff = NULL;
char str_encoded[256];
- size_t len = 0;
+ size_t len = 0, buff_size = 8192;
if (data)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "\n\n");
+ buff = (char*) malloc(buff_size);
+
+ if (buff == NULL)
+ return NULL;
- len += snprintf(&buff[len], sizeof(buff) - len, " \n");
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", (int)mbus_data_bcd_decode(data->id_bcd, 4));
+ len += snprintf(&buff[len], buff_size - len, "\n\n");
+
+ len += snprintf(&buff[len], buff_size - len, " \n");
+ len += snprintf(&buff[len], buff_size - len, " %d\n", (int)mbus_data_bcd_decode(data->id_bcd, 4));
mbus_str_xml_encode(str_encoded, mbus_data_fixed_medium(data), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", data->tx_cnt);
- len += snprintf(&buff[len], sizeof(buff) - len, " %.2X\n", data->status);
- len += snprintf(&buff[len], sizeof(buff) - len, " \n\n");
+ len += snprintf(&buff[len], buff_size - len, " %d\n", data->tx_cnt);
+ len += snprintf(&buff[len], buff_size - len, " %.2X\n", data->status);
+ len += snprintf(&buff[len], buff_size - len, " \n\n");
- len += snprintf(&buff[len], sizeof(buff) - len, " \n");
+ len += snprintf(&buff[len], buff_size - len, " \n");
mbus_str_xml_encode(str_encoded, mbus_data_fixed_function(data->status), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
mbus_str_xml_encode(str_encoded, mbus_data_fixed_unit(data->cnt1_type), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
if ((data->status & MBUS_DATA_FIXED_STATUS_FORMAT_MASK) == MBUS_DATA_FIXED_STATUS_FORMAT_BCD)
{
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", (int)mbus_data_bcd_decode(data->cnt1_val, 4));
+ len += snprintf(&buff[len], buff_size - len, " %d\n", (int)mbus_data_bcd_decode(data->cnt1_val, 4));
}
else
{
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", mbus_data_int_decode(data->cnt1_val, 4));
+ len += snprintf(&buff[len], buff_size - len, " %d\n", mbus_data_int_decode(data->cnt1_val, 4));
}
- len += snprintf(&buff[len], sizeof(buff) - len, " \n\n");
+ len += snprintf(&buff[len], buff_size - len, " \n\n");
- len += snprintf(&buff[len], sizeof(buff) - len, " \n");
+ len += snprintf(&buff[len], buff_size - len, " \n");
mbus_str_xml_encode(str_encoded, mbus_data_fixed_function(data->status), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
mbus_str_xml_encode(str_encoded, mbus_data_fixed_unit(data->cnt2_type), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
if ((data->status & MBUS_DATA_FIXED_STATUS_FORMAT_MASK) == MBUS_DATA_FIXED_STATUS_FORMAT_BCD)
{
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", (int)mbus_data_bcd_decode(data->cnt2_val, 4));
+ len += snprintf(&buff[len], buff_size - len, " %d\n", (int)mbus_data_bcd_decode(data->cnt2_val, 4));
}
else
{
- len += snprintf(&buff[len], sizeof(buff) - len, " %d\n", mbus_data_int_decode(data->cnt2_val, 4));
+ len += snprintf(&buff[len], buff_size - len, " %d\n", mbus_data_int_decode(data->cnt2_val, 4));
}
- len += snprintf(&buff[len], sizeof(buff) - len, " \n\n");
+ len += snprintf(&buff[len], buff_size - len, " \n\n");
- len += snprintf(&buff[len], sizeof(buff) - len, "\n");
+ len += snprintf(&buff[len], buff_size - len, "\n");
return buff;
}
- return "";
+ return NULL;
}
//------------------------------------------------------------------------------
@@ -3455,20 +3473,25 @@ mbus_data_fixed_xml(mbus_data_fixed *data)
char *
mbus_data_error_xml(int error)
{
- static char buff[512];
+ char *buff = NULL;
char str_encoded[256];
- size_t len = 0;
-
- len += snprintf(&buff[len], sizeof(buff) - len, "\n\n");
+ size_t len = 0, buff_size = 8192;
- len += snprintf(&buff[len], sizeof(buff) - len, " \n");
+ buff = (char*) malloc(buff_size);
+
+ if (buff == NULL)
+ return NULL;
+
+ len += snprintf(&buff[len], buff_size - len, "\n\n");
+
+ len += snprintf(&buff[len], buff_size - len, " \n");
mbus_str_xml_encode(str_encoded, mbus_data_error_lookup(error), sizeof(str_encoded));
- len += snprintf(&buff[len], sizeof(buff) - len, " %s\n", str_encoded);
+ len += snprintf(&buff[len], buff_size - len, " %s\n", str_encoded);
- len += snprintf(&buff[len], sizeof(buff) - len, " \n\n");
+ len += snprintf(&buff[len], buff_size - len, " \n\n");
- len += snprintf(&buff[len], sizeof(buff) - len, "\n");
+ len += snprintf(&buff[len], buff_size - len, "\n");
return buff;
}
@@ -3497,7 +3520,7 @@ mbus_frame_data_xml(mbus_frame_data *data)
}
}
- return "";
+ return NULL;
}
@@ -3511,9 +3534,9 @@ mbus_frame_xml(mbus_frame *frame)
mbus_frame *iter;
mbus_data_record *record;
- static char buff[8192];
+ char *buff = NULL;
- size_t len = 0;
+ size_t len = 0, buff_size = 8192;
int record_cnt = 0, frame_cnt;
if (frame)
@@ -3544,25 +3567,39 @@ mbus_frame_xml(mbus_frame *frame)
{
//
// generate XML for a sequence of variable data frames
- //
+ //
+
+ buff = (char*) malloc(buff_size);
+
+ if (buff == NULL)
+ return NULL;
// include frame counter in XML output if more than one frame
// is available (frame_cnt = -1 => not included in output)
frame_cnt = (frame->next == NULL) ? -1 : 0;
- len += snprintf(&buff[len], sizeof(buff) - len, "\n\n");
+ len += snprintf(&buff[len], buff_size - len, "\n\n");
// only print the header info for the first frame (should be
// the same for each frame in a sequence of a multi-telegram
// transfer.
- len += snprintf(&buff[len], sizeof(buff) - len, "%s",
+ len += snprintf(&buff[len], buff_size - len, "%s",
mbus_data_variable_header_xml(&(frame_data.data_var.header)));
// loop through all records in the current frame, using a global
// record count as record ID in the XML output
for (record = frame_data.data_var.record; record; record = record->next, record_cnt++)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "%s",
+ if ((buff_size - len) < 1024)
+ {
+ buff_size *= 2;
+ buff = (char*) realloc(buff,buff_size);
+
+ if (buff == NULL)
+ return NULL;
+ }
+
+ len += snprintf(&buff[len], buff_size - len, "%s",
mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header)));
}
@@ -3586,7 +3623,16 @@ mbus_frame_xml(mbus_frame *frame)
// record count as record ID in the XML output
for (record = frame_data.data_var.record; record; record = record->next, record_cnt++)
{
- len += snprintf(&buff[len], sizeof(buff) - len, "%s",
+ if ((buff_size - len) < 1024)
+ {
+ buff_size *= 2;
+ buff = (char*) realloc(buff,buff_size);
+
+ if (buff == NULL)
+ return NULL;
+ }
+
+ len += snprintf(&buff[len], buff_size - len, "%s",
mbus_data_variable_record_xml(record, record_cnt, frame_cnt, &(frame_data.data_var.header)));
}
@@ -3595,15 +3641,15 @@ mbus_frame_xml(mbus_frame *frame)
{
mbus_data_record_free(frame_data.data_var.record);
}
- }
+ }
- len += snprintf(&buff[len], sizeof(buff) - len, "\n");
+ len += snprintf(&buff[len], buff_size - len, "\n");
return buff;
}
}
- return "";
+ return NULL;
}
diff --git a/test/mbus_parse.c b/test/mbus_parse.c
index 69499b2..f55eb5e 100644
--- a/test/mbus_parse.c
+++ b/test/mbus_parse.c
@@ -28,6 +28,7 @@ main(int argc, char *argv[])
u_char buf[1024];
mbus_frame reply;
mbus_frame_data frame_data;
+ char *xml_result = NULL;
if (argc != 2)
{
@@ -51,7 +52,15 @@ main(int argc, char *argv[])
mbus_parse(&reply, buf, len);
mbus_frame_data_parse(&reply, &frame_data);
mbus_frame_print(&reply);
- printf("%s", mbus_frame_data_xml(&frame_data));
+
+ if ((xml_result = mbus_frame_data_xml(&frame_data)) == NULL)
+ {
+ fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str());
+ return 1;
+ }
+ printf("%s", xml_result);
+ free(xml_result);
+
return 0;
}
diff --git a/test/mbus_parse_hex.c b/test/mbus_parse_hex.c
index 41b9278..75f819d 100644
--- a/test/mbus_parse_hex.c
+++ b/test/mbus_parse_hex.c
@@ -28,6 +28,7 @@ main(int argc, char *argv[])
u_char raw_buff[4096], buff[4096], *ptr, *endptr;
mbus_frame reply;
mbus_frame_data frame_data;
+ char *xml_result = NULL;
if (argc != 2)
{
@@ -89,7 +90,16 @@ main(int argc, char *argv[])
//mbus_frame_print(&reply);
//mbus_frame_data_print(&frame_data);
- printf("%s", mbus_frame_data_xml(&frame_data));
+
+ if ((xml_result = mbus_frame_data_xml(&frame_data)) == NULL)
+ {
+ fprintf(stderr, "Failed to generate XML representation of MBUS frame: %s\n", mbus_error_str());
+ return 1;
+ }
+ printf("%s", xml_result);
+ free(xml_result);
+
+
return 0;
}