relative path to follow external entity.

This commit is contained in:
Ryu Sawada
2005-10-07 22:34:13 +00:00
parent 7a51782672
commit 2f3edffda0
2 changed files with 19 additions and 12 deletions
+18 -11
View File
@@ -44,6 +44,7 @@
#include <fcntl.h>
#include <string.h>
#include <assert.h>
#include <libgen.h>
#ifdef _MSC_VER
@@ -1185,7 +1186,7 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
return read_error(HERE, "Unterminated !DOCTYPE element");
j = 0;
while (*p != '>' || j > 0) {
while (*p && *p != '>' || j > 0) {
if (*p == '\n')
line_number++;
else if (*p == '<')
@@ -1194,8 +1195,10 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
j--;
p++;
}
if (!*p)
return read_error(HERE, "Unexpected end of file");
p ++;
p++;
} else {
@@ -1395,7 +1398,7 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
/*------------------------------------------------------------------*/
PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
PMXML_NODE mxml_parse_entity(char **buf, char *file_name, 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() */
@@ -1413,8 +1416,9 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
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 */
char directoryname[FILENAME_MAX];
char filename[FILENAME_MAX];
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
entity_value[ip] = NULL;
@@ -1422,6 +1426,8 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
line_number = 1;
nentity = -1;
strcpy(directoryname, dirname(file_name));
/* copy string to temporary space */
buffer = (char *) malloc(strlen(*buf) + 1);
if (buffer == NULL) {
@@ -1429,12 +1435,12 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
}
strcpy(buffer, *buf);
p = strstr(buffer,"!DOCTYPE");
if(p == NULL) /* no entities */
p = strstr(buffer, "!DOCTYPE");
if (p == NULL) /* no entities */
return root;
pv = strstr(p,"[");
if(pv == NULL) /* no entities */
pv = strstr(p, "[");
if (pv == NULL) /* no entities */
return root;
free(*buf);
@@ -1709,7 +1715,8 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
/* read external file */
for (i = 0; i < nentity; i++) {
if (entity_type[i] == EXTERNAL_ENTITY) {
fh = open(entity_reference_name[i], O_RDONLY | O_TEXT, 0644);
sprintf(filename, "%s/%s", directoryname, entity_reference_name[i]);
fh = open(filename, O_RDONLY | O_TEXT, 0644);
if (fh == -1) {
entity_value[i] =
@@ -1754,7 +1761,7 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
close(fh);
/* recursive parse */
root = mxml_parse_entity(&entity_value[i], error, error_size);
root = mxml_parse_entity(&entity_value[i], filename, error, error_size);
if (root == NULL) {
/*
free(buffer);
@@ -1858,7 +1865,7 @@ PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size)
buf[length] = 0;
close(fh);
root = mxml_parse_entity(&buf, error, error_size);
root = mxml_parse_entity(&buf, file_name, error, error_size);
if (root == NULL) {
free(buf);
return root;
+1 -1
View File
@@ -94,7 +94,7 @@ int mxml_delete_attribute(PMXML_NODE, char *attrib_name);
PMXML_NODE mxml_create_root_node();
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
PMXML_NODE mxml_parse_buffer(char *buffer, char *error, int error_size);
PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size);
PMXML_NODE mxml_parse_entity(char **buf, char* file_name, char *error, int error_size);
int mxml_write_tree(char *file_name, PMXML_NODE tree);
void mxml_debug_tree(PMXML_NODE tree, int level);
void mxml_free_tree(PMXML_NODE tree);