From ed284311fb0573c9c307f5b4870b87ef0212a6f7 Mon Sep 17 00:00:00 2001 From: Ryu Sawada Date: Fri, 7 Oct 2005 14:13:01 +0000 Subject: [PATCH] parse ENTITY --- mxml.c | 448 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- mxml.h | 8 +- 2 files changed, 454 insertions(+), 2 deletions(-) diff --git a/mxml.c b/mxml.c index ec50e20..68a7cc5 100755 --- a/mxml.c +++ b/mxml.c @@ -36,7 +36,7 @@ in the tree and for manipulating nodes, like replacing, adding and deleting nodes. - $Id:$ + $Id$ \********************************************************************/ @@ -1177,6 +1177,30 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size) p += 2; + } else if (strncmp(p, "!ENTITY", 7) == 0) { + + /* found !ENTITY element */ + pnew = mxml_add_special_node(ptree, ENTITY_NODE, "ENTYTY", NULL); + pv = p + 1; + + p++; + if (strstr(p, ">") == NULL) + return read_error(HERE, "Unterminated !ENTITY element"); + + while (*p != '>') { + if (*p == '\n') + line_number++; + p++; + } + + len = (size_t)p - (size_t)pv; + pnew->value = (char *)malloc(len+1); + memcpy(pnew->value, pv, len); + pnew->value[len] = 0; + mxml_decode(pnew->value); + + p ++; + } else { /* found normal element */ @@ -1375,6 +1399,422 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size) /*------------------------------------------------------------------*/ +PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size) +/* parse !ENTYTY entries of XML files and replace with references. Return NULL + in case of error, return error description. Optional file_name is used + for error reporting if called from mxml_parse_file() */ +{ + char *p; + char *pv; + char delimiter; + int i, j, k, line_number; + char *replacement; + char entity_name[MXML_MAX_ENTITY][256]; + char entity_reference_name[MXML_MAX_ENTITY][256]; + char *entity_value[MXML_MAX_ENTITY]; + int entity_type[MXML_MAX_ENTITY]; /* internal or external */ + int nentity; + int fh, length, len; + char *buffer; + PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */ + char *file_name = NULL; /* dummy for 'HERE' */ + int ip; /* counter for entity value */ + + for (ip = 0; ip < MXML_MAX_ENTITY; ip++) + entity_value[ip] = NULL; + + line_number = 1; + nentity = -1; + + /* copy string to temporary space */ + buffer = (char *) malloc(strlen(*buf) + 1); + if (buffer == NULL) { + return read_error(HERE, "Cannot allocate memory."); + } + + p = buffer; + + strcpy(buffer, *buf); + free(*buf); + + /* search !ENTITY */ + do { + if (*p == '<') { + + /* found new entity */ + p++; + while (*p && isspace(*p)) { + if (*p == '\n') + line_number++; + p++; + } + if (!*p) { +/* + free(buffer); + for(ip=0;ip= MXML_MAX_ENTITY) { +/* + free(buffer); + for(ip=0;ip') { +/* + free(buffer); + for(ip=0;ip') { +/* + free(buffer); + for(ip=0;ip') { +/* + free(buffer); + for(ip=0;ip\' inside entity \"%s\"", &entity_name[nentity][1]); + } + + /* check if SYSTEM */ + if (strncmp(p, "SYSTEM", 6) == 0) { + entity_type[nentity] = EXTERNAL_ENTITY; + p += 6; + } else { + entity_type[nentity] = INTERNAL_ENTITY; + } + + /* extract replacement */ + while (*p && isspace(*p)) { + if (*p == '\n') + line_number++; + p++; + } + if (!*p) { +/* + free(buffer); + for(ip=0;ip') { +/* + free(buffer); + for(ip=0;ip\' inside entity \"%s\"", &entity_name[nentity][1]); + } + + if (*p != '\"' && *p != '\'') { +/* + free(buffer); + for(ip=0;ip") + 1); + if (entity_value[i] == NULL) { +/* + free(buffer); + for(ip=0;ip", 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); + if (entity_value[i] == NULL) { +/* + free(buffer); + for(ip=0;ip