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