mirror of
https://gitea.psi.ch/ELOG/elog.git
synced 2026-09-14 20:33:48 +00:00
Removed Log since this file is also used in the midas CVS
SVN revision: 1268
This commit is contained in:
parent
8d37d8c8be
commit
626f44a117
156
src/mxml.c
156
src/mxml.c
@ -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, "<");
|
strcpy(pd, "<");
|
||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*------------------------------------------------------------------*/
|
/*------------------------------------------------------------------*/
|
||||||
|
|||||||
18
src/mxml.h
18
src/mxml.h
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user