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