ruby-xml-smart 0.1.11-i486-linux
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/AUTHORS +4 -0
- data/COPYING +504 -0
- data/Changelog +192 -0
- data/README +52 -0
- data/Rakefile +112 -0
- data/TODO +6 -0
- data/examples/EXAMPLE.xml +17 -0
- data/examples/EXAMPLE.xml.sic +17 -0
- data/examples/Visualise/EXAMPLE.xml +18 -0
- data/examples/Visualise/term-ansicolor-0.0.4/CHANGES +11 -0
- data/examples/Visualise/term-ansicolor-0.0.4/GPL +340 -0
- data/examples/Visualise/term-ansicolor-0.0.4/README.en +23 -0
- data/examples/Visualise/term-ansicolor-0.0.4/Rakefile +72 -0
- data/examples/Visualise/term-ansicolor-0.0.4/VERSION +1 -0
- data/examples/Visualise/term-ansicolor-0.0.4/examples/cdiff.rb +20 -0
- data/examples/Visualise/term-ansicolor-0.0.4/examples/example.rb +82 -0
- data/examples/Visualise/term-ansicolor-0.0.4/install.rb +12 -0
- data/examples/Visualise/term-ansicolor-0.0.4/lib/term/ansicolor.rb +78 -0
- data/examples/Visualise/xpath_visual.rb +45 -0
- data/examples/add_children.rb +14 -0
- data/examples/add_elements.rb +13 -0
- data/examples/attrs.rb +15 -0
- data/examples/children.rb +14 -0
- data/examples/concurrent.rb +30 -0
- data/examples/copy.rb +23 -0
- data/examples/create.rb +18 -0
- data/examples/delete.rb +30 -0
- data/examples/move_elements.rb +12 -0
- data/examples/namespace.rb +14 -0
- data/examples/namespace_detailed.rb +36 -0
- data/examples/namespace_find.rb +20 -0
- data/examples/pull.rb +18 -0
- data/examples/qname.rb +16 -0
- data/examples/replace.rb +14 -0
- data/examples/set_OR_replace.rb +32 -0
- data/examples/signals.rb +28 -0
- data/examples/string.rb +27 -0
- data/examples/write.rb +11 -0
- data/examples/xpath_attrs.rb +19 -0
- data/examples/xpath_functions.rb +7 -0
- data/examples/xpath_root.rb +6 -0
- data/extconf.rb +29 -0
- data/rbxs.c +136 -0
- data/rbxs.h +53 -0
- data/rbxs_dom.c +483 -0
- data/rbxs_dom.h +32 -0
- data/rbxs_domattribute.c +189 -0
- data/rbxs_domattribute.h +18 -0
- data/rbxs_domattributeset.c +182 -0
- data/rbxs_domattributeset.h +17 -0
- data/rbxs_domelement.c +656 -0
- data/rbxs_domelement.h +18 -0
- data/rbxs_domnamespace.c +127 -0
- data/rbxs_domnamespace.h +18 -0
- data/rbxs_domnamespaceset.c +276 -0
- data/rbxs_domnamespaceset.h +17 -0
- data/rbxs_domnodeset.c +284 -0
- data/rbxs_domnodeset.h +19 -0
- data/rbxs_domother.c +121 -0
- data/rbxs_domother.h +18 -0
- data/rbxs_domtext.c +165 -0
- data/rbxs_domtext.h +18 -0
- data/rbxs_pull.c +244 -0
- data/rbxs_pull.h +17 -0
- data/rbxs_pullattribute.c +124 -0
- data/rbxs_pullattribute.h +18 -0
- data/rbxs_pullattributeset.c +156 -0
- data/rbxs_pullattributeset.h +17 -0
- data/rbxs_qname.c +267 -0
- data/rbxs_qname.h +18 -0
- data/rbxs_utils.h +39 -0
- data/test/namespace_test.rb +83 -0
- metadata +125 -0
data/rbxs_pull.c
ADDED
@@ -0,0 +1,244 @@
|
|
1
|
+
#include "rbxs_pull.h"
|
2
|
+
#include "rbxs_qname.h"
|
3
|
+
#include "rbxs_pullattributeset.h"
|
4
|
+
|
5
|
+
/* -- */
|
6
|
+
//***********************************************************************************
|
7
|
+
// GC
|
8
|
+
//***********************************************************************************
|
9
|
+
void rbxs_pull_free(rbxs_pull *prbxs_pull) {
|
10
|
+
if (prbxs_pull != NULL) {
|
11
|
+
xmlFreeTextReader(prbxs_pull->reader);
|
12
|
+
prbxs_pull->reader = NULL;
|
13
|
+
free(prbxs_pull);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
void rbxs_pull_mark(rbxs_pull *prbxs_pull) { }
|
18
|
+
|
19
|
+
//***********************************************************************************
|
20
|
+
// Methods
|
21
|
+
//***********************************************************************************
|
22
|
+
/* ++ */
|
23
|
+
|
24
|
+
/*
|
25
|
+
* Documentation
|
26
|
+
*/
|
27
|
+
VALUE rbxs_pull_next(VALUE self)
|
28
|
+
{
|
29
|
+
rbxs_pull *prbxs_pull;
|
30
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
31
|
+
if (xmlTextReaderRead(prbxs_pull->reader) >= 1)
|
32
|
+
return self;
|
33
|
+
else
|
34
|
+
return Qnil;
|
35
|
+
}
|
36
|
+
|
37
|
+
/*
|
38
|
+
* Documentation
|
39
|
+
*/
|
40
|
+
VALUE rbxs_pull_name(VALUE self)
|
41
|
+
{
|
42
|
+
return(rbxs_qname_new(cSmartQName,self,RBXS_PARSER_TYPE_READER));
|
43
|
+
}
|
44
|
+
|
45
|
+
/*
|
46
|
+
* Documentation
|
47
|
+
*/
|
48
|
+
VALUE rbxs_pull_base(VALUE self)
|
49
|
+
{
|
50
|
+
unsigned char *base_uri;
|
51
|
+
rbxs_pull *prbxs_pull;
|
52
|
+
|
53
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
54
|
+
base_uri = xmlTextReaderBaseUri(prbxs_pull->reader);
|
55
|
+
if (base_uri)
|
56
|
+
return(rb_str_new2((char *)base_uri));
|
57
|
+
else
|
58
|
+
return(Qnil);
|
59
|
+
}
|
60
|
+
|
61
|
+
/*
|
62
|
+
* Documentation
|
63
|
+
*/
|
64
|
+
VALUE rbxs_pull_xml_lang(VALUE self)
|
65
|
+
{
|
66
|
+
unsigned char *xml_lang;
|
67
|
+
rbxs_pull *prbxs_pull;
|
68
|
+
|
69
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
70
|
+
xml_lang = xmlTextReaderXmlLang(prbxs_pull->reader);
|
71
|
+
if (xml_lang)
|
72
|
+
return(rb_str_new2((char *)xml_lang));
|
73
|
+
else
|
74
|
+
return(Qnil);
|
75
|
+
}
|
76
|
+
|
77
|
+
/*
|
78
|
+
* Documentation
|
79
|
+
*/
|
80
|
+
VALUE rbxs_pull_depth(VALUE self)
|
81
|
+
{
|
82
|
+
int depth;
|
83
|
+
rbxs_pull *prbxs_pull;
|
84
|
+
|
85
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
86
|
+
depth = xmlTextReaderDepth(prbxs_pull->reader);
|
87
|
+
if (depth >= 0)
|
88
|
+
return(INT2FIX(depth));
|
89
|
+
else
|
90
|
+
return(Qnil);
|
91
|
+
}
|
92
|
+
|
93
|
+
/*
|
94
|
+
* Documentation
|
95
|
+
*/
|
96
|
+
VALUE rbxs_pull_attributes(VALUE self)
|
97
|
+
{
|
98
|
+
return rbxs_pullattributeset_new(cSmartPullAttributeSet,self);
|
99
|
+
}
|
100
|
+
|
101
|
+
/*
|
102
|
+
* Documentation
|
103
|
+
*/
|
104
|
+
VALUE rbxs_pull_emptyp(VALUE self)
|
105
|
+
{
|
106
|
+
rbxs_pull *prbxs_pull;
|
107
|
+
|
108
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
109
|
+
return (xmlTextReaderIsEmptyElement(prbxs_pull->reader) ? Qtrue : Qfalse);
|
110
|
+
}
|
111
|
+
|
112
|
+
/*
|
113
|
+
* Documentation
|
114
|
+
*/
|
115
|
+
VALUE rbxs_pull_valuep(VALUE self)
|
116
|
+
{
|
117
|
+
rbxs_pull *prbxs_pull;
|
118
|
+
|
119
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
120
|
+
return (xmlTextReaderHasValue(prbxs_pull->reader) ? Qtrue : Qfalse);
|
121
|
+
}
|
122
|
+
|
123
|
+
/*
|
124
|
+
* Documentation
|
125
|
+
*/
|
126
|
+
VALUE rbxs_pull_value(VALUE self)
|
127
|
+
{
|
128
|
+
rbxs_pull *prbxs_pull;
|
129
|
+
unsigned char *value;
|
130
|
+
|
131
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
132
|
+
value = xmlTextReaderValue(prbxs_pull->reader);
|
133
|
+
|
134
|
+
if (value) {
|
135
|
+
VALUE retval = rb_str_new2((char *)value);
|
136
|
+
xmlFree(value);
|
137
|
+
return retval;
|
138
|
+
} else
|
139
|
+
return Qnil;
|
140
|
+
}
|
141
|
+
|
142
|
+
static VALUE type2symbol[18];
|
143
|
+
|
144
|
+
/*
|
145
|
+
* Documentation
|
146
|
+
*/
|
147
|
+
VALUE rbxs_pull_node_type(VALUE self)
|
148
|
+
{
|
149
|
+
rbxs_pull *prbxs_pull;
|
150
|
+
int node_type;
|
151
|
+
|
152
|
+
Data_Get_Struct(self, rbxs_pull, prbxs_pull);
|
153
|
+
node_type = xmlTextReaderNodeType(prbxs_pull->reader);
|
154
|
+
|
155
|
+
if (node_type < 0)
|
156
|
+
return(Qnil);
|
157
|
+
|
158
|
+
return ID2SYM(type2symbol[node_type]);
|
159
|
+
}
|
160
|
+
|
161
|
+
//***********************************************************************************
|
162
|
+
// Constructors
|
163
|
+
//***********************************************************************************
|
164
|
+
VALUE rbxs_pull_new(VALUE class, VALUE what) {
|
165
|
+
rbxs_pull *prbxs_pull;
|
166
|
+
RB_IO_T *fptr;
|
167
|
+
|
168
|
+
prbxs_pull = (rbxs_pull *)malloc(sizeof(rbxs_pull));
|
169
|
+
if (prbxs_pull == NULL )
|
170
|
+
rb_raise(rb_eNoMemError, "No memory left for XML::Smart::Pull struct");
|
171
|
+
|
172
|
+
switch (TYPE(what)) {
|
173
|
+
case T_STRING:
|
174
|
+
prbxs_pull->reader = xmlReaderForMemory(RSTRING_PTR(what),
|
175
|
+
RSTRING_LEN(what),
|
176
|
+
NULL, NULL, 0);
|
177
|
+
break;
|
178
|
+
case T_FILE:
|
179
|
+
GetOpenFile(what,fptr);
|
180
|
+
prbxs_pull->reader = xmlReaderForFd(RB_IO_T_FD(fptr),NULL,NULL,0);
|
181
|
+
break;
|
182
|
+
default:
|
183
|
+
rb_raise(rb_eArgError, "argument must me String or File");
|
184
|
+
}
|
185
|
+
|
186
|
+
if (prbxs_pull->reader == NULL)
|
187
|
+
rb_raise(rb_eRuntimeError, "Document could not be opend");
|
188
|
+
|
189
|
+
if (rb_block_given_p()) {
|
190
|
+
VALUE self;
|
191
|
+
self = Data_Wrap_Struct(class, rbxs_pull_mark, rbxs_pull_free, prbxs_pull);
|
192
|
+
while (xmlTextReaderRead(prbxs_pull->reader)) {
|
193
|
+
rb_yield(self);
|
194
|
+
}
|
195
|
+
return(Qnil);
|
196
|
+
}
|
197
|
+
|
198
|
+
return(Data_Wrap_Struct(class, rbxs_pull_mark, rbxs_pull_free, prbxs_pull));
|
199
|
+
}
|
200
|
+
|
201
|
+
//***********************************************************************************
|
202
|
+
// Initialize class Pull
|
203
|
+
//***********************************************************************************
|
204
|
+
#ifdef RDOC__
|
205
|
+
mXML = rb_define_module( "XML" );
|
206
|
+
cSmart = rb_define_class_under( mXML, "Smart", rb_cObject );
|
207
|
+
#endif
|
208
|
+
VALUE cSmartPull;
|
209
|
+
|
210
|
+
void init_rbxs_pull(void) {
|
211
|
+
cSmartPull = rb_define_class_under( cSmart, "Pull", rb_cObject );
|
212
|
+
|
213
|
+
type2symbol[XML_READER_TYPE_NONE] = rb_intern("none");
|
214
|
+
type2symbol[XML_READER_TYPE_ELEMENT] = rb_intern("element");
|
215
|
+
type2symbol[XML_READER_TYPE_ATTRIBUTE] = rb_intern("attribute");
|
216
|
+
type2symbol[XML_READER_TYPE_TEXT] = rb_intern("text");
|
217
|
+
type2symbol[XML_READER_TYPE_CDATA] = rb_intern("cdata");
|
218
|
+
type2symbol[XML_READER_TYPE_ENTITY_REFERENCE] = rb_intern("entity_reference");
|
219
|
+
type2symbol[XML_READER_TYPE_ENTITY] = rb_intern("entity");
|
220
|
+
type2symbol[XML_READER_TYPE_PROCESSING_INSTRUCTION] = rb_intern("processing_instruction");
|
221
|
+
type2symbol[XML_READER_TYPE_COMMENT] = rb_intern("comment");
|
222
|
+
type2symbol[XML_READER_TYPE_DOCUMENT] = rb_intern("document");
|
223
|
+
type2symbol[XML_READER_TYPE_DOCUMENT_TYPE] = rb_intern("document_type");
|
224
|
+
type2symbol[XML_READER_TYPE_DOCUMENT_FRAGMENT] = rb_intern("document_fragment");
|
225
|
+
type2symbol[XML_READER_TYPE_NOTATION] = rb_intern("notation");
|
226
|
+
type2symbol[XML_READER_TYPE_WHITESPACE] = rb_intern("whitespace");
|
227
|
+
type2symbol[XML_READER_TYPE_SIGNIFICANT_WHITESPACE] = rb_intern("significant_whitespace");
|
228
|
+
type2symbol[XML_READER_TYPE_END_ELEMENT] = rb_intern("end_element");
|
229
|
+
type2symbol[XML_READER_TYPE_END_ENTITY] = rb_intern("end_entity");
|
230
|
+
type2symbol[XML_READER_TYPE_XML_DECLARATION] = rb_intern("xml_declaration");
|
231
|
+
|
232
|
+
rb_define_method(cSmartPull, "to_s", rbxs_pull_value, 0);
|
233
|
+
rb_define_method(cSmartPull, "next", rbxs_pull_next, 0);
|
234
|
+
rb_define_method(cSmartPull, "name", rbxs_pull_name, 0);
|
235
|
+
|
236
|
+
rb_define_method(cSmartPull, "base", rbxs_pull_base, 0);
|
237
|
+
rb_define_method(cSmartPull, "depth", rbxs_pull_depth, 0);
|
238
|
+
rb_define_method(cSmartPull, "attributes", rbxs_pull_attributes, 0);
|
239
|
+
rb_define_method(cSmartPull, "value?", rbxs_pull_valuep, 0);
|
240
|
+
rb_define_method(cSmartPull, "value", rbxs_pull_value, 0);
|
241
|
+
rb_define_method(cSmartPull, "empty?", rbxs_pull_emptyp, 0);
|
242
|
+
rb_define_method(cSmartPull, "lang", rbxs_pull_xml_lang, 0);
|
243
|
+
rb_define_method(cSmartPull, "node_type", rbxs_pull_node_type, 0);
|
244
|
+
}
|
data/rbxs_pull.h
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
/* Please see the COPYING file for copyright and distribution information */
|
2
|
+
|
3
|
+
#ifndef __RBXS_PULL_H__
|
4
|
+
#define __RBXS_PULL_H__
|
5
|
+
|
6
|
+
#include "rbxs.h"
|
7
|
+
|
8
|
+
RUBY_EXTERN VALUE cSmartPull;
|
9
|
+
|
10
|
+
typedef struct rbxs_pull {
|
11
|
+
xmlTextReaderPtr reader;
|
12
|
+
} rbxs_pull;
|
13
|
+
|
14
|
+
RUBY_EXTERN VALUE rbxs_pull_new(VALUE class, VALUE what);
|
15
|
+
RUBY_EXTERN void init_rbxs_pull(void);
|
16
|
+
|
17
|
+
#endif
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#include "rbxs_pullattribute.h"
|
2
|
+
#include "rbxs_pullattributeset.h"
|
3
|
+
#include "rbxs_qname.h"
|
4
|
+
#include "rbxs_pull.h"
|
5
|
+
|
6
|
+
/* -- */
|
7
|
+
//***********************************************************************************
|
8
|
+
// GC
|
9
|
+
//***********************************************************************************
|
10
|
+
void rbxs_pullattribute_free(rbxs_pullattribute *prbxs_pullattribute) {
|
11
|
+
if (prbxs_pullattribute != NULL) {
|
12
|
+
free(prbxs_pullattribute);
|
13
|
+
}
|
14
|
+
}
|
15
|
+
|
16
|
+
void rbxs_pullattribute_mark(rbxs_pullattribute *prbxs_pullattribute) {
|
17
|
+
if (prbxs_pullattribute == NULL) return;
|
18
|
+
if (!NIL_P(prbxs_pullattribute->node)) rb_gc_mark(prbxs_pullattribute->node);
|
19
|
+
}
|
20
|
+
|
21
|
+
//***********************************************************************************
|
22
|
+
// Methods
|
23
|
+
//***********************************************************************************
|
24
|
+
/* ++ */
|
25
|
+
void searchPosition(xmlTextReaderPtr reader, VALUE which)
|
26
|
+
{
|
27
|
+
int position,length;
|
28
|
+
|
29
|
+
switch (TYPE(which)) {
|
30
|
+
case T_STRING:
|
31
|
+
if (!xmlTextReaderMoveToAttribute(reader,(unsigned char *)StringValuePtr(which))) {
|
32
|
+
xmlTextReaderMoveToElement(reader);
|
33
|
+
rb_raise(rb_eRuntimeError, "attribute could not be found");
|
34
|
+
}
|
35
|
+
break;
|
36
|
+
case T_FIXNUM:
|
37
|
+
position = NUM2INT(which);
|
38
|
+
length = xmlTextReaderAttributeCount(reader);
|
39
|
+
if (position < 0)
|
40
|
+
position = length + position;
|
41
|
+
if ((position >= 0) && (position < length)) {
|
42
|
+
if (!xmlTextReaderMoveToAttributeNo(reader,position)) {
|
43
|
+
xmlTextReaderMoveToElement(reader);
|
44
|
+
rb_raise(rb_eRuntimeError, "weird things occured");
|
45
|
+
}
|
46
|
+
} else
|
47
|
+
rb_raise(rb_eRuntimeError, "index out of range");
|
48
|
+
break;
|
49
|
+
default:
|
50
|
+
rb_raise(rb_eArgError, "argument must me String or a Fixnum");
|
51
|
+
}
|
52
|
+
}
|
53
|
+
|
54
|
+
/*
|
55
|
+
* Documentation
|
56
|
+
*/
|
57
|
+
VALUE rbxs_pullattribute_name(VALUE self)
|
58
|
+
{
|
59
|
+
rbxs_pullattribute *prbxs_pullattribute;
|
60
|
+
rbxs_pull *prbxs_pull;
|
61
|
+
|
62
|
+
Data_Get_Struct(self, rbxs_pullattribute, prbxs_pullattribute);
|
63
|
+
Data_Get_Struct(prbxs_pullattribute->node, rbxs_pull, prbxs_pull);
|
64
|
+
|
65
|
+
searchPosition(prbxs_pull->reader,prbxs_pullattribute->which);
|
66
|
+
return(rbxs_qname_new(cSmartQName,prbxs_pullattribute->node,RBXS_PARSER_TYPE_READER));
|
67
|
+
}
|
68
|
+
|
69
|
+
/*
|
70
|
+
* Documentation
|
71
|
+
*/
|
72
|
+
VALUE rbxs_pullattribute_value(VALUE self)
|
73
|
+
{
|
74
|
+
rbxs_pullattribute *prbxs_pullattribute;
|
75
|
+
rbxs_pull *prbxs_pull;
|
76
|
+
unsigned char *value;
|
77
|
+
|
78
|
+
Data_Get_Struct(self, rbxs_pullattribute, prbxs_pullattribute);
|
79
|
+
Data_Get_Struct(prbxs_pullattribute->node, rbxs_pull, prbxs_pull);
|
80
|
+
|
81
|
+
searchPosition(prbxs_pull->reader,prbxs_pullattribute->which);
|
82
|
+
|
83
|
+
value = xmlTextReaderValue(prbxs_pull->reader);
|
84
|
+
if (value) {
|
85
|
+
VALUE retval = rb_str_new2((char *)value);
|
86
|
+
xmlFree(value);
|
87
|
+
return retval;
|
88
|
+
} else
|
89
|
+
return Qnil;
|
90
|
+
return Qnil;
|
91
|
+
}
|
92
|
+
|
93
|
+
//***********************************************************************************
|
94
|
+
// Constructors
|
95
|
+
//***********************************************************************************
|
96
|
+
VALUE rbxs_pullattribute_new(VALUE class, VALUE node, VALUE which) {
|
97
|
+
rbxs_pullattribute *prbxs_pullattribute;
|
98
|
+
|
99
|
+
prbxs_pullattribute = (rbxs_pullattribute *)malloc(sizeof(rbxs_pullattribute));
|
100
|
+
if (prbxs_pullattribute == NULL )
|
101
|
+
rb_raise(rb_eNoMemError, "No memory left for XML::Smart::Pull::AttributeSet::Attribute struct");
|
102
|
+
|
103
|
+
prbxs_pullattribute->node = node;
|
104
|
+
prbxs_pullattribute->which = which;
|
105
|
+
|
106
|
+
return(Data_Wrap_Struct(class, rbxs_pullattribute_mark, rbxs_pullattribute_free, prbxs_pullattribute));
|
107
|
+
}
|
108
|
+
|
109
|
+
//***********************************************************************************
|
110
|
+
// Initialize class Node
|
111
|
+
//***********************************************************************************
|
112
|
+
#ifdef RDOC__
|
113
|
+
mXML = rb_define_module( "XML" );
|
114
|
+
cSmart = rb_define_class_under( mXML, "Smart", rb_cObject );
|
115
|
+
cSmartPull = rb_define_class_under( cSmart, "Pull", rb_cObject );
|
116
|
+
cSmartPullAttributeSet = rb_define_class_under( cSmartPull, "AttributeSet", rb_cObject );
|
117
|
+
#endif
|
118
|
+
VALUE cSmartPullAttribute;
|
119
|
+
void init_rbxs_pullattribute(void) {
|
120
|
+
cSmartPullAttribute = rb_define_class_under( cSmartPullAttributeSet, "Attribute", rb_cObject );
|
121
|
+
|
122
|
+
rb_define_method(cSmartPullAttribute, "name", rbxs_pullattribute_name, 0);
|
123
|
+
rb_define_method(cSmartPullAttribute, "value", rbxs_pullattribute_value, 0);
|
124
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
/* Please see the COPYING file for copyright and distribution information */
|
2
|
+
|
3
|
+
#ifndef __RBXS_PULLATTRIBUTE_H__
|
4
|
+
#define __RBXS_PULLATTRIBUTE_H__
|
5
|
+
|
6
|
+
#include "rbxs.h"
|
7
|
+
|
8
|
+
RUBY_EXTERN VALUE cSmartPullAttribute;
|
9
|
+
|
10
|
+
typedef struct rbxs_pullattribute {
|
11
|
+
VALUE node;
|
12
|
+
VALUE which;
|
13
|
+
} rbxs_pullattribute;
|
14
|
+
|
15
|
+
RUBY_EXTERN VALUE rbxs_pullattribute_new(VALUE class, VALUE node, VALUE which);
|
16
|
+
RUBY_EXTERN void init_rbxs_pullattribute(void);
|
17
|
+
|
18
|
+
#endif
|
@@ -0,0 +1,156 @@
|
|
1
|
+
#include "rbxs_pullattributeset.h"
|
2
|
+
#include "rbxs_pullattribute.h"
|
3
|
+
#include "rbxs_qname.h"
|
4
|
+
#include "rbxs_pull.h"
|
5
|
+
|
6
|
+
/* -- */
|
7
|
+
//***********************************************************************************
|
8
|
+
// GC
|
9
|
+
//***********************************************************************************
|
10
|
+
void rbxs_pullattributeset_free(rbxs_pullattributeset *prbxs_pullattributeset)
|
11
|
+
{
|
12
|
+
if (prbxs_pullattributeset != NULL) {
|
13
|
+
free(prbxs_pullattributeset);
|
14
|
+
}
|
15
|
+
}
|
16
|
+
|
17
|
+
void rbxs_pullattributeset_mark(rbxs_pullattributeset *prbxs_pullattributeset)
|
18
|
+
{
|
19
|
+
if (prbxs_pullattributeset == NULL) return;
|
20
|
+
if (!NIL_P(prbxs_pullattributeset->node)) rb_gc_mark(prbxs_pullattributeset->node);
|
21
|
+
}
|
22
|
+
|
23
|
+
//***********************************************************************************
|
24
|
+
// Methods
|
25
|
+
//***********************************************************************************
|
26
|
+
/* ++ */
|
27
|
+
|
28
|
+
/*
|
29
|
+
* call-seq:
|
30
|
+
* include? => (true|false)
|
31
|
+
*
|
32
|
+
* Documentation
|
33
|
+
*/
|
34
|
+
VALUE rbxs_pullattributeset_include(VALUE self, VALUE which)
|
35
|
+
{
|
36
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
37
|
+
rbxs_pull *prbxs_pull;
|
38
|
+
Data_Get_Struct(self, rbxs_pullattributeset, prbxs_pullattributeset);
|
39
|
+
Data_Get_Struct(prbxs_pullattributeset->node, rbxs_pull, prbxs_pull);
|
40
|
+
|
41
|
+
Check_Type(which, T_STRING);
|
42
|
+
|
43
|
+
if (xmlTextReaderMoveToAttribute(prbxs_pull->reader,(unsigned char *)StringValuePtr(which)))
|
44
|
+
return(Qtrue);
|
45
|
+
else
|
46
|
+
return(Qfalse);
|
47
|
+
}
|
48
|
+
|
49
|
+
/*
|
50
|
+
* Documentation
|
51
|
+
*/
|
52
|
+
VALUE rbxs_pullattributeset_empty(VALUE self)
|
53
|
+
{
|
54
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
55
|
+
rbxs_pull *prbxs_pull;
|
56
|
+
Data_Get_Struct(self, rbxs_pullattributeset, prbxs_pullattributeset);
|
57
|
+
Data_Get_Struct(prbxs_pullattributeset->node, rbxs_pull, prbxs_pull);
|
58
|
+
return(xmlTextReaderHasAttributes(prbxs_pull->reader) ? Qfalse : Qtrue);
|
59
|
+
}
|
60
|
+
|
61
|
+
/*
|
62
|
+
* Documentation
|
63
|
+
*/
|
64
|
+
VALUE rbxs_pullattributeset_length(VALUE self)
|
65
|
+
{
|
66
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
67
|
+
rbxs_pull *prbxs_pull;
|
68
|
+
Data_Get_Struct(self, rbxs_pullattributeset, prbxs_pullattributeset);
|
69
|
+
Data_Get_Struct(prbxs_pullattributeset->node, rbxs_pull, prbxs_pull);
|
70
|
+
return(NUM2INT(xmlTextReaderAttributeCount(prbxs_pull->reader)));
|
71
|
+
}
|
72
|
+
|
73
|
+
/*
|
74
|
+
* Documentation
|
75
|
+
*/
|
76
|
+
VALUE rbxs_pullattributeset_each(VALUE self)
|
77
|
+
{
|
78
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
79
|
+
rbxs_pull *prbxs_pull;
|
80
|
+
Data_Get_Struct(self, rbxs_pullattributeset, prbxs_pullattributeset);
|
81
|
+
Data_Get_Struct(prbxs_pullattributeset->node, rbxs_pull, prbxs_pull);
|
82
|
+
while (xmlTextReaderMoveToNextAttribute(prbxs_pull->reader)) {
|
83
|
+
xmlChar *ret;
|
84
|
+
VALUE val;
|
85
|
+
ret = xmlTextReaderValue(prbxs_pull->reader);
|
86
|
+
val = rb_str_new2((char *)ret);
|
87
|
+
xmlFree(ret);
|
88
|
+
rb_yield_values(2,rbxs_qname_new(cSmartQName,prbxs_pullattributeset->node,RBXS_PARSER_TYPE_READER),val);
|
89
|
+
}
|
90
|
+
xmlTextReaderMoveToElement(prbxs_pull->reader);
|
91
|
+
return(self);
|
92
|
+
}
|
93
|
+
|
94
|
+
/*
|
95
|
+
* Documentation
|
96
|
+
*/
|
97
|
+
VALUE rbxs_pullattributeset_get(VALUE self, VALUE which)
|
98
|
+
{
|
99
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
100
|
+
Data_Get_Struct(self, rbxs_pullattributeset, prbxs_pullattributeset);
|
101
|
+
return(rbxs_pullattribute_new(cSmartPullAttribute,prbxs_pullattributeset->node,which));
|
102
|
+
}
|
103
|
+
|
104
|
+
/*
|
105
|
+
* Documentation
|
106
|
+
*/
|
107
|
+
VALUE rbxs_pullattributeset_first(VALUE self)
|
108
|
+
{
|
109
|
+
return rbxs_pullattributeset_get(self,INT2NUM(0));
|
110
|
+
}
|
111
|
+
|
112
|
+
/*
|
113
|
+
* Documentation
|
114
|
+
*/
|
115
|
+
VALUE rbxs_pullattributeset_last(VALUE self)
|
116
|
+
{
|
117
|
+
return rbxs_pullattributeset_get(self,INT2NUM(-1));
|
118
|
+
}
|
119
|
+
|
120
|
+
//***********************************************************************************
|
121
|
+
// Constructors
|
122
|
+
//***********************************************************************************
|
123
|
+
VALUE rbxs_pullattributeset_new(VALUE class, VALUE node) {
|
124
|
+
rbxs_pullattributeset *prbxs_pullattributeset;
|
125
|
+
|
126
|
+
prbxs_pullattributeset = (rbxs_pullattributeset *)malloc(sizeof(rbxs_pullattributeset));
|
127
|
+
if (prbxs_pullattributeset == NULL )
|
128
|
+
rb_raise(rb_eNoMemError, "No memory left for XML::Smart::Pull::AttributeSet struct");
|
129
|
+
|
130
|
+
prbxs_pullattributeset->node = node;
|
131
|
+
|
132
|
+
return(Data_Wrap_Struct(class, rbxs_pullattributeset_mark, rbxs_pullattributeset_free, prbxs_pullattributeset));
|
133
|
+
}
|
134
|
+
|
135
|
+
//***********************************************************************************
|
136
|
+
// Initialize class Node
|
137
|
+
//***********************************************************************************
|
138
|
+
#ifdef RDOC__
|
139
|
+
mXML = rb_define_module( "XML" );
|
140
|
+
cSmart = rb_define_class_under( mXML, "Smart", rb_cObject );
|
141
|
+
cSmartPull = rb_define_class_under( cSmart, "Pull", rb_cObject );
|
142
|
+
#endif
|
143
|
+
VALUE cSmartPullAttributeSet;
|
144
|
+
|
145
|
+
void init_rbxs_pullattributeset(void) {
|
146
|
+
cSmartPullAttributeSet = rb_define_class_under( cSmartPull, "AttributeSet", rb_cObject );
|
147
|
+
rb_include_module(cSmartPullAttributeSet, rb_mEnumerable);
|
148
|
+
|
149
|
+
rb_define_method(cSmartPullAttributeSet, "length", rbxs_pullattributeset_length, 0);
|
150
|
+
rb_define_method(cSmartPullAttributeSet, "empty?", rbxs_pullattributeset_empty, 0);
|
151
|
+
rb_define_method(cSmartPullAttributeSet, "each", rbxs_pullattributeset_each, 0);
|
152
|
+
rb_define_method(cSmartPullAttributeSet, "[]", rbxs_pullattributeset_get, 1);
|
153
|
+
rb_define_method(cSmartPullAttributeSet, "first", rbxs_pullattributeset_first, 0);
|
154
|
+
rb_define_method(cSmartPullAttributeSet, "last", rbxs_pullattributeset_last, 0);
|
155
|
+
rb_define_method(cSmartPullAttributeSet, "include?", rbxs_pullattributeset_include, 1);
|
156
|
+
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
/* Please see the COPYING file for copyright and distribution information */
|
2
|
+
|
3
|
+
#ifndef __RBXS_PULLATTRIBUTESET_H__
|
4
|
+
#define __RBXS_PULLATTRIBUTESET_H__
|
5
|
+
|
6
|
+
#include "rbxs.h"
|
7
|
+
|
8
|
+
RUBY_EXTERN VALUE cSmartPullAttributeSet;
|
9
|
+
|
10
|
+
typedef struct rbxs_pullattributeset {
|
11
|
+
VALUE node;
|
12
|
+
} rbxs_pullattributeset;
|
13
|
+
|
14
|
+
RUBY_EXTERN VALUE rbxs_pullattributeset_new(VALUE class, VALUE node);
|
15
|
+
RUBY_EXTERN void init_rbxs_pullattributeset(void);
|
16
|
+
|
17
|
+
#endif
|