forked from SWI-Prolog/packages-sgml
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.h
239 lines (203 loc) · 7.59 KB
/
parser.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
/* $Id$
Part of SWI-Prolog
Author: Jan Wielemaker
E-mail: [email protected]
WWW: http://www.swi-prolog.org
Copyright (C): 1985-2002, University of Amsterdam
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SGML_PARSER_H_INCLUDED
#define SGML_PARSER_H_INCLUDED
#include "util.h"
#include <wchar.h>
/*******************************
* CALL-BACK *
*******************************/
/* sgml_attribute->flags */
#define SGML_AT_DEFAULT 0x1
typedef struct _sgml_attribute
{ struct /* so we can free members */
{ wchar_t *textW; /* UCS textual value */
long number; /* numeric value/length */
} value;
dtd_attr *definition; /* DTD definition */
unsigned flags; /* additional flags */
} sgml_attribute;
typedef struct _dtd_parser *dtd_parser_p;
typedef int (*sgml_begin_element_f)(dtd_parser_p parser,
dtd_element *e,
int argc,
sgml_attribute *argv);
typedef int (*sgml_end_element_f)(dtd_parser_p parser,
dtd_element *e);
typedef int (*sgml_data_f)(dtd_parser_p parser,
data_type type, int len, const wchar_t *text);
typedef int (*sgml_wdata_f)(dtd_parser_p parser,
data_type type, int len, const wchar_t *text);
typedef int (*sgml_entity_f)(dtd_parser_p parser,
dtd_entity *entity,
int chr);
typedef int (*sgml_pi_f)(dtd_parser_p parser, const ichar *pi);
typedef int (*sgml_error_f)(dtd_parser_p parser,
dtd_error *error);
typedef int (*sgml_decl_f)(dtd_parser_p parser, const ichar *decl);
#ifdef XMLNS
typedef int (*xmlns_f)(dtd_parser_p parser,
dtd_symbol *ns, dtd_symbol *url);
#endif
/*******************************
* PARSER AND STATES *
*******************************/
#define SGML_PARSER_MAGIC (0x834ab663)
typedef enum
{ S_PCDATA, /* between declarations */
#ifdef UTF8
S_UTF8, /* Loading UTF-8 character */
#endif
S_CDATA, /* non-parsed data */
S_RCDATA, /* CDATA+entities */
S_MSCDATA, /* <![CDATA[...]]> */
S_EMSCDATA1, /* Seen ] in S_MSCDATA */
S_EMSCDATA2, /* Seen ]] in S_MSCDATA */
S_ECDATA1, /* Seen < in CDATA */
S_ECDATA2, /* Seen </ in CDATA */
S_EMSC1, /* Seen ] in marked section */
S_EMSC2, /* Seen ]] in marked section */
S_PI, /* Seen <? */
S_PI2, /* Seen <?...? */
S_DECL0, /* Seen < */
S_DECL, /* inside a declaration */
S_MDECL0, /* Seen <! */
S_STRING, /* inside a "string" or 'string' */
S_DECLCMT0, /* Seen <...- */
S_DECLCMT, /* Seen <...-- */
S_DECLCMTE0, /* Seen <...--..- */
S_CMTO, /* Seen <!- */
S_CMT1, /* Seen <!-- */
S_CMT, /* Seen <!--X... */
S_CMTE0, /* Seem <!--...- */
S_CMTE1, /* Seem <!--...-- */
S_GROUP, /* inside [...] */
S_PENT, /* Seen % */
S_ENT0, /* Seen & */
S_ENT, /* Seen &(#|\w) */
S_ENTCR /* Seen &entity<CR> */
} dtdstate;
typedef enum
{ DCL_DTD, /* DTD Declaration */
DCL_BEGIN, /* begin-tag */
DCL_END /* end-tag */
} dcl_type;
typedef enum
{ MS_IGNORE, /* ignore this data */
MS_INCLUDE, /* process normally */
MS_CDATA, /* pass literally */
MS_RCDATA /* replace entities */
} marktype;
typedef enum
{ EV_EXPLICIT, /* Explicit event */
EV_OMITTED, /* Omitted tag event */
EV_SHORTTAG, /* SHORTTAG event: <tag/value/ */
EV_SHORTREF /* SHORTREF event */
} sgml_event_class;
typedef struct _dtd_marked
{ dtd_symbol *keyword; /* keyword of the marked section */
marktype type; /* processing type */
struct _dtd_marked *parent; /* parent marked section */
} dtd_marked;
typedef enum
{ DM_DTD, /* DTD mode: no data allowed (?) */
DM_DATA /* Environment has only elements */
} data_mode;
#ifdef XMLNS
typedef enum
{ NONS_ERROR = 0,
NONS_QUIET
} xmlnons;
#endif
typedef struct _sgml_environment
{ dtd_element *element; /* element that opened the env */
struct _dtd_state *state; /* State we are in */
#ifdef XMLNS
struct _xmlns *xmlns; /* XML namespace */
struct _xmlns *thisns; /* Name space of element */
#endif
#ifdef XMLBASE
ichar *uri_base; /* xml:base handling */
#endif
dtd_space_mode space_mode; /* How to handle blanks */
dtd_shortref *map; /* SHORTREF map */
struct _sgml_environment *parent; /* Parent environment */
int wants_net; /* I want a net */
int saved_waiting_for_net; /* saved value of waiting for net */
} sgml_environment;
/* parser->flags */
#define SGML_PARSER_NODEFS 0x01 /* don't handle default atts */
#define SGML_PARSER_QUALIFY_ATTS 0x02 /* qualify attributes in XML mode */
typedef struct _dtd_parser
{ unsigned long magic; /* SGML_PARSER_MAGIC */
dtd *dtd; /* DTD we are building */
dtdstate state; /* current state */
dtdstate cdata_state; /* S_CDATA/S_RCDATA */
dtd_marked *marked; /* marked section stack */
marktype mark_state; /* processing mode */
dtd_element *empty_element; /* empty of <tag/> seen */
sgml_environment *environments; /* Open environments */
data_mode dmode; /* How to handle characters */
int first; /* Just seen <tag> */
int waiting_for_net; /* waiting for / in <shorttag/mode/ */
icharbuf *buffer; /* buffer for temp data */
ocharbuf *cdata; /* collected character data */
int blank_cdata; /* CDATA is all blank */
int cdata_must_be_empty; /* Only shortrefs allowed here */
const ichar *etag; /* name of end-tag in CDATA */
int etaglen; /* length of end-tag */
int grouplevel; /* [..] level in declaration */
int saved; /* saved character */
dtdstate lit_saved_state; /* literal saved-state */
int encoded; /* TRUE for binary input */
dtd_shortref *map; /* SHORTREF map */
#ifdef UTF8
int utf8_decode; /* decode UTF-8 sequences? */
int utf8_char; /* building character */
int utf8_left; /* bytes left */
dtdstate utf8_saved_state; /* state from which we come */
#endif
dtd_srcloc location; /* Current location */
dtd_srcloc startloc; /* Start of last markup */
dtd_srcloc startcdata; /* Start of last cdata */
dtd_symbol *enforce_outer_element; /* Outer element to look for */
sgml_event_class event_class; /* EV_* */
xmlnons xml_no_ns; /* What if namespace does not exist? */
#ifdef XMLNS
struct _xmlns *xmlns; /* Outer xmlns declaration */
#endif
void *closure; /* client handle */
sgml_begin_element_f on_begin_element; /* start an element */
sgml_end_element_f on_end_element; /* end an element */
sgml_data_f on_data; /* process cdata */
sgml_entity_f on_entity; /* unprocessed entity */
sgml_pi_f on_pi; /* processing instruction */
sgml_error_f on_error; /* handle error */
sgml_decl_f on_decl; /* handle declarations */
#ifdef XMLNS
xmlns_f on_xmlns; /* handle new namespace */
#endif
unsigned flags; /* misc flags */
} dtd_parser;
#ifdef XMLNS
#include "xmlns.h"
#endif
extern int gripe(dtd_parser *p, dtd_error_id e, ...);
#define SGML_SUB_DOCUMENT 0x1
#endif /*SGML_PARSER_H_INCLUDED*/