*** empty log message ***

SVN revision: 1270
This commit is contained in:
2005-03-24 09:22:51 +00:00
parent 96b1a48822
commit f1acbbf731
2 changed files with 123 additions and 60 deletions
+118 -58
View File
@@ -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 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 */
{
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));
memset(writer, 0, sizeof(MXML_WRITER));
if (file_name) {
writer->fh = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_TEXT, 0644);
writer->buffer_size = 10000;
writer->buffer = (char *)malloc(10000);
writer->buffer[0] = 0;
writer->buffer_len = 0;
if (writer->fh == -1) {
sprintf(line, "Unable to open file \"%s\": ", file_name);
perror(line);
free(writer);
return NULL;
}
} else {
writer->buffer_size = 10000;
writer->buffer = (char *)malloc(10000);
writer->buffer[0] = 0;
writer->buffer_len = 0;
/* write XML header */
strcpy(line, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
mxml_write_line(writer, line);
time(&now);
strcpy(str, ctime(&now));
str[24] = 0;
sprintf(line, "<!-- created by MXML on %s -->\n", str);
mxml_write_line(writer, line);
/* initialize stack */
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 */
@@ -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 */
{
int i;
@@ -445,15 +471,31 @@ char *mxml_close_document(MXML_WRITER *writer)
for (i = 0 ; i<writer->level ; i++)
mxml_end_element(writer);
if (writer->buffer) {
p = writer->buffer;
free(writer);
return p;
}
p = writer->buffer;
free(writer);
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);
free(writer);
return (char *)1;
return 1;
}
/*------------------------------------------------------------------*/
@@ -731,12 +773,12 @@ PMXML_NODE mxml_find_node(PMXML_NODE tree, char *xml_path)
int n;
n = mxml_find_nodes(tree, xml_path, &node);
if (n > 0)
if (n > 0) {
pnode = node[0];
else
free(node);
} else
pnode = NULL;
free(node);
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)
/* 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_buffer(char *buf, char *error, int error_size, char *file_name)
/* parse a XML buffer and convert it into a tree of MXML_NODE's. Return NULL
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 *buf, *p, *pv;
int i, fh, length, line_number;
char node_name[256], attrib_name[256], attrib_value[1000];
char *p, *pv;
int i, line_number;
PMXML_NODE root, ptree, pnew;
int end_element;
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;
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)
/* 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;
assert(tree);
writer = mxml_open_document(file_name);
writer = mxml_open_file(file_name);
if (!writer)
return FALSE;
@@ -1255,7 +1315,7 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
if (!mxml_write_subtree(writer, &tree->child[i]))
return FALSE;
if (!mxml_close_document(writer))
if (!mxml_close_file(writer))
return FALSE;
return TRUE;
+5 -2
View File
@@ -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_end_element(MXML_WRITER *writer);
int mxml_write_attribute(MXML_WRITER *writer, const char *name, 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);
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_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);
void mxml_debug_tree(PMXML_NODE tree, int level);
void mxml_free_tree(PMXML_NODE tree);