libxml-ruby 0.9.5-x86-mswin32-60 → 0.9.6-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +28 -0
- data/README +8 -12
- data/ext/libxml/cbg.c +86 -86
- data/ext/libxml/libxml.c +875 -899
- data/ext/libxml/ruby_libxml.h +91 -65
- data/ext/libxml/ruby_xml_attr.c +485 -485
- data/ext/libxml/ruby_xml_attr.h +3 -3
- data/ext/libxml/ruby_xml_attributes.h +2 -2
- data/ext/libxml/ruby_xml_document.c +124 -307
- data/ext/libxml/ruby_xml_document.h +3 -3
- data/ext/libxml/ruby_xml_dtd.c +119 -119
- data/ext/libxml/ruby_xml_dtd.h +2 -2
- data/ext/libxml/ruby_xml_error.c +1 -1
- data/ext/libxml/ruby_xml_error.h +2 -2
- data/ext/libxml/ruby_xml_html_parser.c +119 -119
- data/ext/libxml/ruby_xml_html_parser.h +3 -3
- data/ext/libxml/ruby_xml_input.c +13 -11
- data/ext/libxml/ruby_xml_input.h +3 -3
- data/ext/libxml/ruby_xml_input_cbg.c +197 -197
- data/ext/libxml/ruby_xml_namespace.c +158 -0
- data/ext/libxml/ruby_xml_namespace.h +12 -0
- data/ext/libxml/ruby_xml_namespaces.c +303 -0
- data/ext/libxml/{ruby_xml_ns.h → ruby_xml_namespaces.h} +4 -5
- data/ext/libxml/ruby_xml_node.c +88 -293
- data/ext/libxml/ruby_xml_node.h +4 -4
- data/ext/libxml/ruby_xml_parser.c +152 -152
- data/ext/libxml/ruby_xml_parser.h +3 -3
- data/ext/libxml/ruby_xml_parser_context.c +630 -657
- data/ext/libxml/ruby_xml_parser_context.h +3 -3
- data/ext/libxml/ruby_xml_reader.c +899 -904
- data/ext/libxml/ruby_xml_reader.h +2 -2
- data/ext/libxml/ruby_xml_relaxng.h +2 -2
- data/ext/libxml/ruby_xml_sax_parser.c +175 -175
- data/ext/libxml/ruby_xml_sax_parser.h +3 -3
- data/ext/libxml/ruby_xml_schema.c +165 -165
- data/ext/libxml/ruby_xml_schema.h +2 -2
- data/ext/libxml/ruby_xml_state.h +2 -2
- data/ext/libxml/ruby_xml_xinclude.c +24 -24
- data/ext/libxml/ruby_xml_xinclude.h +3 -3
- data/ext/libxml/ruby_xml_xpath.c +108 -108
- data/ext/libxml/ruby_xml_xpath.h +3 -3
- data/ext/libxml/ruby_xml_xpath_context.c +84 -35
- data/ext/libxml/ruby_xml_xpath_context.h +3 -3
- data/ext/libxml/ruby_xml_xpath_expression.c +5 -7
- data/ext/libxml/ruby_xml_xpath_expression.h +2 -2
- data/ext/libxml/ruby_xml_xpath_object.c +7 -7
- data/ext/libxml/ruby_xml_xpath_object.h +2 -2
- data/ext/libxml/ruby_xml_xpointer.c +107 -107
- data/ext/libxml/ruby_xml_xpointer.h +3 -3
- data/ext/libxml/version.h +2 -2
- data/ext/mingw/libxml_ruby.dll.a +0 -0
- data/ext/mingw/libxml_ruby.so +0 -0
- data/ext/vc/libxml_ruby.vcproj +13 -5
- data/lib/libxml.rb +4 -1
- data/lib/libxml/document.rb +40 -6
- data/lib/libxml/hpricot.rb +76 -76
- data/lib/libxml/namespace.rb +60 -0
- data/lib/libxml/namespaces.rb +36 -0
- data/lib/libxml/node.rb +90 -26
- data/lib/libxml/ns.rb +20 -0
- data/test/model/bands.xml +5 -0
- data/test/tc_attributes.rb +1 -1
- data/test/tc_document.rb +24 -41
- data/test/tc_document_write.rb +87 -115
- data/test/tc_namespace.rb +59 -0
- data/test/tc_namespaces.rb +174 -0
- data/test/tc_node.rb +41 -33
- data/test/tc_node_copy.rb +1 -1
- data/test/tc_node_edit.rb +6 -0
- data/test/tc_node_write.rb +76 -0
- data/test/tc_xinclude.rb +2 -9
- data/test/tc_xpath.rb +38 -11
- data/test/test_suite.rb +3 -1
- metadata +16 -9
- data/ext/libxml/ruby_xml_ns.c +0 -150
- data/test/ets_copy_bug.rb +0 -21
- data/test/ets_copy_bug3.rb +0 -38
- data/test/model/default_validation_bug.rb +0 -0
- data/test/tc_ns.rb +0 -18
data/ext/libxml/ruby_xml_node.h
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
/* $Id: ruby_xml_node.h
|
1
|
+
/* $Id: ruby_xml_node.h 666 2008-12-07 00:16:50Z cfis $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
5
|
-
#ifndef
|
6
|
-
#define
|
5
|
+
#ifndef __RXML_NODE__
|
6
|
+
#define __RXML_NODE__
|
7
7
|
|
8
8
|
extern VALUE cXMLNode;
|
9
9
|
|
10
10
|
void ruby_init_xml_node(void);
|
11
11
|
void rxml_node_mark_common(xmlNodePtr xnode);
|
12
|
-
VALUE rxml_node_wrap(VALUE
|
12
|
+
VALUE rxml_node_wrap(VALUE klass, xmlNodePtr xnode);
|
13
13
|
VALUE check_string_or_symbol(VALUE val);
|
14
14
|
#endif
|
@@ -1,152 +1,152 @@
|
|
1
|
-
/* $Id: ruby_xml_parser.c 650 2008-11-30 03:40:22Z cfis $ */
|
2
|
-
|
3
|
-
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
-
|
5
|
-
#include <stdarg.h>
|
6
|
-
#include "ruby_libxml.h"
|
7
|
-
|
8
|
-
VALUE cXMLParser;
|
9
|
-
static ID INPUT_ATTR;
|
10
|
-
static ID CONTEXT_ATTR;
|
11
|
-
|
12
|
-
/*
|
13
|
-
* Document-class: LibXML::XML::Parser
|
14
|
-
*
|
15
|
-
* The XML::Parser provides a tree based API for processing
|
16
|
-
* xml documents, in contract to XML::Reader's stream
|
17
|
-
* based api and XML::SaxParser callback based API.
|
18
|
-
*
|
19
|
-
* As a result, parsing a document creates an in-memory document object
|
20
|
-
* that consist of any number of XML::Node instances. This is simple
|
21
|
-
* and powerful model, but has the major limitation that the size of
|
22
|
-
* the document that can be processed is limited by the amount of
|
23
|
-
* memory available. In such cases, it is better to use the XML::Reader.
|
24
|
-
*
|
25
|
-
* Using the parser is simple:
|
26
|
-
*
|
27
|
-
* parser = XML::Parser.new
|
28
|
-
* parser.file = 'my_file'
|
29
|
-
* doc = parser.parse
|
30
|
-
*
|
31
|
-
* You can also parse strings (see XML::Parser.string) and io objects (see
|
32
|
-
* XML::Parser.io).
|
33
|
-
*/
|
34
|
-
|
35
|
-
/*
|
36
|
-
* call-seq:
|
37
|
-
* parser.initialize -> parser
|
38
|
-
*
|
39
|
-
* Initiliazes instance of parser.
|
40
|
-
*/
|
41
|
-
static VALUE rxml_parser_initialize(VALUE self)
|
42
|
-
{
|
43
|
-
VALUE input = rb_class_new_instance(0, NULL, cXMLInput);
|
44
|
-
rb_iv_set(self, "@input", input);
|
45
|
-
rb_iv_set(self, "@context", Qnil);
|
46
|
-
return self;
|
47
|
-
}
|
48
|
-
|
49
|
-
static xmlParserCtxtPtr rxml_parser_filename_ctxt(VALUE input)
|
50
|
-
{
|
51
|
-
xmlParserCtxtPtr ctxt;
|
52
|
-
int retry_count = 0;
|
53
|
-
VALUE filename = rb_ivar_get(input, FILE_ATTR);
|
54
|
-
|
55
|
-
retry: ctxt = xmlCreateFileParserCtxt(StringValuePtr(filename));
|
56
|
-
if (ctxt == NULL)
|
57
|
-
{
|
58
|
-
if ((errno == EMFILE || errno == ENFILE) && retry_count == 0)
|
59
|
-
{
|
60
|
-
retry_count++;
|
61
|
-
rb_gc();
|
62
|
-
goto retry;
|
63
|
-
}
|
64
|
-
else
|
65
|
-
{
|
66
|
-
rb_raise(rb_eIOError, StringValuePtr(filename));
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
return ctxt;
|
71
|
-
}
|
72
|
-
|
73
|
-
static xmlParserCtxtPtr rxml_parser_str_ctxt(VALUE input)
|
74
|
-
{
|
75
|
-
VALUE str = rb_ivar_get(input, STRING_ATTR);
|
76
|
-
return xmlCreateMemoryParserCtxt(StringValuePtr(str), RSTRING_LEN(str));
|
77
|
-
}
|
78
|
-
|
79
|
-
static xmlParserCtxtPtr rxml_parser_io_ctxt(VALUE input)
|
80
|
-
{
|
81
|
-
VALUE io = rb_ivar_get(input, IO_ATTR);
|
82
|
-
VALUE encoding = rb_ivar_get(input, ENCODING_ATTR);
|
83
|
-
xmlCharEncoding xmlEncoding = NUM2INT(encoding);
|
84
|
-
|
85
|
-
return xmlCreateIOParserCtxt(NULL, NULL,
|
86
|
-
(xmlInputReadCallback) rxml_read_callback, NULL, (void *) io, xmlEncoding);
|
87
|
-
}
|
88
|
-
|
89
|
-
/*
|
90
|
-
* call-seq:
|
91
|
-
* parser.parse -> document
|
92
|
-
*
|
93
|
-
* Parse the input XML and create an XML::Document with
|
94
|
-
* it's content. If an error occurs, XML::Parser::ParseError
|
95
|
-
* is thrown.
|
96
|
-
*/
|
97
|
-
static VALUE rxml_parser_parse(VALUE self)
|
98
|
-
{
|
99
|
-
xmlParserCtxtPtr ctxt;
|
100
|
-
VALUE context;
|
101
|
-
VALUE input = rb_ivar_get(self, INPUT_ATTR);
|
102
|
-
|
103
|
-
context = rb_ivar_get(self, CONTEXT_ATTR);
|
104
|
-
if (context != Qnil)
|
105
|
-
rb_raise(rb_eRuntimeError, "You cannot parse a data source twice");
|
106
|
-
|
107
|
-
if (rb_ivar_get(input, FILE_ATTR) != Qnil)
|
108
|
-
ctxt = rxml_parser_filename_ctxt(input);
|
109
|
-
else if (rb_ivar_get(input, STRING_ATTR) != Qnil)
|
110
|
-
ctxt = rxml_parser_str_ctxt(input);
|
111
|
-
/*else if (rb_ivar_get(input, DOCUMENT_ATTR) != Qnil)
|
112
|
-
ctxt = rxml_parser_parse_document(input);*/
|
113
|
-
else if (rb_ivar_get(input, IO_ATTR) != Qnil)
|
114
|
-
ctxt = rxml_parser_io_ctxt(input);
|
115
|
-
else
|
116
|
-
rb_raise(rb_eArgError, "You must specify a parser data source");
|
117
|
-
|
118
|
-
if (!ctxt)
|
119
|
-
rxml_raise(&xmlLastError);
|
120
|
-
|
121
|
-
context = rxml_parser_context_wrap(ctxt);
|
122
|
-
rb_ivar_set(self, CONTEXT_ATTR, context);
|
123
|
-
|
124
|
-
if (xmlParseDocument(ctxt) == -1 || !ctxt->wellFormed)
|
125
|
-
{
|
126
|
-
xmlFreeDoc(ctxt->myDoc);
|
127
|
-
rxml_raise(&ctxt->lastError);
|
128
|
-
}
|
129
|
-
|
130
|
-
return rxml_document_wrap(ctxt->myDoc);
|
131
|
-
}
|
132
|
-
|
133
|
-
// Rdoc needs to know
|
134
|
-
#ifdef RDOC_NEVER_DEFINED
|
135
|
-
mLibXML = rb_define_module("LibXML");
|
136
|
-
mXML = rb_define_module_under(mLibXML, "XML");
|
137
|
-
#endif
|
138
|
-
|
139
|
-
void ruby_init_parser(void)
|
140
|
-
{
|
141
|
-
cXMLParser = rb_define_class_under(mXML, "Parser", rb_cObject);
|
142
|
-
|
143
|
-
/* Atributes */
|
144
|
-
INPUT_ATTR = rb_intern("@input");
|
145
|
-
CONTEXT_ATTR = rb_intern("@context");
|
146
|
-
rb_define_attr(cXMLParser, "input", 1, 0);
|
147
|
-
rb_define_attr(cXMLParser, "context", 1, 0);
|
148
|
-
|
149
|
-
/* Instance Methods */
|
150
|
-
rb_define_method(cXMLParser, "initialize", rxml_parser_initialize, 0);
|
151
|
-
rb_define_method(cXMLParser, "parse", rxml_parser_parse, 0);
|
152
|
-
}
|
1
|
+
/* $Id: ruby_xml_parser.c 650 2008-11-30 03:40:22Z cfis $ */
|
2
|
+
|
3
|
+
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
+
|
5
|
+
#include <stdarg.h>
|
6
|
+
#include "ruby_libxml.h"
|
7
|
+
|
8
|
+
VALUE cXMLParser;
|
9
|
+
static ID INPUT_ATTR;
|
10
|
+
static ID CONTEXT_ATTR;
|
11
|
+
|
12
|
+
/*
|
13
|
+
* Document-class: LibXML::XML::Parser
|
14
|
+
*
|
15
|
+
* The XML::Parser provides a tree based API for processing
|
16
|
+
* xml documents, in contract to XML::Reader's stream
|
17
|
+
* based api and XML::SaxParser callback based API.
|
18
|
+
*
|
19
|
+
* As a result, parsing a document creates an in-memory document object
|
20
|
+
* that consist of any number of XML::Node instances. This is simple
|
21
|
+
* and powerful model, but has the major limitation that the size of
|
22
|
+
* the document that can be processed is limited by the amount of
|
23
|
+
* memory available. In such cases, it is better to use the XML::Reader.
|
24
|
+
*
|
25
|
+
* Using the parser is simple:
|
26
|
+
*
|
27
|
+
* parser = XML::Parser.new
|
28
|
+
* parser.file = 'my_file'
|
29
|
+
* doc = parser.parse
|
30
|
+
*
|
31
|
+
* You can also parse strings (see XML::Parser.string) and io objects (see
|
32
|
+
* XML::Parser.io).
|
33
|
+
*/
|
34
|
+
|
35
|
+
/*
|
36
|
+
* call-seq:
|
37
|
+
* parser.initialize -> parser
|
38
|
+
*
|
39
|
+
* Initiliazes instance of parser.
|
40
|
+
*/
|
41
|
+
static VALUE rxml_parser_initialize(VALUE self)
|
42
|
+
{
|
43
|
+
VALUE input = rb_class_new_instance(0, NULL, cXMLInput);
|
44
|
+
rb_iv_set(self, "@input", input);
|
45
|
+
rb_iv_set(self, "@context", Qnil);
|
46
|
+
return self;
|
47
|
+
}
|
48
|
+
|
49
|
+
static xmlParserCtxtPtr rxml_parser_filename_ctxt(VALUE input)
|
50
|
+
{
|
51
|
+
xmlParserCtxtPtr ctxt;
|
52
|
+
int retry_count = 0;
|
53
|
+
VALUE filename = rb_ivar_get(input, FILE_ATTR);
|
54
|
+
|
55
|
+
retry: ctxt = xmlCreateFileParserCtxt(StringValuePtr(filename));
|
56
|
+
if (ctxt == NULL)
|
57
|
+
{
|
58
|
+
if ((errno == EMFILE || errno == ENFILE) && retry_count == 0)
|
59
|
+
{
|
60
|
+
retry_count++;
|
61
|
+
rb_gc();
|
62
|
+
goto retry;
|
63
|
+
}
|
64
|
+
else
|
65
|
+
{
|
66
|
+
rb_raise(rb_eIOError, StringValuePtr(filename));
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
return ctxt;
|
71
|
+
}
|
72
|
+
|
73
|
+
static xmlParserCtxtPtr rxml_parser_str_ctxt(VALUE input)
|
74
|
+
{
|
75
|
+
VALUE str = rb_ivar_get(input, STRING_ATTR);
|
76
|
+
return xmlCreateMemoryParserCtxt(StringValuePtr(str), RSTRING_LEN(str));
|
77
|
+
}
|
78
|
+
|
79
|
+
static xmlParserCtxtPtr rxml_parser_io_ctxt(VALUE input)
|
80
|
+
{
|
81
|
+
VALUE io = rb_ivar_get(input, IO_ATTR);
|
82
|
+
VALUE encoding = rb_ivar_get(input, ENCODING_ATTR);
|
83
|
+
xmlCharEncoding xmlEncoding = NUM2INT(encoding);
|
84
|
+
|
85
|
+
return xmlCreateIOParserCtxt(NULL, NULL,
|
86
|
+
(xmlInputReadCallback) rxml_read_callback, NULL, (void *) io, xmlEncoding);
|
87
|
+
}
|
88
|
+
|
89
|
+
/*
|
90
|
+
* call-seq:
|
91
|
+
* parser.parse -> document
|
92
|
+
*
|
93
|
+
* Parse the input XML and create an XML::Document with
|
94
|
+
* it's content. If an error occurs, XML::Parser::ParseError
|
95
|
+
* is thrown.
|
96
|
+
*/
|
97
|
+
static VALUE rxml_parser_parse(VALUE self)
|
98
|
+
{
|
99
|
+
xmlParserCtxtPtr ctxt;
|
100
|
+
VALUE context;
|
101
|
+
VALUE input = rb_ivar_get(self, INPUT_ATTR);
|
102
|
+
|
103
|
+
context = rb_ivar_get(self, CONTEXT_ATTR);
|
104
|
+
if (context != Qnil)
|
105
|
+
rb_raise(rb_eRuntimeError, "You cannot parse a data source twice");
|
106
|
+
|
107
|
+
if (rb_ivar_get(input, FILE_ATTR) != Qnil)
|
108
|
+
ctxt = rxml_parser_filename_ctxt(input);
|
109
|
+
else if (rb_ivar_get(input, STRING_ATTR) != Qnil)
|
110
|
+
ctxt = rxml_parser_str_ctxt(input);
|
111
|
+
/*else if (rb_ivar_get(input, DOCUMENT_ATTR) != Qnil)
|
112
|
+
ctxt = rxml_parser_parse_document(input);*/
|
113
|
+
else if (rb_ivar_get(input, IO_ATTR) != Qnil)
|
114
|
+
ctxt = rxml_parser_io_ctxt(input);
|
115
|
+
else
|
116
|
+
rb_raise(rb_eArgError, "You must specify a parser data source");
|
117
|
+
|
118
|
+
if (!ctxt)
|
119
|
+
rxml_raise(&xmlLastError);
|
120
|
+
|
121
|
+
context = rxml_parser_context_wrap(ctxt);
|
122
|
+
rb_ivar_set(self, CONTEXT_ATTR, context);
|
123
|
+
|
124
|
+
if (xmlParseDocument(ctxt) == -1 || !ctxt->wellFormed)
|
125
|
+
{
|
126
|
+
xmlFreeDoc(ctxt->myDoc);
|
127
|
+
rxml_raise(&ctxt->lastError);
|
128
|
+
}
|
129
|
+
|
130
|
+
return rxml_document_wrap(ctxt->myDoc);
|
131
|
+
}
|
132
|
+
|
133
|
+
// Rdoc needs to know
|
134
|
+
#ifdef RDOC_NEVER_DEFINED
|
135
|
+
mLibXML = rb_define_module("LibXML");
|
136
|
+
mXML = rb_define_module_under(mLibXML, "XML");
|
137
|
+
#endif
|
138
|
+
|
139
|
+
void ruby_init_parser(void)
|
140
|
+
{
|
141
|
+
cXMLParser = rb_define_class_under(mXML, "Parser", rb_cObject);
|
142
|
+
|
143
|
+
/* Atributes */
|
144
|
+
INPUT_ATTR = rb_intern("@input");
|
145
|
+
CONTEXT_ATTR = rb_intern("@context");
|
146
|
+
rb_define_attr(cXMLParser, "input", 1, 0);
|
147
|
+
rb_define_attr(cXMLParser, "context", 1, 0);
|
148
|
+
|
149
|
+
/* Instance Methods */
|
150
|
+
rb_define_method(cXMLParser, "initialize", rxml_parser_initialize, 0);
|
151
|
+
rb_define_method(cXMLParser, "parse", rxml_parser_parse, 0);
|
152
|
+
}
|
@@ -1,9 +1,9 @@
|
|
1
|
-
/* $Id: ruby_xml_parser.h
|
1
|
+
/* $Id: ruby_xml_parser.h 666 2008-12-07 00:16:50Z cfis $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
5
|
-
#ifndef
|
6
|
-
#define
|
5
|
+
#ifndef __RXML_PARSER__
|
6
|
+
#define __RXML_PARSER__
|
7
7
|
|
8
8
|
#define MAX_LIBXML_FEATURES_LEN 50
|
9
9
|
|
@@ -1,657 +1,630 @@
|
|
1
|
-
/* $Id: ruby_xml_parser_context.c
|
2
|
-
|
3
|
-
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
-
|
5
|
-
#include "ruby_libxml.h"
|
6
|
-
#include "ruby_xml_parser_context.h"
|
7
|
-
|
8
|
-
VALUE cXMLParserContext;
|
9
|
-
|
10
|
-
/*
|
11
|
-
* Document-class: LibXML::XML::Parser::Context
|
12
|
-
*
|
13
|
-
* The XML::Parser::Context class provides in-depth control over how
|
14
|
-
* a document is parsed.
|
15
|
-
*/
|
16
|
-
|
17
|
-
static void rxml_parser_context_free(xmlParserCtxtPtr ctxt)
|
18
|
-
{
|
19
|
-
if (ctxt != NULL)
|
20
|
-
xmlFreeParserCtxt(ctxt);
|
21
|
-
}
|
22
|
-
|
23
|
-
VALUE rxml_parser_context_wrap(xmlParserCtxtPtr ctxt)
|
24
|
-
{
|
25
|
-
return Data_Wrap_Struct(cXMLParserContext, NULL, rxml_parser_context_free,
|
26
|
-
ctxt);
|
27
|
-
}
|
28
|
-
|
29
|
-
/*
|
30
|
-
* call-seq:
|
31
|
-
* context.data_directory -> "dir"
|
32
|
-
*
|
33
|
-
* Obtain the data directory associated with this context.
|
34
|
-
*/
|
35
|
-
static VALUE rxml_parser_context_data_directory_get(VALUE self)
|
36
|
-
{
|
37
|
-
xmlParserCtxtPtr ctxt;
|
38
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
39
|
-
|
40
|
-
if (ctxt->directory == NULL)
|
41
|
-
return (Qnil);
|
42
|
-
else
|
43
|
-
return (rb_str_new2(ctxt->directory));
|
44
|
-
}
|
45
|
-
|
46
|
-
/*
|
47
|
-
* call-seq:
|
48
|
-
* context.depth -> num
|
49
|
-
*
|
50
|
-
* Obtain the depth of this context.
|
51
|
-
*/
|
52
|
-
static VALUE rxml_parser_context_depth_get(VALUE self)
|
53
|
-
{
|
54
|
-
xmlParserCtxtPtr ctxt;
|
55
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
56
|
-
|
57
|
-
return (INT2NUM(ctxt->depth));
|
58
|
-
}
|
59
|
-
|
60
|
-
/*
|
61
|
-
* call-seq:
|
62
|
-
* context.disable_sax? -> (true|false)
|
63
|
-
*
|
64
|
-
* Determine whether SAX-based processing is disabled
|
65
|
-
* in this context.
|
66
|
-
*/
|
67
|
-
static VALUE rxml_parser_context_disable_sax_q(VALUE self)
|
68
|
-
{
|
69
|
-
xmlParserCtxtPtr ctxt;
|
70
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
71
|
-
|
72
|
-
if (ctxt->disableSAX)
|
73
|
-
return (Qtrue);
|
74
|
-
else
|
75
|
-
return (Qfalse);
|
76
|
-
}
|
77
|
-
|
78
|
-
/*
|
79
|
-
* call-seq:
|
80
|
-
* context.docbook? -> (true|false)
|
81
|
-
*
|
82
|
-
* Determine whether this is a docbook context.
|
83
|
-
*/
|
84
|
-
static VALUE rxml_parser_context_docbook_q(VALUE self)
|
85
|
-
{
|
86
|
-
xmlParserCtxtPtr ctxt;
|
87
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
88
|
-
|
89
|
-
if (ctxt->html == 2) // TODO check this
|
90
|
-
return (Qtrue);
|
91
|
-
else
|
92
|
-
return (Qfalse);
|
93
|
-
}
|
94
|
-
|
95
|
-
/*
|
96
|
-
* call-seq:
|
97
|
-
* context.encoding -> "encoding"
|
98
|
-
*
|
99
|
-
* Obtain the character encoding identifier used in
|
100
|
-
* this context.
|
101
|
-
*/
|
102
|
-
static VALUE rxml_parser_context_encoding_get(VALUE self)
|
103
|
-
{
|
104
|
-
xmlParserCtxtPtr ctxt;
|
105
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
106
|
-
|
107
|
-
if (ctxt->encoding == NULL)
|
108
|
-
return (Qnil);
|
109
|
-
else
|
110
|
-
return (rb_str_new2((const char*) ctxt->encoding));
|
111
|
-
}
|
112
|
-
|
113
|
-
/*
|
114
|
-
* call-seq:
|
115
|
-
* context.errno -> num
|
116
|
-
*
|
117
|
-
* Obtain the last-error number in this context.
|
118
|
-
*/
|
119
|
-
static VALUE rxml_parser_context_errno_get(VALUE self)
|
120
|
-
{
|
121
|
-
xmlParserCtxtPtr ctxt;
|
122
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
123
|
-
|
124
|
-
return (INT2NUM(ctxt->errNo));
|
125
|
-
}
|
126
|
-
|
127
|
-
/*
|
128
|
-
* call-seq:
|
129
|
-
* context.html? -> (true|false)
|
130
|
-
*
|
131
|
-
* Determine whether this is an html context.
|
132
|
-
*/
|
133
|
-
static VALUE rxml_parser_context_html_q(VALUE self)
|
134
|
-
{
|
135
|
-
xmlParserCtxtPtr ctxt;
|
136
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
137
|
-
|
138
|
-
if (ctxt->html == 1)
|
139
|
-
return (Qtrue);
|
140
|
-
else
|
141
|
-
return (Qfalse);
|
142
|
-
}
|
143
|
-
|
144
|
-
/*
|
145
|
-
* call-seq:
|
146
|
-
* context.max_num_streams -> num
|
147
|
-
*
|
148
|
-
* Obtain the limit on the number of IO streams opened in
|
149
|
-
* this context.
|
150
|
-
*/
|
151
|
-
static VALUE rxml_parser_context_io_max_num_streams_get(VALUE self)
|
152
|
-
{
|
153
|
-
// TODO alias to max_streams and dep this?
|
154
|
-
xmlParserCtxtPtr ctxt;
|
155
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
156
|
-
|
157
|
-
return (INT2NUM(ctxt->inputMax));
|
158
|
-
}
|
159
|
-
|
160
|
-
/*
|
161
|
-
* call-seq:
|
162
|
-
* context.num_streams -> "dir"
|
163
|
-
*
|
164
|
-
* Obtain the actual number of IO streams in this
|
165
|
-
* context.
|
166
|
-
*/
|
167
|
-
static VALUE rxml_parser_context_io_num_streams_get(VALUE self)
|
168
|
-
{
|
169
|
-
xmlParserCtxtPtr ctxt;
|
170
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
171
|
-
|
172
|
-
return (INT2NUM(ctxt->inputNr));
|
173
|
-
}
|
174
|
-
|
175
|
-
/*
|
176
|
-
* call-seq:
|
177
|
-
* context.keep_blanks? -> (true|false)
|
178
|
-
*
|
179
|
-
* Determine whether parsers in this context retain
|
180
|
-
* whitespace.
|
181
|
-
*/
|
182
|
-
static VALUE rxml_parser_context_keep_blanks_q(VALUE self)
|
183
|
-
{
|
184
|
-
xmlParserCtxtPtr ctxt;
|
185
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
186
|
-
|
187
|
-
if (ctxt->keepBlanks)
|
188
|
-
return (Qtrue);
|
189
|
-
else
|
190
|
-
return (Qfalse);
|
191
|
-
}
|
192
|
-
|
193
|
-
/*
|
194
|
-
* call-seq:
|
195
|
-
* context.name_depth -> num
|
196
|
-
*
|
197
|
-
* Obtain the name depth for this context.
|
198
|
-
*/
|
199
|
-
static VALUE rxml_parser_context_name_depth_get(VALUE self)
|
200
|
-
{
|
201
|
-
xmlParserCtxtPtr ctxt;
|
202
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
203
|
-
|
204
|
-
return (INT2NUM(ctxt->nameNr));
|
205
|
-
}
|
206
|
-
|
207
|
-
/*
|
208
|
-
* call-seq:
|
209
|
-
* context.name_depth_max -> num
|
210
|
-
*
|
211
|
-
* Obtain the maximum name depth for this context.
|
212
|
-
*/
|
213
|
-
static VALUE rxml_parser_context_name_depth_max_get(VALUE self)
|
214
|
-
{
|
215
|
-
xmlParserCtxtPtr ctxt;
|
216
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
217
|
-
|
218
|
-
return (INT2NUM(ctxt->nameMax));
|
219
|
-
}
|
220
|
-
|
221
|
-
/*
|
222
|
-
* call-seq:
|
223
|
-
* context.name_node -> "name"
|
224
|
-
*
|
225
|
-
* Obtain the name node for this context.
|
226
|
-
*/
|
227
|
-
static VALUE rxml_parser_context_name_node_get(VALUE self)
|
228
|
-
{
|
229
|
-
xmlParserCtxtPtr ctxt;
|
230
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
231
|
-
|
232
|
-
if (ctxt->name == NULL)
|
233
|
-
return (Qnil);
|
234
|
-
else
|
235
|
-
return (rb_str_new2((const char*) ctxt->name));
|
236
|
-
}
|
237
|
-
|
238
|
-
/*
|
239
|
-
* call-seq:
|
240
|
-
* context.name_tab -> ["name", ..., "name"]
|
241
|
-
*
|
242
|
-
* Obtain the name table for this context.
|
243
|
-
*/
|
244
|
-
static VALUE rxml_parser_context_name_tab_get(VALUE self)
|
245
|
-
{
|
246
|
-
int i;
|
247
|
-
xmlParserCtxtPtr ctxt;
|
248
|
-
VALUE tab_ary;
|
249
|
-
|
250
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
251
|
-
|
252
|
-
if (ctxt->nameTab == NULL)
|
253
|
-
return (Qnil);
|
254
|
-
|
255
|
-
tab_ary = rb_ary_new();
|
256
|
-
|
257
|
-
for (i = (ctxt->nameNr - 1); i >= 0; i--)
|
258
|
-
{
|
259
|
-
if (ctxt->nameTab[i] == NULL)
|
260
|
-
continue;
|
261
|
-
else
|
262
|
-
rb_ary_push(tab_ary, rb_str_new2((const char*) ctxt->nameTab[i]));
|
263
|
-
}
|
264
|
-
|
265
|
-
return (tab_ary);
|
266
|
-
}
|
267
|
-
|
268
|
-
/*
|
269
|
-
* call-seq:
|
270
|
-
* context.node_depth -> num
|
271
|
-
*
|
272
|
-
* Obtain the node depth for this context.
|
273
|
-
*/
|
274
|
-
static VALUE rxml_parser_context_node_depth_get(VALUE self)
|
275
|
-
{
|
276
|
-
xmlParserCtxtPtr ctxt;
|
277
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
278
|
-
|
279
|
-
return (INT2NUM(ctxt->nodeNr));
|
280
|
-
}
|
281
|
-
|
282
|
-
/*
|
283
|
-
* call-seq:
|
284
|
-
* context.node -> node
|
285
|
-
*
|
286
|
-
* Obtain the root node of this context.
|
287
|
-
*/
|
288
|
-
static VALUE rxml_parser_context_node_get(VALUE self)
|
289
|
-
{
|
290
|
-
xmlParserCtxtPtr ctxt;
|
291
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
292
|
-
|
293
|
-
if (ctxt->node == NULL)
|
294
|
-
return (Qnil);
|
295
|
-
else
|
296
|
-
return (rxml_node_wrap(cXMLNode, ctxt->node));
|
297
|
-
}
|
298
|
-
|
299
|
-
/*
|
300
|
-
* call-seq:
|
301
|
-
* context.node_depth_max -> num
|
302
|
-
*
|
303
|
-
* Obtain the maximum node depth for this context.
|
304
|
-
*/
|
305
|
-
static VALUE rxml_parser_context_node_depth_max_get(VALUE self)
|
306
|
-
{
|
307
|
-
xmlParserCtxtPtr ctxt;
|
308
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
309
|
-
|
310
|
-
return (INT2NUM(ctxt->nodeMax));
|
311
|
-
}
|
312
|
-
|
313
|
-
/*
|
314
|
-
* call-seq:
|
315
|
-
* context.num_chars -> num
|
316
|
-
*
|
317
|
-
* Obtain the number of characters in this context.
|
318
|
-
*/
|
319
|
-
static VALUE rxml_parser_context_num_chars_get(VALUE self)
|
320
|
-
{
|
321
|
-
xmlParserCtxtPtr ctxt;
|
322
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
323
|
-
|
324
|
-
return (LONG2NUM(ctxt->nbChars));
|
325
|
-
}
|
326
|
-
|
327
|
-
/*
|
328
|
-
* call-seq:
|
329
|
-
* context.replace_entities? -> (true|false)
|
330
|
-
*
|
331
|
-
* Determine whether external entity replacement is enabled in this
|
332
|
-
* context.
|
333
|
-
*/
|
334
|
-
static VALUE rxml_parser_context_replace_entities_q(VALUE self)
|
335
|
-
{
|
336
|
-
xmlParserCtxtPtr ctxt;
|
337
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
338
|
-
|
339
|
-
if (ctxt->replaceEntities)
|
340
|
-
return (Qtrue);
|
341
|
-
else
|
342
|
-
return (Qfalse);
|
343
|
-
}
|
344
|
-
|
345
|
-
/*
|
346
|
-
* call-seq:
|
347
|
-
* context.replace_entities = true|false
|
348
|
-
*
|
349
|
-
* Control whether external entity replacement is enabled in this
|
350
|
-
* context.
|
351
|
-
*/
|
352
|
-
static VALUE rxml_parser_context_replace_entities_set(VALUE self, VALUE bool)
|
353
|
-
{
|
354
|
-
xmlParserCtxtPtr ctxt;
|
355
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
356
|
-
|
357
|
-
if (TYPE(bool) == T_FALSE)
|
358
|
-
{
|
359
|
-
ctxt->replaceEntities = 0;
|
360
|
-
return (Qfalse);
|
361
|
-
}
|
362
|
-
else
|
363
|
-
{
|
364
|
-
ctxt->replaceEntities = 1;
|
365
|
-
return (Qfalse);
|
366
|
-
}
|
367
|
-
}
|
368
|
-
|
369
|
-
/*
|
370
|
-
* call-seq:
|
371
|
-
* context.space_depth -> num
|
372
|
-
*
|
373
|
-
* Obtain the space depth for this context.
|
374
|
-
*/
|
375
|
-
static VALUE rxml_parser_context_space_depth_get(VALUE self)
|
376
|
-
{
|
377
|
-
xmlParserCtxtPtr ctxt;
|
378
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
379
|
-
|
380
|
-
return (INT2NUM(ctxt->spaceNr));
|
381
|
-
}
|
382
|
-
|
383
|
-
/*
|
384
|
-
* call-seq:
|
385
|
-
* context.space_depth -> num
|
386
|
-
*
|
387
|
-
* Obtain the maximum space depth for this context.
|
388
|
-
*/
|
389
|
-
static VALUE rxml_parser_context_space_depth_max_get(VALUE self)
|
390
|
-
{
|
391
|
-
xmlParserCtxtPtr ctxt;
|
392
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
393
|
-
|
394
|
-
return (INT2NUM(ctxt->spaceMax));
|
395
|
-
}
|
396
|
-
|
397
|
-
/*
|
398
|
-
* call-seq:
|
399
|
-
* context.subset_external? -> (true|false)
|
400
|
-
*
|
401
|
-
* Determine whether this context is a subset of an
|
402
|
-
* external context.
|
403
|
-
*/
|
404
|
-
static VALUE rxml_parser_context_subset_external_q(VALUE self)
|
405
|
-
{
|
406
|
-
xmlParserCtxtPtr ctxt;
|
407
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
408
|
-
|
409
|
-
if (ctxt->inSubset == 2)
|
410
|
-
return (Qtrue);
|
411
|
-
else
|
412
|
-
return (Qfalse);
|
413
|
-
}
|
414
|
-
|
415
|
-
/*
|
416
|
-
* call-seq:
|
417
|
-
* context.subset_internal? -> (true|false)
|
418
|
-
*
|
419
|
-
* Determine whether this context is a subset of an
|
420
|
-
* internal context.
|
421
|
-
*/
|
422
|
-
static VALUE rxml_parser_context_subset_internal_q(VALUE self)
|
423
|
-
{
|
424
|
-
xmlParserCtxtPtr ctxt;
|
425
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
426
|
-
|
427
|
-
if (ctxt->inSubset == 1)
|
428
|
-
return (Qtrue);
|
429
|
-
else
|
430
|
-
return (Qfalse);
|
431
|
-
}
|
432
|
-
|
433
|
-
/*
|
434
|
-
* call-seq:
|
435
|
-
* context.
|
436
|
-
*
|
437
|
-
* Obtain this context's subset name (valid only if
|
438
|
-
* either of subset_external? or subset_internal?
|
439
|
-
* is true).
|
440
|
-
*/
|
441
|
-
static VALUE rxml_parser_context_subset_name_get(VALUE self)
|
442
|
-
{
|
443
|
-
xmlParserCtxtPtr ctxt;
|
444
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
445
|
-
|
446
|
-
if (ctxt->intSubName == NULL)
|
447
|
-
return (Qnil);
|
448
|
-
else
|
449
|
-
return (rb_str_new2((const char*) ctxt->intSubName));
|
450
|
-
}
|
451
|
-
|
452
|
-
/*
|
453
|
-
* call-seq:
|
454
|
-
* context.subset_external_uri -> "uri"
|
455
|
-
*
|
456
|
-
* Obtain this context's external subset URI. (valid only if
|
457
|
-
* either of subset_external? or subset_internal?
|
458
|
-
* is true).
|
459
|
-
*/
|
460
|
-
static VALUE rxml_parser_context_subset_external_uri_get(VALUE self)
|
461
|
-
{
|
462
|
-
xmlParserCtxtPtr ctxt;
|
463
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
464
|
-
|
465
|
-
if (ctxt->extSubURI == NULL)
|
466
|
-
return (Qnil);
|
467
|
-
else
|
468
|
-
return (rb_str_new2((const char*) ctxt->extSubURI));
|
469
|
-
}
|
470
|
-
|
471
|
-
/*
|
472
|
-
* call-seq:
|
473
|
-
* context.subset_external_system_id -> "system_id"
|
474
|
-
*
|
475
|
-
* Obtain this context's external subset system identifier.
|
476
|
-
* (valid only if either of subset_external? or subset_internal?
|
477
|
-
* is true).
|
478
|
-
*/
|
479
|
-
static VALUE rxml_parser_context_subset_external_system_id_get(VALUE self)
|
480
|
-
{
|
481
|
-
xmlParserCtxtPtr ctxt;
|
482
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
483
|
-
|
484
|
-
if (ctxt->extSubSystem == NULL)
|
485
|
-
return (Qnil);
|
486
|
-
else
|
487
|
-
return (rb_str_new2((const char*) ctxt->extSubSystem));
|
488
|
-
}
|
489
|
-
|
490
|
-
/*
|
491
|
-
* call-seq:
|
492
|
-
* context.standalone? -> (true|false)
|
493
|
-
*
|
494
|
-
* Determine whether this is a standalone context.
|
495
|
-
*/
|
496
|
-
static VALUE rxml_parser_context_standalone_q(VALUE self)
|
497
|
-
{
|
498
|
-
xmlParserCtxtPtr ctxt;
|
499
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
500
|
-
|
501
|
-
if (ctxt->standalone)
|
502
|
-
return (Qtrue);
|
503
|
-
else
|
504
|
-
return (Qfalse);
|
505
|
-
}
|
506
|
-
|
507
|
-
/*
|
508
|
-
* call-seq:
|
509
|
-
* context.stats? -> (true|false)
|
510
|
-
*
|
511
|
-
* Determine whether this context maintains statistics.
|
512
|
-
*/
|
513
|
-
static VALUE rxml_parser_context_stats_q(VALUE self)
|
514
|
-
{
|
515
|
-
xmlParserCtxtPtr ctxt;
|
516
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
517
|
-
|
518
|
-
if (ctxt->record_info)
|
519
|
-
return (Qtrue);
|
520
|
-
else
|
521
|
-
return (Qfalse);
|
522
|
-
}
|
523
|
-
|
524
|
-
/*
|
525
|
-
* call-seq:
|
526
|
-
* context.valid? -> (true|false)
|
527
|
-
*
|
528
|
-
* Determine whether this context is valid.
|
529
|
-
*/
|
530
|
-
static VALUE rxml_parser_context_valid_q(VALUE self)
|
531
|
-
{
|
532
|
-
xmlParserCtxtPtr ctxt;
|
533
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
534
|
-
|
535
|
-
if (ctxt->valid)
|
536
|
-
return (Qtrue);
|
537
|
-
else
|
538
|
-
return (Qfalse);
|
539
|
-
}
|
540
|
-
|
541
|
-
/*
|
542
|
-
* call-seq:
|
543
|
-
* context.validate? -> (true|false)
|
544
|
-
*
|
545
|
-
* Determine whether validation is enabled in this context.
|
546
|
-
*/
|
547
|
-
static VALUE rxml_parser_context_validate_q(VALUE self)
|
548
|
-
{
|
549
|
-
xmlParserCtxtPtr ctxt;
|
550
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
551
|
-
|
552
|
-
if (ctxt->validate)
|
553
|
-
return (Qtrue);
|
554
|
-
else
|
555
|
-
return (Qfalse);
|
556
|
-
}
|
557
|
-
|
558
|
-
/*
|
559
|
-
* call-seq:
|
560
|
-
* context.version -> "version"
|
561
|
-
*
|
562
|
-
* Obtain this context's version identifier.
|
563
|
-
*/
|
564
|
-
static VALUE rxml_parser_context_version_get(VALUE self)
|
565
|
-
{
|
566
|
-
xmlParserCtxtPtr ctxt;
|
567
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
568
|
-
|
569
|
-
if (ctxt->version == NULL)
|
570
|
-
return (Qnil);
|
571
|
-
else
|
572
|
-
return (rb_str_new2((const char*) ctxt->version));
|
573
|
-
}
|
574
|
-
|
575
|
-
/*
|
576
|
-
* call-seq:
|
577
|
-
* context.well_formed? -> (true|false)
|
578
|
-
*
|
579
|
-
* Determine whether this context contains well-formed XML.
|
580
|
-
*/
|
581
|
-
static VALUE rxml_parser_context_well_formed_q(VALUE self)
|
582
|
-
{
|
583
|
-
xmlParserCtxtPtr ctxt;
|
584
|
-
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
585
|
-
|
586
|
-
if (ctxt->wellFormed)
|
587
|
-
return (Qtrue);
|
588
|
-
else
|
589
|
-
return (Qfalse);
|
590
|
-
}
|
591
|
-
|
592
|
-
void ruby_init_xml_parser_context(void)
|
593
|
-
{
|
594
|
-
cXMLParserContext = rb_define_class_under(cXMLParser, "Context", rb_cObject);
|
595
|
-
rb_undef_alloc_func(cXMLParserContext);
|
596
|
-
|
597
|
-
rb_define_method(cXMLParserContext, "data_directory",
|
598
|
-
|
599
|
-
rb_define_method(cXMLParserContext, "
|
600
|
-
rb_define_method(cXMLParserContext, "
|
601
|
-
|
602
|
-
rb_define_method(cXMLParserContext, "
|
603
|
-
|
604
|
-
rb_define_method(cXMLParserContext, "
|
605
|
-
|
606
|
-
rb_define_method(cXMLParserContext, "
|
607
|
-
rb_define_method(cXMLParserContext, "
|
608
|
-
rb_define_method(cXMLParserContext, "
|
609
|
-
|
610
|
-
rb_define_method(cXMLParserContext, "
|
611
|
-
|
612
|
-
rb_define_method(cXMLParserContext, "
|
613
|
-
|
614
|
-
rb_define_method(cXMLParserContext, "
|
615
|
-
|
616
|
-
rb_define_method(cXMLParserContext, "
|
617
|
-
|
618
|
-
rb_define_method(cXMLParserContext, "
|
619
|
-
|
620
|
-
rb_define_method(cXMLParserContext, "
|
621
|
-
|
622
|
-
rb_define_method(cXMLParserContext, "
|
623
|
-
rb_define_method(cXMLParserContext, "
|
624
|
-
|
625
|
-
rb_define_method(cXMLParserContext, "
|
626
|
-
|
627
|
-
rb_define_method(cXMLParserContext, "
|
628
|
-
|
629
|
-
rb_define_method(cXMLParserContext, "
|
630
|
-
|
631
|
-
rb_define_method(cXMLParserContext, "replace_entities=",
|
632
|
-
rxml_parser_context_replace_entities_set, 1);
|
633
|
-
rb_define_method(cXMLParserContext, "space_depth",
|
634
|
-
rxml_parser_context_space_depth_get, 0);
|
635
|
-
rb_define_method(cXMLParserContext, "space_depth_max",
|
636
|
-
rxml_parser_context_space_depth_max_get, 0);
|
637
|
-
rb_define_method(cXMLParserContext, "subset_external?",
|
638
|
-
rxml_parser_context_subset_external_q, 0);
|
639
|
-
rb_define_method(cXMLParserContext, "subset_external_system_id",
|
640
|
-
rxml_parser_context_subset_external_system_id_get, 0);
|
641
|
-
rb_define_method(cXMLParserContext, "subset_external_uri",
|
642
|
-
rxml_parser_context_subset_name_get, 0);
|
643
|
-
rb_define_method(cXMLParserContext, "subset_internal?",
|
644
|
-
rxml_parser_context_subset_internal_q, 0);
|
645
|
-
rb_define_method(cXMLParserContext, "subset_internal_name",
|
646
|
-
rxml_parser_context_subset_name_get, 0);
|
647
|
-
rb_define_method(cXMLParserContext, "stats?", rxml_parser_context_stats_q, 0);
|
648
|
-
rb_define_method(cXMLParserContext, "standalone?",
|
649
|
-
rxml_parser_context_standalone_q, 0);
|
650
|
-
rb_define_method(cXMLParserContext, "valid", rxml_parser_context_valid_q, 0);
|
651
|
-
rb_define_method(cXMLParserContext, "validate?",
|
652
|
-
rxml_parser_context_validate_q, 0);
|
653
|
-
rb_define_method(cXMLParserContext, "version",
|
654
|
-
rxml_parser_context_version_get, 0);
|
655
|
-
rb_define_method(cXMLParserContext, "well_formed?",
|
656
|
-
rxml_parser_context_well_formed_q, 0);
|
657
|
-
}
|
1
|
+
/* $Id: ruby_xml_parser_context.c 659 2008-12-01 17:08:58Z cfis $ */
|
2
|
+
|
3
|
+
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
+
|
5
|
+
#include "ruby_libxml.h"
|
6
|
+
#include "ruby_xml_parser_context.h"
|
7
|
+
|
8
|
+
VALUE cXMLParserContext;
|
9
|
+
|
10
|
+
/*
|
11
|
+
* Document-class: LibXML::XML::Parser::Context
|
12
|
+
*
|
13
|
+
* The XML::Parser::Context class provides in-depth control over how
|
14
|
+
* a document is parsed.
|
15
|
+
*/
|
16
|
+
|
17
|
+
static void rxml_parser_context_free(xmlParserCtxtPtr ctxt)
|
18
|
+
{
|
19
|
+
if (ctxt != NULL)
|
20
|
+
xmlFreeParserCtxt(ctxt);
|
21
|
+
}
|
22
|
+
|
23
|
+
VALUE rxml_parser_context_wrap(xmlParserCtxtPtr ctxt)
|
24
|
+
{
|
25
|
+
return Data_Wrap_Struct(cXMLParserContext, NULL, rxml_parser_context_free,
|
26
|
+
ctxt);
|
27
|
+
}
|
28
|
+
|
29
|
+
/*
|
30
|
+
* call-seq:
|
31
|
+
* context.data_directory -> "dir"
|
32
|
+
*
|
33
|
+
* Obtain the data directory associated with this context.
|
34
|
+
*/
|
35
|
+
static VALUE rxml_parser_context_data_directory_get(VALUE self)
|
36
|
+
{
|
37
|
+
xmlParserCtxtPtr ctxt;
|
38
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
39
|
+
|
40
|
+
if (ctxt->directory == NULL)
|
41
|
+
return (Qnil);
|
42
|
+
else
|
43
|
+
return (rb_str_new2(ctxt->directory));
|
44
|
+
}
|
45
|
+
|
46
|
+
/*
|
47
|
+
* call-seq:
|
48
|
+
* context.depth -> num
|
49
|
+
*
|
50
|
+
* Obtain the depth of this context.
|
51
|
+
*/
|
52
|
+
static VALUE rxml_parser_context_depth_get(VALUE self)
|
53
|
+
{
|
54
|
+
xmlParserCtxtPtr ctxt;
|
55
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
56
|
+
|
57
|
+
return (INT2NUM(ctxt->depth));
|
58
|
+
}
|
59
|
+
|
60
|
+
/*
|
61
|
+
* call-seq:
|
62
|
+
* context.disable_sax? -> (true|false)
|
63
|
+
*
|
64
|
+
* Determine whether SAX-based processing is disabled
|
65
|
+
* in this context.
|
66
|
+
*/
|
67
|
+
static VALUE rxml_parser_context_disable_sax_q(VALUE self)
|
68
|
+
{
|
69
|
+
xmlParserCtxtPtr ctxt;
|
70
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
71
|
+
|
72
|
+
if (ctxt->disableSAX)
|
73
|
+
return (Qtrue);
|
74
|
+
else
|
75
|
+
return (Qfalse);
|
76
|
+
}
|
77
|
+
|
78
|
+
/*
|
79
|
+
* call-seq:
|
80
|
+
* context.docbook? -> (true|false)
|
81
|
+
*
|
82
|
+
* Determine whether this is a docbook context.
|
83
|
+
*/
|
84
|
+
static VALUE rxml_parser_context_docbook_q(VALUE self)
|
85
|
+
{
|
86
|
+
xmlParserCtxtPtr ctxt;
|
87
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
88
|
+
|
89
|
+
if (ctxt->html == 2) // TODO check this
|
90
|
+
return (Qtrue);
|
91
|
+
else
|
92
|
+
return (Qfalse);
|
93
|
+
}
|
94
|
+
|
95
|
+
/*
|
96
|
+
* call-seq:
|
97
|
+
* context.encoding -> "encoding"
|
98
|
+
*
|
99
|
+
* Obtain the character encoding identifier used in
|
100
|
+
* this context.
|
101
|
+
*/
|
102
|
+
static VALUE rxml_parser_context_encoding_get(VALUE self)
|
103
|
+
{
|
104
|
+
xmlParserCtxtPtr ctxt;
|
105
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
106
|
+
|
107
|
+
if (ctxt->encoding == NULL)
|
108
|
+
return (Qnil);
|
109
|
+
else
|
110
|
+
return (rb_str_new2((const char*) ctxt->encoding));
|
111
|
+
}
|
112
|
+
|
113
|
+
/*
|
114
|
+
* call-seq:
|
115
|
+
* context.errno -> num
|
116
|
+
*
|
117
|
+
* Obtain the last-error number in this context.
|
118
|
+
*/
|
119
|
+
static VALUE rxml_parser_context_errno_get(VALUE self)
|
120
|
+
{
|
121
|
+
xmlParserCtxtPtr ctxt;
|
122
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
123
|
+
|
124
|
+
return (INT2NUM(ctxt->errNo));
|
125
|
+
}
|
126
|
+
|
127
|
+
/*
|
128
|
+
* call-seq:
|
129
|
+
* context.html? -> (true|false)
|
130
|
+
*
|
131
|
+
* Determine whether this is an html context.
|
132
|
+
*/
|
133
|
+
static VALUE rxml_parser_context_html_q(VALUE self)
|
134
|
+
{
|
135
|
+
xmlParserCtxtPtr ctxt;
|
136
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
137
|
+
|
138
|
+
if (ctxt->html == 1)
|
139
|
+
return (Qtrue);
|
140
|
+
else
|
141
|
+
return (Qfalse);
|
142
|
+
}
|
143
|
+
|
144
|
+
/*
|
145
|
+
* call-seq:
|
146
|
+
* context.max_num_streams -> num
|
147
|
+
*
|
148
|
+
* Obtain the limit on the number of IO streams opened in
|
149
|
+
* this context.
|
150
|
+
*/
|
151
|
+
static VALUE rxml_parser_context_io_max_num_streams_get(VALUE self)
|
152
|
+
{
|
153
|
+
// TODO alias to max_streams and dep this?
|
154
|
+
xmlParserCtxtPtr ctxt;
|
155
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
156
|
+
|
157
|
+
return (INT2NUM(ctxt->inputMax));
|
158
|
+
}
|
159
|
+
|
160
|
+
/*
|
161
|
+
* call-seq:
|
162
|
+
* context.num_streams -> "dir"
|
163
|
+
*
|
164
|
+
* Obtain the actual number of IO streams in this
|
165
|
+
* context.
|
166
|
+
*/
|
167
|
+
static VALUE rxml_parser_context_io_num_streams_get(VALUE self)
|
168
|
+
{
|
169
|
+
xmlParserCtxtPtr ctxt;
|
170
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
171
|
+
|
172
|
+
return (INT2NUM(ctxt->inputNr));
|
173
|
+
}
|
174
|
+
|
175
|
+
/*
|
176
|
+
* call-seq:
|
177
|
+
* context.keep_blanks? -> (true|false)
|
178
|
+
*
|
179
|
+
* Determine whether parsers in this context retain
|
180
|
+
* whitespace.
|
181
|
+
*/
|
182
|
+
static VALUE rxml_parser_context_keep_blanks_q(VALUE self)
|
183
|
+
{
|
184
|
+
xmlParserCtxtPtr ctxt;
|
185
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
186
|
+
|
187
|
+
if (ctxt->keepBlanks)
|
188
|
+
return (Qtrue);
|
189
|
+
else
|
190
|
+
return (Qfalse);
|
191
|
+
}
|
192
|
+
|
193
|
+
/*
|
194
|
+
* call-seq:
|
195
|
+
* context.name_depth -> num
|
196
|
+
*
|
197
|
+
* Obtain the name depth for this context.
|
198
|
+
*/
|
199
|
+
static VALUE rxml_parser_context_name_depth_get(VALUE self)
|
200
|
+
{
|
201
|
+
xmlParserCtxtPtr ctxt;
|
202
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
203
|
+
|
204
|
+
return (INT2NUM(ctxt->nameNr));
|
205
|
+
}
|
206
|
+
|
207
|
+
/*
|
208
|
+
* call-seq:
|
209
|
+
* context.name_depth_max -> num
|
210
|
+
*
|
211
|
+
* Obtain the maximum name depth for this context.
|
212
|
+
*/
|
213
|
+
static VALUE rxml_parser_context_name_depth_max_get(VALUE self)
|
214
|
+
{
|
215
|
+
xmlParserCtxtPtr ctxt;
|
216
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
217
|
+
|
218
|
+
return (INT2NUM(ctxt->nameMax));
|
219
|
+
}
|
220
|
+
|
221
|
+
/*
|
222
|
+
* call-seq:
|
223
|
+
* context.name_node -> "name"
|
224
|
+
*
|
225
|
+
* Obtain the name node for this context.
|
226
|
+
*/
|
227
|
+
static VALUE rxml_parser_context_name_node_get(VALUE self)
|
228
|
+
{
|
229
|
+
xmlParserCtxtPtr ctxt;
|
230
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
231
|
+
|
232
|
+
if (ctxt->name == NULL)
|
233
|
+
return (Qnil);
|
234
|
+
else
|
235
|
+
return (rb_str_new2((const char*) ctxt->name));
|
236
|
+
}
|
237
|
+
|
238
|
+
/*
|
239
|
+
* call-seq:
|
240
|
+
* context.name_tab -> ["name", ..., "name"]
|
241
|
+
*
|
242
|
+
* Obtain the name table for this context.
|
243
|
+
*/
|
244
|
+
static VALUE rxml_parser_context_name_tab_get(VALUE self)
|
245
|
+
{
|
246
|
+
int i;
|
247
|
+
xmlParserCtxtPtr ctxt;
|
248
|
+
VALUE tab_ary;
|
249
|
+
|
250
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
251
|
+
|
252
|
+
if (ctxt->nameTab == NULL)
|
253
|
+
return (Qnil);
|
254
|
+
|
255
|
+
tab_ary = rb_ary_new();
|
256
|
+
|
257
|
+
for (i = (ctxt->nameNr - 1); i >= 0; i--)
|
258
|
+
{
|
259
|
+
if (ctxt->nameTab[i] == NULL)
|
260
|
+
continue;
|
261
|
+
else
|
262
|
+
rb_ary_push(tab_ary, rb_str_new2((const char*) ctxt->nameTab[i]));
|
263
|
+
}
|
264
|
+
|
265
|
+
return (tab_ary);
|
266
|
+
}
|
267
|
+
|
268
|
+
/*
|
269
|
+
* call-seq:
|
270
|
+
* context.node_depth -> num
|
271
|
+
*
|
272
|
+
* Obtain the node depth for this context.
|
273
|
+
*/
|
274
|
+
static VALUE rxml_parser_context_node_depth_get(VALUE self)
|
275
|
+
{
|
276
|
+
xmlParserCtxtPtr ctxt;
|
277
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
278
|
+
|
279
|
+
return (INT2NUM(ctxt->nodeNr));
|
280
|
+
}
|
281
|
+
|
282
|
+
/*
|
283
|
+
* call-seq:
|
284
|
+
* context.node -> node
|
285
|
+
*
|
286
|
+
* Obtain the root node of this context.
|
287
|
+
*/
|
288
|
+
static VALUE rxml_parser_context_node_get(VALUE self)
|
289
|
+
{
|
290
|
+
xmlParserCtxtPtr ctxt;
|
291
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
292
|
+
|
293
|
+
if (ctxt->node == NULL)
|
294
|
+
return (Qnil);
|
295
|
+
else
|
296
|
+
return (rxml_node_wrap(cXMLNode, ctxt->node));
|
297
|
+
}
|
298
|
+
|
299
|
+
/*
|
300
|
+
* call-seq:
|
301
|
+
* context.node_depth_max -> num
|
302
|
+
*
|
303
|
+
* Obtain the maximum node depth for this context.
|
304
|
+
*/
|
305
|
+
static VALUE rxml_parser_context_node_depth_max_get(VALUE self)
|
306
|
+
{
|
307
|
+
xmlParserCtxtPtr ctxt;
|
308
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
309
|
+
|
310
|
+
return (INT2NUM(ctxt->nodeMax));
|
311
|
+
}
|
312
|
+
|
313
|
+
/*
|
314
|
+
* call-seq:
|
315
|
+
* context.num_chars -> num
|
316
|
+
*
|
317
|
+
* Obtain the number of characters in this context.
|
318
|
+
*/
|
319
|
+
static VALUE rxml_parser_context_num_chars_get(VALUE self)
|
320
|
+
{
|
321
|
+
xmlParserCtxtPtr ctxt;
|
322
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
323
|
+
|
324
|
+
return (LONG2NUM(ctxt->nbChars));
|
325
|
+
}
|
326
|
+
|
327
|
+
/*
|
328
|
+
* call-seq:
|
329
|
+
* context.replace_entities? -> (true|false)
|
330
|
+
*
|
331
|
+
* Determine whether external entity replacement is enabled in this
|
332
|
+
* context.
|
333
|
+
*/
|
334
|
+
static VALUE rxml_parser_context_replace_entities_q(VALUE self)
|
335
|
+
{
|
336
|
+
xmlParserCtxtPtr ctxt;
|
337
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
338
|
+
|
339
|
+
if (ctxt->replaceEntities)
|
340
|
+
return (Qtrue);
|
341
|
+
else
|
342
|
+
return (Qfalse);
|
343
|
+
}
|
344
|
+
|
345
|
+
/*
|
346
|
+
* call-seq:
|
347
|
+
* context.replace_entities = true|false
|
348
|
+
*
|
349
|
+
* Control whether external entity replacement is enabled in this
|
350
|
+
* context.
|
351
|
+
*/
|
352
|
+
static VALUE rxml_parser_context_replace_entities_set(VALUE self, VALUE bool)
|
353
|
+
{
|
354
|
+
xmlParserCtxtPtr ctxt;
|
355
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
356
|
+
|
357
|
+
if (TYPE(bool) == T_FALSE)
|
358
|
+
{
|
359
|
+
ctxt->replaceEntities = 0;
|
360
|
+
return (Qfalse);
|
361
|
+
}
|
362
|
+
else
|
363
|
+
{
|
364
|
+
ctxt->replaceEntities = 1;
|
365
|
+
return (Qfalse);
|
366
|
+
}
|
367
|
+
}
|
368
|
+
|
369
|
+
/*
|
370
|
+
* call-seq:
|
371
|
+
* context.space_depth -> num
|
372
|
+
*
|
373
|
+
* Obtain the space depth for this context.
|
374
|
+
*/
|
375
|
+
static VALUE rxml_parser_context_space_depth_get(VALUE self)
|
376
|
+
{
|
377
|
+
xmlParserCtxtPtr ctxt;
|
378
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
379
|
+
|
380
|
+
return (INT2NUM(ctxt->spaceNr));
|
381
|
+
}
|
382
|
+
|
383
|
+
/*
|
384
|
+
* call-seq:
|
385
|
+
* context.space_depth -> num
|
386
|
+
*
|
387
|
+
* Obtain the maximum space depth for this context.
|
388
|
+
*/
|
389
|
+
static VALUE rxml_parser_context_space_depth_max_get(VALUE self)
|
390
|
+
{
|
391
|
+
xmlParserCtxtPtr ctxt;
|
392
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
393
|
+
|
394
|
+
return (INT2NUM(ctxt->spaceMax));
|
395
|
+
}
|
396
|
+
|
397
|
+
/*
|
398
|
+
* call-seq:
|
399
|
+
* context.subset_external? -> (true|false)
|
400
|
+
*
|
401
|
+
* Determine whether this context is a subset of an
|
402
|
+
* external context.
|
403
|
+
*/
|
404
|
+
static VALUE rxml_parser_context_subset_external_q(VALUE self)
|
405
|
+
{
|
406
|
+
xmlParserCtxtPtr ctxt;
|
407
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
408
|
+
|
409
|
+
if (ctxt->inSubset == 2)
|
410
|
+
return (Qtrue);
|
411
|
+
else
|
412
|
+
return (Qfalse);
|
413
|
+
}
|
414
|
+
|
415
|
+
/*
|
416
|
+
* call-seq:
|
417
|
+
* context.subset_internal? -> (true|false)
|
418
|
+
*
|
419
|
+
* Determine whether this context is a subset of an
|
420
|
+
* internal context.
|
421
|
+
*/
|
422
|
+
static VALUE rxml_parser_context_subset_internal_q(VALUE self)
|
423
|
+
{
|
424
|
+
xmlParserCtxtPtr ctxt;
|
425
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
426
|
+
|
427
|
+
if (ctxt->inSubset == 1)
|
428
|
+
return (Qtrue);
|
429
|
+
else
|
430
|
+
return (Qfalse);
|
431
|
+
}
|
432
|
+
|
433
|
+
/*
|
434
|
+
* call-seq:
|
435
|
+
* context.subset_internal_name -> "name"
|
436
|
+
*
|
437
|
+
* Obtain this context's subset name (valid only if
|
438
|
+
* either of subset_external? or subset_internal?
|
439
|
+
* is true).
|
440
|
+
*/
|
441
|
+
static VALUE rxml_parser_context_subset_name_get(VALUE self)
|
442
|
+
{
|
443
|
+
xmlParserCtxtPtr ctxt;
|
444
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
445
|
+
|
446
|
+
if (ctxt->intSubName == NULL)
|
447
|
+
return (Qnil);
|
448
|
+
else
|
449
|
+
return (rb_str_new2((const char*) ctxt->intSubName));
|
450
|
+
}
|
451
|
+
|
452
|
+
/*
|
453
|
+
* call-seq:
|
454
|
+
* context.subset_external_uri -> "uri"
|
455
|
+
*
|
456
|
+
* Obtain this context's external subset URI. (valid only if
|
457
|
+
* either of subset_external? or subset_internal?
|
458
|
+
* is true).
|
459
|
+
*/
|
460
|
+
static VALUE rxml_parser_context_subset_external_uri_get(VALUE self)
|
461
|
+
{
|
462
|
+
xmlParserCtxtPtr ctxt;
|
463
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
464
|
+
|
465
|
+
if (ctxt->extSubURI == NULL)
|
466
|
+
return (Qnil);
|
467
|
+
else
|
468
|
+
return (rb_str_new2((const char*) ctxt->extSubURI));
|
469
|
+
}
|
470
|
+
|
471
|
+
/*
|
472
|
+
* call-seq:
|
473
|
+
* context.subset_external_system_id -> "system_id"
|
474
|
+
*
|
475
|
+
* Obtain this context's external subset system identifier.
|
476
|
+
* (valid only if either of subset_external? or subset_internal?
|
477
|
+
* is true).
|
478
|
+
*/
|
479
|
+
static VALUE rxml_parser_context_subset_external_system_id_get(VALUE self)
|
480
|
+
{
|
481
|
+
xmlParserCtxtPtr ctxt;
|
482
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
483
|
+
|
484
|
+
if (ctxt->extSubSystem == NULL)
|
485
|
+
return (Qnil);
|
486
|
+
else
|
487
|
+
return (rb_str_new2((const char*) ctxt->extSubSystem));
|
488
|
+
}
|
489
|
+
|
490
|
+
/*
|
491
|
+
* call-seq:
|
492
|
+
* context.standalone? -> (true|false)
|
493
|
+
*
|
494
|
+
* Determine whether this is a standalone context.
|
495
|
+
*/
|
496
|
+
static VALUE rxml_parser_context_standalone_q(VALUE self)
|
497
|
+
{
|
498
|
+
xmlParserCtxtPtr ctxt;
|
499
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
500
|
+
|
501
|
+
if (ctxt->standalone)
|
502
|
+
return (Qtrue);
|
503
|
+
else
|
504
|
+
return (Qfalse);
|
505
|
+
}
|
506
|
+
|
507
|
+
/*
|
508
|
+
* call-seq:
|
509
|
+
* context.stats? -> (true|false)
|
510
|
+
*
|
511
|
+
* Determine whether this context maintains statistics.
|
512
|
+
*/
|
513
|
+
static VALUE rxml_parser_context_stats_q(VALUE self)
|
514
|
+
{
|
515
|
+
xmlParserCtxtPtr ctxt;
|
516
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
517
|
+
|
518
|
+
if (ctxt->record_info)
|
519
|
+
return (Qtrue);
|
520
|
+
else
|
521
|
+
return (Qfalse);
|
522
|
+
}
|
523
|
+
|
524
|
+
/*
|
525
|
+
* call-seq:
|
526
|
+
* context.valid? -> (true|false)
|
527
|
+
*
|
528
|
+
* Determine whether this context is valid.
|
529
|
+
*/
|
530
|
+
static VALUE rxml_parser_context_valid_q(VALUE self)
|
531
|
+
{
|
532
|
+
xmlParserCtxtPtr ctxt;
|
533
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
534
|
+
|
535
|
+
if (ctxt->valid)
|
536
|
+
return (Qtrue);
|
537
|
+
else
|
538
|
+
return (Qfalse);
|
539
|
+
}
|
540
|
+
|
541
|
+
/*
|
542
|
+
* call-seq:
|
543
|
+
* context.validate? -> (true|false)
|
544
|
+
*
|
545
|
+
* Determine whether validation is enabled in this context.
|
546
|
+
*/
|
547
|
+
static VALUE rxml_parser_context_validate_q(VALUE self)
|
548
|
+
{
|
549
|
+
xmlParserCtxtPtr ctxt;
|
550
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
551
|
+
|
552
|
+
if (ctxt->validate)
|
553
|
+
return (Qtrue);
|
554
|
+
else
|
555
|
+
return (Qfalse);
|
556
|
+
}
|
557
|
+
|
558
|
+
/*
|
559
|
+
* call-seq:
|
560
|
+
* context.version -> "version"
|
561
|
+
*
|
562
|
+
* Obtain this context's version identifier.
|
563
|
+
*/
|
564
|
+
static VALUE rxml_parser_context_version_get(VALUE self)
|
565
|
+
{
|
566
|
+
xmlParserCtxtPtr ctxt;
|
567
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
568
|
+
|
569
|
+
if (ctxt->version == NULL)
|
570
|
+
return (Qnil);
|
571
|
+
else
|
572
|
+
return (rb_str_new2((const char*) ctxt->version));
|
573
|
+
}
|
574
|
+
|
575
|
+
/*
|
576
|
+
* call-seq:
|
577
|
+
* context.well_formed? -> (true|false)
|
578
|
+
*
|
579
|
+
* Determine whether this context contains well-formed XML.
|
580
|
+
*/
|
581
|
+
static VALUE rxml_parser_context_well_formed_q(VALUE self)
|
582
|
+
{
|
583
|
+
xmlParserCtxtPtr ctxt;
|
584
|
+
Data_Get_Struct(self, xmlParserCtxt, ctxt);
|
585
|
+
|
586
|
+
if (ctxt->wellFormed)
|
587
|
+
return (Qtrue);
|
588
|
+
else
|
589
|
+
return (Qfalse);
|
590
|
+
}
|
591
|
+
|
592
|
+
void ruby_init_xml_parser_context(void)
|
593
|
+
{
|
594
|
+
cXMLParserContext = rb_define_class_under(cXMLParser, "Context", rb_cObject);
|
595
|
+
rb_undef_alloc_func(cXMLParserContext);
|
596
|
+
|
597
|
+
rb_define_method(cXMLParserContext, "data_directory", rxml_parser_context_data_directory_get, 0);
|
598
|
+
rb_define_method(cXMLParserContext, "depth", rxml_parser_context_depth_get, 0);
|
599
|
+
rb_define_method(cXMLParserContext, "disable_sax?", rxml_parser_context_disable_sax_q, 0);
|
600
|
+
rb_define_method(cXMLParserContext, "docbook?", rxml_parser_context_docbook_q, 0);
|
601
|
+
rb_define_method(cXMLParserContext, "encoding", rxml_parser_context_encoding_get, 0);
|
602
|
+
rb_define_method(cXMLParserContext, "errno", rxml_parser_context_errno_get, 0);
|
603
|
+
rb_define_method(cXMLParserContext, "html?", rxml_parser_context_html_q, 0);
|
604
|
+
rb_define_method(cXMLParserContext, "io_max_num_streams", rxml_parser_context_io_max_num_streams_get, 0);
|
605
|
+
rb_define_method(cXMLParserContext, "io_num_streams", rxml_parser_context_io_num_streams_get, 0);
|
606
|
+
rb_define_method(cXMLParserContext, "keep_blanks?", rxml_parser_context_keep_blanks_q, 0);
|
607
|
+
rb_define_method(cXMLParserContext, "name_node", rxml_parser_context_name_node_get, 0);
|
608
|
+
rb_define_method(cXMLParserContext, "name_depth", rxml_parser_context_name_depth_get, 0);
|
609
|
+
rb_define_method(cXMLParserContext, "name_depth_max", rxml_parser_context_name_depth_max_get, 0);
|
610
|
+
rb_define_method(cXMLParserContext, "name_tab", rxml_parser_context_name_tab_get, 0);
|
611
|
+
rb_define_method(cXMLParserContext, "node", rxml_parser_context_node_get, 0);
|
612
|
+
rb_define_method(cXMLParserContext, "node_depth", rxml_parser_context_node_depth_get, 0);
|
613
|
+
rb_define_method(cXMLParserContext, "node_depth_max", rxml_parser_context_node_depth_max_get, 0);
|
614
|
+
rb_define_method(cXMLParserContext, "num_chars", rxml_parser_context_num_chars_get, 0);
|
615
|
+
rb_define_method(cXMLParserContext, "replace_entities?", rxml_parser_context_replace_entities_q, 0);
|
616
|
+
rb_define_method(cXMLParserContext, "replace_entities=", rxml_parser_context_replace_entities_set, 1);
|
617
|
+
rb_define_method(cXMLParserContext, "space_depth", rxml_parser_context_space_depth_get, 0);
|
618
|
+
rb_define_method(cXMLParserContext, "space_depth_max", rxml_parser_context_space_depth_max_get, 0);
|
619
|
+
rb_define_method(cXMLParserContext, "subset_external?", rxml_parser_context_subset_external_q, 0);
|
620
|
+
rb_define_method(cXMLParserContext, "subset_external_system_id", rxml_parser_context_subset_external_system_id_get, 0);
|
621
|
+
rb_define_method(cXMLParserContext, "subset_external_uri", rxml_parser_context_subset_external_uri_get, 0);
|
622
|
+
rb_define_method(cXMLParserContext, "subset_internal?", rxml_parser_context_subset_internal_q, 0);
|
623
|
+
rb_define_method(cXMLParserContext, "subset_internal_name", rxml_parser_context_subset_name_get, 0);
|
624
|
+
rb_define_method(cXMLParserContext, "stats?", rxml_parser_context_stats_q, 0);
|
625
|
+
rb_define_method(cXMLParserContext, "standalone?", rxml_parser_context_standalone_q, 0);
|
626
|
+
rb_define_method(cXMLParserContext, "valid", rxml_parser_context_valid_q, 0);
|
627
|
+
rb_define_method(cXMLParserContext, "validate?", rxml_parser_context_validate_q, 0);
|
628
|
+
rb_define_method(cXMLParserContext, "version", rxml_parser_context_version_get, 0);
|
629
|
+
rb_define_method(cXMLParserContext, "well_formed?", rxml_parser_context_well_formed_q, 0);
|
630
|
+
}
|