/src/gdal/port/cpl_minixml.h
Line  | Count  | Source (jump to first uncovered line)  | 
1  |  | /**********************************************************************  | 
2  |  |  *  | 
3  |  |  * Project:  CPL - Common Portability Library  | 
4  |  |  * Purpose:  Declarations for MiniXML Handler.  | 
5  |  |  * Author:   Frank Warmerdam, warmerdam@pobox.com  | 
6  |  |  *  | 
7  |  |  **********************************************************************  | 
8  |  |  * Copyright (c) 2001, Frank Warmerdam  | 
9  |  |  *  | 
10  |  |  * SPDX-License-Identifier: MIT  | 
11  |  |  ****************************************************************************/  | 
12  |  |  | 
13  |  | #ifndef CPL_MINIXML_H_INCLUDED  | 
14  |  | #define CPL_MINIXML_H_INCLUDED  | 
15  |  |  | 
16  |  | #include "cpl_port.h"  | 
17  |  |  | 
18  |  | /**  | 
19  |  |  * \file cpl_minixml.h  | 
20  |  |  *  | 
21  |  |  * Definitions for CPL mini XML Parser/Serializer.  | 
22  |  |  */  | 
23  |  |  | 
24  |  | CPL_C_START  | 
25  |  |  | 
26  |  | /** XML node type */  | 
27  |  | typedef enum  | 
28  |  | { | 
29  |  |     /*! Node is an element */ CXT_Element = 0,  | 
30  |  |     /*! Node is a raw text value */ CXT_Text = 1,  | 
31  |  |     /*! Node is attribute */ CXT_Attribute = 2,  | 
32  |  |     /*! Node is an XML comment. */ CXT_Comment = 3,  | 
33  |  |     /*! Node is a special literal */ CXT_Literal = 4  | 
34  |  | } CPLXMLNodeType;  | 
35  |  |  | 
36  |  | /*! @cond Doxygen_Suppress */  | 
37  |  | typedef struct CPLXMLNode CPLXMLNode;  | 
38  |  |  | 
39  |  | /*! @endcond */  | 
40  |  |  | 
41  |  | /**  | 
42  |  |  * Document node structure.  | 
43  |  |  *  | 
44  |  |  * This C structure is used to hold a single text fragment representing a  | 
45  |  |  * component of the document when parsed.   It should be allocated with the  | 
46  |  |  * appropriate CPL function, and freed with CPLDestroyXMLNode().  The structure  | 
47  |  |  * contents should not normally be altered by application code, but may be  | 
48  |  |  * freely examined by application code.  | 
49  |  |  *  | 
50  |  |  * Using the psChild and psNext pointers, a hierarchical tree structure  | 
51  |  |  * for a document can be represented as a tree of CPLXMLNode structures.  | 
52  |  |  */  | 
53  |  | struct CPLXMLNode  | 
54  |  | { | 
55  |  |     /**  | 
56  |  |      * \brief Node type  | 
57  |  |      *  | 
58  |  |      * One of CXT_Element, CXT_Text, CXT_Attribute, CXT_Comment,  | 
59  |  |      * or CXT_Literal.  | 
60  |  |      */  | 
61  |  |     CPLXMLNodeType eType;  | 
62  |  |  | 
63  |  |     /**  | 
64  |  |      * \brief Node value  | 
65  |  |      *  | 
66  |  |      * For CXT_Element this is the name of the element, without the angle  | 
67  |  |      * brackets.  Note there is a single CXT_Element even when the document  | 
68  |  |      * contains a start and end element tag.  The node represents the pair.  | 
69  |  |      * All text or other elements between the start and end tag will appear  | 
70  |  |      * as children nodes of this CXT_Element node.  | 
71  |  |      *  | 
72  |  |      * For CXT_Attribute the pszValue is the attribute name.  The value of  | 
73  |  |      * the attribute will be a CXT_Text child.  | 
74  |  |      *  | 
75  |  |      * For CXT_Text this is the text itself (value of an attribute, or a  | 
76  |  |      * text fragment between an element start and end tags.  | 
77  |  |      *  | 
78  |  |      * For CXT_Literal it is all the literal text.  Currently this is just  | 
79  |  |      * used for !DOCTYPE lines, and the value would be the entire line.  | 
80  |  |      *  | 
81  |  |      * For CXT_Comment the value is all the literal text within the comment,  | 
82  |  |      * but not including the comment start/end indicators ("<--" and "-->"). | 
83  |  |      */  | 
84  |  |     char *pszValue;  | 
85  |  |  | 
86  |  |     /**  | 
87  |  |      * \brief Next sibling.  | 
88  |  |      *  | 
89  |  |      * Pointer to next sibling, that is the next node appearing after this  | 
90  |  |      * one that has the same parent as this node.  NULL if this node is the  | 
91  |  |      * last child of the parent element.  | 
92  |  |      */  | 
93  |  |     struct CPLXMLNode *psNext;  | 
94  |  |  | 
95  |  |     /**  | 
96  |  |      * \brief Child node.  | 
97  |  |      *  | 
98  |  |      * Pointer to first child node, if any.  Only CXT_Element and CXT_Attribute  | 
99  |  |      * nodes should have children.  For CXT_Attribute it should be a single  | 
100  |  |      * CXT_Text value node, while CXT_Element can have any kind of child.  | 
101  |  |      * The full list of children for a node are identified by walking the  | 
102  |  |      * psNext's starting with the psChild node.  | 
103  |  |      */  | 
104  |  |  | 
105  |  |     struct CPLXMLNode *psChild;  | 
106  |  | };  | 
107  |  |  | 
108  |  | CPLXMLNode CPL_DLL *CPLParseXMLString(const char *);  | 
109  |  | void CPL_DLL CPLDestroyXMLNode(CPLXMLNode *);  | 
110  |  | CPLXMLNode CPL_DLL *CPLGetXMLNode(CPLXMLNode *poRoot, const char *pszPath);  | 
111  |  | #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)  | 
112  |  | /*! @cond Doxygen_Suppress */  | 
113  |  | extern "C++"  | 
114  |  | { | 
115  |  |     inline const CPLXMLNode *CPLGetXMLNode(const CPLXMLNode *poRoot,  | 
116  |  |                                            const char *pszPath)  | 
117  | 0  |     { | 
118  | 0  |         return const_cast<const CPLXMLNode *>(  | 
119  | 0  |             CPLGetXMLNode(const_cast<CPLXMLNode *>(poRoot), pszPath));  | 
120  | 0  |     }  | 
121  |  | }  | 
122  |  | /*! @endcond */  | 
123  |  | #endif  | 
124  |  | CPLXMLNode CPL_DLL *CPLSearchXMLNode(CPLXMLNode *poRoot, const char *pszTarget);  | 
125  |  | #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)  | 
126  |  | /*! @cond Doxygen_Suppress */  | 
127  |  | extern "C++"  | 
128  |  | { | 
129  |  |     inline const CPLXMLNode *CPLSearchXMLNode(const CPLXMLNode *poRoot,  | 
130  |  |                                               const char *pszTarget)  | 
131  | 0  |     { | 
132  | 0  |         return const_cast<const CPLXMLNode *>(  | 
133  | 0  |             CPLSearchXMLNode(const_cast<CPLXMLNode *>(poRoot), pszTarget));  | 
134  | 0  |     }  | 
135  |  | }  | 
136  |  | /*! @endcond */  | 
137  |  | #endif  | 
138  |  | const char CPL_DLL *CPLGetXMLValue(const CPLXMLNode *poRoot,  | 
139  |  |                                    const char *pszPath, const char *pszDefault);  | 
140  |  | CPLXMLNode CPL_DLL *CPLCreateXMLNode(CPLXMLNode *poParent, CPLXMLNodeType eType,  | 
141  |  |                                      const char *pszText);  | 
142  |  | char CPL_DLL *CPLSerializeXMLTree(const CPLXMLNode *psNode);  | 
143  |  | void CPL_DLL CPLAddXMLChild(CPLXMLNode *psParent, CPLXMLNode *psChild);  | 
144  |  | int CPL_DLL CPLRemoveXMLChild(CPLXMLNode *psParent, CPLXMLNode *psChild);  | 
145  |  | void CPL_DLL CPLAddXMLSibling(CPLXMLNode *psOlderSibling,  | 
146  |  |                               CPLXMLNode *psNewSibling);  | 
147  |  | CPLXMLNode CPL_DLL *CPLCreateXMLElementAndValue(CPLXMLNode *psParent,  | 
148  |  |                                                 const char *pszName,  | 
149  |  |                                                 const char *pszValue);  | 
150  |  | void CPL_DLL CPLAddXMLAttributeAndValue(CPLXMLNode *psParent,  | 
151  |  |                                         const char *pszName,  | 
152  |  |                                         const char *pszValue);  | 
153  |  | CPLXMLNode CPL_DLL *CPLCloneXMLTree(const CPLXMLNode *psTree);  | 
154  |  | int CPL_DLL CPLSetXMLValue(CPLXMLNode *psRoot, const char *pszPath,  | 
155  |  |                            const char *pszValue);  | 
156  |  | void CPL_DLL CPLStripXMLNamespace(CPLXMLNode *psRoot, const char *pszNameSpace,  | 
157  |  |                                   int bRecurse);  | 
158  |  | void CPL_DLL CPLCleanXMLElementName(char *);  | 
159  |  |  | 
160  |  | CPLXMLNode CPL_DLL *CPLParseXMLFile(const char *pszFilename);  | 
161  |  | int CPL_DLL CPLSerializeXMLTreeToFile(const CPLXMLNode *psTree,  | 
162  |  |                                       const char *pszFilename);  | 
163  |  |  | 
164  |  | size_t CPL_DLL CPLXMLNodeGetRAMUsageEstimate(const CPLXMLNode *psNode);  | 
165  |  |  | 
166  |  | CPL_C_END  | 
167  |  |  | 
168  |  | #if defined(__cplusplus) && !defined(CPL_SUPRESS_CPLUSPLUS)  | 
169  |  |  | 
170  |  | extern "C++"  | 
171  |  | { | 
172  |  | #ifndef DOXYGEN_SKIP  | 
173  |  | #include <memory>  | 
174  |  | #endif  | 
175  |  |  | 
176  |  |     /*! @cond Doxygen_Suppress */  | 
177  |  |     struct CPL_DLL CPLXMLTreeCloserDeleter  | 
178  |  |     { | 
179  |  |         void operator()(CPLXMLNode *psNode) const  | 
180  | 0  |         { | 
181  | 0  |             CPLDestroyXMLNode(psNode);  | 
182  | 0  |         }  | 
183  |  |     };  | 
184  |  |  | 
185  |  |     /*! @endcond */  | 
186  |  |  | 
187  |  |     /** Manage a tree of XML nodes so that all nodes are freed when the instance  | 
188  |  |      * goes out of scope.  Only the top level node should be in a  | 
189  |  |      * CPLXMLTreeCloser.  | 
190  |  |      */  | 
191  |  |     class CPL_DLL CPLXMLTreeCloser  | 
192  |  |         : public std::unique_ptr<CPLXMLNode, CPLXMLTreeCloserDeleter>  | 
193  |  |     { | 
194  |  |       public:  | 
195  |  |         /** Constructor */  | 
196  |  |         explicit CPLXMLTreeCloser(CPLXMLNode *data)  | 
197  | 0  |             : std::unique_ptr<CPLXMLNode, CPLXMLTreeCloserDeleter>(data)  | 
198  | 0  |         { | 
199  | 0  |         }  | 
200  |  |  | 
201  |  |         /** Returns a pointer to the document (root) element  | 
202  |  |          * @return the node pointer */  | 
203  |  |         CPLXMLNode *getDocumentElement();  | 
204  |  |     };  | 
205  |  |  | 
206  |  | }  // extern "C++"  | 
207  |  |  | 
208  |  | #endif /* __cplusplus */  | 
209  |  |  | 
210  |  | #endif /* CPL_MINIXML_H_INCLUDED */  |