mirror of
https://gitea.psi.ch/ELOG/mxml.git
synced 2026-09-09 01:23:22 +00:00
relative path to follow external entity.
This commit is contained in:
parent
7a51782672
commit
2f3edffda0
19
mxml.c
19
mxml.c
@ -44,6 +44,7 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#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");
|
return read_error(HERE, "Unterminated !DOCTYPE element");
|
||||||
|
|
||||||
j = 0;
|
j = 0;
|
||||||
while (*p != '>' || j > 0) {
|
while (*p && *p != '>' || j > 0) {
|
||||||
if (*p == '\n')
|
if (*p == '\n')
|
||||||
line_number++;
|
line_number++;
|
||||||
else if (*p == '<')
|
else if (*p == '<')
|
||||||
@ -1194,6 +1195,8 @@ PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size)
|
|||||||
j--;
|
j--;
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
|
if (!*p)
|
||||||
|
return read_error(HERE, "Unexpected end of file");
|
||||||
|
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
@ -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
|
/* parse !ENTYTY entries of XML files and replace with references. Return NULL
|
||||||
in case of error, return error description. Optional file_name is used
|
in case of error, return error description. Optional file_name is used
|
||||||
for error reporting if called from mxml_parse_file() */
|
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;
|
int fh, length, len;
|
||||||
char *buffer;
|
char *buffer;
|
||||||
PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */
|
PMXML_NODE root = mxml_create_root_node(); /* dummy for 'HERE' */
|
||||||
char *file_name = NULL; /* dummy for 'HERE' */
|
|
||||||
int ip; /* counter for entity value */
|
int ip; /* counter for entity value */
|
||||||
|
char directoryname[FILENAME_MAX];
|
||||||
|
char filename[FILENAME_MAX];
|
||||||
|
|
||||||
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
|
for (ip = 0; ip < MXML_MAX_ENTITY; ip++)
|
||||||
entity_value[ip] = NULL;
|
entity_value[ip] = NULL;
|
||||||
@ -1422,6 +1426,8 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
|
|||||||
line_number = 1;
|
line_number = 1;
|
||||||
nentity = -1;
|
nentity = -1;
|
||||||
|
|
||||||
|
strcpy(directoryname, dirname(file_name));
|
||||||
|
|
||||||
/* copy string to temporary space */
|
/* copy string to temporary space */
|
||||||
buffer = (char *) malloc(strlen(*buf) + 1);
|
buffer = (char *) malloc(strlen(*buf) + 1);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
@ -1709,7 +1715,8 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
|
|||||||
/* read external file */
|
/* read external file */
|
||||||
for (i = 0; i < nentity; i++) {
|
for (i = 0; i < nentity; i++) {
|
||||||
if (entity_type[i] == EXTERNAL_ENTITY) {
|
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) {
|
if (fh == -1) {
|
||||||
entity_value[i] =
|
entity_value[i] =
|
||||||
@ -1754,7 +1761,7 @@ PMXML_NODE mxml_parse_entity(char **buf, char *error, int error_size)
|
|||||||
close(fh);
|
close(fh);
|
||||||
|
|
||||||
/* recursive parse */
|
/* 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) {
|
if (root == NULL) {
|
||||||
/*
|
/*
|
||||||
free(buffer);
|
free(buffer);
|
||||||
@ -1858,7 +1865,7 @@ PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size)
|
|||||||
buf[length] = 0;
|
buf[length] = 0;
|
||||||
close(fh);
|
close(fh);
|
||||||
|
|
||||||
root = mxml_parse_entity(&buf, error, error_size);
|
root = mxml_parse_entity(&buf, file_name, error, error_size);
|
||||||
if (root == NULL) {
|
if (root == NULL) {
|
||||||
free(buf);
|
free(buf);
|
||||||
return root;
|
return root;
|
||||||
|
|||||||
2
mxml.h
2
mxml.h
@ -94,7 +94,7 @@ int mxml_delete_attribute(PMXML_NODE, char *attrib_name);
|
|||||||
PMXML_NODE mxml_create_root_node();
|
PMXML_NODE mxml_create_root_node();
|
||||||
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size);
|
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_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);
|
int mxml_write_tree(char *file_name, PMXML_NODE tree);
|
||||||
void mxml_debug_tree(PMXML_NODE tree, int level);
|
void mxml_debug_tree(PMXML_NODE tree, int level);
|
||||||
void mxml_free_tree(PMXML_NODE tree);
|
void mxml_free_tree(PMXML_NODE tree);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user