You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeedu/kstars/kstars/indi/lilxml.h

253 lines
8.1 KiB

#if 0
liblilxml
Copyright (C) 2003 Elwood C. Downey
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#endif
/** \file lilxml.h
\brief A little DOM-style library to handle parsing and processing an XML file.
It only handles elements, attributes and pcdata content. <! ... > and <? ... > are silently ignored. pcdata is collected into one string, sans leading whitespace first line. \n
The following is an example of a cannonical usage for the lilxml library. Initialize a lil xml context and read an XML file in a root element.
\code
#include <lilxml.h>
LilXML *lp = newLilXML();
char errmsg[1024];
XMLEle *root, *ep;
int c;
while ((c = fgetc(stdin)) != EOF) {
root = readXMLEle (lp, c, errmsg);
if (root)
break;
if (errmsg[0])
error ("Error: %s\n", errmsg);
}
// print the tag and pcdata content of each child element within the root
for (ep = nextXMLEle (root, 1); ep != NULL; ep = nextXMLEle (root, 0))
printf ("%s: %s\n", tagXMLEle(ep), pcdataXMLEle(ep));
// finished with root element and with lil xml context
delXMLEle (root);
delLilXML (lp);
\endcode
*/
#ifndef LILXML_H
#define LILXML_H
#ifdef __cplusplus
extern "C" {
#endif
/* opaque handle types */
typedef struct _xml_att XMLAtt;
typedef struct _xml_ele XMLEle;
typedef struct _LilXML LilXML;
/**
* \defgroup lilxmlFunctions Functions to parse, process, and search XML.
*/
/*@{*/
/* creation and destruction functions */
/** \brief Create a new lilxml parser.
\return a pointer to the lilxml parser on sucess. NULL on failure.
*/
extern LilXML *newLilXML(void);
/** \brief Delete a lilxml parser.
\param lp a pointer to a lilxml parser to be deleted.
*/
extern void delLilXML (LilXML *lp);
/** \brief Delete an XML element.
\return a pointer to the XML Element to be deleted.
*/
extern void delXMLEle (XMLEle *e);
/** \brief Process an XML one char at a time.
\param lp a pointer to a lilxml parser.
\param c one character to process.
\param errmsg a buffer to store error messages if an error in parsing is encounterd.
\return When the function parses a complete valid XML element, it will return a pointer to the XML element. A NULL is returned when parsing the element is still in progress, or if a parsing error occurs. Check errmsg for errors if NULL is returned.
*/
extern XMLEle *readXMLEle (LilXML *lp, int c, char errmsg[]);
/* search functions */
/** \brief Find an XML attribute within an XML element.
\param e a pointer to the XML element to search.
\param name the attribute name to search for.
\return A pointer to the XML attribute if found or NULL on failure.
*/
extern XMLAtt *findXMLAtt (XMLEle *e, const char *name);
/** \brief Find an XML element within an XML element.
\param e a pointer to the XML element to search.
\param tag the element tag to search for.
\return A pointer to the XML element if found or NULL on failure.
*/
extern XMLEle *findXMLEle (XMLEle *e, const char *tag);
/* iteration functions */
/** \brief Iterate an XML element for a list of nesetd XML elements.
\param ep a pointer to the XML element to iterate.
\param first the index of the starting XML element. Pass 1 to start iteration from the beginning of the XML element. Pass 0 to get the next element thereater.
\return On success, a pointer to the next XML element is returned. NULL when there are no more elements.
*/
extern XMLEle *nextXMLEle (XMLEle *ep, int first);
/** \brief Iterate an XML element for a list of XML attributes.
\param ep a pointer to the XML element to iterate.
\param first the index of the starting XML attribute. Pass 1 to start iteration from the beginning of the XML element. Pass 0 to get the next attribute thereater.
\return On success, a pointer to the next XML attribute is returned. NULL when there are no more attributes.
*/
extern XMLAtt *nextXMLAtt (XMLEle *ep, int first);
/* tree functions */
/** \brief Return the parent of an XML element.
\return a pointer to the XML element parent.
*/
extern XMLEle *parentXMLEle (XMLEle *ep);
/** \brief Return the parent of an XML attribute.
\return a pointer to the XML element parent.
*/
extern XMLEle *parentXMLAtt (XMLAtt *ap);
/* access functions */
/** \brief Return the tag of an XML element.
\param ep a pointer to an XML element.
\return the tag string.
*/
extern char *tagXMLEle (XMLEle *ep);
/** \brief Return the pcdata of an XML element.
\param ep a pointer to an XML element.
\return the pcdata string on success.
*/
extern char *pcdataXMLEle (XMLEle *ep);
/** \brief Return the name of an XML attribute.
\param ap a pointer to an XML attribute.
\return the name string of the attribute.
*/
extern char *nameXMLAtt (XMLAtt *ap);
/** \brief Return the value of an XML attribute.
\param ap a pointer to an XML attribute.
\return the value string of the attribute.
*/
extern char *valuXMLAtt (XMLAtt *ap);
/** \brief Return the number of characters in pcdata in an XML element.
\param ep a pointer to an XML element.
\return the length of the pcdata string.
*/
extern int pcdatalenXMLEle (XMLEle *ep);
/** \brief Return the number of nested XML elements in a parent XML element.
\param ep a pointer to an XML element.
\return the number of nested XML elements.
*/
extern int nXMLEle (XMLEle *ep);
/** \brief Return the number of XML attributes in a parent XML element.
\param ep a pointer to an XML element.
\return the number of XML attributes within the XML element.
*/
extern int nXMLAtt (XMLEle *ep);
/* convenience functions */
/** \brief Find an XML element's attribute value.
\param ep a pointer to an XML element.
\param name the name of the XML attribute to retrieve its value.
\return the value string of an XML element on success. NULL on failure.
*/
extern const char *findXMLAttValu (XMLEle *ep, char *name);
/** \brief Handy wrapper to read one xml file.
\param fp pointer to FILE to read.
\param lp pointer to lilxml parser.
\param errmsg a buffer to store error messages on failure.
\return root element else NULL with report in errmsg[].
*/
extern XMLEle *readXMLFile (FILE *fp, LilXML *lp, char errmsg[]);
/** \brief Print an XML element.
\param fp a pointer to FILE where the print output is directed.
\param e the XML element to print.
\param level the printing level, set to 0 to print the whole element.
*/
extern void prXMLEle (FILE *fp, XMLEle *e, int level);
/* install alternatives to malloc/realloc/free */
extern void indi_xmlMalloc (void *(*newmalloc)(size_t size),
void *(*newrealloc)(void *ptr, size_t size), void (*newfree)(void *ptr));
/*@}*/
#ifdef __cplusplus
}
#endif
/* examples.
initialize a lil xml context and read an XML file in a root element
LilXML *lp = newLilXML();
char errmsg[1024];
XMLEle *root, *ep;
int c;
while ((c = fgetc(stdin)) != EOF) {
root = readXMLEle (lp, c, errmsg);
if (root)
break;
if (errmsg[0])
error ("Error: %s\n", errmsg);
}
print the tag and pcdata content of each child element within the root
for (ep = nextXMLEle (root, 1); ep != NULL; ep = nextXMLEle (root, 0))
printf ("%s: %s\n", tagXMLEle(ep), pcdataXMLEle(ep));
finished with root element and with lil xml context
delXMLEle (root);
delLilXML (lp);
*/
/* For RCS Only -- Do Not Edit
* @(#) $RCSfile$ $Date$ $Revision$ $Name: $
*/
#endif /* LILXML_H */