[DRE-commits] [ruby-xmlparser] 03/04: remove move-files-to-ext.patch; replaced by code in debian/rules
Antonio Terceiro
terceiro at moszumanska.debian.org
Tue Apr 19 13:14:33 UTC 2016
This is an automated email from the git hooks/post-receive script.
terceiro pushed a commit to branch master
in repository ruby-xmlparser.
commit 2d2c94aee20fad325321b661950e0a29dc7c9119
Author: Antonio Terceiro <terceiro at debian.org>
Date: Tue Apr 19 09:48:45 2016 -0300
remove move-files-to-ext.patch; replaced by code in debian/rules
---
debian/changelog | 2 +
debian/patches/move-files-to-ext.patch | 4813 ------------------------------
debian/patches/series | 1 -
debian/patches/xmlparser-ftbfs-fix.patch | 4 +-
debian/rules | 10 +-
5 files changed, 12 insertions(+), 4818 deletions(-)
diff --git a/debian/changelog b/debian/changelog
index 76b0cc8..e3419b3 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -5,6 +5,8 @@ ruby-xmlparser (0.7.3-2) unstable; urgency=medium
[ Antonio Terceiro]
* Add minimal test suite (just a `require` test)
* Refresh patches
+ * remove move-files-to-ext.patch; replaced by code in debian/rules
+
[ Cédric Boutillier ]
* Bump Standards-Version to 3.9.7 (no changes needed)
diff --git a/debian/patches/move-files-to-ext.patch b/debian/patches/move-files-to-ext.patch
deleted file mode 100644
index 1b21b55..0000000
--- a/debian/patches/move-files-to-ext.patch
+++ /dev/null
@@ -1,4813 +0,0 @@
-Description: Move C files to ext/
- This is required to avoid the double-installation of files in lib/ by
- extconf.rb (see #630641)
-Origin: vendor
-
---- /dev/null
-+++ b/ext/encoding.h
-@@ -0,0 +1,91 @@
-+/*****************************************************************
-+** encoding.h
-+**
-+** Copyright 1998 Clark Cooper
-+** All rights reserved.
-+**
-+** This program is free software; you can redistribute it and/or
-+** modify it under the same terms as Perl itself.
-+*/
-+
-+#ifndef ENCODING_H
-+#define ENCODING_H 1
-+
-+#define ENCMAP_MAGIC 0xfeebface
-+
-+typedef struct prefixmap {
-+ unsigned char min;
-+ unsigned char len; /* 0 => 256 */
-+ unsigned short bmap_start;
-+ unsigned char ispfx[32];
-+ unsigned char ischar[32];
-+} PrefixMap;
-+
-+typedef struct encinf
-+{
-+ unsigned short prefixes_size;
-+ unsigned short bytemap_size;
-+ int firstmap[256];
-+ PrefixMap *prefixes;
-+ unsigned short *bytemap;
-+} Encinfo;
-+
-+typedef struct encmaphdr
-+{
-+ unsigned int magic;
-+ char name[40];
-+ unsigned short pfsize;
-+ unsigned short bmsize;
-+ int map[256];
-+} Encmap_Header;
-+
-+/*================================================================
-+** Structure of Encoding map binary encoding
-+**
-+** Note that all shorts and ints are in network order,
-+** so when packing or unpacking with perl, use 'n' and 'N' respectively.
-+** In C, use the htonl family of functions.
-+**
-+** The basic structure is:
-+**
-+** _______________________
-+** |Header (including map expat needs for 1st byte)
-+** |PrefixMap * pfsize
-+** | This section isn't included for single-byte encodings.
-+** | For multiple byte encodings, when a byte represents a prefix
-+** | then it indexes into this vector instead of mapping to a
-+** | Unicode character. The PrefixMap type is declared above. The
-+** | ispfx and ischar fields are bitvectors indicating whether
-+** | the byte being mapped is a prefix or character respectively.
-+** | If neither is set, then the character is not mapped to Unicode.
-+** |
-+** | The min field is the 1st byte mapped for this prefix; the
-+** | len field is the number of bytes mapped; and bmap_start is
-+** | the starting index of the map for this prefix in the overall
-+** | map (next section).
-+** |unsigned short * bmsize
-+** | This section also is omitted for single-byte encodings.
-+** | Each short is either a Unicode scalar or an index into the
-+** | PrefixMap vector.
-+**
-+** The header for these files is declared above as the Encmap_Header type.
-+** The magic field is a magic number which should match the ENCMAP_MAGIC
-+** macro above. The next 40 bytes stores IANA registered name for the
-+** encoding. The pfsize field holds the number of PrefixMaps, which should
-+** be zero for single byte encodings. The bmsize field holds the number of
-+** shorts used for the overall map.
-+**
-+** The map field contains either the Unicode scalar encoded by the 1st byte
-+** or -n where n is the number of bytes that such a 1st byte implies (Expat
-+** requires that the number of bytes to encode a character is indicated by
-+** the 1st byte) or -1 if the byte doesn't map to any Unicode character.
-+**
-+** If the encoding is a multiple byte encoding, then there will be PrefixMap
-+** and character map sections. The 1st PrefixMap (index 0), covers a range
-+** of bytes that includes all 1st byte prefixes.
-+**
-+** Look at convert_to_unicode in Expat.xs to see how this data structure
-+** is used.
-+*/
-+
-+#endif /* ndef ENCODING_H */
---- /dev/null
-+++ b/ext/extconf.rb
-@@ -0,0 +1,59 @@
-+#
-+# ruby extconf.rb
-+# --with-perl-enc-map[=/path/to/enc-map]
-+# --with-expat-dir=/path/to/expat
-+# --with-expat-lib=/path/to/expat/lib
-+# --with-expat-include=/path/to/expat/include
-+#
-+require 'mkmf'
-+
-+
-+xml_enc_path = with_config("perl-enc-map")
-+if xml_enc_path == true
-+ ## Encoding maps may be stored in $perl_archlib/XML/Parser/Encodins/
-+ #perl_archlib = '/usr/lib/perl5/site_perl/5.005/i586-linux'
-+ #perl_archlib = '/usr/local/lib'
-+ perl= ENV['PERL'] || 'perl'
-+ perl_archlib = `#{perl} -e 'use Config; print $Config{"archlib"}'`
-+ xml_enc_path = perl_archlib + "/XML/Parser/Encodings"
-+end
-+
-+##cwd=`pwd`.chomp!
-+##$CFLAGS="-I#{cwd}/expat/xmlparse -I#{cwd}/expat/xmltok" +
-+## ' -DXML_ENC_PATH=getenv\(\"XML_ENC_PATH\"\)' +
-+## " -DNEW_EXPAT"
-+#$CFLAGS = "-I#{cwd}/expat/xmlparse -I#{cwd}/expat/xmltok"
-+#$LDFLAGS = "-L#{cwd}/expat/xmlparse -Wl,-rpath,/usr/local/lib"
-+#$LDFLAGS = "-L#{cwd}/expat/xmlparse"
-+dir_config("expat")
-+#dir_config("xmltok")
-+#dir_config("xmlparse")
-+if xml_enc_path
-+ $CFLAGS += " -DXML_ENC_PATH=\\\"#{xml_enc_path}\\\""
-+end
-+
-+#if have_header("xmlparse.h") || have_header("expat.h")
-+if have_header("expat.h") || have_header("xmlparse.h")
-+ if have_library("expat", "XML_ParserCreate") ||
-+ have_library("xmltok", "XML_ParserCreate") ||
-+ have_library("libexpat", "XML_ParserCreate")
-+ if have_func("XML_SetNotStandaloneHandler")
-+ $CFLAGS += " -DNEW_EXPAT"
-+ end
-+ if have_func("XML_SetParamEntityParsing")
-+ $CFLAGS += " -DXML_DTD"
-+ end
-+# if have_func("XML_SetExternalParsedEntityDeclHandler")
-+# $CFLAGS += " -DEXPAT_1_2"
-+# end
-+ have_func("XML_SetDoctypeDeclHandler")
-+ have_func("XML_ParserReset")
-+ have_func("XML_SetSkippedEntityHandler")
-+ have_func("XML_GetFeatureList")
-+ have_func("XML_UseForeignDTD")
-+ have_func("XML_GetIdAttributeIndex")
-+ have_library("socket", "ntohl")
-+ have_library("wsock32") if RUBY_PLATFORM =~ /mswin32|mingw/
-+ create_makefile("xmlparser")
-+ end
-+end
---- /dev/null
-+++ b/ext/xmlparser.c
-@@ -0,0 +1,2292 @@
-+/*
-+ * Expat (XML Parser Toolkit) wrapper for Ruby
-+ * Dec 15, 2009 yoshidam version 0.7.0 support Ruby 1.9.1
-+ * Feb 16, 2004 yoshidam version 0.6.8 taint output string
-+ * Feb 16, 2004 yoshidam version 0.6.7 fix buffer overflow
-+ * Mar 11, 2003 yoshidam version 0.6.6 fix skippedEntity handler
-+ * Sep 20, 2002 yoshidam version 0.6.5 fix reset method
-+ * Apr 4, 2002 yoshidam version 0.6.3 change event code values
-+ * Oct 10, 2000 yoshidam version 0.6.1 support expat-1.2
-+ * Oct 6, 2000 yoshidam version 0.6.0 support expat-1.95.0
-+ * Jun 28, 1999 yoshidam version 0.5.18 define initialize for Ruby 1.5
-+ * Jun 28, 1999 yoshidam version 0.5.15 support start/endDoctypeDecl
-+ * Jun 28, 1999 yoshidam version 0.5.14 support setParamEntityParsing
-+ * Apr 28, 1999 yoshidam version 0.5.11 support notStandalone
-+ * Mar 29, 1998 yoshidam version 0.5.9 optimize for Ruby 1.3
-+ * Mar 8, 1998 yoshidam version 0.5.7 support start/endNamespaceDecl
-+ * Jan 14, 1998 yoshidam version 0.5.4 support start/endCdataSection
-+ * Jan 10, 1998 yoshidam version 0.5.3 support encoding map
-+ * Nov 24, 1998 yoshidam version 0.5.0 support TEST version of expat
-+ * Nov 5, 1998 yoshidam version 0.4.18 mIDs are initialized in Init_xmlparser
-+ * Oct 28, 1998 yoshidam version 0.4.17 mIDs are stored into static vars
-+ * Oct 13, 1998 yoshidam version 0.4.12 debug and speed up myEncodingConv
-+ * Oct 7, 1998 yoshidam version 0.4.11 hold internal object into ivar
-+ * Sep 18, 1998 yoshidam version 0.4.6
-+ * Sep 8, 1998 yoshidam version 0.4.4
-+ * Sep 3, 1998 yoshidam version 0.4.3
-+ * Sep 1, 1998 yoshidam version 0.4.2
-+ * Aug 28, 1998 yoshidam version 0.4.1
-+ * Aug 22, 1998 yoshidam version 0.4.0
-+ * Jul 6, 1998 yoshidam version 0.2
-+ * Jun 30, 1998 yoshidam version 0.1
-+ *
-+ * XML_ENC_PATH: path of encoding map for Perl
-+ * HAVE_XML_USEFOREIGNDTD: expat 1.95.5
-+ * HAVE_XML_GETFEATURELIST: expat 1.95.5
-+ * HAVE_XML_SETSKIPPEDENTITYHANDLER: expat 1.95.4
-+ * HAVE_XML_PARSERRESET: expat 1.95.3
-+ * HAVE_EXPAT_H: expat 1.95.0
-+ * HAVE_XML_SETDOCTYPEDECLHANDLER: expat 19990728
-+ * XML_DTD: expat 19990626
-+ * NEW_EXPAT: expat 1.1
-+ */
-+
-+#include "ruby.h"
-+#ifdef HAVE_RUBY_IO_H
-+# include "ruby/io.h"
-+#else
-+# include "rubyio.h"
-+#endif
-+#include <stdio.h>
-+#include <ctype.h>
-+#ifdef HAVE_EXPAT_H
-+# include "expat.h"
-+#else
-+# include "xmlparse.h"
-+#endif
-+#ifdef XML_ENC_PATH
-+# include <limits.h>
-+# include <sys/stat.h>
-+# include "encoding.h"
-+# ifndef PATH_MAX
-+# define PATH_MAX 256
-+# endif
-+#endif
-+
-+#ifndef RSTRING_PTR
-+# define RSTRING_PTR(s) (RSTRING(s)->ptr)
-+# define RSTRING_LEN(s) (RSTRING(s)->len)
-+#endif
-+
-+#ifdef HAVE_RUBY_ENCODING_H
-+static rb_encoding* enc_xml;
-+#endif
-+
-+static VALUE eXMLParserError;
-+static VALUE cXMLParser;
-+static VALUE cXMLEncoding;
-+static ID id_map;
-+static ID id_startElementHandler;
-+static ID id_endElementHandler;
-+static ID id_characterDataHandler;
-+static ID id_processingInstructionHandler;
-+static ID id_defaultHandler;
-+static ID id_defaultExpandHandler;
-+static ID id_unparsedEntityDeclHandler;
-+static ID id_notationDeclHandler;
-+static ID id_externalEntityRefHandler;
-+static ID id_unknownEncoding;
-+static ID id_convert;
-+#ifdef NEW_EXPAT
-+static ID id_commentHandler;
-+static ID id_startCdataSectionHandler;
-+static ID id_endCdataSectionHandler;
-+static ID id_startNamespaceDeclHandler;
-+static ID id_endNamespaceDeclHandler;
-+static ID id_notStandaloneHandler;
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+static ID id_startDoctypeDeclHandler;
-+static ID id_endDoctypeDeclHandler;
-+#endif
-+#ifdef HAVE_EXPAT_H
-+static ID id_elementDeclHandler;
-+static ID id_attlistDeclHandler;
-+static ID id_xmlDeclHandler;
-+static ID id_entityDeclHandler;
-+#endif
-+#if 0
-+static ID id_externalParsedEntityDeclHandler;
-+static ID id_internalParsedEntityDeclHandler;
-+#endif
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+static ID id_skippedEntityHandler;
-+#endif
-+
-+#define GET_PARSER(obj, parser) \
-+ Data_Get_Struct(obj, XMLParser, parser)
-+
-+typedef struct _XMLParser {
-+ XML_Parser parser;
-+ int iterator;
-+ int defaultCurrent;
-+#ifdef NEW_EXPAT
-+ const XML_Char** lastAttrs;
-+#endif
-+ int tainted;
-+ VALUE parent;
-+ char* context;
-+ const XML_Char *detectedEncoding;
-+} XMLParser;
-+
-+static VALUE symDEFAULT;
-+static VALUE symSTART_ELEM;
-+static VALUE symEND_ELEM;
-+static VALUE symCDATA;
-+static VALUE symPI;
-+static VALUE symUNPARSED_ENTITY_DECL;
-+static VALUE symNOTATION_DECL;
-+static VALUE symEXTERNAL_ENTITY_REF;
-+#ifdef NEW_EXPAT
-+static VALUE symCOMMENT;
-+static VALUE symSTART_CDATA;
-+static VALUE symEND_CDATA;
-+static VALUE symSTART_NAMESPACE_DECL;
-+static VALUE symEND_NAMESPACE_DECL;
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+static VALUE symSTART_DOCTYPE_DECL;
-+static VALUE symEND_DOCTYPE_DECL;
-+#endif
-+#ifdef HAVE_EXPAT_H
-+static VALUE symELEMENT_DECL;
-+static VALUE symATTLIST_DECL;
-+static VALUE symXML_DECL;
-+static VALUE symENTITY_DECL;
-+#endif
-+#if 0
-+static VALUE symEXTERNAL_PARSED_ENTITY_DECL;
-+static VALUE symINTERNAL_PARSED_ENTITY_DECL;
-+#endif
-+#if 0
-+static VALUE symUNKNOWN_ENCODING;
-+#endif
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+static VALUE symSKIPPED_ENTITY;
-+#endif
-+
-+/* destructor */
-+static void
-+XMLParser_free(XMLParser* parser)
-+{
-+ /* fprintf(stderr, "Delete XMLParser: %p->%p\n", parser, parser->parser);*/
-+ if (parser->parser) {
-+ XML_ParserFree(parser->parser);
-+ parser->parser = NULL;
-+ }
-+ free(parser);
-+}
-+
-+static void
-+XMLParser_mark(XMLParser* parser)
-+{
-+ /* fprintf(stderr, "Mark XMLParser: %p->%p\n", parser, parser->parser);*/
-+ if (!NIL_P(parser->parent)) {
-+ XMLParser* parent;
-+ GET_PARSER(parser->parent, parent);
-+ rb_gc_mark(parser->parent);
-+ }
-+}
-+
-+static void
-+taintParser(XMLParser* parser) {
-+ parser->tainted |= 1;
-+ if (!NIL_P(parser->parent) && !parser->context) {
-+ XMLParser* parent;
-+ GET_PARSER(parser->parent, parent);
-+ taintParser(parent);
-+ }
-+}
-+
-+inline static VALUE
-+taintObject(XMLParser* parser, VALUE obj) {
-+ if (parser->tainted)
-+ OBJ_TAINT(obj);
-+ return obj;
-+}
-+#define TO_(o) (taintObject(parser, o))
-+
-+inline static VALUE
-+freezeObject(VALUE obj) {
-+ OBJ_FREEZE(obj);
-+ return obj;
-+}
-+#define FO_(o) (freezeObject(o))
-+
-+#ifdef HAVE_RUBY_ENCODING_H
-+# define ENC_(o) (rb_enc_associate(o, enc_xml))
-+#else
-+# define ENC_(o) (o)
-+#endif
-+
-+
-+/* Event handlers for iterator */
-+static void
-+iterStartElementHandler(void *recv,
-+ const XML_Char *name, const XML_Char **atts)
-+{
-+ XMLParser* parser;
-+ VALUE attrhash;
-+
-+ GET_PARSER(recv, parser);
-+#ifdef NEW_EXPAT
-+ parser->lastAttrs = atts;
-+#endif
-+ attrhash = rb_hash_new();
-+ while (*atts) {
-+ const char* key = *atts++;
-+ const char* val = *atts++;
-+ rb_hash_aset(attrhash,
-+ FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-+ TO_(ENC_(rb_str_new2((char*)val))));
-+ }
-+
-+ rb_yield(rb_ary_new3(4, symSTART_ELEM,
-+ TO_(ENC_(rb_str_new2((char*)name))), attrhash, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterEndElementHandler(void *recv,
-+ const XML_Char *name)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symEND_ELEM,
-+ TO_(ENC_(rb_str_new2((char*)name))), Qnil, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterCharacterDataHandler(void *recv,
-+ const XML_Char *s,
-+ int len)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symCDATA,
-+ Qnil, TO_(ENC_(rb_str_new((char*)s, len))), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterProcessingInstructionHandler(void *recv,
-+ const XML_Char *target,
-+ const XML_Char *data)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symPI,
-+ TO_(ENC_(rb_str_new2((char*)target))),
-+ TO_(ENC_(rb_str_new2((char*)data))), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterDefaultHandler(void *recv,
-+ const XML_Char *s,
-+ int len)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symDEFAULT,
-+ Qnil, TO_(ENC_(rb_str_new((char*)s, len))), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ /* XML_DefaultCurrent shoould not call in defaultHandler */
-+ /* XML_DefaultCurrent(parser->parser); */
-+ }
-+}
-+
-+void
-+iterUnparsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId,
-+ const XML_Char *notationName)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(4, (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)systemId))),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)notationName))));
-+ rb_yield(rb_ary_new3(4, symUNPARSED_ENTITY_DECL,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+void
-+iterNotationDeclHandler(void *recv,
-+ const XML_Char *notationName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(3,
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+ rb_yield(rb_ary_new3(4, symNOTATION_DECL,
-+ TO_(ENC_(rb_str_new2((char*)notationName))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+int
-+iterExternalEntityRefHandler(XML_Parser xmlparser,
-+ const XML_Char *context,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ VALUE recv;
-+ VALUE valary;
-+ VALUE ret;
-+
-+ recv = (VALUE)XML_GetUserData(xmlparser);
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(3,
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+ ret = rb_yield(rb_ary_new3(4, symEXTERNAL_ENTITY_REF,
-+ (context ? TO_(ENC_(rb_str_new2((char*)context))) : Qnil),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+ /* The error status in this iterator block should be returned
-+ by the exception. */
-+ return 1;
-+}
-+
-+#ifdef NEW_EXPAT
-+static void
-+iterCommentHandler(void *recv,
-+ const XML_Char *s)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symCOMMENT,
-+ Qnil, TO_(ENC_(rb_str_new2((char*)s))), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterStartCdataSectionHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symSTART_CDATA, Qnil, Qnil, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterEndCdataSectionHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symEND_CDATA, Qnil, Qnil, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterStartNamespaceDeclHandler(void *recv,
-+ const XML_Char *prefix,
-+ const XML_Char *uri)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symSTART_NAMESPACE_DECL,
-+ (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-+ (uri ? TO_(ENC_(rb_str_new2((char*)uri))) : Qnil), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterEndNamespaceDeclHandler(void *recv,
-+ const XML_Char *prefix)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symEND_NAMESPACE_DECL,
-+ (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-+ Qnil, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+#endif
-+
-+#ifdef HAVE_XML_SETPARAMENTITYPARSING
-+static void
-+#ifdef HAVE_EXPAT_H
-+iterStartDoctypeDeclHandler(void *recv,
-+ const XML_Char *doctypeName,
-+ const XML_Char *sysid,
-+ const XML_Char *pubid,
-+ int has_internal_subset)
-+#else
-+iterStartDoctypeDeclHandler(void *recv,
-+ const XML_Char *doctypeName)
-+#endif
-+{
-+ XMLParser* parser;
-+ VALUE valary = Qnil;
-+
-+ GET_PARSER(recv, parser);
-+#ifdef HAVE_EXPAT_H
-+ valary = rb_ary_new3(3,
-+ (sysid ? TO_(ENC_(rb_str_new2((char*)sysid))) : Qnil),
-+ (pubid ? TO_(ENC_(rb_str_new2((char*)pubid))) : Qnil),
-+ (has_internal_subset ? Qtrue : Qfalse));
-+#endif
-+ rb_yield(rb_ary_new3(4, symSTART_DOCTYPE_DECL,
-+ TO_(ENC_(rb_str_new2((char*)doctypeName))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterEndDoctypeDeclHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symEND_DOCTYPE_DECL,
-+ Qnil,
-+ Qnil, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+#endif
-+
-+
-+#ifdef HAVE_EXPAT_H
-+
-+static VALUE
-+makeContentArray(XMLParser* parser, XML_Content* model)
-+{
-+ static const char* content_type_name[] = {
-+ NULL, "EMPTY", "ANY", "MIXED", "NAME", "CHOICE", "SEQ"
-+ };
-+ static const char* content_quant_name[] = {
-+ "", "?", "*", "+"
-+ };
-+ unsigned int i;
-+ VALUE children = Qnil;
-+ const char* type_name = content_type_name[model->type];
-+ const char* quant_name = content_quant_name[model->quant];
-+ VALUE ret = rb_ary_new3(3,
-+ TO_(ENC_(rb_str_new2((char*)type_name))),
-+ TO_(ENC_(rb_str_new2((char*)quant_name))),
-+ (model->name ? TO_(ENC_(rb_str_new2((char*)model->name))) :
-+ Qnil));
-+ if (model->numchildren > 0) {
-+ children = rb_ary_new();
-+ for (i = 0; i < model->numchildren; i++) {
-+ VALUE child = makeContentArray(parser, model->children + i);
-+ rb_ary_push(children, child);
-+ }
-+ }
-+ rb_ary_push(ret, children);
-+ return ret;
-+}
-+
-+
-+
-+static void
-+iterElementDeclHandler(void *recv,
-+ const XML_Char *name,
-+ XML_Content *model)
-+{
-+ XMLParser* parser;
-+ VALUE content;
-+ GET_PARSER(recv, parser);
-+ content = makeContentArray(parser, model);
-+ rb_yield(rb_ary_new3(4, symELEMENT_DECL,
-+ TO_(ENC_(rb_str_new2(name))),
-+ content, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterAttlistDeclHandler (void *recv,
-+ const XML_Char *elname,
-+ const XML_Char *attname,
-+ const XML_Char *att_type,
-+ const XML_Char *dflt,
-+ int isrequired)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(4,
-+ TO_(ENC_(rb_str_new2((char*)attname))),
-+ TO_(ENC_(rb_str_new2((char*)att_type))),
-+ (dflt ? TO_(ENC_(rb_str_new2((char*)dflt))) : Qnil),
-+ (isrequired ? Qtrue : Qfalse));
-+ rb_yield(rb_ary_new3(4, symATTLIST_DECL,
-+ TO_(ENC_(rb_str_new2(elname))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterXmlDeclHandler (void *recv,
-+ const XML_Char *version,
-+ const XML_Char *encoding,
-+ int standalone)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(3,
-+ (version ? TO_(ENC_(rb_str_new2(version))) : Qnil),
-+ (encoding ? TO_(ENC_(rb_str_new2((char*)encoding))) : Qnil),
-+ INT2FIX(standalone));
-+ rb_yield(rb_ary_new3(4, symXML_DECL,
-+ Qnil,
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterEntityDeclHandler (void *recv,
-+ const XML_Char *entityName,
-+ int is_parameter_entity,
-+ const XML_Char *value,
-+ int value_length,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId,
-+ const XML_Char *notationName)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(6,
-+ (is_parameter_entity ? Qtrue : Qfalse),
-+ TO_(ENC_(rb_str_new((char*)value, value_length))),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-+ (notationName ? TO_(ENC_(rb_str_new2((char*)notationName)))
-+ : Qnil));
-+ rb_yield(rb_ary_new3(4, symENTITY_DECL,
-+ TO_(ENC_(rb_str_new2(entityName))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+#endif
-+
-+#if 0
-+static void
-+iterExternalParsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ VALUE valary;
-+
-+ GET_PARSER(recv, parser);
-+ valary = rb_ary_new3(3, (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)systemId))),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+ rb_yield(rb_ary_new3(4, symEXTERNAL_PARSED_ENTITY_DECL,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ valary, recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+
-+static void
-+iterInternalParsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *replacementText,
-+ int replacementTextLength)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symINTERNAL_PARSED_ENTITY_DECL,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ TO_(ENC_(rb_str_new((char*)replacementText,
-+ replacementTextLength))), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+#endif
-+
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+static void
-+iterSkippedEntityHandler(void *recv,
-+ const XML_Char *entityName,
-+ int is_parameter_entity)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_yield(rb_ary_new3(4, symSKIPPED_ENTITY,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ INT2FIX(is_parameter_entity), recv));
-+ if (parser->defaultCurrent) {
-+ parser->defaultCurrent = 0;
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+}
-+#endif
-+
-+
-+
-+/* Event handlers for instance method */
-+static void
-+myStartElementHandler(void *recv,
-+ const XML_Char *name, const XML_Char **atts)
-+{
-+ XMLParser* parser;
-+ VALUE attrhash;
-+
-+ GET_PARSER(recv, parser);
-+#ifdef NEW_EXPAT
-+ parser->lastAttrs = atts;
-+#endif
-+ attrhash = rb_hash_new();
-+ while (*atts) {
-+ const char* key = *atts++;
-+ const char* val = *atts++;
-+ rb_hash_aset(attrhash,
-+ FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-+ TO_(ENC_(rb_str_new2((char*)val))));
-+ }
-+ rb_funcall((VALUE)recv, id_startElementHandler, 2,
-+ TO_(ENC_(rb_str_new2((char*)name))), attrhash);
-+}
-+
-+static void
-+myEndElementHandler(void *recv,
-+ const XML_Char *name)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_endElementHandler, 1,
-+ TO_(ENC_(rb_str_new2((char*)name))));
-+}
-+
-+static void
-+myCharacterDataHandler(void *recv,
-+ const XML_Char *s,
-+ int len)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_characterDataHandler, 1,
-+ TO_(ENC_(rb_str_new((char*)s, len))));
-+}
-+
-+static void
-+myProcessingInstructionHandler(void *recv,
-+ const XML_Char *target,
-+ const XML_Char *data)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_processingInstructionHandler, 2,
-+ TO_(ENC_(rb_str_new2((char*)target))),
-+ TO_(ENC_(rb_str_new2((char*)data))));
-+}
-+
-+static void
-+myDefaultHandler(void *recv,
-+ const XML_Char *s,
-+ int len)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_defaultHandler, 1,
-+ TO_(ENC_(rb_str_new((char*)s, len))));
-+}
-+
-+#ifdef NEW_EXPAT
-+static void
-+myDefaultExpandHandler(void *recv,
-+ const XML_Char *s,
-+ int len)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_defaultExpandHandler, 1,
-+ TO_(ENC_(rb_str_new((char*)s, len))));
-+}
-+#endif
-+
-+void
-+myUnparsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId,
-+ const XML_Char *notationName)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_unparsedEntityDeclHandler, 5,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)systemId))),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)notationName))));
-+}
-+
-+void
-+myNotationDeclHandler(void *recv,
-+ const XML_Char *notationName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_notationDeclHandler, 4,
-+ TO_(ENC_(rb_str_new2((char*)notationName))),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+}
-+
-+int
-+myExternalEntityRefHandler(XML_Parser xmlparser,
-+ const XML_Char *context,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ VALUE recv;
-+ VALUE ret;
-+
-+ recv = (VALUE)XML_GetUserData(xmlparser);
-+ GET_PARSER(recv, parser);
-+ ret = rb_funcall(recv, id_externalEntityRefHandler, 4,
-+ (context ? TO_(ENC_(rb_str_new2((char*)context))): Qnil),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+ /* The error status in this handler should be returned
-+ by the exception. */
-+ return Qnil;
-+}
-+
-+#ifdef NEW_EXPAT
-+static void
-+myCommentHandler(void *recv,
-+ const XML_Char *s)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_commentHandler, 1,
-+ TO_(ENC_(rb_str_new2((char*)s))));
-+}
-+
-+static void
-+myStartCdataSectionHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_startCdataSectionHandler, 0);
-+}
-+
-+static void
-+myEndCdataSectionHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_endCdataSectionHandler, 0);
-+}
-+
-+static void
-+myStartNamespaceDeclHandler(void *recv,
-+ const XML_Char *prefix,
-+ const XML_Char *uri)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_startNamespaceDeclHandler, 2,
-+ (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-+ (uri ? TO_(ENC_(rb_str_new2((char*)uri))) : Qnil));
-+}
-+
-+static void
-+myEndNamespaceDeclHandler(void *recv,
-+ const XML_Char *prefix)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_endNamespaceDeclHandler, 1,
-+ (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil));
-+}
-+
-+static int
-+myNotStandaloneHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ VALUE v;
-+
-+ GET_PARSER(recv, parser);
-+ v = rb_funcall((VALUE)recv, id_notStandaloneHandler, 0);
-+ Check_Type(v, T_FIXNUM);
-+ return FIX2INT(v);
-+}
-+#endif
-+
-+#ifdef HAVE_XML_SETPARAMENTITYPARSING
-+static void
-+#ifdef HAVE_EXPAT_H
-+myStartDoctypeDeclHandler(void *recv,
-+ const XML_Char *doctypeName,
-+ const XML_Char *sysid,
-+ const XML_Char *pubid,
-+ int has_internal_subset)
-+#else
-+myStartDoctypeDeclHandler(void *recv,
-+ const XML_Char *doctypeName)
-+#endif
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+#ifdef HAVE_EXPAT_H
-+ rb_funcall((VALUE)recv, id_startDoctypeDeclHandler, 4,
-+ TO_(ENC_(rb_str_new2((char*)doctypeName))),
-+ (sysid ? TO_(ENC_(rb_str_new2((char*)sysid))) : Qnil),
-+ (pubid ? TO_(ENC_(rb_str_new2((char*)pubid))) : Qnil),
-+ (has_internal_subset ? Qtrue : Qfalse));
-+#else
-+ rb_funcall((VALUE)recv, id_startDoctypeDeclHandler, 4,
-+ TO_(ENC_(rb_str_new2((char*)doctypeName))),
-+ Qnil, Qnil, Qfalse);
-+#endif
-+}
-+
-+static void
-+myEndDoctypeDeclHandler(void *recv)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_endDoctypeDeclHandler, 0);
-+}
-+#endif
-+
-+
-+#ifdef HAVE_EXPAT_H
-+
-+static void
-+myElementDeclHandler(void *recv,
-+ const XML_Char *name,
-+ XML_Content *model)
-+{
-+ XMLParser* parser;
-+ VALUE content;
-+ GET_PARSER(recv, parser);
-+ content = makeContentArray(parser, model);
-+ rb_funcall((VALUE)recv, id_elementDeclHandler, 2,
-+ TO_(ENC_(rb_str_new2(name))), content);
-+}
-+
-+static void
-+myAttlistDeclHandler (void *recv,
-+ const XML_Char *elname,
-+ const XML_Char *attname,
-+ const XML_Char *att_type,
-+ const XML_Char *dflt,
-+ int isrequired)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_attlistDeclHandler, 5,
-+ TO_(ENC_(rb_str_new2(elname))),
-+ TO_(ENC_(rb_str_new2((char*)attname))),
-+ TO_(ENC_(rb_str_new2((char*)att_type))),
-+ (dflt ? TO_(ENC_(rb_str_new2((char*)dflt))) : Qnil),
-+ (isrequired ? Qtrue : Qfalse));
-+}
-+
-+static void
-+myXmlDeclHandler (void *recv,
-+ const XML_Char *version,
-+ const XML_Char *encoding,
-+ int standalone)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_xmlDeclHandler, 3,
-+ (version ? TO_(ENC_(rb_str_new2(version))) : Qnil),
-+ (encoding ? TO_(ENC_(rb_str_new2((char*)encoding))) : Qnil),
-+ INT2FIX(standalone));
-+}
-+
-+static void
-+myEntityDeclHandler (void *recv,
-+ const XML_Char *entityName,
-+ int is_parameter_entity,
-+ const XML_Char *value,
-+ int value_length,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId,
-+ const XML_Char *notationName)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_entityDeclHandler, 7,
-+ TO_(ENC_(rb_str_new2(entityName))),
-+ (is_parameter_entity ? Qtrue : Qfalse),
-+ TO_(ENC_(rb_str_new((char*)value, value_length))),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-+ (notationName ? TO_(ENC_(rb_str_new2((char*)notationName)))
-+ : Qnil));
-+}
-+
-+#endif
-+
-+#if 0
-+static void
-+myExternalParsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *base,
-+ const XML_Char *systemId,
-+ const XML_Char *publicId)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_externalParsedEntityDeclHandler, 4,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-+ TO_(ENC_(rb_str_new2((char*)systemId))),
-+ (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-+}
-+
-+static void
-+myInternalParsedEntityDeclHandler(void *recv,
-+ const XML_Char *entityName,
-+ const XML_Char *replacementText,
-+ int replacementTextLength)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_internalParsedEntityDeclHandler, 2,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ TO_(ENC_(rb_str_new((char*)replacementText,
-+ replacementTextLength))));
-+}
-+#endif
-+
-+
-+static VALUE
-+XMLEncoding_map(VALUE obj, VALUE i)
-+{
-+ return i;
-+}
-+
-+static VALUE
-+XMLEncoding_convert(VALUE obj, VALUE str)
-+{
-+ return INT2FIX('?');
-+}
-+
-+static int
-+myEncodingConv(void *data, const char *s)
-+{
-+ VALUE v;
-+ int len;
-+ int slen = RSTRING_PTR(rb_ivar_get((VALUE)data,
-+ id_map))[*(unsigned char*)s];
-+
-+ v = rb_funcall((VALUE)data, id_convert, 1, ENC_(rb_str_new((char*)s, -slen)));
-+ switch (TYPE(v)) {
-+ case T_FIXNUM:
-+ return FIX2INT(v);
-+ case T_STRING:
-+ len = RSTRING_LEN(v);
-+ if (len == 1) {
-+ return (unsigned char)*RSTRING_PTR(v);
-+ }
-+ else if (len >= 2) {
-+ return (unsigned char)*RSTRING_PTR(v) |
-+ (unsigned char)*(RSTRING_PTR(v) + 1) << 8;
-+ }
-+ }
-+ return 0;
-+}
-+
-+#if 0
-+static int
-+iterUnknownEncodingHandler(void *recv,
-+ const XML_Char *name,
-+ XML_Encoding *info)
-+{
-+ XMLParser* parser;
-+ VALUE ret;
-+
-+ if (!rb_method_boundp(CLASS_OF((VALUE)recv), id_unknownEncoding, 0))
-+ return 0;
-+
-+ GET_PARSER(recv, parser);
-+ ret = rb_yield(rb_ary_new3(4, symUNKNOWN_ENCODING,
-+ TO_(ENC_(rb_str_new2((char*)name))), Qnil, recv));
-+ if (TYPE(ret) == T_OBJECT && rb_obj_is_kind_of(ret, cXMLEncoding)) {
-+ int i;
-+ ID mid = rb_intern("map");
-+ VALUE cmap = rb_str_new(NULL, 256);
-+ rb_ivar_set(ret, id_map, cmap);
-+
-+ for (i = 0; i < 256; i++) {
-+ VALUE m = rb_funcall(ret, mid, 1, INT2FIX(i));
-+ RSTRING_PTR(cmap)[i] = info->map[i] = FIX2INT(m);
-+ }
-+ /* protect object form GC */
-+ rb_ivar_set(recv, rb_intern("_encoding"), ret);
-+ info->data = (void*)ret;
-+ info->convert = myEncodingConv;
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+#endif
-+
-+#ifdef XML_ENC_PATH
-+/*
-+ * Encoding map functions come from XML::Parser Version 2.19
-+ *
-+ * Copyright 1998 Larry Wall and Clark Cooper
-+ * All rights reserved.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the same terms as Perl itself.
-+ */
-+static Encinfo*
-+getEncinfo(char* data, int size)
-+{
-+ Encmap_Header* header = (Encmap_Header*)data;
-+ unsigned short prefixes_size;
-+ unsigned short bytemap_size;
-+ Encinfo* ret;
-+ int i;
-+ PrefixMap* prefixes;
-+ unsigned short *bytemap;
-+
-+ if (size < sizeof(Encmap_Header) || ntohl(header->magic) != ENCMAP_MAGIC)
-+ return NULL;
-+ prefixes_size = ntohs(header->pfsize);
-+ bytemap_size = ntohs(header->bmsize);
-+ if (size != (sizeof(Encmap_Header) +
-+ prefixes_size * sizeof(PrefixMap) +
-+ bytemap_size * sizeof(unsigned short)))
-+ return NULL;
-+ if ((ret = (Encinfo*)malloc(sizeof(Encinfo))) == NULL) {
-+ return NULL;
-+ }
-+ ret->prefixes_size = prefixes_size;
-+ ret->bytemap_size = bytemap_size;
-+ for (i = 0; i < 256; i++)
-+ ret->firstmap[i] = ntohl(header->map[i]);
-+ prefixes = (PrefixMap*)(data + sizeof(Encmap_Header));
-+ bytemap = (unsigned short*)(data + sizeof(Encmap_Header)
-+ + sizeof(PrefixMap)*prefixes_size);
-+ if ((ret->prefixes =
-+ (PrefixMap*)malloc(sizeof(PrefixMap)*prefixes_size)) == NULL) {
-+ free(ret);
-+ return NULL;
-+ }
-+ if ((ret->bytemap =
-+ (unsigned short*)malloc(sizeof(unsigned short)*bytemap_size)) == NULL) {
-+ free(ret->prefixes);
-+ free(ret);
-+ return NULL;
-+ }
-+ for (i = 0; i < prefixes_size; i++, prefixes++) {
-+ ret->prefixes[i].min = prefixes->min;
-+ ret->prefixes[i].len = prefixes->len;
-+ ret->prefixes[i].bmap_start = ntohs(prefixes->bmap_start);
-+ memcpy(ret->prefixes[i].ispfx, prefixes->ispfx,
-+ sizeof(prefixes->ispfx) + sizeof(prefixes->ischar));
-+ }
-+ for (i = 0; i < bytemap_size; i++)
-+ ret->bytemap[i] = ntohs(bytemap[i]);
-+
-+ return ret;
-+}
-+
-+static int
-+convertEncoding(Encinfo* enc, const char* seq)
-+{
-+ PrefixMap* curpfx;
-+ int count;
-+ int index = 0;
-+
-+ for (count = 0; count < 4; count++) {
-+ unsigned char byte = (unsigned char)seq[count];
-+ unsigned char bndx;
-+ unsigned char bmsk;
-+ int offset;
-+
-+ curpfx = &enc->prefixes[index];
-+ offset = ((int)byte) - curpfx->min;
-+ if (offset < 0)
-+ break;
-+ if (offset >= curpfx->len && curpfx->len != 0)
-+ break;
-+
-+ bndx = byte >> 3;
-+ bmsk = 1 << (byte & 0x7);
-+
-+ if (curpfx->ispfx[bndx] & bmsk) {
-+ index = enc->bytemap[curpfx->bmap_start + offset];
-+ }
-+ else if (curpfx->ischar[bndx] & bmsk) {
-+ return enc->bytemap[curpfx->bmap_start + offset];
-+ }
-+ else
-+ break;
-+ }
-+
-+ return -1;
-+}
-+
-+static void
-+releaseEncoding(Encinfo* enc)
-+{
-+ if (enc) {
-+ if (enc->prefixes)
-+ free(enc->prefixes);
-+ if (enc->bytemap)
-+ free(enc->bytemap);
-+ free(enc);
-+ }
-+}
-+
-+static Encinfo*
-+findEncoding(const char* encname)
-+{
-+ FILE* fp;
-+ Encinfo* enc;
-+ struct stat st;
-+ int size;
-+ int len;
-+ char file[PATH_MAX] = "\0";
-+ const char* p;
-+ char* buf;
-+#ifdef DOSISH
-+ const char sepchar = '\\';
-+#else
-+ const char sepchar = '/';
-+#endif
-+ const char* const encext = ".enc";
-+
-+ rb_secure(2);
-+ /* make map file path */
-+ if (XML_ENC_PATH != NULL) {
-+ strncpy(file, XML_ENC_PATH, PATH_MAX - 1);
-+ file[PATH_MAX - 1] = '\0';
-+ }
-+ len = strlen(file);
-+ if (len > 0 && len < PATH_MAX - 1 && file[len - 1] != sepchar)
-+ file[len++] = sepchar;
-+ for (p = encname; *p && len < PATH_MAX - 1; p++, len++) {
-+ file[len] = tolower(*p);
-+ }
-+ file[len] = '\0';
-+ strncat(file, encext, PATH_MAX - len -1);
-+
-+ if ((fp = fopen(file, "rb")) == NULL) {
-+ return NULL;
-+ }
-+
-+ /* get file length */
-+ fstat(fileno(fp), &st);
-+ size = st.st_size;
-+
-+ if ((buf = (char*)malloc(size)) == NULL) {
-+ fclose(fp);
-+ return NULL;
-+ }
-+
-+ fread(buf, 1, size, fp);
-+ fclose(fp);
-+ enc = getEncinfo(buf, size);
-+ free(buf);
-+ return enc;
-+}
-+
-+#endif
-+
-+static int
-+myUnknownEncodingHandler(void *recv,
-+ const XML_Char *name,
-+ XML_Encoding *info)
-+{
-+ XMLParser* parser;
-+ VALUE ret;
-+
-+ GET_PARSER(recv, parser);
-+ parser->detectedEncoding = name;
-+
-+ if (!rb_method_boundp(CLASS_OF((VALUE)recv), id_unknownEncoding, 0))
-+#ifndef XML_ENC_PATH
-+ return 0;
-+#else
-+ {
-+ Encinfo* enc;
-+
-+ if ((enc = findEncoding(name)) != NULL) {
-+ memcpy(info->map, enc->firstmap, sizeof(int)*256);
-+ info->data = enc;
-+ info->convert = (int(*)(void*,const char*))convertEncoding;
-+ info->release = (void(*)(void*))releaseEncoding;
-+ return 1;
-+ }
-+ else
-+ return 0;
-+ }
-+#endif
-+
-+ ret = rb_funcall((VALUE)recv, id_unknownEncoding, 1,
-+ TO_(ENC_(rb_str_new2((char*)name))));
-+ if (TYPE(ret) == T_OBJECT && rb_obj_is_kind_of(ret, cXMLEncoding)) {
-+ int i;
-+ ID mid = rb_intern("map");
-+ VALUE cmap = rb_str_new(NULL, 256);
-+ rb_ivar_set(ret, id_map, cmap);
-+
-+ if (OBJ_TAINTED(ret))
-+ taintParser(parser);
-+ TO_(cmap);
-+
-+ for (i = 0; i < 256; i++) {
-+ VALUE m = rb_funcall(ret, mid, 1, INT2FIX(i));
-+ RSTRING_PTR(cmap)[i] = info->map[i] = FIX2INT(m);
-+ }
-+ /* protect object form GC */
-+ rb_ivar_set((VALUE)recv, rb_intern("_encoding"), ret);
-+ info->data = (void*)ret;
-+ info->convert = myEncodingConv;
-+
-+ return 1;
-+ }
-+
-+ return 0;
-+}
-+
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+static void
-+mySkippedEntityHandler(void *recv,
-+ const XML_Char *entityName,
-+ int is_parameter_entity)
-+{
-+ XMLParser* parser;
-+ GET_PARSER(recv, parser);
-+ rb_funcall((VALUE)recv, id_skippedEntityHandler, 2,
-+ TO_(ENC_(rb_str_new2((char*)entityName))),
-+ INT2FIX(is_parameter_entity));
-+}
-+#endif
-+
-+
-+/* constructor */
-+static VALUE
-+XMLParser_new(int argc, VALUE* argv, VALUE klass)
-+{
-+ XMLParser* parser;
-+ VALUE obj;
-+ VALUE arg1;
-+ VALUE arg2;
-+ VALUE arg3;
-+ int count;
-+ char* encoding = NULL;
-+#ifdef NEW_EXPAT
-+ char* nssep = NULL;
-+#endif
-+ char* context = NULL;
-+ XMLParser* rootparser = NULL;
-+ VALUE parent = Qnil;
-+
-+ count = rb_scan_args(argc, argv, "03", &arg1, &arg2, &arg3);
-+ if (count == 1) {
-+ /* new(encoding) */
-+ if (TYPE(arg1) != T_NIL) {
-+ Check_Type(arg1, T_STRING); /* encoding */
-+ encoding = RSTRING_PTR(arg1);
-+ }
-+ }
-+ else if (count == 2) {
-+ /* new(encoding, nschar) */
-+ /* new(parser, context) */
-+#ifdef NEW_EXPAT
-+ if (TYPE(arg1) != T_DATA) {
-+ if (TYPE(arg1) != T_NIL) {
-+ Check_Type(arg1, T_STRING); /* encoding */
-+ encoding = RSTRING_PTR(arg1);
-+ }
-+ Check_Type(arg2, T_STRING); /* nschar */
-+ nssep = RSTRING_PTR(arg2);
-+ }
-+ else {
-+#endif
-+ Check_Type(arg1, T_DATA); /* parser */
-+ GET_PARSER(arg1, rootparser);
-+ if (!NIL_P(arg2)) {
-+ Check_Type(arg2, T_STRING); /* context */
-+ context = RSTRING_PTR(arg2);
-+ }
-+ parent = arg1;
-+#ifdef NEW_EXPAT
-+ }
-+#endif
-+ }
-+ else if (count == 3) {
-+ /* new(parser, context, encoding) */
-+ Check_Type(arg1, T_DATA); /* parser */
-+ GET_PARSER(arg1, rootparser);
-+ if (!NIL_P(arg2)) {
-+ Check_Type(arg2, T_STRING); /* context */
-+ context = RSTRING_PTR(arg2);
-+ }
-+ Check_Type(arg3, T_STRING); /* encoding */
-+ encoding = RSTRING_PTR(arg3);
-+ parent = arg1;
-+ }
-+
-+ /* create object */
-+ obj = Data_Make_Struct(klass, XMLParser,
-+ XMLParser_mark, XMLParser_free, parser);
-+ /* create parser */
-+ if (rootparser == NULL) {
-+#ifdef NEW_EXPAT
-+ if (nssep == NULL)
-+ parser->parser = XML_ParserCreate(encoding);
-+ else
-+ parser->parser = XML_ParserCreateNS(encoding, nssep[0]);
-+#else
-+ parser->parser = XML_ParserCreate(encoding);
-+#endif
-+ parser->tainted = 0;
-+ parser->context = NULL;
-+ }
-+ else {
-+ parser->parser = XML_ExternalEntityParserCreate(rootparser->parser,
-+ context, encoding);
-+ /* clear all inhrited handlers,
-+ because handlers should be set in "parse" method */
-+ XML_SetElementHandler(parser->parser, NULL, NULL);
-+ XML_SetCharacterDataHandler(parser->parser, NULL);
-+ XML_SetProcessingInstructionHandler(parser->parser, NULL);
-+ XML_SetDefaultHandler(parser->parser, NULL);
-+ XML_SetUnparsedEntityDeclHandler(parser->parser, NULL);
-+ XML_SetNotationDeclHandler(parser->parser, NULL);
-+ XML_SetExternalEntityRefHandler(parser->parser, NULL);
-+#ifdef NEW_EXPAT
-+ XML_SetCommentHandler(parser->parser, NULL);
-+ XML_SetCdataSectionHandler(parser->parser, NULL, NULL);
-+ XML_SetNamespaceDeclHandler(parser->parser, NULL, NULL);
-+ XML_SetNotStandaloneHandler(parser->parser, NULL);
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ XML_SetDoctypeDeclHandler(parser->parser, NULL, NULL);
-+#endif
-+#ifdef HAVE_EXPAT_H
-+ XML_SetElementDeclHandler(parser->parser, NULL);
-+ XML_SetAttlistDeclHandler(parser->parser, NULL);
-+ XML_SetXmlDeclHandler(parser->parser, NULL);
-+ XML_SetEntityDeclHandler(parser->parser, NULL);
-+#endif
-+#if 0
-+ XML_SetExternalParsedEntityDeclHandler(parser->parser, NULL);
-+ XML_SetInternalParsedEntityDeclHandler(parser->parser, NULL);
-+#endif
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+ XML_SetSkippedEntityHandler(parser->parser, NULL);
-+#endif
-+ if (rootparser->tainted)
-+ parser->tainted |= 1;
-+ parser->context = context;
-+ }
-+ if (!parser->parser)
-+ rb_raise(eXMLParserError, "cannot create parser");
-+
-+ /* setting up internal data */
-+ XML_SetUserData(parser->parser, (void*)obj);
-+ parser->iterator = 0;
-+ parser->defaultCurrent = 0;
-+#ifdef NEW_EXPAT
-+ parser->lastAttrs = NULL;
-+#endif
-+ parser->parent = parent;
-+ parser->detectedEncoding = NULL;
-+
-+ rb_obj_call_init(obj, argc, argv);
-+
-+ return obj;
-+}
-+
-+static VALUE
-+XMLParser_initialize(VALUE obj)
-+{
-+ return Qnil;
-+}
-+
-+#ifdef HAVE_XML_PARSERRESET
-+static VALUE
-+XMLParser_reset(int argc, VALUE* argv, VALUE obj)
-+{
-+ XMLParser* parser;
-+ VALUE vencoding = Qnil;
-+ char* encoding = NULL;
-+ int count;
-+
-+ count = rb_scan_args(argc, argv, "01", &vencoding);
-+
-+ GET_PARSER(obj, parser);
-+ if (count > 0 && TYPE(vencoding) != T_NIL) {
-+ Check_Type(vencoding, T_STRING);
-+ encoding = RSTRING_PTR(vencoding);
-+ }
-+ XML_ParserReset(parser->parser, encoding);
-+ /* setting up internal data */
-+ XML_SetUserData(parser->parser, (void*)obj);
-+ parser->iterator = 0;
-+ parser->defaultCurrent = 0;
-+#ifdef NEW_EXPAT
-+ parser->lastAttrs = NULL;
-+#endif
-+ parser->tainted = 0;
-+ parser->detectedEncoding = NULL;
-+
-+ return obj;
-+}
-+#endif
-+
-+static void
-+setup_evnet_handlers(XMLParser* parser, VALUE obj) {
-+ XML_StartElementHandler start = NULL;
-+ XML_EndElementHandler end = NULL;
-+#ifdef NEW_EXPAT
-+ XML_StartCdataSectionHandler startC = NULL;
-+ XML_EndCdataSectionHandler endC = NULL;
-+ XML_StartNamespaceDeclHandler startNS = NULL;
-+ XML_EndNamespaceDeclHandler endNS = NULL;
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ XML_StartDoctypeDeclHandler startDoctype = NULL;
-+ XML_EndDoctypeDeclHandler endDoctype = NULL;
-+#endif
-+
-+ /* Call as iterator */
-+ if (parser->iterator) {
-+ XML_SetElementHandler(parser->parser,
-+ iterStartElementHandler, iterEndElementHandler);
-+ XML_SetCharacterDataHandler(parser->parser,
-+ iterCharacterDataHandler);
-+ XML_SetProcessingInstructionHandler(parser->parser,
-+ iterProcessingInstructionHandler);
-+ /* check dummy default handler */
-+#ifdef NEW_EXPAT
-+ if (rb_method_boundp(CLASS_OF(obj), id_defaultExpandHandler, 0))
-+ XML_SetDefaultHandlerExpand(parser->parser, iterDefaultHandler);
-+ else
-+#endif
-+ if (rb_method_boundp(CLASS_OF(obj), id_defaultHandler, 0))
-+ XML_SetDefaultHandler(parser->parser, iterDefaultHandler);
-+
-+ if (rb_method_boundp(CLASS_OF(obj), id_unparsedEntityDeclHandler, 0))
-+ XML_SetUnparsedEntityDeclHandler(parser->parser,
-+ iterUnparsedEntityDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_notationDeclHandler, 0))
-+ XML_SetNotationDeclHandler(parser->parser,
-+ iterNotationDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_externalEntityRefHandler, 0))
-+ XML_SetExternalEntityRefHandler(parser->parser,
-+ iterExternalEntityRefHandler);
-+#ifdef NEW_EXPAT
-+ if (rb_method_boundp(CLASS_OF(obj), id_commentHandler, 0))
-+ XML_SetCommentHandler(parser->parser, iterCommentHandler);
-+
-+ if (rb_method_boundp(CLASS_OF(obj), id_startCdataSectionHandler, 0))
-+ startC = iterStartCdataSectionHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endCdataSectionHandler, 0))
-+ endC = iterEndCdataSectionHandler;
-+ if (startC || endC)
-+ XML_SetCdataSectionHandler(parser->parser, startC, endC);
-+
-+ if (rb_method_boundp(CLASS_OF(obj), id_startNamespaceDeclHandler, 0))
-+ startNS = iterStartNamespaceDeclHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endNamespaceDeclHandler, 0))
-+ endNS = iterEndNamespaceDeclHandler;
-+ if (startNS || endNS)
-+ XML_SetNamespaceDeclHandler(parser->parser, startNS, endNS);
-+ if (rb_method_boundp(CLASS_OF(obj), id_notStandaloneHandler, 0))
-+ XML_SetNotStandaloneHandler(parser->parser, myNotStandaloneHandler);
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ if (rb_method_boundp(CLASS_OF(obj), id_startDoctypeDeclHandler, 0))
-+ startDoctype = iterStartDoctypeDeclHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endDoctypeDeclHandler, 0))
-+ endDoctype = iterEndDoctypeDeclHandler;
-+ if (startDoctype || endDoctype)
-+ XML_SetDoctypeDeclHandler(parser->parser, startDoctype, endDoctype);
-+#endif
-+#ifdef HAVE_EXPAT_H
-+ if (rb_method_boundp(CLASS_OF(obj), id_elementDeclHandler, 0))
-+ XML_SetElementDeclHandler(parser->parser, iterElementDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_attlistDeclHandler, 0))
-+ XML_SetAttlistDeclHandler(parser->parser, iterAttlistDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_xmlDeclHandler, 0))
-+ XML_SetXmlDeclHandler(parser->parser, iterXmlDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_entityDeclHandler, 0))
-+ XML_SetEntityDeclHandler(parser->parser, iterEntityDeclHandler);
-+#endif
-+#if 0
-+ if (rb_method_boundp(CLASS_OF(obj), id_externalParsedEntityDeclHandler, 0))
-+ XML_SetExternalParsedEntityDeclHandler(parser->parser,
-+ iterExternalParsedEntityDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_internalParsedEntityDeclHandler, 0))
-+ XML_SetInternalParsedEntityDeclHandler(parser->parser,
-+ iterInternalParsedEntityDeclHandler);
-+#endif
-+ /* Call non-iterator version of UnknownEncoding handler,
-+ because the porcedure block often returns the unexpected value. */
-+ XML_SetUnknownEncodingHandler(parser->parser,
-+ myUnknownEncodingHandler,
-+ (void*)obj);
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+ if (rb_method_boundp(CLASS_OF(obj), id_skippedEntityHandler, 0))
-+ XML_SetSkippedEntityHandler(parser->parser, iterSkippedEntityHandler);
-+#endif
-+ }
-+ /* Call as not iterator */
-+ else {
-+ if (rb_method_boundp(CLASS_OF(obj), id_startElementHandler, 0))
-+ start = myStartElementHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endElementHandler, 0))
-+ end = myEndElementHandler;
-+ if (start || end)
-+ XML_SetElementHandler(parser->parser, start, end);
-+ if (rb_method_boundp(CLASS_OF(obj), id_characterDataHandler, 0))
-+ XML_SetCharacterDataHandler(parser->parser,
-+ myCharacterDataHandler);
-+ if (rb_method_boundp(CLASS_OF(obj),
-+ id_processingInstructionHandler, 0))
-+ XML_SetProcessingInstructionHandler(parser->parser,
-+ myProcessingInstructionHandler);
-+#ifdef NEW_EXPAT
-+ if (rb_method_boundp(CLASS_OF(obj), id_defaultExpandHandler, 0))
-+ XML_SetDefaultHandlerExpand(parser->parser, myDefaultExpandHandler);
-+ else
-+#endif
-+ if (rb_method_boundp(CLASS_OF(obj), id_defaultHandler, 0)) {
-+ XML_SetDefaultHandler(parser->parser, myDefaultHandler);
-+ }
-+ if (rb_method_boundp(CLASS_OF(obj), id_unparsedEntityDeclHandler, 0))
-+ XML_SetUnparsedEntityDeclHandler(parser->parser,
-+ myUnparsedEntityDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_notationDeclHandler, 0))
-+ XML_SetNotationDeclHandler(parser->parser,
-+ myNotationDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_externalEntityRefHandler, 0))
-+ XML_SetExternalEntityRefHandler(parser->parser,
-+ myExternalEntityRefHandler);
-+#ifdef NEW_EXPAT
-+ if (rb_method_boundp(CLASS_OF(obj), id_commentHandler, 0))
-+ XML_SetCommentHandler(parser->parser, myCommentHandler);
-+
-+ if (rb_method_boundp(CLASS_OF(obj), id_startCdataSectionHandler, 0))
-+ startC = myStartCdataSectionHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endCdataSectionHandler, 0))
-+ endC = myEndCdataSectionHandler;
-+ if (startC || endC)
-+ XML_SetCdataSectionHandler(parser->parser, startC, endC);
-+
-+ if (rb_method_boundp(CLASS_OF(obj), id_startNamespaceDeclHandler, 0))
-+ startNS = myStartNamespaceDeclHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endNamespaceDeclHandler, 0))
-+ endNS = myEndNamespaceDeclHandler;
-+ if (startNS || endNS)
-+ XML_SetNamespaceDeclHandler(parser->parser, startNS, endNS);
-+ if (rb_method_boundp(CLASS_OF(obj), id_notStandaloneHandler, 0))
-+ XML_SetNotStandaloneHandler(parser->parser, myNotStandaloneHandler);
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ if (rb_method_boundp(CLASS_OF(obj), id_startDoctypeDeclHandler, 0))
-+ startDoctype = myStartDoctypeDeclHandler;
-+ if (rb_method_boundp(CLASS_OF(obj), id_endDoctypeDeclHandler, 0))
-+ endDoctype = myEndDoctypeDeclHandler;
-+ if (startDoctype || endDoctype)
-+ XML_SetDoctypeDeclHandler(parser->parser, startDoctype, endDoctype);
-+#endif
-+#ifdef HAVE_EXPAT_H
-+ if (rb_method_boundp(CLASS_OF(obj), id_elementDeclHandler, 0))
-+ XML_SetElementDeclHandler(parser->parser, myElementDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_attlistDeclHandler, 0))
-+ XML_SetAttlistDeclHandler(parser->parser, myAttlistDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_xmlDeclHandler, 0))
-+ XML_SetXmlDeclHandler(parser->parser, myXmlDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_entityDeclHandler, 0))
-+ XML_SetEntityDeclHandler(parser->parser, myEntityDeclHandler);
-+#endif
-+#if 0
-+ if (rb_method_boundp(CLASS_OF(obj), id_externalParsedEntityDeclHandler, 0))
-+ XML_SetExternalParsedEntityDeclHandler(parser->parser,
-+ myExternalParsedEntityDeclHandler);
-+ if (rb_method_boundp(CLASS_OF(obj), id_internalParsedEntityDeclHandler, 0))
-+ XML_SetInternalParsedEntityDeclHandler(parser->parser,
-+ myInternalParsedEntityDeclHandler);
-+#endif
-+ XML_SetUnknownEncodingHandler(parser->parser,
-+ myUnknownEncodingHandler,
-+ (void*)obj);
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+ if (rb_method_boundp(CLASS_OF(obj), id_skippedEntityHandler, 0))
-+ XML_SetSkippedEntityHandler(parser->parser, mySkippedEntityHandler);
-+#endif
-+ }
-+}
-+
-+
-+/* parse method */
-+static VALUE
-+XMLParser_parse(int argc, VALUE* argv, VALUE obj)
-+{
-+ XMLParser* parser;
-+ int ret;
-+ VALUE str;
-+ VALUE isFinal;
-+ int final = 1;
-+ int count;
-+ int fromStream = 0;
-+ ID mid = rb_intern("gets");
-+ ID linebuf = rb_intern("_linebuf");
-+
-+ count = rb_scan_args(argc, argv, "02", &str, &isFinal);
-+ /* If "str" has public "gets" method, it will be considered *stream* */
-+ if (!rb_obj_is_kind_of(str, rb_cString) &&
-+ rb_method_boundp(CLASS_OF(str), mid, 1)) {
-+ fromStream = 1;
-+ }
-+ else if (!NIL_P(str)) {
-+ Check_Type(str, T_STRING);
-+ }
-+ if (count >= 2) {
-+ if (isFinal == Qtrue)
-+ final = 1;
-+ else if (isFinal == Qfalse)
-+ final = 0;
-+ else
-+ rb_raise(rb_eTypeError, "not valid value");
-+ }
-+
-+ GET_PARSER(obj, parser);
-+
-+ parser->iterator = rb_block_given_p();
-+
-+ /* Setup event handlers */
-+ setup_evnet_handlers(parser, obj);
-+
-+ /* Parse from stream (probably slightly slow) */
-+ if (fromStream) {
-+ VALUE buf;
-+
-+ if (OBJ_TAINTED(str))
-+ taintParser(parser);
-+ do {
-+ buf = rb_funcall(str, mid, 0);
-+ if (!NIL_P(buf)) {
-+ Check_Type(buf, T_STRING);
-+ if (OBJ_TAINTED(buf))
-+ taintParser(parser);
-+ rb_ivar_set(obj, linebuf, buf); /* protect buf from GC (reasonable?)*/
-+ ret = XML_Parse(parser->parser,
-+ RSTRING_PTR(buf), RSTRING_LEN(buf), 0);
-+ }
-+ else {
-+ ret = XML_Parse(parser->parser, NULL, 0, 1);
-+ }
-+ if (!ret) {
-+ int err = XML_GetErrorCode(parser->parser);
-+ const char* errStr = XML_ErrorString(err);
-+ rb_raise(eXMLParserError, (char*)errStr);
-+ }
-+ } while (!NIL_P(buf));
-+ return Qnil;
-+ }
-+
-+ /* Parse string */
-+ if (!NIL_P(str)) {
-+#if defined(HAVE_RUBY_ENCODING_H) && defined(HAVE_XML_PARSERRESET)
-+ int err;
-+#endif
-+ if (OBJ_TAINTED(str))
-+ taintParser(parser);
-+ ret = XML_Parse(parser->parser,
-+ RSTRING_PTR(str), RSTRING_LEN(str), final);
-+#if defined(HAVE_RUBY_ENCODING_H) && defined(HAVE_XML_PARSERRESET)
-+ /* Ruby 1.9.1 Encoding conversion */
-+ err = XML_GetErrorCode(parser->parser);
-+ if (final && err == XML_ERROR_UNKNOWN_ENCODING) {
-+ rb_encoding* enc;
-+ volatile VALUE encobj;
-+ volatile VALUE ustr;
-+ enc = rb_enc_find(parser->detectedEncoding);
-+ if ((int)ENC_TO_ENCINDEX(enc) != rb_ascii8bit_encindex()) {
-+ rb_enc_associate(str, enc);
-+ encobj = rb_enc_from_encoding(enc_xml);
-+ /* rb_str_encode may raises an exception */
-+ ustr = rb_str_encode(str, encobj, 0, Qnil);
-+ if (!NIL_P(ustr)) {
-+ XML_ParserReset(parser->parser, "utf-8");
-+ XML_SetUserData(parser->parser, (void*)obj);
-+ parser->defaultCurrent = 0;
-+#ifdef NEW_EXPAT
-+ parser->lastAttrs = NULL;
-+#endif
-+ parser->detectedEncoding = NULL;
-+ setup_evnet_handlers(parser, obj);
-+ ret = XML_Parse(parser->parser,
-+ RSTRING_PTR(ustr), RSTRING_LEN(ustr), final);
-+ }
-+ }
-+ }
-+#endif
-+ }
-+ else
-+ ret = XML_Parse(parser->parser, NULL, 0, final);
-+ if (!ret) {
-+ int err = XML_GetErrorCode(parser->parser);
-+ const char* errStr = XML_ErrorString(err);
-+ rb_raise(eXMLParserError, (char*)errStr);
-+ }
-+
-+ return Qnil;
-+}
-+
-+/* done method */
-+static VALUE
-+XMLParser_done(VALUE obj)
-+{
-+ XMLParser* parser;
-+
-+ GET_PARSER(obj, parser);
-+ if (parser->parser) {
-+ XML_ParserFree(parser->parser);
-+ parser->parser = NULL;
-+ }
-+ return Qnil;
-+}
-+
-+/* defaultCurrent method */
-+static VALUE
-+XMLParser_defaultCurrent(VALUE obj)
-+{
-+ XMLParser* parser;
-+
-+ GET_PARSER(obj, parser);
-+ if (!(parser->iterator)) {
-+ XML_DefaultCurrent(parser->parser);
-+ }
-+ else {
-+ parser->defaultCurrent = 1;
-+ }
-+ return Qnil;
-+}
-+
-+/* line method */
-+static VALUE
-+XMLParser_getCurrentLineNumber(VALUE obj)
-+{
-+ XMLParser* parser;
-+ int line;
-+
-+ GET_PARSER(obj, parser);
-+ line = XML_GetCurrentLineNumber(parser->parser);
-+
-+ return INT2FIX(line);
-+}
-+
-+/* column method */
-+static VALUE
-+XMLParser_getCurrentColumnNumber(VALUE obj)
-+{
-+ XMLParser* parser;
-+ int column;
-+
-+ GET_PARSER(obj, parser);
-+ column = XML_GetCurrentColumnNumber(parser->parser);
-+
-+ return INT2FIX(column);
-+}
-+
-+/* byte index method */
-+static VALUE
-+XMLParser_getCurrentByteIndex(VALUE obj)
-+{
-+ XMLParser* parser;
-+ long pos;
-+
-+ GET_PARSER(obj, parser);
-+ pos = XML_GetCurrentByteIndex(parser->parser);
-+
-+ return INT2FIX(pos);
-+}
-+
-+/* set URI base */
-+static VALUE
-+XMLParser_setBase(VALUE obj, VALUE base)
-+{
-+ XMLParser* parser;
-+ int ret;
-+
-+ Check_Type(base, T_STRING);
-+ GET_PARSER(obj, parser);
-+ if (OBJ_TAINTED(base))
-+ taintParser(parser);
-+ ret = XML_SetBase(parser->parser, RSTRING_PTR(base));
-+
-+ return INT2FIX(ret);
-+}
-+
-+/* get URI base */
-+static VALUE
-+XMLParser_getBase(VALUE obj)
-+{
-+ XMLParser* parser;
-+ const XML_Char* ret;
-+
-+ GET_PARSER(obj, parser);
-+ ret = XML_GetBase(parser->parser);
-+ if (!ret)
-+ return Qnil;
-+
-+ return TO_(ENC_(rb_str_new2((char*)ret)));
-+}
-+
-+#ifdef NEW_EXPAT
-+#if 0
-+static VALUE
-+XMLParser_getSpecifiedAttributes(VALUE obj)
-+{
-+ XMLParser* parser;
-+ int count;
-+ const XML_Char** atts;
-+ VALUE attrhash;
-+
-+ GET_PARSER(obj, parser);
-+ atts = parser->lastAttrs;
-+ if (!atts)
-+ return Qnil;
-+ count = XML_GetSpecifiedAttributeCount(parser->parser)/2;
-+ attrhash = rb_hash_new();
-+ while (*atts) {
-+ const char* key = *atts++;
-+ atts++;
-+ rb_hash_aset(attrhash, FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-+ (count-- > 0) ? Qtrue: Qfalse);
-+ }
-+
-+ return attrhash;
-+}
-+#else
-+static VALUE
-+XMLParser_getSpecifiedAttributes(VALUE obj)
-+{
-+ XMLParser* parser;
-+ int i, count;
-+ const XML_Char** atts;
-+ VALUE attrarray;
-+
-+ GET_PARSER(obj, parser);
-+ atts = parser->lastAttrs;
-+ if (!atts)
-+ return Qnil;
-+ count = XML_GetSpecifiedAttributeCount(parser->parser)/2;
-+ attrarray = rb_ary_new2(count);
-+ for (i = 0; i < count; i++, atts+=2) {
-+ const char* key = *atts;
-+ rb_ary_push(attrarray, TO_(ENC_(rb_str_new2((char*)key))));
-+ }
-+
-+ return attrarray;
-+}
-+#endif
-+
-+static VALUE
-+XMLParser_getCurrentByteCount(VALUE obj)
-+{
-+ XMLParser* parser;
-+
-+ GET_PARSER(obj, parser);
-+ return INT2FIX(XML_GetCurrentByteCount(parser->parser));
-+}
-+#endif
-+
-+#ifdef XML_DTD
-+static VALUE
-+XMLParser_setParamEntityParsing(VALUE obj, VALUE parsing)
-+{
-+ XMLParser* parser;
-+ int ret;
-+
-+ Check_Type(parsing, T_FIXNUM);
-+ GET_PARSER(obj, parser);
-+ ret = XML_SetParamEntityParsing(parser->parser, FIX2INT(parsing));
-+
-+ return INT2FIX(ret);
-+}
-+#endif
-+
-+static VALUE
-+XMLParser_s_expatVersion(VALUE obj)
-+{
-+#if defined(HAVE_EXPAT_H)
-+ return ENC_(rb_str_new2(XML_ExpatVersion()));
-+#elif defined(EXPAT_1_2)
-+ return ENC_(rb_str_new2("1.2"));
-+#elif defined(NEW_EXPAT)
-+ return ENC_(rb_str_new2("1.1"));
-+#else
-+ return ENC_(rb_str_new2("1.0"));
-+#endif
-+}
-+
-+#ifdef HAVE_EXPAT_H
-+static VALUE
-+XMLParser_setReturnNSTriplet(VALUE obj, VALUE do_nst)
-+{
-+ XMLParser* parser;
-+ int nst;
-+
-+ GET_PARSER(obj, parser);
-+ switch (TYPE(do_nst)) {
-+ case T_TRUE:
-+ nst = 1;
-+ break;
-+ case T_FALSE:
-+ nst = 0;
-+ break;
-+ case T_FIXNUM:
-+ nst = FIX2INT(do_nst);
-+ break;
-+ default:
-+ rb_raise(rb_eTypeError, "not valid value");
-+ }
-+ XML_SetReturnNSTriplet(parser->parser, nst);
-+
-+ return Qnil;
-+}
-+
-+
-+static VALUE
-+XMLParser_getInputContext(VALUE obj)
-+{
-+ XMLParser* parser;
-+ const char* buffer;
-+ int offset;
-+ int size;
-+ VALUE ret = Qnil;
-+
-+ GET_PARSER(obj, parser);
-+ buffer = XML_GetInputContext(parser->parser,
-+ &offset,
-+ &size);
-+ if (buffer && size > 0) {
-+ ret = rb_ary_new3(2,
-+ TO_(ENC_(rb_str_new(buffer, size))),
-+ INT2FIX(offset));
-+ }
-+
-+ return ret;
-+}
-+
-+
-+static VALUE
-+XMLParser_getIdAttrribute(VALUE obj)
-+{
-+ XMLParser* parser;
-+ int idattr;
-+ const XML_Char** atts;
-+
-+ GET_PARSER(obj, parser);
-+ atts = parser->lastAttrs;
-+ if (!atts)
-+ return Qnil;
-+ idattr = XML_GetIdAttributeIndex(parser->parser);
-+ if (idattr < 0)
-+ return Qnil;
-+ return TO_(ENC_(rb_str_new2((char*)atts[idattr])));
-+}
-+#endif
-+
-+#ifdef HAVE_XML_USEFOREIGNDTD
-+static VALUE
-+XMLParser_useForeignDTD(VALUE obj, VALUE useDTD)
-+{
-+ XMLParser* parser;
-+ int dtd;
-+ int ret;
-+
-+ GET_PARSER(obj, parser);
-+ switch (TYPE(useDTD)) {
-+ case T_TRUE:
-+ dtd = 1;
-+ break;
-+ case T_FALSE:
-+ dtd = 0;
-+ break;
-+ case T_FIXNUM:
-+ dtd = FIX2INT(useDTD);
-+ break;
-+ default:
-+ rb_raise(rb_eTypeError, "not valid value");
-+ }
-+ ret = XML_UseForeignDTD(parser->parser, dtd);
-+
-+ return INT2FIX(ret);
-+}
-+#endif
-+
-+#ifdef HAVE_XML_GETFEATURELIST
-+static VALUE
-+XMLParser_s_getFeatureList(VALUE obj)
-+{
-+ const XML_Feature* list;
-+ VALUE ret = rb_hash_new();
-+
-+ list = XML_GetFeatureList();
-+ while (list && list->feature) {
-+ rb_hash_aset(ret, FO_(ENC_(rb_str_new2(list->name))), INT2NUM(list->value));
-+ list++;
-+ }
-+
-+ return ret;
-+}
-+#endif
-+
-+void
-+Init_xmlparser()
-+{
-+ VALUE mXML;
-+
-+#ifdef HAVE_RUBY_ENCODING_H
-+ enc_xml = rb_utf8_encoding();
-+#endif
-+
-+ eXMLParserError = rb_define_class("XMLParserError", rb_eStandardError);
-+ cXMLParser = rb_define_class("XMLParser", rb_cObject);
-+ cXMLEncoding = rb_define_class("XMLEncoding", rb_cObject);
-+
-+ /* Class name aliases */
-+ if (rb_const_defined(rb_cObject, rb_intern("XML")) == Qtrue)
-+ mXML = rb_const_get(rb_cObject, rb_intern("XML"));
-+ else
-+ mXML = rb_define_module("XML");
-+ rb_define_const(mXML, "ParserError", eXMLParserError);
-+ rb_define_const(cXMLParser, "Error", eXMLParserError);
-+ rb_define_const(mXML, "Parser", cXMLParser);
-+ rb_define_const(mXML, "Encoding", cXMLEncoding);
-+
-+ rb_define_singleton_method(cXMLParser, "new", XMLParser_new, -1);
-+ rb_define_singleton_method(cXMLParser, "expatVersion",
-+ XMLParser_s_expatVersion, 0);
-+ rb_define_method(cXMLParser, "initialize", XMLParser_initialize, -1);
-+ rb_define_method(cXMLParser, "parse", XMLParser_parse, -1);
-+ rb_define_method(cXMLParser, "done", XMLParser_done, 0);
-+ rb_define_method(cXMLParser, "defaultCurrent", XMLParser_defaultCurrent, 0);
-+ rb_define_method(cXMLParser, "line", XMLParser_getCurrentLineNumber, 0);
-+ rb_define_method(cXMLParser, "column", XMLParser_getCurrentColumnNumber, 0);
-+ rb_define_method(cXMLParser, "byteIndex", XMLParser_getCurrentByteIndex, 0);
-+ rb_define_method(cXMLParser, "setBase", XMLParser_setBase, 1);
-+ rb_define_method(cXMLParser, "getBase", XMLParser_getBase, 0);
-+#ifdef NEW_EXPAT
-+ rb_define_method(cXMLParser, "getSpecifiedAttributes",
-+ XMLParser_getSpecifiedAttributes, 0);
-+ rb_define_method(cXMLParser, "byteCount", XMLParser_getCurrentByteCount, 0);
-+#endif
-+#ifdef XML_DTD
-+ rb_define_method(cXMLParser, "setParamEntityParsing",
-+ XMLParser_setParamEntityParsing, 1);
-+#endif
-+#ifdef HAVE_EXPAT_H
-+ rb_define_method(cXMLParser, "setReturnNSTriplet",
-+ XMLParser_setReturnNSTriplet, 1);
-+ rb_define_method(cXMLParser, "getInputContext",
-+ XMLParser_getInputContext, 0);
-+ rb_define_method(cXMLParser, "getIdAttribute",
-+ XMLParser_getIdAttrribute, 0);
-+#endif
-+
-+#ifdef HAVE_XML_PARSERRESET
-+ rb_define_method(cXMLParser, "reset", XMLParser_reset, -1);
-+#endif
-+
-+ rb_define_method(cXMLEncoding, "map", XMLEncoding_map, 1);
-+ rb_define_method(cXMLEncoding, "convert", XMLEncoding_convert, 1);
-+
-+#ifdef HAVE_XML_USEFOREIGNDTD
-+ rb_define_method(cXMLParser, "useForeignDTD",
-+ XMLParser_useForeignDTD, 1);
-+#endif
-+#ifdef HAVE_XML_GETFEATURELIST
-+ rb_define_singleton_method(cXMLParser, "getFeatureList",
-+ XMLParser_s_getFeatureList, 0);
-+#endif
-+
-+#define DEFINE_EVENT_CODE(klass, name) \
-+ rb_define_const(klass, #name, sym##name = ID2SYM(rb_intern(#name)))
-+
-+ DEFINE_EVENT_CODE(cXMLParser, START_ELEM);
-+ DEFINE_EVENT_CODE(cXMLParser, END_ELEM);
-+ DEFINE_EVENT_CODE(cXMLParser, CDATA);
-+ DEFINE_EVENT_CODE(cXMLParser, PI);
-+ DEFINE_EVENT_CODE(cXMLParser, DEFAULT);
-+ DEFINE_EVENT_CODE(cXMLParser, UNPARSED_ENTITY_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, NOTATION_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, EXTERNAL_ENTITY_REF);
-+#ifdef NEW_EXPAT
-+ DEFINE_EVENT_CODE(cXMLParser, COMMENT);
-+ DEFINE_EVENT_CODE(cXMLParser, START_CDATA);
-+ DEFINE_EVENT_CODE(cXMLParser, END_CDATA);
-+ DEFINE_EVENT_CODE(cXMLParser, START_NAMESPACE_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, END_NAMESPACE_DECL);
-+#endif
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+ DEFINE_EVENT_CODE(cXMLParser, SKIPPED_ENTITY);
-+#endif
-+#ifdef XML_DTD
-+ rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_NEVER",
-+ INT2FIX(XML_PARAM_ENTITY_PARSING_NEVER));
-+ rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_UNLESS_STANDALONE",
-+ INT2FIX(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE));
-+ rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_ALWAYS",
-+ INT2FIX(XML_PARAM_ENTITY_PARSING_ALWAYS));
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ DEFINE_EVENT_CODE(cXMLParser, START_DOCTYPE_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, END_DOCTYPE_DECL);
-+#endif
-+#ifdef HAVE_EXPAT_H
-+ DEFINE_EVENT_CODE(cXMLParser, ELEMENT_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, ATTLIST_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, XML_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, ENTITY_DECL);
-+#endif
-+#if 0
-+ DEFINE_EVENT_CODE(cXMLParser, EXTERNAL_PARSED_ENTITY_DECL);
-+ DEFINE_EVENT_CODE(cXMLParser, INTERNAL_PARSED_ENTITY_DECL);
-+#endif
-+#if 0
-+ DEFINE_EVENT_CODE(cXMLParser, UNKNOWN_ENCODING);
-+#endif
-+
-+ id_map = rb_intern("_map");
-+ id_startElementHandler = rb_intern("startElement");
-+ id_endElementHandler = rb_intern("endElement");
-+ id_characterDataHandler = rb_intern("character");
-+ id_processingInstructionHandler = rb_intern("processingInstruction");
-+ id_defaultHandler = rb_intern("default");
-+ id_unparsedEntityDeclHandler = rb_intern("unparsedEntityDecl");
-+ id_notationDeclHandler = rb_intern("notationDecl");
-+ id_externalEntityRefHandler = rb_intern("externalEntityRef");
-+#ifdef NEW_EXPAT
-+ id_defaultExpandHandler = rb_intern("defaultExpand");
-+ id_commentHandler = rb_intern("comment");
-+ id_startCdataSectionHandler = rb_intern("startCdata");
-+ id_endCdataSectionHandler = rb_intern("endCdata");
-+ id_startNamespaceDeclHandler = rb_intern("startNamespaceDecl");
-+ id_endNamespaceDeclHandler = rb_intern("endNamespaceDecl");
-+ id_notStandaloneHandler = rb_intern("notStandalone");
-+#endif
-+#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-+ id_startDoctypeDeclHandler = rb_intern("startDoctypeDecl");
-+ id_endDoctypeDeclHandler = rb_intern("endDoctypeDecl");
-+#endif
-+ id_unknownEncoding = rb_intern("unknownEncoding");
-+ id_convert = rb_intern("convert");
-+#ifdef HAVE_EXPAT_H
-+ id_elementDeclHandler = rb_intern("elementDecl");
-+ id_attlistDeclHandler = rb_intern("attlistDecl");
-+ id_xmlDeclHandler = rb_intern("xmlDecl");
-+ id_entityDeclHandler = rb_intern("entityDecl");
-+#endif
-+#if 0
-+ id_externalParsedEntityDeclHandler = rb_intern("externalParsedEntityDecl");
-+ id_internalParsedEntityDeclHandler = rb_intern("internalParsedEntityDecl");
-+#endif
-+#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-+ id_skippedEntityHandler = rb_intern("skippedEntity");
-+#endif
-+}
---- a/extconf.rb
-+++ /dev/null
-@@ -1,59 +0,0 @@
--#
--# ruby extconf.rb
--# --with-perl-enc-map[=/path/to/enc-map]
--# --with-expat-dir=/path/to/expat
--# --with-expat-lib=/path/to/expat/lib
--# --with-expat-include=/path/to/expat/include
--#
--require 'mkmf'
--
--
--xml_enc_path = with_config("perl-enc-map")
--if xml_enc_path == true
-- ## Encoding maps may be stored in $perl_archlib/XML/Parser/Encodins/
-- #perl_archlib = '/usr/lib/perl5/site_perl/5.005/i586-linux'
-- #perl_archlib = '/usr/local/lib'
-- perl= ENV['PERL'] || 'perl'
-- perl_archlib = `#{perl} -e 'use Config; print $Config{"archlib"}'`
-- xml_enc_path = perl_archlib + "/XML/Parser/Encodings"
--end
--
--##cwd=`pwd`.chomp!
--##$CFLAGS="-I#{cwd}/expat/xmlparse -I#{cwd}/expat/xmltok" +
--## ' -DXML_ENC_PATH=getenv\(\"XML_ENC_PATH\"\)' +
--## " -DNEW_EXPAT"
--#$CFLAGS = "-I#{cwd}/expat/xmlparse -I#{cwd}/expat/xmltok"
--#$LDFLAGS = "-L#{cwd}/expat/xmlparse -Wl,-rpath,/usr/local/lib"
--#$LDFLAGS = "-L#{cwd}/expat/xmlparse"
--dir_config("expat")
--#dir_config("xmltok")
--#dir_config("xmlparse")
--if xml_enc_path
-- $CFLAGS += " -DXML_ENC_PATH=\\\"#{xml_enc_path}\\\""
--end
--
--#if have_header("xmlparse.h") || have_header("expat.h")
--if have_header("expat.h") || have_header("xmlparse.h")
-- if have_library("expat", "XML_ParserCreate") ||
-- have_library("xmltok", "XML_ParserCreate") ||
-- have_library("libexpat", "XML_ParserCreate")
-- if have_func("XML_SetNotStandaloneHandler")
-- $CFLAGS += " -DNEW_EXPAT"
-- end
-- if have_func("XML_SetParamEntityParsing")
-- $CFLAGS += " -DXML_DTD"
-- end
--# if have_func("XML_SetExternalParsedEntityDeclHandler")
--# $CFLAGS += " -DEXPAT_1_2"
--# end
-- have_func("XML_SetDoctypeDeclHandler")
-- have_func("XML_ParserReset")
-- have_func("XML_SetSkippedEntityHandler")
-- have_func("XML_GetFeatureList")
-- have_func("XML_UseForeignDTD")
-- have_func("XML_GetIdAttributeIndex")
-- have_library("socket", "ntohl")
-- have_library("wsock32") if RUBY_PLATFORM =~ /mswin32|mingw/
-- create_makefile("xmlparser")
-- end
--end
---- a/xmlparser.c
-+++ /dev/null
-@@ -1,2292 +0,0 @@
--/*
-- * Expat (XML Parser Toolkit) wrapper for Ruby
-- * Dec 15, 2009 yoshidam version 0.7.0 support Ruby 1.9.1
-- * Feb 16, 2004 yoshidam version 0.6.8 taint output string
-- * Feb 16, 2004 yoshidam version 0.6.7 fix buffer overflow
-- * Mar 11, 2003 yoshidam version 0.6.6 fix skippedEntity handler
-- * Sep 20, 2002 yoshidam version 0.6.5 fix reset method
-- * Apr 4, 2002 yoshidam version 0.6.3 change event code values
-- * Oct 10, 2000 yoshidam version 0.6.1 support expat-1.2
-- * Oct 6, 2000 yoshidam version 0.6.0 support expat-1.95.0
-- * Jun 28, 1999 yoshidam version 0.5.18 define initialize for Ruby 1.5
-- * Jun 28, 1999 yoshidam version 0.5.15 support start/endDoctypeDecl
-- * Jun 28, 1999 yoshidam version 0.5.14 support setParamEntityParsing
-- * Apr 28, 1999 yoshidam version 0.5.11 support notStandalone
-- * Mar 29, 1998 yoshidam version 0.5.9 optimize for Ruby 1.3
-- * Mar 8, 1998 yoshidam version 0.5.7 support start/endNamespaceDecl
-- * Jan 14, 1998 yoshidam version 0.5.4 support start/endCdataSection
-- * Jan 10, 1998 yoshidam version 0.5.3 support encoding map
-- * Nov 24, 1998 yoshidam version 0.5.0 support TEST version of expat
-- * Nov 5, 1998 yoshidam version 0.4.18 mIDs are initialized in Init_xmlparser
-- * Oct 28, 1998 yoshidam version 0.4.17 mIDs are stored into static vars
-- * Oct 13, 1998 yoshidam version 0.4.12 debug and speed up myEncodingConv
-- * Oct 7, 1998 yoshidam version 0.4.11 hold internal object into ivar
-- * Sep 18, 1998 yoshidam version 0.4.6
-- * Sep 8, 1998 yoshidam version 0.4.4
-- * Sep 3, 1998 yoshidam version 0.4.3
-- * Sep 1, 1998 yoshidam version 0.4.2
-- * Aug 28, 1998 yoshidam version 0.4.1
-- * Aug 22, 1998 yoshidam version 0.4.0
-- * Jul 6, 1998 yoshidam version 0.2
-- * Jun 30, 1998 yoshidam version 0.1
-- *
-- * XML_ENC_PATH: path of encoding map for Perl
-- * HAVE_XML_USEFOREIGNDTD: expat 1.95.5
-- * HAVE_XML_GETFEATURELIST: expat 1.95.5
-- * HAVE_XML_SETSKIPPEDENTITYHANDLER: expat 1.95.4
-- * HAVE_XML_PARSERRESET: expat 1.95.3
-- * HAVE_EXPAT_H: expat 1.95.0
-- * HAVE_XML_SETDOCTYPEDECLHANDLER: expat 19990728
-- * XML_DTD: expat 19990626
-- * NEW_EXPAT: expat 1.1
-- */
--
--#include "ruby.h"
--#ifdef HAVE_RUBY_IO_H
--# include "ruby/io.h"
--#else
--# include "rubyio.h"
--#endif
--#include <stdio.h>
--#include <ctype.h>
--#ifdef HAVE_EXPAT_H
--# include "expat.h"
--#else
--# include "xmlparse.h"
--#endif
--#ifdef XML_ENC_PATH
--# include <limits.h>
--# include <sys/stat.h>
--# include "encoding.h"
--# ifndef PATH_MAX
--# define PATH_MAX 256
--# endif
--#endif
--
--#ifndef RSTRING_PTR
--# define RSTRING_PTR(s) (RSTRING(s)->ptr)
--# define RSTRING_LEN(s) (RSTRING(s)->len)
--#endif
--
--#ifdef HAVE_RUBY_ENCODING_H
--static rb_encoding* enc_xml;
--#endif
--
--static VALUE eXMLParserError;
--static VALUE cXMLParser;
--static VALUE cXMLEncoding;
--static ID id_map;
--static ID id_startElementHandler;
--static ID id_endElementHandler;
--static ID id_characterDataHandler;
--static ID id_processingInstructionHandler;
--static ID id_defaultHandler;
--static ID id_defaultExpandHandler;
--static ID id_unparsedEntityDeclHandler;
--static ID id_notationDeclHandler;
--static ID id_externalEntityRefHandler;
--static ID id_unknownEncoding;
--static ID id_convert;
--#ifdef NEW_EXPAT
--static ID id_commentHandler;
--static ID id_startCdataSectionHandler;
--static ID id_endCdataSectionHandler;
--static ID id_startNamespaceDeclHandler;
--static ID id_endNamespaceDeclHandler;
--static ID id_notStandaloneHandler;
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
--static ID id_startDoctypeDeclHandler;
--static ID id_endDoctypeDeclHandler;
--#endif
--#ifdef HAVE_EXPAT_H
--static ID id_elementDeclHandler;
--static ID id_attlistDeclHandler;
--static ID id_xmlDeclHandler;
--static ID id_entityDeclHandler;
--#endif
--#if 0
--static ID id_externalParsedEntityDeclHandler;
--static ID id_internalParsedEntityDeclHandler;
--#endif
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
--static ID id_skippedEntityHandler;
--#endif
--
--#define GET_PARSER(obj, parser) \
-- Data_Get_Struct(obj, XMLParser, parser)
--
--typedef struct _XMLParser {
-- XML_Parser parser;
-- int iterator;
-- int defaultCurrent;
--#ifdef NEW_EXPAT
-- const XML_Char** lastAttrs;
--#endif
-- int tainted;
-- VALUE parent;
-- char* context;
-- const XML_Char *detectedEncoding;
--} XMLParser;
--
--static VALUE symDEFAULT;
--static VALUE symSTART_ELEM;
--static VALUE symEND_ELEM;
--static VALUE symCDATA;
--static VALUE symPI;
--static VALUE symUNPARSED_ENTITY_DECL;
--static VALUE symNOTATION_DECL;
--static VALUE symEXTERNAL_ENTITY_REF;
--#ifdef NEW_EXPAT
--static VALUE symCOMMENT;
--static VALUE symSTART_CDATA;
--static VALUE symEND_CDATA;
--static VALUE symSTART_NAMESPACE_DECL;
--static VALUE symEND_NAMESPACE_DECL;
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
--static VALUE symSTART_DOCTYPE_DECL;
--static VALUE symEND_DOCTYPE_DECL;
--#endif
--#ifdef HAVE_EXPAT_H
--static VALUE symELEMENT_DECL;
--static VALUE symATTLIST_DECL;
--static VALUE symXML_DECL;
--static VALUE symENTITY_DECL;
--#endif
--#if 0
--static VALUE symEXTERNAL_PARSED_ENTITY_DECL;
--static VALUE symINTERNAL_PARSED_ENTITY_DECL;
--#endif
--#if 0
--static VALUE symUNKNOWN_ENCODING;
--#endif
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
--static VALUE symSKIPPED_ENTITY;
--#endif
--
--/* destructor */
--static void
--XMLParser_free(XMLParser* parser)
--{
-- /* fprintf(stderr, "Delete XMLParser: %p->%p\n", parser, parser->parser);*/
-- if (parser->parser) {
-- XML_ParserFree(parser->parser);
-- parser->parser = NULL;
-- }
-- free(parser);
--}
--
--static void
--XMLParser_mark(XMLParser* parser)
--{
-- /* fprintf(stderr, "Mark XMLParser: %p->%p\n", parser, parser->parser);*/
-- if (!NIL_P(parser->parent)) {
-- XMLParser* parent;
-- GET_PARSER(parser->parent, parent);
-- rb_gc_mark(parser->parent);
-- }
--}
--
--static void
--taintParser(XMLParser* parser) {
-- parser->tainted |= 1;
-- if (!NIL_P(parser->parent) && !parser->context) {
-- XMLParser* parent;
-- GET_PARSER(parser->parent, parent);
-- taintParser(parent);
-- }
--}
--
--inline static VALUE
--taintObject(XMLParser* parser, VALUE obj) {
-- if (parser->tainted)
-- OBJ_TAINT(obj);
-- return obj;
--}
--#define TO_(o) (taintObject(parser, o))
--
--inline static VALUE
--freezeObject(VALUE obj) {
-- OBJ_FREEZE(obj);
-- return obj;
--}
--#define FO_(o) (freezeObject(o))
--
--#ifdef HAVE_RUBY_ENCODING_H
--# define ENC_(o) (rb_enc_associate(o, enc_xml))
--#else
--# define ENC_(o) (o)
--#endif
--
--
--/* Event handlers for iterator */
--static void
--iterStartElementHandler(void *recv,
-- const XML_Char *name, const XML_Char **atts)
--{
-- XMLParser* parser;
-- VALUE attrhash;
--
-- GET_PARSER(recv, parser);
--#ifdef NEW_EXPAT
-- parser->lastAttrs = atts;
--#endif
-- attrhash = rb_hash_new();
-- while (*atts) {
-- const char* key = *atts++;
-- const char* val = *atts++;
-- rb_hash_aset(attrhash,
-- FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-- TO_(ENC_(rb_str_new2((char*)val))));
-- }
--
-- rb_yield(rb_ary_new3(4, symSTART_ELEM,
-- TO_(ENC_(rb_str_new2((char*)name))), attrhash, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterEndElementHandler(void *recv,
-- const XML_Char *name)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symEND_ELEM,
-- TO_(ENC_(rb_str_new2((char*)name))), Qnil, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterCharacterDataHandler(void *recv,
-- const XML_Char *s,
-- int len)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symCDATA,
-- Qnil, TO_(ENC_(rb_str_new((char*)s, len))), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterProcessingInstructionHandler(void *recv,
-- const XML_Char *target,
-- const XML_Char *data)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symPI,
-- TO_(ENC_(rb_str_new2((char*)target))),
-- TO_(ENC_(rb_str_new2((char*)data))), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterDefaultHandler(void *recv,
-- const XML_Char *s,
-- int len)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symDEFAULT,
-- Qnil, TO_(ENC_(rb_str_new((char*)s, len))), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- /* XML_DefaultCurrent shoould not call in defaultHandler */
-- /* XML_DefaultCurrent(parser->parser); */
-- }
--}
--
--void
--iterUnparsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId,
-- const XML_Char *notationName)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(4, (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)systemId))),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)notationName))));
-- rb_yield(rb_ary_new3(4, symUNPARSED_ENTITY_DECL,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--void
--iterNotationDeclHandler(void *recv,
-- const XML_Char *notationName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(3,
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-- rb_yield(rb_ary_new3(4, symNOTATION_DECL,
-- TO_(ENC_(rb_str_new2((char*)notationName))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--int
--iterExternalEntityRefHandler(XML_Parser xmlparser,
-- const XML_Char *context,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- VALUE recv;
-- VALUE valary;
-- VALUE ret;
--
-- recv = (VALUE)XML_GetUserData(xmlparser);
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(3,
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-- ret = rb_yield(rb_ary_new3(4, symEXTERNAL_ENTITY_REF,
-- (context ? TO_(ENC_(rb_str_new2((char*)context))) : Qnil),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
-- /* The error status in this iterator block should be returned
-- by the exception. */
-- return 1;
--}
--
--#ifdef NEW_EXPAT
--static void
--iterCommentHandler(void *recv,
-- const XML_Char *s)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symCOMMENT,
-- Qnil, TO_(ENC_(rb_str_new2((char*)s))), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterStartCdataSectionHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symSTART_CDATA, Qnil, Qnil, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterEndCdataSectionHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symEND_CDATA, Qnil, Qnil, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterStartNamespaceDeclHandler(void *recv,
-- const XML_Char *prefix,
-- const XML_Char *uri)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symSTART_NAMESPACE_DECL,
-- (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-- (uri ? TO_(ENC_(rb_str_new2((char*)uri))) : Qnil), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterEndNamespaceDeclHandler(void *recv,
-- const XML_Char *prefix)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symEND_NAMESPACE_DECL,
-- (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-- Qnil, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--#endif
--
--#ifdef HAVE_XML_SETPARAMENTITYPARSING
--static void
--#ifdef HAVE_EXPAT_H
--iterStartDoctypeDeclHandler(void *recv,
-- const XML_Char *doctypeName,
-- const XML_Char *sysid,
-- const XML_Char *pubid,
-- int has_internal_subset)
--#else
--iterStartDoctypeDeclHandler(void *recv,
-- const XML_Char *doctypeName)
--#endif
--{
-- XMLParser* parser;
-- VALUE valary = Qnil;
--
-- GET_PARSER(recv, parser);
--#ifdef HAVE_EXPAT_H
-- valary = rb_ary_new3(3,
-- (sysid ? TO_(ENC_(rb_str_new2((char*)sysid))) : Qnil),
-- (pubid ? TO_(ENC_(rb_str_new2((char*)pubid))) : Qnil),
-- (has_internal_subset ? Qtrue : Qfalse));
--#endif
-- rb_yield(rb_ary_new3(4, symSTART_DOCTYPE_DECL,
-- TO_(ENC_(rb_str_new2((char*)doctypeName))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterEndDoctypeDeclHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symEND_DOCTYPE_DECL,
-- Qnil,
-- Qnil, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--#endif
--
--
--#ifdef HAVE_EXPAT_H
--
--static VALUE
--makeContentArray(XMLParser* parser, XML_Content* model)
--{
-- static const char* content_type_name[] = {
-- NULL, "EMPTY", "ANY", "MIXED", "NAME", "CHOICE", "SEQ"
-- };
-- static const char* content_quant_name[] = {
-- "", "?", "*", "+"
-- };
-- unsigned int i;
-- VALUE children = Qnil;
-- const char* type_name = content_type_name[model->type];
-- const char* quant_name = content_quant_name[model->quant];
-- VALUE ret = rb_ary_new3(3,
-- TO_(ENC_(rb_str_new2((char*)type_name))),
-- TO_(ENC_(rb_str_new2((char*)quant_name))),
-- (model->name ? TO_(ENC_(rb_str_new2((char*)model->name))) :
-- Qnil));
-- if (model->numchildren > 0) {
-- children = rb_ary_new();
-- for (i = 0; i < model->numchildren; i++) {
-- VALUE child = makeContentArray(parser, model->children + i);
-- rb_ary_push(children, child);
-- }
-- }
-- rb_ary_push(ret, children);
-- return ret;
--}
--
--
--
--static void
--iterElementDeclHandler(void *recv,
-- const XML_Char *name,
-- XML_Content *model)
--{
-- XMLParser* parser;
-- VALUE content;
-- GET_PARSER(recv, parser);
-- content = makeContentArray(parser, model);
-- rb_yield(rb_ary_new3(4, symELEMENT_DECL,
-- TO_(ENC_(rb_str_new2(name))),
-- content, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterAttlistDeclHandler (void *recv,
-- const XML_Char *elname,
-- const XML_Char *attname,
-- const XML_Char *att_type,
-- const XML_Char *dflt,
-- int isrequired)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(4,
-- TO_(ENC_(rb_str_new2((char*)attname))),
-- TO_(ENC_(rb_str_new2((char*)att_type))),
-- (dflt ? TO_(ENC_(rb_str_new2((char*)dflt))) : Qnil),
-- (isrequired ? Qtrue : Qfalse));
-- rb_yield(rb_ary_new3(4, symATTLIST_DECL,
-- TO_(ENC_(rb_str_new2(elname))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterXmlDeclHandler (void *recv,
-- const XML_Char *version,
-- const XML_Char *encoding,
-- int standalone)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(3,
-- (version ? TO_(ENC_(rb_str_new2(version))) : Qnil),
-- (encoding ? TO_(ENC_(rb_str_new2((char*)encoding))) : Qnil),
-- INT2FIX(standalone));
-- rb_yield(rb_ary_new3(4, symXML_DECL,
-- Qnil,
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterEntityDeclHandler (void *recv,
-- const XML_Char *entityName,
-- int is_parameter_entity,
-- const XML_Char *value,
-- int value_length,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId,
-- const XML_Char *notationName)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(6,
-- (is_parameter_entity ? Qtrue : Qfalse),
-- TO_(ENC_(rb_str_new((char*)value, value_length))),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-- (notationName ? TO_(ENC_(rb_str_new2((char*)notationName)))
-- : Qnil));
-- rb_yield(rb_ary_new3(4, symENTITY_DECL,
-- TO_(ENC_(rb_str_new2(entityName))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--#endif
--
--#if 0
--static void
--iterExternalParsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- VALUE valary;
--
-- GET_PARSER(recv, parser);
-- valary = rb_ary_new3(3, (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)systemId))),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-- rb_yield(rb_ary_new3(4, symEXTERNAL_PARSED_ENTITY_DECL,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- valary, recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--
--static void
--iterInternalParsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *replacementText,
-- int replacementTextLength)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symINTERNAL_PARSED_ENTITY_DECL,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- TO_(ENC_(rb_str_new((char*)replacementText,
-- replacementTextLength))), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--#endif
--
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
--static void
--iterSkippedEntityHandler(void *recv,
-- const XML_Char *entityName,
-- int is_parameter_entity)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_yield(rb_ary_new3(4, symSKIPPED_ENTITY,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- INT2FIX(is_parameter_entity), recv));
-- if (parser->defaultCurrent) {
-- parser->defaultCurrent = 0;
-- XML_DefaultCurrent(parser->parser);
-- }
--}
--#endif
--
--
--
--/* Event handlers for instance method */
--static void
--myStartElementHandler(void *recv,
-- const XML_Char *name, const XML_Char **atts)
--{
-- XMLParser* parser;
-- VALUE attrhash;
--
-- GET_PARSER(recv, parser);
--#ifdef NEW_EXPAT
-- parser->lastAttrs = atts;
--#endif
-- attrhash = rb_hash_new();
-- while (*atts) {
-- const char* key = *atts++;
-- const char* val = *atts++;
-- rb_hash_aset(attrhash,
-- FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-- TO_(ENC_(rb_str_new2((char*)val))));
-- }
-- rb_funcall((VALUE)recv, id_startElementHandler, 2,
-- TO_(ENC_(rb_str_new2((char*)name))), attrhash);
--}
--
--static void
--myEndElementHandler(void *recv,
-- const XML_Char *name)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_endElementHandler, 1,
-- TO_(ENC_(rb_str_new2((char*)name))));
--}
--
--static void
--myCharacterDataHandler(void *recv,
-- const XML_Char *s,
-- int len)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_characterDataHandler, 1,
-- TO_(ENC_(rb_str_new((char*)s, len))));
--}
--
--static void
--myProcessingInstructionHandler(void *recv,
-- const XML_Char *target,
-- const XML_Char *data)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_processingInstructionHandler, 2,
-- TO_(ENC_(rb_str_new2((char*)target))),
-- TO_(ENC_(rb_str_new2((char*)data))));
--}
--
--static void
--myDefaultHandler(void *recv,
-- const XML_Char *s,
-- int len)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_defaultHandler, 1,
-- TO_(ENC_(rb_str_new((char*)s, len))));
--}
--
--#ifdef NEW_EXPAT
--static void
--myDefaultExpandHandler(void *recv,
-- const XML_Char *s,
-- int len)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_defaultExpandHandler, 1,
-- TO_(ENC_(rb_str_new((char*)s, len))));
--}
--#endif
--
--void
--myUnparsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId,
-- const XML_Char *notationName)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_unparsedEntityDeclHandler, 5,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)systemId))),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)notationName))));
--}
--
--void
--myNotationDeclHandler(void *recv,
-- const XML_Char *notationName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_notationDeclHandler, 4,
-- TO_(ENC_(rb_str_new2((char*)notationName))),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
--}
--
--int
--myExternalEntityRefHandler(XML_Parser xmlparser,
-- const XML_Char *context,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- VALUE recv;
-- VALUE ret;
--
-- recv = (VALUE)XML_GetUserData(xmlparser);
-- GET_PARSER(recv, parser);
-- ret = rb_funcall(recv, id_externalEntityRefHandler, 4,
-- (context ? TO_(ENC_(rb_str_new2((char*)context))): Qnil),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
-- /* The error status in this handler should be returned
-- by the exception. */
-- return Qnil;
--}
--
--#ifdef NEW_EXPAT
--static void
--myCommentHandler(void *recv,
-- const XML_Char *s)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_commentHandler, 1,
-- TO_(ENC_(rb_str_new2((char*)s))));
--}
--
--static void
--myStartCdataSectionHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_startCdataSectionHandler, 0);
--}
--
--static void
--myEndCdataSectionHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_endCdataSectionHandler, 0);
--}
--
--static void
--myStartNamespaceDeclHandler(void *recv,
-- const XML_Char *prefix,
-- const XML_Char *uri)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_startNamespaceDeclHandler, 2,
-- (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil),
-- (uri ? TO_(ENC_(rb_str_new2((char*)uri))) : Qnil));
--}
--
--static void
--myEndNamespaceDeclHandler(void *recv,
-- const XML_Char *prefix)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_endNamespaceDeclHandler, 1,
-- (prefix ? TO_(ENC_(rb_str_new2((char*)prefix))) : Qnil));
--}
--
--static int
--myNotStandaloneHandler(void *recv)
--{
-- XMLParser* parser;
-- VALUE v;
--
-- GET_PARSER(recv, parser);
-- v = rb_funcall((VALUE)recv, id_notStandaloneHandler, 0);
-- Check_Type(v, T_FIXNUM);
-- return FIX2INT(v);
--}
--#endif
--
--#ifdef HAVE_XML_SETPARAMENTITYPARSING
--static void
--#ifdef HAVE_EXPAT_H
--myStartDoctypeDeclHandler(void *recv,
-- const XML_Char *doctypeName,
-- const XML_Char *sysid,
-- const XML_Char *pubid,
-- int has_internal_subset)
--#else
--myStartDoctypeDeclHandler(void *recv,
-- const XML_Char *doctypeName)
--#endif
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
--#ifdef HAVE_EXPAT_H
-- rb_funcall((VALUE)recv, id_startDoctypeDeclHandler, 4,
-- TO_(ENC_(rb_str_new2((char*)doctypeName))),
-- (sysid ? TO_(ENC_(rb_str_new2((char*)sysid))) : Qnil),
-- (pubid ? TO_(ENC_(rb_str_new2((char*)pubid))) : Qnil),
-- (has_internal_subset ? Qtrue : Qfalse));
--#else
-- rb_funcall((VALUE)recv, id_startDoctypeDeclHandler, 4,
-- TO_(ENC_(rb_str_new2((char*)doctypeName))),
-- Qnil, Qnil, Qfalse);
--#endif
--}
--
--static void
--myEndDoctypeDeclHandler(void *recv)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_endDoctypeDeclHandler, 0);
--}
--#endif
--
--
--#ifdef HAVE_EXPAT_H
--
--static void
--myElementDeclHandler(void *recv,
-- const XML_Char *name,
-- XML_Content *model)
--{
-- XMLParser* parser;
-- VALUE content;
-- GET_PARSER(recv, parser);
-- content = makeContentArray(parser, model);
-- rb_funcall((VALUE)recv, id_elementDeclHandler, 2,
-- TO_(ENC_(rb_str_new2(name))), content);
--}
--
--static void
--myAttlistDeclHandler (void *recv,
-- const XML_Char *elname,
-- const XML_Char *attname,
-- const XML_Char *att_type,
-- const XML_Char *dflt,
-- int isrequired)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_attlistDeclHandler, 5,
-- TO_(ENC_(rb_str_new2(elname))),
-- TO_(ENC_(rb_str_new2((char*)attname))),
-- TO_(ENC_(rb_str_new2((char*)att_type))),
-- (dflt ? TO_(ENC_(rb_str_new2((char*)dflt))) : Qnil),
-- (isrequired ? Qtrue : Qfalse));
--}
--
--static void
--myXmlDeclHandler (void *recv,
-- const XML_Char *version,
-- const XML_Char *encoding,
-- int standalone)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_xmlDeclHandler, 3,
-- (version ? TO_(ENC_(rb_str_new2(version))) : Qnil),
-- (encoding ? TO_(ENC_(rb_str_new2((char*)encoding))) : Qnil),
-- INT2FIX(standalone));
--}
--
--static void
--myEntityDeclHandler (void *recv,
-- const XML_Char *entityName,
-- int is_parameter_entity,
-- const XML_Char *value,
-- int value_length,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId,
-- const XML_Char *notationName)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_entityDeclHandler, 7,
-- TO_(ENC_(rb_str_new2(entityName))),
-- (is_parameter_entity ? Qtrue : Qfalse),
-- TO_(ENC_(rb_str_new((char*)value, value_length))),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- (systemId ? TO_(ENC_(rb_str_new2((char*)systemId))) : Qnil),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil),
-- (notationName ? TO_(ENC_(rb_str_new2((char*)notationName)))
-- : Qnil));
--}
--
--#endif
--
--#if 0
--static void
--myExternalParsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *base,
-- const XML_Char *systemId,
-- const XML_Char *publicId)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_externalParsedEntityDeclHandler, 4,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- (base ? TO_(ENC_(rb_str_new2((char*)base))) : Qnil),
-- TO_(ENC_(rb_str_new2((char*)systemId))),
-- (publicId ? TO_(ENC_(rb_str_new2((char*)publicId))) : Qnil));
--}
--
--static void
--myInternalParsedEntityDeclHandler(void *recv,
-- const XML_Char *entityName,
-- const XML_Char *replacementText,
-- int replacementTextLength)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_internalParsedEntityDeclHandler, 2,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- TO_(ENC_(rb_str_new((char*)replacementText,
-- replacementTextLength))));
--}
--#endif
--
--
--static VALUE
--XMLEncoding_map(VALUE obj, VALUE i)
--{
-- return i;
--}
--
--static VALUE
--XMLEncoding_convert(VALUE obj, VALUE str)
--{
-- return INT2FIX('?');
--}
--
--static int
--myEncodingConv(void *data, const char *s)
--{
-- VALUE v;
-- int len;
-- int slen = RSTRING_PTR(rb_ivar_get((VALUE)data,
-- id_map))[*(unsigned char*)s];
--
-- v = rb_funcall((VALUE)data, id_convert, 1, ENC_(rb_str_new((char*)s, -slen)));
-- switch (TYPE(v)) {
-- case T_FIXNUM:
-- return FIX2INT(v);
-- case T_STRING:
-- len = RSTRING_LEN(v);
-- if (len == 1) {
-- return (unsigned char)*RSTRING_PTR(v);
-- }
-- else if (len >= 2) {
-- return (unsigned char)*RSTRING_PTR(v) |
-- (unsigned char)*(RSTRING_PTR(v) + 1) << 8;
-- }
-- }
-- return 0;
--}
--
--#if 0
--static int
--iterUnknownEncodingHandler(void *recv,
-- const XML_Char *name,
-- XML_Encoding *info)
--{
-- XMLParser* parser;
-- VALUE ret;
--
-- if (!rb_method_boundp(CLASS_OF((VALUE)recv), id_unknownEncoding, 0))
-- return 0;
--
-- GET_PARSER(recv, parser);
-- ret = rb_yield(rb_ary_new3(4, symUNKNOWN_ENCODING,
-- TO_(ENC_(rb_str_new2((char*)name))), Qnil, recv));
-- if (TYPE(ret) == T_OBJECT && rb_obj_is_kind_of(ret, cXMLEncoding)) {
-- int i;
-- ID mid = rb_intern("map");
-- VALUE cmap = rb_str_new(NULL, 256);
-- rb_ivar_set(ret, id_map, cmap);
--
-- for (i = 0; i < 256; i++) {
-- VALUE m = rb_funcall(ret, mid, 1, INT2FIX(i));
-- RSTRING_PTR(cmap)[i] = info->map[i] = FIX2INT(m);
-- }
-- /* protect object form GC */
-- rb_ivar_set(recv, rb_intern("_encoding"), ret);
-- info->data = (void*)ret;
-- info->convert = myEncodingConv;
-- return 1;
-- }
--
-- return 0;
--}
--#endif
--
--#ifdef XML_ENC_PATH
--/*
-- * Encoding map functions come from XML::Parser Version 2.19
-- *
-- * Copyright 1998 Larry Wall and Clark Cooper
-- * All rights reserved.
-- *
-- * This program is free software; you can redistribute it and/or
-- * modify it under the same terms as Perl itself.
-- */
--static Encinfo*
--getEncinfo(char* data, int size)
--{
-- Encmap_Header* header = (Encmap_Header*)data;
-- unsigned short prefixes_size;
-- unsigned short bytemap_size;
-- Encinfo* ret;
-- int i;
-- PrefixMap* prefixes;
-- unsigned short *bytemap;
--
-- if (size < sizeof(Encmap_Header) || ntohl(header->magic) != ENCMAP_MAGIC)
-- return NULL;
-- prefixes_size = ntohs(header->pfsize);
-- bytemap_size = ntohs(header->bmsize);
-- if (size != (sizeof(Encmap_Header) +
-- prefixes_size * sizeof(PrefixMap) +
-- bytemap_size * sizeof(unsigned short)))
-- return NULL;
-- if ((ret = (Encinfo*)malloc(sizeof(Encinfo))) == NULL) {
-- return NULL;
-- }
-- ret->prefixes_size = prefixes_size;
-- ret->bytemap_size = bytemap_size;
-- for (i = 0; i < 256; i++)
-- ret->firstmap[i] = ntohl(header->map[i]);
-- prefixes = (PrefixMap*)(data + sizeof(Encmap_Header));
-- bytemap = (unsigned short*)(data + sizeof(Encmap_Header)
-- + sizeof(PrefixMap)*prefixes_size);
-- if ((ret->prefixes =
-- (PrefixMap*)malloc(sizeof(PrefixMap)*prefixes_size)) == NULL) {
-- free(ret);
-- return NULL;
-- }
-- if ((ret->bytemap =
-- (unsigned short*)malloc(sizeof(unsigned short)*bytemap_size)) == NULL) {
-- free(ret->prefixes);
-- free(ret);
-- return NULL;
-- }
-- for (i = 0; i < prefixes_size; i++, prefixes++) {
-- ret->prefixes[i].min = prefixes->min;
-- ret->prefixes[i].len = prefixes->len;
-- ret->prefixes[i].bmap_start = ntohs(prefixes->bmap_start);
-- memcpy(ret->prefixes[i].ispfx, prefixes->ispfx,
-- sizeof(prefixes->ispfx) + sizeof(prefixes->ischar));
-- }
-- for (i = 0; i < bytemap_size; i++)
-- ret->bytemap[i] = ntohs(bytemap[i]);
--
-- return ret;
--}
--
--static int
--convertEncoding(Encinfo* enc, const char* seq)
--{
-- PrefixMap* curpfx;
-- int count;
-- int index = 0;
--
-- for (count = 0; count < 4; count++) {
-- unsigned char byte = (unsigned char)seq[count];
-- unsigned char bndx;
-- unsigned char bmsk;
-- int offset;
--
-- curpfx = &enc->prefixes[index];
-- offset = ((int)byte) - curpfx->min;
-- if (offset < 0)
-- break;
-- if (offset >= curpfx->len && curpfx->len != 0)
-- break;
--
-- bndx = byte >> 3;
-- bmsk = 1 << (byte & 0x7);
--
-- if (curpfx->ispfx[bndx] & bmsk) {
-- index = enc->bytemap[curpfx->bmap_start + offset];
-- }
-- else if (curpfx->ischar[bndx] & bmsk) {
-- return enc->bytemap[curpfx->bmap_start + offset];
-- }
-- else
-- break;
-- }
--
-- return -1;
--}
--
--static void
--releaseEncoding(Encinfo* enc)
--{
-- if (enc) {
-- if (enc->prefixes)
-- free(enc->prefixes);
-- if (enc->bytemap)
-- free(enc->bytemap);
-- free(enc);
-- }
--}
--
--static Encinfo*
--findEncoding(const char* encname)
--{
-- FILE* fp;
-- Encinfo* enc;
-- struct stat st;
-- int size;
-- int len;
-- char file[PATH_MAX] = "\0";
-- const char* p;
-- char* buf;
--#ifdef DOSISH
-- const char sepchar = '\\';
--#else
-- const char sepchar = '/';
--#endif
-- const char* const encext = ".enc";
--
-- rb_secure(2);
-- /* make map file path */
-- if (XML_ENC_PATH != NULL) {
-- strncpy(file, XML_ENC_PATH, PATH_MAX - 1);
-- file[PATH_MAX - 1] = '\0';
-- }
-- len = strlen(file);
-- if (len > 0 && len < PATH_MAX - 1 && file[len - 1] != sepchar)
-- file[len++] = sepchar;
-- for (p = encname; *p && len < PATH_MAX - 1; p++, len++) {
-- file[len] = tolower(*p);
-- }
-- file[len] = '\0';
-- strncat(file, encext, PATH_MAX - len -1);
--
-- if ((fp = fopen(file, "rb")) == NULL) {
-- return NULL;
-- }
--
-- /* get file length */
-- fstat(fileno(fp), &st);
-- size = st.st_size;
--
-- if ((buf = (char*)malloc(size)) == NULL) {
-- fclose(fp);
-- return NULL;
-- }
--
-- fread(buf, 1, size, fp);
-- fclose(fp);
-- enc = getEncinfo(buf, size);
-- free(buf);
-- return enc;
--}
--
--#endif
--
--static int
--myUnknownEncodingHandler(void *recv,
-- const XML_Char *name,
-- XML_Encoding *info)
--{
-- XMLParser* parser;
-- VALUE ret;
--
-- GET_PARSER(recv, parser);
-- parser->detectedEncoding = name;
--
-- if (!rb_method_boundp(CLASS_OF((VALUE)recv), id_unknownEncoding, 0))
--#ifndef XML_ENC_PATH
-- return 0;
--#else
-- {
-- Encinfo* enc;
--
-- if ((enc = findEncoding(name)) != NULL) {
-- memcpy(info->map, enc->firstmap, sizeof(int)*256);
-- info->data = enc;
-- info->convert = (int(*)(void*,const char*))convertEncoding;
-- info->release = (void(*)(void*))releaseEncoding;
-- return 1;
-- }
-- else
-- return 0;
-- }
--#endif
--
-- ret = rb_funcall((VALUE)recv, id_unknownEncoding, 1,
-- TO_(ENC_(rb_str_new2((char*)name))));
-- if (TYPE(ret) == T_OBJECT && rb_obj_is_kind_of(ret, cXMLEncoding)) {
-- int i;
-- ID mid = rb_intern("map");
-- VALUE cmap = rb_str_new(NULL, 256);
-- rb_ivar_set(ret, id_map, cmap);
--
-- if (OBJ_TAINTED(ret))
-- taintParser(parser);
-- TO_(cmap);
--
-- for (i = 0; i < 256; i++) {
-- VALUE m = rb_funcall(ret, mid, 1, INT2FIX(i));
-- RSTRING_PTR(cmap)[i] = info->map[i] = FIX2INT(m);
-- }
-- /* protect object form GC */
-- rb_ivar_set((VALUE)recv, rb_intern("_encoding"), ret);
-- info->data = (void*)ret;
-- info->convert = myEncodingConv;
--
-- return 1;
-- }
--
-- return 0;
--}
--
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
--static void
--mySkippedEntityHandler(void *recv,
-- const XML_Char *entityName,
-- int is_parameter_entity)
--{
-- XMLParser* parser;
-- GET_PARSER(recv, parser);
-- rb_funcall((VALUE)recv, id_skippedEntityHandler, 2,
-- TO_(ENC_(rb_str_new2((char*)entityName))),
-- INT2FIX(is_parameter_entity));
--}
--#endif
--
--
--/* constructor */
--static VALUE
--XMLParser_new(int argc, VALUE* argv, VALUE klass)
--{
-- XMLParser* parser;
-- VALUE obj;
-- VALUE arg1;
-- VALUE arg2;
-- VALUE arg3;
-- int count;
-- char* encoding = NULL;
--#ifdef NEW_EXPAT
-- char* nssep = NULL;
--#endif
-- char* context = NULL;
-- XMLParser* rootparser = NULL;
-- VALUE parent = Qnil;
--
-- count = rb_scan_args(argc, argv, "03", &arg1, &arg2, &arg3);
-- if (count == 1) {
-- /* new(encoding) */
-- if (TYPE(arg1) != T_NIL) {
-- Check_Type(arg1, T_STRING); /* encoding */
-- encoding = RSTRING_PTR(arg1);
-- }
-- }
-- else if (count == 2) {
-- /* new(encoding, nschar) */
-- /* new(parser, context) */
--#ifdef NEW_EXPAT
-- if (TYPE(arg1) != T_DATA) {
-- if (TYPE(arg1) != T_NIL) {
-- Check_Type(arg1, T_STRING); /* encoding */
-- encoding = RSTRING_PTR(arg1);
-- }
-- Check_Type(arg2, T_STRING); /* nschar */
-- nssep = RSTRING_PTR(arg2);
-- }
-- else {
--#endif
-- Check_Type(arg1, T_DATA); /* parser */
-- GET_PARSER(arg1, rootparser);
-- if (!NIL_P(arg2)) {
-- Check_Type(arg2, T_STRING); /* context */
-- context = RSTRING_PTR(arg2);
-- }
-- parent = arg1;
--#ifdef NEW_EXPAT
-- }
--#endif
-- }
-- else if (count == 3) {
-- /* new(parser, context, encoding) */
-- Check_Type(arg1, T_DATA); /* parser */
-- GET_PARSER(arg1, rootparser);
-- if (!NIL_P(arg2)) {
-- Check_Type(arg2, T_STRING); /* context */
-- context = RSTRING_PTR(arg2);
-- }
-- Check_Type(arg3, T_STRING); /* encoding */
-- encoding = RSTRING_PTR(arg3);
-- parent = arg1;
-- }
--
-- /* create object */
-- obj = Data_Make_Struct(klass, XMLParser,
-- XMLParser_mark, XMLParser_free, parser);
-- /* create parser */
-- if (rootparser == NULL) {
--#ifdef NEW_EXPAT
-- if (nssep == NULL)
-- parser->parser = XML_ParserCreate(encoding);
-- else
-- parser->parser = XML_ParserCreateNS(encoding, nssep[0]);
--#else
-- parser->parser = XML_ParserCreate(encoding);
--#endif
-- parser->tainted = 0;
-- parser->context = NULL;
-- }
-- else {
-- parser->parser = XML_ExternalEntityParserCreate(rootparser->parser,
-- context, encoding);
-- /* clear all inhrited handlers,
-- because handlers should be set in "parse" method */
-- XML_SetElementHandler(parser->parser, NULL, NULL);
-- XML_SetCharacterDataHandler(parser->parser, NULL);
-- XML_SetProcessingInstructionHandler(parser->parser, NULL);
-- XML_SetDefaultHandler(parser->parser, NULL);
-- XML_SetUnparsedEntityDeclHandler(parser->parser, NULL);
-- XML_SetNotationDeclHandler(parser->parser, NULL);
-- XML_SetExternalEntityRefHandler(parser->parser, NULL);
--#ifdef NEW_EXPAT
-- XML_SetCommentHandler(parser->parser, NULL);
-- XML_SetCdataSectionHandler(parser->parser, NULL, NULL);
-- XML_SetNamespaceDeclHandler(parser->parser, NULL, NULL);
-- XML_SetNotStandaloneHandler(parser->parser, NULL);
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- XML_SetDoctypeDeclHandler(parser->parser, NULL, NULL);
--#endif
--#ifdef HAVE_EXPAT_H
-- XML_SetElementDeclHandler(parser->parser, NULL);
-- XML_SetAttlistDeclHandler(parser->parser, NULL);
-- XML_SetXmlDeclHandler(parser->parser, NULL);
-- XML_SetEntityDeclHandler(parser->parser, NULL);
--#endif
--#if 0
-- XML_SetExternalParsedEntityDeclHandler(parser->parser, NULL);
-- XML_SetInternalParsedEntityDeclHandler(parser->parser, NULL);
--#endif
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-- XML_SetSkippedEntityHandler(parser->parser, NULL);
--#endif
-- if (rootparser->tainted)
-- parser->tainted |= 1;
-- parser->context = context;
-- }
-- if (!parser->parser)
-- rb_raise(eXMLParserError, "cannot create parser");
--
-- /* setting up internal data */
-- XML_SetUserData(parser->parser, (void*)obj);
-- parser->iterator = 0;
-- parser->defaultCurrent = 0;
--#ifdef NEW_EXPAT
-- parser->lastAttrs = NULL;
--#endif
-- parser->parent = parent;
-- parser->detectedEncoding = NULL;
--
-- rb_obj_call_init(obj, argc, argv);
--
-- return obj;
--}
--
--static VALUE
--XMLParser_initialize(VALUE obj)
--{
-- return Qnil;
--}
--
--#ifdef HAVE_XML_PARSERRESET
--static VALUE
--XMLParser_reset(int argc, VALUE* argv, VALUE obj)
--{
-- XMLParser* parser;
-- VALUE vencoding = Qnil;
-- char* encoding = NULL;
-- int count;
--
-- count = rb_scan_args(argc, argv, "01", &vencoding);
--
-- GET_PARSER(obj, parser);
-- if (count > 0 && TYPE(vencoding) != T_NIL) {
-- Check_Type(vencoding, T_STRING);
-- encoding = RSTRING_PTR(vencoding);
-- }
-- XML_ParserReset(parser->parser, encoding);
-- /* setting up internal data */
-- XML_SetUserData(parser->parser, (void*)obj);
-- parser->iterator = 0;
-- parser->defaultCurrent = 0;
--#ifdef NEW_EXPAT
-- parser->lastAttrs = NULL;
--#endif
-- parser->tainted = 0;
-- parser->detectedEncoding = NULL;
--
-- return obj;
--}
--#endif
--
--static void
--setup_evnet_handlers(XMLParser* parser, VALUE obj) {
-- XML_StartElementHandler start = NULL;
-- XML_EndElementHandler end = NULL;
--#ifdef NEW_EXPAT
-- XML_StartCdataSectionHandler startC = NULL;
-- XML_EndCdataSectionHandler endC = NULL;
-- XML_StartNamespaceDeclHandler startNS = NULL;
-- XML_EndNamespaceDeclHandler endNS = NULL;
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- XML_StartDoctypeDeclHandler startDoctype = NULL;
-- XML_EndDoctypeDeclHandler endDoctype = NULL;
--#endif
--
-- /* Call as iterator */
-- if (parser->iterator) {
-- XML_SetElementHandler(parser->parser,
-- iterStartElementHandler, iterEndElementHandler);
-- XML_SetCharacterDataHandler(parser->parser,
-- iterCharacterDataHandler);
-- XML_SetProcessingInstructionHandler(parser->parser,
-- iterProcessingInstructionHandler);
-- /* check dummy default handler */
--#ifdef NEW_EXPAT
-- if (rb_method_boundp(CLASS_OF(obj), id_defaultExpandHandler, 0))
-- XML_SetDefaultHandlerExpand(parser->parser, iterDefaultHandler);
-- else
--#endif
-- if (rb_method_boundp(CLASS_OF(obj), id_defaultHandler, 0))
-- XML_SetDefaultHandler(parser->parser, iterDefaultHandler);
--
-- if (rb_method_boundp(CLASS_OF(obj), id_unparsedEntityDeclHandler, 0))
-- XML_SetUnparsedEntityDeclHandler(parser->parser,
-- iterUnparsedEntityDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_notationDeclHandler, 0))
-- XML_SetNotationDeclHandler(parser->parser,
-- iterNotationDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_externalEntityRefHandler, 0))
-- XML_SetExternalEntityRefHandler(parser->parser,
-- iterExternalEntityRefHandler);
--#ifdef NEW_EXPAT
-- if (rb_method_boundp(CLASS_OF(obj), id_commentHandler, 0))
-- XML_SetCommentHandler(parser->parser, iterCommentHandler);
--
-- if (rb_method_boundp(CLASS_OF(obj), id_startCdataSectionHandler, 0))
-- startC = iterStartCdataSectionHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endCdataSectionHandler, 0))
-- endC = iterEndCdataSectionHandler;
-- if (startC || endC)
-- XML_SetCdataSectionHandler(parser->parser, startC, endC);
--
-- if (rb_method_boundp(CLASS_OF(obj), id_startNamespaceDeclHandler, 0))
-- startNS = iterStartNamespaceDeclHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endNamespaceDeclHandler, 0))
-- endNS = iterEndNamespaceDeclHandler;
-- if (startNS || endNS)
-- XML_SetNamespaceDeclHandler(parser->parser, startNS, endNS);
-- if (rb_method_boundp(CLASS_OF(obj), id_notStandaloneHandler, 0))
-- XML_SetNotStandaloneHandler(parser->parser, myNotStandaloneHandler);
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- if (rb_method_boundp(CLASS_OF(obj), id_startDoctypeDeclHandler, 0))
-- startDoctype = iterStartDoctypeDeclHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endDoctypeDeclHandler, 0))
-- endDoctype = iterEndDoctypeDeclHandler;
-- if (startDoctype || endDoctype)
-- XML_SetDoctypeDeclHandler(parser->parser, startDoctype, endDoctype);
--#endif
--#ifdef HAVE_EXPAT_H
-- if (rb_method_boundp(CLASS_OF(obj), id_elementDeclHandler, 0))
-- XML_SetElementDeclHandler(parser->parser, iterElementDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_attlistDeclHandler, 0))
-- XML_SetAttlistDeclHandler(parser->parser, iterAttlistDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_xmlDeclHandler, 0))
-- XML_SetXmlDeclHandler(parser->parser, iterXmlDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_entityDeclHandler, 0))
-- XML_SetEntityDeclHandler(parser->parser, iterEntityDeclHandler);
--#endif
--#if 0
-- if (rb_method_boundp(CLASS_OF(obj), id_externalParsedEntityDeclHandler, 0))
-- XML_SetExternalParsedEntityDeclHandler(parser->parser,
-- iterExternalParsedEntityDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_internalParsedEntityDeclHandler, 0))
-- XML_SetInternalParsedEntityDeclHandler(parser->parser,
-- iterInternalParsedEntityDeclHandler);
--#endif
-- /* Call non-iterator version of UnknownEncoding handler,
-- because the porcedure block often returns the unexpected value. */
-- XML_SetUnknownEncodingHandler(parser->parser,
-- myUnknownEncodingHandler,
-- (void*)obj);
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-- if (rb_method_boundp(CLASS_OF(obj), id_skippedEntityHandler, 0))
-- XML_SetSkippedEntityHandler(parser->parser, iterSkippedEntityHandler);
--#endif
-- }
-- /* Call as not iterator */
-- else {
-- if (rb_method_boundp(CLASS_OF(obj), id_startElementHandler, 0))
-- start = myStartElementHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endElementHandler, 0))
-- end = myEndElementHandler;
-- if (start || end)
-- XML_SetElementHandler(parser->parser, start, end);
-- if (rb_method_boundp(CLASS_OF(obj), id_characterDataHandler, 0))
-- XML_SetCharacterDataHandler(parser->parser,
-- myCharacterDataHandler);
-- if (rb_method_boundp(CLASS_OF(obj),
-- id_processingInstructionHandler, 0))
-- XML_SetProcessingInstructionHandler(parser->parser,
-- myProcessingInstructionHandler);
--#ifdef NEW_EXPAT
-- if (rb_method_boundp(CLASS_OF(obj), id_defaultExpandHandler, 0))
-- XML_SetDefaultHandlerExpand(parser->parser, myDefaultExpandHandler);
-- else
--#endif
-- if (rb_method_boundp(CLASS_OF(obj), id_defaultHandler, 0)) {
-- XML_SetDefaultHandler(parser->parser, myDefaultHandler);
-- }
-- if (rb_method_boundp(CLASS_OF(obj), id_unparsedEntityDeclHandler, 0))
-- XML_SetUnparsedEntityDeclHandler(parser->parser,
-- myUnparsedEntityDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_notationDeclHandler, 0))
-- XML_SetNotationDeclHandler(parser->parser,
-- myNotationDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_externalEntityRefHandler, 0))
-- XML_SetExternalEntityRefHandler(parser->parser,
-- myExternalEntityRefHandler);
--#ifdef NEW_EXPAT
-- if (rb_method_boundp(CLASS_OF(obj), id_commentHandler, 0))
-- XML_SetCommentHandler(parser->parser, myCommentHandler);
--
-- if (rb_method_boundp(CLASS_OF(obj), id_startCdataSectionHandler, 0))
-- startC = myStartCdataSectionHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endCdataSectionHandler, 0))
-- endC = myEndCdataSectionHandler;
-- if (startC || endC)
-- XML_SetCdataSectionHandler(parser->parser, startC, endC);
--
-- if (rb_method_boundp(CLASS_OF(obj), id_startNamespaceDeclHandler, 0))
-- startNS = myStartNamespaceDeclHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endNamespaceDeclHandler, 0))
-- endNS = myEndNamespaceDeclHandler;
-- if (startNS || endNS)
-- XML_SetNamespaceDeclHandler(parser->parser, startNS, endNS);
-- if (rb_method_boundp(CLASS_OF(obj), id_notStandaloneHandler, 0))
-- XML_SetNotStandaloneHandler(parser->parser, myNotStandaloneHandler);
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- if (rb_method_boundp(CLASS_OF(obj), id_startDoctypeDeclHandler, 0))
-- startDoctype = myStartDoctypeDeclHandler;
-- if (rb_method_boundp(CLASS_OF(obj), id_endDoctypeDeclHandler, 0))
-- endDoctype = myEndDoctypeDeclHandler;
-- if (startDoctype || endDoctype)
-- XML_SetDoctypeDeclHandler(parser->parser, startDoctype, endDoctype);
--#endif
--#ifdef HAVE_EXPAT_H
-- if (rb_method_boundp(CLASS_OF(obj), id_elementDeclHandler, 0))
-- XML_SetElementDeclHandler(parser->parser, myElementDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_attlistDeclHandler, 0))
-- XML_SetAttlistDeclHandler(parser->parser, myAttlistDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_xmlDeclHandler, 0))
-- XML_SetXmlDeclHandler(parser->parser, myXmlDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_entityDeclHandler, 0))
-- XML_SetEntityDeclHandler(parser->parser, myEntityDeclHandler);
--#endif
--#if 0
-- if (rb_method_boundp(CLASS_OF(obj), id_externalParsedEntityDeclHandler, 0))
-- XML_SetExternalParsedEntityDeclHandler(parser->parser,
-- myExternalParsedEntityDeclHandler);
-- if (rb_method_boundp(CLASS_OF(obj), id_internalParsedEntityDeclHandler, 0))
-- XML_SetInternalParsedEntityDeclHandler(parser->parser,
-- myInternalParsedEntityDeclHandler);
--#endif
-- XML_SetUnknownEncodingHandler(parser->parser,
-- myUnknownEncodingHandler,
-- (void*)obj);
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-- if (rb_method_boundp(CLASS_OF(obj), id_skippedEntityHandler, 0))
-- XML_SetSkippedEntityHandler(parser->parser, mySkippedEntityHandler);
--#endif
-- }
--}
--
--
--/* parse method */
--static VALUE
--XMLParser_parse(int argc, VALUE* argv, VALUE obj)
--{
-- XMLParser* parser;
-- int ret;
-- VALUE str;
-- VALUE isFinal;
-- int final = 1;
-- int count;
-- int fromStream = 0;
-- ID mid = rb_intern("gets");
-- ID linebuf = rb_intern("_linebuf");
--
-- count = rb_scan_args(argc, argv, "02", &str, &isFinal);
-- /* If "str" has public "gets" method, it will be considered *stream* */
-- if (!rb_obj_is_kind_of(str, rb_cString) &&
-- rb_method_boundp(CLASS_OF(str), mid, 1)) {
-- fromStream = 1;
-- }
-- else if (!NIL_P(str)) {
-- Check_Type(str, T_STRING);
-- }
-- if (count >= 2) {
-- if (isFinal == Qtrue)
-- final = 1;
-- else if (isFinal == Qfalse)
-- final = 0;
-- else
-- rb_raise(rb_eTypeError, "not valid value");
-- }
--
-- GET_PARSER(obj, parser);
--
-- parser->iterator = rb_block_given_p();
--
-- /* Setup event handlers */
-- setup_evnet_handlers(parser, obj);
--
-- /* Parse from stream (probably slightly slow) */
-- if (fromStream) {
-- VALUE buf;
--
-- if (OBJ_TAINTED(str))
-- taintParser(parser);
-- do {
-- buf = rb_funcall(str, mid, 0);
-- if (!NIL_P(buf)) {
-- Check_Type(buf, T_STRING);
-- if (OBJ_TAINTED(buf))
-- taintParser(parser);
-- rb_ivar_set(obj, linebuf, buf); /* protect buf from GC (reasonable?)*/
-- ret = XML_Parse(parser->parser,
-- RSTRING_PTR(buf), RSTRING_LEN(buf), 0);
-- }
-- else {
-- ret = XML_Parse(parser->parser, NULL, 0, 1);
-- }
-- if (!ret) {
-- int err = XML_GetErrorCode(parser->parser);
-- const char* errStr = XML_ErrorString(err);
-- rb_raise(eXMLParserError, (char*)errStr);
-- }
-- } while (!NIL_P(buf));
-- return Qnil;
-- }
--
-- /* Parse string */
-- if (!NIL_P(str)) {
--#if defined(HAVE_RUBY_ENCODING_H) && defined(HAVE_XML_PARSERRESET)
-- int err;
--#endif
-- if (OBJ_TAINTED(str))
-- taintParser(parser);
-- ret = XML_Parse(parser->parser,
-- RSTRING_PTR(str), RSTRING_LEN(str), final);
--#if defined(HAVE_RUBY_ENCODING_H) && defined(HAVE_XML_PARSERRESET)
-- /* Ruby 1.9.1 Encoding conversion */
-- err = XML_GetErrorCode(parser->parser);
-- if (final && err == XML_ERROR_UNKNOWN_ENCODING) {
-- rb_encoding* enc;
-- volatile VALUE encobj;
-- volatile VALUE ustr;
-- enc = rb_enc_find(parser->detectedEncoding);
-- if ((int)ENC_TO_ENCINDEX(enc) != rb_ascii8bit_encindex()) {
-- rb_enc_associate(str, enc);
-- encobj = rb_enc_from_encoding(enc_xml);
-- /* rb_str_encode may raises an exception */
-- ustr = rb_str_encode(str, encobj, 0, Qnil);
-- if (!NIL_P(ustr)) {
-- XML_ParserReset(parser->parser, "utf-8");
-- XML_SetUserData(parser->parser, (void*)obj);
-- parser->defaultCurrent = 0;
--#ifdef NEW_EXPAT
-- parser->lastAttrs = NULL;
--#endif
-- parser->detectedEncoding = NULL;
-- setup_evnet_handlers(parser, obj);
-- ret = XML_Parse(parser->parser,
-- RSTRING_PTR(ustr), RSTRING_LEN(ustr), final);
-- }
-- }
-- }
--#endif
-- }
-- else
-- ret = XML_Parse(parser->parser, NULL, 0, final);
-- if (!ret) {
-- int err = XML_GetErrorCode(parser->parser);
-- const char* errStr = XML_ErrorString(err);
-- rb_raise(eXMLParserError, (char*)errStr);
-- }
--
-- return Qnil;
--}
--
--/* done method */
--static VALUE
--XMLParser_done(VALUE obj)
--{
-- XMLParser* parser;
--
-- GET_PARSER(obj, parser);
-- if (parser->parser) {
-- XML_ParserFree(parser->parser);
-- parser->parser = NULL;
-- }
-- return Qnil;
--}
--
--/* defaultCurrent method */
--static VALUE
--XMLParser_defaultCurrent(VALUE obj)
--{
-- XMLParser* parser;
--
-- GET_PARSER(obj, parser);
-- if (!(parser->iterator)) {
-- XML_DefaultCurrent(parser->parser);
-- }
-- else {
-- parser->defaultCurrent = 1;
-- }
-- return Qnil;
--}
--
--/* line method */
--static VALUE
--XMLParser_getCurrentLineNumber(VALUE obj)
--{
-- XMLParser* parser;
-- int line;
--
-- GET_PARSER(obj, parser);
-- line = XML_GetCurrentLineNumber(parser->parser);
--
-- return INT2FIX(line);
--}
--
--/* column method */
--static VALUE
--XMLParser_getCurrentColumnNumber(VALUE obj)
--{
-- XMLParser* parser;
-- int column;
--
-- GET_PARSER(obj, parser);
-- column = XML_GetCurrentColumnNumber(parser->parser);
--
-- return INT2FIX(column);
--}
--
--/* byte index method */
--static VALUE
--XMLParser_getCurrentByteIndex(VALUE obj)
--{
-- XMLParser* parser;
-- long pos;
--
-- GET_PARSER(obj, parser);
-- pos = XML_GetCurrentByteIndex(parser->parser);
--
-- return INT2FIX(pos);
--}
--
--/* set URI base */
--static VALUE
--XMLParser_setBase(VALUE obj, VALUE base)
--{
-- XMLParser* parser;
-- int ret;
--
-- Check_Type(base, T_STRING);
-- GET_PARSER(obj, parser);
-- if (OBJ_TAINTED(base))
-- taintParser(parser);
-- ret = XML_SetBase(parser->parser, RSTRING_PTR(base));
--
-- return INT2FIX(ret);
--}
--
--/* get URI base */
--static VALUE
--XMLParser_getBase(VALUE obj)
--{
-- XMLParser* parser;
-- const XML_Char* ret;
--
-- GET_PARSER(obj, parser);
-- ret = XML_GetBase(parser->parser);
-- if (!ret)
-- return Qnil;
--
-- return TO_(ENC_(rb_str_new2((char*)ret)));
--}
--
--#ifdef NEW_EXPAT
--#if 0
--static VALUE
--XMLParser_getSpecifiedAttributes(VALUE obj)
--{
-- XMLParser* parser;
-- int count;
-- const XML_Char** atts;
-- VALUE attrhash;
--
-- GET_PARSER(obj, parser);
-- atts = parser->lastAttrs;
-- if (!atts)
-- return Qnil;
-- count = XML_GetSpecifiedAttributeCount(parser->parser)/2;
-- attrhash = rb_hash_new();
-- while (*atts) {
-- const char* key = *atts++;
-- atts++;
-- rb_hash_aset(attrhash, FO_(TO_(ENC_(rb_str_new2((char*)key)))),
-- (count-- > 0) ? Qtrue: Qfalse);
-- }
--
-- return attrhash;
--}
--#else
--static VALUE
--XMLParser_getSpecifiedAttributes(VALUE obj)
--{
-- XMLParser* parser;
-- int i, count;
-- const XML_Char** atts;
-- VALUE attrarray;
--
-- GET_PARSER(obj, parser);
-- atts = parser->lastAttrs;
-- if (!atts)
-- return Qnil;
-- count = XML_GetSpecifiedAttributeCount(parser->parser)/2;
-- attrarray = rb_ary_new2(count);
-- for (i = 0; i < count; i++, atts+=2) {
-- const char* key = *atts;
-- rb_ary_push(attrarray, TO_(ENC_(rb_str_new2((char*)key))));
-- }
--
-- return attrarray;
--}
--#endif
--
--static VALUE
--XMLParser_getCurrentByteCount(VALUE obj)
--{
-- XMLParser* parser;
--
-- GET_PARSER(obj, parser);
-- return INT2FIX(XML_GetCurrentByteCount(parser->parser));
--}
--#endif
--
--#ifdef XML_DTD
--static VALUE
--XMLParser_setParamEntityParsing(VALUE obj, VALUE parsing)
--{
-- XMLParser* parser;
-- int ret;
--
-- Check_Type(parsing, T_FIXNUM);
-- GET_PARSER(obj, parser);
-- ret = XML_SetParamEntityParsing(parser->parser, FIX2INT(parsing));
--
-- return INT2FIX(ret);
--}
--#endif
--
--static VALUE
--XMLParser_s_expatVersion(VALUE obj)
--{
--#if defined(HAVE_EXPAT_H)
-- return ENC_(rb_str_new2(XML_ExpatVersion()));
--#elif defined(EXPAT_1_2)
-- return ENC_(rb_str_new2("1.2"));
--#elif defined(NEW_EXPAT)
-- return ENC_(rb_str_new2("1.1"));
--#else
-- return ENC_(rb_str_new2("1.0"));
--#endif
--}
--
--#ifdef HAVE_EXPAT_H
--static VALUE
--XMLParser_setReturnNSTriplet(VALUE obj, VALUE do_nst)
--{
-- XMLParser* parser;
-- int nst;
--
-- GET_PARSER(obj, parser);
-- switch (TYPE(do_nst)) {
-- case T_TRUE:
-- nst = 1;
-- break;
-- case T_FALSE:
-- nst = 0;
-- break;
-- case T_FIXNUM:
-- nst = FIX2INT(do_nst);
-- break;
-- default:
-- rb_raise(rb_eTypeError, "not valid value");
-- }
-- XML_SetReturnNSTriplet(parser->parser, nst);
--
-- return Qnil;
--}
--
--
--static VALUE
--XMLParser_getInputContext(VALUE obj)
--{
-- XMLParser* parser;
-- const char* buffer;
-- int offset;
-- int size;
-- VALUE ret = Qnil;
--
-- GET_PARSER(obj, parser);
-- buffer = XML_GetInputContext(parser->parser,
-- &offset,
-- &size);
-- if (buffer && size > 0) {
-- ret = rb_ary_new3(2,
-- TO_(ENC_(rb_str_new(buffer, size))),
-- INT2FIX(offset));
-- }
--
-- return ret;
--}
--
--
--static VALUE
--XMLParser_getIdAttrribute(VALUE obj)
--{
-- XMLParser* parser;
-- int idattr;
-- const XML_Char** atts;
--
-- GET_PARSER(obj, parser);
-- atts = parser->lastAttrs;
-- if (!atts)
-- return Qnil;
-- idattr = XML_GetIdAttributeIndex(parser->parser);
-- if (idattr < 0)
-- return Qnil;
-- return TO_(ENC_(rb_str_new2((char*)atts[idattr])));
--}
--#endif
--
--#ifdef HAVE_XML_USEFOREIGNDTD
--static VALUE
--XMLParser_useForeignDTD(VALUE obj, VALUE useDTD)
--{
-- XMLParser* parser;
-- int dtd;
-- int ret;
--
-- GET_PARSER(obj, parser);
-- switch (TYPE(useDTD)) {
-- case T_TRUE:
-- dtd = 1;
-- break;
-- case T_FALSE:
-- dtd = 0;
-- break;
-- case T_FIXNUM:
-- dtd = FIX2INT(useDTD);
-- break;
-- default:
-- rb_raise(rb_eTypeError, "not valid value");
-- }
-- ret = XML_UseForeignDTD(parser->parser, dtd);
--
-- return INT2FIX(ret);
--}
--#endif
--
--#ifdef HAVE_XML_GETFEATURELIST
--static VALUE
--XMLParser_s_getFeatureList(VALUE obj)
--{
-- const XML_Feature* list;
-- VALUE ret = rb_hash_new();
--
-- list = XML_GetFeatureList();
-- while (list && list->feature) {
-- rb_hash_aset(ret, FO_(ENC_(rb_str_new2(list->name))), INT2NUM(list->value));
-- list++;
-- }
--
-- return ret;
--}
--#endif
--
--void
--Init_xmlparser()
--{
-- VALUE mXML;
--
--#ifdef HAVE_RUBY_ENCODING_H
-- enc_xml = rb_utf8_encoding();
--#endif
--
-- eXMLParserError = rb_define_class("XMLParserError", rb_eStandardError);
-- cXMLParser = rb_define_class("XMLParser", rb_cObject);
-- cXMLEncoding = rb_define_class("XMLEncoding", rb_cObject);
--
-- /* Class name aliases */
-- if (rb_const_defined(rb_cObject, rb_intern("XML")) == Qtrue)
-- mXML = rb_const_get(rb_cObject, rb_intern("XML"));
-- else
-- mXML = rb_define_module("XML");
-- rb_define_const(mXML, "ParserError", eXMLParserError);
-- rb_define_const(cXMLParser, "Error", eXMLParserError);
-- rb_define_const(mXML, "Parser", cXMLParser);
-- rb_define_const(mXML, "Encoding", cXMLEncoding);
--
-- rb_define_singleton_method(cXMLParser, "new", XMLParser_new, -1);
-- rb_define_singleton_method(cXMLParser, "expatVersion",
-- XMLParser_s_expatVersion, 0);
-- rb_define_method(cXMLParser, "initialize", XMLParser_initialize, -1);
-- rb_define_method(cXMLParser, "parse", XMLParser_parse, -1);
-- rb_define_method(cXMLParser, "done", XMLParser_done, 0);
-- rb_define_method(cXMLParser, "defaultCurrent", XMLParser_defaultCurrent, 0);
-- rb_define_method(cXMLParser, "line", XMLParser_getCurrentLineNumber, 0);
-- rb_define_method(cXMLParser, "column", XMLParser_getCurrentColumnNumber, 0);
-- rb_define_method(cXMLParser, "byteIndex", XMLParser_getCurrentByteIndex, 0);
-- rb_define_method(cXMLParser, "setBase", XMLParser_setBase, 1);
-- rb_define_method(cXMLParser, "getBase", XMLParser_getBase, 0);
--#ifdef NEW_EXPAT
-- rb_define_method(cXMLParser, "getSpecifiedAttributes",
-- XMLParser_getSpecifiedAttributes, 0);
-- rb_define_method(cXMLParser, "byteCount", XMLParser_getCurrentByteCount, 0);
--#endif
--#ifdef XML_DTD
-- rb_define_method(cXMLParser, "setParamEntityParsing",
-- XMLParser_setParamEntityParsing, 1);
--#endif
--#ifdef HAVE_EXPAT_H
-- rb_define_method(cXMLParser, "setReturnNSTriplet",
-- XMLParser_setReturnNSTriplet, 1);
-- rb_define_method(cXMLParser, "getInputContext",
-- XMLParser_getInputContext, 0);
-- rb_define_method(cXMLParser, "getIdAttribute",
-- XMLParser_getIdAttrribute, 0);
--#endif
--
--#ifdef HAVE_XML_PARSERRESET
-- rb_define_method(cXMLParser, "reset", XMLParser_reset, -1);
--#endif
--
-- rb_define_method(cXMLEncoding, "map", XMLEncoding_map, 1);
-- rb_define_method(cXMLEncoding, "convert", XMLEncoding_convert, 1);
--
--#ifdef HAVE_XML_USEFOREIGNDTD
-- rb_define_method(cXMLParser, "useForeignDTD",
-- XMLParser_useForeignDTD, 1);
--#endif
--#ifdef HAVE_XML_GETFEATURELIST
-- rb_define_singleton_method(cXMLParser, "getFeatureList",
-- XMLParser_s_getFeatureList, 0);
--#endif
--
--#define DEFINE_EVENT_CODE(klass, name) \
-- rb_define_const(klass, #name, sym##name = ID2SYM(rb_intern(#name)))
--
-- DEFINE_EVENT_CODE(cXMLParser, START_ELEM);
-- DEFINE_EVENT_CODE(cXMLParser, END_ELEM);
-- DEFINE_EVENT_CODE(cXMLParser, CDATA);
-- DEFINE_EVENT_CODE(cXMLParser, PI);
-- DEFINE_EVENT_CODE(cXMLParser, DEFAULT);
-- DEFINE_EVENT_CODE(cXMLParser, UNPARSED_ENTITY_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, NOTATION_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, EXTERNAL_ENTITY_REF);
--#ifdef NEW_EXPAT
-- DEFINE_EVENT_CODE(cXMLParser, COMMENT);
-- DEFINE_EVENT_CODE(cXMLParser, START_CDATA);
-- DEFINE_EVENT_CODE(cXMLParser, END_CDATA);
-- DEFINE_EVENT_CODE(cXMLParser, START_NAMESPACE_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, END_NAMESPACE_DECL);
--#endif
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-- DEFINE_EVENT_CODE(cXMLParser, SKIPPED_ENTITY);
--#endif
--#ifdef XML_DTD
-- rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_NEVER",
-- INT2FIX(XML_PARAM_ENTITY_PARSING_NEVER));
-- rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_UNLESS_STANDALONE",
-- INT2FIX(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE));
-- rb_define_const(cXMLParser, "PARAM_ENTITY_PARSING_ALWAYS",
-- INT2FIX(XML_PARAM_ENTITY_PARSING_ALWAYS));
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- DEFINE_EVENT_CODE(cXMLParser, START_DOCTYPE_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, END_DOCTYPE_DECL);
--#endif
--#ifdef HAVE_EXPAT_H
-- DEFINE_EVENT_CODE(cXMLParser, ELEMENT_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, ATTLIST_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, XML_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, ENTITY_DECL);
--#endif
--#if 0
-- DEFINE_EVENT_CODE(cXMLParser, EXTERNAL_PARSED_ENTITY_DECL);
-- DEFINE_EVENT_CODE(cXMLParser, INTERNAL_PARSED_ENTITY_DECL);
--#endif
--#if 0
-- DEFINE_EVENT_CODE(cXMLParser, UNKNOWN_ENCODING);
--#endif
--
-- id_map = rb_intern("_map");
-- id_startElementHandler = rb_intern("startElement");
-- id_endElementHandler = rb_intern("endElement");
-- id_characterDataHandler = rb_intern("character");
-- id_processingInstructionHandler = rb_intern("processingInstruction");
-- id_defaultHandler = rb_intern("default");
-- id_unparsedEntityDeclHandler = rb_intern("unparsedEntityDecl");
-- id_notationDeclHandler = rb_intern("notationDecl");
-- id_externalEntityRefHandler = rb_intern("externalEntityRef");
--#ifdef NEW_EXPAT
-- id_defaultExpandHandler = rb_intern("defaultExpand");
-- id_commentHandler = rb_intern("comment");
-- id_startCdataSectionHandler = rb_intern("startCdata");
-- id_endCdataSectionHandler = rb_intern("endCdata");
-- id_startNamespaceDeclHandler = rb_intern("startNamespaceDecl");
-- id_endNamespaceDeclHandler = rb_intern("endNamespaceDecl");
-- id_notStandaloneHandler = rb_intern("notStandalone");
--#endif
--#ifdef HAVE_XML_SETDOCTYPEDECLHANDLER
-- id_startDoctypeDeclHandler = rb_intern("startDoctypeDecl");
-- id_endDoctypeDeclHandler = rb_intern("endDoctypeDecl");
--#endif
-- id_unknownEncoding = rb_intern("unknownEncoding");
-- id_convert = rb_intern("convert");
--#ifdef HAVE_EXPAT_H
-- id_elementDeclHandler = rb_intern("elementDecl");
-- id_attlistDeclHandler = rb_intern("attlistDecl");
-- id_xmlDeclHandler = rb_intern("xmlDecl");
-- id_entityDeclHandler = rb_intern("entityDecl");
--#endif
--#if 0
-- id_externalParsedEntityDeclHandler = rb_intern("externalParsedEntityDecl");
-- id_internalParsedEntityDeclHandler = rb_intern("internalParsedEntityDecl");
--#endif
--#ifdef HAVE_XML_SETSKIPPEDENTITYHANDLER
-- id_skippedEntityHandler = rb_intern("skippedEntity");
--#endif
--}
diff --git a/debian/patches/series b/debian/patches/series
index 939b7e9..f7217c4 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -1,3 +1,2 @@
replaces_gt_symbol_by_enconded_version.patch
-move-files-to-ext.patch
xmlparser-ftbfs-fix.patch
diff --git a/debian/patches/xmlparser-ftbfs-fix.patch b/debian/patches/xmlparser-ftbfs-fix.patch
index b6b0fd4..62ab417 100644
--- a/debian/patches/xmlparser-ftbfs-fix.patch
+++ b/debian/patches/xmlparser-ftbfs-fix.patch
@@ -1,5 +1,5 @@
---- a/ext/xmlparser.c
-+++ b/ext/xmlparser.c
+--- a/xmlparser.c
++++ b/xmlparser.c
@@ -1780,7 +1780,7 @@ XMLParser_parse(int argc, VALUE* argv, V
if (!ret) {
int err = XML_GetErrorCode(parser->parser);
diff --git a/debian/rules b/debian/rules
index 6ddcc96..d384af2 100755
--- a/debian/rules
+++ b/debian/rules
@@ -14,7 +14,13 @@
%:
dh $@ --buildsystem=ruby --with ruby
+override_dh_auto_install:
+ mkdir -p ext
+ mv extconf.rb xmlparser.c ext/
+ dh_auto_install
+
override_dh_auto_clean:
dh_auto_clean
- # moved to ext/
- rm -f encoding.h extconf.rb xmlparser.c
+ if [ -f ext/extconf.rb ]; then mv ext/extconf.rb . ; fi
+ if [ -f ext/xmlparser.c ]; then mv ext/xmlparser.c . ; fi
+ $(RM) -r ext
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-ruby-extras/ruby-xmlparser.git
More information about the Pkg-ruby-extras-commits
mailing list