diff options
Diffstat (limited to 'kstars/kstars/indi/lilxml.h')
-rw-r--r-- | kstars/kstars/indi/lilxml.h | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/kstars/kstars/indi/lilxml.h b/kstars/kstars/indi/lilxml.h new file mode 100644 index 00000000..98bfdd2b --- /dev/null +++ b/kstars/kstars/indi/lilxml.h @@ -0,0 +1,252 @@ +#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 */ |