parser.h
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:17k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. /*
  2.  * parser.h : Interfaces, constants and types related to the XML parser.
  3.  *
  4.  * See Copyright for the status of this software.
  5.  *
  6.  * Daniel.Veillard@w3.org
  7.  */
  8. #ifndef __XML_PARSER_H__
  9. #define __XML_PARSER_H__
  10. #include <libxml/tree.h>
  11. #include <libxml/valid.h>
  12. #include <libxml/xmlIO.h>
  13. #include <libxml/entities.h>
  14. #ifdef __cplusplus
  15. extern "C" {
  16. #endif
  17. /*
  18.  * Constants.
  19.  */
  20. #define XML_DEFAULT_VERSION "1.0"
  21. /**
  22.  * an xmlParserInput is an input flow for the XML processor.
  23.  * Each entity parsed is associated an xmlParserInput (except the
  24.  * few predefined ones). This is the case both for internal entities
  25.  * - in which case the flow is already completely in memory - or
  26.  * external entities - in which case we use the buf structure for
  27.  * progressive reading and I18N conversions to the internal UTF-8 format.
  28.  */
  29. typedef void (* xmlParserInputDeallocate)(xmlChar *);
  30. typedef struct _xmlParserInput xmlParserInput;
  31. typedef xmlParserInput *xmlParserInputPtr;
  32. struct _xmlParserInput {
  33.     /* Input buffer */
  34.     xmlParserInputBufferPtr buf;      /* UTF-8 encoded buffer */
  35.     const char *filename;             /* The file analyzed, if any */
  36.     const char *directory;            /* the directory/base of teh file */
  37.     const xmlChar *base;              /* Base of the array to parse */
  38.     const xmlChar *cur;               /* Current char being parsed */
  39.     int length;                       /* length if known */
  40.     int line;                         /* Current line */
  41.     int col;                          /* Current column */
  42.     int consumed;                     /* How many xmlChars already consumed */
  43.     xmlParserInputDeallocate free;    /* function to deallocate the base */
  44.     const xmlChar *encoding;          /* the encoding string for entity */
  45.     const xmlChar *version;           /* the version string for entity */
  46.     int standalone;                   /* Was that entity marked standalone */
  47. };
  48. /**
  49.  * the parser can be asked to collect Node informations, i.e. at what
  50.  * place in the file they were detected. 
  51.  * NOTE: This is off by default and not very well tested.
  52.  */
  53. typedef struct _xmlParserNodeInfo xmlParserNodeInfo;
  54. typedef xmlParserNodeInfo *xmlParserNodeInfoPtr;
  55. struct _xmlParserNodeInfo {
  56.   const struct _xmlNode* node;
  57.   /* Position & line # that text that created the node begins & ends on */
  58.   unsigned long begin_pos;
  59.   unsigned long begin_line;
  60.   unsigned long end_pos;
  61.   unsigned long end_line;
  62. };
  63. typedef struct _xmlParserNodeInfoSeq xmlParserNodeInfoSeq;
  64. typedef xmlParserNodeInfoSeq *xmlParserNodeInfoSeqPtr;
  65. struct _xmlParserNodeInfoSeq {
  66.   unsigned long maximum;
  67.   unsigned long length;
  68.   xmlParserNodeInfo* buffer;
  69. };
  70. /**
  71.  * The parser is now working also as a state based parser
  72.  * The recursive one use the stagte info for entities processing
  73.  */
  74. typedef enum {
  75.     XML_PARSER_EOF = -1, /* nothing is to be parsed */
  76.     XML_PARSER_START = 0, /* nothing has been parsed */
  77.     XML_PARSER_MISC, /* Misc* before int subset */
  78.     XML_PARSER_PI, /* Whithin a processing instruction */
  79.     XML_PARSER_DTD, /* within some DTD content */
  80.     XML_PARSER_PROLOG, /* Misc* after internal subset */
  81.     XML_PARSER_COMMENT, /* within a comment */
  82.     XML_PARSER_START_TAG, /* within a start tag */
  83.     XML_PARSER_CONTENT, /* within the content */
  84.     XML_PARSER_CDATA_SECTION, /* within a CDATA section */
  85.     XML_PARSER_END_TAG, /* within a closing tag */
  86.     XML_PARSER_ENTITY_DECL, /* within an entity declaration */
  87.     XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */
  88.     XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */
  89.     XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */
  90.     XML_PARSER_EPILOG  /* the Misc* after the last end tag */
  91. } xmlParserInputState;
  92. /**
  93.  * The parser context.
  94.  * NOTE This doesn't completely defines the parser state, the (current ?)
  95.  *      design of the parser uses recursive function calls since this allow
  96.  *      and easy mapping from the production rules of the specification
  97.  *      to the actual code. The drawback is that the actual function call
  98.  *      also reflect the parser state. However most of the parsing routines
  99.  *      takes as the only argument the parser context pointer, so migrating
  100.  *      to a state based parser for progressive parsing shouldn't be too hard.
  101.  */
  102. typedef struct _xmlParserCtxt xmlParserCtxt;
  103. typedef xmlParserCtxt *xmlParserCtxtPtr;
  104. struct _xmlParserCtxt {
  105.     struct _xmlSAXHandler *sax;       /* The SAX handler */
  106.     void            *userData;        /* the document being built */
  107.     xmlDocPtr           myDoc;        /* the document being built */
  108.     int            wellFormed;        /* is the document well formed */
  109.     int       replaceEntities;        /* shall we replace entities ? */
  110.     const xmlChar       *version;        /* the XML version string */
  111.     const xmlChar      *encoding;        /* encoding, if any */
  112.     int            standalone;        /* standalone document */
  113.     int                  html;        /* are we parsing an HTML document */
  114.     /* Input stream stack */
  115.     xmlParserInputPtr  input;         /* Current input stream */
  116.     int                inputNr;       /* Number of current input streams */
  117.     int                inputMax;      /* Max number of input streams */
  118.     xmlParserInputPtr *inputTab;      /* stack of inputs */
  119.     /* Node analysis stack only used for DOM building */
  120.     xmlNodePtr         node;          /* Current parsed Node */
  121.     int                nodeNr;        /* Depth of the parsing stack */
  122.     int                nodeMax;       /* Max depth of the parsing stack */
  123.     xmlNodePtr        *nodeTab;       /* array of nodes */
  124.     int record_info;                  /* Whether node info should be kept */
  125.     xmlParserNodeInfoSeq node_seq;    /* info about each node parsed */
  126.     int errNo;                        /* error code */
  127.     int     hasExternalSubset;        /* reference and external subset */
  128.     int             hasPErefs;        /* the internal subset has PE refs */
  129.     int              external;        /* are we parsing an external entity */
  130.     int                 valid;        /* is the document valid */
  131.     int              validate;        /* shall we try to validate ? */
  132.     xmlValidCtxt        vctxt;        /* The validity context */
  133.     xmlParserInputState instate;      /* current type of input */
  134.     int                 token;        /* next char look-ahead */    
  135.     char           *directory;        /* the data directory */
  136.     /* Node name stack */
  137.     xmlChar           *name;          /* Current parsed Node */
  138.     int                nameNr;        /* Depth of the parsing stack */
  139.     int                nameMax;       /* Max depth of the parsing stack */
  140.     xmlChar *         *nameTab;       /* array of nodes */
  141.     long               nbChars;       /* number of xmlChar processed */
  142.     long            checkIndex;       /* used by progressive parsing lookup */
  143.     int             keepBlanks;       /* ugly but ... */
  144.     int             disableSAX;       /* SAX callbacks are disabled */
  145.     int               inSubset;       /* Parsing is in int 1/ext 2 subset */
  146.     xmlChar *          intSubName;    /* name of subset */
  147.     xmlChar *          extSubURI;     /* URI of external subset */
  148.     xmlChar *          extSubSystem;  /* SYSTEM ID of external subset */
  149.     /* xml:space values */
  150.     int *              space;         /* Should the parser preserve spaces */
  151.     int                spaceNr;       /* Depth of the parsing stack */
  152.     int                spaceMax;      /* Max depth of the parsing stack */
  153.     int *              spaceTab;      /* array of space infos */
  154.     int                depth;         /* to prevent entity substitution loops */
  155.     xmlParserInputPtr  entity;      /* used to check entities boundaries */
  156. };
  157. /**
  158.  * a SAX Locator.
  159.  */
  160. typedef struct _xmlSAXLocator xmlSAXLocator;
  161. typedef xmlSAXLocator *xmlSAXLocatorPtr;
  162. struct _xmlSAXLocator {
  163.     const xmlChar *(*getPublicId)(void *ctx);
  164.     const xmlChar *(*getSystemId)(void *ctx);
  165.     int (*getLineNumber)(void *ctx);
  166.     int (*getColumnNumber)(void *ctx);
  167. };
  168. /**
  169.  * a SAX handler is bunch of callbacks called by the parser when processing
  170.  * of the input generate data or structure informations.
  171.  */
  172. typedef xmlParserInputPtr (*resolveEntitySAXFunc) (void *ctx,
  173.     const xmlChar *publicId, const xmlChar *systemId);
  174. typedef void (*internalSubsetSAXFunc) (void *ctx, const xmlChar *name,
  175.                             const xmlChar *ExternalID, const xmlChar *SystemID);
  176. typedef void (*externalSubsetSAXFunc) (void *ctx, const xmlChar *name,
  177.                             const xmlChar *ExternalID, const xmlChar *SystemID);
  178. typedef xmlEntityPtr (*getEntitySAXFunc) (void *ctx,
  179.                             const xmlChar *name);
  180. typedef xmlEntityPtr (*getParameterEntitySAXFunc) (void *ctx,
  181.                             const xmlChar *name);
  182. typedef void (*entityDeclSAXFunc) (void *ctx,
  183.                             const xmlChar *name, int type, const xmlChar *publicId,
  184.     const xmlChar *systemId, xmlChar *content);
  185. typedef void (*notationDeclSAXFunc)(void *ctx, const xmlChar *name,
  186.     const xmlChar *publicId, const xmlChar *systemId);
  187. typedef void (*attributeDeclSAXFunc)(void *ctx, const xmlChar *elem,
  188.                             const xmlChar *name, int type, int def,
  189.     const xmlChar *defaultValue, xmlEnumerationPtr tree);
  190. typedef void (*elementDeclSAXFunc)(void *ctx, const xmlChar *name,
  191.     int type, xmlElementContentPtr content);
  192. typedef void (*unparsedEntityDeclSAXFunc)(void *ctx,
  193.                             const xmlChar *name, const xmlChar *publicId,
  194.     const xmlChar *systemId, const xmlChar *notationName);
  195. typedef void (*setDocumentLocatorSAXFunc) (void *ctx,
  196.                             xmlSAXLocatorPtr loc);
  197. typedef void (*startDocumentSAXFunc) (void *ctx);
  198. typedef void (*endDocumentSAXFunc) (void *ctx);
  199. typedef void (*startElementSAXFunc) (void *ctx, const xmlChar *name,
  200.                             const xmlChar **atts);
  201. typedef void (*endElementSAXFunc) (void *ctx, const xmlChar *name);
  202. typedef void (*attributeSAXFunc) (void *ctx, const xmlChar *name,
  203.                                   const xmlChar *value);
  204. typedef void (*referenceSAXFunc) (void *ctx, const xmlChar *name);
  205. typedef void (*charactersSAXFunc) (void *ctx, const xmlChar *ch,
  206.             int len);
  207. typedef void (*ignorableWhitespaceSAXFunc) (void *ctx,
  208.     const xmlChar *ch, int len);
  209. typedef void (*processingInstructionSAXFunc) (void *ctx,
  210.                             const xmlChar *target, const xmlChar *data);
  211. typedef void (*commentSAXFunc) (void *ctx, const xmlChar *value);
  212. typedef void (*cdataBlockSAXFunc) (void *ctx, const xmlChar *value, int len);
  213. typedef void (*warningSAXFunc) (void *ctx, const char *msg, ...);
  214. typedef void (*errorSAXFunc) (void *ctx, const char *msg, ...);
  215. typedef void (*fatalErrorSAXFunc) (void *ctx, const char *msg, ...);
  216. typedef int (*isStandaloneSAXFunc) (void *ctx);
  217. typedef int (*hasInternalSubsetSAXFunc) (void *ctx);
  218. typedef int (*hasExternalSubsetSAXFunc) (void *ctx);
  219. typedef struct _xmlSAXHandler xmlSAXHandler;
  220. typedef xmlSAXHandler *xmlSAXHandlerPtr;
  221. struct _xmlSAXHandler {
  222.     internalSubsetSAXFunc internalSubset;
  223.     isStandaloneSAXFunc isStandalone;
  224.     hasInternalSubsetSAXFunc hasInternalSubset;
  225.     hasExternalSubsetSAXFunc hasExternalSubset;
  226.     resolveEntitySAXFunc resolveEntity;
  227.     getEntitySAXFunc getEntity;
  228.     entityDeclSAXFunc entityDecl;
  229.     notationDeclSAXFunc notationDecl;
  230.     attributeDeclSAXFunc attributeDecl;
  231.     elementDeclSAXFunc elementDecl;
  232.     unparsedEntityDeclSAXFunc unparsedEntityDecl;
  233.     setDocumentLocatorSAXFunc setDocumentLocator;
  234.     startDocumentSAXFunc startDocument;
  235.     endDocumentSAXFunc endDocument;
  236.     startElementSAXFunc startElement;
  237.     endElementSAXFunc endElement;
  238.     referenceSAXFunc reference;
  239.     charactersSAXFunc characters;
  240.     ignorableWhitespaceSAXFunc ignorableWhitespace;
  241.     processingInstructionSAXFunc processingInstruction;
  242.     commentSAXFunc comment;
  243.     warningSAXFunc warning;
  244.     errorSAXFunc error;
  245.     fatalErrorSAXFunc fatalError;
  246.     getParameterEntitySAXFunc getParameterEntity;
  247.     cdataBlockSAXFunc cdataBlock;
  248.     externalSubsetSAXFunc externalSubset;
  249. };
  250. /**
  251.  * External entity loaders types
  252.  */
  253. typedef xmlParserInputPtr (*xmlExternalEntityLoader)(const char *URL,
  254.      const char *ID,
  255.      xmlParserCtxtPtr context);
  256. /**
  257.  * Global variables: just the default SAX interface tables and XML
  258.  * version infos.
  259.  */
  260. extern const char *xmlParserVersion;
  261. extern xmlSAXLocator xmlDefaultSAXLocator;
  262. extern xmlSAXHandler xmlDefaultSAXHandler;
  263. extern xmlSAXHandler htmlDefaultSAXHandler;
  264. /**
  265.  * entity substitution default behaviour.
  266.  */
  267. extern int xmlSubstituteEntitiesDefaultValue;
  268. extern int xmlGetWarningsDefaultValue;
  269. /**
  270.  * Cleanup
  271.  */
  272. void xmlCleanupParser (void);
  273. /**
  274.  * Input functions
  275.  */
  276. int xmlParserInputRead (xmlParserInputPtr in,
  277.  int len);
  278. int xmlParserInputGrow (xmlParserInputPtr in,
  279.  int len);
  280. /**
  281.  * xmlChar handling
  282.  */
  283. xmlChar * xmlStrdup (const xmlChar *cur);
  284. xmlChar * xmlStrndup (const xmlChar *cur,
  285.  int len);
  286. xmlChar * xmlStrsub (const xmlChar *str,
  287.  int start,
  288.  int len);
  289. const xmlChar * xmlStrchr (const xmlChar *str,
  290.  xmlChar val);
  291. const xmlChar * xmlStrstr (const xmlChar *str,
  292.  xmlChar *val);
  293. int xmlStrcmp (const xmlChar *str1,
  294.  const xmlChar *str2);
  295. int xmlStrncmp (const xmlChar *str1,
  296.  const xmlChar *str2,
  297.  int len);
  298. int xmlStrlen (const xmlChar *str);
  299. xmlChar * xmlStrcat (xmlChar *cur,
  300.  const xmlChar *add);
  301. xmlChar * xmlStrncat (xmlChar *cur,
  302.  const xmlChar *add,
  303.  int len);
  304. /**
  305.  * Basic parsing Interfaces
  306.  */
  307. xmlDocPtr xmlParseDoc (xmlChar *cur);
  308. xmlDocPtr xmlParseMemory (char *buffer,
  309.  int size);
  310. xmlDocPtr xmlParseFile (const char *filename);
  311. int xmlSubstituteEntitiesDefault(int val);
  312. int xmlKeepBlanksDefault (int val);
  313. /**
  314.  * Recovery mode 
  315.  */
  316. xmlDocPtr xmlRecoverDoc (xmlChar *cur);
  317. xmlDocPtr xmlRecoverMemory (char *buffer,
  318.  int size);
  319. xmlDocPtr xmlRecoverFile (const char *filename);
  320. /**
  321.  * Less common routines and SAX interfaces
  322.  */
  323. int xmlParseDocument (xmlParserCtxtPtr ctxt);
  324. xmlDocPtr xmlSAXParseDoc (xmlSAXHandlerPtr sax,
  325.  xmlChar *cur,
  326.  int recovery);
  327. int xmlSAXUserParseFile (xmlSAXHandlerPtr sax,
  328.  void *user_data,
  329.  const char *filename);
  330. int xmlSAXUserParseMemory (xmlSAXHandlerPtr sax,
  331.  void *user_data,
  332.  char *buffer,
  333.  int size);
  334. xmlDocPtr xmlSAXParseMemory (xmlSAXHandlerPtr sax,
  335.  char *buffer,
  336.                                      int size,
  337.  int recovery);
  338. xmlDocPtr xmlSAXParseFile (xmlSAXHandlerPtr sax,
  339.  const char *filename,
  340.  int recovery);
  341. xmlDtdPtr xmlParseDTD (const xmlChar *ExternalID,
  342.  const xmlChar *SystemID);
  343. xmlDtdPtr xmlSAXParseDTD (xmlSAXHandlerPtr sax,
  344.  const xmlChar *ExternalID,
  345.  const xmlChar *SystemID);
  346. int xmlParseBalancedChunkMemory(xmlDocPtr doc,
  347.  xmlSAXHandlerPtr sax,
  348.  void *user_data,
  349.  int depth,
  350.  const xmlChar *string,
  351.  xmlNodePtr *list);
  352. int xmlParseExternalEntity (xmlDocPtr doc,
  353.  xmlSAXHandlerPtr sax,
  354.  void *user_data,
  355.  int depth,
  356.  const xmlChar *URL,
  357.  const xmlChar *ID,
  358.  xmlNodePtr *list);
  359. /**
  360.  * SAX initialization routines
  361.  */
  362. void xmlDefaultSAXHandlerInit(void);
  363. void htmlDefaultSAXHandlerInit(void);
  364. /**
  365.  * Parser contexts handling.
  366.  */
  367. void xmlInitParserCtxt (xmlParserCtxtPtr ctxt);
  368. void xmlClearParserCtxt (xmlParserCtxtPtr ctxt);
  369. void xmlFreeParserCtxt (xmlParserCtxtPtr ctxt);
  370. void xmlSetupParserForBuffer (xmlParserCtxtPtr ctxt,
  371.  const xmlChar* buffer,
  372.  const char* filename);
  373. xmlParserCtxtPtr xmlCreateDocParserCtxt (xmlChar *cur);
  374. /**
  375.  * Interfaces for the Push mode
  376.  */
  377. xmlParserCtxtPtr xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax,
  378.  void *user_data,
  379.  const char *chunk,
  380.  int size,
  381.  const char *filename);
  382. int  xmlParseChunk (xmlParserCtxtPtr ctxt,
  383.  const char *chunk,
  384.  int size,
  385.  int terminate);
  386. /**
  387.  * Special I/O mode
  388.  */
  389. xmlParserCtxtPtr xmlCreateIOParserCtxt (xmlSAXHandlerPtr sax,
  390.  void *user_data,
  391.  xmlInputReadCallback   ioread,
  392.  xmlInputCloseCallback  ioclose,
  393.  void *ioctx,
  394.  xmlCharEncoding enc);
  395. xmlParserInputPtr xmlNewIOInputStream (xmlParserCtxtPtr ctxt,
  396.  xmlParserInputBufferPtr input,
  397.  xmlCharEncoding enc);
  398. /**
  399.  * Node infos
  400.  */
  401. const xmlParserNodeInfo*
  402. xmlParserFindNodeInfo (const xmlParserCtxt* ctxt,
  403.                                                const xmlNode* node);
  404. void xmlInitNodeInfoSeq (xmlParserNodeInfoSeqPtr seq);
  405. void xmlClearNodeInfoSeq (xmlParserNodeInfoSeqPtr seq);
  406. unsigned long xmlParserFindNodeInfoIndex(const xmlParserNodeInfoSeq* seq,
  407.                                          const xmlNode* node);
  408. void xmlParserAddNodeInfo (xmlParserCtxtPtr ctxt,
  409.  const xmlParserNodeInfo* info);
  410. /*
  411.  * External entities handling actually implemented in xmlIO
  412.  */
  413. void xmlSetExternalEntityLoader(xmlExternalEntityLoader f);
  414. xmlExternalEntityLoader
  415. xmlGetExternalEntityLoader(void);
  416. xmlParserInputPtr
  417. xmlLoadExternalEntity (const char *URL,
  418.  const char *ID,
  419.  xmlParserCtxtPtr context);
  420. #ifdef __cplusplus
  421. }
  422. #endif
  423. #endif /* __XML_PARSER_H__ */