mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-10 18:23:28 +00:00
*** empty log message ***
SVN revision: 1270
This commit is contained in:
parent
96b1a48822
commit
f1acbbf731
176
src/mxml.c
176
src/mxml.c
@ -73,7 +73,7 @@
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifdef STRLCPY_DEFINED
|
#ifdef HAVE_STRLCPY
|
||||||
|
|
||||||
extern size_t strlcpy(char *dst, const char *src, size_t size);
|
extern size_t strlcpy(char *dst, const char *src, size_t size);
|
||||||
extern size_t strlcat(char *dst, const char *src, size_t size);
|
extern size_t strlcat(char *dst, const char *src, size_t size);
|
||||||
@ -171,7 +171,7 @@ int mxml_write_line(MXML_WRITER *writer, char *line)
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
MXML_WRITER *mxml_open_document(const char *file_name)
|
MXML_WRITER *mxml_open_buffer()
|
||||||
/* open a file and write XML header */
|
/* open a file and write XML header */
|
||||||
{
|
{
|
||||||
char str[256], line[1000];
|
char str[256], line[1000];
|
||||||
@ -181,20 +181,46 @@ MXML_WRITER *mxml_open_document(const char *file_name)
|
|||||||
writer = (MXML_WRITER *)malloc(sizeof(MXML_WRITER));
|
writer = (MXML_WRITER *)malloc(sizeof(MXML_WRITER));
|
||||||
memset(writer, 0, sizeof(MXML_WRITER));
|
memset(writer, 0, sizeof(MXML_WRITER));
|
||||||
|
|
||||||
if (file_name) {
|
writer->buffer_size = 10000;
|
||||||
writer->fh = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_TEXT, 0644);
|
writer->buffer = (char *)malloc(10000);
|
||||||
|
writer->buffer[0] = 0;
|
||||||
|
writer->buffer_len = 0;
|
||||||
|
|
||||||
if (writer->fh == -1) {
|
/* write XML header */
|
||||||
sprintf(line, "Unable to open file \"%s\": ", file_name);
|
strcpy(line, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
|
||||||
perror(line);
|
mxml_write_line(writer, line);
|
||||||
free(writer);
|
time(&now);
|
||||||
return NULL;
|
strcpy(str, ctime(&now));
|
||||||
}
|
str[24] = 0;
|
||||||
} else {
|
sprintf(line, "<!-- created by MXML on %s -->\n", str);
|
||||||
writer->buffer_size = 10000;
|
mxml_write_line(writer, line);
|
||||||
writer->buffer = (char *)malloc(10000);
|
|
||||||
writer->buffer[0] = 0;
|
/* initialize stack */
|
||||||
writer->buffer_len = 0;
|
writer->level = 0;
|
||||||
|
writer->element_is_open = 0;
|
||||||
|
|
||||||
|
return writer;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
MXML_WRITER *mxml_open_file(const char *file_name)
|
||||||
|
/* open a file and write XML header */
|
||||||
|
{
|
||||||
|
char str[256], line[1000];
|
||||||
|
time_t now;
|
||||||
|
MXML_WRITER *writer;
|
||||||
|
|
||||||
|
writer = (MXML_WRITER *)malloc(sizeof(MXML_WRITER));
|
||||||
|
memset(writer, 0, sizeof(MXML_WRITER));
|
||||||
|
|
||||||
|
writer->fh = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_TEXT, 0644);
|
||||||
|
|
||||||
|
if (writer->fh == -1) {
|
||||||
|
sprintf(line, "Unable to open file \"%s\": ", file_name);
|
||||||
|
perror(line);
|
||||||
|
free(writer);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write XML header */
|
/* write XML header */
|
||||||
@ -429,7 +455,7 @@ int mxml_write_value(MXML_WRITER *writer, const char *data)
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
char *mxml_close_document(MXML_WRITER *writer)
|
char *mxml_close_buffer(MXML_WRITER *writer)
|
||||||
/* close a file opened with mxml_open_writer */
|
/* close a file opened with mxml_open_writer */
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -445,15 +471,31 @@ char *mxml_close_document(MXML_WRITER *writer)
|
|||||||
for (i = 0 ; i<writer->level ; i++)
|
for (i = 0 ; i<writer->level ; i++)
|
||||||
mxml_end_element(writer);
|
mxml_end_element(writer);
|
||||||
|
|
||||||
if (writer->buffer) {
|
p = writer->buffer;
|
||||||
p = writer->buffer;
|
free(writer);
|
||||||
free(writer);
|
return p;
|
||||||
return p;
|
}
|
||||||
}
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
int mxml_close_file(MXML_WRITER *writer)
|
||||||
|
/* close a file opened with mxml_open_writer */
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (writer->element_is_open) {
|
||||||
|
writer->element_is_open = FALSE;
|
||||||
|
if (mxml_write_line(writer, ">\n") != 2)
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* close remaining open levels */
|
||||||
|
for (i = 0 ; i<writer->level ; i++)
|
||||||
|
mxml_end_element(writer);
|
||||||
|
|
||||||
close(writer->fh);
|
close(writer->fh);
|
||||||
free(writer);
|
free(writer);
|
||||||
return (char *)1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
@ -731,12 +773,12 @@ PMXML_NODE mxml_find_node(PMXML_NODE tree, char *xml_path)
|
|||||||
int n;
|
int n;
|
||||||
|
|
||||||
n = mxml_find_nodes(tree, xml_path, &node);
|
n = mxml_find_nodes(tree, xml_path, &node);
|
||||||
if (n > 0)
|
if (n > 0) {
|
||||||
pnode = node[0];
|
pnode = node[0];
|
||||||
else
|
free(node);
|
||||||
|
} else
|
||||||
pnode = NULL;
|
pnode = NULL;
|
||||||
|
|
||||||
free(node);
|
|
||||||
return pnode;
|
return pnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -936,42 +978,18 @@ PMXML_NODE read_error(PMXML_NODE root, char *file_name, int line_number, char *e
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size)
|
PMXML_NODE mxml_parse_buffer(char *buf, char *error, int error_size, char *file_name)
|
||||||
/* parse a XML file and convert it into a tree of MXML_NODE's. Return NULL
|
/* parse a XML buffer and convert it into a tree of MXML_NODE's. Return NULL
|
||||||
in case of an error, return error description */
|
in case of an error, return error description. Optional file_name is used
|
||||||
|
for error reporting if called from mxml_parse_file() */
|
||||||
{
|
{
|
||||||
char line[1000], node_name[256], attrib_name[256], attrib_value[1000];
|
char node_name[256], attrib_name[256], attrib_value[1000];
|
||||||
char *buf, *p, *pv;
|
char *p, *pv;
|
||||||
int i, fh, length, line_number;
|
int i, line_number;
|
||||||
PMXML_NODE root, ptree, pnew;
|
PMXML_NODE root, ptree, pnew;
|
||||||
int end_element;
|
int end_element;
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
fh = open(file_name, O_RDONLY | O_TEXT, 0644);
|
|
||||||
|
|
||||||
if (fh == -1) {
|
|
||||||
sprintf(line, "Unable to open file \"%s\": ", file_name);
|
|
||||||
strlcat(line, strerror(errno), sizeof(line));
|
|
||||||
strlcpy(error, line, error_size);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
length = lseek(fh, 0, SEEK_END);
|
|
||||||
lseek(fh, 0, SEEK_SET);
|
|
||||||
buf = (char *)malloc(length+1);
|
|
||||||
if (buf == NULL) {
|
|
||||||
close(fh);
|
|
||||||
sprintf(line, "Cannot allocate buffer: ");
|
|
||||||
strlcat(line, strerror(errno), sizeof(line));
|
|
||||||
strlcpy(error, line, error_size);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* read complete file at once */
|
|
||||||
length = read(fh, buf, length);
|
|
||||||
buf[length] = 0;
|
|
||||||
close(fh);
|
|
||||||
|
|
||||||
p = buf;
|
p = buf;
|
||||||
line_number = 1;
|
line_number = 1;
|
||||||
|
|
||||||
@ -1217,6 +1235,48 @@ 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)
|
||||||
|
/* parse a XML file and convert it into a tree of MXML_NODE's. Return NULL
|
||||||
|
in case of an error, return error description */
|
||||||
|
{
|
||||||
|
char *buf, line[1000];
|
||||||
|
int fh, length;
|
||||||
|
PMXML_NODE root;
|
||||||
|
|
||||||
|
fh = open(file_name, O_RDONLY | O_TEXT, 0644);
|
||||||
|
|
||||||
|
if (fh == -1) {
|
||||||
|
sprintf(line, "Unable to open file \"%s\": ", file_name);
|
||||||
|
strlcat(line, strerror(errno), sizeof(line));
|
||||||
|
strlcpy(error, line, error_size);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
length = lseek(fh, 0, SEEK_END);
|
||||||
|
lseek(fh, 0, SEEK_SET);
|
||||||
|
buf = (char *)malloc(length+1);
|
||||||
|
if (buf == NULL) {
|
||||||
|
close(fh);
|
||||||
|
sprintf(line, "Cannot allocate buffer: ");
|
||||||
|
strlcat(line, strerror(errno), sizeof(line));
|
||||||
|
strlcpy(error, line, error_size);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* read complete file at once */
|
||||||
|
length = read(fh, buf, length);
|
||||||
|
buf[length] = 0;
|
||||||
|
close(fh);
|
||||||
|
|
||||||
|
root = mxml_parse_buffer(buf, error, error_size, file_name);
|
||||||
|
|
||||||
|
free(buf);
|
||||||
|
|
||||||
|
return root;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
int mxml_write_subtree(MXML_WRITER *writer, PMXML_NODE tree)
|
int mxml_write_subtree(MXML_WRITER *writer, PMXML_NODE tree)
|
||||||
/* write complete subtree recursively into file opened with mxml_open_document() */
|
/* write complete subtree recursively into file opened with mxml_open_document() */
|
||||||
{
|
{
|
||||||
@ -1247,7 +1307,7 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(tree);
|
assert(tree);
|
||||||
writer = mxml_open_document(file_name);
|
writer = mxml_open_file(file_name);
|
||||||
if (!writer)
|
if (!writer)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
@ -1255,7 +1315,7 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
|
|||||||
if (!mxml_write_subtree(writer, &tree->child[i]))
|
if (!mxml_write_subtree(writer, &tree->child[i]))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (!mxml_close_document(writer))
|
if (!mxml_close_file(writer))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
@ -38,12 +38,14 @@ typedef struct mxml_struct {
|
|||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|
||||||
MXML_WRITER *mxml_open_document(const char *file_name);
|
MXML_WRITER *mxml_open_file(const char *file_name);
|
||||||
|
MXML_WRITER *mxml_open_buffer(void);
|
||||||
int mxml_start_element(MXML_WRITER *writer, const char *name);
|
int mxml_start_element(MXML_WRITER *writer, const char *name);
|
||||||
int mxml_end_element(MXML_WRITER *writer);
|
int mxml_end_element(MXML_WRITER *writer);
|
||||||
int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *value);
|
int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *value);
|
||||||
int mxml_write_value(MXML_WRITER *writer, const char *value);
|
int mxml_write_value(MXML_WRITER *writer, const char *value);
|
||||||
char *mxml_close_document(MXML_WRITER *writer);
|
char *mxml_close_buffer(MXML_WRITER *writer);
|
||||||
|
int mxml_close_file(MXML_WRITER *writer);
|
||||||
|
|
||||||
int mxml_get_number_of_children(PMXML_NODE pnode);
|
int mxml_get_number_of_children(PMXML_NODE pnode);
|
||||||
PMXML_NODE mxml_subnode(PMXML_NODE pnode, int index);
|
PMXML_NODE mxml_subnode(PMXML_NODE pnode, int index);
|
||||||
@ -67,6 +69,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, char *file_name);
|
||||||
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