xref: /PHP-7.4/ext/xmlrpc/libxmlrpc/xml_element.h (revision b7a7b1a6)
1 /*
2   This file is part of libXMLRPC - a C library for xml-encoded function calls.
3 
4   Author: Dan Libby (dan@libby.com)
5   Epinions.com may be contacted at feedback@epinions-inc.com
6 */
7 
8 /*
9   Copyright 2000 Epinions, Inc.
10 
11   Subject to the following 3 conditions, Epinions, Inc.  permits you, free
12   of charge, to (a) use, copy, distribute, modify, perform and display this
13   software and associated documentation files (the "Software"), and (b)
14   permit others to whom the Software is furnished to do so as well.
15 
16   1) The above copyright notice and this permission notice shall be included
17   without modification in all copies or substantial portions of the
18   Software.
19 
20   2) THE SOFTWARE IS PROVIDED "AS IS", WITHOUT ANY WARRANTY OR CONDITION OF
21   ANY KIND, EXPRESS, IMPLIED OR STATUTORY, INCLUDING WITHOUT LIMITATION ANY
22   IMPLIED WARRANTIES OF ACCURACY, MERCHANTABILITY, FITNESS FOR A PARTICULAR
23   PURPOSE OR NONINFRINGEMENT.
24 
25   3) IN NO EVENT SHALL EPINIONS, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
26   SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES OR LOST PROFITS ARISING OUT
27   OF OR IN CONNECTION WITH THE SOFTWARE (HOWEVER ARISING, INCLUDING
28   NEGLIGENCE), EVEN IF EPINIONS, INC.  IS AWARE OF THE POSSIBILITY OF SUCH
29   DAMAGES.
30 
31 */
32 
33 #ifndef __XML_ELEMENT_H__
34  #define __XML_ELEMENT_H__
35 
36 /* includes */
37 #include <stdio.h>
38 #include "queue.h"
39 #include "simplestring.h"
40 #include "encodings.h"
41 
42 #ifdef __cplusplus
43 extern "C" {
44 #endif
45 
46 /****d* enum/XML_ELEM_VERBOSITY
47  * NAME
48  *   XML_ELEM_VERBOSITY
49  * NOTES
50  *   verbosity/readability options for generated xml
51  * SEE ALSO
52  *   XML_ELEM_OUTPUT_OPTIONS
53  * SOURCE
54  */
55 typedef enum _xml_elem_verbosity {
56    xml_elem_no_white_space,    /* compact xml with no white space            */
57    xml_elem_newlines_only,     /* add newlines for enhanced readability      */
58    xml_elem_pretty             /* add newlines and indent accordint to depth */
59 } XML_ELEM_VERBOSITY;
60 /******/
61 
62 
63 /****d* enum/XML_ELEM_ESCAPING
64  * NAME
65  *   XML_ELEM_ESCAPING
66  * NOTES
67  * xml escaping options for generated xml
68  * SEE ALSO
69  *   XML_ELEM_OUTPUT_OPTIONS
70  * SOURCE
71  */
72 typedef enum _xml_elem_escaping {
73    xml_elem_no_escaping             = 0x000,
74    xml_elem_markup_escaping         = 0x002,   /* entity escape xml special chars         */
75    xml_elem_non_ascii_escaping      = 0x008,   /* entity escape chars above 127           */
76    xml_elem_non_print_escaping      = 0x010,   /* entity escape non print (illegal) chars */
77    xml_elem_cdata_escaping          = 0x020,   /* wrap in cdata section                   */
78 } XML_ELEM_ESCAPING;
79 /******/
80 
81 
82 /****s* struct/XML_ELEM_OUTPUT_OPTIONS
83  * NAME
84  *   XML_ELEM_OUTPUT_OPTIONS
85  * NOTES
86  *   defines various output options
87  * SOURCE
88  */
89 typedef struct _xml_output_options {
90    XML_ELEM_VERBOSITY           verbosity;      /* length/verbosity of xml        */
91    XML_ELEM_ESCAPING            escaping;       /* how to escape special chars    */
92    const char*                  encoding;       /* <?xml encoding="<encoding>" ?> */
93 } STRUCT_XML_ELEM_OUTPUT_OPTIONS, *XML_ELEM_OUTPUT_OPTIONS;
94 /******/
95 
96 /****s* struct/XML_ELEM_INPUT_OPTIONS
97  * NAME
98  *   XML_ELEM_INPUT_OPTIONS
99  * NOTES
100  *   defines various input options
101  * SOURCE
102  */
103 typedef struct _xml_input_options {
104   ENCODING_ID                  encoding;       /* which encoding to use.       */
105 } STRUCT_XML_ELEM_INPUT_OPTIONS, *XML_ELEM_INPUT_OPTIONS;
106 /******/
107 
108 /****s* struct/XML_ELEM_ERROR
109  * NAME
110  *   XML_ELEM_ERROR
111  * NOTES
112  *   defines an xml parser error
113  * SOURCE
114  */
115 typedef struct _xml_elem_error {
116   int parser_code;
117   const char* parser_error;
118   long line;
119   long column;
120   long byte_index;
121 } STRUCT_XML_ELEM_ERROR, *XML_ELEM_ERROR;
122 /******/
123 
124 
125 /*-************************
126 * begin xml element stuff *
127 **************************/
128 
129 /****s* struct/xml_elem_attr
130  * NAME
131  *  xml_elem_attr
132  * NOTES
133  *   representation of an xml attribute, foo="bar"
134  * SOURCE
135  */
136 typedef struct _xml_element_attr {
137    char* key;        /* attribute key   */
138    char* val;        /* attribute value */
139 } xml_element_attr;
140 /******/
141 
142 /****s* struct/xml_elem_attr
143  * NAME
144  *  xml_elem_attr
145  * NOTES
146  *   representation of an xml element, eg <candidate name="Harry Browne" party="Libertarian"/>
147  * SOURCE
148  */
149 typedef struct _xml_element {
150    const char*   name;           /* element identifier */
151    simplestring  text;           /* text contained between element begin/end pairs */
152    struct _xml_element* parent;  /* element's parent */
153 
154    queue        attrs;           /* attribute list */
155    queue        children;        /* child element list */
156 } xml_element;
157 /******/
158 
159 void xml_elem_free(xml_element* root);
160 void xml_elem_free_non_recurse(xml_element* root);
161 xml_element* xml_elem_new(void);
162 char* xml_elem_serialize_to_string(xml_element *el, XML_ELEM_OUTPUT_OPTIONS options, int *buf_len);
163 void xml_elem_serialize_to_stream(xml_element *el, FILE *output, XML_ELEM_OUTPUT_OPTIONS options);
164 xml_element* xml_elem_parse_buf(const char* in_buf, int len, XML_ELEM_INPUT_OPTIONS options, XML_ELEM_ERROR error);
165 
166 /*-**********************
167 * end xml element stuff *
168 ************************/
169 
170 /*-**********************
171 * Begin xml_element API *
172 ************************/
173 
174 /****d* VALUE/XMLRPC_MACROS
175  * NAME
176  *   Some Helpful Macros
177  * NOTES
178  *   Some macros for making life easier.  Should be self-explanatory.
179  * SEE ALSO
180  *   XMLRPC_AddValueToVector ()
181  *   XMLRPC_VectorGetValueWithID_Case ()
182  *   XMLRPC_VALUE
183  * SOURCE
184  */
185 #define xml_elem_next_element(el) ((el) ? (xml_element *)Q_Next(&el->children) : NULL)
186 #define xml_elem_head_element(el) ((el) ? (xml_element *)Q_Head(&el->children) : NULL)
187 #define xml_elem_next_attr(el) ((el) ? (xml_element_attr *)Q_Next(&el->attrs) : NULL)
188 #define xml_elem_head_attr(el) ((el) ? (xml_element_attr *)Q_Head(&el->attrs) : NULL)
189 #define xml_elem_get_name(el) (char *)((el) ? el->name : NULL)
190 #define xml_elem_get_val(el) (char *)((el) ? el->text.str : NULL)
191 /******/
192 
193 
194 /*-********************
195 * End xml_element API *
196 **********************/
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif /* __XML_ELEMENT_H__ */
203