| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 1 | /* | 
 | 2 |  * parser.h : constants and stuff related to the XML parser. | 
 | 3 |  * | 
 | 4 |  * See Copyright for the status of this software. | 
 | 5 |  * | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 6 |  * Daniel.Veillard@w3.org | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 7 |  */ | 
 | 8 |  | 
 | 9 | #ifndef __XML_PARSER_H__ | 
 | 10 | #define __XML_PARSER_H__ | 
 | 11 |  | 
 | 12 | #include "tree.h" | 
 | 13 |  | 
 | 14 | #ifdef __cplusplus | 
 | 15 | extern "C" { | 
 | 16 | #endif | 
 | 17 |  | 
 | 18 | /* | 
 | 19 |  * Constants. | 
 | 20 |  */ | 
 | 21 | #define XML_DEFAULT_VERSION	"1.0" | 
 | 22 |  | 
| Daniel Veillard | d692aa4 | 1999-02-28 21:54:31 +0000 | [diff] [blame] | 23 | typedef void (* xmlParserInputDeallocate)(CHAR *); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 24 | typedef struct xmlParserInput { | 
 | 25 |     const char *filename;             /* The file analyzed, if any */ | 
 | 26 |     const CHAR *base;                 /* Base of the array to parse */ | 
 | 27 |     const CHAR *cur;                  /* Current char being parsed */ | 
 | 28 |     int line;                         /* Current line */ | 
 | 29 |     int col;                          /* Current column */ | 
| Daniel Veillard | d692aa4 | 1999-02-28 21:54:31 +0000 | [diff] [blame] | 30 |     xmlParserInputDeallocate free;    /* function to deallocate the base */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 31 | } xmlParserInput; | 
 | 32 | typedef xmlParserInput *xmlParserInputPtr; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 33 |  | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 34 | typedef struct _xmlParserNodeInfo { | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 35 |   const struct xmlNode* node; | 
 | 36 |   /* Position & line # that text that created the node begins & ends on */ | 
 | 37 |   unsigned long begin_pos; | 
 | 38 |   unsigned long begin_line; | 
 | 39 |   unsigned long end_pos; | 
 | 40 |   unsigned long end_line; | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 41 | } _xmlParserNodeInfo; | 
 | 42 | typedef _xmlParserNodeInfo xmlParserNodeInfo; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 43 |  | 
 | 44 | typedef struct xmlParserNodeInfoSeq { | 
 | 45 |   unsigned long maximum; | 
 | 46 |   unsigned long length; | 
 | 47 |   xmlParserNodeInfo* buffer; | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 48 | } _xmlParserNodeInfoSeq; | 
 | 49 | typedef _xmlParserNodeInfoSeq xmlParserNodeInfoSeq; | 
 | 50 | typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 51 |  | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 52 | typedef struct _xmlParserCtxt { | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 53 |     struct xmlSAXHandler *sax;        /* The SAX handler */ | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 54 |     void            *userData;        /* the document being built */ | 
 | 55 |     xmlDocPtr           myDoc;        /* the document being built */ | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 56 |     int            wellFormed;        /* is the document well formed */ | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 57 |     const CHAR     *version;	      /* the XML version string */ | 
 | 58 |     const CHAR     *encoding;         /* encoding, if any */ | 
 | 59 |     int             standalone;       /* standalone document */ | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 60 |  | 
 | 61 |     /* Input stream stack */ | 
 | 62 |     xmlParserInputPtr  input;         /* Current input stream */ | 
 | 63 |     int                inputNr;       /* Number of current input streams */ | 
 | 64 |     int                inputMax;      /* Max number of input streams */ | 
 | 65 |     xmlParserInputPtr *inputTab;      /* stack of inputs */ | 
 | 66 |  | 
 | 67 |     /* Node analysis stack */ | 
 | 68 |     xmlNodePtr         node;          /* Current parsed Node */ | 
 | 69 |     int                nodeNr;        /* Depth of the parsing stack */ | 
 | 70 |     int                nodeMax;       /* Max depth of the parsing stack */ | 
 | 71 |     xmlNodePtr        *nodeTab;       /* array of nodes */ | 
 | 72 |  | 
 | 73 |     int record_info;                  /* Whether node info should be kept */ | 
 | 74 |     xmlParserNodeInfoSeq node_seq;    /* info about each node parsed */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 75 | } _xmlParserCtxt; | 
 | 76 | typedef _xmlParserCtxt xmlParserCtxt; | 
 | 77 | typedef xmlParserCtxt *xmlParserCtxtPtr; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 78 |  | 
 | 79 | /* | 
 | 80 |  * a SAX Locator. | 
 | 81 |  */ | 
 | 82 |  | 
 | 83 | typedef struct xmlSAXLocator { | 
 | 84 |     const CHAR *(*getPublicId)(xmlParserCtxtPtr ctxt); | 
 | 85 |     const CHAR *(*getSystemId)(xmlParserCtxtPtr ctxt); | 
 | 86 |     int (*getLineNumber)(xmlParserCtxtPtr ctxt); | 
 | 87 |     int (*getColumnNumber)(xmlParserCtxtPtr ctxt); | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 88 | } _xmlSAXLocator; | 
 | 89 | typedef _xmlSAXLocator xmlSAXLocator; | 
 | 90 | typedef xmlSAXLocator *xmlSAXLocatorPtr; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 91 |  | 
 | 92 | /* | 
 | 93 |  * a SAX Exception. | 
 | 94 |  */ | 
 | 95 |  | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 96 | #include "entities.h" | 
 | 97 |  | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 98 | typedef xmlParserInputPtr (*resolveEntitySAXFunc) (xmlParserCtxtPtr ctxt, | 
 | 99 | 			    const CHAR *publicId, const CHAR *systemId); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 100 | typedef void (*internalSubsetSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name, | 
 | 101 |                             const CHAR *ExternalID, const CHAR *SystemID); | 
 | 102 | typedef xmlEntityPtr (*getEntitySAXFunc) (xmlParserCtxtPtr ctxt, | 
 | 103 |                             const CHAR *name); | 
 | 104 | typedef void (*entityDeclSAXFunc) (xmlParserCtxtPtr ctxt, | 
 | 105 |                             const CHAR *name, int type, const CHAR *publicId, | 
 | 106 | 			    const CHAR *systemId, CHAR *content); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 107 | typedef void (*notationDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name, | 
 | 108 | 			    const CHAR *publicId, const CHAR *systemId); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 109 | typedef void (*attributeDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *elem, | 
 | 110 |                             const CHAR *name, int type, int def, | 
 | 111 | 			    const CHAR *defaultValue, xmlEnumerationPtr tree); | 
 | 112 | typedef void (*elementDeclSAXFunc)(xmlParserCtxtPtr ctxt, const CHAR *name, | 
 | 113 | 			    int type, xmlElementContentPtr content); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 114 | typedef void (*unparsedEntityDeclSAXFunc)(xmlParserCtxtPtr ctxt, | 
 | 115 |                             const CHAR *name, const CHAR *publicId, | 
 | 116 | 			    const CHAR *systemId, const CHAR *notationName); | 
 | 117 | typedef void (*setDocumentLocatorSAXFunc) (xmlParserCtxtPtr ctxt, | 
 | 118 |                             xmlSAXLocatorPtr loc); | 
 | 119 | typedef void (*startDocumentSAXFunc) (xmlParserCtxtPtr ctxt); | 
 | 120 | typedef void (*endDocumentSAXFunc) (xmlParserCtxtPtr ctxt); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 121 | typedef void (*startElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name, | 
 | 122 |                             const CHAR **atts); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 123 | typedef void (*endElementSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name); | 
| Daniel Veillard | 11e0058 | 1998-10-24 18:27:49 +0000 | [diff] [blame] | 124 | typedef void (*attributeSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name, | 
 | 125 |                                   const CHAR *value); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 126 | typedef void (*referenceSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *name); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 127 | typedef void (*charactersSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *ch, | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 128 | 		            int len); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 129 | typedef void (*ignorableWhitespaceSAXFunc) (xmlParserCtxtPtr ctxt, | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 130 | 			    const CHAR *ch, int len); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 131 | typedef void (*processingInstructionSAXFunc) (xmlParserCtxtPtr ctxt, | 
 | 132 |                             const CHAR *target, const CHAR *data); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 133 | typedef void (*commentSAXFunc) (xmlParserCtxtPtr ctxt, const CHAR *value); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 134 | typedef void (*warningSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...); | 
 | 135 | typedef void (*errorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...); | 
 | 136 | typedef void (*fatalErrorSAXFunc) (xmlParserCtxtPtr ctxt, const char *msg, ...); | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 137 | typedef int (*isStandaloneSAXFunc) (xmlParserCtxtPtr ctxt); | 
 | 138 | typedef int (*hasInternalSubsetSAXFunc) (xmlParserCtxtPtr ctxt); | 
 | 139 | typedef int (*hasExternalSubsetSAXFunc) (xmlParserCtxtPtr ctxt); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 140 |  | 
 | 141 | typedef struct xmlSAXHandler { | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 142 |     internalSubsetSAXFunc internalSubset; | 
 | 143 |     isStandaloneSAXFunc isStandalone; | 
 | 144 |     hasInternalSubsetSAXFunc hasInternalSubset; | 
 | 145 |     hasExternalSubsetSAXFunc hasExternalSubset; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 146 |     resolveEntitySAXFunc resolveEntity; | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 147 |     getEntitySAXFunc getEntity; | 
 | 148 |     entityDeclSAXFunc entityDecl; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 149 |     notationDeclSAXFunc notationDecl; | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 150 |     attributeDeclSAXFunc attributeDecl; | 
 | 151 |     elementDeclSAXFunc elementDecl; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 152 |     unparsedEntityDeclSAXFunc unparsedEntityDecl; | 
 | 153 |     setDocumentLocatorSAXFunc setDocumentLocator; | 
 | 154 |     startDocumentSAXFunc startDocument; | 
 | 155 |     endDocumentSAXFunc endDocument; | 
 | 156 |     startElementSAXFunc startElement; | 
 | 157 |     endElementSAXFunc endElement; | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 158 |     referenceSAXFunc reference; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 159 |     charactersSAXFunc characters; | 
 | 160 |     ignorableWhitespaceSAXFunc ignorableWhitespace; | 
 | 161 |     processingInstructionSAXFunc processingInstruction; | 
| Daniel Veillard | 517752b | 1999-04-05 12:20:10 +0000 | [diff] [blame^] | 162 |     commentSAXFunc comment; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 163 |     warningSAXFunc warning; | 
 | 164 |     errorSAXFunc error; | 
 | 165 |     fatalErrorSAXFunc fatalError; | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 166 | } xmlSAXHandler; | 
 | 167 | typedef xmlSAXHandler *xmlSAXHandlerPtr; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 168 |  | 
 | 169 | /* | 
 | 170 |  * Global variables: just the SAX interface tables we are looking for full | 
 | 171 |  *      reentrancy of the code ! | 
 | 172 |  */ | 
| Daniel Veillard | 151b1b0 | 1998-09-23 00:49:46 +0000 | [diff] [blame] | 173 | extern xmlSAXLocator xmlDefaultSAXLocator; | 
 | 174 | extern xmlSAXHandler xmlDefaultSAXHandler; | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 175 |  | 
| Daniel Veillard | ccb0963 | 1998-10-27 06:21:04 +0000 | [diff] [blame] | 176 | #include "entities.h" | 
| Daniel Veillard | d109e37 | 1999-03-05 06:26:45 +0000 | [diff] [blame] | 177 | #include "xml-error.h" | 
| Daniel Veillard | ccb0963 | 1998-10-27 06:21:04 +0000 | [diff] [blame] | 178 |  | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 179 | /* | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 180 |  * CHAR handling | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 181 |  */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 182 | CHAR *xmlStrdup(const CHAR *cur); | 
 | 183 | CHAR *xmlStrndup(const CHAR *cur, int len); | 
 | 184 | CHAR *xmlStrchr(const CHAR *str, CHAR val); | 
 | 185 | int xmlStrcmp(const CHAR *str1, const CHAR *str2); | 
 | 186 | int xmlStrncmp(const CHAR *str1, const CHAR *str2, int len); | 
 | 187 | int xmlStrlen(const CHAR *str); | 
 | 188 | CHAR *xmlStrcat(CHAR *cur, const CHAR *add); | 
 | 189 | CHAR *xmlStrncat(CHAR *cur, const CHAR *add, int len); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 190 |  | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 191 | /* | 
 | 192 |  * Interfaces | 
 | 193 |  */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 194 | xmlDocPtr xmlParseDoc(CHAR *cur); | 
 | 195 | xmlDocPtr xmlParseMemory(char *buffer, int size); | 
 | 196 | xmlDocPtr xmlParseFile(const char *filename); | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 197 |  | 
 | 198 | /* | 
 | 199 |  * Recovery mode  | 
 | 200 |  */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 201 | xmlDocPtr xmlRecoverDoc(CHAR *cur); | 
 | 202 | xmlDocPtr xmlRecoverMemory(char *buffer, int size); | 
 | 203 | xmlDocPtr xmlRecoverFile(const char *filename); | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 204 |  | 
 | 205 | /* | 
 | 206 |  * Internal routines | 
 | 207 |  */ | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 208 | int xmlParseDocument(xmlParserCtxtPtr ctxt); | 
 | 209 | xmlDocPtr xmlSAXParseDoc(xmlSAXHandlerPtr sax, CHAR *cur, int recovery); | 
 | 210 | xmlDocPtr xmlSAXParseMemory(xmlSAXHandlerPtr sax, char *buffer, | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 211 |                                    int size, int recovery); | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 212 | xmlDocPtr xmlSAXParseFile(xmlSAXHandlerPtr sax, const char *filename, | 
| Daniel Veillard | 39a1f9a | 1999-01-17 19:11:59 +0000 | [diff] [blame] | 213 |                                  int recovery); | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 214 | void xmlInitParserCtxt(xmlParserCtxtPtr ctxt); | 
 | 215 | void xmlClearParserCtxt(xmlParserCtxtPtr ctxt); | 
 | 216 | void xmlSetupParserForBuffer(xmlParserCtxtPtr ctxt, const CHAR* buffer, | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 217 |                                     const char* filename); | 
 | 218 |  | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 219 | const xmlParserNodeInfo* xmlParserFindNodeInfo(const xmlParserCtxt* ctxt, | 
 | 220 |                                                const xmlNode* node); | 
 | 221 | void xmlInitNodeInfoSeq(xmlParserNodeInfoSeqPtr seq); | 
 | 222 | void xmlClearNodeInfoSeq(xmlParserNodeInfoSeqPtr seq); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 223 | unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq, | 
 | 224 |                                          const xmlNode* node); | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 225 | void xmlParserAddNodeInfo(xmlParserCtxtPtr ctxt, | 
 | 226 |                           const xmlParserNodeInfo* info); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 227 |  | 
| Daniel Veillard | 1e346af | 1999-02-22 10:33:01 +0000 | [diff] [blame] | 228 | void xmlDefaultSAXHandlerInit(void); | 
| Daniel Veillard | 260a68f | 1998-08-13 03:39:55 +0000 | [diff] [blame] | 229 | #ifdef __cplusplus | 
 | 230 | } | 
 | 231 | #endif | 
 | 232 |  | 
 | 233 | #endif /* __XML_PARSER_H__ */ | 
 | 234 |  |