/* $Id$ Part of SWI-Prolog Author: Jan Wielemaker E-mail: jan@swi.psy.uva.nl WWW: http://www.swi-prolog.org Copyright (C): 1985-2002, University of Amsterdam This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library 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. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef SGML_PARSER_H_INCLUDED #define SGML_PARSER_H_INCLUDED #include "util.h" #include /******************************* * CALL-BACK * *******************************/ /* sgml_attribute->flags */ #define SGML_AT_DEFAULT 0x1 typedef struct _sgml_attribute { struct /* so we can free members */ { wchar_t *textW; /* UCS textual value */ long number; /* numeric value/length */ } value; dtd_attr *definition; /* DTD definition */ unsigned flags; /* additional flags */ } sgml_attribute; typedef struct _dtd_parser *dtd_parser_p; typedef int (*sgml_begin_element_f)(dtd_parser_p parser, dtd_element *e, int argc, sgml_attribute *argv); typedef int (*sgml_end_element_f)(dtd_parser_p parser, dtd_element *e); typedef int (*sgml_data_f)(dtd_parser_p parser, data_type type, int len, const wchar_t *text); typedef int (*sgml_wdata_f)(dtd_parser_p parser, data_type type, int len, const wchar_t *text); typedef int (*sgml_entity_f)(dtd_parser_p parser, dtd_entity *entity, int chr); typedef int (*sgml_pi_f)(dtd_parser_p parser, const ichar *pi); typedef int (*sgml_error_f)(dtd_parser_p parser, dtd_error *error); typedef int (*sgml_decl_f)(dtd_parser_p parser, const ichar *decl); #ifdef XMLNS typedef int (*xmlns_f)(dtd_parser_p parser, dtd_symbol *ns, dtd_symbol *url); #endif /******************************* * PARSER AND STATES * *******************************/ #define SGML_PARSER_MAGIC (0x834ab663) typedef enum { S_PCDATA, /* between declarations */ #ifdef UTF8 S_UTF8, /* Loading UTF-8 character */ #endif S_CDATA, /* non-parsed data */ S_RCDATA, /* CDATA+entities */ S_MSCDATA, /* */ S_EMSCDATA1, /* Seen ] in S_MSCDATA */ S_EMSCDATA2, /* Seen ]] in S_MSCDATA */ S_ECDATA1, /* Seen < in CDATA */ S_ECDATA2, /* Seen */ } dtdstate; typedef enum { DCL_DTD, /* DTD Declaration */ DCL_BEGIN, /* begin-tag */ DCL_END /* end-tag */ } dcl_type; typedef enum { MS_IGNORE, /* ignore this data */ MS_INCLUDE, /* process normally */ MS_CDATA, /* pass literally */ MS_RCDATA /* replace entities */ } marktype; typedef enum { EV_EXPLICIT, /* Explicit event */ EV_OMITTED, /* Omitted tag event */ EV_SHORTTAG, /* SHORTTAG event: flags */ #define SGML_PARSER_NODEFS 0x01 /* don't handle default atts */ #define SGML_PARSER_QUALIFY_ATTS 0x02 /* qualify attributes in XML mode */ typedef struct _dtd_parser { unsigned long magic; /* SGML_PARSER_MAGIC */ dtd *dtd; /* DTD we are building */ dtdstate state; /* current state */ dtdstate cdata_state; /* S_CDATA/S_RCDATA */ dtd_marked *marked; /* marked section stack */ marktype mark_state; /* processing mode */ dtd_element *empty_element; /* empty of seen */ sgml_environment *environments; /* Open environments */ data_mode dmode; /* How to handle characters */ int first; /* Just seen */ int waiting_for_net; /* waiting for / in