Removed Log since this file is also used in the midas CVS

SVN revision: 1268
This commit is contained in:
Stefan Ritt 2005-03-24 08:39:21 +00:00
parent 8d37d8c8be
commit 626f44a117
2 changed files with 102 additions and 72 deletions

View File

@ -5,36 +5,36 @@
Contents: Midas XML Library Contents: Midas XML Library
$Log$ This is a simple implementation of XML functions for writing and
Revision 1.10 2005/03/23 10:02:13 ritt reading XML files. For writing an XML file from scratch, following
Fixed compiler warnings functions can be used:
Revision 1.9 2005/03/22 16:10:09 ritt writer = mxml_open_document(file_name);
Allow ' in xpath mxml_start_element(writer, name);
mxml_write_attribute(writer, name, value);
mxml_write_value(writer, value);
mxml_end_element(writer);
...
mxml_close_document(writer);
Revision 1.8 2005/03/22 14:26:19 ritt To read an XML file, the function
Implemented mxml_find_nodes()
Revision 1.7 2005/03/21 16:05:21 ritt tree = mxml_parse_file(file_name, error, sizeof(error));
Added STRLCPY_DEFINED
Revision 1.6 2005/03/21 16:02:08 ritt is used. It parses the complete XML file and stores it in a
Added code for strlcpy/cat ifndef STRLCPY_DEFINED hierarchical tree in memory. Nodes in that tree can be searched
for with
Revision 1.5 2005/03/21 07:37:22 ritt mxml_find_node(tree, xml_path);
Changed file mode
Revision 1.4 2005/03/03 15:36:05 ritt or
Fixed compiler warnings
Revision 1.3 2005/03/03 15:34:21 ritt mxml_find_nodes(tree, xml_path, &nodelist);
Implemented mxml_debug_tree()
Revision 1.2 2005/03/01 23:55:43 ritt which support a subset of the XPath specification. Another set of
Fixed compiler warnings functions is availabe to retrieve attributes and values from nodes
in the tree and for manipulating nodes, like replacing, adding and
Revision 1.1 2005/03/01 23:48:18 ritt deleting nodes.
Implemented MXML for password file
\********************************************************************/ \********************************************************************/
@ -145,6 +145,30 @@ size_t strlcat(char *dst, const char *src, size_t size)
#endif // STRLCPY_DEFINED #endif // STRLCPY_DEFINED
/*------------------------------------------------------------------*/
int mxml_write_line(MXML_WRITER *writer, char *line)
{
int len;
len = strlen(line);
if (writer->buffer) {
if (writer->buffer_len + len >= writer->buffer_size) {
writer->buffer_size += 10000;
writer->buffer = (char *)realloc(writer->buffer, writer->buffer_size);
}
strcat(writer->buffer, line);
writer->buffer_len += len;
return len;
} else {
return write(writer->fh, line, len);
}
return 0;
}
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
MXML_WRITER *mxml_open_document(const char *file_name) MXML_WRITER *mxml_open_document(const char *file_name)
@ -155,24 +179,32 @@ MXML_WRITER *mxml_open_document(const char *file_name)
MXML_WRITER *writer; MXML_WRITER *writer;
writer = (MXML_WRITER *)malloc(sizeof(MXML_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 (file_name) {
writer->fh = open(file_name, O_RDWR | O_CREAT | O_TRUNC | O_TEXT, 0644);
if (writer->fh == -1) { if (writer->fh == -1) {
sprintf(line, "Unable to open file \"%s\": ", file_name); sprintf(line, "Unable to open file \"%s\": ", file_name);
perror(line); perror(line);
free(writer); free(writer);
return NULL; return NULL;
}
} else {
writer->buffer_size = 10000;
writer->buffer = (char *)malloc(10000);
writer->buffer[0] = 0;
writer->buffer_len = 0;
} }
/* write XML header */ /* write XML header */
strcpy(line, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n"); strcpy(line, "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\n");
write(writer->fh, line, strlen(line)); mxml_write_line(writer, line);
time(&now); time(&now);
strcpy(str, ctime(&now)); strcpy(str, ctime(&now));
str[24] = 0; str[24] = 0;
sprintf(line, "<!-- created by MXML on %s -->\n", str); sprintf(line, "<!-- created by MXML on %s -->\n", str);
write(writer->fh, line, strlen(line)); mxml_write_line(writer, line);
/* initialize stack */ /* initialize stack */
writer->level = 0; writer->level = 0;
@ -186,13 +218,23 @@ MXML_WRITER *mxml_open_document(const char *file_name)
void mxml_encode(char *src, int size) void mxml_encode(char *src, int size)
/* convert '<' '>' '&' '"' ''' into &xx; */ /* convert '<' '>' '&' '"' ''' into &xx; */
{ {
char *dst, *ps, *pd; char *ps, *pd;
static char *buffer = NULL;
static int buffer_size = 1000;
assert(size); assert(size);
dst = (char*) malloc(size);
if (buffer == NULL)
buffer = (char *) malloc(buffer_size);
if (size > buffer_size) {
buffer = (char *) realloc(buffer, size*2);
buffer_size = size;
}
ps = src; ps = src;
pd = dst; pd = buffer;
for (ps = src ; *ps && (size_t)pd - (size_t)dst < (size_t)(size-10) ; ps++) { for (ps = src ; *ps && (size_t)pd - (size_t)buffer < (size_t)(size-10) ; ps++) {
switch (*ps) { switch (*ps) {
case '<': case '<':
strcpy(pd, "&lt;"); strcpy(pd, "&lt;");
@ -220,8 +262,7 @@ void mxml_encode(char *src, int size)
} }
*pd = 0; *pd = 0;
strlcpy(src, dst, size); strlcpy(src, buffer, size);
free(dst);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
@ -270,7 +311,7 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
char line[1000], name_enc[1000]; char line[1000], name_enc[1000];
if (writer->element_is_open) { if (writer->element_is_open) {
write(writer->fh, ">\n", 2); mxml_write_line(writer, ">\n");
writer->element_is_open = FALSE; writer->element_is_open = FALSE;
} }
@ -294,7 +335,7 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
writer->element_is_open = TRUE; writer->element_is_open = TRUE;
writer->data_was_written = FALSE; writer->data_was_written = FALSE;
return write(writer->fh, line, strlen(line)) == (int)strlen(line); return mxml_write_line(writer, line) == (int)strlen(line);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
@ -334,7 +375,7 @@ int mxml_end_element(MXML_WRITER *writer)
strlcat(line, ">\n", sizeof(line)); strlcat(line, ">\n", sizeof(line));
writer->data_was_written = FALSE; writer->data_was_written = FALSE;
return write(writer->fh, line, strlen(line)) == (int)strlen(line); return mxml_write_line(writer, line) == (int)strlen(line);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
@ -342,23 +383,19 @@ 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)
/* write an attribute to the currently open XML element */ /* write an attribute to the currently open XML element */
{ {
char name_enc[1000]; char name_enc[1000], val_enc[1000], line[2000];
if (!writer->element_is_open) if (!writer->element_is_open)
return FALSE; return FALSE;
write(writer->fh, " ", 1);
strcpy(name_enc, name); strcpy(name_enc, name);
mxml_encode(name_enc, sizeof(name_enc)); mxml_encode(name_enc, sizeof(name_enc));
write(writer->fh, name_enc, strlen(name_enc)); strcpy(val_enc, value);
write(writer->fh, "=\"", 2); mxml_encode(val_enc, sizeof(val_enc));
strcpy(name_enc, value); sprintf(line, " %s=\"%s\"", name_enc, val_enc);
mxml_encode(name_enc, sizeof(name_enc));
write(writer->fh, name_enc, strlen(name_enc));
write(writer->fh, "\"", 1);
return TRUE; return mxml_write_line(writer, line) == (int)strlen(line);
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
@ -366,14 +403,13 @@ int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *valu
int mxml_write_value(MXML_WRITER *writer, const char *data) int mxml_write_value(MXML_WRITER *writer, const char *data)
/* write value of an XML element, like <[name]>[value]</[name]> */ /* write value of an XML element, like <[name]>[value]</[name]> */
{ {
int i, j;
static char *data_enc; static char *data_enc;
static int data_size = 0; static int data_size = 0;
if (!writer->element_is_open) if (!writer->element_is_open)
return FALSE; return FALSE;
if (write(writer->fh, ">", 1) != 1) if (mxml_write_line(writer, ">") != 1)
return FALSE; return FALSE;
writer->element_is_open = FALSE; writer->element_is_open = FALSE;
writer->data_was_written = TRUE; writer->data_was_written = TRUE;
@ -388,32 +424,36 @@ int mxml_write_value(MXML_WRITER *writer, const char *data)
strcpy(data_enc, data); strcpy(data_enc, data);
mxml_encode(data_enc, data_size); mxml_encode(data_enc, data_size);
j = strlen(data_enc); return mxml_write_line(writer, data_enc) == (int)strlen(data_enc);
i = write(writer->fh, data_enc, j);
return i == j;
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
int mxml_close_document(MXML_WRITER *writer) char *mxml_close_document(MXML_WRITER *writer)
/* close a file opened with mxml_open_writer */ /* close a file opened with mxml_open_writer */
{ {
int i; int i;
char *p;
if (writer->element_is_open) { if (writer->element_is_open) {
writer->element_is_open = FALSE; writer->element_is_open = FALSE;
if (write(writer->fh, ">\n", 2) != 2) if (mxml_write_line(writer, ">\n") != 2)
return FALSE; return NULL;
} }
/* close remaining open levels */ /* close remaining open levels */
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;
free(writer);
return p;
}
close(writer->fh); close(writer->fh);
free(writer); free(writer);
return TRUE; return (char *)1;
} }
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/

View File

@ -5,19 +5,6 @@
Contents: Header file for mxml.c Contents: Header file for mxml.c
$Log$
Revision 1.4 2005/03/22 15:06:11 ritt
Added mxml_add_node_at()
Revision 1.3 2005/03/22 14:26:22 ritt
Implemented mxml_find_nodes()
Revision 1.2 2005/03/03 15:34:40 ritt
Implemented mxml_debug_tree()
Revision 1.1 2005/03/01 23:48:18 ritt
Implemented MXML for password file
\********************************************************************/ \********************************************************************/
/*------------------------------------------------------------------*/ /*------------------------------------------------------------------*/
@ -26,6 +13,9 @@
typedef struct { typedef struct {
int fh; int fh;
char *buffer;
int buffer_size;
int buffer_len;
int level; int level;
int element_is_open; int element_is_open;
int data_was_written; int data_was_written;
@ -53,7 +43,7 @@ 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);
int mxml_close_document(MXML_WRITER *writer); char *mxml_close_document(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);