254 lines
8.4 KiB
C
254 lines
8.4 KiB
C
/*===========================================================================
|
|
Parsifal XML Parser
|
|
Copyright (c) 2002-2004 Toni Uusitalo
|
|
released to the public domain 2002-11-15
|
|
http://www.saunalahti.fi/~samiuus/toni/xmlproc/
|
|
|
|
Parsifal is free for both commercial and non-commercial use and
|
|
redistribution, provided that author's copyright and disclaimer are
|
|
retained intact. You are free to modify Parsifal for your own use and
|
|
to redistribute Parsifal with your modifications, provided that the
|
|
modifications are clearly documented.
|
|
|
|
DISCLAIMER
|
|
----------
|
|
|
|
This program is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Merchantability or fitness for a particular purpose. Please use it AT
|
|
YOUR OWN RISK.
|
|
===========================================================================*/
|
|
|
|
#ifndef PARSIFAL__H
|
|
#define PARSIFAL__H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "bistream.h"
|
|
#include "xmlhash.h"
|
|
#include "xmlvect.h"
|
|
#include "xmlsbuf.h"
|
|
#include "xmlpool.h"
|
|
|
|
#ifndef XMLCH_DEFINED
|
|
#define XMLCH_DEFINED
|
|
typedef unsigned char XMLCH;
|
|
#endif
|
|
|
|
typedef struct tagXMLRUNTIMETAG
|
|
{
|
|
XMLCH *qname;
|
|
XMLCH *uri;
|
|
XMLCH *localName;
|
|
XMLCH *prefix;
|
|
LPXMLHTABLE Scope;
|
|
LPXMLHTABLE prevScope;
|
|
XMLSTRINGBUF nameBuf;
|
|
} XMLRUNTIMETAG, *LPXMLRUNTIMETAG;
|
|
|
|
typedef struct tagXMLRUNTIMEATT
|
|
{
|
|
XMLCH *qname;
|
|
XMLCH *value;
|
|
XMLCH *uri;
|
|
XMLCH *localName;
|
|
XMLCH *prefix;
|
|
XMLSTRINGBUF nameBuf;
|
|
XMLSTRINGBUF valBuf;
|
|
} XMLRUNTIMEATT, *LPXMLRUNTIMEATT;
|
|
|
|
typedef struct tagXMLPARSERRUNTIME
|
|
{
|
|
LPXMLHTABLE nsScope;
|
|
LPXMLHTABLE namedAtts;
|
|
LPXMLHTABLE entitiesTable;
|
|
LPXMLHTABLE declAttTable;
|
|
LPXMLVECTOR atts;
|
|
LPXMLVECTOR tagstack;
|
|
LPXMLVECTOR entities;
|
|
LPBUFFEREDISTREAM refReader;
|
|
XMLCH *doctypeName, *publicID, *systemID;
|
|
const XMLCH *nameStart;
|
|
XMLSTRINGBUF charsBuf;
|
|
LPXMLPOOL strPool;
|
|
struct tagDTD *dtd;
|
|
} XMLPARSERRUNTIME, *LPXMLPARSERRUNTIME;
|
|
|
|
enum tagXMLERRCODE {
|
|
ERR_XMLP_MEMORY_ALLOC = 1,
|
|
ERR_XMLP_READER_FATAL,
|
|
ERR_XMLP_INVALID_TOKEN,
|
|
ERR_XMLP_INVALID_NAME,
|
|
ERR_XMLP_INVALID_END_TAG,
|
|
ERR_XMLP_UNDEF_ENTITY,
|
|
ERR_XMLP_WS_NOT_ALLOWED,
|
|
ERR_XMLP_WS_REQUIRED,
|
|
ERR_XMLP_UNCLOSED_TAG,
|
|
ERR_XMLP_EXPECTED_FOUND,
|
|
ERR_XMLP_EXPECTED_TOKEN,
|
|
ERR_XMLP_MULTIPLE_TOP,
|
|
ERR_XMLP_INVALID_AT_TOP,
|
|
ERR_XMLP_UNDEF_NSPREFIX,
|
|
ERR_XMLP_DUPL_ATTRIBUTE,
|
|
ERR_XMLP_ENCODING,
|
|
ERR_XMLP_UNSUP_ENCODING,
|
|
ERR_XMLP_INVALID_DECL,
|
|
ERR_XMLP_INVALID_ATT_VALUE,
|
|
ERR_XMLP_ABORT,
|
|
ERR_XMLP_ILLEGAL_CHAR,
|
|
ERR_XMLP_RECURSIVE_ENTITY_REF,
|
|
ERR_XMLP_IO,
|
|
ERR_XMLP_SWITCH_ENCODING
|
|
};
|
|
typedef enum tagXMLERRCODE XMLERRCODE;
|
|
|
|
enum tagXMLENTITYTYPE {
|
|
XML_ENTITY_INT_PARAM = 1,
|
|
XML_ENTITY_INT_GEN,
|
|
XML_ENTITY_EXT_PARAM,
|
|
XML_ENTITY_EXT_GEN,
|
|
XML_ENTITY_UNPARSED,
|
|
XML_ENTITY_DOCTYPE
|
|
};
|
|
typedef enum tagXMLENTITYTYPE XMLENTITYTYPE;
|
|
|
|
#define XMLFLAG_NAMESPACES 0x1 /* http://xml.org/sax/features/namespaces */
|
|
#define XMLFLAG_NAMESPACE_PREFIXES 0x2 /* http://xml.org/sax/features/namespace-prefixes */
|
|
#define XMLFLAG_EXTERNAL_GENERAL_ENTITIES 0x4 /* http://xml.org/sax/features/external-general-entities */
|
|
#define XMLFLAG_PRESERVE_GENERAL_ENTITIES 0x8
|
|
#define XMLFLAG_UNDEF_GENERAL_ENTITIES 0x10
|
|
#define XMLFLAG_PRESERVE_WS_ATTRIBUTES 0x20
|
|
#define XMLFLAG_CONVERT_EOL 0x40
|
|
|
|
/* for XML_ATTRIBUTEDECL_HANDLER valueDef param: */
|
|
#define XMLATTDECL_DEF_FIXED 1
|
|
#define XMLATTDECL_DEF_REQUIRED 2
|
|
#define XMLATTDECL_DEF_IMPLIED 3
|
|
|
|
/* for XML_ATTRIBUTEDECL_HANDLER type param: */
|
|
#define XMLATTDECL_TYPE_CDATA 1
|
|
#define XMLATTDECL_TYPE_ID 2
|
|
#define XMLATTDECL_TYPE_IDREF 3
|
|
#define XMLATTDECL_TYPE_IDREFS 4
|
|
#define XMLATTDECL_TYPE_ENTITY 5
|
|
#define XMLATTDECL_TYPE_ENTITIES 6
|
|
#define XMLATTDECL_TYPE_NMTOKEN 7
|
|
#define XMLATTDECL_TYPE_NMTOKENS 8
|
|
#define XMLATTDECL_TYPE_NOTATION 9
|
|
#define XMLATTDECL_TYPE_ENUMERATED 10
|
|
|
|
typedef struct tagXMLENTITY
|
|
{
|
|
XMLENTITYTYPE type;
|
|
int len;
|
|
int open;
|
|
XMLCH *name;
|
|
XMLCH *value;
|
|
XMLCH *publicID;
|
|
XMLCH *systemID;
|
|
XMLCH *notation;
|
|
} XMLENTITY, *LPXMLENTITY;
|
|
|
|
typedef int (*XML_EVENT_HANDLER)(void *UserData);
|
|
typedef int (*XML_START_ELEMENT_HANDLER)(void *UserData, const XMLCH *uri,
|
|
const XMLCH *localName, const XMLCH *qName,
|
|
LPXMLVECTOR atts);
|
|
typedef int (*XML_END_ELEMENT_HANDLER)(void *UserData, const XMLCH *uri,
|
|
const XMLCH *localName, const XMLCH *qName);
|
|
typedef int (*XML_CHARACTERS_HANDLER)(void *UserData, const XMLCH *chars, int cbSize);
|
|
typedef int (*XML_PI_HANDLER)(void *UserData, const XMLCH *target, const XMLCH *data);
|
|
typedef int (*XML_START_DTD_HANDLER)(void *UserData, const XMLCH *name,
|
|
const XMLCH *publicId, const XMLCH *systemId,
|
|
int hasInternalSubset);
|
|
typedef int (*XML_XMLDECL_HANDLER)(void *UserData, const XMLCH *version,
|
|
const XMLCH *encoding, const XMLCH *standalone);
|
|
typedef int (*XML_RESOLVE_ENTITY_HANDLER)(void *UserData, LPXMLENTITY entity,
|
|
LPBUFFEREDISTREAM reader);
|
|
typedef int (*XML_SKIPPED_ENTITY_HANDLER)(void *UserData, const XMLCH *name);
|
|
typedef int (*XML_ENTITY_EVENT_HANDLER)(void *UserData, LPXMLENTITY entity);
|
|
typedef int (*XML_ATTRIBUTEDECL_HANDLER)(void *UserData, const XMLCH *eName,
|
|
const XMLCH *aName, int type, const XMLCH *typeStr, int valueDef,
|
|
const XMLCH *def);
|
|
typedef int (*XML_ELEMENTDECL_HANDLER)(void *UserData, const XMLCH *name,
|
|
void *contentModel);
|
|
typedef int (*XML_NOTATIONDECL_HANDLER)(void *UserData, const XMLCH *name,
|
|
const XMLCH *publicID, const XMLCH *systemID);
|
|
|
|
typedef struct tagXMLPARSER
|
|
{
|
|
LPBUFFEREDISTREAM reader;
|
|
LPXMLPARSERRUNTIME prt;
|
|
XMLCH *DocumentElement;
|
|
XMLCH ErrorString[128];
|
|
int ErrorCode;
|
|
int ErrorLine;
|
|
int ErrorColumn;
|
|
void *UserData;
|
|
unsigned long XMLFlags;
|
|
XML_EVENT_HANDLER startDocumentHandler;
|
|
XML_EVENT_HANDLER endDocumentHandler;
|
|
XML_EVENT_HANDLER startCDATAHandler;
|
|
XML_EVENT_HANDLER endCDATAHandler;
|
|
XML_EVENT_HANDLER endDTDHandler;
|
|
XML_CHARACTERS_HANDLER charactersHandler;
|
|
XML_CHARACTERS_HANDLER ignorableWhitespaceHandler;
|
|
XML_CHARACTERS_HANDLER commentHandler;
|
|
XML_CHARACTERS_HANDLER defaultHandler;
|
|
XML_START_ELEMENT_HANDLER startElementHandler;
|
|
XML_END_ELEMENT_HANDLER endElementHandler;
|
|
XML_PI_HANDLER processingInstructionHandler;
|
|
XML_START_DTD_HANDLER startDTDHandler;
|
|
XML_XMLDECL_HANDLER xmlDeclHandler;
|
|
XML_SKIPPED_ENTITY_HANDLER skippedEntityHandler;
|
|
XML_ENTITY_EVENT_HANDLER startEntityHandler;
|
|
XML_ENTITY_EVENT_HANDLER endEntityHandler;
|
|
XML_RESOLVE_ENTITY_HANDLER resolveEntityHandler;
|
|
XML_RESOLVE_ENTITY_HANDLER externalEntityParsedHandler;
|
|
XML_ATTRIBUTEDECL_HANDLER attributeDeclHandler;
|
|
XML_ELEMENTDECL_HANDLER elementDeclHandler;
|
|
XML_ENTITY_EVENT_HANDLER entityDeclHandler;
|
|
XML_NOTATIONDECL_HANDLER notationDeclHandler;
|
|
/*XML_ERROR_HANDLER */ void (*errorHandler)(struct tagXMLPARSER *parser);
|
|
} XMLPARSER, *LPXMLPARSER;
|
|
|
|
typedef void (*XML_ERROR_HANDLER)(LPXMLPARSER parser);
|
|
|
|
#ifndef XMLAPI
|
|
#define XMLAPI
|
|
#endif
|
|
|
|
#define XML_OK 0
|
|
#define XML_ABORT 1
|
|
|
|
#define _XMLParser_SetFlag(parser,flag,valBool) \
|
|
((valBool) ? (((LPXMLPARSER)parser)->XMLFlags |= (flag)) : \
|
|
(((LPXMLPARSER)parser)->XMLFlags &= ~(flag)) )
|
|
|
|
#define _XMLParser_GetFlag(parser,flag) \
|
|
((((LPXMLPARSER)parser)->XMLFlags & (flag)) == (flag))
|
|
|
|
#define _XMLParser_AttIsDefaulted(att) (!(att->nameBuf.str))
|
|
|
|
LPXMLPARSER XMLAPI XMLParser_Create(LPXMLPARSER *parser);
|
|
int XMLAPI XMLParser_Parse(LPXMLPARSER parser, LPFNINPUTSRC inputSrc, void *inputData, const XMLCH *encoding);
|
|
void XMLAPI XMLParser_Free(LPXMLPARSER parser);
|
|
LPXMLRUNTIMEATT XMLAPI XMLParser_GetNamedItem(LPXMLPARSER parser, const XMLCH *name);
|
|
XMLCH XMLAPI *XMLParser_GetSystemID(LPXMLPARSER parser);
|
|
XMLCH XMLAPI *XMLParser_GetPublicID(LPXMLPARSER parser);
|
|
XMLCH XMLAPI *XMLParser_GetPrefixMapping(LPXMLPARSER parser, const XMLCH *prefix);
|
|
int XMLAPI XMLParser_GetCurrentLine(LPXMLPARSER parser);
|
|
int XMLAPI XMLParser_GetCurrentColumn(LPXMLPARSER parser);
|
|
LPXMLENTITY XMLAPI XMLParser_GetCurrentEntity(LPXMLPARSER parser);
|
|
XMLCH XMLAPI *XMLParser_GetVersionString();
|
|
int XMLAPI XMLNormalizeBuf(XMLCH *buf, int len);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
#endif /* PARSIFAL__H */
|
|
|
|
|
|
|