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__ */ |
266 | |