*** empty log message ***

SVN revision: 1270
This commit is contained in:
Stefan Ritt 2005-03-24 09:22:51 +00:00
parent 96b1a48822
commit f1acbbf731
2 changed files with 123 additions and 60 deletions

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 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;

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_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);