From 9fe5b85a7f28b42f1dbbf228a8cbdf6b011f0b82 Mon Sep 17 00:00:00 2001 From: Stefan Ritt Date: Fri, 3 Feb 2012 12:57:34 +0000 Subject: [PATCH] Return error line in parsing functions, abort on missing external ENTITY --- mxml.c | 41 ++++++++++++++++++++--------------------- mxml.h | 6 +++--- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/mxml.c b/mxml.c index 720d564..8ce340b 100755 --- a/mxml.c +++ b/mxml.c @@ -96,8 +96,7 @@ static int mxml_suppress_date_flag = 0; /* suppress writing date at the top of file. */ /* local prototypes */ -static PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, char *error, int error_size, - const char *format, ...) MXML_GNUC_PRINTF(6, 7); +static PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, char *error, int error_size, int *error_line, const char *format, ...) MXML_GNUC_PRINTF(7, 8); static void mxml_encode(char *src, int size, int translate); static void mxml_decode(char *str); static int mxml_write_subtree(MXML_WRITER *writer, PMXML_NODE tree, int indent); @@ -1260,12 +1259,12 @@ int mxml_delete_attribute(PMXML_NODE pnode, const char *attrib_name) /*------------------------------------------------------------------*/ -#define HERE root, file_name, line_number, error, error_size +#define HERE root, file_name, line_number, error, error_size, error_line /** * used inside mxml_parse_file for reporting errors */ -PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, char *error, int error_size, const char *format, ...) +PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, char *error, int error_size, int *error_line, const char *format, ...) { char *msg, str[1000]; va_list argptr; @@ -1282,6 +1281,9 @@ PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, c va_end(argptr); strlcat(error, str, error_size); + if (error_line) + *error_line = line_number; + mxml_free(msg); mxml_free_tree(root); @@ -1295,7 +1297,7 @@ PMXML_NODE read_error(PMXML_NODE root, const char *file_name, int line_number, c * Return NULL in case of an error, return error description. * Optional file_name is used for error reporting if called from mxml_parse_file() */ -PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) +PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size, int *error_line) { char node_name[256], attrib_name[256], attrib_value[1000], quote; const char *p, *pv; @@ -1613,7 +1615,7 @@ PMXML_NODE mxml_parse_buffer(const char *buf, char *error, int error_size) * Return 0 in case of no errors, return error description. * Optional file_name is used for error reporting if called from mxml_parse_file() */ -int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_size) +int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_size, int *error_line) { char *p; char *pv; @@ -1624,6 +1626,7 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_ char entity_reference_name[MXML_MAX_ENTITY][256]; char *entity_value[MXML_MAX_ENTITY]; int entity_type[MXML_MAX_ENTITY]; /* internal or external */ + int entity_line_number[MXML_MAX_ENTITY]; int nentity; int fh, length, len; char *buffer; @@ -1716,7 +1719,9 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_ status = 1; goto error; } - + + entity_line_number[nentity] = line_number; + pv = p + 7; while (*pv == ' ') pv++; @@ -1901,14 +1906,10 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_ fh = open(filename, O_RDONLY | O_TEXT, 0644); if (fh == -1) { - entity_value[i] = - (char *) mxml_malloc(strlen(entity_reference_name[i]) + strlen("") + 1); - if (entity_value[i] == NULL) { - read_error(HERE, "Cannot allocate memory."); - status = 1; - goto error; - } - sprintf(entity_value[i], "", entity_reference_name[i]); + line_number = entity_line_number[i]; + read_error(HERE, "%s is missing", entity_reference_name[i]); + status = 1; + goto error; } else { length = (int)lseek(fh, 0, SEEK_END); lseek(fh, 0, SEEK_SET); @@ -1936,7 +1937,7 @@ int mxml_parse_entity(char **buf, const char *file_name, char *error, int error_ close(fh); /* recursive parse */ - if (mxml_parse_entity(&entity_value[i], filename, error, error_size) != 0) { + if (mxml_parse_entity(&entity_value[i], filename, error, error_size, error_line) != 0) { status = 1; goto error; } @@ -1997,8 +1998,6 @@ error: if (entity_value[ip] != NULL) mxml_free(entity_value[ip]); - mxml_free_tree(root); - return status; } @@ -2008,7 +2007,7 @@ error: * parse a XML file and convert it into a tree of MXML_NODE's. * Return NULL in case of an error, return error description */ -PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size) +PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size, int *error_line) { char *buf, line[1000]; int fh, length; @@ -2042,12 +2041,12 @@ PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size) buf[length] = 0; close(fh); - if (mxml_parse_entity(&buf, file_name, error, error_size) != 0) { + if (mxml_parse_entity(&buf, file_name, error, error_size, error_line) != 0) { mxml_free(buf); return NULL; } - root = mxml_parse_buffer(buf, error, error_size); + root = mxml_parse_buffer(buf, error, error_size, error_line); mxml_free(buf); diff --git a/mxml.h b/mxml.h index ee9ef5c..9cc5110 100755 --- a/mxml.h +++ b/mxml.h @@ -123,9 +123,9 @@ int mxml_delete_node(PMXML_NODE pnode); int mxml_delete_attribute(PMXML_NODE, const char *attrib_name); PMXML_NODE mxml_create_root_node(void); -PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size); -PMXML_NODE mxml_parse_buffer(const char *buffer, char *error, int error_size); -int mxml_parse_entity(char **buf, const char* file_name, char *error, int error_size); +PMXML_NODE mxml_parse_file(const char *file_name, char *error, int error_size, int *error_line); +PMXML_NODE mxml_parse_buffer(const char *buffer, char *error, int error_size, int *error_line); +int mxml_parse_entity(char **buf, const char* file_name, char *error, int error_size, int *error_line); int mxml_write_tree(const char *file_name, PMXML_NODE tree); void mxml_debug_tree(PMXML_NODE tree, int level); void mxml_free_tree(PMXML_NODE tree);