1 /* markup.h -- simple XML-like string parser
2    Copyright (C) 2015 Free Software Foundation, Inc.
3 
4    This file is not part of the GNU gettext program, but is used with
5    GNU gettext.
6 
7    This is a stripped down version of GLib's gmarkup.h.  The original
8    copyright notice is as follows:
9  */
10 
11 /* gmarkup.h - Simple XML-like string parser/writer
12  *
13  *  Copyright 2000 Red Hat, Inc.
14  *
15  * GLib is free software; you can redistribute it and/or modify it
16  * under the terms of the GNU General Public License as
17  * published by the Free Software Foundation; either version 3 of the
18  * License, or (at your option) any later version.
19  *
20  * GLib is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
23  * General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public
26  * License along with GLib; see the file COPYING.LIB.  If not,
27  * see <https://www.gnu.org/licenses/>.
28  */
29 
30 #ifndef __MARKUP_H__
31 #define __MARKUP_H__ 1
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 #include <stdbool.h>
38 #include <stddef.h>
39 #include <sys/types.h>
40 
41 /**
42  * markup_parse_flags_ty:
43  * @MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG: flag you should not use
44  * @MARKUP_TREAT_CDATA_AS_TEXT: When this flag is set, CDATA marked
45  *     sections are not passed literally to the @passthrough function of
46  *     the parser. Instead, the content of the section (without the
47  *     `<![CDATA[` and `]]>`) is
48  *     passed to the @text function. This flag was added in GLib 2.12
49  * @MARKUP_PREFIX_ERROR_POSITION: Normally errors caught by GMarkup
50  *     itself have line/column information prefixed to them to let the
51  *     caller know the location of the error. When this flag is set the
52  *     location information is also prefixed to errors generated by the
53  *     #GMarkupParser implementation functions
54  * @MARKUP_IGNORE_QUALIFIED: Ignore (don't report) qualified
55  *     attributes and tags, along with their contents.  A qualified
56  *     attribute or tag is one that contains ':' in its name (ie: is in
57  *     another namespace).  Since: 2.40.
58  *
59  * Flags that affect the behaviour of the parser.
60  */
61 typedef enum
62   {
63     MARKUP_DO_NOT_USE_THIS_UNSUPPORTED_FLAG = 1 << 0,
64     MARKUP_TREAT_CDATA_AS_TEXT = 1 << 1,
65     MARKUP_PREFIX_ERROR_POSITION = 1 << 2,
66     MARKUP_IGNORE_QUALIFIED = 1 << 3
67   } markup_parse_flags_ty;
68 
69 /**
70  * markup_parse_context_ty:
71  *
72  * A parse context is used to parse a stream of bytes that
73  * you expect to contain marked-up text.
74  *
75  * See markup_parse_context_new(), #markup_parser_ty, and so
76  * on for more details.
77  */
78 typedef struct _markup_parse_context_ty markup_parse_context_ty;
79 typedef struct _markup_parser_ty markup_parser_ty;
80 
81 /**
82  * markup_parser_ty:
83  * @start_element: Callback to invoke when the opening tag of an element
84  *     is seen. The callback's @attribute_names and @attribute_values parameters
85  *     are %NULL-terminated.
86  * @end_element: Callback to invoke when the closing tag of an element
87  *     is seen. Note that this is also called for empty tags like
88  *     `<empty/>`.
89  * @text: Callback to invoke when some text is seen (text is always
90  *     inside an element). Note that the text of an element may be spread
91  *     over multiple calls of this function. If the
92  *     %MARKUP_TREAT_CDATA_AS_TEXT flag is set, this function is also
93  *     called for the content of CDATA marked sections.
94  * @passthrough: Callback to invoke for comments, processing instructions
95  *     and doctype declarations; if you're re-writing the parsed document,
96  *     write the passthrough text back out in the same position. If the
97  *     %MARKUP_TREAT_CDATA_AS_TEXT flag is not set, this function is also
98  *     called for CDATA marked sections.
99  * @error: Callback to invoke when an error occurs.
100  *
101  * Any of the fields in #markup_parser_ty can be %NULL, in which case they
102  * will be ignored. Except for the @error function, any of these callbacks
103  * can set an error; in particular the %MARKUP_ERROR_UNKNOWN_ELEMENT,
104  * %MARKUP_ERROR_UNKNOWN_ATTRIBUTE, and %MARKUP_ERROR_INVALID_CONTENT
105  * errors are intended to be set from these callbacks. If you set an error
106  * from a callback, markup_parse_context_parse() will report that error
107  * back to its caller.
108  */
109 struct _markup_parser_ty
110 {
111   /* Called for open tags <foo bar="baz"> */
112   bool (*start_element) (markup_parse_context_ty *context,
113                          const char *element_name,
114                          const char **attribute_names,
115                          const char **attribute_values,
116                          void *user_data);
117 
118   /* Called for close tags </foo> */
119   bool (*end_element) (markup_parse_context_ty *context,
120                        const char *element_name,
121                        void *user_data);
122 
123   /* Called for character data */
124   /* text is not nul-terminated */
125   bool (*text) (markup_parse_context_ty *context,
126                 const char *text,
127                 size_t text_len,
128                 void *user_data);
129 
130   /* Called for strings that should be re-saved verbatim in this same
131    * position, but are not otherwise interpretable.  At the moment
132    * this includes comments and processing instructions.
133    */
134   /* text is not nul-terminated. */
135   bool (*passthrough) (markup_parse_context_ty *context,
136                        const char *passthrough_text,
137                        size_t text_len,
138                        void *user_data);
139 
140   /* Called on error, including one set by other
141    * methods in the vtable. The GError should not be freed.
142    */
143   void (*error) (markup_parse_context_ty *context,
144                  const char *error_text,
145                  void *user_data);
146 };
147 
148 extern markup_parse_context_ty *
149        markup_parse_context_new (const markup_parser_ty *parser,
150                                  markup_parse_flags_ty flags,
151                                  void *user_data);
152 extern void markup_parse_context_free (markup_parse_context_ty *context);
153 extern bool markup_parse_context_parse (markup_parse_context_ty *context,
154                                         const char *text,
155                                         ssize_t text_len);
156 extern bool markup_parse_context_end_parse (markup_parse_context_ty *context);
157 extern const char *
158        markup_parse_context_get_error (markup_parse_context_ty *context);
159 
160 #ifdef __cplusplus
161 }
162 #endif
163 
164 #endif /* __MARKUP_H__ */
165