1#include <tcl.h> 2#include <expat.h> 3 4struct TclGenExpatInfo; 5 6typedef void (*CHandlerSet_userDataReset)(Tcl_Interp *interp, void *userData); 7typedef void (*CHandlerSet_userDataFree)(Tcl_Interp *interp, void *userData); 8typedef void (*CHandlerSet_parserReset)(XML_Parser parser, void *userData); 9typedef void (*CHandlerSet_initParse)(Tcl_Interp *interp, void *userData); 10 11typedef struct CHandlerSet { 12 struct CHandlerSet *nextHandlerSet; 13 char *name; /* refname of the handler set */ 14 int ignoreWhiteCDATAs; /* ignore 'white' CDATA sections */ 15 16 void *userData; /* Handler set specific Data Structure; 17 the C handler set extention has to 18 malloc the needed structure in his 19 init func and has to provide a 20 cleanup func (to free it). */ 21 22 CHandlerSet_userDataReset resetProc; 23 CHandlerSet_userDataFree freeProc; 24 CHandlerSet_parserReset parserResetProc; 25 CHandlerSet_initParse initParseProc; 26 27 /* C func for element start */ 28 XML_StartElementHandler elementstartcommand; 29 /* C func for element end */ 30 XML_EndElementHandler elementendcommand; 31 /* C func for character data */ 32 XML_CharacterDataHandler datacommand; 33 /* C func for namespace decl start */ 34 XML_StartNamespaceDeclHandler startnsdeclcommand; 35 /* C func for namespace decl end */ 36 XML_EndNamespaceDeclHandler endnsdeclcommand; 37 /* C func for processing instruction */ 38 XML_ProcessingInstructionHandler picommand; 39 /* C func for default data */ 40 XML_DefaultHandler defaultcommand; 41 /* C func for unparsed entity declaration */ 42 XML_NotationDeclHandler notationcommand; 43 /* C func for external entity */ 44 XML_ExternalEntityRefHandler externalentitycommand; 45 /* C func for unknown encoding */ 46 XML_UnknownEncodingHandler unknownencodingcommand; 47 /* C func for comments */ 48 XML_CommentHandler commentCommand; 49 /* C func for "not standalone" docs */ 50 XML_NotStandaloneHandler notStandaloneCommand; 51 /* C func for CDATA section start */ 52 XML_StartCdataSectionHandler startCdataSectionCommand; 53 /* C func for CDATA section end */ 54 XML_EndCdataSectionHandler endCdataSectionCommand; 55 /* C func for <!ELEMENT decl's */ 56 XML_ElementDeclHandler elementDeclCommand; 57 /* C func for <!ATTLIST decl's */ 58 XML_AttlistDeclHandler attlistDeclCommand; 59 /* C func for <!DOCTYPE decl's */ 60 XML_StartDoctypeDeclHandler startDoctypeDeclCommand; 61 /* C func for <!DOCTYPE decl ends */ 62 XML_EndDoctypeDeclHandler endDoctypeDeclCommand; 63 /* C func for <?XML decl's */ 64 XML_XmlDeclHandler xmlDeclCommand; 65 /* C func for <!ENTITY decls's */ 66 XML_EntityDeclHandler entityDeclCommand; 67} CHandlerSet; 68 69/*---------------------------------------------------------------------------- 70| The structure below is used to refer to an event handler set 71| of tcl scripts. 72\---------------------------------------------------------------------------*/ 73 74typedef struct TclHandlerSet { 75 struct TclHandlerSet *nextHandlerSet; 76 char *name; /* refname of the handler set */ 77 int status; /* handler set status */ 78 int continueCount; /* reference count for continue */ 79 int ignoreWhiteCDATAs; /* ignore 'white' CDATA sections */ 80 81 Tcl_Obj *elementstartcommand; /* Script for element start */ 82 Tcl_ObjCmdProc *elementstartObjProc; 83 ClientData elementstartclientData; 84 Tcl_Obj *elementendcommand; /* Script for element end */ 85 Tcl_ObjCmdProc *elementendObjProc; 86 ClientData elementendclientData; 87 Tcl_Obj *datacommand; /* Script for character data */ 88 Tcl_ObjCmdProc *datacommandObjProc; 89 ClientData datacommandclientData; 90 Tcl_Obj *startnsdeclcommand; /* Script for namespace decl start */ 91 Tcl_Obj *endnsdeclcommand; /* Script for namespace decl end */ 92 Tcl_Obj *picommand; /* Script for processing instruction */ 93 Tcl_Obj *defaultcommand; /* Script for default data */ 94 Tcl_Obj *notationcommand; /* Script for notation declaration */ 95 Tcl_Obj *externalentitycommand; /* Script for external entity */ 96 Tcl_Obj *unknownencodingcommand; /* Script for unknown encoding */ 97 Tcl_Obj *commentCommand; /* Script for comments */ 98 Tcl_Obj *notStandaloneCommand; /* Script for "not standalone" docs */ 99 Tcl_Obj *startCdataSectionCommand; /* Script for CDATA section start */ 100 Tcl_Obj *endCdataSectionCommand; /* Script for CDATA section end */ 101 Tcl_Obj *elementDeclCommand; /* Script for <!ELEMENT decl's */ 102 Tcl_Obj *attlistDeclCommand; /* Script for <!ATTLIST decl's */ 103 Tcl_Obj *startDoctypeDeclCommand; /* Script for <!DOCTYPE decl's */ 104 Tcl_Obj *endDoctypeDeclCommand; /* Script for <!DOCTYPE decl ends */ 105 Tcl_Obj *xmlDeclCommand; /* Script for <?XML decl's */ 106 Tcl_Obj *entityDeclCommand; /* Script for <!ENTITY decl's */ 107} TclHandlerSet; 108 109typedef struct expatElemContent { 110 111 XML_Content *content; 112 struct expatElemContent *next; 113 114} ExpatElemContent; 115 116typedef struct TclGenExpatInfo { 117 XML_Parser parser; /* The expat parser structure */ 118 Tcl_Interp *interp; /* Interpreter for this instance */ 119 Tcl_Obj *name; /* name of this instance */ 120 int final; /* input data complete? */ 121 int needWSCheck; /* Any handler set has ignoreWhiteCDATAs==1? */ 122 int status; /* application status */ 123 Tcl_Obj *result; /* application return result */ 124 const char *context; /* reference to the context pointer */ 125 Tcl_Obj *cdata; /* Accumulates character data */ 126 ExpatElemContent *eContents;/* The reported XML_Contents as linked list */ 127 int ns_mode; /* namespace mode */ 128 Tcl_Obj *baseURI; 129 int finished; 130 int parsingState; /* 0 == freshly (re-)initialized 131 1 == initParserProcs called 132 2 == parsing an input chunk */ 133 XML_Char nsSeparator; 134 int paramentityparsing; 135 int noexpand; 136 int useForeignDTD; 137 138 TclHandlerSet *firstTclHandlerSet; 139 CHandlerSet *firstCHandlerSet; 140} TclGenExpatInfo; 141 142/*-------------------------------------------------------------------------- 143| Function prototypes 144| 145\-------------------------------------------------------------------------*/ 146 147#if defined(_MSC_VER) || defined(BUILD_tdom) 148# undef TCL_STORAGE_CLASS 149# define TCL_STORAGE_CLASS DLLEXPORT 150#endif 151 152EXTERN int TclExpatObjCmd _ANSI_ARGS_((ClientData dummy, 153 Tcl_Interp *interp, 154 int objc, Tcl_Obj *CONST objv[])); 155EXTERN int CheckExpatParserObj _ANSI_ARGS_((Tcl_Interp *interp, 156 Tcl_Obj *CONST nameObj)); 157EXTERN int CHandlerSetInstall _ANSI_ARGS_((Tcl_Interp *interp, 158 Tcl_Obj *CONST expatObj, 159 CHandlerSet *handlerSet)); 160EXTERN int CHandlerSetRemove _ANSI_ARGS_((Tcl_Interp *interp, 161 Tcl_Obj *CONST expatObj, 162 char *handlerSetName)); 163EXTERN CHandlerSet * CHandlerSetCreate _ANSI_ARGS_((char *name)); 164EXTERN CHandlerSet * CHandlerSetGet _ANSI_ARGS_((Tcl_Interp *interp, 165 Tcl_Obj *CONST expatObj, 166 char *handlerSetName)); 167EXTERN void * CHandlerSetGetUserData _ANSI_ARGS_((Tcl_Interp *interp, 168 Tcl_Obj *CONST expatObj, 169 char *handlerSetName)); 170 171EXTERN TclGenExpatInfo * GetExpatInfo _ANSI_ARGS_((Tcl_Interp *interp, 172 Tcl_Obj *CONST expatObj)); 173