1
//----------------------------------------------------------------------------
2
// Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
4
// Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.
6
// Expat - Version 2.0.0 Release Milano 0.83 (PasExpat 2.0.0 RM0.83)
7
// Pascal Port By: Milan Marusinec alias Milano
9
// http://www.pasports.org/pasexpat
12
// Permission is hereby granted, free of charge, to any person obtaining
13
// a copy of this software and associated documentation files (the
14
// "Software"), to deal in the Software without restriction, including
15
// without limitation the rights to use, copy, modify, merge, publish,
16
// distribute, sublicense, and/or sell copies of the Software, and to
17
// permit persons to whom the Software is furnished to do so, subject to
18
// the following conditions:
20
// The above copyright notice and this permission notice shall be included
21
// in all copies or substantial portions of the Software.
23
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
26
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
27
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
// [Pascal Port History] -----------------------------------------------------
33
// 10.05.2006-Milano: Unit port establishment
34
// 08.06.2006-Milano: porting
53
XML_ROLE_XML_DECL = XML_ROLE_NONE + 1;
54
XML_ROLE_INSTANCE_START = XML_ROLE_XML_DECL + 1;
55
XML_ROLE_DOCTYPE_NONE = XML_ROLE_INSTANCE_START + 1;
56
XML_ROLE_DOCTYPE_NAME = XML_ROLE_DOCTYPE_NONE + 1;
57
XML_ROLE_DOCTYPE_SYSTEM_ID = XML_ROLE_DOCTYPE_NAME + 1;
58
XML_ROLE_DOCTYPE_PUBLIC_ID = XML_ROLE_DOCTYPE_SYSTEM_ID + 1;
59
XML_ROLE_DOCTYPE_INTERNAL_SUBSET = XML_ROLE_DOCTYPE_PUBLIC_ID + 1;
60
XML_ROLE_DOCTYPE_CLOSE = XML_ROLE_DOCTYPE_INTERNAL_SUBSET + 1;
61
XML_ROLE_GENERAL_ENTITY_NAME = XML_ROLE_DOCTYPE_CLOSE + 1;
62
XML_ROLE_PARAM_ENTITY_NAME = XML_ROLE_GENERAL_ENTITY_NAME + 1;
63
XML_ROLE_ENTITY_NONE = XML_ROLE_PARAM_ENTITY_NAME + 1;
64
XML_ROLE_ENTITY_VALUE = XML_ROLE_ENTITY_NONE + 1;
65
XML_ROLE_ENTITY_SYSTEM_ID = XML_ROLE_ENTITY_VALUE + 1;
66
XML_ROLE_ENTITY_PUBLIC_ID = XML_ROLE_ENTITY_SYSTEM_ID + 1;
67
XML_ROLE_ENTITY_COMPLETE = XML_ROLE_ENTITY_PUBLIC_ID + 1;
68
XML_ROLE_ENTITY_NOTATION_NAME = XML_ROLE_ENTITY_COMPLETE + 1;
69
XML_ROLE_NOTATION_NONE = XML_ROLE_ENTITY_NOTATION_NAME + 1;
70
XML_ROLE_NOTATION_NAME = XML_ROLE_NOTATION_NONE + 1;
71
XML_ROLE_NOTATION_SYSTEM_ID = XML_ROLE_NOTATION_NAME + 1;
72
XML_ROLE_NOTATION_NO_SYSTEM_ID = XML_ROLE_NOTATION_SYSTEM_ID + 1;
73
XML_ROLE_NOTATION_PUBLIC_ID = XML_ROLE_NOTATION_NO_SYSTEM_ID + 1;
74
XML_ROLE_ATTRIBUTE_NAME = XML_ROLE_NOTATION_PUBLIC_ID + 1;
75
XML_ROLE_ATTRIBUTE_TYPE_CDATA = XML_ROLE_ATTRIBUTE_NAME + 1;
76
XML_ROLE_ATTRIBUTE_TYPE_ID = XML_ROLE_ATTRIBUTE_TYPE_CDATA + 1;
77
XML_ROLE_ATTRIBUTE_TYPE_IDREF = XML_ROLE_ATTRIBUTE_TYPE_ID + 1;
78
XML_ROLE_ATTRIBUTE_TYPE_IDREFS = XML_ROLE_ATTRIBUTE_TYPE_IDREF + 1;
79
XML_ROLE_ATTRIBUTE_TYPE_ENTITY = XML_ROLE_ATTRIBUTE_TYPE_IDREFS + 1;
80
XML_ROLE_ATTRIBUTE_TYPE_ENTITIES = XML_ROLE_ATTRIBUTE_TYPE_ENTITY + 1;
81
XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN = XML_ROLE_ATTRIBUTE_TYPE_ENTITIES + 1;
82
XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS = XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN + 1;
83
XML_ROLE_ATTRIBUTE_ENUM_VALUE = XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS + 1;
84
XML_ROLE_ATTRIBUTE_NOTATION_VALUE = XML_ROLE_ATTRIBUTE_ENUM_VALUE + 1;
85
XML_ROLE_ATTLIST_NONE = XML_ROLE_ATTRIBUTE_NOTATION_VALUE + 1;
86
XML_ROLE_ATTLIST_ELEMENT_NAME = XML_ROLE_ATTLIST_NONE + 1;
87
XML_ROLE_IMPLIED_ATTRIBUTE_VALUE = XML_ROLE_ATTLIST_ELEMENT_NAME + 1;
88
XML_ROLE_REQUIRED_ATTRIBUTE_VALUE = XML_ROLE_IMPLIED_ATTRIBUTE_VALUE + 1;
89
XML_ROLE_DEFAULT_ATTRIBUTE_VALUE = XML_ROLE_REQUIRED_ATTRIBUTE_VALUE + 1;
90
XML_ROLE_FIXED_ATTRIBUTE_VALUE = XML_ROLE_DEFAULT_ATTRIBUTE_VALUE + 1;
91
XML_ROLE_ELEMENT_NONE = XML_ROLE_FIXED_ATTRIBUTE_VALUE + 1;
92
XML_ROLE_ELEMENT_NAME = XML_ROLE_ELEMENT_NONE + 1;
93
XML_ROLE_CONTENT_ANY = XML_ROLE_ELEMENT_NAME + 1;
94
XML_ROLE_CONTENT_EMPTY = XML_ROLE_CONTENT_ANY + 1;
95
XML_ROLE_CONTENT_PCDATA = XML_ROLE_CONTENT_EMPTY + 1;
96
XML_ROLE_GROUP_OPEN = XML_ROLE_CONTENT_PCDATA + 1;
97
XML_ROLE_GROUP_CLOSE = XML_ROLE_GROUP_OPEN + 1;
98
XML_ROLE_GROUP_CLOSE_REP = XML_ROLE_GROUP_CLOSE + 1;
99
XML_ROLE_GROUP_CLOSE_OPT = XML_ROLE_GROUP_CLOSE_REP + 1;
100
XML_ROLE_GROUP_CLOSE_PLUS = XML_ROLE_GROUP_CLOSE_OPT + 1;
101
XML_ROLE_GROUP_CHOICE = XML_ROLE_GROUP_CLOSE_PLUS + 1;
102
XML_ROLE_GROUP_SEQUENCE = XML_ROLE_GROUP_CHOICE + 1;
103
XML_ROLE_CONTENT_ELEMENT = XML_ROLE_GROUP_SEQUENCE + 1;
104
XML_ROLE_CONTENT_ELEMENT_REP = XML_ROLE_CONTENT_ELEMENT + 1;
105
XML_ROLE_CONTENT_ELEMENT_OPT = XML_ROLE_CONTENT_ELEMENT_REP + 1;
106
XML_ROLE_CONTENT_ELEMENT_PLUS = XML_ROLE_CONTENT_ELEMENT_OPT + 1;
107
XML_ROLE_PI = XML_ROLE_CONTENT_ELEMENT_PLUS + 1;
108
XML_ROLE_COMMENT = XML_ROLE_PI + 1;
111
XML_ROLE_TEXT_DECL = XML_ROLE_COMMENT + 1;
112
XML_ROLE_IGNORE_SECT = XML_ROLE_TEXT_DECL + 1;
113
XML_ROLE_INNER_PARAM_ENTITY_REF = XML_ROLE_IGNORE_SECT + 1;
114
XML_ROLE_PARAM_ENTITY_REF = XML_ROLE_INNER_PARAM_ENTITY_REF + 1;
117
XML_ROLE_PARAM_ENTITY_REF = XML_ROLE_COMMENT + 1;
122
PROLOG_STATE_ptr = ^PROLOG_STATE;
123
PROLOG_STATE = record
124
handler : function(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
130
includeLevel : unsigned;
138
{ GLOBAL PROCEDURES }
139
procedure XmlPrologStateInit(state : PROLOG_STATE_ptr );
140
function XmlTokenRole (state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
144
{ LOCAL VARIABLES & CONSTANTS }
150
that ,| are not mixed in a model group
151
content of literals }
153
KW_ANY : array[0..3 ] of char = (
154
ASCII_A ,ASCII_N ,ASCII_Y ,#0 );
156
KW_ATTLIST : array[0..7 ] of char = (
157
ASCII_A ,ASCII_T ,ASCII_T ,ASCII_L ,ASCII_I ,ASCII_S ,ASCII_T ,#0 );
159
KW_CDATA : array[0..5 ] of char = (
160
ASCII_C ,ASCII_D ,ASCII_A ,ASCII_T ,ASCII_A ,#0 );
162
KW_DOCTYPE : array[0..7 ] of char = (
163
ASCII_D ,ASCII_O ,ASCII_C ,ASCII_T ,ASCII_Y ,ASCII_P ,ASCII_E ,#0 );
165
KW_ELEMENT : array[0..7 ] of char = (
166
ASCII_E ,ASCII_L ,ASCII_E ,ASCII_M ,ASCII_E ,ASCII_N ,ASCII_T ,#0 );
168
KW_EMPTY : array[0..5 ] of char = (
169
ASCII_E ,ASCII_M ,ASCII_P ,ASCII_T ,ASCII_Y ,#0 );
171
KW_ENTITIES : array[0..8 ] of char = (
172
ASCII_E ,ASCII_N ,ASCII_T ,ASCII_I ,ASCII_T ,ASCII_I ,ASCII_E ,ASCII_S ,
175
KW_ENTITY : array[0..6 ] of char = (
176
ASCII_E ,ASCII_N ,ASCII_T ,ASCII_I ,ASCII_T ,ASCII_Y ,#0 );
178
KW_FIXED : array[0..5 ] of char = (
179
ASCII_F ,ASCII_I ,ASCII_X ,ASCII_E ,ASCII_D ,#0 );
181
KW_ID : array[0..2 ] of char = (
182
ASCII_I ,ASCII_D ,#0 );
184
KW_IDREF : array[0..5 ] of char = (
185
ASCII_I ,ASCII_D ,ASCII_R ,ASCII_E ,ASCII_F ,#0 );
187
KW_IDREFS : array[0..6 ] of char = (
188
ASCII_I ,ASCII_D ,ASCII_R ,ASCII_E ,ASCII_F ,ASCII_S ,#0 );
190
KW_IGNORE : array[0..6 ] of char = (
191
ASCII_I ,ASCII_G ,ASCII_N ,ASCII_O ,ASCII_R ,ASCII_E ,#0 );
193
KW_IMPLIED : array[0..7 ] of char = (
194
ASCII_I ,ASCII_M ,ASCII_P ,ASCII_L ,ASCII_I ,ASCII_E ,ASCII_D ,#0 );
196
KW_INCLUDE : array[0..7 ] of char = (
197
ASCII_I ,ASCII_N ,ASCII_C ,ASCII_L ,ASCII_U ,ASCII_D ,ASCII_E ,#0 );
199
KW_NDATA : array[0..5 ] of char = (
200
ASCII_N ,ASCII_D ,ASCII_A ,ASCII_T ,ASCII_A ,#0 );
202
KW_NMTOKEN : array[0..7 ] of char = (
203
ASCII_N ,ASCII_M ,ASCII_T ,ASCII_O ,ASCII_K ,ASCII_E ,ASCII_N ,#0 );
205
KW_NMTOKENS : array[0..8 ] of char = (
206
ASCII_N ,ASCII_M ,ASCII_T ,ASCII_O ,ASCII_K ,ASCII_E ,ASCII_N ,ASCII_S ,
209
KW_NOTATION : array[0..8 ] of char = (
210
ASCII_N ,ASCII_O ,ASCII_T ,ASCII_A ,ASCII_T ,ASCII_I ,ASCII_O ,ASCII_N ,
213
KW_PCDATA : array[0..6 ] of char = (
214
ASCII_P ,ASCII_C ,ASCII_D ,ASCII_A ,ASCII_T ,ASCII_A ,#0 );
216
KW_PUBLIC : array[0..6 ] of char = (
217
ASCII_P ,ASCII_U ,ASCII_B ,ASCII_L ,ASCII_I ,ASCII_C ,#0 );
219
KW_REQUIRED : array[0..8 ] of char = (
220
ASCII_R ,ASCII_E ,ASCII_Q ,ASCII_U ,ASCII_I ,ASCII_R ,ASCII_E ,ASCII_D ,
223
KW_SYSTEM : array[0..6 ] of char = (
224
ASCII_S ,ASCII_Y ,ASCII_S ,ASCII_T ,ASCII_E ,ASCII_M ,#0 );
227
{ UNIT IMPLEMENTATION }
228
{ MIN_BYTES_PER_CHAR }
229
function MIN_BYTES_PER_CHAR(enc : ENCODING_ptr ) : int;
231
result:=enc.minBytesPerChar;
236
function error(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
238
result:=XML_ROLE_NONE;
243
function common(state : PROLOG_STATE_ptr; tok : int ) : int;
247
{ internalSubset {..}
248
function internalSubset(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
253
function prolog2(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
258
result:=XML_ROLE_NONE;
274
result:=XML_ROLE_COMMENT;
280
XML_TOK_INSTANCE_START :
282
state.handler:=@error;
284
result:=XML_ROLE_INSTANCE_START;
292
result:=common(state ,tok );
297
function doctype4(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
302
result:=XML_ROLE_DOCTYPE_NONE;
308
XML_TOK_OPEN_BRACKET :
310
state.handler:=@internalSubset;
312
result:=XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
320
state.handler:=@prolog2;
322
result:=XML_ROLE_DOCTYPE_CLOSE;
330
result:=common(state ,tok );
335
function doctype3(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
340
result:=XML_ROLE_DOCTYPE_NONE;
348
state.handler:=@doctype4;
350
result:=XML_ROLE_DOCTYPE_SYSTEM_ID;
358
result:=common(state ,tok );
363
function doctype2(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
368
result:=XML_ROLE_DOCTYPE_NONE;
376
state.handler:=@doctype3;
378
result:=XML_ROLE_DOCTYPE_PUBLIC_ID;
386
result:=common(state ,tok );
391
function doctype1(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
396
result:=XML_ROLE_DOCTYPE_NONE;
402
XML_TOK_OPEN_BRACKET :
404
state.handler:=@internalSubset;
406
result:=XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
414
state.handler:=@prolog2;
416
result:=XML_ROLE_DOCTYPE_CLOSE;
424
if XmlNameMatchesAscii(enc ,ptr ,end_ ,@KW_SYSTEM[0 ] ) <> 0 then
426
state.handler:=@doctype3;
428
result:=XML_ROLE_DOCTYPE_NONE;
434
if XmlNameMatchesAscii(enc ,ptr ,end_ ,@KW_PUBLIC[0 ] ) <> 0 then
436
state.handler:=@doctype2;
438
result:=XML_ROLE_DOCTYPE_NONE;
448
result:=common(state ,tok );
453
function doctype0(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
458
result:=XML_ROLE_DOCTYPE_NONE;
464
XML_TOK_NAME ,XML_TOK_PREFIXED_NAME :
466
state.handler:=@doctype1;
468
result:=XML_ROLE_DOCTYPE_NAME;
476
result:=common(state ,tok );
481
function prolog1(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
486
result:=XML_ROLE_NONE;
502
result:=XML_ROLE_COMMENT;
510
result:=XML_ROLE_NONE;
517
if XmlNameMatchesAscii(
519
char_ptr(ptrcomp(ptr ) + 2 * MIN_BYTES_PER_CHAR(enc ) ) ,
521
@KW_DOCTYPE[0 ] ) = 0 then
524
state.handler:=@doctype0;
526
result:=XML_ROLE_DOCTYPE_NONE;
532
XML_TOK_INSTANCE_START :
534
state.handler:=@error;
536
result:=XML_ROLE_INSTANCE_START;
544
result:=common(state ,tok );
549
function prolog0(state : PROLOG_STATE_ptr; tok : int; ptr ,end_ : char_ptr; enc : ENCODING_ptr ) : int;
557
state.handler:=@prolog1;
559
result:=XML_ROLE_NONE;
567
state.handler:=@prolog1;
569
result:=XML_ROLE_XML_DECL;
577
state.handler:=@prolog1;
587
state.handler:=@prolog1;
589
result:=XML_ROLE_COMMENT;
597
result:=XML_ROLE_NONE;
605
if XmlNameMatchesAscii(
607
char_ptr(ptrcomp(ptr ) + 2 * MIN_BYTES_PER_CHAR(enc ) ) ,
609
@KW_DOCTYPE[0 ] ) = 0 then
612
state.handler:=@doctype0;
614
result:=XML_ROLE_DOCTYPE_NONE;
620
XML_TOK_INSTANCE_START :
622
state.handler:=@error;
624
result:=XML_ROLE_INSTANCE_START;
633
result:=common(state ,tok );
637
{ XMLPROLOGSTATEINIT }
638
procedure XmlPrologStateInit;
640
state.handler:=@prolog0;
643
state.documentEntity:=1;
644
state.includeLevel :=0;
645
state.inEntityValue :=0;
652
function XmlTokenRole;
654
result:=state.handler(state ,tok ,ptr ,end_ ,enc );