Imported Upstream version 2.73.3
[platform/upstream/glib.git] / glib / gmarkup.h
1 /* gmarkup.h - Simple XML-like string parser/writer
2  *
3  *  Copyright 2000 Red Hat, Inc.
4  *
5  * SPDX-License-Identifier: LGPL-2.1-or-later
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this library; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef __G_MARKUP_H__
22 #define __G_MARKUP_H__
23
24 #if !defined (__GLIB_H_INSIDE__) && !defined (GLIB_COMPILATION)
25 #error "Only <glib.h> can be included directly."
26 #endif
27
28 #include <stdarg.h>
29
30 #include <glib/gerror.h>
31 #include <glib/gslist.h>
32
33 G_BEGIN_DECLS
34
35 /**
36  * GMarkupError:
37  * @G_MARKUP_ERROR_BAD_UTF8: text being parsed was not valid UTF-8
38  * @G_MARKUP_ERROR_EMPTY: document contained nothing, or only whitespace
39  * @G_MARKUP_ERROR_PARSE: document was ill-formed
40  * @G_MARKUP_ERROR_UNKNOWN_ELEMENT: error should be set by #GMarkupParser
41  *     functions; element wasn't known
42  * @G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE: error should be set by #GMarkupParser
43  *     functions; attribute wasn't known
44  * @G_MARKUP_ERROR_INVALID_CONTENT: error should be set by #GMarkupParser
45  *     functions; content was invalid
46  * @G_MARKUP_ERROR_MISSING_ATTRIBUTE: error should be set by #GMarkupParser
47  *     functions; a required attribute was missing
48  *
49  * Error codes returned by markup parsing.
50  */
51 typedef enum
52 {
53   G_MARKUP_ERROR_BAD_UTF8,
54   G_MARKUP_ERROR_EMPTY,
55   G_MARKUP_ERROR_PARSE,
56   /* The following are primarily intended for specific GMarkupParser
57    * implementations to set.
58    */
59   G_MARKUP_ERROR_UNKNOWN_ELEMENT,
60   G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE,
61   G_MARKUP_ERROR_INVALID_CONTENT,
62   G_MARKUP_ERROR_MISSING_ATTRIBUTE
63 } GMarkupError;
64
65 /**
66  * G_MARKUP_ERROR:
67  *
68  * Error domain for markup parsing.
69  * Errors in this domain will be from the #GMarkupError enumeration.
70  * See #GError for information on error domains.
71  */
72 #define G_MARKUP_ERROR g_markup_error_quark ()
73
74 GLIB_AVAILABLE_IN_ALL
75 GQuark g_markup_error_quark (void);
76
77 /**
78  * GMarkupParseFlags:
79  * @G_MARKUP_DEFAULT_FLAGS: No special behaviour. Since: 2.74
80  * @G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use
81  * @G_MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked
82  *     sections are not passed literally to the @passthrough function of
83  *     the parser. Instead, the content of the section (without the
84  *     `<![CDATA[` and `]]>`) is
85  *     passed to the @text function. This flag was added in GLib 2.12
86  * @G_MARKUP_PREFIX_ERROR_POSITION: Normally errors caught by GMarkup
87  *     itself have line/column information prefixed to them to let the
88  *     caller know the location of the error. When this flag is set the
89  *     location information is also prefixed to errors generated by the
90  *     #GMarkupParser implementation functions
91  * @G_MARKUP_IGNORE_QUALIFIED: Ignore (don't report) qualified
92  *     attributes and tags, along with their contents.  A qualified
93  *     attribute or tag is one that contains ':' in its name (ie: is in
94  *     another namespace).  Since: 2.40.
95  *
96  * Flags that affect the behaviour of the parser.
97  */
98 typedef enum
99 {
100   G_MARKUP_DEFAULT_FLAGS GLIB_AVAILABLE_ENUMERATOR_IN_2_74 = 0,
101   G_MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
102   G_MARKUP_TREAT_CDATA_AS_TEXT              = 1 << 1,
103   G_MARKUP_PREFIX_ERROR_POSITION            = 1 << 2,
104   G_MARKUP_IGNORE_QUALIFIED                 = 1 << 3
105 } GMarkupParseFlags;
106
107 /**
108  * GMarkupParseContext:
109  *
110  * A parse context is used to parse a stream of bytes that
111  * you expect to contain marked-up text.
112  *
113  * See g_markup_parse_context_new(), #GMarkupParser, and so
114  * on for more details.
115  */
116 typedef struct _GMarkupParseContext GMarkupParseContext;
117 typedef struct _GMarkupParser GMarkupParser;
118
119 /**
120  * GMarkupParser:
121  * @start_element: Callback to invoke when the opening tag of an element
122  *     is seen. The callback's @attribute_names and @attribute_values parameters
123  *     are %NULL-terminated.
124  * @end_element: Callback to invoke when the closing tag of an element
125  *     is seen. Note that this is also called for empty tags like
126  *     `<empty/>`.
127  * @text: Callback to invoke when some text is seen (text is always
128  *     inside an element). Note that the text of an element may be spread
129  *     over multiple calls of this function. If the
130  *     %G_MARKUP_TREAT_CDATA_AS_TEXT flag is set, this function is also
131  *     called for the content of CDATA marked sections.
132  * @passthrough: Callback to invoke for comments, processing instructions
133  *     and doctype declarations; if you're re-writing the parsed document,
134  *     write the passthrough text back out in the same position. If the
135  *     %G_MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also
136  *     called for CDATA marked sections.
137  * @error: Callback to invoke when an error occurs.
138  *
139  * Any of the fields in #GMarkupParser can be %NULL, in which case they
140  * will be ignored. Except for the @error function, any of these callbacks
141  * can set an error; in particular the %G_MARKUP_ERROR_UNKNOWN_ELEMENT,
142  * %G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, and %G_MARKUP_ERROR_INVALID_CONTENT
143  * errors are intended to be set from these callbacks. If you set an error
144  * from a callback, g_markup_parse_context_parse() will report that error
145  * back to its caller.
146  */
147 struct _GMarkupParser
148 {
149   /* Called for open tags <foo bar="baz"> */
150   void (*start_element)  (GMarkupParseContext *context,
151                           const gchar         *element_name,
152                           const gchar        **attribute_names,
153                           const gchar        **attribute_values,
154                           gpointer             user_data,
155                           GError             **error);
156
157   /* Called for close tags </foo> */
158   void (*end_element)    (GMarkupParseContext *context,
159                           const gchar         *element_name,
160                           gpointer             user_data,
161                           GError             **error);
162
163   /* Called for character data */
164   /* text is not nul-terminated */
165   void (*text)           (GMarkupParseContext *context,
166                           const gchar         *text,
167                           gsize                text_len,
168                           gpointer             user_data,
169                           GError             **error);
170
171   /* Called for strings that should be re-saved verbatim in this same
172    * position, but are not otherwise interpretable.  At the moment
173    * this includes comments and processing instructions.
174    */
175   /* text is not nul-terminated. */
176   void (*passthrough)    (GMarkupParseContext *context,
177                           const gchar         *passthrough_text,
178                           gsize                text_len,
179                           gpointer             user_data,
180                           GError             **error);
181
182   /* Called on error, including one set by other
183    * methods in the vtable. The GError should not be freed.
184    */
185   void (*error)          (GMarkupParseContext *context,
186                           GError              *error,
187                           gpointer             user_data);
188 };
189
190 GLIB_AVAILABLE_IN_ALL
191 GMarkupParseContext *g_markup_parse_context_new   (const GMarkupParser *parser,
192                                                    GMarkupParseFlags    flags,
193                                                    gpointer             user_data,
194                                                    GDestroyNotify       user_data_dnotify);
195 GLIB_AVAILABLE_IN_2_36
196 GMarkupParseContext *g_markup_parse_context_ref   (GMarkupParseContext *context);
197 GLIB_AVAILABLE_IN_2_36
198 void                 g_markup_parse_context_unref (GMarkupParseContext *context);
199 GLIB_AVAILABLE_IN_ALL
200 void                 g_markup_parse_context_free  (GMarkupParseContext *context);
201 GLIB_AVAILABLE_IN_ALL
202 gboolean             g_markup_parse_context_parse (GMarkupParseContext *context,
203                                                    const gchar         *text,
204                                                    gssize               text_len,
205                                                    GError             **error);
206 GLIB_AVAILABLE_IN_ALL
207 void                 g_markup_parse_context_push  (GMarkupParseContext *context,
208                                                    const GMarkupParser *parser,
209                                                    gpointer             user_data);
210 GLIB_AVAILABLE_IN_ALL
211 gpointer             g_markup_parse_context_pop   (GMarkupParseContext *context);
212
213 GLIB_AVAILABLE_IN_ALL
214 gboolean             g_markup_parse_context_end_parse (GMarkupParseContext *context,
215                                                        GError             **error);
216 GLIB_AVAILABLE_IN_ALL
217 const gchar *        g_markup_parse_context_get_element (GMarkupParseContext *context);
218 GLIB_AVAILABLE_IN_ALL
219 const GSList *       g_markup_parse_context_get_element_stack (GMarkupParseContext *context);
220
221 /* For user-constructed error messages, has no precise semantics */
222 GLIB_AVAILABLE_IN_ALL
223 void                 g_markup_parse_context_get_position (GMarkupParseContext *context,
224                                                           gint                *line_number,
225                                                           gint                *char_number);
226 GLIB_AVAILABLE_IN_ALL
227 gpointer             g_markup_parse_context_get_user_data (GMarkupParseContext *context);
228
229 /* useful when saving */
230 GLIB_AVAILABLE_IN_ALL
231 gchar* g_markup_escape_text (const gchar *text,
232                              gssize       length);
233
234 GLIB_AVAILABLE_IN_ALL
235 gchar *g_markup_printf_escaped (const char *format,
236                                 ...) G_GNUC_PRINTF (1, 2);
237 GLIB_AVAILABLE_IN_ALL
238 gchar *g_markup_vprintf_escaped (const char *format,
239                                  va_list     args) G_GNUC_PRINTF(1, 0);
240
241 typedef enum
242 {
243   G_MARKUP_COLLECT_INVALID,
244   G_MARKUP_COLLECT_STRING,
245   G_MARKUP_COLLECT_STRDUP,
246   G_MARKUP_COLLECT_BOOLEAN,
247   G_MARKUP_COLLECT_TRISTATE,
248
249   G_MARKUP_COLLECT_OPTIONAL = (1 << 16)
250 } GMarkupCollectType;
251
252
253 /* useful from start_element */
254 GLIB_AVAILABLE_IN_ALL
255 gboolean   g_markup_collect_attributes (const gchar         *element_name,
256                                         const gchar        **attribute_names,
257                                         const gchar        **attribute_values,
258                                         GError             **error,
259                                         GMarkupCollectType   first_type,
260                                         const gchar         *first_attr,
261                                         ...);
262
263 G_END_DECLS
264
265 #endif /* __G_MARKUP_H__ */