Use own malloc/free, added freeing of some local buffers at exit

This commit is contained in:
2009-06-10 14:37:16 +00:00
parent 344c6a6667
commit 11888c6aa7
+182 -193
View File
@@ -108,6 +108,46 @@ static int mxml_find_nodes1(PMXML_NODE tree, const char *xml_path, PMXML_NODE **
/*------------------------------------------------------------------*/
static char *_encode_buffer = NULL;
static char *_data_enc = NULL;
/*------------------------------------------------------------------*/
void *mxml_malloc(size_t size)
{
return malloc(size);
}
/*------------------------------------------------------------------*/
void *mxml_realloc(void *p, size_t size)
{
return realloc(p, size);
}
/*------------------------------------------------------------------*/
void mxml_free(void *p)
{
free(p);
}
/*------------------------------------------------------------------*/
void mxml_deallocate(void)
{
if (_encode_buffer != NULL) {
mxml_free(_encode_buffer);
_encode_buffer = NULL;
}
if (_data_enc != NULL) {
mxml_free(_data_enc);
_data_enc = NULL;
}
}
/*------------------------------------------------------------------*/
int mxml_write_line(MXML_WRITER *writer, const char *line)
{
int len;
@@ -117,7 +157,7 @@ int mxml_write_line(MXML_WRITER *writer, const char *line)
if (writer->buffer) {
if (writer->buffer_len + len >= writer->buffer_size) {
writer->buffer_size += 10000;
writer->buffer = (char *)realloc(writer->buffer, writer->buffer_size);
writer->buffer = (char *)mxml_realloc(writer->buffer, writer->buffer_size);
}
strcpy(writer->buffer + writer->buffer_len, line);
writer->buffer_len += len;
@@ -140,12 +180,12 @@ MXML_WRITER *mxml_open_buffer(void)
time_t now;
MXML_WRITER *writer;
writer = (MXML_WRITER *)malloc(sizeof(MXML_WRITER));
writer = (MXML_WRITER *)mxml_malloc(sizeof(MXML_WRITER));
memset(writer, 0, sizeof(MXML_WRITER));
writer->translate = 1;
writer->buffer_size = 10000;
writer->buffer = (char *)malloc(10000);
writer->buffer = (char *)mxml_malloc(10000);
writer->buffer[0] = 0;
writer->buffer_len = 0;
@@ -187,7 +227,7 @@ MXML_WRITER *mxml_open_file(const char *file_name)
time_t now;
MXML_WRITER *writer;
writer = (MXML_WRITER *)malloc(sizeof(MXML_WRITER));
writer = (MXML_WRITER *)mxml_malloc(sizeof(MXML_WRITER));
memset(writer, 0, sizeof(MXML_WRITER));
writer->translate = 1;
@@ -196,7 +236,7 @@ MXML_WRITER *mxml_open_file(const char *file_name)
if (writer->fh == -1) {
sprintf(line, "Unable to open file \"%s\": ", file_name);
perror(line);
free(writer);
mxml_free(writer);
return NULL;
}
@@ -225,22 +265,23 @@ MXML_WRITER *mxml_open_file(const char *file_name)
void mxml_encode(char *src, int size, int translate)
{
char *ps, *pd;
static char *buffer = NULL;
static int buffer_size = 1000;
assert(size);
if (buffer == NULL)
buffer = (char *) malloc(buffer_size);
if (_encode_buffer == NULL) {
_encode_buffer = (char *) mxml_malloc(buffer_size);
atexit(mxml_deallocate);
}
if (size > buffer_size) {
buffer = (char *) realloc(buffer, size*2);
_encode_buffer = (char *) mxml_realloc(_encode_buffer, size*2);
buffer_size = size;
}
ps = src;
pd = buffer;
for (ps = src ; *ps && (size_t)pd - (size_t)buffer < (size_t)(size-10) ; ps++) {
pd = _encode_buffer;
for (ps = src ; *ps && (size_t)pd - (size_t)_encode_buffer < (size_t)(size-10) ; ps++) {
if (translate) { /* tranlate "<", ">", "&", """, "'" */
switch (*ps) {
@@ -284,7 +325,7 @@ void mxml_encode(char *src, int size, int translate)
}
*pd = 0;
strlcpy(src, buffer, size);
strlcpy(src, _encode_buffer, size);
}
/*------------------------------------------------------------------*/
@@ -367,11 +408,11 @@ int mxml_start_element1(MXML_WRITER *writer, const char *name, int indent)
/* put element on stack */
if (writer->level == 0)
writer->stack = (char **)malloc(sizeof(char *));
writer->stack = (char **)mxml_malloc(sizeof(char *));
else
writer->stack = (char **)realloc(writer->stack, sizeof(char *)*(writer->level+1));
writer->stack = (char **)mxml_realloc(writer->stack, sizeof(char *)*(writer->level+1));
writer->stack[writer->level] = (char *) malloc(strlen(name_enc)+1);
writer->stack[writer->level] = (char *) mxml_malloc(strlen(name_enc)+1);
strcpy(writer->stack[writer->level], name_enc);
writer->level++;
writer->element_is_open = TRUE;
@@ -411,9 +452,9 @@ int mxml_end_element(MXML_WRITER *writer)
if (writer->element_is_open) {
writer->element_is_open = FALSE;
free(writer->stack[writer->level]);
mxml_free(writer->stack[writer->level]);
if (writer->level == 0)
free(writer->stack);
mxml_free(writer->stack);
strcpy(line, "/>\n");
return mxml_write_line(writer, line) == (int)strlen(line);
}
@@ -426,9 +467,9 @@ int mxml_end_element(MXML_WRITER *writer)
strlcat(line, "</", sizeof(line));
strlcat(line, writer->stack[writer->level], sizeof(line));
free(writer->stack[writer->level]);
mxml_free(writer->stack[writer->level]);
if (writer->level == 0)
free(writer->stack);
mxml_free(writer->stack);
strlcat(line, ">\n", sizeof(line));
writer->data_was_written = FALSE;
@@ -464,7 +505,6 @@ int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *valu
*/
int mxml_write_value(MXML_WRITER *writer, const char *data)
{
static char *data_enc;
static int data_size = 0;
if (!writer->element_is_open)
@@ -476,16 +516,16 @@ int mxml_write_value(MXML_WRITER *writer, const char *data)
writer->data_was_written = TRUE;
if (data_size == 0) {
data_enc = (char *)malloc(1000);
_data_enc = (char *)mxml_malloc(1000);
data_size = 1000;
} else if ((int)strlen(data)*2+1000 > data_size) {
data_size = 1000+strlen(data)*2;
data_enc = (char *)realloc(data_enc, data_size);
_data_enc = (char *)mxml_realloc(_data_enc, data_size);
}
strcpy(data_enc, data);
mxml_encode(data_enc, data_size, writer->translate);
return mxml_write_line(writer, data_enc) == (int)strlen(data_enc);
strcpy(_data_enc, data);
mxml_encode(_data_enc, data_size, writer->translate);
return mxml_write_line(writer, _data_enc) == (int)strlen(_data_enc);
}
/*------------------------------------------------------------------*/
@@ -570,7 +610,7 @@ char *mxml_close_buffer(MXML_WRITER *writer)
mxml_end_element(writer);
p = writer->buffer;
free(writer);
mxml_free(writer);
return p;
}
@@ -594,7 +634,7 @@ int mxml_close_file(MXML_WRITER *writer)
mxml_end_element(writer);
close(writer->fh);
free(writer);
mxml_free(writer);
return 1;
}
@@ -626,10 +666,10 @@ PMXML_NODE mxml_add_special_node_at(PMXML_NODE parent, int node_type, const char
assert(parent);
if (parent->n_children == 0)
parent->child = (PMXML_NODE)malloc(sizeof(MXML_NODE));
parent->child = (PMXML_NODE)mxml_malloc(sizeof(MXML_NODE));
else {
pchild = parent->child;
parent->child = (PMXML_NODE)realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1));
parent->child = (PMXML_NODE)mxml_realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1));
}
assert(parent->child);
@@ -656,7 +696,7 @@ PMXML_NODE mxml_add_special_node_at(PMXML_NODE parent, int node_type, const char
parent->n_children++;
if (value && *value) {
pnode->value = (char *)malloc(strlen(value)+1);
pnode->value = (char *)mxml_malloc(strlen(value)+1);
assert(pnode->value);
strcpy(pnode->value, value);
}
@@ -707,10 +747,10 @@ int mxml_add_tree_at(PMXML_NODE parent, PMXML_NODE tree, int idx)
assert(parent);
assert(tree);
if (parent->n_children == 0)
parent->child = (PMXML_NODE)malloc(sizeof(MXML_NODE));
parent->child = (PMXML_NODE)mxml_malloc(sizeof(MXML_NODE));
else {
pchild = parent->child;
parent->child = (PMXML_NODE)realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1));
parent->child = (PMXML_NODE)mxml_realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children+1));
if (parent->child != pchild) {
/* correct parent pointer for children */
@@ -769,15 +809,15 @@ int mxml_add_tree(PMXML_NODE parent, PMXML_NODE tree)
int mxml_add_attribute(PMXML_NODE pnode, const char *attrib_name, const char *attrib_value)
{
if (pnode->n_attributes == 0) {
pnode->attribute_name = (char*)malloc(MXML_NAME_LENGTH);
pnode->attribute_value = (char**)malloc(sizeof(char *));
pnode->attribute_name = (char*)mxml_malloc(MXML_NAME_LENGTH);
pnode->attribute_value = (char**)mxml_malloc(sizeof(char *));
} else {
pnode->attribute_name = (char*)realloc(pnode->attribute_name, MXML_NAME_LENGTH*(pnode->n_attributes+1));
pnode->attribute_value = (char**)realloc(pnode->attribute_value, sizeof(char *)*(pnode->n_attributes+1));
pnode->attribute_name = (char*)mxml_realloc(pnode->attribute_name, MXML_NAME_LENGTH*(pnode->n_attributes+1));
pnode->attribute_value = (char**)mxml_realloc(pnode->attribute_value, sizeof(char *)*(pnode->n_attributes+1));
}
strlcpy(pnode->attribute_name+pnode->n_attributes*MXML_NAME_LENGTH, attrib_name, MXML_NAME_LENGTH);
pnode->attribute_value[pnode->n_attributes] = (char *)malloc(strlen(attrib_value)+1);
pnode->attribute_value[pnode->n_attributes] = (char *)mxml_malloc(strlen(attrib_value)+1);
strcpy(pnode->attribute_value[pnode->n_attributes], attrib_value);
pnode->n_attributes++;
@@ -818,9 +858,9 @@ int mxml_add_resultnode(PMXML_NODE node, const char *xml_path, PMXML_NODE **node
/* if at end of path, add this node */
if (*xml_path == 0) {
if (*found == 0)
*nodelist = (PMXML_NODE *)malloc(sizeof(PMXML_NODE));
*nodelist = (PMXML_NODE *)mxml_malloc(sizeof(PMXML_NODE));
else
*nodelist = (PMXML_NODE *)realloc(*nodelist, sizeof(PMXML_NODE)*(*found + 1));
*nodelist = (PMXML_NODE *)mxml_realloc(*nodelist, sizeof(PMXML_NODE)*(*found + 1));
(*nodelist)[*found] = node;
(*found)++;
@@ -1008,7 +1048,7 @@ PMXML_NODE mxml_find_node(PMXML_NODE tree, const char *xml_path)
n = mxml_find_nodes(tree, xml_path, &node);
if (n > 0) {
pnode = node[0];
free(node);
mxml_free(node);
} else
pnode = NULL;
@@ -1058,9 +1098,9 @@ int mxml_replace_node_name(PMXML_NODE pnode, const char *name)
int mxml_replace_node_value(PMXML_NODE pnode, const char *value)
{
if (pnode->value)
pnode->value = (char *)realloc(pnode->value, strlen(value)+1);
pnode->value = (char *)mxml_realloc(pnode->value, strlen(value)+1);
else if (value)
pnode->value = (char *)malloc(strlen(value)+1);
pnode->value = (char *)mxml_malloc(strlen(value)+1);
else
pnode->value = NULL;
@@ -1131,7 +1171,7 @@ int mxml_replace_attribute_value(PMXML_NODE pnode, const char *attrib_name, cons
if (i == pnode->n_attributes)
return FALSE;
pnode->attribute_value[i] = (char *)realloc(pnode->attribute_value[i], strlen(attrib_value)+1);
pnode->attribute_value[i] = (char *)mxml_realloc(pnode->attribute_value[i], strlen(attrib_value)+1);
strcpy(pnode->attribute_value[i], attrib_value);
return TRUE;
}
@@ -1162,9 +1202,9 @@ int mxml_delete_node(PMXML_NODE pnode)
memcpy(&parent->child[j], &parent->child[j+1], sizeof(MXML_NODE));
parent->n_children--;
if (parent->n_children)
parent->child = (PMXML_NODE)realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children));
parent->child = (PMXML_NODE)mxml_realloc(parent->child, sizeof(MXML_NODE)*(parent->n_children));
else
free(parent->child);
mxml_free(parent->child);
}
} else
mxml_free_tree(pnode);
@@ -1185,18 +1225,18 @@ int mxml_delete_attribute(PMXML_NODE pnode, const char *attrib_name)
if (i == pnode->n_attributes)
return FALSE;
free(pnode->attribute_value[i]);
mxml_free(pnode->attribute_value[i]);
for (j=i ; j<pnode->n_attributes-1 ; j++) {
strcpy(pnode->attribute_name+j*MXML_NAME_LENGTH, pnode->attribute_name+(j+1)*MXML_NAME_LENGTH);
pnode->attribute_value[j] = pnode->attribute_value[j+1];
}
if (pnode->n_attributes > 0) {
pnode->attribute_name = (char *)realloc(pnode->attribute_name, MXML_NAME_LENGTH*(pnode->n_attributes-1));
pnode->attribute_value = (char **)realloc(pnode->attribute_value, sizeof(char *)*(pnode->n_attributes-1));
pnode->attribute_name = (char *)mxml_realloc(pnode->attribute_name, MXML_NAME_LENGTH*(pnode->n_attributes-1));
pnode->attribute_value = (char **)mxml_realloc(pnode->attribute_value, sizeof(char *)*(pnode->n_attributes-1));
} else {
free(pnode->attribute_name);
free(pnode->attribute_value);
mxml_free(pnode->attribute_name);
mxml_free(pnode->attribute_value);
}
return TRUE;
@@ -1218,7 +1258,7 @@ PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, c
sprintf(str, "XML read error in file \"%s\", line %d: ", file_name, line_number);
else
sprintf(str, "XML read error, line %d: ", line_number);
msg = (char *)malloc(error_size);
msg = (char *)mxml_malloc(error_size);
strlcpy(error, str, error_size);
va_start(argptr, format);
@@ -1226,7 +1266,7 @@ PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, c
va_end(argptr);
strlcat(error, str, error_size);
free(msg);
mxml_free(msg);
mxml_free_tree(root);
return NULL;
@@ -1291,7 +1331,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size)
}
len = (size_t)p - (size_t)pv;
pnew->value = (char *)malloc(len+1);
pnew->value = (char *)mxml_malloc(len+1);
memcpy(pnew->value, pv, len);
pnew->value[len] = 0;
mxml_decode(pnew->value);
@@ -1315,7 +1355,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size)
}
len = (size_t)p - (size_t)pv;
pnew->value = (char *)malloc(len+1);
pnew->value = (char *)mxml_malloc(len+1);
memcpy(pnew->value, pv, len);
pnew->value[len] = 0;
mxml_decode(pnew->value);
@@ -1519,7 +1559,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size)
return read_error(HERE, "Unexpected end of file");
len = (size_t)pv - (size_t)p;
pnew->value = (char *)malloc(len+1);
pnew->value = (char *)mxml_malloc(len+1);
memcpy(pnew->value, p, len);
pnew->value[len] = 0;
mxml_decode(pnew->value);
@@ -1555,7 +1595,7 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
char *p;
char *pv;
char delimiter;
int i, j, k, line_number;
int i, j, k, line_number, status;
char *replacement;
char entity_name[MXML_MAX_ENTITY][256];
char entity_reference_name[MXML_MAX_ENTITY][256];
@@ -1564,18 +1604,20 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
int nentity;
int fh, length, len;
char *buffer;
PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */
int ip; /* counter for entity value */
char directoryname[FILENAME_MAX];
char filename[FILENAME_MAX];
int entity_value_length[MXML_MAX_ENTITY];
int entity_name_length[MXML_MAX_ENTITY];
PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
entity_value[ip] = NULL;
line_number = 1;
nentity = -1;
status = 0;
if (!buf || !(*buf) || !strlen(*buf))
return 0;
@@ -1584,32 +1626,24 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
mxml_dirname(directoryname);
/* copy string to temporary space */
buffer = (char *) malloc(strlen(*buf) + 1);
buffer = (char *) mxml_malloc(strlen(*buf) + 1);
if (buffer == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
strcpy(buffer, *buf);
p = strstr(buffer, "!DOCTYPE");
if (p == NULL) { /* no entities */
mxml_free_tree(root);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 0;
status = 0;
goto error;
}
pv = strstr(p, "[");
if (pv == NULL) { /* no entities */
mxml_free_tree(root);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 0;
status = 1;
goto error;
}
p = pv + 1;
@@ -1630,10 +1664,8 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (strncmp(p, "!--", 3) == 0) {
@@ -1641,10 +1673,8 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
p += 3;
if (strstr(p, "-->") == NULL) {
read_error(HERE, "Unterminated comment");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
while (strncmp(p, "-->", 3) != 0) {
@@ -1660,10 +1690,8 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
nentity++;
if (nentity >= MXML_MAX_ENTITY) {
read_error(HERE, "Too much entities");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
pv = p + 7;
@@ -1680,17 +1708,13 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*p == '<' || *p == '>') {
read_error(HERE, "Unexpected \'%c\' inside !ENTITY", *p);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
pv = p;
@@ -1699,17 +1723,13 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
if (!*pv) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*pv == '<' || *pv == '>') {
read_error(HERE, "Unexpected \'%c\' inside entity \"%s\"", *pv, &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
len = (size_t) pv - (size_t) p;
@@ -1724,17 +1744,13 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*p == '<') {
read_error(HERE, "Unexpected \'<\' inside entity \"%s\"", &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
/* extract replacement or SYSTEM */
@@ -1745,17 +1761,13 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*p == '>') {
read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
/* check if SYSTEM */
@@ -1774,34 +1786,26 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*p == '>') {
read_error(HERE, "Unexpected \'>\' inside entity \"%s\"", &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*p != '\"' && *p != '\'') {
read_error(HERE, "Replacement was not found for entity \"%s\"", &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
delimiter = *p;
p++;
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
pv = p;
while (*pv && *pv != delimiter)
@@ -1809,27 +1813,21 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
if (!*pv) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
if (*pv == '<') {
read_error(HERE, "Unexpected \'%c\' inside entity \"%s\"", *pv, &entity_name[nentity][1]);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
len = (size_t) pv - (size_t) p;
replacement = (char *) malloc(len + 1);
replacement = (char *) mxml_malloc(len + 1);
if (replacement == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
memcpy(replacement, p, len);
@@ -1839,17 +1837,15 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
if (entity_type[nentity] == EXTERNAL_ENTITY) {
strcpy(entity_reference_name[nentity], replacement);
} else {
entity_value[nentity] = (char *) malloc(strlen(replacement));
entity_value[nentity] = (char *) mxml_malloc(strlen(replacement));
if (entity_value[nentity] == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
strcpy(entity_value[nentity], replacement);
}
free(replacement);
mxml_free(replacement);
p = pv;
while (*p && isspace((unsigned char)*p)) {
@@ -1859,10 +1855,8 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
if (!*p) {
read_error(HERE, "Unexpected end of file");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
}
}
@@ -1887,36 +1881,32 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
if (fh == -1) {
entity_value[i] =
(char *) malloc(strlen(entity_reference_name[i]) + strlen("<!-- is missing -->") + 1);
(char *) mxml_malloc(strlen(entity_reference_name[i]) + strlen("<!-- is missing -->") + 1);
if (entity_value[i] == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
sprintf(entity_value[i], "<!-- %s is missing -->", entity_reference_name[i]);
} else {
length = lseek(fh, 0, SEEK_END);
lseek(fh, 0, SEEK_SET);
if (length == 0) {
entity_value[i] = (char *) malloc(1);
entity_value[i] = (char *) mxml_malloc(1);
if (entity_value[i] == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
close(fh);
status = 1;
goto error;
}
entity_value[i][0] = 0;
} else {
entity_value[i] = (char *) malloc(length);
entity_value[i] = (char *) mxml_malloc(length);
if (entity_value[i] == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
close(fh);
status = 1;
goto error;
}
/* read complete file at once */
@@ -1926,11 +1916,8 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
/* recursive parse */
if (mxml_parse_entity(&entity_value[i], filename, error, error_size) != 0) {
mxml_free_tree(root);
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
}
}
@@ -1955,14 +1942,11 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
}
/* re-allocate memory */
free(*buf);
*buf = (char *) malloc(length + 1);
*buf = (char *) mxml_realloc(*buf, length + 1);
if (*buf == NULL) {
read_error(HERE, "Cannot allocate memory.");
free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
return 1;
status = 1;
goto error;
}
/* replace entities */
@@ -1984,12 +1968,17 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_
} while (*p);
*pv = 0;
free(buffer);
error:
if (buffer != NULL)
mxml_free(buffer);
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
free(entity_value[ip]);
if (entity_value[ip] != NULL)
mxml_free(entity_value[ip]);
mxml_free_tree(root);
return 0;
return status;
}
/*------------------------------------------------------------------*/
@@ -2018,7 +2007,7 @@ PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size)
length = lseek(fh, 0, SEEK_END);
lseek(fh, 0, SEEK_SET);
buf = (char *)malloc(length+1);
buf = (char *)mxml_malloc(length+1);
if (buf == NULL) {
close(fh);
sprintf(line, "Cannot allocate buffer: ");
@@ -2033,13 +2022,13 @@ PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size)
close(fh);
if (mxml_parse_entity(&buf, file_name, error, error_size) != 0) {
free(buf);
mxml_free(buf);
return NULL;
}
root = mxml_parse_buffer(buf, error, error_size);
free(buf);
mxml_free(buf);
return root;
}
@@ -2180,23 +2169,23 @@ void mxml_free_tree(PMXML_NODE tree)
for (i=0 ; i<tree->n_children ; i++)
mxml_free_tree(&tree->child[i]);
if (tree->n_children)
free(tree->child);
mxml_free(tree->child);
/* now free dynamic data */
for (i=0 ; i<tree->n_attributes ; i++)
free(tree->attribute_value[i]);
mxml_free(tree->attribute_value[i]);
if (tree->n_attributes) {
free(tree->attribute_name);
free(tree->attribute_value);
mxml_free(tree->attribute_name);
mxml_free(tree->attribute_value);
}
if (tree->value)
free(tree->value);
mxml_free(tree->value);
/* if we are the root node, free it */
if (tree->parent == NULL)
free(tree);
mxml_free(tree);
}
/*------------------------------------------------------------------*/