Changeset 97
- Timestamp:
- Aug 12, 2001, 5:34:51 PM (24 years ago)
- Location:
- trunk
- Files:
-
- 15 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/encodings/base.h
r37 r97 7 7 */ 8 8 9 /* 10 *@@ XWPENCODINGMAP: 11 * entry in an 8-bit to Unicode conversion table. 12 */ 9 #if __cplusplus 10 extern "C" { 11 #endif 13 12 14 typedef struct _XWPENCODINGMAP 15 { 16 unsigned short usFrom; 17 unsigned short usUni; 18 } XWPENCODINGMAP, *PXWPENCODINGMAP; 13 #ifndef ENC_BASE_HEADER_INCLUDED 14 #define ENC_BASE_HEADER_INCLUDED 19 15 20 /* 21 *@@ XWPENCODINGID: 22 * enum identifying each encoding set which is 23 * generally supported. Each ID corresponds to 24 * one header file in include\encodings\. 25 */ 16 /* 17 *@@ XWPENCODINGMAP: 18 * entry in an 8-bit to Unicode conversion table. 19 */ 26 20 27 typedef enum _XWPENCODINGID 28 { 29 enc_cp437, 30 enc_cp737, 31 enc_cp775, 32 enc_cp850, 33 enc_cp852, 34 enc_cp855, 35 enc_cp857, 36 enc_cp860, 37 enc_cp861, 38 enc_cp862, 39 enc_cp863, 40 enc_cp864, 41 enc_cp865, 42 enc_cp866, 43 enc_cp869, 44 enc_cp874, 45 enc_cp932, 46 enc_cp936, 47 enc_cp949, 48 enc_cp950, 49 enc_cp1250, 50 enc_cp1251, 51 enc_cp1252, 52 enc_cp1253, 53 enc_cp1254, 54 enc_cp1255, 55 enc_cp1256, 56 enc_cp1257, 57 enc_cp1258, 58 enc_iso8859_1, 59 enc_iso8859_2, 60 enc_iso8859_3, 61 enc_iso8859_4, 62 enc_iso8859_5, 63 enc_iso8859_6, 64 enc_iso8859_7, 65 enc_iso8859_8, 66 enc_iso8859_9, 67 enc_iso8859_10, 68 enc_iso8859_13, 69 enc_iso8859_14, 70 enc_iso8859_15 71 } XWPENCODINGID; 21 typedef struct _XWPENCODINGMAP 22 { 23 unsigned short usFrom; 24 unsigned short usUni; 25 } XWPENCODINGMAP, *PXWPENCODINGMAP; 72 26 27 /* 28 *@@ XWPENCODINGID: 29 * enum identifying each encoding set which is 30 * generally supported. Each ID corresponds to 31 * one header file in include\encodings\. 32 */ 73 33 34 typedef enum _XWPENCODINGID 35 { 36 enc_cp437, 37 enc_cp737, 38 enc_cp775, 39 enc_cp850, 40 enc_cp852, 41 enc_cp855, 42 enc_cp857, 43 enc_cp860, 44 enc_cp861, 45 enc_cp862, 46 enc_cp863, 47 enc_cp864, 48 enc_cp865, 49 enc_cp866, 50 enc_cp869, 51 enc_cp874, 52 enc_cp932, 53 enc_cp936, 54 enc_cp949, 55 enc_cp950, 56 enc_cp1250, 57 enc_cp1251, 58 enc_cp1252, 59 enc_cp1253, 60 enc_cp1254, 61 enc_cp1255, 62 enc_cp1256, 63 enc_cp1257, 64 enc_cp1258, 65 enc_iso8859_1, 66 enc_iso8859_2, 67 enc_iso8859_3, 68 enc_iso8859_4, 69 enc_iso8859_5, 70 enc_iso8859_6, 71 enc_iso8859_7, 72 enc_iso8859_8, 73 enc_iso8859_9, 74 enc_iso8859_10, 75 enc_iso8859_13, 76 enc_iso8859_14, 77 enc_iso8859_15 78 } XWPENCODINGID; 79 80 unsigned long encDecodeUTF8(const char **ppch); 81 82 #endif 83 84 #if __cplusplus 85 } 86 #endif 87 -
trunk/include/expat/ascii.h
r36 r97 70 70 71 71 #define ASCII_TAB 0x09 72 #define ASCII_SPACE 0x20 72 #define ASCII_SPACE 0x20 73 73 #define ASCII_EXCL 0x21 74 74 #define ASCII_QUOT 0x22 -
trunk/include/expat/expat.h
r71 r97 14 14 15 15 #ifndef XMLPARSEAPI 16 # ifdef __declspec 17 # define XMLPARSEAPI __declspec(dllimport) 18 # else 19 # define XMLPARSEAPI /* nothing */ 20 # endif 21 #endif /* not defined XMLPARSEAPI */ 16 #ifdef EXPATENTRY 17 #define XMLPARSEAPI(type) type EXPATENTRY 18 // V0.9.14 (2001-08-09) [umoeller] 19 #else 20 #define XMLPARSEAPI(type) type 21 #endif 22 #endif 22 23 23 24 #ifdef __cplusplus … … 105 106 // -- XML_CQUANT_PLUS plus sign 106 107 107 const XML_Char*name;108 XML_Char *name; 108 109 109 110 unsigned int numchildren; 110 111 111 112 struct _XMLCONTENT *children; 112 113 113 } XMLCONTENT, *PXMLCONTENT; 114 114 … … 119 119 */ 120 120 121 typedef void (* EXPATENTRY XML_ElementDeclHandler) (void *userData, 122 const XML_Char *name, 123 XMLCONTENT *model); 124 125 void XMLPARSEAPI XML_SetElementDeclHandler(XML_Parser parser, 121 typedef void (*XML_ElementDeclHandler) (void *userData, 122 const XML_Char *name, 123 XMLCONTENT *model); 124 125 XMLPARSEAPI(void) 126 XML_SetElementDeclHandler(XML_Parser parser, 126 127 XML_ElementDeclHandler eldecl); 127 128 … … 136 137 */ 137 138 138 typedef void (* EXPATENTRY XML_AttlistDeclHandler) (void *userData, 139 const XML_Char *elname, 140 const XML_Char *attname, 141 const XML_Char *att_type, 142 const XML_Char *dflt, 143 int isrequired); 144 145 void XMLPARSEAPI XML_SetAttlistDeclHandler(XML_Parser parser, 139 typedef void (*XML_AttlistDeclHandler) (void *userData, 140 const XML_Char *elname, 141 const XML_Char *attname, 142 const XML_Char *att_type, 143 const XML_Char *dflt, 144 int isrequired); 145 146 XMLPARSEAPI(void) 147 XML_SetAttlistDeclHandler(XML_Parser parser, 146 148 XML_AttlistDeclHandler attdecl); 147 149 … … 155 157 */ 156 158 157 typedef void (* EXPATENTRY XML_XmlDeclHandler) (void *userData, 158 const XML_Char *version, 159 const XML_Char *encoding, 160 int standalone); 161 162 void XMLPARSEAPI XML_SetXmlDeclHandler(XML_Parser parser, 159 typedef void (*XML_XmlDeclHandler) (void *userData, 160 const XML_Char *version, 161 const XML_Char *encoding, 162 int standalone); 163 164 XMLPARSEAPI(void) 165 XML_SetXmlDeclHandler(XML_Parser parser, 163 166 XML_XmlDeclHandler xmldecl); 164 167 … … 170 173 } XML_Memory_Handling_Suite; 171 174 172 /* Constructs a new parser; encoding is the encoding specified by the external 173 protocol or null if there is none specified. */ 174 175 XML_Parser XMLPARSEAPI XML_ParserCreate(const XML_Char *encoding); 176 177 /* Constructs a new parser and namespace processor. Element type names 178 and attribute names that belong to a namespace will be expanded; 175 /* Constructs a new parser; encoding is the encoding specified by the 176 external protocol or null if there is none specified. */ 177 178 XMLPARSEAPI(XML_Parser) 179 XML_ParserCreate(const XML_Char *encoding); 180 181 /* Constructs a new parser and namespace processor. Element type 182 names and attribute names that belong to a namespace will be expanded; 179 183 unprefixed attribute names are never expanded; unprefixed element type 180 184 names are expanded only if there is a default namespace. The expanded 181 name is the concatenation of the namespace URI, the namespace separator character, 182 and the local part of the name. If the namespace separator is '\0' then 183 the namespace URI and the local part will be concatenated without any 184 separator. When a namespace is not declared, the name and prefix will be 185 passed through without expansion. */ 186 187 XML_Parser XMLPARSEAPI XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); 185 name is the concatenation of the namespace URI, the namespace 186 separator character, and the local part of the name. If the namespace 187 separator is '\0' then the namespace URI and the local part will be 188 concatenated without any separator. When a namespace is not declared, 189 the name and prefix will be passed through without expansion. */ 190 191 XMLPARSEAPI(XML_Parser) 192 XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); 188 193 189 194 … … 198 203 */ 199 204 200 XML_Parser XMLPARSEAPI XML_ParserCreate_MM(const XML_Char *encoding, 205 XMLPARSEAPI(XML_Parser) 206 XML_ParserCreate_MM(const XML_Char *encoding, 201 207 const XML_Memory_Handling_Suite *memsuite, 202 208 const XML_Char *namespaceSeparator); … … 205 211 names and values are 0 terminated. */ 206 212 207 typedef void (* EXPATENTRYXML_StartElementHandler)(void *userData,208 209 210 211 typedef void (* EXPATENTRYXML_EndElementHandler)(void *userData,212 213 typedef void (*XML_StartElementHandler)(void *userData, 214 const XML_Char *name, 215 const XML_Char **atts); 216 217 typedef void (*XML_EndElementHandler)(void *userData, 218 const XML_Char *name); 213 219 214 220 215 221 /* s is not 0 terminated. */ 216 typedef void (* EXPATENTRYXML_CharacterDataHandler)(void *userData,217 218 222 typedef void (*XML_CharacterDataHandler)(void *userData, 223 const XML_Char *s, 224 int len); 219 225 220 226 /* target and data are 0 terminated */ 221 typedef void (* EXPATENTRYXML_ProcessingInstructionHandler)(void *userData,222 223 227 typedef void (*XML_ProcessingInstructionHandler)(void *userData, 228 const XML_Char *target, 229 const XML_Char *data); 224 230 225 231 /* data is 0 terminated */ 226 typedef void (* EXPATENTRYXML_CommentHandler)(void *userData, const XML_Char *data);227 228 typedef void (* EXPATENTRYXML_StartCdataSectionHandler)(void *userData);229 typedef void (* EXPATENTRYXML_EndCdataSectionHandler)(void *userData);232 typedef void (*XML_CommentHandler)(void *userData, const XML_Char *data); 233 234 typedef void (*XML_StartCdataSectionHandler)(void *userData); 235 typedef void (*XML_EndCdataSectionHandler)(void *userData); 230 236 231 237 /* This is called for any characters in the XML document for … … 242 248 multiple calls. */ 243 249 244 typedef void (* EXPATENTRYXML_DefaultHandler)(void *userData,245 246 250 typedef void (*XML_DefaultHandler)(void *userData, 251 const XML_Char *s, 252 int len); 247 253 248 254 /* This is called for the start of the DOCTYPE declaration, before 249 255 any DTD or internal subset is parsed. */ 250 256 251 typedef void (* EXPATENTRYXML_StartDoctypeDeclHandler)(void *userData,252 253 254 255 257 typedef void (*XML_StartDoctypeDeclHandler)(void *userData, 258 const XML_Char *doctypeName, 259 const XML_Char *sysid, 260 const XML_Char *pubid, 261 int has_internal_subset); 256 262 257 263 /* This is called for the start of the DOCTYPE declaration when the 258 264 closing > is encountered, but after processing any external subset. */ 259 typedef void (* EXPATENTRYXML_EndDoctypeDeclHandler)(void *userData);265 typedef void (*XML_EndDoctypeDeclHandler)(void *userData); 260 266 261 267 /* This is called for entity declarations. The is_parameter_entity … … 275 281 */ 276 282 277 typedef void (* EXPATENTRY XML_EntityDeclHandler)(void *userData, 278 const XML_Char *entityName, 279 int is_parameter_entity, 280 const XML_Char *value, 281 int value_length, 282 const XML_Char *base, 283 const XML_Char *systemId, 284 const XML_Char *publicId, 285 const XML_Char *notationName); 286 287 void XMLPARSEAPI XML_SetEntityDeclHandler(XML_Parser parser, 288 XML_EntityDeclHandler handler); 283 typedef void (*XML_EntityDeclHandler) (void *userData, 284 const XML_Char *entityName, 285 int is_parameter_entity, 286 const XML_Char *value, 287 int value_length, 288 const XML_Char *base, 289 const XML_Char *systemId, 290 const XML_Char *publicId, 291 const XML_Char *notationName); 292 293 XMLPARSEAPI(void) 294 XML_SetEntityDeclHandler(XML_Parser parser, 295 XML_EntityDeclHandler handler); 289 296 290 297 /* OBSOLETE -- OBSOLETE -- OBSOLETE … … 296 303 The other arguments may be. */ 297 304 298 typedef void (* EXPATENTRYXML_UnparsedEntityDeclHandler)(void *userData,299 const XML_Char *entityName,300 const XML_Char *base,301 const XML_Char *systemId,302 const XML_Char *publicId,303 const XML_Char *notationName);305 typedef void (*XML_UnparsedEntityDeclHandler)(void *userData, 306 const XML_Char *entityName, 307 const XML_Char *base, 308 const XML_Char *systemId, 309 const XML_Char *publicId, 310 const XML_Char *notationName); 304 311 305 312 /* This is called for a declaration of notation. … … 307 314 The notationName will never be null. The other arguments can be. */ 308 315 309 typedef void (* EXPATENTRYXML_NotationDeclHandler)(void *userData,310 const XML_Char *notationName,311 const XML_Char *base,312 const XML_Char *systemId,313 const XML_Char *publicId);316 typedef void (*XML_NotationDeclHandler)(void *userData, 317 const XML_Char *notationName, 318 const XML_Char *base, 319 const XML_Char *systemId, 320 const XML_Char *publicId); 314 321 315 322 /* When namespace processing is enabled, these are called once for … … 319 326 For an xmlns="" attribute, uri will be null. */ 320 327 321 typedef void (* EXPATENTRYXML_StartNamespaceDeclHandler)(void *userData,322 const XML_Char *prefix,323 const XML_Char *uri);324 325 typedef void (* EXPATENTRYXML_EndNamespaceDeclHandler)(void *userData,326 const XML_Char *prefix);328 typedef void (*XML_StartNamespaceDeclHandler)(void *userData, 329 const XML_Char *prefix, 330 const XML_Char *uri); 331 332 typedef void (*XML_EndNamespaceDeclHandler)(void *userData, 333 const XML_Char *prefix); 327 334 328 335 /* This is called if the document is not standalone (it has an … … 332 339 ERROR_EXPAT_NOT_STANDALONE error. */ 333 340 334 typedef int (* EXPATENTRYXML_NotStandaloneHandler)(void *userData);341 typedef int (*XML_NotStandaloneHandler)(void *userData); 335 342 336 343 /* This is called for a reference to an external parsed general entity. … … 340 347 The parser argument is the parser parsing the entity containing the reference; 341 348 it can be passed as the parser argument to XML_ExternalEntityParserCreate. 342 The systemId argument is the system identifier as specified in the entity declaration;343 it will not be null.349 The systemId argument is the system identifier as specified in the entity 350 declaration; it will not be null. 344 351 The base argument is the system identifier that should be used as the base for 345 352 resolving systemId if systemId was relative; this is set by XML_SetBase; 346 353 it may be null. 347 The publicId argument is the public identifier as specified in the entity declaration,348 or null if none was specified; the whitespace in the public identifier 349 will have been normalized as required by the XML spec.354 The publicId argument is the public identifier as specified in the entity 355 declaration, or null if none was specified; the whitespace in the public 356 identifier will have been normalized as required by the XML spec. 350 357 The context argument specifies the parsing context in the format 351 358 expected by the context argument to … … 354 361 The handler should return 0 if processing should not continue because of 355 362 a fatal error in the handling of the external entity. 356 In this case the calling parser will return an ERROR_EXPAT_EXTERNAL_ENTITY_HANDLING 357 error. 358 Note that unlike other handlers the first argument is the parser, not userData. */ 359 360 typedef int (* EXPATENTRY XML_ExternalEntityRefHandler)(XML_Parser parser, 361 const XML_Char *context, 362 const XML_Char *base, 363 const XML_Char *systemId, 364 const XML_Char *publicId); 363 In this case the calling parser will return an 364 ERROR_EXPAT_EXTERNAL_ENTITY_HANDLING error. 365 Note that unlike other handlers the first argument is the parser, not 366 userData. */ 367 368 typedef int (*XML_ExternalEntityRefHandler)(void *userData, // added V0.9.14 (2001-08-09) [umoeller] 369 XML_Parser parser, 370 const XML_Char *context, 371 const XML_Char *base, 372 const XML_Char *systemId, 373 const XML_Char *publicId); 365 374 366 375 /* This structure is filled in by the XML_UnknownEncodingHandler … … 369 378 The map[b] member gives information about byte sequences 370 379 whose first byte is b. 371 If map[b] is c where c is >= 0, then b by itself encodes the Unicode scalar value c. 380 If map[b] is c where c is >= 0, then b by itself encodes the Unicode scalar 381 value c. 372 382 If map[b] is -1, then the byte sequence is malformed. 373 383 If map[b] is -n, where n >= 2, then b is the first byte of an n-byte … … 397 407 2. No character may require more than 4 bytes to encode. 398 408 399 3. All characters encoded must have Unicode scalar values <= 0xFFFF, 400 (ie characters that would be encoded by surrogates in UTF-16 401 a re not allowed). Note that this restriction doesn't apply to402 the built-insupport for UTF-8 and UTF-16.409 3. All characters encoded must have Unicode scalar values <= 0xFFFF, (i.e., 410 characters that would be encoded by surrogates in UTF-16 are not 411 allowed). Note that this restriction doesn't apply to the built-in 412 support for UTF-8 and UTF-16. 403 413 404 414 4. No Unicode character may be encoded by more than one distinct sequence 405 415 of bytes. */ 406 416 407 /* 408 *@@ XML_Encoding: 409 * structure passed with the UnknownEncodingHandler (see 410 * XML_SetUnknownEncodingHandler). 411 * 412 * The map array contains information for every possible 413 * possible leading byte in a byte sequence. 414 * 415 * -- If the corresponding value is >= 0, then it's a single byte 416 * sequence and the byte encodes that Unicode value. 417 * 418 * -- If the value is -1, then that byte is invalid as the 419 * initial byte in a sequence. 420 * 421 * -- If the value is -2, -3, or -4, then the byte is the beginning 422 * of a 2, 3, or 4 byte sequence, respectively. The actual 423 * conversion is then accomplished by a call to the function 424 * pointed at by "convert". This function should return the 425 * Unicode scalar value for the sequence or -1 if the sequence 426 * is malformed. 427 * 428 * The "convert" pointer may be null if there are only 429 * single byte codes. The data parameter passed to the 430 * convert function is the data pointer from 431 * XML_Encoding. The string s is NOT null terminated and 432 * points at the sequence of bytes to be converted. 433 * 434 * The function pointed at by "release" is called by the parser 435 * when it is finished with the encoding. It may be null. 436 */ 437 438 typedef struct _XML_Encoding 439 { 440 int map[256]; 441 void *data; 442 int (* EXPATENTRY convert)(void *data, const char *s); 443 void (* EXPATENTRY release)(void *data); 417 typedef struct { 418 int map[256]; 419 void *data; 420 int (*convert)(void *data, const char *s); 421 void (*release)(void *data); 444 422 } XML_Encoding; 445 423 446 typedef int (* EXPATENTRY XML_UnknownEncodingHandler)(void *encodingHandlerData, 447 const XML_Char *name, 448 XML_Encoding *info); 449 450 void XMLPARSEAPI XML_SetElementHandler(XML_Parser parser, 451 XML_StartElementHandler start, 452 XML_EndElementHandler end); 453 454 void XMLPARSEAPI XML_SetStartElementHandler(XML_Parser, XML_StartElementHandler); 455 456 void XMLPARSEAPI XML_SetEndElementHandler(XML_Parser, XML_EndElementHandler); 457 458 void XMLPARSEAPI XML_SetCharacterDataHandler(XML_Parser parser, 459 XML_CharacterDataHandler handler); 460 461 void XMLPARSEAPI XML_SetProcessingInstructionHandler(XML_Parser parser, 462 XML_ProcessingInstructionHandler handler); 463 void XMLPARSEAPI XML_SetCommentHandler(XML_Parser parser, 464 XML_CommentHandler handler); 465 466 void XMLPARSEAPI XML_SetCdataSectionHandler(XML_Parser parser, 467 XML_StartCdataSectionHandler start, 468 XML_EndCdataSectionHandler end); 469 470 void XMLPARSEAPI XML_SetStartCdataSectionHandler(XML_Parser parser, 424 /* This is called for an encoding that is unknown to the parser. 425 The encodingHandlerData argument is that which was passed as the 426 second argument to XML_SetUnknownEncodingHandler. 427 The name argument gives the name of the encoding as specified in 428 the encoding declaration. 429 If the callback can provide information about the encoding, 430 it must fill in the XML_Encoding structure, and return 1. 431 Otherwise it must return 0. 432 If info does not describe a suitable encoding, 433 then the parser will return an XML_UNKNOWN_ENCODING error. */ 434 435 typedef int (*XML_UnknownEncodingHandler)(void *encodingHandlerData, 436 const XML_Char *name, 437 XML_Encoding *info); 438 439 XMLPARSEAPI(void) 440 XML_SetElementHandler(XML_Parser parser, 441 XML_StartElementHandler start, 442 XML_EndElementHandler end); 443 444 XMLPARSEAPI(void) 445 XML_SetStartElementHandler(XML_Parser, XML_StartElementHandler); 446 447 XMLPARSEAPI(void) 448 XML_SetEndElementHandler(XML_Parser, XML_EndElementHandler); 449 450 XMLPARSEAPI(void) 451 XML_SetCharacterDataHandler(XML_Parser parser, 452 XML_CharacterDataHandler handler); 453 454 XMLPARSEAPI(void) 455 XML_SetProcessingInstructionHandler(XML_Parser parser, 456 XML_ProcessingInstructionHandler handler); 457 XMLPARSEAPI(void) 458 XML_SetCommentHandler(XML_Parser parser, 459 XML_CommentHandler handler); 460 461 XMLPARSEAPI(void) 462 XML_SetCdataSectionHandler(XML_Parser parser, 463 XML_StartCdataSectionHandler start, 464 XML_EndCdataSectionHandler end); 465 466 XMLPARSEAPI(void) 467 XML_SetStartCdataSectionHandler(XML_Parser parser, 471 468 XML_StartCdataSectionHandler start); 472 469 473 void XMLPARSEAPI XML_SetEndCdataSectionHandler(XML_Parser parser, 470 XMLPARSEAPI(void) 471 XML_SetEndCdataSectionHandler(XML_Parser parser, 474 472 XML_EndCdataSectionHandler end); 475 473 476 /* This sets the default handler and also inhibits expansion of internal entities. 477 The entity reference will be passed to the default handler. */ 478 479 void XMLPARSEAPI XML_SetDefaultHandler(XML_Parser parser, 474 /* This sets the default handler and also inhibits expansion of 475 internal entities. The entity reference will be passed to the default 476 handler. */ 477 478 XMLPARSEAPI(void) 479 XML_SetDefaultHandler(XML_Parser parser, 480 480 XML_DefaultHandler handler); 481 481 482 /* This sets the default handler but does not inhibit expansion of internal entities. 483 The entity reference will not be passed to the default handler. */ 484 485 void XMLPARSEAPI XML_SetDefaultHandlerExpand(XML_Parser parser, 482 /* This sets the default handler but does not inhibit expansion of 483 internal entities. The entity reference will not be passed to the 484 default handler. */ 485 486 XMLPARSEAPI(void) 487 XML_SetDefaultHandlerExpand(XML_Parser parser, 486 488 XML_DefaultHandler handler); 487 489 488 void XMLPARSEAPI XML_SetDoctypeDeclHandler(XML_Parser parser, 490 XMLPARSEAPI(void) 491 XML_SetDoctypeDeclHandler(XML_Parser parser, 489 492 XML_StartDoctypeDeclHandler start, 490 493 XML_EndDoctypeDeclHandler end); 491 494 492 void XMLPARSEAPI XML_SetStartDoctypeDeclHandler(XML_Parser parser, 495 XMLPARSEAPI(void) 496 XML_SetStartDoctypeDeclHandler(XML_Parser parser, 493 497 XML_StartDoctypeDeclHandler start); 494 498 495 void XMLPARSEAPI XML_SetEndDoctypeDeclHandler(XML_Parser parser, 499 XMLPARSEAPI(void) 500 XML_SetEndDoctypeDeclHandler(XML_Parser parser, 496 501 XML_EndDoctypeDeclHandler end); 497 502 498 void XMLPARSEAPI XML_SetUnparsedEntityDeclHandler(XML_Parser parser, 503 XMLPARSEAPI(void) 504 XML_SetUnparsedEntityDeclHandler(XML_Parser parser, 499 505 XML_UnparsedEntityDeclHandler handler); 500 506 501 void XMLPARSEAPI XML_SetNotationDeclHandler(XML_Parser parser, 507 XMLPARSEAPI(void) 508 XML_SetNotationDeclHandler(XML_Parser parser, 502 509 XML_NotationDeclHandler handler); 503 510 504 void XMLPARSEAPI XML_SetNamespaceDeclHandler(XML_Parser parser, 511 XMLPARSEAPI(void) 512 XML_SetNamespaceDeclHandler(XML_Parser parser, 505 513 XML_StartNamespaceDeclHandler start, 506 514 XML_EndNamespaceDeclHandler end); 507 515 508 void XMLPARSEAPI XML_SetStartNamespaceDeclHandler(XML_Parser parser, 516 XMLPARSEAPI(void) 517 XML_SetStartNamespaceDeclHandler(XML_Parser parser, 509 518 XML_StartNamespaceDeclHandler start); 510 519 511 void XMLPARSEAPI XML_SetEndNamespaceDeclHandler(XML_Parser parser, 520 XMLPARSEAPI(void) 521 XML_SetEndNamespaceDeclHandler(XML_Parser parser, 512 522 XML_EndNamespaceDeclHandler end); 513 523 514 void XMLPARSEAPI XML_SetNotStandaloneHandler(XML_Parser parser, 524 XMLPARSEAPI(void) 525 XML_SetNotStandaloneHandler(XML_Parser parser, 515 526 XML_NotStandaloneHandler handler); 516 527 517 void XMLPARSEAPI XML_SetExternalEntityRefHandler(XML_Parser parser, 528 XMLPARSEAPI(void) 529 XML_SetExternalEntityRefHandler(XML_Parser parser, 518 530 XML_ExternalEntityRefHandler handler); 519 531 … … 521 533 as the first argument to the external entity ref handler instead 522 534 of the parser object. */ 523 void XMLPARSEAPI XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); 524 525 void XMLPARSEAPI XML_SetUnknownEncodingHandler(XML_Parser parser, 535 XMLPARSEAPI(void) 536 XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); 537 538 XMLPARSEAPI(void) 539 XML_SetUnknownEncodingHandler(XML_Parser parser, 526 540 XML_UnknownEncodingHandler handler, 527 541 void *encodingHandlerData); … … 530 544 processing instruction or character data. It causes the corresponding 531 545 markup to be passed to the default handler. */ 532 void XML_DefaultCurrent(XML_Parser parser); 546 XMLPARSEAPI(void) 547 XML_DefaultCurrent(XML_Parser parser); 533 548 534 549 /* If do_nst is non-zero, and namespace processing is in effect, and … … 543 558 */ 544 559 545 void XMLPARSEAPI XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); 560 XMLPARSEAPI(void) 561 XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); 546 562 547 563 /* This value is passed as the userData argument to callbacks. */ 548 void XMLPARSEAPI XML_SetUserData(XML_Parser parser, void *userData); 564 XMLPARSEAPI(void) 565 XML_SetUserData(XML_Parser parser, void *userData); 549 566 550 567 /* Returns the last value set by XML_SetUserData or null. */ … … 555 572 or XML_ParseBuffer. */ 556 573 557 int XMLPARSEAPI XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); 574 XMLPARSEAPI(int) 575 XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); 558 576 559 577 /* If this function is called, then the parser will be passed … … 561 579 The userData will still be accessible using XML_GetUserData. */ 562 580 563 void XMLPARSEAPI XML_UseParserAsHandlerArg(XML_Parser parser); 564 565 /* Sets the base to be used for resolving relative URIs in system identifiers in 566 declarations. Resolving relative identifiers is left to the application: 567 this value will be passed through as the base argument to the 568 XML_ExternalEntityRefHandler, XML_NotationDeclHandler 581 XMLPARSEAPI(void) 582 XML_UseParserAsHandlerArg(XML_Parser parser); 583 584 /* Sets the base to be used for resolving relative URIs in system 585 identifiers in declarations. Resolving relative identifiers is left 586 to the application: this value will be passed through as the base 587 argument to the XML_ExternalEntityRefHandler, XML_NotationDeclHandler 569 588 and XML_UnparsedEntityDeclHandler. The base argument will be copied. 570 589 Returns zero if out of memory, non-zero otherwise. */ 571 590 572 int XMLPARSEAPI XML_SetBase(XML_Parser parser, const XML_Char *base); 573 574 const XML_Char XMLPARSEAPI * XML_GetBase(XML_Parser parser); 591 XMLPARSEAPI(int) 592 XML_SetBase(XML_Parser parser, const XML_Char *base); 593 594 XMLPARSEAPI(const XML_Char *) 595 XML_GetBase(XML_Parser parser); 575 596 576 597 /* Returns the number of the attribute/value pairs passed in last call … … 580 601 XML_StartElementHandler. */ 581 602 582 int XMLPARSEAPI XML_GetSpecifiedAttributeCount(XML_Parser parser); 603 XMLPARSEAPI(int) 604 XML_GetSpecifiedAttributeCount(XML_Parser parser); 583 605 584 606 /* Returns the index of the ID attribute passed in the last call to … … 587 609 into the atts array passed to the XML_StartElementHandler. */ 588 610 589 int XMLPARSEAPI XML_GetIdAttributeIndex(XML_Parser parser); 611 XMLPARSEAPI(int) 612 XML_GetIdAttributeIndex(XML_Parser parser); 590 613 591 614 /* Parses some input. Returns 0 if a fatal error is detected. 592 615 The last call to XML_Parse must have isFinal true; 593 616 len may be zero for this call (or any other). */ 594 int XMLPARSEAPI XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); 595 596 void XMLPARSEAPI * XML_GetBuffer(XML_Parser parser, int len); 597 598 int XMLPARSEAPI XML_ParseBuffer(XML_Parser parser, int len, int isFinal); 599 600 /* Creates an XML_Parser object that can parse an external general entity; 601 context is a '\0'-terminated string specifying the parse context; 602 encoding is a '\0'-terminated string giving the name of the externally specified encoding, 603 or null if there is no externally specified encoding. 604 The context string consists of a sequence of tokens separated by formfeeds (\f); 605 a token consisting of a name specifies that the general entity of the name 606 is open; a token of the form prefix=uri specifies the namespace for a particular 607 prefix; a token of the form =uri specifies the default namespace. 608 This can be called at any point after the first call to an ExternalEntityRefHandler 609 so longer as the parser has not yet been freed. 610 The new parser is completely independent and may safely be used in a separate thread. 611 The handlers and userData are initialized from the parser argument. 612 Returns 0 if out of memory. Otherwise returns a new XML_Parser object. */ 613 XML_Parser XMLPARSEAPI XML_ExternalEntityParserCreate(XML_Parser parser, 617 XMLPARSEAPI(int) 618 XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); 619 620 XMLPARSEAPI(void *) 621 XML_GetBuffer(XML_Parser parser, int len); 622 623 XMLPARSEAPI(int) 624 XML_ParseBuffer(XML_Parser parser, int len, int isFinal); 625 626 /* Creates an XML_Parser object that can parse an external general 627 entity; context is a '\0'-terminated string specifying the parse 628 context; encoding is a '\0'-terminated string giving the name of the 629 externally specified encoding, or null if there is no externally 630 specified encoding. The context string consists of a sequence of 631 tokens separated by formfeeds (\f); a token consisting of a name 632 specifies that the general entity of the name is open; a token of the 633 form prefix=uri specifies the namespace for a particular prefix; a 634 token of the form =uri specifies the default namespace. This can be 635 called at any point after the first call to an 636 ExternalEntityRefHandler so longer as the parser has not yet been 637 freed. The new parser is completely independent and may safely be 638 used in a separate thread. The handlers and userData are initialized 639 from the parser argument. Returns 0 if out of memory. Otherwise 640 returns a new XML_Parser object. */ 641 XMLPARSEAPI(XML_Parser) 642 XML_ExternalEntityParserCreate(XML_Parser parser, 614 643 const XML_Char *context, 615 644 const XML_Char *encoding); … … 621 650 }; 622 651 623 int XMLPARSEAPI XML_SetParamEntityParsing(XML_Parser parser, 624 enum XML_ParamEntityParsing parsing); 652 /* Controls parsing of parameter entities (including the external DTD 653 subset). If parsing of parameter entities is enabled, then references 654 to external parameter entities (including the external DTD subset) 655 will be passed to the handler set with 656 XML_SetExternalEntityRefHandler. The context passed will be 0. 657 Unlike external general entities, external parameter entities can only 658 be parsed synchronously. If the external parameter entity is to be 659 parsed, it must be parsed during the call to the external entity ref 660 handler: the complete sequence of XML_ExternalEntityParserCreate, 661 XML_Parse/XML_ParseBuffer and XML_ParserFree calls must be made during 662 this call. After XML_ExternalEntityParserCreate has been called to 663 create the parser for the external parameter entity (context must be 0 664 for this call), it is illegal to make any calls on the old parser 665 until XML_ParserFree has been called on the newly created parser. If 666 the library has been compiled without support for parameter entity 667 parsing (ie without XML_DTD being defined), then 668 XML_SetParamEntityParsing will return 0 if parsing of parameter 669 entities is requested; otherwise it will return non-zero. */ 670 671 XMLPARSEAPI(int) 672 XML_SetParamEntityParsing(XML_Parser parser, 673 enum XML_ParamEntityParsing parsing); 674 675 /* XMLERROR { 676 ERROR_EXPAT_NONE, 677 ERROR_EXPAT_NO_MEMORY, 678 ERROR_EXPAT_SYNTAX, 679 ERROR_EXPAT_NO_ELEMENTS, 680 ERROR_EXPAT_INVALID_TOKEN, 681 ERROR_EXPAT_UNCLOSED_TOKEN, 682 ERROR_EXPAT_PARTIAL_CHAR, 683 ERROR_EXPAT_TAG_MISMATCH, 684 ERROR_EXPAT_DUPLICATE_ATTRIBUTE, 685 ERROR_EXPAT_JUNK_AFTER_DOC_ELEMENT, 686 ERROR_EXPAT_PARAM_ENTITY_REF, 687 ERROR_EXPAT_UNDEFINED_ENTITY, 688 ERROR_EXPAT_RECURSIVE_ENTITY_REF, 689 ERROR_EXPAT_ASYNC_ENTITY, 690 ERROR_EXPAT_BAD_CHAR_REF, 691 ERROR_EXPAT_BINARY_ENTITY_REF, 692 ERROR_EXPAT_ATTRIBUTE_EXTERNAL_ENTITY_REF, 693 ERROR_EXPAT_MISPLACED_XML_PI, 694 ERROR_EXPAT_UNKNOWN_ENCODING, 695 ERROR_EXPAT_INCORRECT_ENCODING, 696 ERROR_EXPAT_UNCLOSED_CDATA_SECTION, 697 ERROR_EXPAT_EXTERNAL_ENTITY_HANDLING, 698 ERROR_EXPAT_NOT_STANDALONE, 699 ERROR_EXPAT_UNEXPECTED_STATE 700 }; */ 625 701 626 702 #define ERROR_XML_FIRST 40000 // first error code used … … 656 732 returns information about the error. */ 657 733 658 XMLERROR XMLPARSEAPI XML_GetErrorCode(XML_Parser parser); 734 XMLPARSEAPI(XMLERROR) 735 XML_GetErrorCode(XML_Parser parser); 659 736 660 737 /* These functions return information about the current parse location. … … 666 743 of the sequence of characters that generated the event. */ 667 744 668 int XMLPARSEAPIXML_GetCurrentLineNumber(XML_Parser parser);669 int XMLPARSEAPIXML_GetCurrentColumnNumber(XML_Parser parser);670 long XMLPARSEAPIXML_GetCurrentByteIndex(XML_Parser parser);745 XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); 746 XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); 747 XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); 671 748 672 749 /* Return the number of bytes in the current event. 673 750 Returns 0 if the event is in an internal entity. */ 674 751 675 int XMLPARSEAPI XML_GetCurrentByteCount(XML_Parser parser); 752 XMLPARSEAPI(int) 753 XML_GetCurrentByteCount(XML_Parser parser); 676 754 677 755 /* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets … … 679 757 of the current parse position, and sets the integer pointed to by size 680 758 to the size of this buffer (the number of input bytes). Otherwise 681 returns a null pointer. Also returns a null pointer if a parse isn't active. 759 returns a null pointer. Also returns a null pointer if a parse isn't 760 active. 682 761 683 762 NOTE: The character pointer returned should not be used outside 684 763 the handler that makes the call. */ 685 764 686 const char XMLPARSEAPI * XML_GetInputContext(XML_Parser parser, 765 XMLPARSEAPI(const char *) 766 XML_GetInputContext(XML_Parser parser, 687 767 int *offset, 688 768 int *size); … … 694 774 695 775 /* Frees memory used by the parser. */ 696 void XMLPARSEAPI XML_ParserFree(XML_Parser parser); 776 XMLPARSEAPI(void) 777 XML_ParserFree(XML_Parser parser); 697 778 698 779 /* Returns a string describing the error. */ 699 // const XML_LChar XMLPARSEAPI * XML_ErrorString(int code); 700 // moved this to xml.c V0.9.9 (2001-02-16) [umoeller] 780 XMLPARSEAPI(const XML_LChar *) 781 XML_ErrorString(int code); 701 782 702 783 /* Return a string containing the version number of this expat */ 703 const XML_LChar XMLPARSEAPI *XML_ExpatVersion(void); 784 XMLPARSEAPI(const XML_LChar *) 785 XML_ExpatVersion(void); 786 787 typedef struct { 788 int major; 789 int minor; 790 int micro; 791 } XML_Expat_Version; 792 793 /* Return an XML_Expat_Version structure containing numeric version 794 number information for this version of expat */ 795 796 XMLPARSEAPI(XML_Expat_Version) 797 XML_ExpatVersionInfo(void); 798 799 #define XML_MAJOR_VERSION @EXPAT_MAJOR_VERSION@ 800 #define XML_MINOR_VERSION @EXPAT_MINOR_VERSION@ 801 #define XML_MICRO_VERSION @EXPAT_EDIT@ 704 802 705 803 #ifdef __cplusplus -
trunk/include/expat/expat_setup.h
r38 r97 20 20 21 21 #define XML_DTD 1 22 #define XML_BYTE_ORDER 12 23 #define XML_CONTEXT_BYTES 1024 22 24 23 25 #endif -
trunk/include/expat/xmlrole.h
r38 r97 6 6 #ifndef XmlRole_INCLUDED 7 7 #define XmlRole_INCLUDED 1 8 9 #include "expat\expat_setup.h"10 // V0.9.9 (2001-02-10) [umoeller]11 // to save the app from having to include this as well12 8 13 9 #include "expat\xmltok.h" … … 78 74 79 75 typedef struct prolog_state { 80 int (* EXPATENTRYhandler)(struct prolog_state *state,81 82 83 84 76 int (*handler)(struct prolog_state *state, 77 int tok, 78 const char *ptr, 79 const char *end, 80 const ENCODING *enc); 85 81 unsigned level; 86 82 #ifdef XML_DTD -
trunk/include/expat/xmltok.h
r38 r97 6 6 #ifndef XmlTok_INCLUDED 7 7 #define XmlTok_INCLUDED 1 8 9 #include "expat\expat_setup.h"10 // V0.9.9 (2001-02-10) [umoeller]11 // to save the app from having to include this as well12 8 13 9 #ifdef __cplusplus … … 21 17 #define XML_TOK_NONE -4 /* The string to be scanned is empty */ 22 18 #define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; 23 might be part of CRLF sequence */ 19 might be part of CRLF sequence */ 24 20 #define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ 25 21 #define XML_TOK_PARTIAL -1 /* only part of a token */ … … 116 112 } POSITION; 117 113 118 typedef struct 119 { 120 const char *name; 121 const char *valuePtr; 122 const char *valueEnd; 123 char normalized; 124 } ATTRIBUTE, *PATTRIBUTE; 114 typedef struct { 115 const char *name; 116 const char *valuePtr; 117 const char *valueEnd; 118 char normalized; 119 } ATTRIBUTE; 125 120 126 121 struct encoding; 127 typedef struct encoding ENCODING, *PENCODING; 128 129 typedef int EXPATENTRY SCANNERFUNC(const ENCODING *, 130 const char *, 131 const char *, 132 const char **); 133 typedef SCANNERFUNC *PSCANNERFUNC; 134 135 struct encoding 136 { 137 PSCANNERFUNC scanners[XML_N_STATES]; 138 PSCANNERFUNC literalScanners[XML_N_LITERAL_TYPES]; 139 int (* EXPATENTRY sameName)(const ENCODING *, 140 const char *, 141 const char *); 142 int (* EXPATENTRY nameMatchesAscii)(const ENCODING *, 143 const char *, 144 const char *, 145 const char *); 146 int (* EXPATENTRY nameLength)(const ENCODING *, 147 const char *); 148 const char *(*skipS)(const ENCODING *, 149 const char *); 150 int (* EXPATENTRY getAtts)(const ENCODING *enc, 151 const char *ptr, 152 int attsMax, 153 ATTRIBUTE *atts); 154 int (* EXPATENTRY charRefNumber)(const ENCODING *enc, 155 const char *ptr); 156 int (* EXPATENTRY predefinedEntityName)(const ENCODING *, 157 const char *, 158 const char *); 159 void (* EXPATENTRY updatePosition)(const ENCODING *, 160 const char *ptr, 161 const char *end, 162 POSITION *); 163 int (* EXPATENTRY isPublicId)(const ENCODING *enc, 164 const char *ptr, 165 const char *end, 166 const char **badPtr); 167 void (* EXPATENTRY utf8Convert)(const ENCODING *enc, 168 const char **fromP, 169 const char *fromLim, 170 char **toP, 171 const char *toLim); 172 void (* EXPATENTRY utf16Convert)(const ENCODING *enc, 173 const char **fromP, 174 const char *fromLim, 175 unsigned short **toP, 176 const unsigned short *toLim); 122 typedef struct encoding ENCODING; 123 124 struct encoding { 125 int (*scanners[XML_N_STATES])(const ENCODING *, 126 const char *, 127 const char *, 128 const char **); 129 int (*literalScanners[XML_N_LITERAL_TYPES])(const ENCODING *, 130 const char *, 131 const char *, 132 const char **); 133 int (*sameName)(const ENCODING *, 134 const char *, const char *); 135 int (*nameMatchesAscii)(const ENCODING *, 136 const char *, const char *, const char *); 137 int (*nameLength)(const ENCODING *, const char *); 138 const char *(*skipS)(const ENCODING *, const char *); 139 int (*getAtts)(const ENCODING *enc, const char *ptr, 140 int attsMax, ATTRIBUTE *atts); 141 int (*charRefNumber)(const ENCODING *enc, const char *ptr); 142 int (*predefinedEntityName)(const ENCODING *, const char *, const char *); 143 void (*updatePosition)(const ENCODING *, 144 const char *ptr, 145 const char *end, 146 POSITION *); 147 int (*isPublicId)(const ENCODING *enc, const char *ptr, const char *end, 148 const char **badPtr); 149 void (*utf8Convert)(const ENCODING *enc, 150 const char **fromP, 151 const char *fromLim, 152 char **toP, 153 const char *toLim); 154 void (*utf16Convert)(const ENCODING *enc, 155 const char **fromP, 156 const char *fromLim, 157 unsigned short **toP, 158 const unsigned short *toLim); 177 159 int minBytesPerChar; 178 160 char isUtf8; … … 221 203 222 204 /* This is used for performing a 2nd-level tokenization on 223 the content of a literal that has already been returned by XmlTok. */ 205 the content of a literal that has already been returned by XmlTok. */ 224 206 225 207 #define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ … … 270 252 271 253 int XmlParseXmlDecl(int isGeneralTextEntity, 272 273 274 275 276 277 278 279 280 254 const ENCODING *enc, 255 const char *ptr, 256 const char *end, 257 const char **badPtr, 258 const char **versionPtr, 259 const char **versionEndPtr, 260 const char **encodingNamePtr, 261 const ENCODING **namedEncodingPtr, 262 int *standalonePtr); 281 263 282 264 int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); … … 289 271 ENCODING * 290 272 XmlInitUnknownEncoding(void *mem, 291 292 293 273 int *table, 274 int (*conv)(void *userData, const char *p), 275 void *userData); 294 276 295 277 int XmlParseXmlDeclNS(int isGeneralTextEntity, 296 297 298 299 300 301 302 303 304 278 const ENCODING *enc, 279 const char *ptr, 280 const char *end, 281 const char **badPtr, 282 const char **versionPtr, 283 const char **versionEndPtr, 284 const char **encodingNamePtr, 285 const ENCODING **namedEncodingPtr, 286 int *standalonePtr); 305 287 int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); 306 288 const ENCODING *XmlGetUtf8InternalEncodingNS(void); … … 308 290 ENCODING * 309 291 XmlInitUnknownEncodingNS(void *mem, 310 311 312 292 int *table, 293 int (*conv)(void *userData, const char *p), 294 void *userData); 313 295 #ifdef __cplusplus 314 296 } -
trunk/include/helpers/xml.h
r84 r97 85 85 #define ERROR_DOM_DUPLICATE_ATTRIBUTE (ERROR_XML_FIRST + 43) 86 86 87 // @@@todo these88 87 #define ERROR_DOM_VALIDATE_INVALID_ELEMENT (ERROR_XML_FIRST + 44) 89 88 #define ERROR_DOM_ELEMENT_DECL_OUTSIDE_DOCTYPE (ERROR_XML_FIRST + 45) 90 89 #define ERROR_DOM_ATTLIST_DECL_OUTSIDE_DOCTYPE (ERROR_XML_FIRST + 46) 90 91 #define ERROR_DOM_INCOMPLETE_ENCODING_MAP (ERROR_XML_FIRST + 47) 92 // callback to UnknownEncodingHandler has provided 93 // an incomplete encoding map V0.9.14 (2001-08-09) [umoeller] 94 95 #define ERROR_DOM_INVALID_EXTERNAL_HANDLER (ERROR_XML_FIRST + 48) 91 96 92 97 const char* xmlDescribeError(int code); … … 619 624 ********************************************************************/ 620 625 626 typedef struct _XMLDOM *PXMLDOM; 627 628 typedef int APIENTRY FNGETCPDATA(PXMLDOM pDom, ULONG ulCP, int *piMap); 629 typedef FNGETCPDATA *PFNGETCPDATA; 630 631 typedef APIRET APIENTRY FNEXTERNALHANDLER(PXMLDOM pDom, 632 XML_Parser *pSubParser, 633 const char *pcszSystemID, 634 const char *pcszPublicID); 635 typedef FNEXTERNALHANDLER *PFNEXTERNALHANDLER; 636 621 637 /* 622 638 *@@ XMLDOM: … … 638 654 // != NULL only if the document has a DOCTYPE 639 655 640 APIRET arcDOM; // validation errors etc. 641 BOOL fInvalid; // TRUE after validation failed 642 643 const char *pcszErrorDescription; 644 ULONG ulErrorLine; 645 ULONG ulErrorColumn; 646 PXSTRING pxstrFailingNode; // element or attribute name 656 // error handling 657 APIRET arcDOM; // validation errors etc.; 658 // if != 0, this has a detailed 659 // expat or DOM error code 660 BOOL fInvalid; // TRUE if validation failed 661 // (parser error otherwise) 662 663 const char *pcszErrorDescription; // error description 664 PXSTRING pxstrSystemID; // system ID of external entity 665 // where error occured, or NULL 666 // if in main document 667 ULONG ulErrorLine; // line where error occured 668 ULONG ulErrorColumn; // column where error occured 669 PXSTRING pxstrFailingNode; // element or attribute name 670 // or NULL 647 671 648 672 /* … … 650 674 */ 651 675 676 // params copied from xmlCreateDOM 677 ULONG flParserFlags; 678 PFNGETCPDATA pfnGetCPData; 679 PFNEXTERNALHANDLER pfnExternalHandler; 680 PVOID pvCallbackUser; 681 652 682 XML_Parser pParser; 653 683 // expat parser instance … … 662 692 // cache for attribute declarations according 663 693 // to attdecl element name 664 } XMLDOM , *PXMLDOM;694 } XMLDOM; 665 695 666 696 #define DF_PARSECOMMENTS 0x0001 667 697 #define DF_PARSEDTD 0x0002 668 698 #define DF_FAIL_IF_NO_DTD 0x0004 699 #define DF_DROP_WHITESPACE 0x0008 669 700 670 701 APIRET xmlCreateDOM(ULONG flParserFlags, 702 PFNGETCPDATA pfnGetCPData, 703 PFNEXTERNALHANDLER pfnExternalHandler, 704 PVOID pvCallbackUser, 671 705 PXMLDOM *ppDom); 672 706 -
trunk/src/helpers/encodings.c
r63 r97 127 127 } 128 128 129 129 /* 130 *@@ encDecodeUTF8: 131 * decodes one UTF-8 character and returns 132 * the Unicode value or -1 if the character 133 * is invalid. 134 * 135 * On input, *ppch is assumed to point to 136 * the first byte of the UTF-8 char to be 137 * read. 138 * 139 * This function will advance *ppch by at 140 * least one byte (or more if the UTF-8 141 * char initially pointed to introduces 142 * a multi-byte sequence). 143 * 144 * This returns -1 if *ppch points to an 145 * invalid encoding (in which case the 146 * pointer is advanced anyway). 147 * 148 * This returns 0 if **ppch points to a 149 * null character. 150 * 151 *@@added V0.9.14 (2001-08-09) [umoeller] 152 */ 153 154 unsigned long encDecodeUTF8(const char **ppch) 155 { 156 unsigned long ulChar = **ppch; 157 158 if (!ulChar) 159 return 0; 160 161 // if (ulChar < 0x80): simple, one byte only... use that 162 163 if (ulChar >= 0x80) 164 { 165 unsigned long ulCount = 1; 166 int fIllegal = 0; 167 168 // note: 0xc0 and 0xc1 are reserved and 169 // cannot appear as the first UTF-8 byte 170 171 if ( (ulChar >= 0xc2) 172 && (ulChar < 0xe0) 173 ) 174 { 175 // that's two bytes 176 ulCount = 2; 177 ulChar &= 0x1f; 178 } 179 else if ((ulChar & 0xf0) == 0xe0) 180 { 181 // three bytes 182 ulCount = 3; 183 ulChar &= 0x0f; 184 } 185 else if ((ulChar & 0xf8) == 0xf0) 186 { 187 // four bytes 188 ulCount = 4; 189 ulChar &= 0x07; 190 } 191 else if ((ulChar & 0xfc) == 0xf8) 192 { 193 // five bytes 194 ulCount = 5; 195 ulChar &= 0x03; 196 } 197 else if ((ulChar & 0xfe) == 0xfc) 198 { 199 // six bytes 200 ulCount = 6; 201 ulChar &= 0x01; 202 } 203 else 204 ++fIllegal; 205 206 if (!fIllegal) 207 { 208 // go for the second and more bytes then 209 int ul2; 210 211 for (ul2 = 1; 212 ul2 < ulCount; 213 ++ul2) 214 { 215 unsigned long ulChar2 = *((*ppch) + ul2); 216 217 if (!(ulChar2 & 0xc0)) // != 0x80) 218 { 219 ++fIllegal; 220 break; 221 } 222 223 ulChar <<= 6; 224 ulChar |= ulChar2 & 0x3f; 225 } 226 } 227 228 if (fIllegal) 229 { 230 // skip all the following characters 231 // until we find something with bit 7 off 232 do 233 { 234 ulChar = *(++(*ppch)); 235 if (!ulChar) 236 break; 237 } while (ulChar & 0x80); 238 } 239 else 240 *ppch += ulCount; 241 } 242 else 243 (*ppch)++; 244 245 return (ulChar); 246 } 247 -
trunk/src/helpers/xml.c
r91 r97 136 136 137 137 #include "helpers\linklist.h" 138 #include "helpers\standards.h" 138 139 #include "helpers\stringh.h" 139 140 #include "helpers\tree.h" … … 171 172 const char* xmlDescribeError(int code) 172 173 { 173 s tatic const char *message[] =174 switch (code) 174 175 { 175 176 // start of expat (parser) errors 176 "Out of memory", 177 "Syntax error", 178 "No element found", 179 "Not well-formed (invalid token)", 180 "Unclosed token", 181 "Unclosed token", 182 "Mismatched tag", 183 "Duplicate attribute", 184 "Junk after root element", 185 "Illegal parameter entity reference", 186 "Undefined entity", 187 "Recursive entity reference", 188 "Asynchronous entity", 189 "Reference to invalid character number", 190 "Reference to binary entity", 191 "Reference to external entity in attribute", 192 "XML processing instruction not at start of external entity", 193 "Unknown encoding", 194 "Encoding specified in XML declaration is incorrect", 195 "Unclosed CDATA section", 196 "Error in processing external entity reference", 197 "Document is not standalone", 198 "Unexpected parser state - please send a bug report", 177 case ERROR_EXPAT_NO_MEMORY: 178 return ("Out of memory"); 179 180 case ERROR_EXPAT_SYNTAX: 181 return ("Syntax error"); 182 case ERROR_EXPAT_NO_ELEMENTS: 183 return ("No element found"); 184 case ERROR_EXPAT_INVALID_TOKEN: 185 return ("Not well-formed (invalid token)"); 186 case ERROR_EXPAT_UNCLOSED_TOKEN: 187 return ("Unclosed token"); 188 case ERROR_EXPAT_PARTIAL_CHAR: 189 return ("Unclosed token"); 190 case ERROR_EXPAT_TAG_MISMATCH: 191 return ("Mismatched tag"); 192 case ERROR_EXPAT_DUPLICATE_ATTRIBUTE: 193 return ("Duplicate attribute"); 194 case ERROR_EXPAT_JUNK_AFTER_DOC_ELEMENT: 195 return ("Junk after root element"); 196 case ERROR_EXPAT_PARAM_ENTITY_REF: 197 return ("Illegal parameter entity reference"); 198 case ERROR_EXPAT_UNDEFINED_ENTITY: 199 return ("Undefined entity"); 200 case ERROR_EXPAT_RECURSIVE_ENTITY_REF: 201 return ("Recursive entity reference"); 202 case ERROR_EXPAT_ASYNC_ENTITY: 203 return ("Asynchronous entity"); 204 case ERROR_EXPAT_BAD_CHAR_REF: 205 return ("Reference to invalid character number"); 206 case ERROR_EXPAT_BINARY_ENTITY_REF: 207 return ("Reference to binary entity"); 208 case ERROR_EXPAT_ATTRIBUTE_EXTERNAL_ENTITY_REF: 209 return ("Reference to external entity in attribute"); 210 case ERROR_EXPAT_MISPLACED_XML_PI: 211 return ("XML processing instruction not at start of external entity"); 212 case ERROR_EXPAT_UNKNOWN_ENCODING: 213 return ("Unknown encoding"); 214 case ERROR_EXPAT_INCORRECT_ENCODING: 215 return ("Encoding specified in XML declaration is incorrect"); 216 case ERROR_EXPAT_UNCLOSED_CDATA_SECTION: 217 return ("Unclosed CDATA section"); 218 case ERROR_EXPAT_EXTERNAL_ENTITY_HANDLING: 219 return ("Error in processing external entity reference"); 220 case ERROR_EXPAT_NOT_STANDALONE: 221 return ("Document is not standalone"); 222 case ERROR_EXPAT_UNEXPECTED_STATE: 223 return ("Unexpected parser state - please send a bug report"); 199 224 // end of expat (parser) errors 200 225 201 226 // start of validation errors 202 "Element has not been declared", 203 "Root element name does not match DOCTYPE name", 204 "Invalid or duplicate root element", 205 "Invalid sub-element in parent element", 206 "Duplicate element declaration", 207 "Duplicate attribute declaration", 208 "Undeclared attribute in element", 209 "Element cannot have content", 210 "Invalid attribute value", 211 "Required attribute is missing", 212 "Subelement in empty element", 213 214 "Parsing error", 215 "Validity error", 216 217 "DOM node type not supported", 218 "No DOM document", 219 "No DOM element", 220 "Duplicate doctype", 221 "Root element doesn't match doctype name", 222 "DOM integrity error", 223 "Duplicate attribute", 224 225 "Validation error: Undeclared element name", 226 "Element declaration outside doctype", 227 "Attlist declaration outside doctype" 228 }; 229 230 int code2 = code - ERROR_XML_FIRST; 231 232 if ( code2 >= 0 233 && code2 < sizeof(message) / sizeof(message[0]) 234 ) 235 return message[code2]; 236 237 return 0; 227 228 case ERROR_DOM_UNDECLARED_ELEMENT: 229 return ("Element has not been declared"); 230 case ERROR_DOM_ROOT_ELEMENT_MISNAMED: 231 return ("Root element name does not match DOCTYPE name"); 232 case ERROR_DOM_INVALID_ROOT_ELEMENT: 233 return ("Invalid or duplicate root element"); 234 235 case ERROR_DOM_INVALID_SUBELEMENT: 236 return ("Invalid sub-element in parent element"); 237 case ERROR_DOM_DUPLICATE_ELEMENT_DECL: 238 return ("Duplicate element declaration"); 239 case ERROR_DOM_DUPLICATE_ATTRIBUTE_DECL: 240 return ("Duplicate attribute declaration"); 241 case ERROR_DOM_UNDECLARED_ATTRIBUTE: 242 return ("Undeclared attribute in element"); 243 case ERROR_ELEMENT_CANNOT_HAVE_CONTENT: 244 return ("Element cannot have content"); 245 case ERROR_DOM_INVALID_ATTRIB_VALUE: 246 return ("Invalid attribute value"); 247 case ERROR_DOM_REQUIRED_ATTRIBUTE_MISSING: 248 return ("Required attribute is missing"); 249 case ERROR_DOM_SUBELEMENT_IN_EMPTY_ELEMENT: 250 return ("Subelement in empty element"); 251 252 case ERROR_DOM_PARSING: 253 return ("Parsing error"); 254 case ERROR_DOM_VALIDITY: 255 return ("Validity error"); 256 257 case ERROR_DOM_NODETYPE_NOT_SUPPORTED: 258 return ("DOM node type not supported"); 259 case ERROR_DOM_NO_DOCUMENT: 260 return ("No DOM document"); 261 case ERROR_DOM_NO_ELEMENT: 262 return ("No DOM element"); 263 case ERROR_DOM_DUPLICATE_DOCTYPE: 264 return ("Duplicate doctype"); 265 case ERROR_DOM_DOCTYPE_ROOT_NAMES_MISMATCH: 266 return ("Root element doesn't match doctype name"); 267 case ERROR_DOM_INTEGRITY: 268 return ("DOM integrity error"); 269 case ERROR_DOM_DUPLICATE_ATTRIBUTE: 270 return ("Duplicate attribute"); 271 272 case ERROR_DOM_VALIDATE_INVALID_ELEMENT: 273 return ("Validation error: Undeclared element name"); 274 case ERROR_DOM_ELEMENT_DECL_OUTSIDE_DOCTYPE: 275 return ("Element declaration outside doctype"); 276 case ERROR_DOM_ATTLIST_DECL_OUTSIDE_DOCTYPE: 277 return ("Attlist declaration outside doctype"); 278 } 279 280 return NULL; 238 281 } 239 282 … … 291 334 * 292 335 *@@added V0.9.9 (2001-02-16) [umoeller] 336 *@@changed V0.9.14 (2001-08-09) [umoeller]: fixed map bug which caused the whole XML stuff to fail 293 337 */ 294 338 … … 297 341 { 298 342 return (strhcmp(((PXSTRING)ul1)->psz, 299 ((PXSTRING)ul 1)->psz));343 ((PXSTRING)ul2)->psz)); 300 344 } 301 345 … … 354 398 * 355 399 *@@added V0.9.9 (2001-02-16) [umoeller] 400 *@@changed V0.9.14 (2001-08-09) [umoeller]: fixed crash on string delete 356 401 */ 357 402 … … 501 546 lstClear(&llDeleteNodes); 502 547 503 xstr Free(((PXSTRING*)&pNode->Tree.ulKey));548 xstrClear(&pNode->strNodeName); 504 549 free(pNode); 505 550 } … … 557 602 } 558 603 559 arc = xmlCreateNodeBase(ulNodeType, 560 cb, 561 pcszNodeName, 562 ulNodeNameLength, 563 (PNODEBASE*)&pNewNode); 564 if (arc == NO_ERROR) 604 if (!(arc = xmlCreateNodeBase(ulNodeType, 605 cb, 606 pcszNodeName, 607 ulNodeNameLength, 608 (PNODEBASE*)&pNewNode))) 565 609 { 566 610 pNewNode->pParentNode = pParentNode; … … 635 679 PDOMNODE pNew = NULL; 636 680 APIRET arc = xmlCreateDomNode(pParent, 637 DOMNODE_ELEMENT,638 pcszElement,639 0,640 &pNew);681 DOMNODE_ELEMENT, 682 pcszElement, 683 0, 684 &pNew); 641 685 642 686 if (arc == NO_ERROR) … … 753 797 PDOMNODE pNew = NULL; 754 798 APIRET arc = xmlCreateDomNode(pParent, 755 DOMNODE_COMMENT,756 NULL,757 0,758 &pNew);799 DOMNODE_COMMENT, 800 NULL, 801 0, 802 &pNew); 759 803 if (arc == NO_ERROR) 760 804 { … … 1381 1425 1382 1426 /* 1427 *@@ UnknownEncodingHandler: 1428 * @expat handler called when the xml 1429 * @text_declaration has an @encoding that is not 1430 * one of the four encodings built into expat. 1431 * 1432 * See XML_SetUnknownEncodingHandler. 1433 * 1434 *@@added V0.9.14 (2001-08-09) [umoeller] 1435 */ 1436 1437 int EXPATENTRY UnknownEncodingHandler(void *pUserData, // in: out PXMLDOM really 1438 const XML_Char *pcszName, 1439 XML_Encoding *pEncoding) 1440 { 1441 PXMLDOM pDom = (PXMLDOM)pUserData; 1442 1443 ULONG ulCP; 1444 if ( (pDom->pfnGetCPData) // callback exists? 1445 && (!strncmp(pcszName, "cp", 2)) 1446 && (strlen(pcszName) > 4) // at least five chars (e.g. "cp850") 1447 && (ulCP = atoi(pcszName + 2)) 1448 ) 1449 { 1450 // this is a PC codepage: 1451 /* typedef struct _XML_Encoding 1452 { 1453 int map[256]; 1454 void *data; 1455 int (* EXPATENTRY convert)(void *data, const char *s); 1456 void (* EXPATENTRY release)(void *data); 1457 } XML_Encoding; */ 1458 1459 // ZERO(pEncoding); 1460 1461 pEncoding->convert = NULL; 1462 pEncoding->release = NULL; 1463 1464 memset(&pEncoding->map, -1, sizeof(pEncoding->map)); 1465 1466 if (pDom->pfnGetCPData(pDom, 1467 ulCP, 1468 pEncoding->map)) 1469 { 1470 // go check if there's any -1 chars left 1471 ULONG ul; 1472 for (ul = 0; 1473 ul < 256; 1474 ul++) 1475 { 1476 if (pEncoding->map[ul] < 0) 1477 xmlSetError(pDom, 1478 ERROR_DOM_INCOMPLETE_ENCODING_MAP, 1479 NULL, 1480 FALSE); 1481 } 1482 // return success 1483 return (1); 1484 } 1485 } 1486 1487 // error 1488 return (0); 1489 } 1490 1491 /* 1383 1492 *@@ StartElementHandler: 1384 1493 * @expat handler called when a new element is … … 1449 1558 &pAttrib); 1450 1559 1451 // shall we validate? 1452 if (pDom->pDocTypeNode) 1453 ValidateAttributeType(pDom, 1454 pAttrib, 1455 &pAttribDeclBase); 1560 if (pDom->arcDOM) 1561 xmlSetError(pDom, 1562 pDom->arcDOM, 1563 papcszAttribs[i], 1564 TRUE); // validation 1565 else 1566 // shall we validate? 1567 if (pDom->pDocTypeNode) 1568 ValidateAttributeType(pDom, 1569 pAttrib, 1570 &pAttribDeclBase); 1456 1571 } 1457 1572 … … 1524 1639 if (!pDom->arcDOM) 1525 1640 { 1526 // ULONG i;1527 1528 1641 if (len) 1529 1642 { … … 1535 1648 PDOMNODE pParent = pSI->pDomNode; 1536 1649 // pNew = NULL; 1650 1651 BOOL fIsWhitespace = FALSE; 1537 1652 1538 1653 // shall we validate? … … 1568 1683 ULONG ul; 1569 1684 const char *p = s; 1685 1686 if (pDom->flParserFlags & DF_DROP_WHITESPACE) 1687 fIsWhitespace = TRUE; 1688 1570 1689 for (ul = 0; 1571 1690 ul < len; … … 1578 1697 pParent->NodeBase.strNodeName.psz, 1579 1698 TRUE); 1699 fIsWhitespace = FALSE; 1580 1700 break; 1581 1701 } … … 1583 1703 } 1584 1704 } 1585 } 1705 1706 } // end if (pDom->pDocTypeNode) 1707 1708 if (!fIsWhitespace) 1709 // this is false if any of the following 1710 // is true: 1711 // -- we are not validating at all 1712 // -- we are validating, but the the element 1713 // can have mixed content 1714 // -- we are validating and the element does 1715 // _not_ have mixed content and DF_DROP_WHITESPACE 1716 // is set, but the string is whitespace only 1717 // --> drop it then 1586 1718 1587 1719 if (pDom->pLastWasTextNode) … … 1775 1907 * handler should be prepared to be called recursively. 1776 1908 * 1777 *@@added V0.9.9 (2001-02-14) [umoeller] 1778 */ 1779 1780 int EXPATENTRY ExternalEntityRefHandler(XML_Parser parser, 1909 *@@added V0.9.14 (2001-08-09) [umoeller] 1910 */ 1911 1912 int EXPATENTRY ExternalEntityRefHandler(void *pUserData, // in: our PXMLDOM really 1913 XML_Parser parser, 1781 1914 const XML_Char *pcszContext, 1782 1915 const XML_Char *pcszBase, … … 1784 1917 const XML_Char *pcszPublicId) 1785 1918 { 1786 int i = 1; 1787 1788 // @@todo: allow caller to load external references some way 1789 1790 /* PXMLDOM pDom = (PXMLDOM)pUserData; 1791 1792 // continue parsing only if we had no errors so far 1793 if (!pDom->arcDOM) 1794 { 1795 } */ 1919 PXMLDOM pDom = (PXMLDOM)pUserData; 1920 1921 int i = 0; // return error per default 1922 1923 APIRET arc = NO_ERROR; 1924 1925 // store the previous parser because 1926 // all the callbacks use the parser pointer 1927 XML_Parser pOldParser = pDom->pParser; 1928 pDom->pParser = NULL; 1929 1930 if ( (pDom->pfnExternalHandler) 1931 // create sub-parser and replace the one 1932 // in the DOM with it 1933 && (pDom->pParser = XML_ExternalEntityParserCreate(parser, 1934 pcszContext, 1935 "US-ASCII")) 1936 ) 1937 { 1938 if ((arc = pDom->pfnExternalHandler(pDom, 1939 pDom->pParser, 1940 pcszSystemId, 1941 pcszPublicId))) 1942 { 1943 // error: 1944 // now this needs special handling, since we're 1945 // dealing with a sub-handler here... 1946 1947 if (arc == -1) 1948 // parser error: well, then xmlSetError has been 1949 // called from somewhere in the callbacks already, 1950 // and we can safely ignore this 1951 ; 1952 else 1953 { 1954 pDom->arcDOM = arc; 1955 if (pcszSystemId) 1956 { 1957 if (!pDom->pxstrFailingNode) 1958 pDom->pxstrFailingNode = xstrCreate(0); 1959 xstrcpy(pDom->pxstrFailingNode, pcszSystemId, 0); 1960 } 1961 pDom->pcszErrorDescription = xmlDescribeError(arc); 1962 pDom->ulErrorLine = XML_GetCurrentLineNumber(pDom->pParser); 1963 pDom->ulErrorColumn = XML_GetCurrentColumnNumber(pDom->pParser); 1964 } 1965 } 1966 1967 i = 1; // success 1968 } 1969 else 1970 xmlSetError(pDom, 1971 (!arc) ? ERROR_DOM_INVALID_EXTERNAL_HANDLER : arc, 1972 NULL, 1973 FALSE); 1974 1975 if (pDom->pParser) 1976 XML_ParserFree(pDom->pParser); 1977 1978 pDom->pParser = pOldParser; 1796 1979 1797 1980 return (i); … … 2125 2308 * Pass the XMLDOM returned here to xmlParse afterwards. 2126 2309 * 2127 * ulFlags is any combination of the following: 2128 * 2129 * -- DF_PARSECOMMENTS: XML @comments are to be returned in 2130 * the DOM tree. Otherwise they are silently ignored. 2131 * 2132 * -- DF_PARSEDTD: add the @DTD of the document into the DOM tree 2133 * as well and validate the document, if a DTD was found. 2134 * Otherwise just parse and do not validate. 2135 * 2136 * -- DF_FAIL_IF_NO_DTD: fail if no @DTD was found. Useful 2137 * if you want to enforce validation. @@todo 2138 * 2139 * Usage: 2310 * Simplest possible usage: 2140 2311 * 2141 2312 * 1) Create a DOM instance. 2142 2313 * 2143 2314 + PXMLDOM pDom = NULL; 2144 + APIRET arc = xmlCreateDOM(flags, &pDom);2315 + APIRET arc = xmlCreateDOM(flags, NULL, NULL, NULL, &pDom); 2145 2316 + 2146 2317 * 2) Give chunks of data (or an entire buffer) … … 2164 2335 * 4) When done, call xmlFreeDOM, which will free all memory. 2165 2336 * 2337 * The above code has limitations: only a few character 2338 * @encodings are supported, and @external_entities are 2339 * silently ignored. 2340 * 2341 * This function supports a number of callbacks and flags 2342 * to allow for maximum flexibility. Note however that 2343 * not all @expat features are supported yet. 2344 * 2345 * The following callbacks can be specified (any of these 2346 * can be NULL): 2347 * 2348 * -- pfnGetCPData should be specified if you want to 2349 * support character @encodings other than the 2350 * four that built into expat itself (see 2351 * XML_SetUnknownEncodingHandler). This is probably 2352 * a good idea to do under OS/2 since most OS/2 2353 * documents are in a PC-specific codepage such as 2354 * CP 850. 2355 * 2356 * This callback must have the following prototype: 2357 * 2358 + int APIENTRY FNGETCPDATA(PXMLDOM pDom, ULONG ulCP, int *piMap) 2359 * 2360 * The callback will only be called once for each 2361 * document if the "encoding" attribute of the 2362 * XML @text_declaration starts with "cp" (e.g. 2363 * "cp850") and will then receives the following 2364 * parameters: 2365 * 2366 * -- "pDom" will be the XMLDOM created by this function. 2367 * 2368 * -- ulCP has the IBM code page number, such as "850". 2369 * 2370 * -- piMap is an array of 256 integer values which must 2371 * be filled with the callback. Each array item index 2372 * is the codepage value, and the value of each field 2373 * is the corresponding Unicode value, or -1 if the 2374 * character is invalid (shouldn't happen with codepages). 2375 * 2376 * For example, the German o-umlaut character is 2377 * 0x94 in CP850 and 0x00f6 in Unicode. So set 2378 * the int at index 0x94 to 0x00f6. 2379 * 2380 * pvCallbackUser is a user parameter which is simply stored 2381 * in the XMLDOM struct which is returned. Since the XMLDOM 2382 * is passed to all the callbacks, you can access that pointer 2383 * from them. 2384 * 2385 * flParserFlags is any combination of the following: 2386 * 2387 * -- DF_PARSECOMMENTS: XML @comments are to be returned in 2388 * the DOM tree. Otherwise they are discarded. 2389 * 2390 * -- DF_PARSEDTD: add the @DTD of the document into the DOM tree 2391 * as well and validate the document, if a DTD was found. 2392 * Otherwise just parse and do not validate. 2393 * 2394 * DF_PARSEDTD is required for external entities to work 2395 * also. 2396 * 2397 * -- DF_FAIL_IF_NO_DTD: fail if no @DTD was found. Useful 2398 * if you want to enforce validation. @@todo 2399 * 2400 * -- DF_DROP_WHITESPACE: discard all @whitespace for those 2401 * elements that can only have element content. Whitespace 2402 * will be preserved only for elements that can have 2403 * mixed content. -- If this flag is not set, all whitespace 2404 * is preserved. 2405 * 2166 2406 *@@added V0.9.9 (2001-02-14) [umoeller] 2167 */ 2168 2169 APIRET xmlCreateDOM(ULONG flParserFlags, 2170 PXMLDOM *ppDom) 2407 *@@changed V0.9.14 (2001-08-09) [umoeller]: added DF_DROP_WHITESPACE support 2408 */ 2409 2410 APIRET xmlCreateDOM(ULONG flParserFlags, // in: DF_* parser flags 2411 PFNGETCPDATA pfnGetCPData, // in: codepage callback or NULL 2412 PFNEXTERNALHANDLER pfnExternalHandler, // in: external entity callback or NULL 2413 PVOID pvCallbackUser, // in: user param for callbacks 2414 PXMLDOM *ppDom) // out: XMLDOM struct created 2171 2415 { 2172 2416 APIRET arc = NO_ERROR; … … 2180 2424 2181 2425 memset(pDom, 0, sizeof(XMLDOM)); 2426 2427 pDom->flParserFlags = flParserFlags; 2428 pDom->pfnGetCPData = pfnGetCPData; 2429 pDom->pfnExternalHandler = pfnExternalHandler; 2430 pDom->pvCallbackUser = pvCallbackUser; 2182 2431 2183 2432 lstInit(&pDom->llElementStack, … … 2207 2456 else 2208 2457 { 2458 if (pfnGetCPData) 2459 XML_SetUnknownEncodingHandler(pDom->pParser, 2460 UnknownEncodingHandler, 2461 pDom); // user data 2462 2463 XML_SetParamEntityParsing(pDom->pParser, 2464 XML_PARAM_ENTITY_PARSING_ALWAYS); 2465 2209 2466 XML_SetElementHandler(pDom->pParser, 2210 2467 StartElementHandler, … … 2221 2478 XML_SetCommentHandler(pDom->pParser, 2222 2479 CommentHandler); 2480 2481 if (pfnExternalHandler) 2482 XML_SetExternalEntityRefHandler(pDom->pParser, 2483 ExternalEntityRefHandler); 2223 2484 2224 2485 if (flParserFlags & DF_PARSEDTD) … … 2231 2492 NotationDeclHandler); 2232 2493 2233 XML_SetExternalEntityRefHandler(pDom->pParser,2234 ExternalEntityRefHandler);2235 2236 2494 XML_SetElementDeclHandler(pDom->pParser, 2237 2495 ElementDeclHandler); … … 2306 2564 else 2307 2565 { 2308 BOOL fSuccess = XML_Parse(pDom->pParser, 2309 pcszBuf, 2310 cb, 2311 fIsLast); 2312 2313 if (!fSuccess) 2566 // go parse then 2567 if (!XML_Parse(pDom->pParser, 2568 pcszBuf, 2569 cb, 2570 fIsLast)) 2314 2571 { 2315 2572 // expat parsing error: … … 2380 2637 2381 2638 xmlDeleteNode((PNODEBASE)pDom->pDocumentNode); 2639 2640 if (pDom->pxstrSystemID) 2641 xstrFree(&pDom->pxstrSystemID); 2642 if (pDom->pxstrFailingNode) 2643 xstrFree(&pDom->pxstrFailingNode); 2644 2645 lstClear(&pDom->llElementStack); 2382 2646 2383 2647 free(pDom); -
trunk/src/helpers/xmldefs.c
r63 r97 547 547 * 548 548 * All XML processors must be able to read @entities in either 549 * UTF-8 or UTF-16. See XML_SetUnknownEncodingHandler for additional 550 * encodings directly supported by @expat. 549 * UTF-8 or UTF-16. @expat directly supports the following 550 * (see XML_SetUnknownEncodingHandler): 551 * 552 * -- UTF-8: 8-bit encoding of Unicode. 553 * 554 * -- UTF-16: 16-bit encoding of Unicode. 555 * 556 * -- ISO-8859-1: that's "latin 1". 557 * 558 * -- US-ASCII. 551 559 * 552 560 * Entities encoded in UTF-16 must begin with the ZERO WIDTH NO-BREAK -
trunk/src/helpers/xmlparse.c
r75 r97 2 2 /* 3 3 *@@sourcefile xmlparse.c: 4 * contains the API of the expat XML parser 1.95.1, as released on 5 * SourceForge Oct 22, 2000. 6 * 7 * This was ported to and integrated with the xwphelpers 8 * for V0.9.9 (2001-02-10) [umoeller]. See xml.c for a general 9 * introduction to @XML support in the xwphelpers. 4 * contains the API of the expat XML parser 1.95.2, as released on 5 * http://sourceforge.net/projects/expat/ on July 26, 2001. 6 * 7 * V1.95.1 was ported to and integrated with the xwphelpers 8 * for V0.9.9 (2001-02-10) [umoeller]. V1.95.2 was re-ported 9 * with V0.9.14 (2001-08-09) [umoeller]. 10 * 11 * See xml.c for a general introduction to @XML support in the 12 * xwphelpers. 10 13 * 11 14 * Expat is a library, written in C, for parsing XML @documents. It's … … 70 73 // this code generates those options HEAVILY 71 74 72 // #include <config.h> 75 76 /* #ifdef COMPILED_FROM_DSP 77 * # include "winconfig.h" 78 * # define XMLPARSEAPI(type) __declspec(dllexport) type __cdecl 79 * # include "expat.h" 80 * # undef XMLPARSEAPI 81 * #else 82 * #include <config.h> */ 73 83 74 84 #ifdef __declspec 75 #define XMLPARSEAPI __declspec(dllexport)85 #define XMLPARSEAPI(type) __declspec(dllexport) type __cdecl 76 86 #endif 77 87 … … 79 89 80 90 #ifdef __declspec 81 91 #undef XMLPARSEAPI 82 92 #endif 93 // #endif /* ndef COMPILED_FROM_DSP */ 83 94 84 95 #include <stddef.h> … … 86 97 87 98 #ifdef XML_UNICODE 88 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX 89 #define XmlConvert XmlUtf16Convert 90 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding 91 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS 92 #define XmlEncode XmlUtf16Encode 93 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) 94 typedef unsigned short ICHAR; 99 #define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX 100 #define XmlConvert XmlUtf16Convert 101 #define XmlGetInternalEncoding XmlGetUtf16InternalEncoding 102 #define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS 103 #define XmlEncode XmlUtf16Encode 104 #define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) 105 typedef unsigned short ICHAR; 106 95 107 #else 96 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX 97 #define XmlConvert XmlUtf8Convert 98 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding 99 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS 100 #define XmlEncode XmlUtf8Encode 101 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8) 102 typedef char ICHAR; 108 #define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX 109 #define XmlConvert XmlUtf8Convert 110 #define XmlGetInternalEncoding XmlGetUtf8InternalEncoding 111 #define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS 112 #define XmlEncode XmlUtf8Encode 113 #define MUST_CONVERT(enc, s) (!(enc)->isUtf8) 114 typedef char ICHAR; 115 103 116 #endif 104 117 118 105 119 #ifndef XML_NS 106 #define XmlInitEncodingNS XmlInitEncoding 107 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding 108 #undef XmlGetInternalEncodingNS 109 #define XmlGetInternalEncodingNS XmlGetInternalEncoding 110 #define XmlParseXmlDeclNS XmlParseXmlDecl 120 121 #define XmlInitEncodingNS XmlInitEncoding 122 #define XmlInitUnknownEncodingNS XmlInitUnknownEncoding 123 #undef XmlGetInternalEncodingNS 124 #define XmlGetInternalEncodingNS XmlGetInternalEncoding 125 #define XmlParseXmlDeclNS XmlParseXmlDecl 126 111 127 #endif 112 128 113 129 #ifdef XML_UNICODE_WCHAR_T 114 130 #define XML_T(x) L ## x 115 131 #else 116 132 #define XML_T(x) x 117 133 #endif 118 134 … … 125 141 typedef const XML_Char *KEY; 126 142 127 typedef struct _NAMED143 typedef struct 128 144 { 129 145 KEY name; 130 } NAMED, *PNAMED; 131 132 typedef struct _HASH_TABLE 146 } 147 NAMED; 148 149 typedef struct 133 150 { 134 151 NAMED **v; … … 137 154 size_t usedLim; 138 155 XML_Memory_Handling_Suite *mem; 139 } HASH_TABLE, *PHASH_TABLE; 140 141 typedef struct _HASH_TABLE_ITER 156 } 157 HASH_TABLE; 158 159 typedef struct 142 160 { 143 161 NAMED **p; 144 162 NAMED **end; 145 } HASH_TABLE_ITER, *PHASH_TABLE_ITER; 163 } 164 HASH_TABLE_ITER; 146 165 147 166 #define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ … … 155 174 typedef struct binding 156 175 { 157 struct prefix *prefix; 158 struct binding *nextTagBinding; 159 struct binding *prevPrefixBinding; 160 const struct attribute_id *attId; 161 XML_Char *uri; 162 int uriLen; 163 int uriAlloc; 164 } BINDING, *PBINDING; 176 struct prefix *prefix; 177 struct binding *nextTagBinding; 178 struct binding *prevPrefixBinding; 179 const struct attribute_id *attId; 180 XML_Char *uri; 181 int uriLen; 182 int uriAlloc; 183 } 184 BINDING; 165 185 166 186 typedef struct prefix 167 187 { 168 const XML_Char *name; 169 BINDING *binding; 170 } PREFIX, *PPREFIX; 188 const XML_Char *name; 189 BINDING *binding; 190 } 191 PREFIX; 171 192 172 193 typedef struct 173 194 { 174 const XML_Char 175 const XML_Char 195 const XML_Char *str; 196 const XML_Char *localPart; 176 197 int uriLen; 177 } TAG_NAME, *PTAG_NAME; 198 } 199 TAG_NAME; 178 200 179 201 typedef struct tag 180 202 { 181 struct tag *parent; 182 const char *rawName; 183 int rawNameLength; 184 TAG_NAME name; 185 char *buf; 186 char *bufEnd; 187 BINDING *bindings; 188 } TAG, *PTAG; 203 struct tag *parent; 204 const char *rawName; 205 int rawNameLength; 206 TAG_NAME name; 207 char *buf; 208 char *bufEnd; 209 BINDING *bindings; 210 } 211 TAG; 189 212 190 213 typedef struct 191 214 { 192 const XML_Char 193 const XML_Char 194 int 195 const XML_Char 196 const XML_Char 197 const XML_Char 198 const XML_Char 215 const XML_Char *name; 216 const XML_Char *textPtr; 217 int textLen; 218 const XML_Char *systemId; 219 const XML_Char *base; 220 const XML_Char *publicId; 221 const XML_Char *notation; 199 222 char open; 200 223 char is_param; 201 } ENTITY, *PENTITY; 224 } 225 ENTITY; 202 226 203 227 typedef struct 204 228 { 205 enum XML_Content_Type type; 206 enum XML_Content_Quant quant; 207 const XML_Char *name; 208 int firstchild; 209 int lastchild; 210 int childcnt; 211 int nextsib; 212 } CONTENT_SCAFFOLD, *PCONTENT_SCAFFOLD; 229 enum XML_Content_Type type; 230 enum XML_Content_Quant quant; 231 const XML_Char *name; 232 int firstchild; 233 int lastchild; 234 int childcnt; 235 int nextsib; 236 } 237 CONTENT_SCAFFOLD; 213 238 214 239 typedef struct block … … 217 242 int size; 218 243 XML_Char s[1]; 219 } BLOCK, *PBLOCK; 244 } 245 BLOCK; 220 246 221 247 typedef struct … … 227 253 XML_Char *start; 228 254 XML_Memory_Handling_Suite *mem; 229 } STRING_POOL, *PSTRING_POOL; 255 } 256 STRING_POOL; 230 257 231 258 /* The XML_Char before the name is used to determine whether … … 237 264 char maybeTokenized; 238 265 char xmlns; 239 } ATTRIBUTE_ID, *PATTRIBUTE_ID; 266 } 267 ATTRIBUTE_ID; 240 268 241 269 typedef struct … … 244 272 char isCdata; 245 273 const XML_Char *value; 246 } DEFAULT_ATTRIBUTE, *PDEFAULT_ATTRIBUTE; 274 } 275 DEFAULT_ATTRIBUTE; 247 276 248 277 typedef struct … … 254 283 int allocDefaultAtts; 255 284 DEFAULT_ATTRIBUTE *defaultAtts; 256 } ELEMENT_TYPE, *PELEMENT_TYPE; 285 } 286 ELEMENT_TYPE; 257 287 258 288 typedef struct … … 277 307 int scaffLevel; 278 308 int *scaffIndex; 279 } DTD, *PDTD; 309 } 310 DTD; 280 311 281 312 typedef struct open_internal_entity … … 285 316 struct open_internal_entity *next; 286 317 ENTITY *entity; 287 } OPEN_INTERNAL_ENTITY, *POPEN_INTERNAL_ENTITY; 318 } 319 OPEN_INTERNAL_ENTITY; 288 320 289 321 typedef XMLERROR Processor(XML_Parser parser, 290 291 292 322 const char *start, 323 const char *end, 324 const char **endPtr); 293 325 294 326 static Processor prologProcessor; … … 299 331 #ifdef XML_DTD 300 332 static Processor ignoreSectionProcessor; 333 301 334 #endif /* XML_DTD */ 302 303 335 static Processor epilogProcessor; 304 336 static Processor errorProcessor; … … 308 340 static Processor externalEntityContentProcessor; 309 341 310 static XMLERROR handleUnknownEncoding(XML_Parser parser, 311 const XML_Char * encodingName); 312 static XMLERROR processXmlDecl(XML_Parser parser, 313 int isGeneralTextEntity, 314 const char *, 315 const char *); 316 static XMLERROR initializeEncoding(XML_Parser parser); 317 static XMLERROR doProlog(XML_Parser parser, 318 const ENCODING * enc, 319 const char *s, 320 const char *end, 321 int tok, 322 const char *next, 323 const char **nextPtr); 324 static XMLERROR processInternalParamEntity(XML_Parser parser, 325 ENTITY * entity); 326 static XMLERROR doContent(XML_Parser parser, 327 int startTagLevel, 328 const ENCODING * enc, 329 const char *start, 330 const char *end, 331 const char **endPtr); 332 static XMLERROR doCdataSection(XML_Parser parser, 333 const ENCODING *, 334 const char **startPtr, 335 const char *end, 336 const char **nextPtr); 342 static XMLERROR 343 handleUnknownEncoding(XML_Parser parser, const XML_Char * encodingName); 344 static XMLERROR 345 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, const char *, const char *); 346 static XMLERROR 347 initializeEncoding(XML_Parser parser); 348 static XMLERROR 349 doProlog(XML_Parser parser, const ENCODING * enc, const char *s, 350 const char *end, int tok, const char *next, const char **nextPtr); 351 static XMLERROR 352 processInternalParamEntity(XML_Parser parser, ENTITY * entity); 353 static XMLERROR 354 doContent(XML_Parser parser, int startTagLevel, const ENCODING * enc, 355 const char *start, const char *end, const char **endPtr); 356 static XMLERROR 357 doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); 337 358 338 359 #ifdef XML_DTD 339 static XMLERROR doIgnoreSection(XML_Parser parser, 340 const ENCODING *, 341 const char **startPtr, 342 const char *end, 343 const char **nextPtr); 360 static XMLERROR 361 doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, const char *end, const char **nextPtr); 362 344 363 #endif /* XML_DTD */ 345 346 static XMLERROR storeAtts(XML_Parser parser, 347 const ENCODING *, 348 const char *s, 349 TAG_NAME * tagNamePtr, 350 BINDING ** bindingsPtr); 351 static int addBinding(XML_Parser parser, 352 PREFIX * prefix, 353 const ATTRIBUTE_ID * attId, 354 const XML_Char * uri, 355 BINDING ** bindingsPtr); 356 357 static int defineAttribute(ELEMENT_TYPE * type, 358 ATTRIBUTE_ID *, 359 int isCdata, 360 int isId, 361 const XML_Char * dfltValue, 362 XML_Parser parser); 363 364 static XMLERROR storeAttributeValue(XML_Parser parser, 365 const ENCODING *, 366 int isCdata, 367 const char *, 368 const char *, 369 STRING_POOL *); 370 static XMLERROR appendAttributeValue(XML_Parser parser, 371 const ENCODING *, 372 int isCdata, 373 const char *, 374 const char *, 375 STRING_POOL *); 376 static ATTRIBUTE_ID * getAttributeId(XML_Parser parser, 377 const ENCODING * enc, 378 const char *start, 379 const char *end); 364 static XMLERROR storeAtts(XML_Parser parser, const ENCODING *, const char *s, 365 TAG_NAME * tagNamePtr, BINDING ** bindingsPtr); 366 static 367 int addBinding(XML_Parser parser, PREFIX * prefix, const ATTRIBUTE_ID * attId, const XML_Char * uri, BINDING ** bindingsPtr); 368 369 static int 370 defineAttribute(ELEMENT_TYPE * type, ATTRIBUTE_ID *, 371 int isCdata, int isId, const XML_Char * dfltValue, 372 XML_Parser parser); 373 374 static XMLERROR 375 storeAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, 376 STRING_POOL *); 377 static XMLERROR 378 appendAttributeValue(XML_Parser parser, const ENCODING *, int isCdata, const char *, const char *, 379 STRING_POOL *); 380 static ATTRIBUTE_ID * 381 getAttributeId(XML_Parser parser, const ENCODING * enc, const char *start, const char *end); 380 382 static int setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); 381 static XMLERROR storeEntityValue(XML_Parser parser, 382 const ENCODING * enc, 383 const char *start, 384 const char *end); 385 static int reportProcessingInstruction(XML_Parser parser, 386 const ENCODING * enc, 387 const char *start, 388 const char *end); 389 static int reportComment(XML_Parser parser, 390 const ENCODING * enc, 391 const char *start, 392 const char *end); 393 static void reportDefault(XML_Parser parser, 394 const ENCODING * enc, 395 const char *start, 396 const char *end); 383 static XMLERROR 384 storeEntityValue(XML_Parser parser, const ENCODING * enc, const char *start, const char *end); 385 static int 386 reportProcessingInstruction(XML_Parser parser, const ENCODING * enc, const char *start, const char *end); 387 static int 388 reportComment(XML_Parser parser, const ENCODING * enc, const char *start, const char *end); 389 static void 390 reportDefault(XML_Parser parser, const ENCODING * enc, const char *start, const char *end); 397 391 398 392 static const XML_Char *getContext(XML_Parser parser); … … 405 399 static int dtdCopy(DTD * newDtd, const DTD * oldDtd, XML_Parser parser); 406 400 407 static int copyEntityTable(HASH_TABLE *, 408 STRING_POOL *, 409 const HASH_TABLE *, 401 static int copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *, 410 402 XML_Parser parser); 411 403 412 404 #ifdef XML_DTD 413 405 static void dtdSwap(DTD *, DTD *); 406 414 407 #endif /* XML_DTD */ 415 408 … … 424 417 static void poolClear(STRING_POOL *); 425 418 static void poolDestroy(STRING_POOL *); 426 static XML_Char *poolAppend(STRING_POOL * pool, const ENCODING * enc, 427 const char *ptr, const char *end); 428 static XML_Char *poolStoreString(STRING_POOL * pool, const ENCODING * enc, 429 const char *ptr, const char *end); 419 static XML_Char *poolAppend(STRING_POOL *pool, 420 const ENCODING *enc, 421 const char *ptr, 422 const char *end, 423 unsigned long *pulOfs); // V0.9.14 (2001-08-09) [umoeller] 424 static XML_Char *poolStoreString(STRING_POOL *pool, 425 const ENCODING *enc, 426 const char *ptr, 427 const char *end, 428 unsigned long *pulOfs); // V0.9.14 (2001-08-09) [umoeller] 430 429 431 430 static int poolGrow(STRING_POOL * pool); … … 502 501 void *m_unknownEncodingData; 503 502 void *m_unknownEncodingHandlerData; 504 void (* EXPATENTRYm_unknownEncodingRelease) (void *);503 void (*m_unknownEncodingRelease) (void *); 505 504 PROLOG_STATE m_prologState; 506 505 Processor *m_processor; … … 544 543 XML_Parser m_parentParser; 545 544 #endif 546 } Parser, *PParser; 545 } 546 Parser; 547 547 548 548 #define MALLOC(s) (((Parser *)parser)->m_mem.malloc_fcn((s))) … … 569 569 #define externalEntityRefHandler (((Parser *)parser)->m_externalEntityRefHandler) 570 570 #define externalEntityRefHandlerArg (((Parser *)parser)->m_externalEntityRefHandlerArg) 571 #define internalEntityRefHandler (((Parser *)parser)->m_internalEntityRefHandler) 571 572 #define unknownEncodingHandler (((Parser *)parser)->m_unknownEncodingHandler) 572 573 #define elementDeclHandler (((Parser *)parser)->m_elementDeclHandler) … … 579 580 #define unknownEncodingMem (((Parser *)parser)->m_unknownEncodingMem) 580 581 #define unknownEncodingData (((Parser *)parser)->m_unknownEncodingData) 581 #define unknownEncodingHandlerData (((Parser *)parser)->m_unknownEncodingHandlerData) 582 #define unknownEncodingRelease (((Parser*)parser)->m_unknownEncodingRelease) 582 #define unknownEncodingHandlerData \ 583 (((Parser *)parser)->m_unknownEncodingHandlerData) 584 #define unknownEncodingRelease (((Parser *)parser)->m_unknownEncodingRelease) 583 585 #define protocolEncodingName (((Parser *)parser)->m_protocolEncodingName) 584 586 #define ns (((Parser *)parser)->m_ns) … … 594 596 #define defaultExpandInternalEntities (((Parser *)parser)->m_defaultExpandInternalEntities) 595 597 #define tagLevel (((Parser *)parser)->m_tagLevel) 596 #define buffer (((Parser *)parser)->m_buffer)598 #define buffer (((Parser *)parser)->m_buffer) 597 599 #define bufferPtr (((Parser *)parser)->m_bufferPtr) 598 600 #define bufferEnd (((Parser *)parser)->m_bufferEnd) … … 634 636 #endif /* XML_DTD */ 635 637 638 #ifdef COMPILED_FROM_DSP 639 BOOL WINAPI DllMain(HINSTANCE h, DWORD r, LPVOID p) 640 { 641 return TRUE; 642 } 643 #endif /* def COMPILED_FROM_DSP */ 644 645 #ifdef _MSC_VER 646 #ifdef _DEBUG 647 Parser *asParser(XML_Parser parser) 648 { 649 return parser; 650 } 651 #endif 652 #endif 653 636 654 /* 637 655 *@@ XML_ParserCreate: … … 748 766 */ 749 767 750 XML_Parser XML_ParserCreate(const XML_Char * encodingName)768 XML_Parser XML_ParserCreate(const XML_Char * encodingName) 751 769 { 752 770 return XML_ParserCreate_MM(encodingName, NULL, NULL); … … 830 848 */ 831 849 832 XML_Parser XML_ParserCreate_MM(const XML_Char * encodingName, 833 const XML_Memory_Handling_Suite * memsuite, 834 const XML_Char * nameSep) 850 XML_Parser 851 XML_ParserCreate_MM(const XML_Char * encodingName, 852 const XML_Memory_Handling_Suite * memsuite, 853 const XML_Char * nameSep) 835 854 { 836 855 … … 857 876 858 877 parser = memsuite->malloc_fcn(sizeof(Parser)); 859 mtemp = &(((Parser *)parser)->m_mem);878 mtemp = &(((Parser *) parser)->m_mem); 860 879 mtemp->malloc_fcn = memsuite->malloc_fcn; 861 880 mtemp->realloc_fcn = memsuite->realloc_fcn; … … 866 885 XML_Memory_Handling_Suite *mtemp; 867 886 868 parser = (malloc)(sizeof(Parser)); 869 mtemp = &(((Parser*)parser)->m_mem); 870 887 parser = malloc(sizeof(Parser)); 888 mtemp = &(((Parser *) parser)->m_mem); 871 889 mtemp->malloc_fcn = malloc; 872 890 mtemp->realloc_fcn = realloc; … … 929 947 inheritedBindings = 0; 930 948 attsSize = INIT_ATTS_SIZE; 931 atts = (PATTRIBUTE)MALLOC(attsSize * sizeof(ATTRIBUTE));949 atts = MALLOC(attsSize * sizeof(ATTRIBUTE)); 932 950 nSpecifiedAtts = 0; 933 dataBuf = (XML_Char*)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));951 dataBuf = MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); 934 952 groupSize = 0; 935 953 groupConnector = 0; … … 946 964 ns = 0; 947 965 ns_triplets = 0; 948 poolInit(&tempPool, &(((Parser *)parser)->m_mem));949 poolInit(&temp2Pool, &(((Parser *)parser)->m_mem));966 poolInit(&tempPool, &(((Parser *) parser)->m_mem)); 967 poolInit(&temp2Pool, &(((Parser *) parser)->m_mem)); 950 968 protocolEncodingName = encodingName ? poolCopyString(&tempPool, encodingName) : 0; 951 969 curBase = 0; … … 1047 1065 1048 1066 #ifdef XML_DTD 1049 enum XML_ParamEntityParsingoldParamEntityParsing = paramEntityParsing;1067 int oldParamEntityParsing = paramEntityParsing; 1050 1068 1051 1069 #endif … … 1057 1075 1058 1076 *tmp = namespaceSeparator; 1059 parser = XML_ParserCreate_MM(encodingName, &((Parser *)parser)->m_mem,1077 parser = XML_ParserCreate_MM(encodingName, &((Parser *) parser)->m_mem, 1060 1078 tmp); 1061 1079 } 1062 1080 else 1063 1081 { 1064 parser = XML_ParserCreate_MM(encodingName, &((Parser *)parser)->m_mem,1082 parser = XML_ParserCreate_MM(encodingName, &((Parser *) parser)->m_mem, 1065 1083 NULL); 1066 1084 } … … 1123 1141 } 1124 1142 1125 static void destroyBindings(BINDING * bindings, XML_Parser parser) 1143 static 1144 void destroyBindings(BINDING * bindings, XML_Parser parser) 1126 1145 { 1127 1146 for (;;) … … 1172 1191 if (hadExternalDoctype) 1173 1192 dtd.complete = 0; 1174 dtdSwap(&dtd, &((Parser *)parentParser)->m_dtd);1193 dtdSwap(&dtd, &((Parser *) parentParser)->m_dtd); 1175 1194 } 1176 1195 #endif /* XML_DTD */ … … 1275 1294 */ 1276 1295 1277 const XML_Char *XML_GetBase(XML_Parser parser)1296 const XML_Char *XML_GetBase(XML_Parser parser) 1278 1297 { 1279 1298 return curBase; … … 1433 1452 1434 1453 void XML_SetProcessingInstructionHandler(XML_Parser parser, 1435 1454 XML_ProcessingInstructionHandler handler) 1436 1455 { 1437 1456 processingInstructionHandler = handler; … … 1741 1760 * Handler prototype: 1742 1761 + 1743 + int EXPATENTRY ExternalEntityRefHandler(XML_Parser parser, 1762 + int EXPATENTRY ExternalEntityRefHandler(void *pUser, 1763 + XML_Parser parser, 1744 1764 + const XML_Char *pcszContext, 1745 1765 + const XML_Char *pcszBase, … … 1787 1807 * external entities may refer to other external entities, your 1788 1808 * handler should be prepared to be called recursively. 1809 * 1810 *@@changed V0.9.14 (2001-08-09) [umoeller]: changed prototype to contain user data 1789 1811 */ 1790 1812 … … 1841 1863 * 1842 1864 * See _XML_Encoding for more details about that structure and 1843 * what to do with it. 1844 * 1845 * Expat places restrictions on character encodings that it can 1846 * support by filling in the XML_Encoding structure. 1847 * 1848 * 1. Every ASCII character that can appear in a well-formed XML 1849 * document must be represented by a single byte, and that byte 1850 * must correspond to its ASCII encoding (except for the 1851 * characters $@\^'{}~). 1852 * 1853 * 2. Characters must be encoded in 4 bytes or less. 1854 * 1855 * 3. All characters encoded must have Unicode scalar values less 1856 * than or equal to 65535 (0xFFFF). (This does not apply to 1857 * the built-in support for UTF-16 and UTF-8.) 1858 * 1859 * 4. No character may be encoded by more than one distinct 1860 * sequence of bytes. 1865 * what to do with it, and restrictions imposed by expat. 1866 * 1861 1867 */ 1862 1868 … … 2073 2079 */ 2074 2080 2075 int XML_Parse(XML_Parser parser, 2076 const char *s, 2077 int len, 2078 int isFinal) 2081 int XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) 2079 2082 { 2080 2083 if (len == 0) … … 2083 2086 return 1; 2084 2087 positionPtr = bufferPtr; 2085 errorCode = processor(parser, 2086 bufferPtr, 2087 parseEndPtr = bufferEnd, 2088 0); 2088 errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); 2089 2089 if (errorCode == ERROR_EXPAT_NONE) 2090 2090 return 1; … … 2103 2103 if (isFinal) 2104 2104 { 2105 errorCode = processor(parser, 2106 s, 2107 parseEndPtr = s + len, 2108 0); 2105 errorCode = processor(parser, s, parseEndPtr = s + len, 0); 2109 2106 if (errorCode == ERROR_EXPAT_NONE) 2110 2107 return 1; … … 2127 2124 { 2128 2125 /* FIXME avoid integer overflow */ 2129 buffer = buffer == 0 ? (char*)MALLOC(len * 2) : (char*)REALLOC(buffer, len * 2);2126 buffer = buffer == 0 ? MALLOC(len * 2) : REALLOC(buffer, len * 2); 2130 2127 /* FIXME storage leak if realloc fails */ 2131 2128 if (!buffer) … … 2212 2209 */ 2213 2210 2214 void *XML_GetBuffer(XML_Parser parser, int len)2211 void *XML_GetBuffer(XML_Parser parser, int len) 2215 2212 { 2216 2213 if (len > bufferLim - bufferEnd) … … 2255 2252 } 2256 2253 while (bufferSize < neededSize); 2257 newBuf = (char*)MALLOC(bufferSize);2254 newBuf = MALLOC(bufferSize); 2258 2255 if (newBuf == 0) 2259 2256 { … … 2362 2359 */ 2363 2360 2364 const char *XML_GetInputContext(XML_Parser parser, int *offset, int *size)2361 const char *XML_GetInputContext(XML_Parser parser, int *offset, int *size) 2365 2362 { 2366 2363 #ifdef XML_CONTEXT_BYTES … … 2429 2426 } 2430 2427 2431 /* 2432 *@@ XML_ExpatVersion: 2433 * returns the library version string (e.g. "expat_1.95.1"). 2434 */ 2435 2436 const XML_LChar* XML_ExpatVersion(void) 2437 { 2438 return "expat_1.95.1"; 2439 } 2440 2441 static XMLERROR contentProcessor(XML_Parser parser, 2442 const char *start, 2443 const char *end, 2444 const char **endPtr) 2428 const XML_LChar *XML_ErrorString(int code) 2429 { 2430 static const XML_LChar *message[] = 2431 { 2432 0, 2433 XML_T("out of memory"), 2434 XML_T("syntax error"), 2435 XML_T("no element found"), 2436 XML_T("not well-formed (invalid token)"), 2437 XML_T("unclosed token"), 2438 XML_T("unclosed token"), 2439 XML_T("mismatched tag"), 2440 XML_T("duplicate attribute"), 2441 XML_T("junk after document element"), 2442 XML_T("illegal parameter entity reference"), 2443 XML_T("undefined entity"), 2444 XML_T("recursive entity reference"), 2445 XML_T("asynchronous entity"), 2446 XML_T("reference to invalid character number"), 2447 XML_T("reference to binary entity"), 2448 XML_T("reference to external entity in attribute"), 2449 XML_T("xml processing instruction not at start of external entity"), 2450 XML_T("unknown encoding"), 2451 XML_T("encoding specified in XML declaration is incorrect"), 2452 XML_T("unclosed CDATA section"), 2453 XML_T("error in processing external entity reference"), 2454 XML_T("document is not standalone"), 2455 XML_T("unexpected parser state - please send a bug report") 2456 }; 2457 2458 if (code > 0 && code < sizeof(message) / sizeof(message[0])) 2459 return message[code]; 2460 return 0; 2461 } 2462 2463 /* const XML_LChar * 2464 * XML_ExpatVersion(void) { 2465 * return VERSION; 2466 * } 2467 * 2468 * XML_Expat_Version 2469 * XML_ExpatVersionInfo(void) { 2470 * XML_Expat_Version version; 2471 * 2472 * version.major = XML_MAJOR_VERSION; 2473 * version.minor = XML_MINOR_VERSION; 2474 * version.micro = XML_MICRO_VERSION; 2475 * 2476 * return version; 2477 * } */ 2478 2479 static 2480 XMLERROR contentProcessor(XML_Parser parser, 2481 const char *start, 2482 const char *end, 2483 const char **endPtr) 2445 2484 { 2446 2485 return doContent(parser, 0, encoding, start, end, endPtr); 2447 2486 } 2448 2487 2449 static XMLERROR externalEntityInitProcessor(XML_Parser parser, 2450 const char *start, 2451 const char *end, 2452 const char **endPtr) 2488 static 2489 XMLERROR externalEntityInitProcessor(XML_Parser parser, 2490 const char *start, 2491 const char *end, 2492 const char **endPtr) 2453 2493 { 2454 2494 XMLERROR result = initializeEncoding(parser); … … 2460 2500 } 2461 2501 2462 static XMLERROR externalEntityInitProcessor2(XML_Parser parser, 2463 const char *start, 2464 const char *end, 2465 const char **endPtr) 2502 static 2503 XMLERROR externalEntityInitProcessor2(XML_Parser parser, 2504 const char *start, 2505 const char *end, 2506 const char **endPtr) 2466 2507 { 2467 2508 const char *next; … … 2494 2535 } 2495 2536 2496 static XMLERROR externalEntityInitProcessor3(XML_Parser parser, 2497 const char *start, 2498 const char *end, 2499 const char **endPtr) 2537 static 2538 XMLERROR externalEntityInitProcessor3(XML_Parser parser, 2539 const char *start, 2540 const char *end, 2541 const char **endPtr) 2500 2542 { 2501 2543 const char *next; … … 2535 2577 } 2536 2578 2537 static XMLERROR externalEntityContentProcessor(XML_Parser parser, 2538 const char *start, 2539 const char *end, 2540 const char **endPtr) 2579 static 2580 XMLERROR externalEntityContentProcessor(XML_Parser parser, 2581 const char *start, 2582 const char *end, 2583 const char **endPtr) 2541 2584 { 2542 2585 return doContent(parser, 1, encoding, start, end, endPtr); 2543 2586 } 2544 2587 2545 static XMLERROR 2546 doContent(XML_Parser parser, 2547 int startTagLevel, 2548 const ENCODING * enc, 2549 const char *s, 2550 const char *end, 2551 const char **nextPtr) 2588 /* 2589 *@@ doContent: 2590 * 2591 *@@changed V0.9.14 (2001-08-09) [umoeller]: fixed ERROR_EXPAT_UNDEFINED_ENTITY with callback-defined encodings 2592 */ 2593 2594 static XMLERROR doContent(XML_Parser parser, 2595 int startTagLevel, 2596 const ENCODING * enc, 2597 const char *s, 2598 const char *end, 2599 const char **nextPtr) 2552 2600 { 2553 2601 const char **eventPP; … … 2627 2675 const XML_Char *name; 2628 2676 ENTITY *entity; 2677 unsigned long ulOfs; // V0.9.14 (2001-08-09) [umoeller] 2629 2678 XML_Char ch = XmlPredefinedEntityName(enc, 2630 s + enc->minBytesPerChar,2631 next - enc->minBytesPerChar);2679 s + enc->minBytesPerChar, 2680 next - enc->minBytesPerChar); 2632 2681 2633 2682 if (ch) … … 2639 2688 break; 2640 2689 } 2641 name = poolStoreString(&dtd.pool, enc, 2690 name = poolStoreString(&dtd.pool, 2691 enc, 2642 2692 s + enc->minBytesPerChar, 2643 next - enc->minBytesPerChar); 2693 next - enc->minBytesPerChar, 2694 &ulOfs); 2644 2695 if (!name) 2645 2696 return ERROR_EXPAT_NO_MEMORY; 2646 entity = (ENTITY*)lookup(&dtd.generalEntities, name, 0); 2697 entity = (ENTITY*)lookup(&dtd.generalEntities, 2698 name + ulOfs, // V0.9.14 (2001-08-09) [umoeller] 2699 0); 2647 2700 poolDiscard(&dtd.pool); 2648 2701 if (!entity) … … 2696 2749 if (!context) 2697 2750 return ERROR_EXPAT_NO_MEMORY; 2698 if (!externalEntityRefHandler(externalEntityRefHandlerArg, 2751 if (!externalEntityRefHandler(handlerArg, // V0.9.14 (2001-08-09) [umoeller] 2752 externalEntityRefHandlerArg, 2699 2753 context, 2700 2754 entity->base, … … 2729 2783 else 2730 2784 { 2731 tag = (TAG*)MALLOC(sizeof(TAG));2785 tag = MALLOC(sizeof(TAG)); 2732 2786 if (!tag) 2733 2787 return ERROR_EXPAT_NO_MEMORY; 2734 tag->buf = (char*)MALLOC(INIT_TAG_BUF_SIZE);2788 tag->buf = MALLOC(INIT_TAG_BUF_SIZE); 2735 2789 if (!tag->buf) 2736 2790 return ERROR_EXPAT_NO_MEMORY; … … 2752 2806 2753 2807 bufSize = ROUND_UP(bufSize, sizeof(XML_Char)); 2754 tag->buf = (char*)REALLOC(tag->buf, bufSize);2808 tag->buf = REALLOC(tag->buf, bufSize); 2755 2809 if (!tag->buf) 2756 2810 return ERROR_EXPAT_NO_MEMORY; … … 2773 2827 2774 2828 if (nextPtr) 2775 toPtr = (XML_Char *)(tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)));2829 toPtr = (XML_Char *) (tag->buf + ROUND_UP(tag->rawNameLength, sizeof(XML_Char))); 2776 2830 else 2777 toPtr = (XML_Char *)tag->buf;2831 toPtr = (XML_Char *) tag->buf; 2778 2832 tag->name.str = toPtr; 2779 2833 XmlConvert(enc, 2780 2834 &fromPtr, rawNameEnd, 2781 (ICHAR **) & toPtr, (ICHAR *)tag->bufEnd - 1);2835 (ICHAR **) & toPtr, (ICHAR *) tag->bufEnd - 1); 2782 2836 if (fromPtr == rawNameEnd) 2783 2837 break; 2784 2838 bufSize = (tag->bufEnd - tag->buf) << 1; 2785 tag->buf = (char*)REALLOC(tag->buf, bufSize);2839 tag->buf = REALLOC(tag->buf, bufSize); 2786 2840 if (!tag->buf) 2787 2841 return ERROR_EXPAT_NO_MEMORY; … … 2822 2876 TAG_NAME name; 2823 2877 2824 name.str = poolStoreString(&tempPool, enc, rawName, 2825 rawName + XmlNameLength(enc, rawName)); 2878 name.str = poolStoreString(&tempPool, 2879 enc, 2880 rawName, 2881 rawName + XmlNameLength(enc, rawName), 2882 NULL); 2826 2883 if (!name.str) 2827 2884 return ERROR_EXPAT_NO_MEMORY; … … 2882 2939 if (tag->name.localPart) 2883 2940 { 2884 XML_Char *to = (XML_Char *)tag->name.str + tag->name.uriLen;2941 XML_Char *to = (XML_Char *) tag->name.str + tag->name.uriLen; 2885 2942 const XML_Char *from = tag->name.localPart; 2886 2943 … … 2917 2974 XML_Char buf[XML_ENCODE_MAX]; 2918 2975 2919 characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));2976 characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *) buf)); 2920 2977 } 2921 2978 else if (defaultHandler) … … 2976 3033 if (MUST_CONVERT(enc, s)) 2977 3034 { 2978 ICHAR *dataPtr = (ICHAR *)dataBuf;2979 2980 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);2981 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);3035 ICHAR *dataPtr = (ICHAR *) dataBuf; 3036 3037 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *) dataBufEnd); 3038 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *) dataBuf); 2982 3039 } 2983 3040 else 2984 3041 characterDataHandler(handlerArg, 2985 (XML_Char *)s,2986 (XML_Char *)end - (XML_Char*)s);3042 (XML_Char *) s, 3043 (XML_Char *) end - (XML_Char *) s); 2987 3044 } 2988 3045 else if (defaultHandler) … … 3006 3063 for (;;) 3007 3064 { 3008 ICHAR *dataPtr = (ICHAR *)dataBuf;3009 3010 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);3065 ICHAR *dataPtr = (ICHAR *) dataBuf; 3066 3067 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *) dataBufEnd); 3011 3068 *eventEndPP = s; 3012 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);3069 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *) dataBuf); 3013 3070 if (s == next) 3014 3071 break; … … 3018 3075 else 3019 3076 characterDataHandler(handlerArg, 3020 (XML_Char *)s,3021 (XML_Char *)next - (XML_Char*)s);3077 (XML_Char *) s, 3078 (XML_Char *) next - (XML_Char *) s); 3022 3079 } 3023 3080 else if (defaultHandler) … … 3045 3102 * otherwise just check the attributes for well-formedness. */ 3046 3103 3047 static XMLERROR storeAtts(XML_Parser parser, 3048 const ENCODING * enc, 3049 const char *attStr, 3050 TAG_NAME * tagNamePtr, 3051 BINDING ** bindingsPtr) 3104 static XMLERROR storeAtts(XML_Parser parser, const ENCODING * enc, 3105 const char *attStr, TAG_NAME * tagNamePtr, 3106 BINDING ** bindingsPtr) 3052 3107 { 3053 3108 ELEMENT_TYPE *elementType = 0; … … 3064 3119 if (tagNamePtr) 3065 3120 { 3066 elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, 0);3121 elementType = (ELEMENT_TYPE *) lookup(&dtd.elementTypes, tagNamePtr->str, 0); 3067 3122 if (!elementType) 3068 3123 { … … 3070 3125 if (!tagNamePtr->str) 3071 3126 return ERROR_EXPAT_NO_MEMORY; 3072 elementType = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, tagNamePtr->str, sizeof(ELEMENT_TYPE));3127 elementType = (ELEMENT_TYPE *) lookup(&dtd.elementTypes, tagNamePtr->str, sizeof(ELEMENT_TYPE)); 3073 3128 if (!elementType) 3074 3129 return ERROR_EXPAT_NO_MEMORY; … … 3085 3140 3086 3141 attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; 3087 atts = (PATTRIBUTE)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));3142 atts = REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); 3088 3143 if (!atts) 3089 3144 return ERROR_EXPAT_NO_MEMORY; … … 3147 3202 { 3148 3203 /* the value did not need normalizing */ 3149 appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, atts[i].valueEnd); 3204 appAtts[attIndex] = poolStoreString(&tempPool, 3205 enc, 3206 atts[i].valuePtr, 3207 atts[i].valueEnd, 3208 NULL); 3150 3209 if (appAtts[attIndex] == 0) 3151 3210 return ERROR_EXPAT_NO_MEMORY; … … 3231 3290 ATTRIBUTE_ID *id; 3232 3291 3233 ((XML_Char *)(appAtts[i]))[-1] = 0;3234 id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, appAtts[i], 0);3292 ((XML_Char *) (appAtts[i]))[-1] = 0; 3293 id = (ATTRIBUTE_ID *) lookup(&dtd.attributeIds, appAtts[i], 0); 3235 3294 if (id->prefix->binding) 3236 3295 { … … 3271 3330 } 3272 3331 else 3273 ((XML_Char *)(appAtts[i]))[-1] = 0;3332 ((XML_Char *) (appAtts[i]))[-1] = 0; 3274 3333 } 3275 3334 } 3276 3335 /* clear the flags that say whether attributes were specified */ 3277 3336 for (; i < attIndex; i += 2) 3278 ((XML_Char *)(appAtts[i]))[-1] = 0;3337 ((XML_Char *) (appAtts[i]))[-1] = 0; 3279 3338 if (!tagNamePtr) 3280 3339 return ERROR_EXPAT_NONE; … … 3306 3365 { 3307 3366 TAG *p; 3308 XML_Char *uri = (XML_Char*)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));3367 XML_Char *uri = MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); 3309 3368 3310 3369 if (!uri) … … 3323 3382 } 3324 3383 3325 static int addBinding(XML_Parser parser, PREFIX * prefix, const ATTRIBUTE_ID * attId, const XML_Char * uri, BINDING ** bindingsPtr) 3384 static 3385 int addBinding(XML_Parser parser, PREFIX * prefix, const ATTRIBUTE_ID * attId, const XML_Char * uri, BINDING ** bindingsPtr) 3326 3386 { 3327 3387 BINDING *b; … … 3337 3397 if (len > b->uriAlloc) 3338 3398 { 3339 b->uri = (XML_Char*)REALLOC(b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE));3399 b->uri = REALLOC(b->uri, sizeof(XML_Char) * (len + EXPAND_SPARE)); 3340 3400 if (!b->uri) 3341 3401 return 0; … … 3346 3406 else 3347 3407 { 3348 b = (PBINDING)MALLOC(sizeof(BINDING));3408 b = MALLOC(sizeof(BINDING)); 3349 3409 if (!b) 3350 3410 return 0; 3351 b->uri = (XML_Char*)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));3411 b->uri = MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); 3352 3412 if (!b->uri) 3353 3413 { … … 3379 3439 * the whole file is parsed with one call. */ 3380 3440 3381 static XMLERROR cdataSectionProcessor(XML_Parser parser, 3382 const char *start, 3383 const char *end, 3384 const char **endPtr) 3441 static 3442 XMLERROR cdataSectionProcessor(XML_Parser parser, 3443 const char *start, 3444 const char *end, 3445 const char **endPtr) 3385 3446 { 3386 3447 XMLERROR result = doCdataSection(parser, encoding, &start, end, endPtr); … … 3397 3458 * the section is not yet closed. */ 3398 3459 3399 static XMLERROR doCdataSection(XML_Parser parser, 3400 const ENCODING * enc, 3401 const char **startPtr, 3402 const char *end, 3403 const char **nextPtr) 3460 static 3461 XMLERROR doCdataSection(XML_Parser parser, 3462 const ENCODING * enc, 3463 const char **startPtr, 3464 const char *end, 3465 const char **nextPtr) 3404 3466 { 3405 3467 const char *s = *startPtr; … … 3457 3519 for (;;) 3458 3520 { 3459 ICHAR *dataPtr = (ICHAR *)dataBuf;3460 3461 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);3521 ICHAR *dataPtr = (ICHAR *) dataBuf; 3522 3523 XmlConvert(enc, &s, next, &dataPtr, (ICHAR *) dataBufEnd); 3462 3524 *eventEndPP = next; 3463 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);3525 characterDataHandler(handlerArg, dataBuf, dataPtr - (ICHAR *) dataBuf); 3464 3526 if (s == next) 3465 3527 break; … … 3469 3531 else 3470 3532 characterDataHandler(handlerArg, 3471 (XML_Char *)s,3472 (XML_Char *)next - (XML_Char*)s);3533 (XML_Char *) s, 3534 (XML_Char *) next - (XML_Char *) s); 3473 3535 } 3474 3536 else if (defaultHandler) … … 3507 3569 * the whole file is parsed with one call. */ 3508 3570 3509 static XMLERROR ignoreSectionProcessor(XML_Parser parser, 3510 const char *start, 3511 const char *end, 3512 const char **endPtr) 3571 static 3572 XMLERROR ignoreSectionProcessor(XML_Parser parser, 3573 const char *start, 3574 const char *end, 3575 const char **endPtr) 3513 3576 { 3514 3577 XMLERROR result = doIgnoreSection(parser, encoding, &start, end, endPtr); … … 3525 3588 * the section is not yet closed. */ 3526 3589 3527 static XMLERROR doIgnoreSection(XML_Parser parser, 3528 const ENCODING * enc, 3529 const char **startPtr, 3530 const char *end, 3531 const char **nextPtr) 3590 static 3591 XMLERROR doIgnoreSection(XML_Parser parser, 3592 const ENCODING * enc, 3593 const char **startPtr, 3594 const char *end, 3595 const char **nextPtr) 3532 3596 { 3533 3597 const char *next; … … 3576 3640 return ERROR_EXPAT_NONE; 3577 3641 } 3578 return ERROR_EXPAT_SYNTAX; 3642 return ERROR_EXPAT_SYNTAX; /* ERROR_EXPAT_UNCLOSED_IGNORE_SECTION */ 3579 3643 default: 3580 3644 *eventPP = next; … … 3586 3650 #endif /* XML_DTD */ 3587 3651 3588 static XMLERROR initializeEncoding(XML_Parser parser) 3652 static XMLERROR 3653 initializeEncoding(XML_Parser parser) 3589 3654 { 3590 3655 const char *s; … … 3620 3685 } 3621 3686 3622 static XMLERROR processXmlDecl(XML_Parser parser, int isGeneralTextEntity, 3687 static XMLERROR 3688 processXmlDecl(XML_Parser parser, int isGeneralTextEntity, 3623 3689 const char *s, const char *next) 3624 3690 { … … 3660 3726 encodingName, 3661 3727 encodingName 3662 + XmlNameLength(encoding, encodingName)); 3728 + XmlNameLength(encoding, encodingName), 3729 NULL); 3663 3730 if (!storedEncName) 3664 3731 return ERROR_EXPAT_NO_MEMORY; … … 3670 3737 encoding, 3671 3738 version, 3672 versionend - encoding->minBytesPerChar); 3739 versionend - encoding->minBytesPerChar, 3740 NULL); 3673 3741 if (!storedversion) 3674 3742 return ERROR_EXPAT_NO_MEMORY; … … 3699 3767 encodingName, 3700 3768 encodingName 3701 + XmlNameLength(encoding, encodingName)); 3769 + XmlNameLength(encoding, encodingName), 3770 NULL); 3702 3771 if (!storedEncName) 3703 3772 return ERROR_EXPAT_NO_MEMORY; … … 3717 3786 } 3718 3787 3719 static XMLERROR handleUnknownEncoding(XML_Parser parser,3720 const XML_Char* encodingName)3788 static XMLERROR 3789 handleUnknownEncoding(XML_Parser parser, const XML_Char * encodingName) 3721 3790 { 3722 3791 if (unknownEncodingHandler) … … 3730 3799 info.data = 0; 3731 3800 info.release = 0; 3732 if (unknownEncodingHandler(unknownEncodingHandlerData, 3733 encodingName, 3734 &info)) 3801 if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, &info)) 3735 3802 { 3736 3803 ENCODING *enc; … … 3763 3830 } 3764 3831 3765 static XMLERROR prologInitProcessor(XML_Parser parser, 3832 static XMLERROR 3833 prologInitProcessor(XML_Parser parser, 3766 3834 const char *s, 3767 3835 const char *end, … … 3776 3844 } 3777 3845 3778 static XMLERROR prologProcessor(XML_Parser parser, 3846 static XMLERROR 3847 prologProcessor(XML_Parser parser, 3779 3848 const char *s, 3780 3849 const char *end, … … 3787 3856 } 3788 3857 3789 static XMLERROR doProlog(XML_Parser parser, 3858 static XMLERROR 3859 doProlog(XML_Parser parser, 3790 3860 const ENCODING * enc, 3791 3861 const char *s, … … 3872 3942 if (startDoctypeDeclHandler) 3873 3943 { 3874 doctypeName = poolStoreString(&tempPool, enc, s, next );3944 doctypeName = poolStoreString(&tempPool, enc, s, next, NULL); 3875 3945 if (!doctypeName) 3876 3946 return ERROR_EXPAT_NO_MEMORY; … … 3903 3973 if (startDoctypeDeclHandler) 3904 3974 { 3905 doctypePubid = poolStoreString(&tempPool, enc, s + 1, next - 1 );3975 doctypePubid = poolStoreString(&tempPool, enc, s + 1, next - 1, NULL); 3906 3976 if (!doctypePubid) 3907 3977 return ERROR_EXPAT_NO_MEMORY; … … 3909 3979 } 3910 3980 #ifdef XML_DTD 3911 declEntity = (ENTITY *)lookup(&dtd.paramEntities,3981 declEntity = (ENTITY *) lookup(&dtd.paramEntities, 3912 3982 externalSubsetName, 3913 3983 sizeof(ENTITY)); … … 3924 3994 enc, 3925 3995 s + enc->minBytesPerChar, 3926 next - enc->minBytesPerChar); 3996 next - enc->minBytesPerChar, 3997 NULL); 3927 3998 3928 3999 if (!tem) … … 3946 4017 if (paramEntityParsing && externalEntityRefHandler) 3947 4018 { 3948 ENTITY *entity = (ENTITY *)lookup(&dtd.paramEntities,4019 ENTITY *entity = (ENTITY *) lookup(&dtd.paramEntities, 3949 4020 externalSubsetName, 3950 4021 0); 3951 4022 3952 if (!externalEntityRefHandler(externalEntityRefHandlerArg, 4023 if (!externalEntityRefHandler(handlerArg, // V0.9.14 (2001-08-09) [umoeller] 4024 externalEntityRefHandlerArg, 3953 4025 0, 3954 4026 entity->base, … … 4028 4100 if (!poolAppendString(&tempPool, prefix)) 4029 4101 return ERROR_EXPAT_NO_MEMORY; 4030 if (!poolAppend(&tempPool, enc, s, next ))4102 if (!poolAppend(&tempPool, enc, s, next, NULL)) 4031 4103 return ERROR_EXPAT_NO_MEMORY; 4032 4104 declAttributeType = tempPool.start; … … 4043 4115 { 4044 4116 if (*declAttributeType == '(' 4045 || *declAttributeType == 'N' && declAttributeType[1] == 'O')4117 || (*declAttributeType == 'N' && declAttributeType[1] == 'O')) 4046 4118 { 4047 4119 /* Enumerated or Notation type */ … … 4080 4152 { 4081 4153 if (*declAttributeType == '(' 4082 || *declAttributeType == 'N' && declAttributeType[1] == 'O')4154 || (*declAttributeType == 'N' && declAttributeType[1] == 'O')) 4083 4155 { 4084 4156 /* Enumerated or Notation type */ … … 4129 4201 if (startDoctypeDeclHandler) 4130 4202 { 4131 doctypeSysid = poolStoreString(&tempPool, enc, s + 1, next - 1); 4203 doctypeSysid = poolStoreString(&tempPool, 4204 enc, 4205 s + 1, 4206 next - 1, 4207 NULL); 4132 4208 if (!doctypeSysid) 4133 4209 return ERROR_EXPAT_NO_MEMORY; … … 4147 4223 if (!declEntity) 4148 4224 { 4149 declEntity = (ENTITY *)lookup(&dtd.paramEntities,4225 declEntity = (ENTITY *) lookup(&dtd.paramEntities, 4150 4226 externalSubsetName, 4151 4227 sizeof(ENTITY)); … … 4159 4235 if (declEntity) 4160 4236 { 4161 declEntity->systemId = poolStoreString(&dtd.pool, enc, 4162 s + enc->minBytesPerChar, 4163 next - enc->minBytesPerChar); 4237 declEntity->systemId = poolStoreString(&dtd.pool, 4238 enc, 4239 s + enc->minBytesPerChar, 4240 next - enc->minBytesPerChar, 4241 NULL); 4164 4242 if (!declEntity->systemId) 4165 4243 return ERROR_EXPAT_NO_MEMORY; … … 4184 4262 if (declEntity) 4185 4263 { 4186 declEntity->notation = poolStoreString(&dtd.pool, enc, s, next); 4264 declEntity->notation = poolStoreString(&dtd.pool, 4265 enc, 4266 s, 4267 next, 4268 NULL); 4187 4269 if (!declEntity->notation) 4188 4270 return ERROR_EXPAT_NO_MEMORY; … … 4220 4302 break; 4221 4303 } 4222 name = poolStoreString(&dtd.pool, enc, s, next); 4304 name = poolStoreString(&dtd.pool, 4305 enc, 4306 s, 4307 next, 4308 NULL); 4223 4309 if (!name) 4224 4310 return ERROR_EXPAT_NO_MEMORY; 4225 4311 if (dtd.complete) 4226 4312 { 4227 declEntity = (ENTITY *)lookup(&dtd.generalEntities, name, sizeof(ENTITY));4313 declEntity = (ENTITY *) lookup(&dtd.generalEntities, name, sizeof(ENTITY)); 4228 4314 if (!declEntity) 4229 4315 return ERROR_EXPAT_NO_MEMORY; … … 4251 4337 if (dtd.complete) 4252 4338 { 4253 const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next );4339 const XML_Char *name = poolStoreString(&dtd.pool, enc, s, next, NULL); 4254 4340 4255 4341 if (!name) 4256 4342 return ERROR_EXPAT_NO_MEMORY; 4257 declEntity = (ENTITY *)lookup(&dtd.paramEntities,4343 declEntity = (ENTITY *) lookup(&dtd.paramEntities, 4258 4344 name, sizeof(ENTITY)); 4259 4345 if (!declEntity) … … 4280 4366 if (notationDeclHandler) 4281 4367 { 4282 declNotationName = poolStoreString(&tempPool, enc, s, next );4368 declNotationName = poolStoreString(&tempPool, enc, s, next, NULL); 4283 4369 if (!declNotationName) 4284 4370 return ERROR_EXPAT_NO_MEMORY; … … 4294 4380 enc, 4295 4381 s + enc->minBytesPerChar, 4296 next - enc->minBytesPerChar); 4382 next - enc->minBytesPerChar, 4383 NULL); 4297 4384 4298 4385 if (!tem) … … 4309 4396 = poolStoreString(&tempPool, enc, 4310 4397 s + enc->minBytesPerChar, 4311 next - enc->minBytesPerChar); 4398 next - enc->minBytesPerChar, 4399 NULL); 4312 4400 4313 4401 if (!systemId) … … 4365 4453 if (groupSize) 4366 4454 { 4367 groupConnector = (char*)REALLOC(groupConnector, groupSize *= 2);4455 groupConnector = REALLOC(groupConnector, groupSize *= 2); 4368 4456 if (dtd.scaffIndex) 4369 dtd.scaffIndex = (int*)REALLOC(dtd.scaffIndex, groupSize * sizeof(int));4457 dtd.scaffIndex = REALLOC(dtd.scaffIndex, groupSize * sizeof(int)); 4370 4458 } 4371 4459 else 4372 groupConnector = (char*)MALLOC(groupSize = 32);4460 groupConnector = MALLOC(groupSize = 32); 4373 4461 if (!groupConnector) 4374 4462 return ERROR_EXPAT_NO_MEMORY; … … 4414 4502 name = poolStoreString(&dtd.pool, enc, 4415 4503 s + enc->minBytesPerChar, 4416 next - enc->minBytesPerChar); 4504 next - enc->minBytesPerChar, 4505 NULL); 4417 4506 if (!name) 4418 4507 return ERROR_EXPAT_NO_MEMORY; 4419 entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0);4508 entity = (ENTITY *) lookup(&dtd.paramEntities, name, 0); 4420 4509 poolDiscard(&dtd.pool); 4421 4510 if (!entity) … … 4441 4530 dtd.complete = 0; 4442 4531 entity->open = 1; 4443 if (!externalEntityRefHandler(externalEntityRefHandlerArg, 4532 if (!externalEntityRefHandler(handlerArg, // V0.9.14 (2001-08-09) [umoeller] 4533 externalEntityRefHandlerArg, 4444 4534 0, 4445 4535 entity->base, … … 4485 4575 if (elementDeclHandler) 4486 4576 { 4487 XMLCONTENT *content = (XMLCONTENT *)MALLOC(sizeof(XMLCONTENT));4577 XMLCONTENT *content = (XMLCONTENT *) MALLOC(sizeof(XMLCONTENT)); 4488 4578 4489 4579 if (!content) … … 4614 4704 } 4615 4705 4616 static XMLERROR epilogProcessor(XML_Parser parser, 4617 const char *s, 4618 const char *end, 4619 const char **nextPtr) 4706 static 4707 XMLERROR epilogProcessor(XML_Parser parser, 4708 const char *s, 4709 const char *end, 4710 const char **nextPtr) 4620 4711 { 4621 4712 processor = epilogProcessor; … … 4678 4769 #ifdef XML_DTD 4679 4770 4680 static XMLERROR processInternalParamEntity(XML_Parser parser, ENTITY * entity) 4771 static XMLERROR 4772 processInternalParamEntity(XML_Parser parser, ENTITY * entity) 4681 4773 { 4682 4774 const char *s, *end, *next; … … 4702 4794 #endif /* XML_DTD */ 4703 4795 4704 static XMLERROR errorProcessor(XML_Parser parser, 4705 const char *s, 4706 const char *end, 4707 const char **nextPtr) 4796 static 4797 XMLERROR errorProcessor(XML_Parser parser, 4798 const char *s, 4799 const char *end, 4800 const char **nextPtr) 4708 4801 { 4709 4802 return errorCode; 4710 4803 } 4711 4804 4712 static XMLERROR storeAttributeValue(XML_Parser parser, 4713 const ENCODING * enc, 4714 int isCdata, 4715 const char *ptr, 4716 const char *end, 4717 STRING_POOL * pool) 4805 static XMLERROR 4806 storeAttributeValue(XML_Parser parser, const ENCODING * enc, int isCdata, 4807 const char *ptr, const char *end, 4808 STRING_POOL * pool) 4718 4809 { 4719 4810 XMLERROR result = appendAttributeValue(parser, enc, isCdata, ptr, end, pool); … … 4728 4819 } 4729 4820 4730 static XMLERROR appendAttributeValue(XML_Parser parser, const ENCODING * enc, int isCdata, 4731 const char *ptr, const char *end, 4732 STRING_POOL * pool) 4821 4822 /* 4823 *@@ appendAttributeValue: 4824 * 4825 *@@changed V0.9.14 (2001-08-09) [umoeller]: fixed ERROR_EXPAT_UNDEFINED_ENTITY with callback-defined encodings 4826 */ 4827 4828 static XMLERROR appendAttributeValue(XML_Parser parser, 4829 const ENCODING * enc, 4830 int isCdata, 4831 const char *ptr, 4832 const char *end, 4833 STRING_POOL * pool) 4733 4834 { 4734 4835 for (;;) … … 4765 4866 && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) 4766 4867 break; 4767 n = XmlEncode(n, (ICHAR *)buf);4868 n = XmlEncode(n, (ICHAR *) buf); 4768 4869 if (!n) 4769 4870 { … … 4780 4881 break; 4781 4882 case XML_TOK_DATA_CHARS: 4782 if (!poolAppend(pool, enc, ptr, next ))4883 if (!poolAppend(pool, enc, ptr, next, NULL)) 4783 4884 return ERROR_EXPAT_NO_MEMORY; 4885 break; 4784 4886 break; 4785 4887 case XML_TOK_TRAILING_CR: … … 4797 4899 const XML_Char *name; 4798 4900 ENTITY *entity; 4901 unsigned long ulOfs; // V0.9.14 (2001-08-09) [umoeller] 4799 4902 XML_Char ch = XmlPredefinedEntityName(enc, 4800 4903 ptr + enc->minBytesPerChar, … … 4809 4912 name = poolStoreString(&temp2Pool, enc, 4810 4913 ptr + enc->minBytesPerChar, 4811 next - enc->minBytesPerChar); 4914 next - enc->minBytesPerChar, 4915 &ulOfs); // V0.9.14 (2001-08-09) [umoeller] 4812 4916 if (!name) 4813 4917 return ERROR_EXPAT_NO_MEMORY; 4814 entity = (ENTITY*)lookup(&dtd.generalEntities, name, 0); 4918 entity = (ENTITY *) lookup(&dtd.generalEntities, 4919 name + ulOfs, // V0.9.14 (2001-08-09) [umoeller] 4920 0); 4815 4921 poolDiscard(&temp2Pool); 4816 4922 if (!entity) … … 4864 4970 } 4865 4971 4866 static XMLERROR storeEntityValue(XML_Parser parser, 4867 const ENCODING * enc, 4868 const char *entityTextPtr, 4869 const char *entityTextEnd) 4972 static 4973 XMLERROR storeEntityValue(XML_Parser parser, 4974 const ENCODING * enc, 4975 const char *entityTextPtr, 4976 const char *entityTextEnd) 4870 4977 { 4871 4978 STRING_POOL *pool = &(dtd.pool); … … 4887 4994 4888 4995 name = poolStoreString(&tempPool, enc, 4889 entityTextPtr + enc->minBytesPerChar, 4890 next - enc->minBytesPerChar); 4996 entityTextPtr + enc->minBytesPerChar, 4997 next - enc->minBytesPerChar, 4998 NULL); 4891 4999 if (!name) 4892 5000 return ERROR_EXPAT_NO_MEMORY; 4893 entity = (ENTITY *)lookup(&dtd.paramEntities, name, 0);5001 entity = (ENTITY *) lookup(&dtd.paramEntities, name, 0); 4894 5002 poolDiscard(&tempPool); 4895 5003 if (!entity) … … 4928 5036 case XML_TOK_ENTITY_REF: 4929 5037 case XML_TOK_DATA_CHARS: 4930 if (!poolAppend(pool, enc, entityTextPtr, next ))5038 if (!poolAppend(pool, enc, entityTextPtr, next, NULL)) 4931 5039 return ERROR_EXPAT_NO_MEMORY; 4932 5040 break; … … 4951 5059 return ERROR_EXPAT_BAD_CHAR_REF; 4952 5060 } 4953 n = XmlEncode(n, (ICHAR *)buf);5061 n = XmlEncode(n, (ICHAR *) buf); 4954 5062 if (!n) 4955 5063 { … … 4984 5092 } 4985 5093 4986 static void normalizeLines(XML_Char * s) 5094 static void 5095 normalizeLines(XML_Char * s) 4987 5096 { 4988 5097 XML_Char *p; … … 5011 5120 } 5012 5121 5013 static int reportProcessingInstruction(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5122 static int 5123 reportProcessingInstruction(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5014 5124 { 5015 5125 const XML_Char *target; … … 5025 5135 start += enc->minBytesPerChar * 2; 5026 5136 tem = start + XmlNameLength(enc, start); 5027 target = poolStoreString(&tempPool, enc, start, tem );5137 target = poolStoreString(&tempPool, enc, start, tem, NULL); 5028 5138 if (!target) 5029 5139 return 0; … … 5031 5141 data = poolStoreString(&tempPool, enc, 5032 5142 XmlSkipS(enc, tem), 5033 end - enc->minBytesPerChar * 2); 5143 end - enc->minBytesPerChar * 2, 5144 NULL); 5034 5145 if (!data) 5035 5146 return 0; … … 5040 5151 } 5041 5152 5042 static int reportComment(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5153 static int 5154 reportComment(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5043 5155 { 5044 5156 XML_Char *data; … … 5053 5165 enc, 5054 5166 start + enc->minBytesPerChar * 4, 5055 end - enc->minBytesPerChar * 3); 5167 end - enc->minBytesPerChar * 3, 5168 NULL); 5056 5169 if (!data) 5057 5170 return 0; … … 5062 5175 } 5063 5176 5064 static void reportDefault(XML_Parser parser, const ENCODING * enc, const char *s, const char *end) 5177 static void 5178 reportDefault(XML_Parser parser, const ENCODING * enc, const char *s, const char *end) 5065 5179 { 5066 5180 if (MUST_CONVERT(enc, s)) … … 5081 5195 do 5082 5196 { 5083 ICHAR *dataPtr = (ICHAR *)dataBuf;5084 5085 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);5197 ICHAR *dataPtr = (ICHAR *) dataBuf; 5198 5199 XmlConvert(enc, &s, end, &dataPtr, (ICHAR *) dataBufEnd); 5086 5200 *eventEndPP = s; 5087 defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf);5201 defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *) dataBuf); 5088 5202 *eventPP = s; 5089 5203 } … … 5091 5205 } 5092 5206 else 5093 defaultHandler(handlerArg, (XML_Char*)s, (XML_Char*)end - (XML_Char*)s); 5094 } 5095 5096 5097 static int defineAttribute(ELEMENT_TYPE * type, ATTRIBUTE_ID * attId, int isCdata, 5207 defaultHandler(handlerArg, (XML_Char *) s, (XML_Char *) end - (XML_Char *) s); 5208 } 5209 5210 5211 static int 5212 defineAttribute(ELEMENT_TYPE * type, ATTRIBUTE_ID * attId, int isCdata, 5098 5213 int isId, const XML_Char * value, XML_Parser parser) 5099 5214 { … … 5117 5232 { 5118 5233 type->allocDefaultAtts = 8; 5119 type->defaultAtts = (PDEFAULT_ATTRIBUTE)MALLOC(type->allocDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));5234 type->defaultAtts = MALLOC(type->allocDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); 5120 5235 } 5121 5236 else 5122 5237 { 5123 5238 type->allocDefaultAtts *= 2; 5124 type->defaultAtts = (PDEFAULT_ATTRIBUTE)REALLOC(type->defaultAtts,5239 type->defaultAtts = REALLOC(type->defaultAtts, 5125 5240 type->allocDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); 5126 5241 } … … 5156 5271 if (!poolAppendChar(&dtd.pool, XML_T('\0'))) 5157 5272 return 0; 5158 prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX));5273 prefix = (PREFIX *) lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); 5159 5274 if (!prefix) 5160 5275 return 0; … … 5170 5285 } 5171 5286 5172 static ATTRIBUTE_ID* getAttributeId(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5287 static ATTRIBUTE_ID * 5288 getAttributeId(XML_Parser parser, const ENCODING * enc, const char *start, const char *end) 5173 5289 { 5174 5290 ATTRIBUTE_ID *id; … … 5177 5293 if (!poolAppendChar(&dtd.pool, XML_T('\0'))) 5178 5294 return 0; 5179 name = poolStoreString(&dtd.pool, enc, start, end );5295 name = poolStoreString(&dtd.pool, enc, start, end, NULL); 5180 5296 if (!name) 5181 5297 return 0; 5182 5298 ++name; 5183 id = (ATTRIBUTE_ID *)lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID));5299 id = (ATTRIBUTE_ID *) lookup(&dtd.attributeIds, name, sizeof(ATTRIBUTE_ID)); 5184 5300 if (!id) 5185 5301 return 0; … … 5201 5317 id->prefix = &dtd.defaultPrefix; 5202 5318 else 5203 id->prefix = (PREFIX *)lookup(&dtd.prefixes, name + 6, sizeof(PREFIX));5319 id->prefix = (PREFIX *) lookup(&dtd.prefixes, name + 6, sizeof(PREFIX)); 5204 5320 id->xmlns = 1; 5205 5321 } … … 5221 5337 if (!poolAppendChar(&dtd.pool, XML_T('\0'))) 5222 5338 return 0; 5223 id->prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX));5339 id->prefix = (PREFIX *) lookup(&dtd.prefixes, poolStart(&dtd.pool), sizeof(PREFIX)); 5224 5340 if (id->prefix->name == poolStart(&dtd.pool)) 5225 5341 poolFinish(&dtd.pool); … … 5236 5352 #define CONTEXT_SEP XML_T('\f') 5237 5353 5238 static const XML_Char *getContext(XML_Parser parser) 5354 static 5355 const XML_Char *getContext(XML_Parser parser) 5239 5356 { 5240 5357 HASH_TABLE_ITER iter; … … 5263 5380 int len; 5264 5381 const XML_Char *s; 5265 PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);5382 PREFIX *prefix = (PREFIX *) hashTableIterNext(&iter); 5266 5383 5267 5384 if (!prefix) … … 5290 5407 { 5291 5408 const XML_Char *s; 5292 ENTITY *e = (ENTITY *)hashTableIterNext(&iter);5409 ENTITY *e = (ENTITY *) hashTableIterNext(&iter); 5293 5410 5294 5411 if (!e) … … 5309 5426 } 5310 5427 5311 static int setContext(XML_Parser parser, const XML_Char * context) 5428 static 5429 int setContext(XML_Parser parser, const XML_Char * context) 5312 5430 { 5313 5431 const XML_Char *s = context; … … 5321 5439 if (!poolAppendChar(&tempPool, XML_T('\0'))) 5322 5440 return 0; 5323 e = (ENTITY *)lookup(&dtd.generalEntities, poolStart(&tempPool), 0);5441 e = (ENTITY *) lookup(&dtd.generalEntities, poolStart(&tempPool), 0); 5324 5442 if (e) 5325 5443 e->open = 1; … … 5339 5457 if (!poolAppendChar(&tempPool, XML_T('\0'))) 5340 5458 return 0; 5341 prefix = (PREFIX *)lookup(&dtd.prefixes, poolStart(&tempPool), sizeof(PREFIX));5459 prefix = (PREFIX *) lookup(&dtd.prefixes, poolStart(&tempPool), sizeof(PREFIX)); 5342 5460 if (!prefix) 5343 5461 return 0; … … 5373 5491 5374 5492 5375 static void normalizePublicId(XML_Char * publicId) 5493 static 5494 void normalizePublicId(XML_Char * publicId) 5376 5495 { 5377 5496 XML_Char *p = publicId; … … 5399 5518 static int dtdInit(DTD * p, XML_Parser parser) 5400 5519 { 5401 XML_Memory_Handling_Suite *ms = &((Parser *)parser)->m_mem;5520 XML_Memory_Handling_Suite *ms = &((Parser *) parser)->m_mem; 5402 5521 5403 5522 poolInit(&(p->pool), ms); … … 5445 5564 for (;;) 5446 5565 { 5447 ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);5566 ELEMENT_TYPE *e = (ELEMENT_TYPE *) hashTableIterNext(&iter); 5448 5567 5449 5568 if (!e) … … 5466 5585 } 5467 5586 5468 /* 5469 * Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. 5470 * The new DTD has already been initialized. 5471 * 5472 */ 5587 /* Do a deep copy of the DTD. Return 0 for out of memory; non-zero otherwise. 5588 * The new DTD has already been initialized. */ 5473 5589 5474 5590 static int dtdCopy(DTD * newDtd, const DTD * oldDtd, XML_Parser parser) … … 5482 5598 { 5483 5599 const XML_Char *name; 5484 const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);5600 const PREFIX *oldP = (PREFIX *) hashTableIterNext(&iter); 5485 5601 5486 5602 if (!oldP) … … 5501 5617 ATTRIBUTE_ID *newA; 5502 5618 const XML_Char *name; 5503 const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);5619 const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *) hashTableIterNext(&iter); 5504 5620 5505 5621 if (!oldA) … … 5512 5628 return 0; 5513 5629 ++name; 5514 newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID));5630 newA = (ATTRIBUTE_ID *) lookup(&(newDtd->attributeIds), name, sizeof(ATTRIBUTE_ID)); 5515 5631 if (!newA) 5516 5632 return 0; … … 5522 5638 newA->prefix = &newDtd->defaultPrefix; 5523 5639 else 5524 newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldA->prefix->name, 0);5640 newA->prefix = (PREFIX *) lookup(&(newDtd->prefixes), oldA->prefix->name, 0); 5525 5641 } 5526 5642 } … … 5535 5651 ELEMENT_TYPE *newE; 5536 5652 const XML_Char *name; 5537 const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);5653 const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *) hashTableIterNext(&iter); 5538 5654 5539 5655 if (!oldE) … … 5542 5658 if (!name) 5543 5659 return 0; 5544 newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE));5660 newE = (ELEMENT_TYPE *) lookup(&(newDtd->elementTypes), name, sizeof(ELEMENT_TYPE)); 5545 5661 if (!newE) 5546 5662 return 0; 5547 5663 if (oldE->nDefaultAtts) 5548 5664 { 5549 newE->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));5665 newE->defaultAtts = (DEFAULT_ATTRIBUTE *) MALLOC(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); 5550 5666 if (!newE->defaultAtts) 5551 5667 return 0; 5552 5668 } 5553 5669 if (oldE->idAtt) 5554 newE->idAtt = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0);5670 newE->idAtt = (ATTRIBUTE_ID *) lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); 5555 5671 newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; 5556 5672 if (oldE->prefix) 5557 newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), oldE->prefix->name, 0);5673 newE->prefix = (PREFIX *) lookup(&(newDtd->prefixes), oldE->prefix->name, 0); 5558 5674 for (i = 0; i < newE->nDefaultAtts; i++) 5559 5675 { 5560 newE->defaultAtts[i].id = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);5676 newE->defaultAtts[i].id = (ATTRIBUTE_ID *) lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); 5561 5677 newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; 5562 5678 if (oldE->defaultAtts[i].value) … … 5613 5729 ENTITY *newE; 5614 5730 const XML_Char *name; 5615 const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);5731 const ENTITY *oldE = (ENTITY *) hashTableIterNext(&iter); 5616 5732 5617 5733 if (!oldE) … … 5620 5736 if (!name) 5621 5737 return 0; 5622 newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY));5738 newE = (ENTITY *) lookup(newTable, name, sizeof(ENTITY)); 5623 5739 if (!newE) 5624 5740 return 0; … … 5667 5783 #define INIT_SIZE 64 5668 5784 5669 static int keyeq(KEY s1, KEY s2) 5785 static 5786 int keyeq(KEY s1, KEY s2) 5670 5787 { 5671 5788 for (; *s1 == *s2; s1++, s2++) … … 5675 5792 } 5676 5793 5677 static unsigned long hash(KEY s) 5794 static 5795 unsigned long hash(KEY s) 5678 5796 { 5679 5797 unsigned long h = 0; … … 5684 5802 } 5685 5803 5686 static NAMED *lookup(HASH_TABLE * table, KEY name, size_t createSize) 5804 static 5805 NAMED *lookup(HASH_TABLE * table, KEY name, size_t createSize) 5687 5806 { 5688 5807 size_t i; … … 5695 5814 return 0; 5696 5815 tsize = INIT_SIZE * sizeof(NAMED *); 5697 table->v = (NAMED**)table->mem->malloc_fcn(tsize);5816 table->v = table->mem->malloc_fcn(tsize); 5698 5817 if (!table->v) 5699 5818 return 0; … … 5721 5840 size_t newSize = table->size * 2; 5722 5841 size_t tsize = newSize * sizeof(NAMED *); 5723 NAMED **newV = (NAMED**)table->mem->malloc_fcn(tsize);5842 NAMED **newV = table->mem->malloc_fcn(tsize); 5724 5843 5725 5844 if (!newV) … … 5747 5866 } 5748 5867 } 5749 table->v[i] = (NAMED*)table->mem->malloc_fcn(createSize);5868 table->v[i] = table->mem->malloc_fcn(createSize); 5750 5869 if (!table->v[i]) 5751 5870 return 0; … … 5756 5875 } 5757 5876 5758 static void hashTableDestroy(HASH_TABLE * table) 5877 static 5878 void hashTableDestroy(HASH_TABLE * table) 5759 5879 { 5760 5880 size_t i; … … 5771 5891 } 5772 5892 5773 static void hashTableInit(HASH_TABLE * p, XML_Memory_Handling_Suite * ms) 5893 static 5894 void hashTableInit(HASH_TABLE * p, XML_Memory_Handling_Suite * ms) 5774 5895 { 5775 5896 p->size = 0; … … 5780 5901 } 5781 5902 5782 static void hashTableIterInit(HASH_TABLE_ITER * iter, const HASH_TABLE * table) 5903 static 5904 void hashTableIterInit(HASH_TABLE_ITER * iter, const HASH_TABLE * table) 5783 5905 { 5784 5906 iter->p = table->v; … … 5786 5908 } 5787 5909 5788 static NAMED* hashTableIterNext(HASH_TABLE_ITER * iter) 5910 static 5911 NAMED *hashTableIterNext(HASH_TABLE_ITER * iter) 5789 5912 { 5790 5913 while (iter->p != iter->end) … … 5799 5922 5800 5923 5801 static void poolInit(STRING_POOL * pool, XML_Memory_Handling_Suite * ms) 5924 static 5925 void poolInit(STRING_POOL * pool, XML_Memory_Handling_Suite * ms) 5802 5926 { 5803 5927 pool->blocks = 0; … … 5809 5933 } 5810 5934 5811 static void poolClear(STRING_POOL * pool) 5935 static 5936 void poolClear(STRING_POOL * pool) 5812 5937 { 5813 5938 if (!pool->freeBlocks) … … 5832 5957 } 5833 5958 5834 static void poolDestroy(STRING_POOL * pool) 5959 static 5960 void poolDestroy(STRING_POOL * pool) 5835 5961 { 5836 5962 BLOCK *p = pool->blocks; … … 5858 5984 } 5859 5985 5860 static XML_Char *poolAppend(STRING_POOL * pool, const ENCODING * enc, 5861 const char *ptr, const char *end) 5986 /* 5987 *@@ poolAppend: 5988 * appends a new string to a pool. 5989 * Returns pool->start if the pool is valid, 5990 * or NULL if storing failed. 5991 * 5992 * V0.9.14: I added the pulOfs parameter which, after 5993 * the string was stored, receives the offset from 5994 * pool->start at which the string was stored in the 5995 * pool. I am not quite sure how all this works, but 5996 * if a user-defined encoding is in place (via 5997 * XML_SetUnknownEncodingHandler), the first entry 5998 * in the pool is always the encoding name from the 5999 * xml header, and all entity references failed here 6000 * because the lookup would always be done for 6001 * the encoding name instead of the entity name 6002 * (which then is the second entry in the pool). 6003 * Whatever. 6004 * 6005 *@@changed V0.9.14 (2001-08-09) [umoeller]: added pulOfs param 6006 */ 6007 6008 static XML_Char* poolAppend(STRING_POOL * pool, 6009 const ENCODING * enc, 6010 const char *ptr, 6011 const char *end, 6012 unsigned long *pulOfs) // out: offset of beginning of stored 6013 // string from pool->start 6014 // V0.9.14 (2001-08-09) [umoeller] 5862 6015 { 5863 6016 if (!pool->ptr && !poolGrow(pool)) … … 5865 6018 for (;;) 5866 6019 { 5867 XmlConvert(enc, &ptr, end, (ICHAR **) & (pool->ptr), (ICHAR*)pool->end); 6020 char *pOldStart = pool->ptr; 6021 XmlConvert(enc, 6022 &ptr, // fromP 6023 end, 6024 (ICHAR**)&(pool->ptr), // toP 6025 (ICHAR *)pool->end); 6026 // expands to: 6027 // (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) 6028 // -- for cp850, we end up in 6029 // -- for Latin1, we end up in 6030 if (pulOfs) 6031 *pulOfs = pOldStart - pool->start; // V0.9.14 (2001-08-09) [umoeller] 6032 5868 6033 if (ptr == end) 5869 6034 break; … … 5874 6039 } 5875 6040 5876 static const XML_Char *poolCopyString(STRING_POOL * pool, const XML_Char * s) 6041 static const XML_Char* poolCopyString(STRING_POOL *pool, 6042 const XML_Char *s) 5877 6043 { 5878 6044 do … … 5902 6068 } 5903 6069 5904 static const XML_Char* poolAppendString(STRING_POOL * pool, const XML_Char * s) 6070 static const XML_Char* poolAppendString(STRING_POOL *pool, 6071 const XML_Char *s) 5905 6072 { 5906 6073 while (*s) … … 5913 6080 } /* End poolAppendString */ 5914 6081 5915 static XML_Char* poolStoreString(STRING_POOL * pool, const ENCODING * enc, 5916 const char *ptr, const char *end) 5917 { 5918 if (!poolAppend(pool, enc, ptr, end)) 6082 /* 6083 *@@ poolStoreString: 6084 * 6085 *@@changed V0.9.14 (2001-08-09) [umoeller]: added pulOfs param 6086 */ 6087 6088 static XML_Char* poolStoreString(STRING_POOL *pool, 6089 const ENCODING *enc, 6090 const char *ptr, 6091 const char *end, 6092 unsigned long *pulOfs) // V0.9.14 (2001-08-09) [umoeller] 6093 { 6094 if (!poolAppend(pool, 6095 enc, 6096 ptr, 6097 end, 6098 pulOfs)) // V0.9.14 (2001-08-09) [umoeller] 5919 6099 return 0; 5920 if (pool->ptr == pool->end && !poolGrow(pool)) 6100 if ( (pool->ptr == pool->end) 6101 && (!poolGrow(pool)) 6102 ) 5921 6103 return 0; 5922 6104 *(pool->ptr)++ = 0; … … 5924 6106 } 5925 6107 5926 static int poolGrow(STRING_POOL * 6108 static int poolGrow(STRING_POOL *pool) 5927 6109 { 5928 6110 if (pool->freeBlocks) … … 5945 6127 pool->blocks = pool->freeBlocks; 5946 6128 pool->freeBlocks = tem; 5947 memcpy(pool->blocks->s, pool->start, (pool->end - pool->start) * sizeof(XML_Char)); 6129 memcpy(pool->blocks->s, 6130 pool->start, 6131 (pool->end - pool->start) * sizeof(XML_Char)); 5948 6132 pool->ptr = pool->blocks->s + (pool->ptr - pool->start); 5949 6133 pool->start = pool->blocks->s; … … 5956 6140 int blockSize = (pool->end - pool->start) * 2; 5957 6141 5958 pool->blocks = (BLOCK*)pool->mem->realloc_fcn(pool->blocks, 5959 offsetof(BLOCK, s) 5960 + blockSize * sizeof(XML_Char)); 6142 pool->blocks = pool->mem->realloc_fcn(pool->blocks, offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); 5961 6143 if (!pool->blocks) 5962 6144 return 0; … … 5975 6157 else 5976 6158 blockSize *= 2; 5977 tem = (BLOCK*)pool->mem->malloc_fcn(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char));6159 tem = pool->mem->malloc_fcn(offsetof(BLOCK, s) + blockSize * sizeof(XML_Char)); 5978 6160 if (!tem) 5979 6161 return 0; … … 5990 6172 } 5991 6173 5992 static int nextScaffoldPart(XML_Parser parser) 6174 static int 6175 nextScaffoldPart(XML_Parser parser) 5993 6176 { 5994 6177 CONTENT_SCAFFOLD *me; … … 5997 6180 if (!dtd.scaffIndex) 5998 6181 { 5999 dtd.scaffIndex = (int*)MALLOC(groupSize * sizeof(int));6182 dtd.scaffIndex = MALLOC(groupSize * sizeof(int)); 6000 6183 6001 6184 if (!dtd.scaffIndex) … … 6009 6192 { 6010 6193 dtd.scaffSize *= 2; 6011 dtd.scaffold = (CONTENT_SCAFFOLD *)REALLOC(dtd.scaffold,6194 dtd.scaffold = (CONTENT_SCAFFOLD *) REALLOC(dtd.scaffold, 6012 6195 dtd.scaffSize * sizeof(CONTENT_SCAFFOLD)); 6013 6196 } … … 6015 6198 { 6016 6199 dtd.scaffSize = 32; 6017 dtd.scaffold = (CONTENT_SCAFFOLD *)MALLOC(dtd.scaffSize * sizeof(CONTENT_SCAFFOLD));6200 dtd.scaffold = (CONTENT_SCAFFOLD *) MALLOC(dtd.scaffSize * sizeof(CONTENT_SCAFFOLD)); 6018 6201 } 6019 6202 if (!dtd.scaffold) … … 6039 6222 } /* End nextScaffoldPart */ 6040 6223 6041 static void build_node(XML_Parser parser, 6224 static void 6225 build_node(XML_Parser parser, 6042 6226 int src_node, 6043 6227 XMLCONTENT * dest, … … 6081 6265 } /* End build_node */ 6082 6266 6083 static XMLCONTENT * build_model(XML_Parser parser) 6267 static XMLCONTENT * 6268 build_model(XML_Parser parser) 6084 6269 { 6085 6270 XMLCONTENT *ret; … … 6088 6273 int allocsize = dtd.scaffCount * sizeof(XMLCONTENT) + dtd.contentStringLen; 6089 6274 6090 ret = (XMLCONTENT*)MALLOC(allocsize);6275 ret = MALLOC(allocsize); 6091 6276 if (!ret) 6092 6277 return 0; … … 6099 6284 } /* End build_model */ 6100 6285 6101 static ELEMENT_TYPE * getElementType(XML_Parser parser, 6286 static ELEMENT_TYPE * 6287 getElementType(XML_Parser parser, 6102 6288 const ENCODING * enc, 6103 6289 const char *ptr, 6104 6290 const char *end) 6105 6291 { 6106 const XML_Char *name = poolStoreString(&dtd.pool, enc, ptr, end );6292 const XML_Char *name = poolStoreString(&dtd.pool, enc, ptr, end, NULL); 6107 6293 ELEMENT_TYPE *ret; 6108 6294 6109 6295 if (!name) 6110 6296 return 0; 6111 ret = (ELEMENT_TYPE *)lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE));6297 ret = (ELEMENT_TYPE *) lookup(&dtd.elementTypes, name, sizeof(ELEMENT_TYPE)); 6112 6298 if (!ret) 6113 6299 return 0; … … 6122 6308 return ret; 6123 6309 } /* End getElementType */ 6124 -
trunk/src/helpers/xmlrole.c
r75 r97 1 2 1 /* 3 *sourcefile xmlrole.c 4 * part of the expat implementation. See xmlparse.c. 5 * 6 */ 7 8 /* 9 * Copyright (C) 2001 Ulrich Mller. 10 * Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 11 * and Clark Cooper. 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be included 22 * in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 28 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 29 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 30 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 */ 32 33 #include "setup.h" 2 Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 3 See the file COPYING for copying permission. 4 */ 5 6 /* #ifdef COMPILED_FROM_DSP 7 # include "winconfig.h" 8 #else 9 # include <config.h> 10 #endif 11 */ 34 12 35 13 #include "expat\expat_setup.h" // V0.9.9 (2001-02-10) [umoeller] … … 43 21 44 22 /* Doesn't check: 45 * 46 * that ,| are not mixed in a model group 47 * content of literals 48 * 49 */ 50 51 static const char KW_ANY[] = 52 {ASCII_A, ASCII_N, ASCII_Y, '\0'}; 53 static const char KW_ATTLIST[] = 54 {ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0'}; 55 static const char KW_CDATA[] = 56 {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; 57 static const char KW_DOCTYPE[] = 58 {ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0'}; 59 static const char KW_ELEMENT[] = 60 {ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0'}; 61 static const char KW_EMPTY[] = 62 {ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0'}; 63 static const char KW_ENTITIES[] = 64 {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0'}; 65 static const char KW_ENTITY[] = 66 {ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0'}; 67 static const char KW_FIXED[] = 68 {ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0'}; 69 static const char KW_ID[] = 70 {ASCII_I, ASCII_D, '\0'}; 71 static const char KW_IDREF[] = 72 {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0'}; 73 static const char KW_IDREFS[] = 74 {ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0'}; 75 static const char KW_IGNORE[] = 76 {ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0'}; 77 static const char KW_IMPLIED[] = 78 {ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0'}; 79 static const char KW_INCLUDE[] = 80 {ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0'}; 81 static const char KW_NDATA[] = 82 {ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; 83 static const char KW_NMTOKEN[] = 84 {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0'}; 85 static const char KW_NMTOKENS[] = 86 {ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0'}; 87 static const char KW_NOTATION[] = 88 {ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, '\0'}; 89 static const char KW_PCDATA[] = 90 {ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0'}; 91 static const char KW_PUBLIC[] = 92 {ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0'}; 93 static const char KW_REQUIRED[] = 94 {ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, '\0'}; 95 static const char KW_SYSTEM[] = 96 {ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0'}; 23 24 that ,| are not mixed in a model group 25 content of literals 26 27 */ 28 29 static const char KW_ANY[] = { ASCII_A, ASCII_N, ASCII_Y, '\0' }; 30 static const char KW_ATTLIST[] = { ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; 31 static const char KW_CDATA[] = { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 32 static const char KW_DOCTYPE[] = { ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; 33 static const char KW_ELEMENT[] = { ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; 34 static const char KW_EMPTY[] = { ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; 35 static const char KW_ENTITIES[] = { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' }; 36 static const char KW_ENTITY[] = { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; 37 static const char KW_FIXED[] = { ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; 38 static const char KW_ID[] = { ASCII_I, ASCII_D, '\0' }; 39 static const char KW_IDREF[] = { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; 40 static const char KW_IDREFS[] = { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; 41 static const char KW_IGNORE[] = { ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; 42 static const char KW_IMPLIED[] = { ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; 43 static const char KW_INCLUDE[] = { ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; 44 static const char KW_NDATA[] = { ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 45 static const char KW_NMTOKEN[] = { ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; 46 static const char KW_NMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' }; 47 static const char KW_NOTATION[] = { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, '\0' }; 48 static const char KW_PCDATA[] = { ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; 49 static const char KW_PUBLIC[] = { ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; 50 static const char KW_REQUIRED[] = { ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, '\0' }; 51 static const char KW_SYSTEM[] = { ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; 97 52 98 53 #ifndef MIN_BYTES_PER_CHAR … … 109 64 #endif /* not XML_DTD */ 110 65 111 typedef int EXPATENTRY PROLOG_HANDLER(PROLOG_STATE * state, 112 int tok, 113 const char *ptr, 114 const char *end, 115 const ENCODING * enc); 116 117 static PROLOG_HANDLER prolog0, 118 prolog1, 119 prolog2, 120 doctype0, 121 doctype1, 122 doctype2, 123 doctype3, 124 doctype4, 125 doctype5, 126 internalSubset, 127 entity0, 128 entity1, 129 entity2, 130 entity3, 131 entity4, 132 entity5, 133 entity6, 134 entity7, 135 entity8, 136 entity9, 137 notation0, 138 notation1, 139 notation2, 140 notation3, 141 notation4, 142 attlist0, 143 attlist1, 144 attlist2, 145 attlist3, 146 attlist4, 147 attlist5, 148 attlist6, 149 attlist7, 150 attlist8, 151 attlist9, 152 element0, 153 element1, 154 element2, 155 element3, 156 element4, 157 element5, 158 element6, 159 element7, 66 typedef int PROLOG_HANDLER(PROLOG_STATE *state, 67 int tok, 68 const char *ptr, 69 const char *end, 70 const ENCODING *enc); 71 72 static PROLOG_HANDLER 73 prolog0, prolog1, prolog2, 74 doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, 75 internalSubset, 76 entity0, entity1, entity2, entity3, entity4, entity5, entity6, 77 entity7, entity8, entity9, 78 notation0, notation1, notation2, notation3, notation4, 79 attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, 80 attlist7, attlist8, attlist9, 81 element0, element1, element2, element3, element4, element5, element6, 82 element7, 160 83 #ifdef XML_DTD 161 externalSubset0, 162 externalSubset1, 163 condSect0, 164 condSect1, 165 condSect2, 166 #endif 167 declClose, 168 error; 169 170 static int common(PROLOG_STATE * state, int tok); 171 172 static int EXPATENTRY prolog0(PROLOG_STATE * state, 173 int tok, 174 const char *ptr, 175 const char *end, 176 const ENCODING * enc) 177 { 178 switch (tok) 179 { 180 case XML_TOK_PROLOG_S: 181 state->handler = prolog1; 182 return XML_ROLE_NONE; 183 case XML_TOK_XML_DECL: 184 state->handler = prolog1; 185 return XML_ROLE_XML_DECL; 186 case XML_TOK_PI: 187 state->handler = prolog1; 188 return XML_ROLE_NONE; 189 case XML_TOK_COMMENT: 190 state->handler = prolog1; 191 case XML_TOK_BOM: 192 return XML_ROLE_NONE; 193 case XML_TOK_DECL_OPEN: 194 if (!XmlNameMatchesAscii(enc, 195 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 196 end, 197 KW_DOCTYPE)) 198 break; 199 state->handler = doctype0; 200 return XML_ROLE_NONE; 201 case XML_TOK_INSTANCE_START: 202 state->handler = error; 203 return XML_ROLE_INSTANCE_START; 204 } 205 return common(state, tok); 206 } 207 208 static int EXPATENTRY prolog1(PROLOG_STATE * state, 209 int tok, 210 const char *ptr, 211 const char *end, 212 const ENCODING * enc) 213 { 214 switch (tok) 215 { 216 case XML_TOK_PROLOG_S: 217 return XML_ROLE_NONE; 218 case XML_TOK_PI: 219 case XML_TOK_COMMENT: 220 case XML_TOK_BOM: 221 return XML_ROLE_NONE; 222 case XML_TOK_DECL_OPEN: 223 if (!XmlNameMatchesAscii(enc, 224 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 225 end, 226 KW_DOCTYPE)) 227 break; 228 state->handler = doctype0; 229 return XML_ROLE_NONE; 230 case XML_TOK_INSTANCE_START: 231 state->handler = error; 232 return XML_ROLE_INSTANCE_START; 233 } 234 return common(state, tok); 235 } 236 237 static int EXPATENTRY prolog2(PROLOG_STATE * state, 238 int tok, 239 const char *ptr, 240 const char *end, 241 const ENCODING * enc) 242 { 243 switch (tok) 244 { 245 case XML_TOK_PROLOG_S: 246 return XML_ROLE_NONE; 247 case XML_TOK_PI: 248 case XML_TOK_COMMENT: 249 return XML_ROLE_NONE; 250 case XML_TOK_INSTANCE_START: 251 state->handler = error; 252 return XML_ROLE_INSTANCE_START; 253 } 254 return common(state, tok); 255 } 256 257 static int EXPATENTRY doctype0(PROLOG_STATE * state, 258 int tok, 259 const char *ptr, 260 const char *end, 261 const ENCODING * enc) 262 { 263 switch (tok) 264 { 265 case XML_TOK_PROLOG_S: 266 return XML_ROLE_NONE; 267 case XML_TOK_NAME: 268 case XML_TOK_PREFIXED_NAME: 269 state->handler = doctype1; 270 return XML_ROLE_DOCTYPE_NAME; 271 } 272 return common(state, tok); 273 } 274 275 static int EXPATENTRY doctype1(PROLOG_STATE * state, 276 int tok, 277 const char *ptr, 278 const char *end, 279 const ENCODING * enc) 280 { 281 switch (tok) 282 { 283 case XML_TOK_PROLOG_S: 284 return XML_ROLE_NONE; 285 case XML_TOK_OPEN_BRACKET: 286 state->handler = internalSubset; 287 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 288 case XML_TOK_DECL_CLOSE: 289 state->handler = prolog2; 290 return XML_ROLE_DOCTYPE_CLOSE; 291 case XML_TOK_NAME: 292 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) 293 { 294 state->handler = doctype3; 295 return XML_ROLE_NONE; 296 } 297 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) 298 { 299 state->handler = doctype2; 300 return XML_ROLE_NONE; 301 } 302 break; 303 } 304 return common(state, tok); 305 } 306 307 static int EXPATENTRY doctype2(PROLOG_STATE * state, 308 int tok, 309 const char *ptr, 310 const char *end, 311 const ENCODING * enc) 312 { 313 switch (tok) 314 { 315 case XML_TOK_PROLOG_S: 316 return XML_ROLE_NONE; 317 case XML_TOK_LITERAL: 318 state->handler = doctype3; 319 return XML_ROLE_DOCTYPE_PUBLIC_ID; 320 } 321 return common(state, tok); 322 } 323 324 static int EXPATENTRY doctype3(PROLOG_STATE * state, 325 int tok, 326 const char *ptr, 327 const char *end, 328 const ENCODING * enc) 329 { 330 switch (tok) 331 { 332 case XML_TOK_PROLOG_S: 333 return XML_ROLE_NONE; 334 case XML_TOK_LITERAL: 335 state->handler = doctype4; 336 return XML_ROLE_DOCTYPE_SYSTEM_ID; 337 } 338 return common(state, tok); 339 } 340 341 static int EXPATENTRY doctype4(PROLOG_STATE * state, 342 int tok, 343 const char *ptr, 344 const char *end, 345 const ENCODING * enc) 346 { 347 switch (tok) 348 { 349 case XML_TOK_PROLOG_S: 350 return XML_ROLE_NONE; 351 case XML_TOK_OPEN_BRACKET: 352 state->handler = internalSubset; 353 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 354 case XML_TOK_DECL_CLOSE: 355 state->handler = prolog2; 356 return XML_ROLE_DOCTYPE_CLOSE; 357 } 358 return common(state, tok); 359 } 360 361 static int EXPATENTRY doctype5(PROLOG_STATE * state, 362 int tok, 363 const char *ptr, 364 const char *end, 365 const ENCODING * enc) 366 { 367 switch (tok) 368 { 369 case XML_TOK_PROLOG_S: 370 return XML_ROLE_NONE; 371 case XML_TOK_DECL_CLOSE: 372 state->handler = prolog2; 373 return XML_ROLE_DOCTYPE_CLOSE; 374 } 375 return common(state, tok); 376 } 377 378 static int EXPATENTRY internalSubset(PROLOG_STATE * state, 379 int tok, 380 const char *ptr, 381 const char *end, 382 const ENCODING * enc) 383 { 384 switch (tok) 385 { 386 case XML_TOK_PROLOG_S: 387 return XML_ROLE_NONE; 388 case XML_TOK_DECL_OPEN: 389 if (XmlNameMatchesAscii(enc, 390 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 391 end, 392 KW_ENTITY)) 393 { 394 state->handler = entity0; 395 return XML_ROLE_NONE; 396 } 397 if (XmlNameMatchesAscii(enc, 398 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 399 end, 400 KW_ATTLIST)) 401 { 402 state->handler = attlist0; 403 return XML_ROLE_NONE; 404 } 405 if (XmlNameMatchesAscii(enc, 406 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 407 end, 408 KW_ELEMENT)) 409 { 410 state->handler = element0; 411 return XML_ROLE_NONE; 412 } 413 if (XmlNameMatchesAscii(enc, 414 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 415 end, 416 KW_NOTATION)) 417 { 418 state->handler = notation0; 419 return XML_ROLE_NONE; 420 } 421 break; 422 case XML_TOK_PI: 423 case XML_TOK_COMMENT: 424 return XML_ROLE_NONE; 425 case XML_TOK_PARAM_ENTITY_REF: 426 return XML_ROLE_PARAM_ENTITY_REF; 427 case XML_TOK_CLOSE_BRACKET: 428 state->handler = doctype5; 429 return XML_ROLE_NONE; 430 } 431 return common(state, tok); 84 externalSubset0, externalSubset1, 85 condSect0, condSect1, condSect2, 86 #endif /* XML_DTD */ 87 declClose, 88 error; 89 90 static 91 int common(PROLOG_STATE *state, int tok); 92 93 static 94 int prolog0(PROLOG_STATE *state, 95 int tok, 96 const char *ptr, 97 const char *end, 98 const ENCODING *enc) 99 { 100 switch (tok) { 101 case XML_TOK_PROLOG_S: 102 state->handler = prolog1; 103 return XML_ROLE_NONE; 104 case XML_TOK_XML_DECL: 105 state->handler = prolog1; 106 return XML_ROLE_XML_DECL; 107 case XML_TOK_PI: 108 state->handler = prolog1; 109 return XML_ROLE_NONE; 110 case XML_TOK_COMMENT: 111 state->handler = prolog1; 112 case XML_TOK_BOM: 113 return XML_ROLE_NONE; 114 case XML_TOK_DECL_OPEN: 115 if (!XmlNameMatchesAscii(enc, 116 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 117 end, 118 KW_DOCTYPE)) 119 break; 120 state->handler = doctype0; 121 return XML_ROLE_NONE; 122 case XML_TOK_INSTANCE_START: 123 state->handler = error; 124 return XML_ROLE_INSTANCE_START; 125 } 126 return common(state, tok); 127 } 128 129 static 130 int prolog1(PROLOG_STATE *state, 131 int tok, 132 const char *ptr, 133 const char *end, 134 const ENCODING *enc) 135 { 136 switch (tok) { 137 case XML_TOK_PROLOG_S: 138 return XML_ROLE_NONE; 139 case XML_TOK_PI: 140 case XML_TOK_COMMENT: 141 case XML_TOK_BOM: 142 return XML_ROLE_NONE; 143 case XML_TOK_DECL_OPEN: 144 if (!XmlNameMatchesAscii(enc, 145 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 146 end, 147 KW_DOCTYPE)) 148 break; 149 state->handler = doctype0; 150 return XML_ROLE_NONE; 151 case XML_TOK_INSTANCE_START: 152 state->handler = error; 153 return XML_ROLE_INSTANCE_START; 154 } 155 return common(state, tok); 156 } 157 158 static 159 int prolog2(PROLOG_STATE *state, 160 int tok, 161 const char *ptr, 162 const char *end, 163 const ENCODING *enc) 164 { 165 switch (tok) { 166 case XML_TOK_PROLOG_S: 167 return XML_ROLE_NONE; 168 case XML_TOK_PI: 169 case XML_TOK_COMMENT: 170 return XML_ROLE_NONE; 171 case XML_TOK_INSTANCE_START: 172 state->handler = error; 173 return XML_ROLE_INSTANCE_START; 174 } 175 return common(state, tok); 176 } 177 178 static 179 int doctype0(PROLOG_STATE *state, 180 int tok, 181 const char *ptr, 182 const char *end, 183 const ENCODING *enc) 184 { 185 switch (tok) { 186 case XML_TOK_PROLOG_S: 187 return XML_ROLE_NONE; 188 case XML_TOK_NAME: 189 case XML_TOK_PREFIXED_NAME: 190 state->handler = doctype1; 191 return XML_ROLE_DOCTYPE_NAME; 192 } 193 return common(state, tok); 194 } 195 196 static 197 int doctype1(PROLOG_STATE *state, 198 int tok, 199 const char *ptr, 200 const char *end, 201 const ENCODING *enc) 202 { 203 switch (tok) { 204 case XML_TOK_PROLOG_S: 205 return XML_ROLE_NONE; 206 case XML_TOK_OPEN_BRACKET: 207 state->handler = internalSubset; 208 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 209 case XML_TOK_DECL_CLOSE: 210 state->handler = prolog2; 211 return XML_ROLE_DOCTYPE_CLOSE; 212 case XML_TOK_NAME: 213 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 214 state->handler = doctype3; 215 return XML_ROLE_NONE; 216 } 217 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 218 state->handler = doctype2; 219 return XML_ROLE_NONE; 220 } 221 break; 222 } 223 return common(state, tok); 224 } 225 226 static 227 int doctype2(PROLOG_STATE *state, 228 int tok, 229 const char *ptr, 230 const char *end, 231 const ENCODING *enc) 232 { 233 switch (tok) { 234 case XML_TOK_PROLOG_S: 235 return XML_ROLE_NONE; 236 case XML_TOK_LITERAL: 237 state->handler = doctype3; 238 return XML_ROLE_DOCTYPE_PUBLIC_ID; 239 } 240 return common(state, tok); 241 } 242 243 static 244 int doctype3(PROLOG_STATE *state, 245 int tok, 246 const char *ptr, 247 const char *end, 248 const ENCODING *enc) 249 { 250 switch (tok) { 251 case XML_TOK_PROLOG_S: 252 return XML_ROLE_NONE; 253 case XML_TOK_LITERAL: 254 state->handler = doctype4; 255 return XML_ROLE_DOCTYPE_SYSTEM_ID; 256 } 257 return common(state, tok); 258 } 259 260 static 261 int doctype4(PROLOG_STATE *state, 262 int tok, 263 const char *ptr, 264 const char *end, 265 const ENCODING *enc) 266 { 267 switch (tok) { 268 case XML_TOK_PROLOG_S: 269 return XML_ROLE_NONE; 270 case XML_TOK_OPEN_BRACKET: 271 state->handler = internalSubset; 272 return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; 273 case XML_TOK_DECL_CLOSE: 274 state->handler = prolog2; 275 return XML_ROLE_DOCTYPE_CLOSE; 276 } 277 return common(state, tok); 278 } 279 280 static 281 int doctype5(PROLOG_STATE *state, 282 int tok, 283 const char *ptr, 284 const char *end, 285 const ENCODING *enc) 286 { 287 switch (tok) { 288 case XML_TOK_PROLOG_S: 289 return XML_ROLE_NONE; 290 case XML_TOK_DECL_CLOSE: 291 state->handler = prolog2; 292 return XML_ROLE_DOCTYPE_CLOSE; 293 } 294 return common(state, tok); 295 } 296 297 static 298 int internalSubset(PROLOG_STATE *state, 299 int tok, 300 const char *ptr, 301 const char *end, 302 const ENCODING *enc) 303 { 304 switch (tok) { 305 case XML_TOK_PROLOG_S: 306 return XML_ROLE_NONE; 307 case XML_TOK_DECL_OPEN: 308 if (XmlNameMatchesAscii(enc, 309 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 310 end, 311 KW_ENTITY)) { 312 state->handler = entity0; 313 return XML_ROLE_NONE; 314 } 315 if (XmlNameMatchesAscii(enc, 316 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 317 end, 318 KW_ATTLIST)) { 319 state->handler = attlist0; 320 return XML_ROLE_NONE; 321 } 322 if (XmlNameMatchesAscii(enc, 323 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 324 end, 325 KW_ELEMENT)) { 326 state->handler = element0; 327 return XML_ROLE_NONE; 328 } 329 if (XmlNameMatchesAscii(enc, 330 ptr + 2 * MIN_BYTES_PER_CHAR(enc), 331 end, 332 KW_NOTATION)) { 333 state->handler = notation0; 334 return XML_ROLE_NONE; 335 } 336 break; 337 case XML_TOK_PI: 338 case XML_TOK_COMMENT: 339 return XML_ROLE_NONE; 340 case XML_TOK_PARAM_ENTITY_REF: 341 return XML_ROLE_PARAM_ENTITY_REF; 342 case XML_TOK_CLOSE_BRACKET: 343 state->handler = doctype5; 344 return XML_ROLE_NONE; 345 } 346 return common(state, tok); 432 347 } 433 348 434 349 #ifdef XML_DTD 435 350 436 static int EXPATENTRY externalSubset0(PROLOG_STATE * state, 437 int tok, 438 const char *ptr, 439 const char *end, 440 const ENCODING * enc) 441 { 442 state->handler = externalSubset1; 443 if (tok == XML_TOK_XML_DECL) 444 return XML_ROLE_TEXT_DECL; 445 return externalSubset1(state, tok, ptr, end, enc); 446 } 447 448 static 449 int externalSubset1(PROLOG_STATE * state, 450 int tok, 451 const char *ptr, 452 const char *end, 453 const ENCODING * enc) 454 { 455 switch (tok) 456 { 457 case XML_TOK_COND_SECT_OPEN: 458 state->handler = condSect0; 459 return XML_ROLE_NONE; 460 case XML_TOK_COND_SECT_CLOSE: 461 if (state->includeLevel == 0) 462 break; 463 state->includeLevel -= 1; 464 return XML_ROLE_NONE; 465 case XML_TOK_PROLOG_S: 466 return XML_ROLE_NONE; 467 case XML_TOK_CLOSE_BRACKET: 468 break; 469 case XML_TOK_NONE: 470 if (state->includeLevel) 471 break; 472 return XML_ROLE_NONE; 473 default: 474 return internalSubset(state, tok, ptr, end, enc); 475 } 476 return common(state, tok); 477 } 478 479 #endif /* XML_DTD */ 480 481 static 482 int entity0(PROLOG_STATE * state, 351 static 352 int externalSubset0(PROLOG_STATE *state, 483 353 int tok, 484 354 const char *ptr, 485 355 const char *end, 486 const ENCODING * enc) 487 { 488 switch (tok) 489 { 490 case XML_TOK_PROLOG_S: 491 return XML_ROLE_NONE; 492 case XML_TOK_PERCENT: 493 state->handler = entity1; 494 return XML_ROLE_NONE; 495 case XML_TOK_NAME: 496 state->handler = entity2; 497 return XML_ROLE_GENERAL_ENTITY_NAME; 498 } 499 return common(state, tok); 500 } 501 502 static 503 int entity1(PROLOG_STATE * state, 356 const ENCODING *enc) 357 { 358 state->handler = externalSubset1; 359 if (tok == XML_TOK_XML_DECL) 360 return XML_ROLE_TEXT_DECL; 361 return externalSubset1(state, tok, ptr, end, enc); 362 } 363 364 static 365 int externalSubset1(PROLOG_STATE *state, 504 366 int tok, 505 367 const char *ptr, 506 368 const char *end, 507 const ENCODING * enc) 508 { 509 switch (tok) 510 { 511 case XML_TOK_PROLOG_S: 512 return XML_ROLE_NONE; 513 case XML_TOK_NAME: 514 state->handler = entity7; 515 return XML_ROLE_PARAM_ENTITY_NAME; 516 } 517 return common(state, tok); 518 } 519 520 static 521 int entity2(PROLOG_STATE * state, 522 int tok, 523 const char *ptr, 524 const char *end, 525 const ENCODING * enc) 526 { 527 switch (tok) 528 { 529 case XML_TOK_PROLOG_S: 530 return XML_ROLE_NONE; 531 case XML_TOK_NAME: 532 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) 533 { 534 state->handler = entity4; 535 return XML_ROLE_NONE; 536 } 537 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) 538 { 539 state->handler = entity3; 540 return XML_ROLE_NONE; 541 } 542 break; 543 case XML_TOK_LITERAL: 544 state->handler = declClose; 545 return XML_ROLE_ENTITY_VALUE; 546 } 547 return common(state, tok); 548 } 549 550 static 551 int entity3(PROLOG_STATE * state, 552 int tok, 553 const char *ptr, 554 const char *end, 555 const ENCODING * enc) 556 { 557 switch (tok) 558 { 559 case XML_TOK_PROLOG_S: 560 return XML_ROLE_NONE; 561 case XML_TOK_LITERAL: 562 state->handler = entity4; 563 return XML_ROLE_ENTITY_PUBLIC_ID; 564 } 565 return common(state, tok); 566 } 567 568 569 static 570 int entity4(PROLOG_STATE * state, 571 int tok, 572 const char *ptr, 573 const char *end, 574 const ENCODING * enc) 575 { 576 switch (tok) 577 { 578 case XML_TOK_PROLOG_S: 579 return XML_ROLE_NONE; 580 case XML_TOK_LITERAL: 581 state->handler = entity5; 582 return XML_ROLE_ENTITY_SYSTEM_ID; 583 } 584 return common(state, tok); 585 } 586 587 static 588 int entity5(PROLOG_STATE * state, 589 int tok, 590 const char *ptr, 591 const char *end, 592 const ENCODING * enc) 593 { 594 switch (tok) 595 { 596 case XML_TOK_PROLOG_S: 597 return XML_ROLE_NONE; 598 case XML_TOK_DECL_CLOSE: 599 setTopLevel(state); 600 return XML_ROLE_ENTITY_COMPLETE; 601 case XML_TOK_NAME: 602 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) 603 { 604 state->handler = entity6; 605 return XML_ROLE_NONE; 606 } 607 break; 608 } 609 return common(state, tok); 610 } 611 612 static 613 int entity6(PROLOG_STATE * state, 614 int tok, 615 const char *ptr, 616 const char *end, 617 const ENCODING * enc) 618 { 619 switch (tok) 620 { 621 case XML_TOK_PROLOG_S: 622 return XML_ROLE_NONE; 623 case XML_TOK_NAME: 624 state->handler = declClose; 625 return XML_ROLE_ENTITY_NOTATION_NAME; 626 } 627 return common(state, tok); 628 } 629 630 static 631 int entity7(PROLOG_STATE * state, 632 int tok, 633 const char *ptr, 634 const char *end, 635 const ENCODING * enc) 636 { 637 switch (tok) 638 { 639 case XML_TOK_PROLOG_S: 640 return XML_ROLE_NONE; 641 case XML_TOK_NAME: 642 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) 643 { 644 state->handler = entity9; 645 return XML_ROLE_NONE; 646 } 647 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) 648 { 649 state->handler = entity8; 650 return XML_ROLE_NONE; 651 } 652 break; 653 case XML_TOK_LITERAL: 654 state->handler = declClose; 655 return XML_ROLE_ENTITY_VALUE; 656 } 657 return common(state, tok); 658 } 659 660 static 661 int entity8(PROLOG_STATE * state, 662 int tok, 663 const char *ptr, 664 const char *end, 665 const ENCODING * enc) 666 { 667 switch (tok) 668 { 669 case XML_TOK_PROLOG_S: 670 return XML_ROLE_NONE; 671 case XML_TOK_LITERAL: 672 state->handler = entity9; 673 return XML_ROLE_ENTITY_PUBLIC_ID; 674 } 675 return common(state, tok); 676 } 677 678 static 679 int entity9(PROLOG_STATE * state, 680 int tok, 681 const char *ptr, 682 const char *end, 683 const ENCODING * enc) 684 { 685 switch (tok) 686 { 687 case XML_TOK_PROLOG_S: 688 return XML_ROLE_NONE; 689 case XML_TOK_LITERAL: 690 state->handler = declClose; 691 return XML_ROLE_ENTITY_SYSTEM_ID; 692 } 693 return common(state, tok); 694 } 695 696 static 697 int notation0(PROLOG_STATE * state, 698 int tok, 699 const char *ptr, 700 const char *end, 701 const ENCODING * enc) 702 { 703 switch (tok) 704 { 705 case XML_TOK_PROLOG_S: 706 return XML_ROLE_NONE; 707 case XML_TOK_NAME: 708 state->handler = notation1; 709 return XML_ROLE_NOTATION_NAME; 710 } 711 return common(state, tok); 712 } 713 714 static 715 int notation1(PROLOG_STATE * state, 716 int tok, 717 const char *ptr, 718 const char *end, 719 const ENCODING * enc) 720 { 721 switch (tok) 722 { 723 case XML_TOK_PROLOG_S: 724 return XML_ROLE_NONE; 725 case XML_TOK_NAME: 726 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) 727 { 728 state->handler = notation3; 729 return XML_ROLE_NONE; 730 } 731 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) 732 { 733 state->handler = notation2; 734 return XML_ROLE_NONE; 735 } 736 break; 737 } 738 return common(state, tok); 739 } 740 741 static 742 int notation2(PROLOG_STATE * state, 743 int tok, 744 const char *ptr, 745 const char *end, 746 const ENCODING * enc) 747 { 748 switch (tok) 749 { 750 case XML_TOK_PROLOG_S: 751 return XML_ROLE_NONE; 752 case XML_TOK_LITERAL: 753 state->handler = notation4; 754 return XML_ROLE_NOTATION_PUBLIC_ID; 755 } 756 return common(state, tok); 757 } 758 759 static 760 int notation3(PROLOG_STATE * state, 761 int tok, 762 const char *ptr, 763 const char *end, 764 const ENCODING * enc) 765 { 766 switch (tok) 767 { 768 case XML_TOK_PROLOG_S: 769 return XML_ROLE_NONE; 770 case XML_TOK_LITERAL: 771 state->handler = declClose; 772 return XML_ROLE_NOTATION_SYSTEM_ID; 773 } 774 return common(state, tok); 775 } 776 777 static 778 int notation4(PROLOG_STATE * state, 779 int tok, 780 const char *ptr, 781 const char *end, 782 const ENCODING * enc) 783 { 784 switch (tok) 785 { 786 case XML_TOK_PROLOG_S: 787 return XML_ROLE_NONE; 788 case XML_TOK_LITERAL: 789 state->handler = declClose; 790 return XML_ROLE_NOTATION_SYSTEM_ID; 791 case XML_TOK_DECL_CLOSE: 792 setTopLevel(state); 793 return XML_ROLE_NOTATION_NO_SYSTEM_ID; 794 } 795 return common(state, tok); 796 } 797 798 static 799 int attlist0(PROLOG_STATE * state, 800 int tok, 801 const char *ptr, 802 const char *end, 803 const ENCODING * enc) 804 { 805 switch (tok) 806 { 807 case XML_TOK_PROLOG_S: 808 return XML_ROLE_NONE; 809 case XML_TOK_NAME: 810 case XML_TOK_PREFIXED_NAME: 811 state->handler = attlist1; 812 return XML_ROLE_ATTLIST_ELEMENT_NAME; 813 } 814 return common(state, tok); 815 } 816 817 static 818 int attlist1(PROLOG_STATE * state, 819 int tok, 820 const char *ptr, 821 const char *end, 822 const ENCODING * enc) 823 { 824 switch (tok) 825 { 826 case XML_TOK_PROLOG_S: 827 return XML_ROLE_NONE; 828 case XML_TOK_DECL_CLOSE: 829 setTopLevel(state); 830 return XML_ROLE_NONE; 831 case XML_TOK_NAME: 832 case XML_TOK_PREFIXED_NAME: 833 state->handler = attlist2; 834 return XML_ROLE_ATTRIBUTE_NAME; 835 } 836 return common(state, tok); 837 } 838 839 static 840 int attlist2(PROLOG_STATE * state, 841 int tok, 842 const char *ptr, 843 const char *end, 844 const ENCODING * enc) 845 { 846 switch (tok) 847 { 848 case XML_TOK_PROLOG_S: 849 return XML_ROLE_NONE; 850 case XML_TOK_NAME: 851 { 852 static const char *types[] = 853 { 854 KW_CDATA, 855 KW_ID, 856 KW_IDREF, 857 KW_IDREFS, 858 KW_ENTITY, 859 KW_ENTITIES, 860 KW_NMTOKEN, 861 KW_NMTOKENS, 862 }; 863 int i; 864 865 for (i = 0; i < (int)(sizeof(types) / sizeof(types[0])); i++) 866 if (XmlNameMatchesAscii(enc, ptr, end, types[i])) 867 { 868 state->handler = attlist8; 869 return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; 870 } 871 } 872 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) 873 { 874 state->handler = attlist5; 875 return XML_ROLE_NONE; 876 } 877 break; 878 case XML_TOK_OPEN_PAREN: 879 state->handler = attlist3; 880 return XML_ROLE_NONE; 881 } 882 return common(state, tok); 883 } 884 885 static 886 int attlist3(PROLOG_STATE * state, 887 int tok, 888 const char *ptr, 889 const char *end, 890 const ENCODING * enc) 891 { 892 switch (tok) 893 { 894 case XML_TOK_PROLOG_S: 895 return XML_ROLE_NONE; 896 case XML_TOK_NMTOKEN: 897 case XML_TOK_NAME: 898 case XML_TOK_PREFIXED_NAME: 899 state->handler = attlist4; 900 return XML_ROLE_ATTRIBUTE_ENUM_VALUE; 901 } 902 return common(state, tok); 903 } 904 905 static 906 int attlist4(PROLOG_STATE * state, 907 int tok, 908 const char *ptr, 909 const char *end, 910 const ENCODING * enc) 911 { 912 switch (tok) 913 { 914 case XML_TOK_PROLOG_S: 915 return XML_ROLE_NONE; 916 case XML_TOK_CLOSE_PAREN: 917 state->handler = attlist8; 918 return XML_ROLE_NONE; 919 case XML_TOK_OR: 920 state->handler = attlist3; 921 return XML_ROLE_NONE; 922 } 923 return common(state, tok); 924 } 925 926 static 927 int attlist5(PROLOG_STATE * state, 928 int tok, 929 const char *ptr, 930 const char *end, 931 const ENCODING * enc) 932 { 933 switch (tok) 934 { 935 case XML_TOK_PROLOG_S: 936 return XML_ROLE_NONE; 937 case XML_TOK_OPEN_PAREN: 938 state->handler = attlist6; 939 return XML_ROLE_NONE; 940 } 941 return common(state, tok); 942 } 943 944 945 static 946 int attlist6(PROLOG_STATE * state, 947 int tok, 948 const char *ptr, 949 const char *end, 950 const ENCODING * enc) 951 { 952 switch (tok) 953 { 954 case XML_TOK_PROLOG_S: 955 return XML_ROLE_NONE; 956 case XML_TOK_NAME: 957 state->handler = attlist7; 958 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; 959 } 960 return common(state, tok); 961 } 962 963 static 964 int attlist7(PROLOG_STATE * state, 965 int tok, 966 const char *ptr, 967 const char *end, 968 const ENCODING * enc) 969 { 970 switch (tok) 971 { 972 case XML_TOK_PROLOG_S: 973 return XML_ROLE_NONE; 974 case XML_TOK_CLOSE_PAREN: 975 state->handler = attlist8; 976 return XML_ROLE_NONE; 977 case XML_TOK_OR: 978 state->handler = attlist6; 979 return XML_ROLE_NONE; 980 } 981 return common(state, tok); 982 } 983 984 /* default value */ 985 static 986 int attlist8(PROLOG_STATE * state, 987 int tok, 988 const char *ptr, 989 const char *end, 990 const ENCODING * enc) 991 { 992 switch (tok) 993 { 994 case XML_TOK_PROLOG_S: 995 return XML_ROLE_NONE; 996 case XML_TOK_POUND_NAME: 997 if (XmlNameMatchesAscii(enc, 998 ptr + MIN_BYTES_PER_CHAR(enc), 999 end, 1000 KW_IMPLIED)) 1001 { 1002 state->handler = attlist1; 1003 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; 1004 } 1005 if (XmlNameMatchesAscii(enc, 1006 ptr + MIN_BYTES_PER_CHAR(enc), 1007 end, 1008 KW_REQUIRED)) 1009 { 1010 state->handler = attlist1; 1011 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; 1012 } 1013 if (XmlNameMatchesAscii(enc, 1014 ptr + MIN_BYTES_PER_CHAR(enc), 1015 end, 1016 KW_FIXED)) 1017 { 1018 state->handler = attlist9; 1019 return XML_ROLE_NONE; 1020 } 1021 break; 1022 case XML_TOK_LITERAL: 1023 state->handler = attlist1; 1024 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; 1025 } 1026 return common(state, tok); 1027 } 1028 1029 static 1030 int attlist9(PROLOG_STATE * state, 1031 int tok, 1032 const char *ptr, 1033 const char *end, 1034 const ENCODING * enc) 1035 { 1036 switch (tok) 1037 { 1038 case XML_TOK_PROLOG_S: 1039 return XML_ROLE_NONE; 1040 case XML_TOK_LITERAL: 1041 state->handler = attlist1; 1042 return XML_ROLE_FIXED_ATTRIBUTE_VALUE; 1043 } 1044 return common(state, tok); 1045 } 1046 1047 static 1048 int element0(PROLOG_STATE * state, 1049 int tok, 1050 const char *ptr, 1051 const char *end, 1052 const ENCODING * enc) 1053 { 1054 switch (tok) 1055 { 1056 case XML_TOK_PROLOG_S: 1057 return XML_ROLE_NONE; 1058 case XML_TOK_NAME: 1059 case XML_TOK_PREFIXED_NAME: 1060 state->handler = element1; 1061 return XML_ROLE_ELEMENT_NAME; 1062 } 1063 return common(state, tok); 1064 } 1065 1066 static 1067 int element1(PROLOG_STATE * state, 1068 int tok, 1069 const char *ptr, 1070 const char *end, 1071 const ENCODING * enc) 1072 { 1073 switch (tok) 1074 { 1075 case XML_TOK_PROLOG_S: 1076 return XML_ROLE_NONE; 1077 case XML_TOK_NAME: 1078 if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) 1079 { 1080 state->handler = declClose; 1081 return XML_ROLE_CONTENT_EMPTY; 1082 } 1083 if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) 1084 { 1085 state->handler = declClose; 1086 return XML_ROLE_CONTENT_ANY; 1087 } 1088 break; 1089 case XML_TOK_OPEN_PAREN: 1090 state->handler = element2; 1091 state->level = 1; 1092 return XML_ROLE_GROUP_OPEN; 1093 } 1094 return common(state, tok); 1095 } 1096 1097 static 1098 int element2(PROLOG_STATE * state, 1099 int tok, 1100 const char *ptr, 1101 const char *end, 1102 const ENCODING * enc) 1103 { 1104 switch (tok) 1105 { 1106 case XML_TOK_PROLOG_S: 1107 return XML_ROLE_NONE; 1108 case XML_TOK_POUND_NAME: 1109 if (XmlNameMatchesAscii(enc, 1110 ptr + MIN_BYTES_PER_CHAR(enc), 1111 end, 1112 KW_PCDATA)) 1113 { 1114 state->handler = element3; 1115 return XML_ROLE_CONTENT_PCDATA; 1116 } 1117 break; 1118 case XML_TOK_OPEN_PAREN: 1119 state->level = 2; 1120 state->handler = element6; 1121 return XML_ROLE_GROUP_OPEN; 1122 case XML_TOK_NAME: 1123 case XML_TOK_PREFIXED_NAME: 1124 state->handler = element7; 1125 return XML_ROLE_CONTENT_ELEMENT; 1126 case XML_TOK_NAME_QUESTION: 1127 state->handler = element7; 1128 return XML_ROLE_CONTENT_ELEMENT_OPT; 1129 case XML_TOK_NAME_ASTERISK: 1130 state->handler = element7; 1131 return XML_ROLE_CONTENT_ELEMENT_REP; 1132 case XML_TOK_NAME_PLUS: 1133 state->handler = element7; 1134 return XML_ROLE_CONTENT_ELEMENT_PLUS; 1135 } 1136 return common(state, tok); 1137 } 1138 1139 static 1140 int element3(PROLOG_STATE * state, 1141 int tok, 1142 const char *ptr, 1143 const char *end, 1144 const ENCODING * enc) 1145 { 1146 switch (tok) 1147 { 1148 case XML_TOK_PROLOG_S: 1149 return XML_ROLE_NONE; 1150 case XML_TOK_CLOSE_PAREN: 1151 state->handler = declClose; 1152 return XML_ROLE_GROUP_CLOSE; 1153 case XML_TOK_CLOSE_PAREN_ASTERISK: 1154 state->handler = declClose; 1155 return XML_ROLE_GROUP_CLOSE_REP; 1156 case XML_TOK_OR: 1157 state->handler = element4; 1158 return XML_ROLE_NONE; 1159 } 1160 return common(state, tok); 1161 } 1162 1163 static 1164 int element4(PROLOG_STATE * state, 1165 int tok, 1166 const char *ptr, 1167 const char *end, 1168 const ENCODING * enc) 1169 { 1170 switch (tok) 1171 { 1172 case XML_TOK_PROLOG_S: 1173 return XML_ROLE_NONE; 1174 case XML_TOK_NAME: 1175 case XML_TOK_PREFIXED_NAME: 1176 state->handler = element5; 1177 return XML_ROLE_CONTENT_ELEMENT; 1178 } 1179 return common(state, tok); 1180 } 1181 1182 static 1183 int element5(PROLOG_STATE * state, 1184 int tok, 1185 const char *ptr, 1186 const char *end, 1187 const ENCODING * enc) 1188 { 1189 switch (tok) 1190 { 1191 case XML_TOK_PROLOG_S: 1192 return XML_ROLE_NONE; 1193 case XML_TOK_CLOSE_PAREN_ASTERISK: 1194 state->handler = declClose; 1195 return XML_ROLE_GROUP_CLOSE_REP; 1196 case XML_TOK_OR: 1197 state->handler = element4; 1198 return XML_ROLE_NONE; 1199 } 1200 return common(state, tok); 1201 } 1202 1203 static 1204 int element6(PROLOG_STATE * state, 1205 int tok, 1206 const char *ptr, 1207 const char *end, 1208 const ENCODING * enc) 1209 { 1210 switch (tok) 1211 { 1212 case XML_TOK_PROLOG_S: 1213 return XML_ROLE_NONE; 1214 case XML_TOK_OPEN_PAREN: 1215 state->level += 1; 1216 return XML_ROLE_GROUP_OPEN; 1217 case XML_TOK_NAME: 1218 case XML_TOK_PREFIXED_NAME: 1219 state->handler = element7; 1220 return XML_ROLE_CONTENT_ELEMENT; 1221 case XML_TOK_NAME_QUESTION: 1222 state->handler = element7; 1223 return XML_ROLE_CONTENT_ELEMENT_OPT; 1224 case XML_TOK_NAME_ASTERISK: 1225 state->handler = element7; 1226 return XML_ROLE_CONTENT_ELEMENT_REP; 1227 case XML_TOK_NAME_PLUS: 1228 state->handler = element7; 1229 return XML_ROLE_CONTENT_ELEMENT_PLUS; 1230 } 1231 return common(state, tok); 1232 } 1233 1234 static 1235 int element7(PROLOG_STATE * state, 1236 int tok, 1237 const char *ptr, 1238 const char *end, 1239 const ENCODING * enc) 1240 { 1241 switch (tok) 1242 { 1243 case XML_TOK_PROLOG_S: 1244 return XML_ROLE_NONE; 1245 case XML_TOK_CLOSE_PAREN: 1246 state->level -= 1; 1247 if (state->level == 0) 1248 state->handler = declClose; 1249 return XML_ROLE_GROUP_CLOSE; 1250 case XML_TOK_CLOSE_PAREN_ASTERISK: 1251 state->level -= 1; 1252 if (state->level == 0) 1253 state->handler = declClose; 1254 return XML_ROLE_GROUP_CLOSE_REP; 1255 case XML_TOK_CLOSE_PAREN_QUESTION: 1256 state->level -= 1; 1257 if (state->level == 0) 1258 state->handler = declClose; 1259 return XML_ROLE_GROUP_CLOSE_OPT; 1260 case XML_TOK_CLOSE_PAREN_PLUS: 1261 state->level -= 1; 1262 if (state->level == 0) 1263 state->handler = declClose; 1264 return XML_ROLE_GROUP_CLOSE_PLUS; 1265 case XML_TOK_COMMA: 1266 state->handler = element6; 1267 return XML_ROLE_GROUP_SEQUENCE; 1268 case XML_TOK_OR: 1269 state->handler = element6; 1270 return XML_ROLE_GROUP_CHOICE; 1271 } 1272 return common(state, tok); 1273 } 1274 1275 #ifdef XML_DTD 1276 1277 static 1278 int condSect0(PROLOG_STATE * state, 1279 int tok, 1280 const char *ptr, 1281 const char *end, 1282 const ENCODING * enc) 1283 { 1284 switch (tok) 1285 { 1286 case XML_TOK_PROLOG_S: 1287 return XML_ROLE_NONE; 1288 case XML_TOK_NAME: 1289 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) 1290 { 1291 state->handler = condSect1; 1292 return XML_ROLE_NONE; 1293 } 1294 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) 1295 { 1296 state->handler = condSect2; 1297 return XML_ROLE_NONE; 1298 } 1299 break; 1300 } 1301 return common(state, tok); 1302 } 1303 1304 static 1305 int condSect1(PROLOG_STATE * state, 1306 int tok, 1307 const char *ptr, 1308 const char *end, 1309 const ENCODING * enc) 1310 { 1311 switch (tok) 1312 { 1313 case XML_TOK_PROLOG_S: 1314 return XML_ROLE_NONE; 1315 case XML_TOK_OPEN_BRACKET: 1316 state->handler = externalSubset1; 1317 state->includeLevel += 1; 1318 return XML_ROLE_NONE; 1319 } 1320 return common(state, tok); 1321 } 1322 1323 static 1324 int condSect2(PROLOG_STATE * state, 1325 int tok, 1326 const char *ptr, 1327 const char *end, 1328 const ENCODING * enc) 1329 { 1330 switch (tok) 1331 { 1332 case XML_TOK_PROLOG_S: 1333 return XML_ROLE_NONE; 1334 case XML_TOK_OPEN_BRACKET: 1335 state->handler = externalSubset1; 1336 return XML_ROLE_IGNORE_SECT; 1337 } 1338 return common(state, tok); 369 const ENCODING *enc) 370 { 371 switch (tok) { 372 case XML_TOK_COND_SECT_OPEN: 373 state->handler = condSect0; 374 return XML_ROLE_NONE; 375 case XML_TOK_COND_SECT_CLOSE: 376 if (state->includeLevel == 0) 377 break; 378 state->includeLevel -= 1; 379 return XML_ROLE_NONE; 380 case XML_TOK_PROLOG_S: 381 return XML_ROLE_NONE; 382 case XML_TOK_CLOSE_BRACKET: 383 break; 384 case XML_TOK_NONE: 385 if (state->includeLevel) 386 break; 387 return XML_ROLE_NONE; 388 default: 389 return internalSubset(state, tok, ptr, end, enc); 390 } 391 return common(state, tok); 1339 392 } 1340 393 … … 1342 395 1343 396 static 1344 int declClose(PROLOG_STATE * state, 1345 int tok, 1346 const char *ptr, 1347 const char *end, 1348 const ENCODING * enc) 1349 { 1350 switch (tok) 1351 { 1352 case XML_TOK_PROLOG_S: 1353 return XML_ROLE_NONE; 1354 case XML_TOK_DECL_CLOSE: 1355 setTopLevel(state); 1356 return XML_ROLE_NONE; 1357 } 1358 return common(state, tok); 1359 } 1360 1361 #if 0 1362 1363 static 1364 int ignore(PROLOG_STATE * state, 1365 int tok, 1366 const char *ptr, 1367 const char *end, 1368 const ENCODING * enc) 1369 { 1370 switch (tok) 1371 { 1372 case XML_TOK_DECL_CLOSE: 1373 state->handler = internalSubset; 1374 return 0; 1375 default: 1376 return XML_ROLE_NONE; 1377 } 1378 return common(state, tok); 1379 } 1380 #endif 1381 1382 static 1383 int error(PROLOG_STATE * state, 397 int entity0(PROLOG_STATE *state, 398 int tok, 399 const char *ptr, 400 const char *end, 401 const ENCODING *enc) 402 { 403 switch (tok) { 404 case XML_TOK_PROLOG_S: 405 return XML_ROLE_NONE; 406 case XML_TOK_PERCENT: 407 state->handler = entity1; 408 return XML_ROLE_NONE; 409 case XML_TOK_NAME: 410 state->handler = entity2; 411 return XML_ROLE_GENERAL_ENTITY_NAME; 412 } 413 return common(state, tok); 414 } 415 416 static 417 int entity1(PROLOG_STATE *state, 418 int tok, 419 const char *ptr, 420 const char *end, 421 const ENCODING *enc) 422 { 423 switch (tok) { 424 case XML_TOK_PROLOG_S: 425 return XML_ROLE_NONE; 426 case XML_TOK_NAME: 427 state->handler = entity7; 428 return XML_ROLE_PARAM_ENTITY_NAME; 429 } 430 return common(state, tok); 431 } 432 433 static 434 int entity2(PROLOG_STATE *state, 435 int tok, 436 const char *ptr, 437 const char *end, 438 const ENCODING *enc) 439 { 440 switch (tok) { 441 case XML_TOK_PROLOG_S: 442 return XML_ROLE_NONE; 443 case XML_TOK_NAME: 444 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 445 state->handler = entity4; 446 return XML_ROLE_NONE; 447 } 448 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 449 state->handler = entity3; 450 return XML_ROLE_NONE; 451 } 452 break; 453 case XML_TOK_LITERAL: 454 state->handler = declClose; 455 return XML_ROLE_ENTITY_VALUE; 456 } 457 return common(state, tok); 458 } 459 460 static 461 int entity3(PROLOG_STATE *state, 462 int tok, 463 const char *ptr, 464 const char *end, 465 const ENCODING *enc) 466 { 467 switch (tok) { 468 case XML_TOK_PROLOG_S: 469 return XML_ROLE_NONE; 470 case XML_TOK_LITERAL: 471 state->handler = entity4; 472 return XML_ROLE_ENTITY_PUBLIC_ID; 473 } 474 return common(state, tok); 475 } 476 477 478 static 479 int entity4(PROLOG_STATE *state, 480 int tok, 481 const char *ptr, 482 const char *end, 483 const ENCODING *enc) 484 { 485 switch (tok) { 486 case XML_TOK_PROLOG_S: 487 return XML_ROLE_NONE; 488 case XML_TOK_LITERAL: 489 state->handler = entity5; 490 return XML_ROLE_ENTITY_SYSTEM_ID; 491 } 492 return common(state, tok); 493 } 494 495 static 496 int entity5(PROLOG_STATE *state, 497 int tok, 498 const char *ptr, 499 const char *end, 500 const ENCODING *enc) 501 { 502 switch (tok) { 503 case XML_TOK_PROLOG_S: 504 return XML_ROLE_NONE; 505 case XML_TOK_DECL_CLOSE: 506 setTopLevel(state); 507 return XML_ROLE_ENTITY_COMPLETE; 508 case XML_TOK_NAME: 509 if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { 510 state->handler = entity6; 511 return XML_ROLE_NONE; 512 } 513 break; 514 } 515 return common(state, tok); 516 } 517 518 static 519 int entity6(PROLOG_STATE *state, 520 int tok, 521 const char *ptr, 522 const char *end, 523 const ENCODING *enc) 524 { 525 switch (tok) { 526 case XML_TOK_PROLOG_S: 527 return XML_ROLE_NONE; 528 case XML_TOK_NAME: 529 state->handler = declClose; 530 return XML_ROLE_ENTITY_NOTATION_NAME; 531 } 532 return common(state, tok); 533 } 534 535 static 536 int entity7(PROLOG_STATE *state, 537 int tok, 538 const char *ptr, 539 const char *end, 540 const ENCODING *enc) 541 { 542 switch (tok) { 543 case XML_TOK_PROLOG_S: 544 return XML_ROLE_NONE; 545 case XML_TOK_NAME: 546 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 547 state->handler = entity9; 548 return XML_ROLE_NONE; 549 } 550 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 551 state->handler = entity8; 552 return XML_ROLE_NONE; 553 } 554 break; 555 case XML_TOK_LITERAL: 556 state->handler = declClose; 557 return XML_ROLE_ENTITY_VALUE; 558 } 559 return common(state, tok); 560 } 561 562 static 563 int entity8(PROLOG_STATE *state, 564 int tok, 565 const char *ptr, 566 const char *end, 567 const ENCODING *enc) 568 { 569 switch (tok) { 570 case XML_TOK_PROLOG_S: 571 return XML_ROLE_NONE; 572 case XML_TOK_LITERAL: 573 state->handler = entity9; 574 return XML_ROLE_ENTITY_PUBLIC_ID; 575 } 576 return common(state, tok); 577 } 578 579 static 580 int entity9(PROLOG_STATE *state, 581 int tok, 582 const char *ptr, 583 const char *end, 584 const ENCODING *enc) 585 { 586 switch (tok) { 587 case XML_TOK_PROLOG_S: 588 return XML_ROLE_NONE; 589 case XML_TOK_LITERAL: 590 state->handler = declClose; 591 return XML_ROLE_ENTITY_SYSTEM_ID; 592 } 593 return common(state, tok); 594 } 595 596 static 597 int notation0(PROLOG_STATE *state, 1384 598 int tok, 1385 599 const char *ptr, 1386 600 const char *end, 1387 const ENCODING * enc) 1388 { 1389 return XML_ROLE_NONE; 1390 } 1391 1392 static 1393 int common(PROLOG_STATE * state, int tok) 1394 { 601 const ENCODING *enc) 602 { 603 switch (tok) { 604 case XML_TOK_PROLOG_S: 605 return XML_ROLE_NONE; 606 case XML_TOK_NAME: 607 state->handler = notation1; 608 return XML_ROLE_NOTATION_NAME; 609 } 610 return common(state, tok); 611 } 612 613 static 614 int notation1(PROLOG_STATE *state, 615 int tok, 616 const char *ptr, 617 const char *end, 618 const ENCODING *enc) 619 { 620 switch (tok) { 621 case XML_TOK_PROLOG_S: 622 return XML_ROLE_NONE; 623 case XML_TOK_NAME: 624 if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { 625 state->handler = notation3; 626 return XML_ROLE_NONE; 627 } 628 if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { 629 state->handler = notation2; 630 return XML_ROLE_NONE; 631 } 632 break; 633 } 634 return common(state, tok); 635 } 636 637 static 638 int notation2(PROLOG_STATE *state, 639 int tok, 640 const char *ptr, 641 const char *end, 642 const ENCODING *enc) 643 { 644 switch (tok) { 645 case XML_TOK_PROLOG_S: 646 return XML_ROLE_NONE; 647 case XML_TOK_LITERAL: 648 state->handler = notation4; 649 return XML_ROLE_NOTATION_PUBLIC_ID; 650 } 651 return common(state, tok); 652 } 653 654 static 655 int notation3(PROLOG_STATE *state, 656 int tok, 657 const char *ptr, 658 const char *end, 659 const ENCODING *enc) 660 { 661 switch (tok) { 662 case XML_TOK_PROLOG_S: 663 return XML_ROLE_NONE; 664 case XML_TOK_LITERAL: 665 state->handler = declClose; 666 return XML_ROLE_NOTATION_SYSTEM_ID; 667 } 668 return common(state, tok); 669 } 670 671 static 672 int notation4(PROLOG_STATE *state, 673 int tok, 674 const char *ptr, 675 const char *end, 676 const ENCODING *enc) 677 { 678 switch (tok) { 679 case XML_TOK_PROLOG_S: 680 return XML_ROLE_NONE; 681 case XML_TOK_LITERAL: 682 state->handler = declClose; 683 return XML_ROLE_NOTATION_SYSTEM_ID; 684 case XML_TOK_DECL_CLOSE: 685 setTopLevel(state); 686 return XML_ROLE_NOTATION_NO_SYSTEM_ID; 687 } 688 return common(state, tok); 689 } 690 691 static 692 int attlist0(PROLOG_STATE *state, 693 int tok, 694 const char *ptr, 695 const char *end, 696 const ENCODING *enc) 697 { 698 switch (tok) { 699 case XML_TOK_PROLOG_S: 700 return XML_ROLE_NONE; 701 case XML_TOK_NAME: 702 case XML_TOK_PREFIXED_NAME: 703 state->handler = attlist1; 704 return XML_ROLE_ATTLIST_ELEMENT_NAME; 705 } 706 return common(state, tok); 707 } 708 709 static 710 int attlist1(PROLOG_STATE *state, 711 int tok, 712 const char *ptr, 713 const char *end, 714 const ENCODING *enc) 715 { 716 switch (tok) { 717 case XML_TOK_PROLOG_S: 718 return XML_ROLE_NONE; 719 case XML_TOK_DECL_CLOSE: 720 setTopLevel(state); 721 return XML_ROLE_NONE; 722 case XML_TOK_NAME: 723 case XML_TOK_PREFIXED_NAME: 724 state->handler = attlist2; 725 return XML_ROLE_ATTRIBUTE_NAME; 726 } 727 return common(state, tok); 728 } 729 730 static 731 int attlist2(PROLOG_STATE *state, 732 int tok, 733 const char *ptr, 734 const char *end, 735 const ENCODING *enc) 736 { 737 switch (tok) { 738 case XML_TOK_PROLOG_S: 739 return XML_ROLE_NONE; 740 case XML_TOK_NAME: 741 { 742 static const char *types[] = { 743 KW_CDATA, 744 KW_ID, 745 KW_IDREF, 746 KW_IDREFS, 747 KW_ENTITY, 748 KW_ENTITIES, 749 KW_NMTOKEN, 750 KW_NMTOKENS, 751 }; 752 int i; 753 for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) 754 if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { 755 state->handler = attlist8; 756 return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; 757 } 758 } 759 if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { 760 state->handler = attlist5; 761 return XML_ROLE_NONE; 762 } 763 break; 764 case XML_TOK_OPEN_PAREN: 765 state->handler = attlist3; 766 return XML_ROLE_NONE; 767 } 768 return common(state, tok); 769 } 770 771 static 772 int attlist3(PROLOG_STATE *state, 773 int tok, 774 const char *ptr, 775 const char *end, 776 const ENCODING *enc) 777 { 778 switch (tok) { 779 case XML_TOK_PROLOG_S: 780 return XML_ROLE_NONE; 781 case XML_TOK_NMTOKEN: 782 case XML_TOK_NAME: 783 case XML_TOK_PREFIXED_NAME: 784 state->handler = attlist4; 785 return XML_ROLE_ATTRIBUTE_ENUM_VALUE; 786 } 787 return common(state, tok); 788 } 789 790 static 791 int attlist4(PROLOG_STATE *state, 792 int tok, 793 const char *ptr, 794 const char *end, 795 const ENCODING *enc) 796 { 797 switch (tok) { 798 case XML_TOK_PROLOG_S: 799 return XML_ROLE_NONE; 800 case XML_TOK_CLOSE_PAREN: 801 state->handler = attlist8; 802 return XML_ROLE_NONE; 803 case XML_TOK_OR: 804 state->handler = attlist3; 805 return XML_ROLE_NONE; 806 } 807 return common(state, tok); 808 } 809 810 static 811 int attlist5(PROLOG_STATE *state, 812 int tok, 813 const char *ptr, 814 const char *end, 815 const ENCODING *enc) 816 { 817 switch (tok) { 818 case XML_TOK_PROLOG_S: 819 return XML_ROLE_NONE; 820 case XML_TOK_OPEN_PAREN: 821 state->handler = attlist6; 822 return XML_ROLE_NONE; 823 } 824 return common(state, tok); 825 } 826 827 828 static 829 int attlist6(PROLOG_STATE *state, 830 int tok, 831 const char *ptr, 832 const char *end, 833 const ENCODING *enc) 834 { 835 switch (tok) { 836 case XML_TOK_PROLOG_S: 837 return XML_ROLE_NONE; 838 case XML_TOK_NAME: 839 state->handler = attlist7; 840 return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; 841 } 842 return common(state, tok); 843 } 844 845 static 846 int attlist7(PROLOG_STATE *state, 847 int tok, 848 const char *ptr, 849 const char *end, 850 const ENCODING *enc) 851 { 852 switch (tok) { 853 case XML_TOK_PROLOG_S: 854 return XML_ROLE_NONE; 855 case XML_TOK_CLOSE_PAREN: 856 state->handler = attlist8; 857 return XML_ROLE_NONE; 858 case XML_TOK_OR: 859 state->handler = attlist6; 860 return XML_ROLE_NONE; 861 } 862 return common(state, tok); 863 } 864 865 /* default value */ 866 static 867 int attlist8(PROLOG_STATE *state, 868 int tok, 869 const char *ptr, 870 const char *end, 871 const ENCODING *enc) 872 { 873 switch (tok) { 874 case XML_TOK_PROLOG_S: 875 return XML_ROLE_NONE; 876 case XML_TOK_POUND_NAME: 877 if (XmlNameMatchesAscii(enc, 878 ptr + MIN_BYTES_PER_CHAR(enc), 879 end, 880 KW_IMPLIED)) { 881 state->handler = attlist1; 882 return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; 883 } 884 if (XmlNameMatchesAscii(enc, 885 ptr + MIN_BYTES_PER_CHAR(enc), 886 end, 887 KW_REQUIRED)) { 888 state->handler = attlist1; 889 return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; 890 } 891 if (XmlNameMatchesAscii(enc, 892 ptr + MIN_BYTES_PER_CHAR(enc), 893 end, 894 KW_FIXED)) { 895 state->handler = attlist9; 896 return XML_ROLE_NONE; 897 } 898 break; 899 case XML_TOK_LITERAL: 900 state->handler = attlist1; 901 return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; 902 } 903 return common(state, tok); 904 } 905 906 static 907 int attlist9(PROLOG_STATE *state, 908 int tok, 909 const char *ptr, 910 const char *end, 911 const ENCODING *enc) 912 { 913 switch (tok) { 914 case XML_TOK_PROLOG_S: 915 return XML_ROLE_NONE; 916 case XML_TOK_LITERAL: 917 state->handler = attlist1; 918 return XML_ROLE_FIXED_ATTRIBUTE_VALUE; 919 } 920 return common(state, tok); 921 } 922 923 static 924 int element0(PROLOG_STATE *state, 925 int tok, 926 const char *ptr, 927 const char *end, 928 const ENCODING *enc) 929 { 930 switch (tok) { 931 case XML_TOK_PROLOG_S: 932 return XML_ROLE_NONE; 933 case XML_TOK_NAME: 934 case XML_TOK_PREFIXED_NAME: 935 state->handler = element1; 936 return XML_ROLE_ELEMENT_NAME; 937 } 938 return common(state, tok); 939 } 940 941 static 942 int element1(PROLOG_STATE *state, 943 int tok, 944 const char *ptr, 945 const char *end, 946 const ENCODING *enc) 947 { 948 switch (tok) { 949 case XML_TOK_PROLOG_S: 950 return XML_ROLE_NONE; 951 case XML_TOK_NAME: 952 if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { 953 state->handler = declClose; 954 return XML_ROLE_CONTENT_EMPTY; 955 } 956 if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { 957 state->handler = declClose; 958 return XML_ROLE_CONTENT_ANY; 959 } 960 break; 961 case XML_TOK_OPEN_PAREN: 962 state->handler = element2; 963 state->level = 1; 964 return XML_ROLE_GROUP_OPEN; 965 } 966 return common(state, tok); 967 } 968 969 static 970 int element2(PROLOG_STATE *state, 971 int tok, 972 const char *ptr, 973 const char *end, 974 const ENCODING *enc) 975 { 976 switch (tok) { 977 case XML_TOK_PROLOG_S: 978 return XML_ROLE_NONE; 979 case XML_TOK_POUND_NAME: 980 if (XmlNameMatchesAscii(enc, 981 ptr + MIN_BYTES_PER_CHAR(enc), 982 end, 983 KW_PCDATA)) { 984 state->handler = element3; 985 return XML_ROLE_CONTENT_PCDATA; 986 } 987 break; 988 case XML_TOK_OPEN_PAREN: 989 state->level = 2; 990 state->handler = element6; 991 return XML_ROLE_GROUP_OPEN; 992 case XML_TOK_NAME: 993 case XML_TOK_PREFIXED_NAME: 994 state->handler = element7; 995 return XML_ROLE_CONTENT_ELEMENT; 996 case XML_TOK_NAME_QUESTION: 997 state->handler = element7; 998 return XML_ROLE_CONTENT_ELEMENT_OPT; 999 case XML_TOK_NAME_ASTERISK: 1000 state->handler = element7; 1001 return XML_ROLE_CONTENT_ELEMENT_REP; 1002 case XML_TOK_NAME_PLUS: 1003 state->handler = element7; 1004 return XML_ROLE_CONTENT_ELEMENT_PLUS; 1005 } 1006 return common(state, tok); 1007 } 1008 1009 static 1010 int element3(PROLOG_STATE *state, 1011 int tok, 1012 const char *ptr, 1013 const char *end, 1014 const ENCODING *enc) 1015 { 1016 switch (tok) { 1017 case XML_TOK_PROLOG_S: 1018 return XML_ROLE_NONE; 1019 case XML_TOK_CLOSE_PAREN: 1020 state->handler = declClose; 1021 return XML_ROLE_GROUP_CLOSE; 1022 case XML_TOK_CLOSE_PAREN_ASTERISK: 1023 state->handler = declClose; 1024 return XML_ROLE_GROUP_CLOSE_REP; 1025 case XML_TOK_OR: 1026 state->handler = element4; 1027 return XML_ROLE_NONE; 1028 } 1029 return common(state, tok); 1030 } 1031 1032 static 1033 int element4(PROLOG_STATE *state, 1034 int tok, 1035 const char *ptr, 1036 const char *end, 1037 const ENCODING *enc) 1038 { 1039 switch (tok) { 1040 case XML_TOK_PROLOG_S: 1041 return XML_ROLE_NONE; 1042 case XML_TOK_NAME: 1043 case XML_TOK_PREFIXED_NAME: 1044 state->handler = element5; 1045 return XML_ROLE_CONTENT_ELEMENT; 1046 } 1047 return common(state, tok); 1048 } 1049 1050 static 1051 int element5(PROLOG_STATE *state, 1052 int tok, 1053 const char *ptr, 1054 const char *end, 1055 const ENCODING *enc) 1056 { 1057 switch (tok) { 1058 case XML_TOK_PROLOG_S: 1059 return XML_ROLE_NONE; 1060 case XML_TOK_CLOSE_PAREN_ASTERISK: 1061 state->handler = declClose; 1062 return XML_ROLE_GROUP_CLOSE_REP; 1063 case XML_TOK_OR: 1064 state->handler = element4; 1065 return XML_ROLE_NONE; 1066 } 1067 return common(state, tok); 1068 } 1069 1070 static 1071 int element6(PROLOG_STATE *state, 1072 int tok, 1073 const char *ptr, 1074 const char *end, 1075 const ENCODING *enc) 1076 { 1077 switch (tok) { 1078 case XML_TOK_PROLOG_S: 1079 return XML_ROLE_NONE; 1080 case XML_TOK_OPEN_PAREN: 1081 state->level += 1; 1082 return XML_ROLE_GROUP_OPEN; 1083 case XML_TOK_NAME: 1084 case XML_TOK_PREFIXED_NAME: 1085 state->handler = element7; 1086 return XML_ROLE_CONTENT_ELEMENT; 1087 case XML_TOK_NAME_QUESTION: 1088 state->handler = element7; 1089 return XML_ROLE_CONTENT_ELEMENT_OPT; 1090 case XML_TOK_NAME_ASTERISK: 1091 state->handler = element7; 1092 return XML_ROLE_CONTENT_ELEMENT_REP; 1093 case XML_TOK_NAME_PLUS: 1094 state->handler = element7; 1095 return XML_ROLE_CONTENT_ELEMENT_PLUS; 1096 } 1097 return common(state, tok); 1098 } 1099 1100 static 1101 int element7(PROLOG_STATE *state, 1102 int tok, 1103 const char *ptr, 1104 const char *end, 1105 const ENCODING *enc) 1106 { 1107 switch (tok) { 1108 case XML_TOK_PROLOG_S: 1109 return XML_ROLE_NONE; 1110 case XML_TOK_CLOSE_PAREN: 1111 state->level -= 1; 1112 if (state->level == 0) 1113 state->handler = declClose; 1114 return XML_ROLE_GROUP_CLOSE; 1115 case XML_TOK_CLOSE_PAREN_ASTERISK: 1116 state->level -= 1; 1117 if (state->level == 0) 1118 state->handler = declClose; 1119 return XML_ROLE_GROUP_CLOSE_REP; 1120 case XML_TOK_CLOSE_PAREN_QUESTION: 1121 state->level -= 1; 1122 if (state->level == 0) 1123 state->handler = declClose; 1124 return XML_ROLE_GROUP_CLOSE_OPT; 1125 case XML_TOK_CLOSE_PAREN_PLUS: 1126 state->level -= 1; 1127 if (state->level == 0) 1128 state->handler = declClose; 1129 return XML_ROLE_GROUP_CLOSE_PLUS; 1130 case XML_TOK_COMMA: 1131 state->handler = element6; 1132 return XML_ROLE_GROUP_SEQUENCE; 1133 case XML_TOK_OR: 1134 state->handler = element6; 1135 return XML_ROLE_GROUP_CHOICE; 1136 } 1137 return common(state, tok); 1138 } 1139 1395 1140 #ifdef XML_DTD 1396 if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) 1397 return XML_ROLE_INNER_PARAM_ENTITY_REF; 1141 1142 static 1143 int condSect0(PROLOG_STATE *state, 1144 int tok, 1145 const char *ptr, 1146 const char *end, 1147 const ENCODING *enc) 1148 { 1149 switch (tok) { 1150 case XML_TOK_PROLOG_S: 1151 return XML_ROLE_NONE; 1152 case XML_TOK_NAME: 1153 if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { 1154 state->handler = condSect1; 1155 return XML_ROLE_NONE; 1156 } 1157 if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { 1158 state->handler = condSect2; 1159 return XML_ROLE_NONE; 1160 } 1161 break; 1162 } 1163 return common(state, tok); 1164 } 1165 1166 static 1167 int condSect1(PROLOG_STATE *state, 1168 int tok, 1169 const char *ptr, 1170 const char *end, 1171 const ENCODING *enc) 1172 { 1173 switch (tok) { 1174 case XML_TOK_PROLOG_S: 1175 return XML_ROLE_NONE; 1176 case XML_TOK_OPEN_BRACKET: 1177 state->handler = externalSubset1; 1178 state->includeLevel += 1; 1179 return XML_ROLE_NONE; 1180 } 1181 return common(state, tok); 1182 } 1183 1184 static 1185 int condSect2(PROLOG_STATE *state, 1186 int tok, 1187 const char *ptr, 1188 const char *end, 1189 const ENCODING *enc) 1190 { 1191 switch (tok) { 1192 case XML_TOK_PROLOG_S: 1193 return XML_ROLE_NONE; 1194 case XML_TOK_OPEN_BRACKET: 1195 state->handler = externalSubset1; 1196 return XML_ROLE_IGNORE_SECT; 1197 } 1198 return common(state, tok); 1199 } 1200 1201 #endif /* XML_DTD */ 1202 1203 static 1204 int declClose(PROLOG_STATE *state, 1205 int tok, 1206 const char *ptr, 1207 const char *end, 1208 const ENCODING *enc) 1209 { 1210 switch (tok) { 1211 case XML_TOK_PROLOG_S: 1212 return XML_ROLE_NONE; 1213 case XML_TOK_DECL_CLOSE: 1214 setTopLevel(state); 1215 return XML_ROLE_NONE; 1216 } 1217 return common(state, tok); 1218 } 1219 1220 #if 0 1221 1222 static 1223 int ignore(PROLOG_STATE *state, 1224 int tok, 1225 const char *ptr, 1226 const char *end, 1227 const ENCODING *enc) 1228 { 1229 switch (tok) { 1230 case XML_TOK_DECL_CLOSE: 1231 state->handler = internalSubset; 1232 return 0; 1233 default: 1234 return XML_ROLE_NONE; 1235 } 1236 return common(state, tok); 1237 } 1398 1238 #endif 1399 state->handler = error; 1400 return XML_ROLE_ERROR; 1401 } 1402 1403 void XmlPrologStateInit(PROLOG_STATE * state) 1404 { 1405 state->handler = prolog0; 1239 1240 static 1241 int error(PROLOG_STATE *state, 1242 int tok, 1243 const char *ptr, 1244 const char *end, 1245 const ENCODING *enc) 1246 { 1247 return XML_ROLE_NONE; 1248 } 1249 1250 static 1251 int common(PROLOG_STATE *state, int tok) 1252 { 1406 1253 #ifdef XML_DTD 1407 state->documentEntity = 1; 1408 state->includeLevel = 0; 1254 if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) 1255 return XML_ROLE_INNER_PARAM_ENTITY_REF; 1256 #endif 1257 state->handler = error; 1258 return XML_ROLE_ERROR; 1259 } 1260 1261 void XmlPrologStateInit(PROLOG_STATE *state) 1262 { 1263 state->handler = prolog0; 1264 #ifdef XML_DTD 1265 state->documentEntity = 1; 1266 state->includeLevel = 0; 1409 1267 #endif /* XML_DTD */ 1410 1268 } … … 1412 1270 #ifdef XML_DTD 1413 1271 1414 void XmlPrologStateInitExternalEntity(PROLOG_STATE * 1415 { 1416 1417 1418 1272 void XmlPrologStateInitExternalEntity(PROLOG_STATE *state) 1273 { 1274 state->handler = externalSubset0; 1275 state->documentEntity = 0; 1276 state->includeLevel = 0; 1419 1277 } 1420 1278 -
trunk/src/helpers/xmltok.c
r75 r97 1 2 1 /* 3 *sourcefile xmltok.c 4 * part of the expat implementation. See xmlparse.c. 5 * 2 * Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 3 * See the file COPYING for copying permission. 6 4 */ 7 5 8 /* 9 * Copyright (C) 2001 Ulrich Mller. 10 * Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 11 * and Clark Cooper. 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be included 22 * in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 27 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 28 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 29 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 30 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 6 /* #ifdef COMPILED_FROM_DSP 7 * # include "winconfig.h" 8 * #else 9 * # include <config.h> 10 * #endif 31 11 */ 32 12 33 #include "setup.h"34 35 #include "expat\expat_setup.h" 13 #include <memory.h> 14 15 #include "expat\expat_setup.h" // V0.9.9 (2001-02-10) [umoeller] 36 16 37 17 #pragma info(norea, nogen) … … 105 85 #define UTF8_INVALID4(p) ((*p) == 0xF4 && ((p)[1] & 0x30) != 0) 106 86 107 static int EXPATENTRY isNever(const ENCODING * enc, const char *p) 87 static 88 int isNever(const ENCODING * enc, const char *p) 108 89 { 109 90 return 0; 110 91 } 111 92 112 static int EXPATENTRY utf8_isName2(const ENCODING * enc, const char *p) 93 static 94 int utf8_isName2(const ENCODING * enc, const char *p) 113 95 { 114 96 return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); 115 97 } 116 98 117 static int EXPATENTRY utf8_isName3(const ENCODING * enc, const char *p) 99 static 100 int utf8_isName3(const ENCODING * enc, const char *p) 118 101 { 119 102 return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); … … 122 105 #define utf8_isName4 isNever 123 106 124 static int EXPATENTRY utf8_isNmstrt2(const ENCODING * enc, const char *p) 107 static 108 int utf8_isNmstrt2(const ENCODING * enc, const char *p) 125 109 { 126 110 return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); 127 111 } 128 112 129 static int EXPATENTRY utf8_isNmstrt3(const ENCODING * enc, const char *p) 113 static 114 int utf8_isNmstrt3(const ENCODING * enc, const char *p) 130 115 { 131 116 return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); … … 136 121 #define utf8_isInvalid2 isNever 137 122 138 static int EXPATENTRY utf8_isInvalid3(const ENCODING * enc, const char *p) 123 static 124 int utf8_isInvalid3(const ENCODING * enc, const char *p) 139 125 { 140 126 return UTF8_INVALID3((const unsigned char *)p); 141 127 } 142 128 143 static int EXPATENTRY utf8_isInvalid4(const ENCODING * enc, const char *p) 129 static 130 int utf8_isInvalid4(const ENCODING * enc, const char *p) 144 131 { 145 132 return UTF8_INVALID4((const unsigned char *)p); … … 151 138 unsigned char type[256]; 152 139 #ifdef XML_MIN_SIZE 153 int (* EXPATENTRYbyteType) (const ENCODING *, const char *);154 int (* EXPATENTRYisNameMin) (const ENCODING *, const char *);155 int (* EXPATENTRYisNmstrtMin) (const ENCODING *, const char *);156 int (* EXPATENTRYbyteToAscii) (const ENCODING *, const char *);157 int (* EXPATENTRYcharMatches) (const ENCODING *, const char *, int);140 int (*byteType) (const ENCODING *, const char *); 141 int (*isNameMin) (const ENCODING *, const char *); 142 int (*isNmstrtMin) (const ENCODING *, const char *); 143 int (*byteToAscii) (const ENCODING *, const char *); 144 int (*charMatches) (const ENCODING *, const char *, int); 158 145 #endif /* XML_MIN_SIZE */ 159 int (* EXPATENTRYisName2) (const ENCODING *, const char *);160 int (* EXPATENTRYisName3) (const ENCODING *, const char *);161 int (* EXPATENTRYisName4) (const ENCODING *, const char *);162 int (* EXPATENTRYisNmstrt2) (const ENCODING *, const char *);163 int (* EXPATENTRYisNmstrt3) (const ENCODING *, const char *);164 int (* EXPATENTRYisNmstrt4) (const ENCODING *, const char *);165 int (* EXPATENTRYisInvalid2) (const ENCODING *, const char *);166 int (* EXPATENTRYisInvalid3) (const ENCODING *, const char *);167 int (* EXPATENTRYisInvalid4) (const ENCODING *, const char *);146 int (*isName2) (const ENCODING *, const char *); 147 int (*isName3) (const ENCODING *, const char *); 148 int (*isName4) (const ENCODING *, const char *); 149 int (*isNmstrt2) (const ENCODING *, const char *); 150 int (*isNmstrt3) (const ENCODING *, const char *); 151 int (*isNmstrt4) (const ENCODING *, const char *); 152 int (*isInvalid2) (const ENCODING *, const char *); 153 int (*isInvalid3) (const ENCODING *, const char *); 154 int (*isInvalid4) (const ENCODING *, const char *); 168 155 }; 169 156 … … 215 202 216 203 #ifdef XML_MIN_SIZE 217 static int EXPATENTRY sb_byteType(const ENCODING * enc, const char *p) 204 static 205 int sb_byteType(const ENCODING * enc, const char *p) 218 206 { 219 207 return SB_BYTE_TYPE(enc, p); … … 228 216 #define BYTE_TO_ASCII(enc, p) \ 229 217 (((const struct normal_encoding *)(enc))->byteToAscii(enc, p)) 230 static int EXPATENTRY sb_byteToAscii(const ENCODING * enc, const char *p) 218 static 219 int sb_byteToAscii(const ENCODING * enc, const char *p) 231 220 { 232 221 return *p; … … 256 245 #define CHAR_MATCHES(enc, p, c) \ 257 246 (((const struct normal_encoding *)(enc))->charMatches(enc, p, c)) 258 static int EXPATENTRY sb_charMatches(const ENCODING * enc, const char *p, int c) 247 static 248 int sb_charMatches(const ENCODING * enc, const char *p, int c) 259 249 { 260 250 return *p == c; … … 286 276 }; 287 277 288 static void EXPATENTRYutf8_toUtf8(const ENCODING * enc,289 290 291 292 278 static void utf8_toUtf8(const ENCODING * enc, 279 const char **fromP, 280 const char *fromLim, 281 char **toP, 282 const char *toLim) 293 283 { 294 284 char *to; … … 298 288 { 299 289 /* Avoid copying partial characters. */ 300 for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) 290 for (fromLim = *fromP + (toLim - *toP); 291 fromLim > *fromP; 292 fromLim--) 301 293 if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) 302 294 break; 303 295 } 304 for (to = *toP, from = *fromP; from != fromLim; from++, to++) 296 for (to = *toP, from = *fromP; 297 from != fromLim; 298 from++, to++) 305 299 *to = *from; 306 300 *fromP = from; … … 308 302 } 309 303 310 static void EXPATENTRY utf8_toUtf16(const ENCODING * enc, 311 const char **fromP, const char *fromLim, 312 unsigned short **toP, const unsigned short *toLim) 304 static void utf8_toUtf16(const ENCODING * enc, 305 const char **fromP, 306 const char *fromLim, 307 unsigned short **toP, 308 const unsigned short *toLim) 313 309 { 314 310 unsigned short *to = *toP; … … 401 397 }; 402 398 403 static void EXPATENTRY latin1_toUtf8(const ENCODING * enc, 404 const char **fromP, const char *fromLim, 405 char **toP, const char *toLim) 399 static void latin1_toUtf8(const ENCODING * enc, 400 const char **fromP, 401 const char *fromLim, 402 char **toP, 403 const char *toLim) 406 404 { 407 405 for (;;) … … 429 427 } 430 428 431 static void EXPATENTRY latin1_toUtf16(const ENCODING * enc, 432 const char **fromP, const char *fromLim, 433 unsigned short **toP, const unsigned short *toLim) 429 static void latin1_toUtf16(const ENCODING * enc, 430 const char **fromP, 431 const char *fromLim, 432 unsigned short **toP, 433 const unsigned short *toLim) 434 434 { 435 435 while (*fromP != fromLim && *toP != toLim) … … 463 463 }; 464 464 465 static void EXPATENTRY ascii_toUtf8(const ENCODING * enc, 466 const char **fromP, const char *fromLim, 467 char **toP, const char *toLim) 465 static void ascii_toUtf8(const ENCODING * enc, 466 const char **fromP, 467 const char *fromLim, 468 char **toP, 469 const char *toLim) 468 470 { 469 471 while (*fromP != fromLim && *toP != toLim) … … 524 526 525 527 #define DEFINE_UTF16_TO_UTF8(E) \ 526 static void EXPATENTRY E ## toUtf8(const ENCODING *enc, \ 528 static \ 529 void E ## toUtf8(const ENCODING *enc, \ 527 530 const char **fromP, const char *fromLim, \ 528 531 char **toP, const char *toLim) \ … … 586 589 587 590 #define DEFINE_UTF16_TO_UTF16(E) \ 588 static void EXPATENTRY E ## toUtf16(const ENCODING *enc, \ 591 static \ 592 void E ## toUtf16(const ENCODING *enc, \ 589 593 const char **fromP, const char *fromLim, \ 590 594 unsigned short **toP, const unsigned short *toLim) \ … … 635 639 #ifdef XML_MIN_SIZE 636 640 637 static int EXPATENTRY little2_byteType(const ENCODING * enc, const char *p) 638 { 639 return LITTLE2_BYTE_TYPE(enc, p); 640 } 641 642 static int EXPATENTRY little2_byteToAscii(const ENCODING * enc, const char *p) 643 { 644 return LITTLE2_BYTE_TO_ASCII(enc, p); 645 } 646 647 static int EXPATENTRY little2_charMatches(const ENCODING * enc, const char *p, int c) 648 { 649 return LITTLE2_CHAR_MATCHES(enc, p, c); 650 } 651 652 static int EXPATENTRY little2_isNameMin(const ENCODING * enc, const char *p) 653 { 654 return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); 655 } 656 657 static int EXPATENTRY little2_isNmstrtMin(const ENCODING * enc, const char *p) 658 { 659 return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); 660 } 661 662 #undef VTABLE 663 #define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 641 static 642 int little2_byteType(const ENCODING * enc, const char *p) 643 { 644 return LITTLE2_BYTE_TYPE(enc, p); 645 } 646 647 static int little2_byteToAscii(const ENCODING * enc, const char *p) 648 { 649 return LITTLE2_BYTE_TO_ASCII(enc, p); 650 } 651 652 static int little2_charMatches(const ENCODING * enc, const char *p, int c) 653 { 654 return LITTLE2_CHAR_MATCHES(enc, p, c); 655 } 656 657 static int little2_isNameMin(const ENCODING * enc, const char *p) 658 { 659 return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); 660 } 661 662 static int little2_isNmstrtMin(const ENCODING * enc, const char *p) 663 { 664 return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); 665 } 666 667 #undef VTABLE 668 #define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 664 669 665 670 #else /* not XML_MIN_SIZE */ 666 671 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 672 #undef PREFIX 673 #define PREFIX(ident) little2_ ## ident 674 #define MINBPC(enc) 2 675 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ 676 #define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) 677 #define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) 678 #define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) 679 #define IS_NAME_CHAR(enc, p, n) 0 680 #define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) 681 #define IS_NMSTRT_CHAR(enc, p, n) (0) 682 #define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) 683 684 #include "xmltok_impl.c" 685 686 #undef MINBPC 687 #undef BYTE_TYPE 688 #undef BYTE_TO_ASCII 689 #undef CHAR_MATCHES 690 #undef IS_NAME_CHAR 691 #undef IS_NAME_CHAR_MINBPC 692 #undef IS_NMSTRT_CHAR 693 #undef IS_NMSTRT_CHAR_MINBPC 694 #undef IS_INVALID_CHAR 690 695 691 696 #endif /* not XML_MIN_SIZE */ … … 693 698 #ifdef XML_NS 694 699 695 static const struct normal_encoding little2_encoding_ns = 700 static const struct normal_encoding little2_encoding_ns = 701 { 702 {VTABLE, 2, 0, 703 #if XML_BYTE_ORDER == 12 704 1 705 #else 706 0 707 #endif 708 }, 696 709 { 697 {VTABLE, 2, 0, 698 #if XML_BYTE_ORDER == 12 699 1 700 #else 701 0 702 #endif 703 }, 704 { 705 #include "expat\asciitab.h" 706 #include "expat\latin1tab.h" 707 }, 708 STANDARD_VTABLE(little2_) 709 }; 710 #include "expat\asciitab.h" 711 #include "expat\latin1tab.h" 712 }, 713 STANDARD_VTABLE(little2_) 714 }; 710 715 711 716 #endif … … 773 778 #ifdef XML_MIN_SIZE 774 779 775 static int EXPATENTRYbig2_byteType(const ENCODING * enc, const char *p)776 777 778 779 780 static int EXPATENTRYbig2_byteToAscii(const ENCODING * enc, const char *p)781 782 783 784 785 static int EXPATENTRYbig2_charMatches(const ENCODING * enc, const char *p, int c)786 787 788 789 790 static int EXPATENTRYbig2_isNameMin(const ENCODING * enc, const char *p)791 792 793 794 795 static int EXPATENTRYbig2_isNmstrtMin(const ENCODING * enc, const char *p)796 797 798 799 800 801 780 static int big2_byteType(const ENCODING * enc, const char *p) 781 { 782 return BIG2_BYTE_TYPE(enc, p); 783 } 784 785 static int big2_byteToAscii(const ENCODING * enc, const char *p) 786 { 787 return BIG2_BYTE_TO_ASCII(enc, p); 788 } 789 790 static int big2_charMatches(const ENCODING * enc, const char *p, int c) 791 { 792 return BIG2_CHAR_MATCHES(enc, p, c); 793 } 794 795 static int big2_isNameMin(const ENCODING * enc, const char *p) 796 { 797 return BIG2_IS_NAME_CHAR_MINBPC(enc, p); 798 } 799 800 static int big2_isNmstrtMin(const ENCODING * enc, const char *p) 801 { 802 return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); 803 } 804 805 #undef VTABLE 806 #define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 802 807 803 808 #else /* not XML_MIN_SIZE */ 804 809 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 810 #undef PREFIX 811 #define PREFIX(ident) big2_ ## ident 812 #define MINBPC(enc) 2 813 /* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ 814 #define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) 815 #define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) 816 #define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) 817 #define IS_NAME_CHAR(enc, p, n) 0 818 #define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) 819 #define IS_NMSTRT_CHAR(enc, p, n) (0) 820 #define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) 821 822 #include "xmltok_impl.c" 823 824 #undef MINBPC 825 #undef BYTE_TYPE 826 #undef BYTE_TO_ASCII 827 #undef CHAR_MATCHES 828 #undef IS_NAME_CHAR 829 #undef IS_NAME_CHAR_MINBPC 830 #undef IS_NMSTRT_CHAR 831 #undef IS_NMSTRT_CHAR_MINBPC 832 #undef IS_INVALID_CHAR 828 833 829 834 #endif /* not XML_MIN_SIZE */ … … 899 904 #undef PREFIX 900 905 901 static 902 int streqci(const char *s1, const char *s2) 906 static int streqci(const char *s1, const char *s2) 903 907 { 904 908 for (;;) … … 919 923 } 920 924 921 static void EXPATENTRY initUpdatePosition(const ENCODING * enc, 922 const char *ptr, 923 const char *end, 924 POSITION * pos) 925 static void initUpdatePosition(const ENCODING * enc, const char *ptr, 926 const char *end, POSITION * pos) 925 927 { 926 928 normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); 927 929 } 928 930 929 static int EXPATENTRYtoAscii(const ENCODING * enc, const char *ptr, const char *end)931 static int toAscii(const ENCODING * enc, const char *ptr, const char *end) 930 932 { 931 933 char buf[1]; … … 954 956 /* Return 1 if there's just optional white space 955 957 * or there's an S followed by name=val. */ 956 static int EXPATENTRYparsePseudoAttribute(const ENCODING * enc,957 958 959 960 961 962 958 static int parsePseudoAttribute(const ENCODING * enc, 959 const char *ptr, 960 const char *end, 961 const char **namePtr, 962 const char **nameEndPtr, 963 const char **valPtr, 964 const char **nextTokPtr) 963 965 { 964 966 int c; … … 1081 1083 }; 1082 1084 1083 static int doParseXmlDecl(const ENCODING * (* EXPATENTRY encodingFinder)(const ENCODING *,1084 1085 1085 static int doParseXmlDecl(const ENCODING * (*encodingFinder) (const ENCODING *, 1086 const char *, 1087 const char *), 1086 1088 int isGeneralTextEntity, 1087 1089 const ENCODING * enc, … … 1281 1283 }; 1282 1284 1283 int EXPATENTRYXmlSizeOfUnknownEncoding(void)1285 int XmlSizeOfUnknownEncoding(void) 1284 1286 { 1285 1287 return sizeof(struct unknown_encoding); 1286 1288 } 1287 1289 1288 static int EXPATENTRYunknown_isName(const ENCODING * enc, const char *p)1290 static int unknown_isName(const ENCODING * enc, const char *p) 1289 1291 { 1290 1292 int c = ((const struct unknown_encoding *)enc) … … 1296 1298 } 1297 1299 1298 static int EXPATENTRYunknown_isNmstrt(const ENCODING * enc, const char *p)1300 static int unknown_isNmstrt(const ENCODING * enc, const char *p) 1299 1301 { 1300 1302 int c = ((const struct unknown_encoding *)enc) … … 1306 1308 } 1307 1309 1308 static int EXPATENTRYunknown_isInvalid(const ENCODING * enc, const char *p)1310 static int unknown_isInvalid(const ENCODING * enc, const char *p) 1309 1311 { 1310 1312 int c = ((const struct unknown_encoding *)enc) … … 1314 1316 } 1315 1317 1316 static void EXPATENTRYunknown_toUtf8(const ENCODING * enc,1317 1318 1319 1320 1318 static void unknown_toUtf8(const ENCODING * enc, 1319 const char **fromP, 1320 const char *fromLim, 1321 char **toP, 1322 const char *toLim) 1321 1323 { 1322 1324 char buf[XML_UTF8_ENCODE_MAX]; … … 1357 1359 } 1358 1360 1359 static void EXPATENTRYunknown_toUtf16(const ENCODING * enc,1360 1361 1362 1363 1361 static void unknown_toUtf16(const ENCODING * enc, 1362 const char **fromP, 1363 const char *fromLim, 1364 unsigned short **toP, 1365 const unsigned short *toLim) 1364 1366 { 1365 1367 while (*fromP != fromLim && *toP != toLim) … … 1381 1383 } 1382 1384 1383 ENCODING * XmlInitUnknownEncoding(void *mem, 1384 int *table, 1385 int (*convert) (void *userData, const char *p), 1386 void *userData) 1385 /* 1386 *@@ XmlInitUnknownEncoding: 1387 * 1388 *@@changed V0.9.14 (2001-08-09) [umoeller]: couple of performance hacks 1389 */ 1390 1391 ENCODING* XmlInitUnknownEncoding(void *mem, 1392 int *table, 1393 int (*convert) (void *userData, const char *p), 1394 void *userData) 1387 1395 { 1388 1396 int i; 1389 struct unknown_encoding *e = (struct unknown_encoding *)mem; 1390 for (i = 0; i < (int)sizeof(struct normal_encoding); i++) 1391 1392 ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; 1397 struct unknown_encoding *e = mem; 1398 1399 // gee, isn't this a regular memcpy?!? 1400 /* for (i = 0; 1401 i < (int)sizeof(struct normal_encoding); 1402 i++) 1403 ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; */ 1404 1405 // replaced the above with this V0.9.14 (2001-08-09) [umoeller] 1406 memcpy(mem, &latin1_encoding, sizeof(struct normal_encoding)); 1407 1393 1408 for (i = 0; i < 128; i++) 1394 if (latin1_encoding.type[i] != BT_OTHER 1395 && latin1_encoding.type[i] != BT_NONXML 1396 && table[i] != i) 1409 if ( latin1_encoding.type[i] != BT_OTHER 1410 && latin1_encoding.type[i] != BT_NONXML 1411 && table[i] != i 1412 ) 1397 1413 return 0; 1414 1398 1415 for (i = 0; i < 256; i++) 1399 1416 { … … 1418 1435 else if (c < 0x80) 1419 1436 { 1420 if (latin1_encoding.type[c] != BT_OTHER 1421 && latin1_encoding.type[c] != BT_NONXML 1422 && c != i) 1437 if ( latin1_encoding.type[c] != BT_OTHER 1438 && latin1_encoding.type[c] != BT_NONXML 1439 && c != i 1440 ) 1423 1441 return 0; 1424 1442 e->normal.type[i] = latin1_encoding.type[c]; … … 1523 1541 if (name == 0) 1524 1542 return NO_ENC; 1525 for (i = 0; i < (int)(sizeof(encodingNames) / sizeof(encodingNames[0])); i++) 1543 for (i = 0; 1544 i < (int)(sizeof(encodingNames) / sizeof(encodingNames[0])); 1545 i++) 1526 1546 if (streqci(name, encodingNames[i])) 1527 1547 return i; … … 1543 1563 1544 1564 1545 static int EXPATENTRYinitScan(const ENCODING ** encodingTable,1546 1547 1548 1549 1550 1565 static int initScan(const ENCODING ** encodingTable, 1566 const INIT_ENCODING * enc, 1567 int state, 1568 const char *ptr, 1569 const char *end, 1570 const char **nextTokPtr) 1551 1571 { 1552 1572 const ENCODING **encPtr; … … 1630 1650 if ((unsigned char)ptr[2] == 0xBF) 1631 1651 { 1652 *nextTokPtr = ptr + 3; 1632 1653 *encPtr = encodingTable[UTF_8_ENC]; 1633 1654 return XML_TOK_BOM; … … 1687 1708 ENCODING * XmlInitUnknownEncodingNS(void *mem, 1688 1709 int *table, 1689 int (* EXPATENTRYconvert) (void *userData, const char *p),1710 int (*convert) (void *userData, const char *p), 1690 1711 void *userData) 1691 1712 { -
trunk/src/helpers/xmltok_impl.c
r38 r97 1 2 1 /* 3 *sourcefile xmltok_impl.c 4 * part of the expat implementation. See xmlparse.c. 5 * 6 * NOTE: This file must not be compiled directly. It is 7 * #include'd from xmltok.c several times. 8 */ 9 10 /* 11 * Copyright (C) 2001 Ulrich Mller. 12 * Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 13 * and Clark Cooper. 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining 16 * a copy of this software and associated documentation files (the 17 * "Software"), to deal in the Software without restriction, including 18 * without limitation the rights to use, copy, modify, merge, publish, 19 * distribute, sublicense, and/or sell copies of the Software, and to 20 * permit persons to whom the Software is furnished to do so, subject to 21 * the following conditions: 22 * 23 * The above copyright notice and this permission notice shall be included 24 * in all copies or substantial portions of the Software. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 29 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 30 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 31 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 32 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 33 */ 2 Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd 3 See the file COPYING for copying permission. 4 */ 34 5 35 6 #ifndef IS_INVALID_CHAR … … 117 88 /* ptr points to character following "<!-" */ 118 89 119 static int EXPATENTRY PREFIX(scanComment)(const ENCODING * enc, 120 const char *ptr, 121 const char *end, 122 const char **nextTokPtr) 123 { 124 if (ptr != end) 125 { 126 if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) 127 { 128 *nextTokPtr = ptr; 129 return XML_TOK_INVALID; 130 } 131 ptr += MINBPC(enc); 132 while (ptr != end) 133 { 134 switch (BYTE_TYPE(enc, ptr)) 135 { 136 INVALID_CASES(ptr, nextTokPtr) 137 case BT_MINUS: 138 if ((ptr += MINBPC(enc)) == end) 139 return XML_TOK_PARTIAL; 140 if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) 141 { 142 if ((ptr += MINBPC(enc)) == end) 143 return XML_TOK_PARTIAL; 144 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) 145 { 146 *nextTokPtr = ptr; 147 return XML_TOK_INVALID; 148 } 149 *nextTokPtr = ptr + MINBPC(enc); 150 return XML_TOK_COMMENT; 151 } 152 break; 153 default: 154 ptr += MINBPC(enc); 155 break; 156 } 157 } 158 } 159 return XML_TOK_PARTIAL; 90 static 91 int PREFIX(scanComment)(const ENCODING *enc, const char *ptr, const char *end, 92 const char **nextTokPtr) 93 { 94 if (ptr != end) { 95 if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { 96 *nextTokPtr = ptr; 97 return XML_TOK_INVALID; 98 } 99 ptr += MINBPC(enc); 100 while (ptr != end) { 101 switch (BYTE_TYPE(enc, ptr)) { 102 INVALID_CASES(ptr, nextTokPtr) 103 case BT_MINUS: 104 if ((ptr += MINBPC(enc)) == end) 105 return XML_TOK_PARTIAL; 106 if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) { 107 if ((ptr += MINBPC(enc)) == end) 108 return XML_TOK_PARTIAL; 109 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { 110 *nextTokPtr = ptr; 111 return XML_TOK_INVALID; 112 } 113 *nextTokPtr = ptr + MINBPC(enc); 114 return XML_TOK_COMMENT; 115 } 116 break; 117 default: 118 ptr += MINBPC(enc); 119 break; 120 } 121 } 122 } 123 return XML_TOK_PARTIAL; 160 124 } 161 125 162 126 /* ptr points to character following "<!" */ 163 127 164 static int EXPATENTRY PREFIX(scanDecl)(const ENCODING * enc, 165 const char *ptr, 166 const char *end, 167 const char **nextTokPtr) 168 { 128 static 129 int PREFIX(scanDecl)(const ENCODING *enc, const char *ptr, const char *end, 130 const char **nextTokPtr) 131 { 132 if (ptr == end) 133 return XML_TOK_PARTIAL; 134 switch (BYTE_TYPE(enc, ptr)) { 135 case BT_MINUS: 136 return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); 137 case BT_LSQB: 138 *nextTokPtr = ptr + MINBPC(enc); 139 return XML_TOK_COND_SECT_OPEN; 140 case BT_NMSTRT: 141 case BT_HEX: 142 ptr += MINBPC(enc); 143 break; 144 default: 145 *nextTokPtr = ptr; 146 return XML_TOK_INVALID; 147 } 148 while (ptr != end) { 149 switch (BYTE_TYPE(enc, ptr)) { 150 case BT_PERCNT: 151 if (ptr + MINBPC(enc) == end) 152 return XML_TOK_PARTIAL; 153 /* don't allow <!ENTITY% foo "whatever"> */ 154 switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { 155 case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: 156 *nextTokPtr = ptr; 157 return XML_TOK_INVALID; 158 } 159 /* fall through */ 160 case BT_S: case BT_CR: case BT_LF: 161 *nextTokPtr = ptr; 162 return XML_TOK_DECL_OPEN; 163 case BT_NMSTRT: 164 case BT_HEX: 165 ptr += MINBPC(enc); 166 break; 167 default: 168 *nextTokPtr = ptr; 169 return XML_TOK_INVALID; 170 } 171 } 172 return XML_TOK_PARTIAL; 173 } 174 175 static 176 int PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, const char *end, int *tokPtr) 177 { 178 int upper = 0; 179 *tokPtr = XML_TOK_PI; 180 if (end - ptr != MINBPC(enc)*3) 181 return 1; 182 switch (BYTE_TO_ASCII(enc, ptr)) { 183 case ASCII_x: 184 break; 185 case ASCII_X: 186 upper = 1; 187 break; 188 default: 189 return 1; 190 } 191 ptr += MINBPC(enc); 192 switch (BYTE_TO_ASCII(enc, ptr)) { 193 case ASCII_m: 194 break; 195 case ASCII_M: 196 upper = 1; 197 break; 198 default: 199 return 1; 200 } 201 ptr += MINBPC(enc); 202 switch (BYTE_TO_ASCII(enc, ptr)) { 203 case ASCII_l: 204 break; 205 case ASCII_L: 206 upper = 1; 207 break; 208 default: 209 return 1; 210 } 211 if (upper) 212 return 0; 213 *tokPtr = XML_TOK_XML_DECL; 214 return 1; 215 } 216 217 /* ptr points to character following "<?" */ 218 219 static 220 int PREFIX(scanPi)(const ENCODING *enc, const char *ptr, const char *end, 221 const char **nextTokPtr) 222 { 223 int tok; 224 const char *target = ptr; 225 if (ptr == end) 226 return XML_TOK_PARTIAL; 227 switch (BYTE_TYPE(enc, ptr)) { 228 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 229 default: 230 *nextTokPtr = ptr; 231 return XML_TOK_INVALID; 232 } 233 while (ptr != end) { 234 switch (BYTE_TYPE(enc, ptr)) { 235 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 236 case BT_S: case BT_CR: case BT_LF: 237 if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { 238 *nextTokPtr = ptr; 239 return XML_TOK_INVALID; 240 } 241 ptr += MINBPC(enc); 242 while (ptr != end) { 243 switch (BYTE_TYPE(enc, ptr)) { 244 INVALID_CASES(ptr, nextTokPtr) 245 case BT_QUEST: 246 ptr += MINBPC(enc); 247 if (ptr == end) 248 return XML_TOK_PARTIAL; 249 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { 250 *nextTokPtr = ptr + MINBPC(enc); 251 return tok; 252 } 253 break; 254 default: 255 ptr += MINBPC(enc); 256 break; 257 } 258 } 259 return XML_TOK_PARTIAL; 260 case BT_QUEST: 261 if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) { 262 *nextTokPtr = ptr; 263 return XML_TOK_INVALID; 264 } 265 ptr += MINBPC(enc); 266 if (ptr == end) 267 return XML_TOK_PARTIAL; 268 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { 269 *nextTokPtr = ptr + MINBPC(enc); 270 return tok; 271 } 272 /* fall through */ 273 default: 274 *nextTokPtr = ptr; 275 return XML_TOK_INVALID; 276 } 277 } 278 return XML_TOK_PARTIAL; 279 } 280 281 282 static 283 int PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr, const char *end, 284 const char **nextTokPtr) 285 { 286 static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB }; 287 int i; 288 /* CDATA[ */ 289 if (end - ptr < 6 * MINBPC(enc)) 290 return XML_TOK_PARTIAL; 291 for (i = 0; i < 6; i++, ptr += MINBPC(enc)) { 292 if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) { 293 *nextTokPtr = ptr; 294 return XML_TOK_INVALID; 295 } 296 } 297 *nextTokPtr = ptr; 298 return XML_TOK_CDATA_SECT_OPEN; 299 } 300 301 static 302 int PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr, const char *end, 303 const char **nextTokPtr) 304 { 305 if (ptr == end) 306 return XML_TOK_NONE; 307 if (MINBPC(enc) > 1) { 308 size_t n = end - ptr; 309 if (n & (MINBPC(enc) - 1)) { 310 n &= ~(MINBPC(enc) - 1); 311 if (n == 0) 312 return XML_TOK_PARTIAL; 313 end = ptr + n; 314 } 315 } 316 switch (BYTE_TYPE(enc, ptr)) { 317 case BT_RSQB: 318 ptr += MINBPC(enc); 169 319 if (ptr == end) 170 return XML_TOK_PARTIAL; 171 switch (BYTE_TYPE(enc, ptr)) 172 { 173 case BT_MINUS: 174 return PREFIX(scanComment) (enc, ptr + MINBPC(enc), end, nextTokPtr); 175 case BT_LSQB: 176 *nextTokPtr = ptr + MINBPC(enc); 177 return XML_TOK_COND_SECT_OPEN; 178 case BT_NMSTRT: 179 case BT_HEX: 180 ptr += MINBPC(enc); 181 break; 182 default: 183 *nextTokPtr = ptr; 184 return XML_TOK_INVALID; 185 } 186 while (ptr != end) 187 { 188 switch (BYTE_TYPE(enc, ptr)) 189 { 190 case BT_PERCNT: 191 if (ptr + MINBPC(enc) == end) 192 return XML_TOK_PARTIAL; 193 /* don't allow <!ENTITY% foo "whatever"> */ 194 switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) 195 { 196 case BT_S: 197 case BT_CR: 198 case BT_LF: 199 case BT_PERCNT: 200 *nextTokPtr = ptr; 201 return XML_TOK_INVALID; 202 } 203 /* fall through */ 204 case BT_S: 205 case BT_CR: 206 case BT_LF: 207 *nextTokPtr = ptr; 208 return XML_TOK_DECL_OPEN; 209 case BT_NMSTRT: 210 case BT_HEX: 211 ptr += MINBPC(enc); 212 break; 213 default: 214 *nextTokPtr = ptr; 215 return XML_TOK_INVALID; 216 } 217 } 218 return XML_TOK_PARTIAL; 219 } 220 221 static int EXPATENTRY PREFIX(checkPiTarget) (const ENCODING * enc, const char *ptr, const char *end, int *tokPtr) 222 { 223 int upper = 0; 224 225 *tokPtr = XML_TOK_PI; 226 if (end - ptr != MINBPC(enc) * 3) 227 return 1; 228 switch (BYTE_TO_ASCII(enc, ptr)) 229 { 230 case ASCII_x: 231 break; 232 case ASCII_X: 233 upper = 1; 234 break; 235 default: 236 return 1; 237 } 238 ptr += MINBPC(enc); 239 switch (BYTE_TO_ASCII(enc, ptr)) 240 { 241 case ASCII_m: 242 break; 243 case ASCII_M: 244 upper = 1; 245 break; 246 default: 247 return 1; 248 } 249 ptr += MINBPC(enc); 250 switch (BYTE_TO_ASCII(enc, ptr)) 251 { 252 case ASCII_l: 253 break; 254 case ASCII_L: 255 upper = 1; 256 break; 257 default: 258 return 1; 259 } 260 if (upper) 261 return 0; 262 *tokPtr = XML_TOK_XML_DECL; 263 return 1; 264 } 265 266 /* ptr points to character following "<?" */ 267 268 static 269 int EXPATENTRY PREFIX(scanPi) (const ENCODING * enc, const char *ptr, const char *end, 270 const char **nextTokPtr) 271 { 272 int tok; 273 const char *target = ptr; 274 320 return XML_TOK_PARTIAL; 321 if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 322 break; 323 ptr += MINBPC(enc); 275 324 if (ptr == end) 276 return XML_TOK_PARTIAL; 277 switch (BYTE_TYPE(enc, ptr)) 278 { 279 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 280 default: 281 *nextTokPtr = ptr; 282 return XML_TOK_INVALID; 283 } 284 while (ptr != end) 285 { 286 switch (BYTE_TYPE(enc, ptr)) 287 { 288 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 289 case BT_S: 290 case BT_CR: 291 case BT_LF: 292 if (!PREFIX(checkPiTarget) (enc, target, ptr, &tok)) 293 { 294 *nextTokPtr = ptr; 295 return XML_TOK_INVALID; 296 } 297 ptr += MINBPC(enc); 298 while (ptr != end) 299 { 300 switch (BYTE_TYPE(enc, ptr)) 301 { 302 INVALID_CASES(ptr, nextTokPtr) 303 case BT_QUEST: 304 ptr += MINBPC(enc); 305 if (ptr == end) 306 return XML_TOK_PARTIAL; 307 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) 308 { 309 *nextTokPtr = ptr + MINBPC(enc); 310 return tok; 311 } 312 break; 313 default: 314 ptr += MINBPC(enc); 315 break; 316 } 317 } 318 return XML_TOK_PARTIAL; 319 case BT_QUEST: 320 if (!PREFIX(checkPiTarget) (enc, target, ptr, &tok)) 321 { 322 *nextTokPtr = ptr; 323 return XML_TOK_INVALID; 324 } 325 ptr += MINBPC(enc); 326 if (ptr == end) 327 return XML_TOK_PARTIAL; 328 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) 329 { 330 *nextTokPtr = ptr + MINBPC(enc); 331 return tok; 332 } 333 /* fall through */ 334 default: 335 *nextTokPtr = ptr; 336 return XML_TOK_INVALID; 337 } 338 } 339 return XML_TOK_PARTIAL; 340 } 341 342 343 static 344 int EXPATENTRY PREFIX(scanCdataSection) (const ENCODING * enc, const char *ptr, const char *end, 345 const char **nextTokPtr) 346 { 347 static const char CDATA_LSQB[] = 348 {ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, ASCII_LSQB}; 349 int i; 350 351 /* CDATA[ */ 352 if (end - ptr < 6 * MINBPC(enc)) 353 return XML_TOK_PARTIAL; 354 for (i = 0; i < 6; i++, ptr += MINBPC(enc)) 355 { 356 if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) 357 { 358 *nextTokPtr = ptr; 359 return XML_TOK_INVALID; 360 } 361 } 362 *nextTokPtr = ptr; 363 return XML_TOK_CDATA_SECT_OPEN; 364 } 365 366 static 367 int EXPATENTRY PREFIX(cdataSectionTok) (const ENCODING * enc, const char *ptr, const char *end, 368 const char **nextTokPtr) 369 { 325 return XML_TOK_PARTIAL; 326 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { 327 ptr -= MINBPC(enc); 328 break; 329 } 330 *nextTokPtr = ptr + MINBPC(enc); 331 return XML_TOK_CDATA_SECT_CLOSE; 332 case BT_CR: 333 ptr += MINBPC(enc); 370 334 if (ptr == end) 371 return XML_TOK_NONE; 372 if (MINBPC(enc) > 1) 373 { 374 size_t n = end - ptr; 375 376 if (n & (MINBPC(enc) - 1)) 377 { 378 n &= ~(MINBPC(enc) - 1); 379 if (n == 0) 380 return XML_TOK_PARTIAL; 381 end = ptr + n; 382 } 383 } 384 switch (BYTE_TYPE(enc, ptr)) 385 { 386 case BT_RSQB: 387 ptr += MINBPC(enc); 388 if (ptr == end) 389 return XML_TOK_PARTIAL; 390 if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 391 break; 392 ptr += MINBPC(enc); 393 if (ptr == end) 394 return XML_TOK_PARTIAL; 395 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) 396 { 397 ptr -= MINBPC(enc); 398 break; 399 } 400 *nextTokPtr = ptr + MINBPC(enc); 401 return XML_TOK_CDATA_SECT_CLOSE; 402 case BT_CR: 403 ptr += MINBPC(enc); 404 if (ptr == end) 405 return XML_TOK_PARTIAL; 406 if (BYTE_TYPE(enc, ptr) == BT_LF) 407 ptr += MINBPC(enc); 408 *nextTokPtr = ptr; 409 return XML_TOK_DATA_NEWLINE; 410 case BT_LF: 411 *nextTokPtr = ptr + MINBPC(enc); 412 return XML_TOK_DATA_NEWLINE; 413 INVALID_CASES(ptr, nextTokPtr) 414 default: 415 ptr += MINBPC(enc); 416 break; 417 } 418 while (ptr != end) 419 { 420 switch (BYTE_TYPE(enc, ptr)) 421 { 335 return XML_TOK_PARTIAL; 336 if (BYTE_TYPE(enc, ptr) == BT_LF) 337 ptr += MINBPC(enc); 338 *nextTokPtr = ptr; 339 return XML_TOK_DATA_NEWLINE; 340 case BT_LF: 341 *nextTokPtr = ptr + MINBPC(enc); 342 return XML_TOK_DATA_NEWLINE; 343 INVALID_CASES(ptr, nextTokPtr) 344 default: 345 ptr += MINBPC(enc); 346 break; 347 } 348 while (ptr != end) { 349 switch (BYTE_TYPE(enc, ptr)) { 422 350 #define LEAD_CASE(n) \ 423 351 case BT_LEAD ## n: \ … … 428 356 ptr += n; \ 429 357 break; 430 358 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 431 359 #undef LEAD_CASE 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 360 case BT_NONXML: 361 case BT_MALFORM: 362 case BT_TRAIL: 363 case BT_CR: 364 case BT_LF: 365 case BT_RSQB: 366 *nextTokPtr = ptr; 367 return XML_TOK_DATA_CHARS; 368 default: 369 ptr += MINBPC(enc); 370 break; 371 } 372 } 373 *nextTokPtr = ptr; 374 return XML_TOK_DATA_CHARS; 447 375 } 448 376 … … 450 378 451 379 static 452 int EXPATENTRY PREFIX(scanEndTag) (const ENCODING * enc, const char *ptr, const char *end, 453 const char **nextTokPtr) 454 { 380 int PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr, const char *end, 381 const char **nextTokPtr) 382 { 383 if (ptr == end) 384 return XML_TOK_PARTIAL; 385 switch (BYTE_TYPE(enc, ptr)) { 386 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 387 default: 388 *nextTokPtr = ptr; 389 return XML_TOK_INVALID; 390 } 391 while (ptr != end) { 392 switch (BYTE_TYPE(enc, ptr)) { 393 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 394 case BT_S: case BT_CR: case BT_LF: 395 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { 396 switch (BYTE_TYPE(enc, ptr)) { 397 case BT_S: case BT_CR: case BT_LF: 398 break; 399 case BT_GT: 400 *nextTokPtr = ptr + MINBPC(enc); 401 return XML_TOK_END_TAG; 402 default: 403 *nextTokPtr = ptr; 404 return XML_TOK_INVALID; 405 } 406 } 407 return XML_TOK_PARTIAL; 408 #ifdef XML_NS 409 case BT_COLON: 410 /* no need to check qname syntax here, since end-tag must match exactly */ 411 ptr += MINBPC(enc); 412 break; 413 #endif 414 case BT_GT: 415 *nextTokPtr = ptr + MINBPC(enc); 416 return XML_TOK_END_TAG; 417 default: 418 *nextTokPtr = ptr; 419 return XML_TOK_INVALID; 420 } 421 } 422 return XML_TOK_PARTIAL; 423 } 424 425 /* ptr points to character following "&#X" */ 426 427 static 428 int PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr, const char *end, 429 const char **nextTokPtr) 430 { 431 if (ptr != end) { 432 switch (BYTE_TYPE(enc, ptr)) { 433 case BT_DIGIT: 434 case BT_HEX: 435 break; 436 default: 437 *nextTokPtr = ptr; 438 return XML_TOK_INVALID; 439 } 440 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { 441 switch (BYTE_TYPE(enc, ptr)) { 442 case BT_DIGIT: 443 case BT_HEX: 444 break; 445 case BT_SEMI: 446 *nextTokPtr = ptr + MINBPC(enc); 447 return XML_TOK_CHAR_REF; 448 default: 449 *nextTokPtr = ptr; 450 return XML_TOK_INVALID; 451 } 452 } 453 } 454 return XML_TOK_PARTIAL; 455 } 456 457 /* ptr points to character following "&#" */ 458 459 static 460 int PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr, const char *end, 461 const char **nextTokPtr) 462 { 463 if (ptr != end) { 464 if (CHAR_MATCHES(enc, ptr, ASCII_x)) 465 return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); 466 switch (BYTE_TYPE(enc, ptr)) { 467 case BT_DIGIT: 468 break; 469 default: 470 *nextTokPtr = ptr; 471 return XML_TOK_INVALID; 472 } 473 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) { 474 switch (BYTE_TYPE(enc, ptr)) { 475 case BT_DIGIT: 476 break; 477 case BT_SEMI: 478 *nextTokPtr = ptr + MINBPC(enc); 479 return XML_TOK_CHAR_REF; 480 default: 481 *nextTokPtr = ptr; 482 return XML_TOK_INVALID; 483 } 484 } 485 } 486 return XML_TOK_PARTIAL; 487 } 488 489 /* ptr points to character following "&" */ 490 491 static 492 int PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end, 493 const char **nextTokPtr) 494 { 495 if (ptr == end) 496 return XML_TOK_PARTIAL; 497 switch (BYTE_TYPE(enc, ptr)) { 498 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 499 case BT_NUM: 500 return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); 501 default: 502 *nextTokPtr = ptr; 503 return XML_TOK_INVALID; 504 } 505 while (ptr != end) { 506 switch (BYTE_TYPE(enc, ptr)) { 507 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 508 case BT_SEMI: 509 *nextTokPtr = ptr + MINBPC(enc); 510 return XML_TOK_ENTITY_REF; 511 default: 512 *nextTokPtr = ptr; 513 return XML_TOK_INVALID; 514 } 515 } 516 return XML_TOK_PARTIAL; 517 } 518 519 /* ptr points to character following first character of attribute name */ 520 521 static 522 int PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end, 523 const char **nextTokPtr) 524 { 525 #ifdef XML_NS 526 int hadColon = 0; 527 #endif 528 while (ptr != end) { 529 switch (BYTE_TYPE(enc, ptr)) { 530 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 531 #ifdef XML_NS 532 case BT_COLON: 533 if (hadColon) { 534 *nextTokPtr = ptr; 535 return XML_TOK_INVALID; 536 } 537 hadColon = 1; 538 ptr += MINBPC(enc); 539 if (ptr == end) 540 return XML_TOK_PARTIAL; 541 switch (BYTE_TYPE(enc, ptr)) { 542 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 543 default: 544 *nextTokPtr = ptr; 545 return XML_TOK_INVALID; 546 } 547 break; 548 #endif 549 case BT_S: case BT_CR: case BT_LF: 550 for (;;) { 551 int t; 552 553 ptr += MINBPC(enc); 455 554 if (ptr == end) 456 return XML_TOK_PARTIAL; 457 switch (BYTE_TYPE(enc, ptr)) 458 { 459 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 460 default: 461 *nextTokPtr = ptr; 462 return XML_TOK_INVALID; 463 } 464 while (ptr != end) 465 { 466 switch (BYTE_TYPE(enc, ptr)) 467 { 468 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 469 case BT_S: 470 case BT_CR: 471 case BT_LF: 472 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) 473 { 474 switch (BYTE_TYPE(enc, ptr)) 475 { 476 case BT_S: 477 case BT_CR: 478 case BT_LF: 479 break; 480 case BT_GT: 481 *nextTokPtr = ptr + MINBPC(enc); 482 return XML_TOK_END_TAG; 483 default: 484 *nextTokPtr = ptr; 485 return XML_TOK_INVALID; 486 } 487 } 488 return XML_TOK_PARTIAL; 489 #ifdef XML_NS 490 case BT_COLON: 491 /* no need to check qname syntax here, since end-tag must match exactly */ 492 ptr += MINBPC(enc); 493 break; 494 #endif 495 case BT_GT: 496 *nextTokPtr = ptr + MINBPC(enc); 497 return XML_TOK_END_TAG; 498 default: 499 *nextTokPtr = ptr; 500 return XML_TOK_INVALID; 501 } 502 } 503 return XML_TOK_PARTIAL; 504 } 505 506 /* ptr points to character following "&#X" */ 507 508 static 509 int EXPATENTRY PREFIX(scanHexCharRef) (const ENCODING * enc, const char *ptr, const char *end, 510 const char **nextTokPtr) 511 { 512 if (ptr != end) 513 { 514 switch (BYTE_TYPE(enc, ptr)) 515 { 516 case BT_DIGIT: 517 case BT_HEX: 518 break; 519 default: 520 *nextTokPtr = ptr; 521 return XML_TOK_INVALID; 522 } 523 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) 524 { 525 switch (BYTE_TYPE(enc, ptr)) 526 { 527 case BT_DIGIT: 528 case BT_HEX: 529 break; 530 case BT_SEMI: 531 *nextTokPtr = ptr + MINBPC(enc); 532 return XML_TOK_CHAR_REF; 533 default: 534 *nextTokPtr = ptr; 535 return XML_TOK_INVALID; 536 } 537 } 538 } 539 return XML_TOK_PARTIAL; 540 } 541 542 /* ptr points to character following "&#" */ 543 544 static 545 int EXPATENTRY PREFIX(scanCharRef) (const ENCODING * enc, const char *ptr, const char *end, 546 const char **nextTokPtr) 547 { 548 if (ptr != end) 549 { 550 if (CHAR_MATCHES(enc, ptr, ASCII_x)) 551 return PREFIX(scanHexCharRef) (enc, ptr + MINBPC(enc), end, nextTokPtr); 552 switch (BYTE_TYPE(enc, ptr)) 553 { 554 case BT_DIGIT: 555 break; 556 default: 557 *nextTokPtr = ptr; 558 return XML_TOK_INVALID; 559 } 560 for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) 561 { 562 switch (BYTE_TYPE(enc, ptr)) 563 { 564 case BT_DIGIT: 565 break; 566 case BT_SEMI: 567 *nextTokPtr = ptr + MINBPC(enc); 568 return XML_TOK_CHAR_REF; 569 default: 570 *nextTokPtr = ptr; 571 return XML_TOK_INVALID; 572 } 573 } 574 } 575 return XML_TOK_PARTIAL; 576 } 577 578 /* ptr points to character following "&" */ 579 580 static 581 int EXPATENTRY PREFIX(scanRef) (const ENCODING * enc, const char *ptr, const char *end, 582 const char **nextTokPtr) 583 { 584 if (ptr == end) 585 return XML_TOK_PARTIAL; 586 switch (BYTE_TYPE(enc, ptr)) 587 { 588 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 589 case BT_NUM: 590 return PREFIX(scanCharRef) (enc, ptr + MINBPC(enc), end, nextTokPtr); 591 default: 592 *nextTokPtr = ptr; 593 return XML_TOK_INVALID; 594 } 595 while (ptr != end) 596 { 597 switch (BYTE_TYPE(enc, ptr)) 598 { 599 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 600 case BT_SEMI: 601 *nextTokPtr = ptr + MINBPC(enc); 602 return XML_TOK_ENTITY_REF; 603 default: 604 *nextTokPtr = ptr; 605 return XML_TOK_INVALID; 606 } 607 } 608 return XML_TOK_PARTIAL; 609 } 610 611 /* ptr points to character following first character of attribute name */ 612 613 static 614 int EXPATENTRY PREFIX(scanAtts) (const ENCODING * enc, const char *ptr, const char *end, 615 const char **nextTokPtr) 616 { 617 #ifdef XML_NS 618 int hadColon = 0; 619 620 #endif 621 while (ptr != end) 622 { 623 switch (BYTE_TYPE(enc, ptr)) 624 { 625 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 626 #ifdef XML_NS 627 case BT_COLON: 628 if (hadColon) 629 { 630 *nextTokPtr = ptr; 631 return XML_TOK_INVALID; 632 } 633 hadColon = 1; 634 ptr += MINBPC(enc); 635 if (ptr == end) 636 return XML_TOK_PARTIAL; 637 switch (BYTE_TYPE(enc, ptr)) 638 { 639 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 640 default: 641 *nextTokPtr = ptr; 642 return XML_TOK_INVALID; 643 } 644 break; 645 #endif 646 case BT_S: 647 case BT_CR: 648 case BT_LF: 649 for (;;) 650 { 651 int t; 652 653 ptr += MINBPC(enc); 654 if (ptr == end) 655 return XML_TOK_PARTIAL; 656 t = BYTE_TYPE(enc, ptr); 657 if (t == BT_EQUALS) 658 break; 659 switch (t) 660 { 661 case BT_S: 662 case BT_LF: 663 case BT_CR: 664 break; 665 default: 666 *nextTokPtr = ptr; 667 return XML_TOK_INVALID; 668 } 669 } 670 /* fall through */ 671 case BT_EQUALS: 672 { 673 int open; 674 675 #ifdef XML_NS 676 hadColon = 0; 677 #endif 678 for (;;) 679 { 680 681 ptr += MINBPC(enc); 682 if (ptr == end) 683 return XML_TOK_PARTIAL; 684 open = BYTE_TYPE(enc, ptr); 685 if (open == BT_QUOT || open == BT_APOS) 686 break; 687 switch (open) 688 { 689 case BT_S: 690 case BT_LF: 691 case BT_CR: 692 break; 693 default: 694 *nextTokPtr = ptr; 695 return XML_TOK_INVALID; 696 } 697 } 698 ptr += MINBPC(enc); 699 /* in attribute value */ 700 for (;;) 701 { 702 int t; 703 704 if (ptr == end) 705 return XML_TOK_PARTIAL; 706 t = BYTE_TYPE(enc, ptr); 707 if (t == open) 708 break; 709 switch (t) 710 { 711 INVALID_CASES(ptr, nextTokPtr) 712 case BT_AMP: 713 { 714 int tok = PREFIX(scanRef) (enc, ptr + MINBPC(enc), end, &ptr); 715 716 if (tok <= 0) 717 { 718 if (tok == XML_TOK_INVALID) 719 *nextTokPtr = ptr; 720 return tok; 721 } 722 break; 723 } 724 case BT_LT: 725 *nextTokPtr = ptr; 726 return XML_TOK_INVALID; 727 default: 728 ptr += MINBPC(enc); 729 break; 730 } 731 } 732 ptr += MINBPC(enc); 733 if (ptr == end) 734 return XML_TOK_PARTIAL; 735 switch (BYTE_TYPE(enc, ptr)) 736 { 737 case BT_S: 738 case BT_CR: 739 case BT_LF: 740 break; 741 case BT_SOL: 742 goto sol; 743 case BT_GT: 744 goto gt; 745 default: 746 *nextTokPtr = ptr; 747 return XML_TOK_INVALID; 748 } 749 /* ptr points to closing quote */ 750 for (;;) 751 { 752 ptr += MINBPC(enc); 753 if (ptr == end) 754 return XML_TOK_PARTIAL; 755 switch (BYTE_TYPE(enc, ptr)) 756 { 757 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 758 case BT_S: 759 case BT_CR: 760 case BT_LF: 761 continue; 762 case BT_GT: 763 gt: 764 *nextTokPtr = ptr + MINBPC(enc); 765 return XML_TOK_START_TAG_WITH_ATTS; 766 case BT_SOL: 767 sol: 768 ptr += MINBPC(enc); 769 if (ptr == end) 770 return XML_TOK_PARTIAL; 771 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) 772 { 773 *nextTokPtr = ptr; 774 return XML_TOK_INVALID; 775 } 776 *nextTokPtr = ptr + MINBPC(enc); 777 return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; 778 default: 779 *nextTokPtr = ptr; 780 return XML_TOK_INVALID; 781 } 782 break; 783 } 784 break; 785 } 786 default: 787 *nextTokPtr = ptr; 788 return XML_TOK_INVALID; 789 } 790 } 791 return XML_TOK_PARTIAL; 792 } 793 794 /* ptr points to character following "<" */ 795 796 static 797 int EXPATENTRY PREFIX(scanLt) (const ENCODING * enc, const char *ptr, const char *end, 798 const char **nextTokPtr) 799 { 800 #ifdef XML_NS 801 int hadColon; 802 803 #endif 804 if (ptr == end) 805 return XML_TOK_PARTIAL; 806 switch (BYTE_TYPE(enc, ptr)) 807 { 808 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 809 case BT_EXCL: 810 if ((ptr += MINBPC(enc)) == end) 811 return XML_TOK_PARTIAL; 812 switch (BYTE_TYPE(enc, ptr)) 813 { 814 case BT_MINUS: 815 return PREFIX(scanComment) (enc, ptr + MINBPC(enc), end, nextTokPtr); 816 case BT_LSQB: 817 return PREFIX(scanCdataSection) (enc, ptr + MINBPC(enc), end, nextTokPtr); 818 } 819 *nextTokPtr = ptr; 820 return XML_TOK_INVALID; 821 case BT_QUEST: 822 return PREFIX(scanPi) (enc, ptr + MINBPC(enc), end, nextTokPtr); 823 case BT_SOL: 824 return PREFIX(scanEndTag) (enc, ptr + MINBPC(enc), end, nextTokPtr); 825 default: 826 *nextTokPtr = ptr; 827 return XML_TOK_INVALID; 828 } 555 return XML_TOK_PARTIAL; 556 t = BYTE_TYPE(enc, ptr); 557 if (t == BT_EQUALS) 558 break; 559 switch (t) { 560 case BT_S: 561 case BT_LF: 562 case BT_CR: 563 break; 564 default: 565 *nextTokPtr = ptr; 566 return XML_TOK_INVALID; 567 } 568 } 569 /* fall through */ 570 case BT_EQUALS: 571 { 572 int open; 829 573 #ifdef XML_NS 830 574 hadColon = 0; 831 575 #endif 832 /* we have a start-tag */ 833 while (ptr != end) 834 { 835 switch (BYTE_TYPE(enc, ptr)) 576 for (;;) { 577 578 ptr += MINBPC(enc); 579 if (ptr == end) 580 return XML_TOK_PARTIAL; 581 open = BYTE_TYPE(enc, ptr); 582 if (open == BT_QUOT || open == BT_APOS) 583 break; 584 switch (open) { 585 case BT_S: 586 case BT_LF: 587 case BT_CR: 588 break; 589 default: 590 *nextTokPtr = ptr; 591 return XML_TOK_INVALID; 592 } 593 } 594 ptr += MINBPC(enc); 595 /* in attribute value */ 596 for (;;) { 597 int t; 598 if (ptr == end) 599 return XML_TOK_PARTIAL; 600 t = BYTE_TYPE(enc, ptr); 601 if (t == open) 602 break; 603 switch (t) { 604 INVALID_CASES(ptr, nextTokPtr) 605 case BT_AMP: 836 606 { 837 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 607 int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr); 608 if (tok <= 0) { 609 if (tok == XML_TOK_INVALID) 610 *nextTokPtr = ptr; 611 return tok; 612 } 613 break; 614 } 615 case BT_LT: 616 *nextTokPtr = ptr; 617 return XML_TOK_INVALID; 618 default: 619 ptr += MINBPC(enc); 620 break; 621 } 622 } 623 ptr += MINBPC(enc); 624 if (ptr == end) 625 return XML_TOK_PARTIAL; 626 switch (BYTE_TYPE(enc, ptr)) { 627 case BT_S: 628 case BT_CR: 629 case BT_LF: 630 break; 631 case BT_SOL: 632 goto sol; 633 case BT_GT: 634 goto gt; 635 default: 636 *nextTokPtr = ptr; 637 return XML_TOK_INVALID; 638 } 639 /* ptr points to closing quote */ 640 for (;;) { 641 ptr += MINBPC(enc); 642 if (ptr == end) 643 return XML_TOK_PARTIAL; 644 switch (BYTE_TYPE(enc, ptr)) { 645 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 646 case BT_S: case BT_CR: case BT_LF: 647 continue; 648 case BT_GT: 649 gt: 650 *nextTokPtr = ptr + MINBPC(enc); 651 return XML_TOK_START_TAG_WITH_ATTS; 652 case BT_SOL: 653 sol: 654 ptr += MINBPC(enc); 655 if (ptr == end) 656 return XML_TOK_PARTIAL; 657 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { 658 *nextTokPtr = ptr; 659 return XML_TOK_INVALID; 660 } 661 *nextTokPtr = ptr + MINBPC(enc); 662 return XML_TOK_EMPTY_ELEMENT_WITH_ATTS; 663 default: 664 *nextTokPtr = ptr; 665 return XML_TOK_INVALID; 666 } 667 break; 668 } 669 break; 670 } 671 default: 672 *nextTokPtr = ptr; 673 return XML_TOK_INVALID; 674 } 675 } 676 return XML_TOK_PARTIAL; 677 } 678 679 /* ptr points to character following "<" */ 680 681 static 682 int PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end, 683 const char **nextTokPtr) 684 { 838 685 #ifdef XML_NS 839 case BT_COLON: 840 if (hadColon) 841 { 842 *nextTokPtr = ptr; 843 return XML_TOK_INVALID; 844 } 845 hadColon = 1; 846 ptr += MINBPC(enc); 847 if (ptr == end) 848 return XML_TOK_PARTIAL; 849 switch (BYTE_TYPE(enc, ptr)) 850 { 851 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 852 default: 853 *nextTokPtr = ptr; 854 return XML_TOK_INVALID; 855 } 856 break; 686 int hadColon; 857 687 #endif 858 case BT_S: 859 case BT_CR: 860 case BT_LF: 861 { 862 ptr += MINBPC(enc); 863 while (ptr != end) 864 { 865 switch (BYTE_TYPE(enc, ptr)) 866 { 867 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 868 case BT_GT: 869 goto gt; 870 case BT_SOL: 871 goto sol; 872 case BT_S: 873 case BT_CR: 874 case BT_LF: 875 ptr += MINBPC(enc); 876 continue; 877 default: 878 *nextTokPtr = ptr; 879 return XML_TOK_INVALID; 880 } 881 return PREFIX(scanAtts) (enc, ptr, end, nextTokPtr); 882 } 883 return XML_TOK_PARTIAL; 884 } 885 case BT_GT: 886 gt: 887 *nextTokPtr = ptr + MINBPC(enc); 888 return XML_TOK_START_TAG_NO_ATTS; 889 case BT_SOL: 890 sol: 891 ptr += MINBPC(enc); 892 if (ptr == end) 893 return XML_TOK_PARTIAL; 894 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) 895 { 896 *nextTokPtr = ptr; 897 return XML_TOK_INVALID; 898 } 899 *nextTokPtr = ptr + MINBPC(enc); 900 return XML_TOK_EMPTY_ELEMENT_NO_ATTS; 901 default: 902 *nextTokPtr = ptr; 903 return XML_TOK_INVALID; 904 } 905 } 906 return XML_TOK_PARTIAL; 907 } 908 909 static 910 int EXPATENTRY PREFIX(contentTok) (const ENCODING * enc, const char *ptr, const char *end, 911 const char **nextTokPtr) 912 { 688 if (ptr == end) 689 return XML_TOK_PARTIAL; 690 switch (BYTE_TYPE(enc, ptr)) { 691 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 692 case BT_EXCL: 693 if ((ptr += MINBPC(enc)) == end) 694 return XML_TOK_PARTIAL; 695 switch (BYTE_TYPE(enc, ptr)) { 696 case BT_MINUS: 697 return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr); 698 case BT_LSQB: 699 return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc), end, nextTokPtr); 700 } 701 *nextTokPtr = ptr; 702 return XML_TOK_INVALID; 703 case BT_QUEST: 704 return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); 705 case BT_SOL: 706 return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr); 707 default: 708 *nextTokPtr = ptr; 709 return XML_TOK_INVALID; 710 } 711 #ifdef XML_NS 712 hadColon = 0; 713 #endif 714 /* we have a start-tag */ 715 while (ptr != end) { 716 switch (BYTE_TYPE(enc, ptr)) { 717 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 718 #ifdef XML_NS 719 case BT_COLON: 720 if (hadColon) { 721 *nextTokPtr = ptr; 722 return XML_TOK_INVALID; 723 } 724 hadColon = 1; 725 ptr += MINBPC(enc); 726 if (ptr == end) 727 return XML_TOK_PARTIAL; 728 switch (BYTE_TYPE(enc, ptr)) { 729 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 730 default: 731 *nextTokPtr = ptr; 732 return XML_TOK_INVALID; 733 } 734 break; 735 #endif 736 case BT_S: case BT_CR: case BT_LF: 737 { 738 ptr += MINBPC(enc); 739 while (ptr != end) { 740 switch (BYTE_TYPE(enc, ptr)) { 741 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 742 case BT_GT: 743 goto gt; 744 case BT_SOL: 745 goto sol; 746 case BT_S: case BT_CR: case BT_LF: 747 ptr += MINBPC(enc); 748 continue; 749 default: 750 *nextTokPtr = ptr; 751 return XML_TOK_INVALID; 752 } 753 return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr); 754 } 755 return XML_TOK_PARTIAL; 756 } 757 case BT_GT: 758 gt: 759 *nextTokPtr = ptr + MINBPC(enc); 760 return XML_TOK_START_TAG_NO_ATTS; 761 case BT_SOL: 762 sol: 763 ptr += MINBPC(enc); 764 if (ptr == end) 765 return XML_TOK_PARTIAL; 766 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { 767 *nextTokPtr = ptr; 768 return XML_TOK_INVALID; 769 } 770 *nextTokPtr = ptr + MINBPC(enc); 771 return XML_TOK_EMPTY_ELEMENT_NO_ATTS; 772 default: 773 *nextTokPtr = ptr; 774 return XML_TOK_INVALID; 775 } 776 } 777 return XML_TOK_PARTIAL; 778 } 779 780 static 781 int PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end, 782 const char **nextTokPtr) 783 { 784 if (ptr == end) 785 return XML_TOK_NONE; 786 if (MINBPC(enc) > 1) { 787 size_t n = end - ptr; 788 if (n & (MINBPC(enc) - 1)) { 789 n &= ~(MINBPC(enc) - 1); 790 if (n == 0) 791 return XML_TOK_PARTIAL; 792 end = ptr + n; 793 } 794 } 795 switch (BYTE_TYPE(enc, ptr)) { 796 case BT_LT: 797 return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); 798 case BT_AMP: 799 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); 800 case BT_CR: 801 ptr += MINBPC(enc); 913 802 if (ptr == end) 914 return XML_TOK_NONE; 915 if (MINBPC(enc) > 1) 916 { 917 size_t n = end - ptr; 918 919 if (n & (MINBPC(enc) - 1)) 920 { 921 n &= ~(MINBPC(enc) - 1); 922 if (n == 0) 923 return XML_TOK_PARTIAL; 924 end = ptr + n; 925 } 926 } 927 switch (BYTE_TYPE(enc, ptr)) 928 { 929 case BT_LT: 930 return PREFIX(scanLt) (enc, ptr + MINBPC(enc), end, nextTokPtr); 931 case BT_AMP: 932 return PREFIX(scanRef) (enc, ptr + MINBPC(enc), end, nextTokPtr); 933 case BT_CR: 934 ptr += MINBPC(enc); 935 if (ptr == end) 936 return XML_TOK_TRAILING_CR; 937 if (BYTE_TYPE(enc, ptr) == BT_LF) 938 ptr += MINBPC(enc); 939 *nextTokPtr = ptr; 940 return XML_TOK_DATA_NEWLINE; 941 case BT_LF: 942 *nextTokPtr = ptr + MINBPC(enc); 943 return XML_TOK_DATA_NEWLINE; 944 case BT_RSQB: 945 ptr += MINBPC(enc); 946 if (ptr == end) 947 return XML_TOK_TRAILING_RSQB; 948 if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 949 break; 950 ptr += MINBPC(enc); 951 if (ptr == end) 952 return XML_TOK_TRAILING_RSQB; 953 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) 954 { 955 ptr -= MINBPC(enc); 956 break; 957 } 958 *nextTokPtr = ptr; 959 return XML_TOK_INVALID; 960 INVALID_CASES(ptr, nextTokPtr) 961 default: 962 ptr += MINBPC(enc); 963 break; 964 } 965 while (ptr != end) 966 { 967 switch (BYTE_TYPE(enc, ptr)) 968 { 803 return XML_TOK_TRAILING_CR; 804 if (BYTE_TYPE(enc, ptr) == BT_LF) 805 ptr += MINBPC(enc); 806 *nextTokPtr = ptr; 807 return XML_TOK_DATA_NEWLINE; 808 case BT_LF: 809 *nextTokPtr = ptr + MINBPC(enc); 810 return XML_TOK_DATA_NEWLINE; 811 case BT_RSQB: 812 ptr += MINBPC(enc); 813 if (ptr == end) 814 return XML_TOK_TRAILING_RSQB; 815 if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 816 break; 817 ptr += MINBPC(enc); 818 if (ptr == end) 819 return XML_TOK_TRAILING_RSQB; 820 if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { 821 ptr -= MINBPC(enc); 822 break; 823 } 824 *nextTokPtr = ptr; 825 return XML_TOK_INVALID; 826 INVALID_CASES(ptr, nextTokPtr) 827 default: 828 ptr += MINBPC(enc); 829 break; 830 } 831 while (ptr != end) { 832 switch (BYTE_TYPE(enc, ptr)) { 969 833 #define LEAD_CASE(n) \ 970 834 case BT_LEAD ## n: \ … … 975 839 ptr += n; \ 976 840 break; 977 841 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 978 842 #undef LEAD_CASE 979 case BT_RSQB: 980 if (ptr + MINBPC(enc) != end) 981 { 982 if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) 983 { 984 ptr += MINBPC(enc); 985 break; 986 } 987 if (ptr + 2 * MINBPC(enc) != end) 988 { 989 if (!CHAR_MATCHES(enc, ptr + 2 * MINBPC(enc), ASCII_GT)) 990 { 991 ptr += MINBPC(enc); 992 break; 993 } 994 *nextTokPtr = ptr + 2 * MINBPC(enc); 995 return XML_TOK_INVALID; 996 } 997 } 998 /* fall through */ 999 case BT_AMP: 1000 case BT_LT: 1001 case BT_NONXML: 1002 case BT_MALFORM: 1003 case BT_TRAIL: 1004 case BT_CR: 1005 case BT_LF: 1006 *nextTokPtr = ptr; 1007 return XML_TOK_DATA_CHARS; 1008 default: 1009 ptr += MINBPC(enc); 1010 break; 1011 } 1012 } 1013 *nextTokPtr = ptr; 1014 return XML_TOK_DATA_CHARS; 843 case BT_RSQB: 844 if (ptr + MINBPC(enc) != end) { 845 if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { 846 ptr += MINBPC(enc); 847 break; 848 } 849 if (ptr + 2*MINBPC(enc) != end) { 850 if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { 851 ptr += MINBPC(enc); 852 break; 853 } 854 *nextTokPtr = ptr + 2*MINBPC(enc); 855 return XML_TOK_INVALID; 856 } 857 } 858 /* fall through */ 859 case BT_AMP: 860 case BT_LT: 861 case BT_NONXML: 862 case BT_MALFORM: 863 case BT_TRAIL: 864 case BT_CR: 865 case BT_LF: 866 *nextTokPtr = ptr; 867 return XML_TOK_DATA_CHARS; 868 default: 869 ptr += MINBPC(enc); 870 break; 871 } 872 } 873 *nextTokPtr = ptr; 874 return XML_TOK_DATA_CHARS; 1015 875 } 1016 876 … … 1018 878 1019 879 static 1020 int EXPATENTRY PREFIX(scanPercent) (const ENCODING * enc, const char *ptr, const char *end, 1021 const char **nextTokPtr) 1022 { 880 int PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, 881 const char **nextTokPtr) 882 { 883 if (ptr == end) 884 return XML_TOK_PARTIAL; 885 switch (BYTE_TYPE(enc, ptr)) { 886 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 887 case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: 888 *nextTokPtr = ptr; 889 return XML_TOK_PERCENT; 890 default: 891 *nextTokPtr = ptr; 892 return XML_TOK_INVALID; 893 } 894 while (ptr != end) { 895 switch (BYTE_TYPE(enc, ptr)) { 896 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 897 case BT_SEMI: 898 *nextTokPtr = ptr + MINBPC(enc); 899 return XML_TOK_PARAM_ENTITY_REF; 900 default: 901 *nextTokPtr = ptr; 902 return XML_TOK_INVALID; 903 } 904 } 905 return XML_TOK_PARTIAL; 906 } 907 908 static 909 int PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, 910 const char **nextTokPtr) 911 { 912 if (ptr == end) 913 return XML_TOK_PARTIAL; 914 switch (BYTE_TYPE(enc, ptr)) { 915 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 916 default: 917 *nextTokPtr = ptr; 918 return XML_TOK_INVALID; 919 } 920 while (ptr != end) { 921 switch (BYTE_TYPE(enc, ptr)) { 922 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 923 case BT_CR: case BT_LF: case BT_S: 924 case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: 925 *nextTokPtr = ptr; 926 return XML_TOK_POUND_NAME; 927 default: 928 *nextTokPtr = ptr; 929 return XML_TOK_INVALID; 930 } 931 } 932 return -XML_TOK_POUND_NAME; 933 } 934 935 static 936 int PREFIX(scanLit)(int open, const ENCODING *enc, 937 const char *ptr, const char *end, 938 const char **nextTokPtr) 939 { 940 while (ptr != end) { 941 int t = BYTE_TYPE(enc, ptr); 942 switch (t) { 943 INVALID_CASES(ptr, nextTokPtr) 944 case BT_QUOT: 945 case BT_APOS: 946 ptr += MINBPC(enc); 947 if (t != open) 948 break; 949 if (ptr == end) 950 return -XML_TOK_LITERAL; 951 *nextTokPtr = ptr; 952 switch (BYTE_TYPE(enc, ptr)) { 953 case BT_S: case BT_CR: case BT_LF: 954 case BT_GT: case BT_PERCNT: case BT_LSQB: 955 return XML_TOK_LITERAL; 956 default: 957 return XML_TOK_INVALID; 958 } 959 default: 960 ptr += MINBPC(enc); 961 break; 962 } 963 } 964 return XML_TOK_PARTIAL; 965 } 966 967 static 968 int PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, 969 const char **nextTokPtr) 970 { 971 int tok; 972 if (ptr == end) 973 return XML_TOK_NONE; 974 if (MINBPC(enc) > 1) { 975 size_t n = end - ptr; 976 if (n & (MINBPC(enc) - 1)) { 977 n &= ~(MINBPC(enc) - 1); 978 if (n == 0) 979 return XML_TOK_PARTIAL; 980 end = ptr + n; 981 } 982 } 983 switch (BYTE_TYPE(enc, ptr)) { 984 case BT_QUOT: 985 return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); 986 case BT_APOS: 987 return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); 988 case BT_LT: 989 { 990 ptr += MINBPC(enc); 991 if (ptr == end) 992 return XML_TOK_PARTIAL; 993 switch (BYTE_TYPE(enc, ptr)) { 994 case BT_EXCL: 995 return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); 996 case BT_QUEST: 997 return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); 998 case BT_NMSTRT: 999 case BT_HEX: 1000 case BT_NONASCII: 1001 case BT_LEAD2: 1002 case BT_LEAD3: 1003 case BT_LEAD4: 1004 *nextTokPtr = ptr - MINBPC(enc); 1005 return XML_TOK_INSTANCE_START; 1006 } 1007 *nextTokPtr = ptr; 1008 return XML_TOK_INVALID; 1009 } 1010 case BT_CR: 1011 if (ptr + MINBPC(enc) == end) 1012 return -XML_TOK_PROLOG_S; 1013 /* fall through */ 1014 case BT_S: case BT_LF: 1015 for (;;) { 1016 ptr += MINBPC(enc); 1017 if (ptr == end) 1018 break; 1019 switch (BYTE_TYPE(enc, ptr)) { 1020 case BT_S: case BT_LF: 1021 break; 1022 case BT_CR: 1023 /* don't split CR/LF pair */ 1024 if (ptr + MINBPC(enc) != end) 1025 break; 1026 /* fall through */ 1027 default: 1028 *nextTokPtr = ptr; 1029 return XML_TOK_PROLOG_S; 1030 } 1031 } 1032 *nextTokPtr = ptr; 1033 return XML_TOK_PROLOG_S; 1034 case BT_PERCNT: 1035 return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); 1036 case BT_COMMA: 1037 *nextTokPtr = ptr + MINBPC(enc); 1038 return XML_TOK_COMMA; 1039 case BT_LSQB: 1040 *nextTokPtr = ptr + MINBPC(enc); 1041 return XML_TOK_OPEN_BRACKET; 1042 case BT_RSQB: 1043 ptr += MINBPC(enc); 1023 1044 if (ptr == end) 1024 return XML_TOK_PARTIAL; 1025 switch (BYTE_TYPE(enc, ptr)) 1026 { 1027 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 1028 case BT_S: 1029 case BT_LF: 1030 case BT_CR: 1031 case BT_PERCNT: 1032 *nextTokPtr = ptr; 1033 return XML_TOK_PERCENT; 1034 default: 1035 *nextTokPtr = ptr; 1036 return XML_TOK_INVALID; 1037 } 1038 while (ptr != end) 1039 { 1040 switch (BYTE_TYPE(enc, ptr)) 1041 { 1042 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1043 case BT_SEMI: 1044 *nextTokPtr = ptr + MINBPC(enc); 1045 return XML_TOK_PARAM_ENTITY_REF; 1046 default: 1047 *nextTokPtr = ptr; 1048 return XML_TOK_INVALID; 1049 } 1050 } 1051 return XML_TOK_PARTIAL; 1052 } 1053 1054 static 1055 int EXPATENTRY PREFIX(scanPoundName) (const ENCODING * enc, const char *ptr, const char *end, 1056 const char **nextTokPtr) 1057 { 1045 return -XML_TOK_CLOSE_BRACKET; 1046 if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { 1047 if (ptr + MINBPC(enc) == end) 1048 return XML_TOK_PARTIAL; 1049 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { 1050 *nextTokPtr = ptr + 2*MINBPC(enc); 1051 return XML_TOK_COND_SECT_CLOSE; 1052 } 1053 } 1054 *nextTokPtr = ptr; 1055 return XML_TOK_CLOSE_BRACKET; 1056 case BT_LPAR: 1057 *nextTokPtr = ptr + MINBPC(enc); 1058 return XML_TOK_OPEN_PAREN; 1059 case BT_RPAR: 1060 ptr += MINBPC(enc); 1058 1061 if (ptr == end) 1059 return XML_TOK_PARTIAL; 1060 switch (BYTE_TYPE(enc, ptr)) 1061 { 1062 CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) 1063 default: 1064 *nextTokPtr = ptr; 1065 return XML_TOK_INVALID; 1066 } 1067 while (ptr != end) 1068 { 1069 switch (BYTE_TYPE(enc, ptr)) 1070 { 1071 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1072 case BT_CR: 1073 case BT_LF: 1074 case BT_S: 1075 case BT_RPAR: 1076 case BT_GT: 1077 case BT_PERCNT: 1078 case BT_VERBAR: 1079 *nextTokPtr = ptr; 1080 return XML_TOK_POUND_NAME; 1081 default: 1082 *nextTokPtr = ptr; 1083 return XML_TOK_INVALID; 1084 } 1085 } 1086 return -XML_TOK_POUND_NAME; 1087 } 1088 1089 static 1090 int EXPATENTRY PREFIX(scanLit) (int open, const ENCODING * enc, 1091 const char *ptr, const char *end, 1092 const char **nextTokPtr) 1093 { 1094 while (ptr != end) 1095 { 1096 int t = BYTE_TYPE(enc, ptr); 1097 1098 switch (t) 1099 { 1100 INVALID_CASES(ptr, nextTokPtr) 1101 case BT_QUOT: 1102 case BT_APOS: 1103 ptr += MINBPC(enc); 1104 if (t != open) 1105 break; 1106 if (ptr == end) 1107 return -XML_TOK_LITERAL; 1108 *nextTokPtr = ptr; 1109 switch (BYTE_TYPE(enc, ptr)) 1110 { 1111 case BT_S: 1112 case BT_CR: 1113 case BT_LF: 1114 case BT_GT: 1115 case BT_PERCNT: 1116 case BT_LSQB: 1117 return XML_TOK_LITERAL; 1118 default: 1119 return XML_TOK_INVALID; 1120 } 1121 default: 1122 ptr += MINBPC(enc); 1123 break; 1124 } 1125 } 1126 return XML_TOK_PARTIAL; 1127 } 1128 1129 static 1130 int EXPATENTRY PREFIX(prologTok) (const ENCODING * enc, const char *ptr, const char *end, 1131 const char **nextTokPtr) 1132 { 1133 int tok; 1134 1135 if (ptr == end) 1136 return XML_TOK_NONE; 1137 if (MINBPC(enc) > 1) 1138 { 1139 size_t n = end - ptr; 1140 1141 if (n & (MINBPC(enc) - 1)) 1142 { 1143 n &= ~(MINBPC(enc) - 1); 1144 if (n == 0) 1145 return XML_TOK_PARTIAL; 1146 end = ptr + n; 1147 } 1148 } 1149 switch (BYTE_TYPE(enc, ptr)) 1150 { 1151 case BT_QUOT: 1152 return PREFIX(scanLit) (BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); 1153 case BT_APOS: 1154 return PREFIX(scanLit) (BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); 1155 case BT_LT: 1156 { 1157 ptr += MINBPC(enc); 1158 if (ptr == end) 1159 return XML_TOK_PARTIAL; 1160 switch (BYTE_TYPE(enc, ptr)) 1161 { 1162 case BT_EXCL: 1163 return PREFIX(scanDecl) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1164 case BT_QUEST: 1165 return PREFIX(scanPi) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1166 case BT_NMSTRT: 1167 case BT_HEX: 1168 case BT_NONASCII: 1169 case BT_LEAD2: 1170 case BT_LEAD3: 1171 case BT_LEAD4: 1172 *nextTokPtr = ptr - MINBPC(enc); 1173 return XML_TOK_INSTANCE_START; 1174 } 1175 *nextTokPtr = ptr; 1176 return XML_TOK_INVALID; 1177 } 1178 case BT_CR: 1179 if (ptr + MINBPC(enc) == end) 1180 return -XML_TOK_PROLOG_S; 1181 /* fall through */ 1182 case BT_S: 1183 case BT_LF: 1184 for (;;) 1185 { 1186 ptr += MINBPC(enc); 1187 if (ptr == end) 1188 break; 1189 switch (BYTE_TYPE(enc, ptr)) 1190 { 1191 case BT_S: 1192 case BT_LF: 1193 break; 1194 case BT_CR: 1195 /* don't split CR/LF pair */ 1196 if (ptr + MINBPC(enc) != end) 1197 break; 1198 /* fall through */ 1199 default: 1200 *nextTokPtr = ptr; 1201 return XML_TOK_PROLOG_S; 1202 } 1203 } 1204 *nextTokPtr = ptr; 1205 return XML_TOK_PROLOG_S; 1206 case BT_PERCNT: 1207 return PREFIX(scanPercent) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1208 case BT_COMMA: 1209 *nextTokPtr = ptr + MINBPC(enc); 1210 return XML_TOK_COMMA; 1211 case BT_LSQB: 1212 *nextTokPtr = ptr + MINBPC(enc); 1213 return XML_TOK_OPEN_BRACKET; 1214 case BT_RSQB: 1215 ptr += MINBPC(enc); 1216 if (ptr == end) 1217 return -XML_TOK_CLOSE_BRACKET; 1218 if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 1219 { 1220 if (ptr + MINBPC(enc) == end) 1221 return XML_TOK_PARTIAL; 1222 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) 1223 { 1224 *nextTokPtr = ptr + 2 * MINBPC(enc); 1225 return XML_TOK_COND_SECT_CLOSE; 1226 } 1227 } 1228 *nextTokPtr = ptr; 1229 return XML_TOK_CLOSE_BRACKET; 1230 case BT_LPAR: 1231 *nextTokPtr = ptr + MINBPC(enc); 1232 return XML_TOK_OPEN_PAREN; 1233 case BT_RPAR: 1234 ptr += MINBPC(enc); 1235 if (ptr == end) 1236 return -XML_TOK_CLOSE_PAREN; 1237 switch (BYTE_TYPE(enc, ptr)) 1238 { 1239 case BT_AST: 1240 *nextTokPtr = ptr + MINBPC(enc); 1241 return XML_TOK_CLOSE_PAREN_ASTERISK; 1242 case BT_QUEST: 1243 *nextTokPtr = ptr + MINBPC(enc); 1244 return XML_TOK_CLOSE_PAREN_QUESTION; 1245 case BT_PLUS: 1246 *nextTokPtr = ptr + MINBPC(enc); 1247 return XML_TOK_CLOSE_PAREN_PLUS; 1248 case BT_CR: 1249 case BT_LF: 1250 case BT_S: 1251 case BT_GT: 1252 case BT_COMMA: 1253 case BT_VERBAR: 1254 case BT_RPAR: 1255 *nextTokPtr = ptr; 1256 return XML_TOK_CLOSE_PAREN; 1257 } 1258 *nextTokPtr = ptr; 1259 return XML_TOK_INVALID; 1260 case BT_VERBAR: 1261 *nextTokPtr = ptr + MINBPC(enc); 1262 return XML_TOK_OR; 1263 case BT_GT: 1264 *nextTokPtr = ptr + MINBPC(enc); 1265 return XML_TOK_DECL_CLOSE; 1266 case BT_NUM: 1267 return PREFIX(scanPoundName) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1062 return -XML_TOK_CLOSE_PAREN; 1063 switch (BYTE_TYPE(enc, ptr)) { 1064 case BT_AST: 1065 *nextTokPtr = ptr + MINBPC(enc); 1066 return XML_TOK_CLOSE_PAREN_ASTERISK; 1067 case BT_QUEST: 1068 *nextTokPtr = ptr + MINBPC(enc); 1069 return XML_TOK_CLOSE_PAREN_QUESTION; 1070 case BT_PLUS: 1071 *nextTokPtr = ptr + MINBPC(enc); 1072 return XML_TOK_CLOSE_PAREN_PLUS; 1073 case BT_CR: case BT_LF: case BT_S: 1074 case BT_GT: case BT_COMMA: case BT_VERBAR: 1075 case BT_RPAR: 1076 *nextTokPtr = ptr; 1077 return XML_TOK_CLOSE_PAREN; 1078 } 1079 *nextTokPtr = ptr; 1080 return XML_TOK_INVALID; 1081 case BT_VERBAR: 1082 *nextTokPtr = ptr + MINBPC(enc); 1083 return XML_TOK_OR; 1084 case BT_GT: 1085 *nextTokPtr = ptr + MINBPC(enc); 1086 return XML_TOK_DECL_CLOSE; 1087 case BT_NUM: 1088 return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); 1268 1089 #define LEAD_CASE(n) \ 1269 1090 case BT_LEAD ## n: \ … … 1282 1103 *nextTokPtr = ptr; \ 1283 1104 return XML_TOK_INVALID; 1284 1105 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 1285 1106 #undef LEAD_CASE 1286 1287 1288 1289 1290 1291 1292 1293 1107 case BT_NMSTRT: 1108 case BT_HEX: 1109 tok = XML_TOK_NAME; 1110 ptr += MINBPC(enc); 1111 break; 1112 case BT_DIGIT: 1113 case BT_NAME: 1114 case BT_MINUS: 1294 1115 #ifdef XML_NS 1295 1116 case BT_COLON: 1296 1117 #endif 1297 tok = XML_TOK_NMTOKEN; 1298 ptr += MINBPC(enc); 1299 break; 1300 case BT_NONASCII: 1301 if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) 1302 { 1303 ptr += MINBPC(enc); 1304 tok = XML_TOK_NAME; 1305 break; 1306 } 1307 if (IS_NAME_CHAR_MINBPC(enc, ptr)) 1308 { 1309 ptr += MINBPC(enc); 1310 tok = XML_TOK_NMTOKEN; 1311 break; 1312 } 1313 /* fall through */ 1314 default: 1315 *nextTokPtr = ptr; 1316 return XML_TOK_INVALID; 1317 } 1318 while (ptr != end) 1319 { 1320 switch (BYTE_TYPE(enc, ptr)) 1321 { 1322 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1323 case BT_GT: 1324 case BT_RPAR: 1325 case BT_COMMA: 1326 case BT_VERBAR: 1327 case BT_LSQB: 1328 case BT_PERCNT: 1329 case BT_S: 1330 case BT_CR: 1331 case BT_LF: 1332 *nextTokPtr = ptr; 1333 return tok; 1118 tok = XML_TOK_NMTOKEN; 1119 ptr += MINBPC(enc); 1120 break; 1121 case BT_NONASCII: 1122 if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { 1123 ptr += MINBPC(enc); 1124 tok = XML_TOK_NAME; 1125 break; 1126 } 1127 if (IS_NAME_CHAR_MINBPC(enc, ptr)) { 1128 ptr += MINBPC(enc); 1129 tok = XML_TOK_NMTOKEN; 1130 break; 1131 } 1132 /* fall through */ 1133 default: 1134 *nextTokPtr = ptr; 1135 return XML_TOK_INVALID; 1136 } 1137 while (ptr != end) { 1138 switch (BYTE_TYPE(enc, ptr)) { 1139 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1140 case BT_GT: case BT_RPAR: case BT_COMMA: 1141 case BT_VERBAR: case BT_LSQB: case BT_PERCNT: 1142 case BT_S: case BT_CR: case BT_LF: 1143 *nextTokPtr = ptr; 1144 return tok; 1334 1145 #ifdef XML_NS 1335 case BT_COLON: 1336 ptr += MINBPC(enc); 1337 switch (tok) 1338 { 1339 case XML_TOK_NAME: 1340 if (ptr == end) 1341 return XML_TOK_PARTIAL; 1342 tok = XML_TOK_PREFIXED_NAME; 1343 switch (BYTE_TYPE(enc, ptr)) 1344 { 1345 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1346 default: 1347 tok = XML_TOK_NMTOKEN; 1348 break; 1349 } 1350 break; 1351 case XML_TOK_PREFIXED_NAME: 1352 tok = XML_TOK_NMTOKEN; 1353 break; 1354 } 1355 break; 1146 case BT_COLON: 1147 ptr += MINBPC(enc); 1148 switch (tok) { 1149 case XML_TOK_NAME: 1150 if (ptr == end) 1151 return XML_TOK_PARTIAL; 1152 tok = XML_TOK_PREFIXED_NAME; 1153 switch (BYTE_TYPE(enc, ptr)) { 1154 CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) 1155 default: 1156 tok = XML_TOK_NMTOKEN; 1157 break; 1158 } 1159 break; 1160 case XML_TOK_PREFIXED_NAME: 1161 tok = XML_TOK_NMTOKEN; 1162 break; 1163 } 1164 break; 1356 1165 #endif 1357 case BT_PLUS: 1358 if (tok == XML_TOK_NMTOKEN) 1359 { 1360 *nextTokPtr = ptr; 1361 return XML_TOK_INVALID; 1362 } 1363 *nextTokPtr = ptr + MINBPC(enc); 1364 return XML_TOK_NAME_PLUS; 1365 case BT_AST: 1366 if (tok == XML_TOK_NMTOKEN) 1367 { 1368 *nextTokPtr = ptr; 1369 return XML_TOK_INVALID; 1370 } 1371 *nextTokPtr = ptr + MINBPC(enc); 1372 return XML_TOK_NAME_ASTERISK; 1373 case BT_QUEST: 1374 if (tok == XML_TOK_NMTOKEN) 1375 { 1376 *nextTokPtr = ptr; 1377 return XML_TOK_INVALID; 1378 } 1379 *nextTokPtr = ptr + MINBPC(enc); 1380 return XML_TOK_NAME_QUESTION; 1381 default: 1382 *nextTokPtr = ptr; 1383 return XML_TOK_INVALID; 1384 } 1385 } 1386 return -tok; 1387 } 1388 1389 static 1390 int EXPATENTRY PREFIX(attributeValueTok) (const ENCODING * enc, const char *ptr, const char *end, 1391 const char **nextTokPtr) 1392 { 1393 const char *start; 1394 1395 if (ptr == end) 1396 return XML_TOK_NONE; 1397 start = ptr; 1398 while (ptr != end) 1399 { 1400 switch (BYTE_TYPE(enc, ptr)) 1401 { 1166 case BT_PLUS: 1167 if (tok == XML_TOK_NMTOKEN) { 1168 *nextTokPtr = ptr; 1169 return XML_TOK_INVALID; 1170 } 1171 *nextTokPtr = ptr + MINBPC(enc); 1172 return XML_TOK_NAME_PLUS; 1173 case BT_AST: 1174 if (tok == XML_TOK_NMTOKEN) { 1175 *nextTokPtr = ptr; 1176 return XML_TOK_INVALID; 1177 } 1178 *nextTokPtr = ptr + MINBPC(enc); 1179 return XML_TOK_NAME_ASTERISK; 1180 case BT_QUEST: 1181 if (tok == XML_TOK_NMTOKEN) { 1182 *nextTokPtr = ptr; 1183 return XML_TOK_INVALID; 1184 } 1185 *nextTokPtr = ptr + MINBPC(enc); 1186 return XML_TOK_NAME_QUESTION; 1187 default: 1188 *nextTokPtr = ptr; 1189 return XML_TOK_INVALID; 1190 } 1191 } 1192 return -tok; 1193 } 1194 1195 static 1196 int PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, const char *end, 1197 const char **nextTokPtr) 1198 { 1199 const char *start; 1200 if (ptr == end) 1201 return XML_TOK_NONE; 1202 start = ptr; 1203 while (ptr != end) { 1204 switch (BYTE_TYPE(enc, ptr)) { 1402 1205 #define LEAD_CASE(n) \ 1403 1206 case BT_LEAD ## n: ptr += n; break; 1404 1207 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 1405 1208 #undef LEAD_CASE 1406 case BT_AMP: 1407 if (ptr == start) 1408 return PREFIX(scanRef) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1409 *nextTokPtr = ptr; 1410 return XML_TOK_DATA_CHARS; 1411 case BT_LT: 1412 /* this is for inside entity references */ 1413 *nextTokPtr = ptr; 1414 return XML_TOK_INVALID; 1415 case BT_LF: 1416 if (ptr == start) 1417 { 1418 *nextTokPtr = ptr + MINBPC(enc); 1419 return XML_TOK_DATA_NEWLINE; 1420 } 1421 *nextTokPtr = ptr; 1422 return XML_TOK_DATA_CHARS; 1423 case BT_CR: 1424 if (ptr == start) 1425 { 1426 ptr += MINBPC(enc); 1427 if (ptr == end) 1428 return XML_TOK_TRAILING_CR; 1429 if (BYTE_TYPE(enc, ptr) == BT_LF) 1430 ptr += MINBPC(enc); 1431 *nextTokPtr = ptr; 1432 return XML_TOK_DATA_NEWLINE; 1433 } 1434 *nextTokPtr = ptr; 1435 return XML_TOK_DATA_CHARS; 1436 case BT_S: 1437 if (ptr == start) 1438 { 1439 *nextTokPtr = ptr + MINBPC(enc); 1440 return XML_TOK_ATTRIBUTE_VALUE_S; 1441 } 1442 *nextTokPtr = ptr; 1443 return XML_TOK_DATA_CHARS; 1444 default: 1445 ptr += MINBPC(enc); 1446 break; 1447 } 1448 } 1449 *nextTokPtr = ptr; 1450 return XML_TOK_DATA_CHARS; 1451 } 1452 1453 static 1454 int EXPATENTRY PREFIX(entityValueTok) (const ENCODING * enc, const char *ptr, const char *end, 1455 const char **nextTokPtr) 1456 { 1457 const char *start; 1458 1209 case BT_AMP: 1210 if (ptr == start) 1211 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); 1212 *nextTokPtr = ptr; 1213 return XML_TOK_DATA_CHARS; 1214 case BT_LT: 1215 /* this is for inside entity references */ 1216 *nextTokPtr = ptr; 1217 return XML_TOK_INVALID; 1218 case BT_LF: 1219 if (ptr == start) { 1220 *nextTokPtr = ptr + MINBPC(enc); 1221 return XML_TOK_DATA_NEWLINE; 1222 } 1223 *nextTokPtr = ptr; 1224 return XML_TOK_DATA_CHARS; 1225 case BT_CR: 1226 if (ptr == start) { 1227 ptr += MINBPC(enc); 1459 1228 if (ptr == end) 1460 return XML_TOK_NONE; 1461 start = ptr; 1462 while (ptr != end) 1463 { 1464 switch (BYTE_TYPE(enc, ptr)) 1465 { 1229 return XML_TOK_TRAILING_CR; 1230 if (BYTE_TYPE(enc, ptr) == BT_LF) 1231 ptr += MINBPC(enc); 1232 *nextTokPtr = ptr; 1233 return XML_TOK_DATA_NEWLINE; 1234 } 1235 *nextTokPtr = ptr; 1236 return XML_TOK_DATA_CHARS; 1237 case BT_S: 1238 if (ptr == start) { 1239 *nextTokPtr = ptr + MINBPC(enc); 1240 return XML_TOK_ATTRIBUTE_VALUE_S; 1241 } 1242 *nextTokPtr = ptr; 1243 return XML_TOK_DATA_CHARS; 1244 default: 1245 ptr += MINBPC(enc); 1246 break; 1247 } 1248 } 1249 *nextTokPtr = ptr; 1250 return XML_TOK_DATA_CHARS; 1251 } 1252 1253 static 1254 int PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, const char *end, 1255 const char **nextTokPtr) 1256 { 1257 const char *start; 1258 if (ptr == end) 1259 return XML_TOK_NONE; 1260 start = ptr; 1261 while (ptr != end) { 1262 switch (BYTE_TYPE(enc, ptr)) { 1466 1263 #define LEAD_CASE(n) \ 1467 1264 case BT_LEAD ## n: ptr += n; break; 1468 1265 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 1469 1266 #undef LEAD_CASE 1470 case BT_AMP: 1471 if (ptr == start) 1472 return PREFIX(scanRef) (enc, ptr + MINBPC(enc), end, nextTokPtr); 1473 *nextTokPtr = ptr; 1474 return XML_TOK_DATA_CHARS; 1475 case BT_PERCNT: 1476 if (ptr == start) 1477 { 1478 int tok = PREFIX(scanPercent) (enc, ptr + MINBPC(enc), 1479 end, nextTokPtr); 1480 1481 return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; 1482 } 1483 *nextTokPtr = ptr; 1484 return XML_TOK_DATA_CHARS; 1485 case BT_LF: 1486 if (ptr == start) 1487 { 1488 *nextTokPtr = ptr + MINBPC(enc); 1489 return XML_TOK_DATA_NEWLINE; 1490 } 1491 *nextTokPtr = ptr; 1492 return XML_TOK_DATA_CHARS; 1493 case BT_CR: 1494 if (ptr == start) 1495 { 1496 ptr += MINBPC(enc); 1497 if (ptr == end) 1498 return XML_TOK_TRAILING_CR; 1499 if (BYTE_TYPE(enc, ptr) == BT_LF) 1500 ptr += MINBPC(enc); 1501 *nextTokPtr = ptr; 1502 return XML_TOK_DATA_NEWLINE; 1503 } 1504 *nextTokPtr = ptr; 1505 return XML_TOK_DATA_CHARS; 1506 default: 1507 ptr += MINBPC(enc); 1508 break; 1509 } 1510 } 1511 *nextTokPtr = ptr; 1512 return XML_TOK_DATA_CHARS; 1267 case BT_AMP: 1268 if (ptr == start) 1269 return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); 1270 *nextTokPtr = ptr; 1271 return XML_TOK_DATA_CHARS; 1272 case BT_PERCNT: 1273 if (ptr == start) { 1274 int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), 1275 end, nextTokPtr); 1276 return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; 1277 } 1278 *nextTokPtr = ptr; 1279 return XML_TOK_DATA_CHARS; 1280 case BT_LF: 1281 if (ptr == start) { 1282 *nextTokPtr = ptr + MINBPC(enc); 1283 return XML_TOK_DATA_NEWLINE; 1284 } 1285 *nextTokPtr = ptr; 1286 return XML_TOK_DATA_CHARS; 1287 case BT_CR: 1288 if (ptr == start) { 1289 ptr += MINBPC(enc); 1290 if (ptr == end) 1291 return XML_TOK_TRAILING_CR; 1292 if (BYTE_TYPE(enc, ptr) == BT_LF) 1293 ptr += MINBPC(enc); 1294 *nextTokPtr = ptr; 1295 return XML_TOK_DATA_NEWLINE; 1296 } 1297 *nextTokPtr = ptr; 1298 return XML_TOK_DATA_CHARS; 1299 default: 1300 ptr += MINBPC(enc); 1301 break; 1302 } 1303 } 1304 *nextTokPtr = ptr; 1305 return XML_TOK_DATA_CHARS; 1513 1306 } 1514 1307 … … 1516 1309 1517 1310 static 1518 int EXPATENTRY PREFIX(ignoreSectionTok) (const ENCODING * enc, const char *ptr, const char *end, 1519 const char **nextTokPtr) 1520 { 1521 int level = 0; 1522 1523 if (MINBPC(enc) > 1) 1524 { 1525 size_t n = end - ptr; 1526 1527 if (n & (MINBPC(enc) - 1)) 1528 { 1529 n &= ~(MINBPC(enc) - 1); 1530 end = ptr + n; 1531 } 1532 } 1533 while (ptr != end) 1534 { 1535 switch (BYTE_TYPE(enc, ptr)) 1536 { 1537 INVALID_CASES(ptr, nextTokPtr) 1538 case BT_LT: 1539 if ((ptr += MINBPC(enc)) == end) 1540 return XML_TOK_PARTIAL; 1541 if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) 1542 { 1543 if ((ptr += MINBPC(enc)) == end) 1544 return XML_TOK_PARTIAL; 1545 if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) 1546 { 1547 ++level; 1548 ptr += MINBPC(enc); 1549 } 1550 } 1551 break; 1552 case BT_RSQB: 1553 if ((ptr += MINBPC(enc)) == end) 1554 return XML_TOK_PARTIAL; 1555 if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) 1556 { 1557 if ((ptr += MINBPC(enc)) == end) 1558 return XML_TOK_PARTIAL; 1559 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) 1560 { 1561 ptr += MINBPC(enc); 1562 if (level == 0) 1563 { 1564 *nextTokPtr = ptr; 1565 return XML_TOK_IGNORE_SECT; 1566 } 1567 --level; 1568 } 1569 } 1570 break; 1571 default: 1572 ptr += MINBPC(enc); 1573 break; 1574 } 1575 } 1576 return XML_TOK_PARTIAL; 1311 int PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, const char *end, 1312 const char **nextTokPtr) 1313 { 1314 int level = 0; 1315 if (MINBPC(enc) > 1) { 1316 size_t n = end - ptr; 1317 if (n & (MINBPC(enc) - 1)) { 1318 n &= ~(MINBPC(enc) - 1); 1319 end = ptr + n; 1320 } 1321 } 1322 while (ptr != end) { 1323 switch (BYTE_TYPE(enc, ptr)) { 1324 INVALID_CASES(ptr, nextTokPtr) 1325 case BT_LT: 1326 if ((ptr += MINBPC(enc)) == end) 1327 return XML_TOK_PARTIAL; 1328 if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { 1329 if ((ptr += MINBPC(enc)) == end) 1330 return XML_TOK_PARTIAL; 1331 if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { 1332 ++level; 1333 ptr += MINBPC(enc); 1334 } 1335 } 1336 break; 1337 case BT_RSQB: 1338 if ((ptr += MINBPC(enc)) == end) 1339 return XML_TOK_PARTIAL; 1340 if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { 1341 if ((ptr += MINBPC(enc)) == end) 1342 return XML_TOK_PARTIAL; 1343 if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { 1344 ptr += MINBPC(enc); 1345 if (level == 0) { 1346 *nextTokPtr = ptr; 1347 return XML_TOK_IGNORE_SECT; 1348 } 1349 --level; 1350 } 1351 } 1352 break; 1353 default: 1354 ptr += MINBPC(enc); 1355 break; 1356 } 1357 } 1358 return XML_TOK_PARTIAL; 1577 1359 } 1578 1360 … … 1580 1362 1581 1363 static 1582 int EXPATENTRY PREFIX(isPublicId) (const ENCODING * enc, const char *ptr, const char *end, 1583 const char **badPtr) 1584 { 1585 ptr += MINBPC(enc); 1586 end -= MINBPC(enc); 1587 for (; ptr != end; ptr += MINBPC(enc)) 1588 { 1589 switch (BYTE_TYPE(enc, ptr)) 1590 { 1591 case BT_DIGIT: 1592 case BT_HEX: 1593 case BT_MINUS: 1594 case BT_APOS: 1595 case BT_LPAR: 1596 case BT_RPAR: 1597 case BT_PLUS: 1598 case BT_COMMA: 1599 case BT_SOL: 1600 case BT_EQUALS: 1601 case BT_QUEST: 1602 case BT_CR: 1603 case BT_LF: 1604 case BT_SEMI: 1605 case BT_EXCL: 1606 case BT_AST: 1607 case BT_PERCNT: 1608 case BT_NUM: 1364 int PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, 1365 const char **badPtr) 1366 { 1367 ptr += MINBPC(enc); 1368 end -= MINBPC(enc); 1369 for (; ptr != end; ptr += MINBPC(enc)) { 1370 switch (BYTE_TYPE(enc, ptr)) { 1371 case BT_DIGIT: 1372 case BT_HEX: 1373 case BT_MINUS: 1374 case BT_APOS: 1375 case BT_LPAR: 1376 case BT_RPAR: 1377 case BT_PLUS: 1378 case BT_COMMA: 1379 case BT_SOL: 1380 case BT_EQUALS: 1381 case BT_QUEST: 1382 case BT_CR: 1383 case BT_LF: 1384 case BT_SEMI: 1385 case BT_EXCL: 1386 case BT_AST: 1387 case BT_PERCNT: 1388 case BT_NUM: 1609 1389 #ifdef XML_NS 1610 1390 case BT_COLON: 1611 1391 #endif 1612 break; 1613 case BT_S: 1614 if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) 1615 { 1616 *badPtr = ptr; 1617 return 0; 1618 } 1619 break; 1620 case BT_NAME: 1621 case BT_NMSTRT: 1622 if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) 1623 break; 1624 default: 1625 switch (BYTE_TO_ASCII(enc, ptr)) 1626 { 1627 case 0x24: /* $ */ 1628 case 0x40: /* @ */ 1629 break; 1630 default: 1631 *badPtr = ptr; 1632 return 0; 1633 } 1634 break; 1635 } 1636 } 1637 return 1; 1392 break; 1393 case BT_S: 1394 if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { 1395 *badPtr = ptr; 1396 return 0; 1397 } 1398 break; 1399 case BT_NAME: 1400 case BT_NMSTRT: 1401 if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) 1402 break; 1403 default: 1404 switch (BYTE_TO_ASCII(enc, ptr)) { 1405 case 0x24: /* $ */ 1406 case 0x40: /* @ */ 1407 break; 1408 default: 1409 *badPtr = ptr; 1410 return 0; 1411 } 1412 break; 1413 } 1414 } 1415 return 1; 1638 1416 } 1639 1417 1640 1418 /* This must only be called for a well-formed start-tag or empty element tag. 1641 * Returns the number of attributes. Pointers to the first attsMax attributes 1642 * are stored in atts. */ 1643 1644 static 1645 int EXPATENTRY PREFIX(getAtts) (const ENCODING * enc, const char *ptr, 1646 int attsMax, ATTRIBUTE * atts) 1647 { 1648 enum 1649 { 1650 other, inName, inValue 1651 } 1652 state = inName; 1653 int nAtts = 0; 1654 int open = 0; /* defined when state == inValue; 1655 1656 * initialization just to shut up compilers */ 1657 1658 for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) 1659 { 1660 switch (BYTE_TYPE(enc, ptr)) 1661 { 1419 Returns the number of attributes. Pointers to the first attsMax attributes 1420 are stored in atts. */ 1421 1422 static 1423 int PREFIX(getAtts)(const ENCODING *enc, const char *ptr, 1424 int attsMax, ATTRIBUTE *atts) 1425 { 1426 enum { other, inName, inValue } state = inName; 1427 int nAtts = 0; 1428 int open = 0; /* defined when state == inValue; 1429 initialization just to shut up compilers */ 1430 1431 for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { 1432 switch (BYTE_TYPE(enc, ptr)) { 1662 1433 #define START_NAME \ 1663 1434 if (state == other) { \ … … 1670 1441 #define LEAD_CASE(n) \ 1671 1442 case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; 1672 1443 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 1673 1444 #undef LEAD_CASE 1674 1675 1676 1677 1678 1445 case BT_NONASCII: 1446 case BT_NMSTRT: 1447 case BT_HEX: 1448 START_NAME 1449 break; 1679 1450 #undef START_NAME 1680 case BT_QUOT: 1681 if (state != inValue) 1682 { 1683 if (nAtts < attsMax) 1684 atts[nAtts].valuePtr = ptr + MINBPC(enc); 1685 state = inValue; 1686 open = BT_QUOT; 1687 } 1688 else if (open == BT_QUOT) 1689 { 1690 state = other; 1691 if (nAtts < attsMax) 1692 atts[nAtts].valueEnd = ptr; 1693 nAtts++; 1694 } 1695 break; 1696 case BT_APOS: 1697 if (state != inValue) 1698 { 1699 if (nAtts < attsMax) 1700 atts[nAtts].valuePtr = ptr + MINBPC(enc); 1701 state = inValue; 1702 open = BT_APOS; 1703 } 1704 else if (open == BT_APOS) 1705 { 1706 state = other; 1707 if (nAtts < attsMax) 1708 atts[nAtts].valueEnd = ptr; 1709 nAtts++; 1710 } 1711 break; 1712 case BT_AMP: 1713 if (nAtts < attsMax) 1714 atts[nAtts].normalized = 0; 1715 break; 1716 case BT_S: 1717 if (state == inName) 1718 state = other; 1719 else if (state == inValue 1720 && nAtts < attsMax 1721 && atts[nAtts].normalized 1722 && (ptr == atts[nAtts].valuePtr 1723 || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE 1724 || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE 1725 || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) 1726 atts[nAtts].normalized = 0; 1727 break; 1728 case BT_CR: 1729 case BT_LF: 1730 /* This case ensures that the first attribute name is counted 1731 * Apart from that we could just change state on the quote. */ 1732 if (state == inName) 1733 state = other; 1734 else if (state == inValue && nAtts < attsMax) 1735 atts[nAtts].normalized = 0; 1736 break; 1737 case BT_GT: 1738 case BT_SOL: 1739 if (state != inValue) 1740 return nAtts; 1741 break; 1742 default: 1743 break; 1744 } 1745 } 1746 /* not reached */ 1747 } 1748 1749 static 1750 int EXPATENTRY PREFIX(charRefNumber) (const ENCODING * enc, const char *ptr) 1751 { 1752 int result = 0; 1753 1754 /* skip &# */ 1755 ptr += 2 * MINBPC(enc); 1756 if (CHAR_MATCHES(enc, ptr, ASCII_x)) 1757 { 1758 for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) 1759 { 1760 int c = BYTE_TO_ASCII(enc, ptr); 1761 1762 switch (c) 1763 { 1764 case ASCII_0: 1765 case ASCII_1: 1766 case ASCII_2: 1767 case ASCII_3: 1768 case ASCII_4: 1769 case ASCII_5: 1770 case ASCII_6: 1771 case ASCII_7: 1772 case ASCII_8: 1773 case ASCII_9: 1774 result <<= 4; 1775 result |= (c - ASCII_0); 1776 break; 1777 case ASCII_A: 1778 case ASCII_B: 1779 case ASCII_C: 1780 case ASCII_D: 1781 case ASCII_E: 1782 case ASCII_F: 1783 result <<= 4; 1784 result += 10 + (c - ASCII_A); 1785 break; 1786 case ASCII_a: 1787 case ASCII_b: 1788 case ASCII_c: 1789 case ASCII_d: 1790 case ASCII_e: 1791 case ASCII_f: 1792 result <<= 4; 1793 result += 10 + (c - ASCII_a); 1794 break; 1795 } 1796 if (result >= 0x110000) 1797 return -1; 1798 } 1799 } 1800 else 1801 { 1802 for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) 1803 { 1804 int c = BYTE_TO_ASCII(enc, ptr); 1805 1806 result *= 10; 1807 result += (c - ASCII_0); 1808 if (result >= 0x110000) 1809 return -1; 1810 } 1811 } 1812 return checkCharRefNumber(result); 1813 } 1814 1815 static 1816 int EXPATENTRY PREFIX(predefinedEntityName) (const ENCODING * enc, const char *ptr, const char *end) 1817 { 1818 switch ((end - ptr) / MINBPC(enc)) 1819 { 1820 case 2: 1821 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) 1822 { 1823 switch (BYTE_TO_ASCII(enc, ptr)) 1824 { 1825 case ASCII_l: 1826 return ASCII_LT; 1827 case ASCII_g: 1828 return ASCII_GT; 1829 } 1830 } 1831 break; 1832 case 3: 1833 if (CHAR_MATCHES(enc, ptr, ASCII_a)) 1834 { 1835 ptr += MINBPC(enc); 1836 if (CHAR_MATCHES(enc, ptr, ASCII_m)) 1837 { 1838 ptr += MINBPC(enc); 1839 if (CHAR_MATCHES(enc, ptr, ASCII_p)) 1840 return ASCII_AMP; 1841 } 1842 } 1843 break; 1844 case 4: 1845 switch (BYTE_TO_ASCII(enc, ptr)) 1846 { 1847 case ASCII_q: 1848 ptr += MINBPC(enc); 1849 if (CHAR_MATCHES(enc, ptr, ASCII_u)) 1850 { 1851 ptr += MINBPC(enc); 1852 if (CHAR_MATCHES(enc, ptr, ASCII_o)) 1853 { 1854 ptr += MINBPC(enc); 1855 if (CHAR_MATCHES(enc, ptr, ASCII_t)) 1856 return ASCII_QUOT; 1857 } 1858 } 1859 break; 1860 case ASCII_a: 1861 ptr += MINBPC(enc); 1862 if (CHAR_MATCHES(enc, ptr, ASCII_p)) 1863 { 1864 ptr += MINBPC(enc); 1865 if (CHAR_MATCHES(enc, ptr, ASCII_o)) 1866 { 1867 ptr += MINBPC(enc); 1868 if (CHAR_MATCHES(enc, ptr, ASCII_s)) 1869 return ASCII_APOS; 1870 } 1871 } 1872 break; 1873 } 1874 } 1875 return 0; 1876 } 1877 1878 static 1879 int EXPATENTRY PREFIX(sameName) (const ENCODING * enc, const char *ptr1, const char *ptr2) 1880 { 1881 for (;;) 1882 { 1883 switch (BYTE_TYPE(enc, ptr1)) 1884 { 1451 case BT_QUOT: 1452 if (state != inValue) { 1453 if (nAtts < attsMax) 1454 atts[nAtts].valuePtr = ptr + MINBPC(enc); 1455 state = inValue; 1456 open = BT_QUOT; 1457 } 1458 else if (open == BT_QUOT) { 1459 state = other; 1460 if (nAtts < attsMax) 1461 atts[nAtts].valueEnd = ptr; 1462 nAtts++; 1463 } 1464 break; 1465 case BT_APOS: 1466 if (state != inValue) { 1467 if (nAtts < attsMax) 1468 atts[nAtts].valuePtr = ptr + MINBPC(enc); 1469 state = inValue; 1470 open = BT_APOS; 1471 } 1472 else if (open == BT_APOS) { 1473 state = other; 1474 if (nAtts < attsMax) 1475 atts[nAtts].valueEnd = ptr; 1476 nAtts++; 1477 } 1478 break; 1479 case BT_AMP: 1480 if (nAtts < attsMax) 1481 atts[nAtts].normalized = 0; 1482 break; 1483 case BT_S: 1484 if (state == inName) 1485 state = other; 1486 else if (state == inValue 1487 && nAtts < attsMax 1488 && atts[nAtts].normalized 1489 && (ptr == atts[nAtts].valuePtr 1490 || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE 1491 || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE 1492 || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) 1493 atts[nAtts].normalized = 0; 1494 break; 1495 case BT_CR: case BT_LF: 1496 /* This case ensures that the first attribute name is counted 1497 Apart from that we could just change state on the quote. */ 1498 if (state == inName) 1499 state = other; 1500 else if (state == inValue && nAtts < attsMax) 1501 atts[nAtts].normalized = 0; 1502 break; 1503 case BT_GT: 1504 case BT_SOL: 1505 if (state != inValue) 1506 return nAtts; 1507 break; 1508 default: 1509 break; 1510 } 1511 } 1512 /* not reached */ 1513 } 1514 1515 static 1516 int PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) 1517 { 1518 int result = 0; 1519 /* skip &# */ 1520 ptr += 2*MINBPC(enc); 1521 if (CHAR_MATCHES(enc, ptr, ASCII_x)) { 1522 for (ptr += MINBPC(enc); !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { 1523 int c = BYTE_TO_ASCII(enc, ptr); 1524 switch (c) { 1525 case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: 1526 case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: 1527 result <<= 4; 1528 result |= (c - ASCII_0); 1529 break; 1530 case ASCII_A: case ASCII_B: case ASCII_C: case ASCII_D: case ASCII_E: case ASCII_F: 1531 result <<= 4; 1532 result += 10 + (c - ASCII_A); 1533 break; 1534 case ASCII_a: case ASCII_b: case ASCII_c: case ASCII_d: case ASCII_e: case ASCII_f: 1535 result <<= 4; 1536 result += 10 + (c - ASCII_a); 1537 break; 1538 } 1539 if (result >= 0x110000) 1540 return -1; 1541 } 1542 } 1543 else { 1544 for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { 1545 int c = BYTE_TO_ASCII(enc, ptr); 1546 result *= 10; 1547 result += (c - ASCII_0); 1548 if (result >= 0x110000) 1549 return -1; 1550 } 1551 } 1552 return checkCharRefNumber(result); 1553 } 1554 1555 static 1556 int PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, const char *end) 1557 { 1558 switch ((end - ptr)/MINBPC(enc)) { 1559 case 2: 1560 if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { 1561 switch (BYTE_TO_ASCII(enc, ptr)) { 1562 case ASCII_l: 1563 return ASCII_LT; 1564 case ASCII_g: 1565 return ASCII_GT; 1566 } 1567 } 1568 break; 1569 case 3: 1570 if (CHAR_MATCHES(enc, ptr, ASCII_a)) { 1571 ptr += MINBPC(enc); 1572 if (CHAR_MATCHES(enc, ptr, ASCII_m)) { 1573 ptr += MINBPC(enc); 1574 if (CHAR_MATCHES(enc, ptr, ASCII_p)) 1575 return ASCII_AMP; 1576 } 1577 } 1578 break; 1579 case 4: 1580 switch (BYTE_TO_ASCII(enc, ptr)) { 1581 case ASCII_q: 1582 ptr += MINBPC(enc); 1583 if (CHAR_MATCHES(enc, ptr, ASCII_u)) { 1584 ptr += MINBPC(enc); 1585 if (CHAR_MATCHES(enc, ptr, ASCII_o)) { 1586 ptr += MINBPC(enc); 1587 if (CHAR_MATCHES(enc, ptr, ASCII_t)) 1588 return ASCII_QUOT; 1589 } 1590 } 1591 break; 1592 case ASCII_a: 1593 ptr += MINBPC(enc); 1594 if (CHAR_MATCHES(enc, ptr, ASCII_p)) { 1595 ptr += MINBPC(enc); 1596 if (CHAR_MATCHES(enc, ptr, ASCII_o)) { 1597 ptr += MINBPC(enc); 1598 if (CHAR_MATCHES(enc, ptr, ASCII_s)) 1599 return ASCII_APOS; 1600 } 1601 } 1602 break; 1603 } 1604 } 1605 return 0; 1606 } 1607 1608 static 1609 int PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) 1610 { 1611 for (;;) { 1612 switch (BYTE_TYPE(enc, ptr1)) { 1885 1613 #define LEAD_CASE(n) \ 1886 1614 case BT_LEAD ## n: \ 1887 1615 if (*ptr1++ != *ptr2++) \ 1888 1616 return 0; 1889 1617 LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) 1890 1618 #undef LEAD_CASE 1891 1892 1893 1894 1895 1896 1619 /* fall through */ 1620 if (*ptr1++ != *ptr2++) 1621 return 0; 1622 break; 1623 case BT_NONASCII: 1624 case BT_NMSTRT: 1897 1625 #ifdef XML_NS 1898 1626 case BT_COLON: 1899 1627 #endif 1900 case BT_HEX: 1901 case BT_DIGIT: 1902 case BT_NAME: 1903 case BT_MINUS: 1904 if (*ptr2++ != *ptr1++) 1905 return 0; 1906 if (MINBPC(enc) > 1) 1907 { 1908 if (*ptr2++ != *ptr1++) 1909 return 0; 1910 if (MINBPC(enc) > 2) 1911 { 1912 if (*ptr2++ != *ptr1++) 1913 return 0; 1914 if (MINBPC(enc) > 3) 1915 { 1916 if (*ptr2++ != *ptr1++) 1917 return 0; 1918 } 1919 } 1920 } 1921 break; 1922 default: 1923 if (MINBPC(enc) == 1 && *ptr1 == *ptr2) 1924 return 1; 1925 switch (BYTE_TYPE(enc, ptr2)) 1926 { 1927 case BT_LEAD2: 1928 case BT_LEAD3: 1929 case BT_LEAD4: 1930 case BT_NONASCII: 1931 case BT_NMSTRT: 1628 case BT_HEX: 1629 case BT_DIGIT: 1630 case BT_NAME: 1631 case BT_MINUS: 1632 if (*ptr2++ != *ptr1++) 1633 return 0; 1634 if (MINBPC(enc) > 1) { 1635 if (*ptr2++ != *ptr1++) 1636 return 0; 1637 if (MINBPC(enc) > 2) { 1638 if (*ptr2++ != *ptr1++) 1639 return 0; 1640 if (MINBPC(enc) > 3) { 1641 if (*ptr2++ != *ptr1++) 1642 return 0; 1643 } 1644 } 1645 } 1646 break; 1647 default: 1648 if (MINBPC(enc) == 1 && *ptr1 == *ptr2) 1649 return 1; 1650 switch (BYTE_TYPE(enc, ptr2)) { 1651 case BT_LEAD2: 1652 case BT_LEAD3: 1653 case BT_LEAD4: 1654 case BT_NONASCII: 1655 case BT_NMSTRT: 1932 1656 #ifdef XML_NS 1933 1657 case BT_COLON: 1934 1658 #endif 1935 case BT_HEX: 1936 case BT_DIGIT: 1937 case BT_NAME: 1938 case BT_MINUS: 1939 return 0; 1940 default: 1941 return 1; 1942 } 1943 } 1944 } 1945 /* not reached */ 1946 } 1947 1948 static 1949 int EXPATENTRY PREFIX(nameMatchesAscii) (const ENCODING * enc, const char *ptr1, 1950 const char *end1, const char *ptr2) 1951 { 1952 for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) 1953 { 1954 if (ptr1 == end1) 1955 return 0; 1956 if (!CHAR_MATCHES(enc, ptr1, *ptr2)) 1957 return 0; 1958 } 1959 return ptr1 == end1; 1960 } 1961 1962 static 1963 int EXPATENTRY PREFIX(nameLength) (const ENCODING * enc, const char *ptr) 1964 { 1965 const char *start = ptr; 1966 1967 for (;;) 1968 { 1969 switch (BYTE_TYPE(enc, ptr)) 1970 { 1659 case BT_HEX: 1660 case BT_DIGIT: 1661 case BT_NAME: 1662 case BT_MINUS: 1663 return 0; 1664 default: 1665 return 1; 1666 } 1667 } 1668 } 1669 /* not reached */ 1670 } 1671 1672 static 1673 int PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, 1674 const char *end1, const char *ptr2) 1675 { 1676 for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { 1677 if (ptr1 == end1) 1678 return 0; 1679 if (!CHAR_MATCHES(enc, ptr1, *ptr2)) 1680 return 0; 1681 } 1682 return ptr1 == end1; 1683 } 1684 1685 static 1686 int PREFIX(nameLength)(const ENCODING *enc, const char *ptr) 1687 { 1688 const char *start = ptr; 1689 for (;;) { 1690 switch (BYTE_TYPE(enc, ptr)) { 1971 1691 #define LEAD_CASE(n) \ 1972 1692 case BT_LEAD ## n: ptr += n; break; 1973 1693 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 1974 1694 #undef LEAD_CASE 1975 1976 1695 case BT_NONASCII: 1696 case BT_NMSTRT: 1977 1697 #ifdef XML_NS 1978 1698 case BT_COLON: 1979 1699 #endif 1980 case BT_HEX: 1981 case BT_DIGIT: 1982 case BT_NAME: 1983 case BT_MINUS: 1984 ptr += MINBPC(enc); 1985 break; 1986 default: 1987 return ptr - start; 1988 } 1989 } 1990 } 1991 1992 static 1993 const char *EXPATENTRY PREFIX(skipS) (const ENCODING * enc, const char *ptr) 1994 { 1995 for (;;) 1996 { 1997 switch (BYTE_TYPE(enc, ptr)) 1998 { 1999 case BT_LF: 2000 case BT_CR: 2001 case BT_S: 2002 ptr += MINBPC(enc); 2003 break; 2004 default: 2005 return ptr; 2006 } 2007 } 2008 } 2009 2010 static 2011 void EXPATENTRY PREFIX(updatePosition) (const ENCODING * enc, 2012 const char *ptr, 2013 const char *end, 2014 POSITION * pos) 2015 { 2016 while (ptr != end) 2017 { 2018 switch (BYTE_TYPE(enc, ptr)) 2019 { 1700 case BT_HEX: 1701 case BT_DIGIT: 1702 case BT_NAME: 1703 case BT_MINUS: 1704 ptr += MINBPC(enc); 1705 break; 1706 default: 1707 return ptr - start; 1708 } 1709 } 1710 } 1711 1712 static 1713 const char *PREFIX(skipS)(const ENCODING *enc, const char *ptr) 1714 { 1715 for (;;) { 1716 switch (BYTE_TYPE(enc, ptr)) { 1717 case BT_LF: 1718 case BT_CR: 1719 case BT_S: 1720 ptr += MINBPC(enc); 1721 break; 1722 default: 1723 return ptr; 1724 } 1725 } 1726 } 1727 1728 static 1729 void PREFIX(updatePosition)(const ENCODING *enc, 1730 const char *ptr, 1731 const char *end, 1732 POSITION *pos) 1733 { 1734 while (ptr != end) { 1735 switch (BYTE_TYPE(enc, ptr)) { 2020 1736 #define LEAD_CASE(n) \ 2021 1737 case BT_LEAD ## n: \ 2022 1738 ptr += n; \ 2023 1739 break; 2024 1740 LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) 2025 1741 #undef LEAD_CASE 2026 2027 2028 2029 2030 2031 2032 2033 2034 2035 2036 2037 2038 2039 2040 2041 2042 2043 1742 case BT_LF: 1743 pos->columnNumber = (unsigned)-1; 1744 pos->lineNumber++; 1745 ptr += MINBPC(enc); 1746 break; 1747 case BT_CR: 1748 pos->lineNumber++; 1749 ptr += MINBPC(enc); 1750 if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) 1751 ptr += MINBPC(enc); 1752 pos->columnNumber = (unsigned)-1; 1753 break; 1754 default: 1755 ptr += MINBPC(enc); 1756 break; 1757 } 1758 pos->columnNumber++; 1759 } 2044 1760 } 2045 1761 -
trunk/src/helpers/xmltok_ns.c
r38 r97 1 2 /* 3 *sourcefile xmltok_ns.c 4 * part of the expat implementation. See xmlparse.c. 5 * 6 * NOTE: This file must not be compiled directly. It is 7 * #include'd from xmltok.c several times. 8 */ 9 10 /* 11 * Copyright (C) 2001 Ulrich Mller. 12 * Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd. 13 * and Clark Cooper. 14 * 15 * Permission is hereby granted, free of charge, to any person obtaining 16 * a copy of this software and associated documentation files (the 17 * "Software"), to deal in the Software without restriction, including 18 * without limitation the rights to use, copy, modify, merge, publish, 19 * distribute, sublicense, and/or sell copies of the Software, and to 20 * permit persons to whom the Software is furnished to do so, subject to 21 * the following conditions: 22 * 23 * The above copyright notice and this permission notice shall be included 24 * in all copies or substantial portions of the Software. 25 * 26 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 27 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 28 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 29 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 30 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 31 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 32 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 33 */ 34 35 const ENCODING* EXPATENTRY NS(XmlGetUtf8InternalEncoding) (void) 1 const ENCODING *NS(XmlGetUtf8InternalEncoding)(void) 36 2 { 37 3 return &ns(internal_utf8_encoding).enc; 38 4 } 39 5 40 const ENCODING * EXPATENTRY NS(XmlGetUtf16InternalEncoding)(void)6 const ENCODING *NS(XmlGetUtf16InternalEncoding)(void) 41 7 { 42 8 #if XML_BYTE_ORDER == 12 43 9 return &ns(internal_little2_encoding).enc; 44 10 #elif XML_BYTE_ORDER == 21 45 11 return &ns(internal_big2_encoding).enc; 46 12 #else 47 const short n = 1; 48 49 return *(const char *)&n ? &ns(internal_little2_encoding).enc : &ns(internal_big2_encoding).enc; 13 const short n = 1; 14 return *(const char *)&n ? &ns(internal_little2_encoding).enc : &ns(internal_big2_encoding).enc; 50 15 #endif 51 16 } 52 17 53 18 static 54 const ENCODING *NS(encodings)[] = 55 { 56 &ns(latin1_encoding).enc, 57 &ns(ascii_encoding).enc, 58 &ns(utf8_encoding).enc, 59 &ns(big2_encoding).enc, 60 &ns(big2_encoding).enc, 61 &ns(little2_encoding).enc, 62 &ns(utf8_encoding).enc /* NO_ENC */ 19 const ENCODING *NS(encodings)[] = { 20 &ns(latin1_encoding).enc, 21 &ns(ascii_encoding).enc, 22 &ns(utf8_encoding).enc, 23 &ns(big2_encoding).enc, 24 &ns(big2_encoding).enc, 25 &ns(little2_encoding).enc, 26 &ns(utf8_encoding).enc /* NO_ENC */ 63 27 }; 64 28 65 static int EXPATENTRY NS(initScanProlog)(const ENCODING * enc, 66 const char *ptr, 67 const char *end, 68 const char **nextTokPtr) 29 static 30 int NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, 31 const char **nextTokPtr) 69 32 { 70 33 return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_PROLOG_STATE, ptr, end, nextTokPtr); 71 34 } 72 35 73 static int EXPATENTRY NS(initScanContent)(const ENCODING * enc, 74 const char *ptr, 75 const char *end, 76 const char **nextTokPtr) 36 static 37 int NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, 38 const char **nextTokPtr) 77 39 { 78 40 return initScan(NS(encodings), (const INIT_ENCODING *)enc, XML_CONTENT_STATE, ptr, end, nextTokPtr); 79 41 } 80 42 81 int EXPATENTRY NS(XmlInitEncoding)(INIT_ENCODING * p, const ENCODING **encPtr, const char *name)43 int NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, const char *name) 82 44 { 83 int i = getEncodingIndex(name); 84 85 if (i == UNKNOWN_ENC) 86 return 0; 87 SET_INIT_ENC_INDEX(p, i); 88 p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); 89 p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); 90 p->initEnc.updatePosition = initUpdatePosition; 91 p->encPtr = encPtr; 92 *encPtr = &(p->initEnc); 93 return 1; 45 int i = getEncodingIndex(name); 46 if (i == UNKNOWN_ENC) 47 return 0; 48 SET_INIT_ENC_INDEX(p, i); 49 p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); 50 p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); 51 p->initEnc.updatePosition = initUpdatePosition; 52 p->encPtr = encPtr; 53 *encPtr = &(p->initEnc); 54 return 1; 94 55 } 95 56 96 static const ENCODING* EXPATENTRY NS(findEncoding)(const ENCODING * enc, 97 const char *ptr, 98 const char *end) 57 static 58 const ENCODING *NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) 99 59 { 100 60 #define ENCODING_MAX 128 101 char buf[ENCODING_MAX]; 102 char *p = buf; 103 int i; 104 105 XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); 106 if (ptr != end) 107 return 0; 108 *p = 0; 109 if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) 110 return enc; 111 i = getEncodingIndex(buf); 112 if (i == UNKNOWN_ENC) 113 return 0; 114 return NS(encodings)[i]; 61 char buf[ENCODING_MAX]; 62 char *p = buf; 63 int i; 64 XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); 65 if (ptr != end) 66 return 0; 67 *p = 0; 68 if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) 69 return enc; 70 i = getEncodingIndex(buf); 71 if (i == UNKNOWN_ENC) 72 return 0; 73 return NS(encodings)[i]; 115 74 } 116 75 117 int NS(XmlParseXmlDecl) 118 const ENCODING *enc,119 120 121 122 123 124 125 const ENCODING **encoding,126 76 int NS(XmlParseXmlDecl)(int isGeneralTextEntity, 77 const ENCODING *enc, 78 const char *ptr, 79 const char *end, 80 const char **badPtr, 81 const char **versionPtr, 82 const char **versionEndPtr, 83 const char **encodingName, 84 const ENCODING **encoding, 85 int *standalone) 127 86 { 128 129 130 131 132 133 134 135 136 137 138 87 return doParseXmlDecl(NS(findEncoding), 88 isGeneralTextEntity, 89 enc, 90 ptr, 91 end, 92 badPtr, 93 versionPtr, 94 versionEndPtr, 95 encodingName, 96 encoding, 97 standalone); 139 98 }
Note:
See TracChangeset
for help on using the changeset viewer.