libxml-ruby 0.6.0-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 +122 -0
- data/LICENSE +23 -0
- data/README +144 -0
- data/ext/libxml/cbg.c +76 -0
- data/ext/libxml/extconf.rb +308 -0
- data/ext/libxml/libxml.c +62 -0
- data/ext/libxml/ruby_libxml.h +93 -0
- data/ext/libxml/ruby_xml_attr.c +405 -0
- data/ext/libxml/ruby_xml_attr.h +19 -0
- data/ext/libxml/ruby_xml_document.c +1111 -0
- data/ext/libxml/ruby_xml_document.h +27 -0
- data/ext/libxml/ruby_xml_dtd.c +168 -0
- data/ext/libxml/ruby_xml_dtd.h +17 -0
- data/ext/libxml/ruby_xml_html_parser.c +449 -0
- data/ext/libxml/ruby_xml_html_parser.h +29 -0
- data/ext/libxml/ruby_xml_input_cbg.c +158 -0
- data/ext/libxml/ruby_xml_input_cbg.h +20 -0
- data/ext/libxml/ruby_xml_node.c +2410 -0
- data/ext/libxml/ruby_xml_node.h +27 -0
- data/ext/libxml/ruby_xml_node_set.c +170 -0
- data/ext/libxml/ruby_xml_node_set.h +20 -0
- data/ext/libxml/ruby_xml_ns.c +153 -0
- data/ext/libxml/ruby_xml_ns.h +21 -0
- data/ext/libxml/ruby_xml_parser.c +1425 -0
- data/ext/libxml/ruby_xml_parser.h +31 -0
- data/ext/libxml/ruby_xml_parser_context.c +750 -0
- data/ext/libxml/ruby_xml_parser_context.h +22 -0
- data/ext/libxml/ruby_xml_reader.c +900 -0
- data/ext/libxml/ruby_xml_reader.h +14 -0
- data/ext/libxml/ruby_xml_sax_parser.c +485 -0
- data/ext/libxml/ruby_xml_sax_parser.h +56 -0
- data/ext/libxml/ruby_xml_schema.c +146 -0
- data/ext/libxml/ruby_xml_schema.h +16 -0
- data/ext/libxml/ruby_xml_state.c +113 -0
- data/ext/libxml/ruby_xml_state.h +12 -0
- data/ext/libxml/ruby_xml_tree.c +43 -0
- data/ext/libxml/ruby_xml_tree.h +12 -0
- data/ext/libxml/ruby_xml_xinclude.c +20 -0
- data/ext/libxml/ruby_xml_xinclude.h +13 -0
- data/ext/libxml/ruby_xml_xpath.c +243 -0
- data/ext/libxml/ruby_xml_xpath.h +23 -0
- data/ext/libxml/ruby_xml_xpath_context.c +118 -0
- data/ext/libxml/ruby_xml_xpath_context.h +20 -0
- data/ext/libxml/ruby_xml_xpath_object.c +293 -0
- data/ext/libxml/ruby_xml_xpath_object.h +28 -0
- data/ext/libxml/ruby_xml_xpointer.c +100 -0
- data/ext/libxml/ruby_xml_xpointer.h +27 -0
- data/ext/libxml/ruby_xml_xpointer_context.c +21 -0
- data/ext/libxml/ruby_xml_xpointer_context.h +18 -0
- data/ext/libxml/sax_parser_callbacks.inc +213 -0
- data/ext/libxml/version.h +9 -0
- data/lib/libxml.rb +125 -0
- data/lib/libxml_ruby.so +0 -0
- data/lib/xml/libxml.rb +5 -0
- data/mingw/libiconv-2.dll +0 -0
- data/mingw/libxml2-2.dll +0 -0
- data/mingw/libxml_ruby.so +0 -0
- data/mingw/mingw.rake +36 -0
- data/test/dtd-test.rb +24 -0
- data/test/etc_doc_to_s.rb +19 -0
- data/test/ets_copy_bug.rb +21 -0
- data/test/ets_copy_bug2.rb +32 -0
- data/test/ets_copy_bug3.rb +38 -0
- data/test/ets_doc_file.rb +15 -0
- data/test/ets_doc_to_s.rb +21 -0
- data/test/ets_gpx.rb +26 -0
- data/test/ets_node_gc.rb +21 -0
- data/test/ets_test.xml +2 -0
- data/test/ets_tsr.rb +9 -0
- data/test/gc.log +0 -0
- data/test/merge_bug.rb +55 -0
- data/test/schema-test.rb +74 -0
- data/test/tc_well_formed.rb +11 -0
- data/test/tc_xml_document.rb +52 -0
- data/test/tc_xml_document_write.rb +24 -0
- data/test/tc_xml_document_write2.rb +54 -0
- data/test/tc_xml_document_write3.rb +96 -0
- data/test/tc_xml_html_parser.rb +63 -0
- data/test/tc_xml_node.rb +59 -0
- data/test/tc_xml_node2.rb +25 -0
- data/test/tc_xml_node3.rb +27 -0
- data/test/tc_xml_node4.rb +86 -0
- data/test/tc_xml_node5.rb +52 -0
- data/test/tc_xml_node6.rb +27 -0
- data/test/tc_xml_node7.rb +35 -0
- data/test/tc_xml_node8.rb +32 -0
- data/test/tc_xml_node9.rb +32 -0
- data/test/tc_xml_node_copy.rb +40 -0
- data/test/tc_xml_node_set.rb +24 -0
- data/test/tc_xml_node_set2.rb +37 -0
- data/test/tc_xml_node_text.rb +17 -0
- data/test/tc_xml_node_xlink.rb +28 -0
- data/test/tc_xml_parser.rb +190 -0
- data/test/tc_xml_parser2.rb +16 -0
- data/test/tc_xml_parser3.rb +23 -0
- data/test/tc_xml_parser4.rb +33 -0
- data/test/tc_xml_parser5.rb +27 -0
- data/test/tc_xml_parser6.rb +23 -0
- data/test/tc_xml_parser7.rb +28 -0
- data/test/tc_xml_parser8.rb +32 -0
- data/test/tc_xml_parser9.rb +11 -0
- data/test/tc_xml_parser_context.rb +88 -0
- data/test/tc_xml_reader.rb +112 -0
- data/test/tc_xml_sax_parser.rb +104 -0
- data/test/tc_xml_sax_parser2.rb +51 -0
- data/test/tc_xml_xinclude.rb +30 -0
- data/test/tc_xml_xpath.rb +38 -0
- data/test/tc_xml_xpath2.rb +14 -0
- data/test/tc_xml_xpointer.rb +78 -0
- data/vc/libxml.sln +20 -0
- data/vc/libxml.vcproj +389 -0
- data/work/Rakefile +247 -0
- data/work/task/make +26 -0
- data/work/task/memory +37 -0
- data/work/task/rdoc +39 -0
- data/work/task/setup +1616 -0
- data/work/task/test +29 -0
- data/work/test/ets_runner.rb +33 -0
- data/work/test/libxml_test.rb +3 -0
- data/work/test/runner.rb +0 -0
- data/work/test/runner_ets.rb +33 -0
- data/work/vc/debug/libxml.exp +0 -0
- data/work/vc/debug/libxml.ilk +0 -0
- data/work/vc/debug/libxml.lib +0 -0
- data/work/vc/debug/libxml.pdb +0 -0
- data/work/vc/debug/libxml.so +0 -0
- metadata +224 -0
data/ext/libxml/libxml.c
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
/* $Id: libxml.c 300 2008-07-01 19:14:15Z cfis $ */
|
2
|
+
|
3
|
+
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
+
|
5
|
+
#include "ruby_libxml.h"
|
6
|
+
|
7
|
+
VALUE mXML;
|
8
|
+
VALUE eXMLError;
|
9
|
+
|
10
|
+
static xmlFreeFunc freeFunc = NULL;
|
11
|
+
static xmlMallocFunc mallocFunc = NULL;
|
12
|
+
static xmlReallocFunc reallocFunc = NULL;
|
13
|
+
static xmlStrdupFunc strdupFunc = NULL;
|
14
|
+
|
15
|
+
#if defined(_WIN32)
|
16
|
+
__declspec(dllexport)
|
17
|
+
#endif
|
18
|
+
|
19
|
+
void
|
20
|
+
Init_libxml_ruby(void) {
|
21
|
+
/* Some libxml memory goo that should be done before anything else */
|
22
|
+
#ifdef NONE
|
23
|
+
xmlMemGet((xmlFreeFunc *) & freeFunc,
|
24
|
+
(xmlMallocFunc *) & mallocFunc,
|
25
|
+
(xmlReallocFunc *) & reallocFunc,
|
26
|
+
(xmlStrdupFunc *) & strdupFunc);
|
27
|
+
|
28
|
+
if (xmlMemSetup((xmlFreeFunc)RubyMemFree, (xmlMallocFunc)RubyMemMalloc,
|
29
|
+
(xmlReallocFunc)RubyMemRealloc, (xmlStrdupFunc)RubyMemStrdup) != 0)
|
30
|
+
rb_fatal("could not install the memory handlers for libxml");
|
31
|
+
#endif
|
32
|
+
xmlInitParser();
|
33
|
+
|
34
|
+
mXML = rb_define_module("XML");
|
35
|
+
eXMLError = rb_define_class_under(mXML, "Error", rb_eRuntimeError);
|
36
|
+
|
37
|
+
rb_define_const(mXML, "XML_NAMESPACE", rb_str_new2((const char*)XML_XML_NAMESPACE));
|
38
|
+
|
39
|
+
ruby_init_state();
|
40
|
+
ruby_init_parser();
|
41
|
+
ruby_init_xml_parser_context();
|
42
|
+
ruby_init_xml_attr();
|
43
|
+
ruby_init_xml_document();
|
44
|
+
ruby_init_xml_node();
|
45
|
+
ruby_init_xml_node_set();
|
46
|
+
ruby_init_xml_ns();
|
47
|
+
ruby_init_xml_sax_parser();
|
48
|
+
ruby_init_xml_tree();
|
49
|
+
ruby_init_xml_xinclude();
|
50
|
+
ruby_init_xml_xpath();
|
51
|
+
ruby_init_xml_xpath_context();
|
52
|
+
ruby_init_xml_xpointer();
|
53
|
+
ruby_init_xml_xpointer_context();
|
54
|
+
ruby_init_html_parser();
|
55
|
+
ruby_init_input_callbacks();
|
56
|
+
ruby_init_xml_dtd();
|
57
|
+
ruby_init_xml_schema();
|
58
|
+
ruby_init_xml_reader();
|
59
|
+
|
60
|
+
ruby_xml_parser_default_substitute_entities_set(cXMLParser, Qtrue);
|
61
|
+
ruby_xml_parser_default_load_external_dtd_set(cXMLParser, Qtrue);
|
62
|
+
}
|
@@ -0,0 +1,93 @@
|
|
1
|
+
/* Please see the LICENSE file for copyright and distribution information */
|
2
|
+
|
3
|
+
#ifndef __RUBY_LIBXML_H__
|
4
|
+
#define __RUBY_LIBXML_H__
|
5
|
+
|
6
|
+
#include "version.h"
|
7
|
+
|
8
|
+
#include <ruby.h>
|
9
|
+
#include <rubyio.h>
|
10
|
+
#include <util.h>
|
11
|
+
#include <libxml/parser.h>
|
12
|
+
#include <libxml/parserInternals.h>
|
13
|
+
#include <libxml/debugXML.h>
|
14
|
+
#include <libxml/xmlversion.h>
|
15
|
+
#include <libxml/xmlmemory.h>
|
16
|
+
#include <libxml/xpath.h>
|
17
|
+
#include <libxml/valid.h>
|
18
|
+
#include <libxml/catalog.h>
|
19
|
+
#include <libxml/HTMLparser.h>
|
20
|
+
#include <libxml/xmlreader.h>
|
21
|
+
|
22
|
+
// Maybe not yet defined in ruby
|
23
|
+
#ifndef RSTRING_LEN
|
24
|
+
#define RSTRING_LEN(x) RSTRING(x)->len
|
25
|
+
#endif
|
26
|
+
|
27
|
+
// not in Ruby 1.9
|
28
|
+
#ifndef GetWriteFile
|
29
|
+
#define GetWriteFile(fp) rb_io_stdio_file(fp)
|
30
|
+
#define OpenFile rb_io_t
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#ifdef LIBXML_DEBUG_ENABLED
|
34
|
+
#include <libxml/xpathInternals.h>
|
35
|
+
#endif
|
36
|
+
#ifdef LIBXML_XINCLUDE_ENABLED
|
37
|
+
#include <libxml/xinclude.h>
|
38
|
+
#endif
|
39
|
+
#ifdef LIBXML_XPTR_ENABLED
|
40
|
+
#include <libxml/xpointer.h>
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#define RUBY_LIBXML_SRC_TYPE_NULL 0
|
44
|
+
#define RUBY_LIBXML_SRC_TYPE_FILE 1
|
45
|
+
#define RUBY_LIBXML_SRC_TYPE_STRING 2
|
46
|
+
#define RUBY_LIBXML_SRC_TYPE_IO 3
|
47
|
+
#define RUBY_LIBXML_SRC_TYPE_XPATH 4
|
48
|
+
|
49
|
+
typedef struct rx_file_data {
|
50
|
+
VALUE filename; /* Filename/path to self */
|
51
|
+
} rx_file_data;
|
52
|
+
|
53
|
+
typedef struct rx_io_data {
|
54
|
+
VALUE io;
|
55
|
+
} rx_io_data;
|
56
|
+
|
57
|
+
typedef struct rx_string_data {
|
58
|
+
VALUE str;
|
59
|
+
} rx_string_data;
|
60
|
+
|
61
|
+
typedef struct rx_xpath_data {
|
62
|
+
VALUE ctxt;
|
63
|
+
} rx_xpath_data;
|
64
|
+
|
65
|
+
#include "ruby_xml_state.h"
|
66
|
+
#include "ruby_xml_attr.h"
|
67
|
+
#include "ruby_xml_document.h"
|
68
|
+
#include "ruby_xml_node.h"
|
69
|
+
#include "ruby_xml_node_set.h"
|
70
|
+
#include "ruby_xml_ns.h"
|
71
|
+
#include "ruby_xml_parser.h"
|
72
|
+
#include "ruby_xml_parser_context.h"
|
73
|
+
#include "ruby_xml_sax_parser.h"
|
74
|
+
#include "ruby_xml_tree.h"
|
75
|
+
#include "ruby_xml_xinclude.h"
|
76
|
+
#include "ruby_xml_xpath.h"
|
77
|
+
#include "ruby_xml_xpath_context.h"
|
78
|
+
#include "ruby_xml_xpath_object.h"
|
79
|
+
#include "ruby_xml_xpointer.h"
|
80
|
+
#include "ruby_xml_xpointer_context.h"
|
81
|
+
#include "ruby_xml_input_cbg.h"
|
82
|
+
#include "ruby_xml_dtd.h"
|
83
|
+
#include "ruby_xml_schema.h"
|
84
|
+
#include "ruby_xml_html_parser.h"
|
85
|
+
#include "ruby_xml_reader.h"
|
86
|
+
|
87
|
+
extern VALUE mXML;
|
88
|
+
extern VALUE eXMLError;
|
89
|
+
|
90
|
+
void ruby_init_parser(void);
|
91
|
+
void ruby_xml_parser_free(ruby_xml_parser *rxp);
|
92
|
+
|
93
|
+
#endif
|
@@ -0,0 +1,405 @@
|
|
1
|
+
/* $Id: ruby_xml_attr.c 300 2008-07-01 19:14:15Z cfis $ */
|
2
|
+
|
3
|
+
/* Please see the LICENSE file for copyright and distribution information */
|
4
|
+
|
5
|
+
#include "ruby_libxml.h"
|
6
|
+
#include "ruby_xml_attr.h"
|
7
|
+
|
8
|
+
VALUE cXMLAttr;
|
9
|
+
|
10
|
+
void ruby_xml_attr_free(ruby_xml_attr_t *rx) {
|
11
|
+
if (rx == NULL ) return;
|
12
|
+
|
13
|
+
if (rx->attr != NULL ) {
|
14
|
+
rx->attr->_private=NULL;
|
15
|
+
if (rx->attr->parent == NULL && rx->attr->doc == NULL ) {
|
16
|
+
#ifdef NODE_DEBUG
|
17
|
+
fprintf(stderr,"ruby_xfree rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)rxn->node,(long)rxn->node->_private);
|
18
|
+
#endif
|
19
|
+
xmlFreeProp(rx->attr);
|
20
|
+
}
|
21
|
+
|
22
|
+
rx->attr=NULL;
|
23
|
+
}
|
24
|
+
|
25
|
+
ruby_xfree(rx);
|
26
|
+
}
|
27
|
+
|
28
|
+
void
|
29
|
+
ruby_xml_attr_mark(ruby_xml_attr_t *rx) {
|
30
|
+
if ( rx == NULL ) return;
|
31
|
+
if ( rx->attr == NULL ) return;
|
32
|
+
|
33
|
+
if (rx->attr->_private == NULL ) {
|
34
|
+
rb_warning("XmlAttr is not bound! (%s:%d)",
|
35
|
+
__FILE__,__LINE__);
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
|
39
|
+
ruby_xml_node_mark_common((xmlNodePtr)rx->attr);
|
40
|
+
}
|
41
|
+
|
42
|
+
VALUE
|
43
|
+
ruby_xml_attr_wrap(VALUE class, xmlAttrPtr xnode)
|
44
|
+
{
|
45
|
+
VALUE obj;
|
46
|
+
ruby_xml_attr_t *rx;
|
47
|
+
|
48
|
+
// This node is already wrapped
|
49
|
+
if (xnode->_private != NULL)
|
50
|
+
return (VALUE)xnode->_private;
|
51
|
+
|
52
|
+
obj=Data_Make_Struct(class,ruby_xml_attr_t,ruby_xml_attr_mark,
|
53
|
+
ruby_xml_attr_free,rx);
|
54
|
+
|
55
|
+
rx->attr=xnode;
|
56
|
+
xnode->_private=(void*)obj;
|
57
|
+
#ifdef NODE_DEBUG
|
58
|
+
fprintf(stderr,"wrap rxn=0x%x xn=0x%x o=0x%x\n",(long)rxn,(long)xnode,(long)obj);
|
59
|
+
#endif
|
60
|
+
return obj;
|
61
|
+
}
|
62
|
+
|
63
|
+
/*
|
64
|
+
* Only use this when a xmlAttr has just been created since
|
65
|
+
* oblitterates the _private. Not exposed to ruby interp.
|
66
|
+
*/
|
67
|
+
VALUE
|
68
|
+
ruby_xml_attr_new(VALUE class, xmlAttrPtr xnode)
|
69
|
+
{
|
70
|
+
xnode->_private=NULL;
|
71
|
+
return ruby_xml_attr_wrap(class,xnode);
|
72
|
+
}
|
73
|
+
/*
|
74
|
+
* call-seq:
|
75
|
+
* attr.child => node
|
76
|
+
*
|
77
|
+
* Obtain this attribute's child attribute(s).
|
78
|
+
*/
|
79
|
+
VALUE
|
80
|
+
ruby_xml_attr_child_get(VALUE self) {
|
81
|
+
ruby_xml_attr_t *rxa;
|
82
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
83
|
+
if (rxa->attr->children == NULL)
|
84
|
+
return(Qnil);
|
85
|
+
else
|
86
|
+
return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->children));
|
87
|
+
}
|
88
|
+
|
89
|
+
|
90
|
+
/*
|
91
|
+
* call-seq:
|
92
|
+
* attr.child? => (true|false)
|
93
|
+
*
|
94
|
+
* Determine whether this attribute has child attributes.
|
95
|
+
*/
|
96
|
+
VALUE
|
97
|
+
ruby_xml_attr_child_q(VALUE self) {
|
98
|
+
ruby_xml_attr_t *rxa;
|
99
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
100
|
+
if (rxa->attr->children == NULL)
|
101
|
+
return(Qfalse);
|
102
|
+
else
|
103
|
+
return(Qtrue);
|
104
|
+
}
|
105
|
+
|
106
|
+
|
107
|
+
/*
|
108
|
+
* call-seq:
|
109
|
+
* attr.doc => document
|
110
|
+
*
|
111
|
+
* Obtain the XML::Document this attribute is associated with,
|
112
|
+
* if any.
|
113
|
+
*/
|
114
|
+
VALUE
|
115
|
+
ruby_xml_attr_doc_get(VALUE self) {
|
116
|
+
ruby_xml_attr_t *rxa;
|
117
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
118
|
+
if (rxa->attr->doc == NULL)
|
119
|
+
return(Qnil);
|
120
|
+
else
|
121
|
+
return(ruby_xml_document_wrap(rxa->attr->doc));
|
122
|
+
}
|
123
|
+
|
124
|
+
/*
|
125
|
+
* call-seq:
|
126
|
+
* attr.doc? => (true|false)
|
127
|
+
*
|
128
|
+
* Determine whether this attribute is associated with an
|
129
|
+
* XML::Document.
|
130
|
+
*/
|
131
|
+
VALUE
|
132
|
+
ruby_xml_attr_doc_q(VALUE self) {
|
133
|
+
ruby_xml_attr_t *rxa;
|
134
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
135
|
+
if (rxa->attr->doc == NULL)
|
136
|
+
return(Qfalse);
|
137
|
+
else
|
138
|
+
return(Qtrue);
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
/*
|
143
|
+
* call-seq:
|
144
|
+
* attr.last => node
|
145
|
+
*
|
146
|
+
* Obtain the last attribute.
|
147
|
+
*/
|
148
|
+
VALUE
|
149
|
+
ruby_xml_attr_last_get(VALUE self) {
|
150
|
+
ruby_xml_attr_t *rxa;
|
151
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
152
|
+
if (rxa->attr->last == NULL)
|
153
|
+
return(Qnil);
|
154
|
+
else
|
155
|
+
return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->last));
|
156
|
+
}
|
157
|
+
|
158
|
+
|
159
|
+
/*
|
160
|
+
* call-seq:
|
161
|
+
* attr.last? => (true|false)
|
162
|
+
*
|
163
|
+
* Determine whether this is the last attribute.
|
164
|
+
*/
|
165
|
+
VALUE
|
166
|
+
ruby_xml_attr_last_q(VALUE self) {
|
167
|
+
ruby_xml_attr_t *rxa;
|
168
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
169
|
+
if (rxa->attr->last == NULL)
|
170
|
+
return(Qfalse);
|
171
|
+
else
|
172
|
+
return(Qtrue);
|
173
|
+
}
|
174
|
+
|
175
|
+
/*
|
176
|
+
* call-seq:
|
177
|
+
* attr.name => "name"
|
178
|
+
*
|
179
|
+
* Obtain this attribute's name.
|
180
|
+
*/
|
181
|
+
VALUE
|
182
|
+
ruby_xml_attr_name_get(VALUE self) {
|
183
|
+
ruby_xml_attr_t *rxa;
|
184
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
185
|
+
|
186
|
+
if (rxa->attr->name == NULL)
|
187
|
+
return(Qnil);
|
188
|
+
else
|
189
|
+
return(rb_str_new2((const char*)rxa->attr->name));
|
190
|
+
}
|
191
|
+
|
192
|
+
/*
|
193
|
+
* call-seq:
|
194
|
+
* attr.next => node
|
195
|
+
*
|
196
|
+
* Obtain the next attribute.
|
197
|
+
*/
|
198
|
+
VALUE
|
199
|
+
ruby_xml_attr_next_get(VALUE self) {
|
200
|
+
ruby_xml_attr_t *rxa;
|
201
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
202
|
+
if (rxa->attr->next == NULL)
|
203
|
+
return(Qnil);
|
204
|
+
else
|
205
|
+
return(ruby_xml_attr_wrap(cXMLAttr, rxa->attr->next));
|
206
|
+
}
|
207
|
+
|
208
|
+
|
209
|
+
/*
|
210
|
+
* call-seq:
|
211
|
+
* attr.next? => (true|false)
|
212
|
+
*
|
213
|
+
* Determine whether there is a next attribute.
|
214
|
+
*/
|
215
|
+
VALUE
|
216
|
+
ruby_xml_attr_next_q(VALUE self) {
|
217
|
+
ruby_xml_attr_t *rxa;
|
218
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
219
|
+
if (rxa->attr->next == NULL)
|
220
|
+
return(Qfalse);
|
221
|
+
else
|
222
|
+
return(Qtrue);
|
223
|
+
}
|
224
|
+
|
225
|
+
|
226
|
+
/*
|
227
|
+
* call-seq:
|
228
|
+
* attr.type_name => "attribute"
|
229
|
+
*
|
230
|
+
* Obtain this attribute node's type name.
|
231
|
+
*/
|
232
|
+
VALUE
|
233
|
+
ruby_xml_attr_node_type_name(VALUE self) {
|
234
|
+
return(rb_str_new2("attribute"));
|
235
|
+
}
|
236
|
+
|
237
|
+
|
238
|
+
/*
|
239
|
+
* call-seq:
|
240
|
+
* attr.ns => namespace
|
241
|
+
*
|
242
|
+
* Obtain this attribute's associated XML::NS, if any.
|
243
|
+
*/
|
244
|
+
VALUE
|
245
|
+
ruby_xml_attr_ns_get(VALUE self) {
|
246
|
+
ruby_xml_attr_t *rxa;
|
247
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
248
|
+
if (rxa->attr->ns == NULL)
|
249
|
+
return(Qnil);
|
250
|
+
else
|
251
|
+
return(ruby_xml_ns_new2(cXMLNS, Qnil, rxa->attr->ns));
|
252
|
+
}
|
253
|
+
|
254
|
+
|
255
|
+
/*
|
256
|
+
* call-seq:
|
257
|
+
* attr.ns? => (true|false)
|
258
|
+
*
|
259
|
+
* Determine whether this attribute has an associated
|
260
|
+
* namespace.
|
261
|
+
*/
|
262
|
+
VALUE
|
263
|
+
ruby_xml_attr_ns_q(VALUE self) {
|
264
|
+
ruby_xml_attr_t *rxa;
|
265
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
266
|
+
if (rxa->attr->ns == NULL)
|
267
|
+
return(Qfalse);
|
268
|
+
else
|
269
|
+
return(Qtrue);
|
270
|
+
}
|
271
|
+
|
272
|
+
|
273
|
+
/*
|
274
|
+
* call-seq:
|
275
|
+
* attr.parent => node
|
276
|
+
*
|
277
|
+
* Obtain this attribute node's parent.
|
278
|
+
*/
|
279
|
+
VALUE
|
280
|
+
ruby_xml_attr_parent_get(VALUE self) {
|
281
|
+
ruby_xml_attr_t *rxa;
|
282
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
283
|
+
if (rxa->attr->parent == NULL)
|
284
|
+
return(Qnil);
|
285
|
+
else
|
286
|
+
return(ruby_xml_node2_wrap(cXMLNode, rxa->attr->parent));
|
287
|
+
}
|
288
|
+
|
289
|
+
|
290
|
+
/*
|
291
|
+
* call-seq:
|
292
|
+
* attr.parent? => (true|false)
|
293
|
+
*
|
294
|
+
* Determine whether this attribute has a parent.
|
295
|
+
*/
|
296
|
+
VALUE
|
297
|
+
ruby_xml_attr_parent_q(VALUE self) {
|
298
|
+
ruby_xml_attr_t *rxa;
|
299
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
300
|
+
if (rxa->attr->parent == NULL)
|
301
|
+
return(Qfalse);
|
302
|
+
else
|
303
|
+
return(Qtrue);
|
304
|
+
}
|
305
|
+
|
306
|
+
|
307
|
+
/*
|
308
|
+
* call-seq:
|
309
|
+
* attr.prev => node
|
310
|
+
*
|
311
|
+
* Obtain the previous attribute.
|
312
|
+
*/
|
313
|
+
VALUE
|
314
|
+
ruby_xml_attr_prev_get(VALUE self) {
|
315
|
+
ruby_xml_attr_t *rxa;
|
316
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
317
|
+
if (rxa->attr->prev == NULL)
|
318
|
+
return(Qnil);
|
319
|
+
else
|
320
|
+
return(ruby_xml_attr_wrap(cXMLAttr, rxa->attr->prev));
|
321
|
+
}
|
322
|
+
|
323
|
+
|
324
|
+
/*
|
325
|
+
* call-seq:
|
326
|
+
* attr.prev? => (true|false)
|
327
|
+
*
|
328
|
+
* Determine whether there is a previous attribute.
|
329
|
+
*/
|
330
|
+
VALUE
|
331
|
+
ruby_xml_attr_prev_q(VALUE self) {
|
332
|
+
ruby_xml_attr_t *rxa;
|
333
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
334
|
+
if (rxa->attr->prev == NULL)
|
335
|
+
return(Qfalse);
|
336
|
+
else
|
337
|
+
return(Qtrue);
|
338
|
+
}
|
339
|
+
|
340
|
+
|
341
|
+
/*
|
342
|
+
* call-seq:
|
343
|
+
* node.remove! => nil
|
344
|
+
*
|
345
|
+
* Removes this attribute from it's parent.
|
346
|
+
*/
|
347
|
+
VALUE
|
348
|
+
ruby_xml_attr_remove_ex(VALUE self) {
|
349
|
+
ruby_xml_attr_t *rxa;
|
350
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
351
|
+
xmlUnlinkNode(rxa->attr);
|
352
|
+
return(Qnil);
|
353
|
+
}
|
354
|
+
|
355
|
+
/*
|
356
|
+
* call-seq:
|
357
|
+
* attr.value => "value"
|
358
|
+
*
|
359
|
+
* Obtain the value of this attribute.
|
360
|
+
*/
|
361
|
+
VALUE
|
362
|
+
ruby_xml_attr_value(VALUE self) {
|
363
|
+
ruby_xml_attr_t *rxa;
|
364
|
+
xmlChar *value;
|
365
|
+
VALUE result = Qnil;
|
366
|
+
|
367
|
+
Data_Get_Struct(self, ruby_xml_attr_t, rxa);
|
368
|
+
if (ruby_xml_attr_parent_q(self) == Qtrue) {
|
369
|
+
value = xmlGetProp(rxa->attr->parent, rxa->attr->name);
|
370
|
+
if (value != NULL)
|
371
|
+
{
|
372
|
+
result = rb_str_new2((const char*)value);
|
373
|
+
xmlFree(value);
|
374
|
+
}
|
375
|
+
}
|
376
|
+
return(result);
|
377
|
+
}
|
378
|
+
|
379
|
+
// Rdoc needs to know
|
380
|
+
#ifdef RDOC_NEVER_DEFINED
|
381
|
+
mXML = rb_define_module("XML");
|
382
|
+
#endif
|
383
|
+
|
384
|
+
void
|
385
|
+
ruby_init_xml_attr(void) {
|
386
|
+
cXMLAttr = rb_define_class_under(mXML, "Attr", rb_cObject);
|
387
|
+
rb_define_method(cXMLAttr, "child", ruby_xml_attr_child_get, 0);
|
388
|
+
rb_define_method(cXMLAttr, "child?", ruby_xml_attr_child_q, 0);
|
389
|
+
rb_define_method(cXMLAttr, "doc", ruby_xml_attr_doc_get, 0);
|
390
|
+
rb_define_method(cXMLAttr, "doc?", ruby_xml_attr_doc_q, 0);
|
391
|
+
rb_define_method(cXMLAttr, "last", ruby_xml_attr_last_get, 0);
|
392
|
+
rb_define_method(cXMLAttr, "last?", ruby_xml_attr_last_q, 0);
|
393
|
+
rb_define_method(cXMLAttr, "name", ruby_xml_attr_name_get, 0);
|
394
|
+
rb_define_method(cXMLAttr, "next", ruby_xml_attr_next_get, 0);
|
395
|
+
rb_define_method(cXMLAttr, "next?", ruby_xml_attr_next_q, 0);
|
396
|
+
rb_define_method(cXMLAttr, "node_type_name", ruby_xml_attr_node_type_name, 0);
|
397
|
+
rb_define_method(cXMLAttr, "ns", ruby_xml_attr_ns_get, 0);
|
398
|
+
rb_define_method(cXMLAttr, "ns?", ruby_xml_attr_ns_q, 0);
|
399
|
+
rb_define_method(cXMLAttr, "parent", ruby_xml_attr_parent_get, 0);
|
400
|
+
rb_define_method(cXMLAttr, "parent?", ruby_xml_attr_parent_q, 0);
|
401
|
+
rb_define_method(cXMLAttr, "prev", ruby_xml_attr_prev_get, 0);
|
402
|
+
rb_define_method(cXMLAttr, "prev?", ruby_xml_attr_prev_q, 0);
|
403
|
+
rb_define_method(cXMLAttr, "remove!", ruby_xml_attr_remove_ex, 0);
|
404
|
+
rb_define_method(cXMLAttr, "value", ruby_xml_attr_value, 0);
|
405
|
+
}
|