libxml-ruby 0.5.1.0 → 0.5.2.0
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/ext/xml/libxml.c +2 -1
- data/ext/xml/libxml.h +5 -3
- data/ext/xml/libxml.rb +1 -1
- data/ext/xml/ruby_xml_attr.c +13 -33
- data/ext/xml/ruby_xml_document.c +11 -22
- data/ext/xml/ruby_xml_document.h +2 -1
- data/ext/xml/ruby_xml_html_parser.c +3 -6
- data/ext/xml/ruby_xml_html_parser.h +1 -1
- data/ext/xml/ruby_xml_node.c +87 -70
- data/ext/xml/ruby_xml_node.h +2 -1
- data/ext/xml/ruby_xml_node_set.c +32 -111
- data/ext/xml/ruby_xml_node_set.h +5 -11
- data/ext/xml/ruby_xml_ns.c +1 -1
- data/ext/xml/ruby_xml_ns.h +1 -1
- data/ext/xml/ruby_xml_parser.c +11 -11
- data/ext/xml/ruby_xml_parser.h +1 -1
- data/ext/xml/ruby_xml_parser_context.c +11 -9
- data/ext/xml/ruby_xml_parser_context.h +1 -1
- data/ext/xml/ruby_xml_sax_parser.c +1 -1
- data/ext/xml/ruby_xml_sax_parser.h +1 -1
- data/ext/xml/ruby_xml_state.c +114 -0
- data/ext/xml/ruby_xml_state.h +11 -0
- data/ext/xml/ruby_xml_tree.c +1 -1
- data/ext/xml/ruby_xml_tree.h +1 -1
- data/ext/xml/ruby_xml_xinclude.c +1 -1
- data/ext/xml/ruby_xml_xinclude.h +1 -1
- data/ext/xml/ruby_xml_xpath.c +117 -231
- data/ext/xml/ruby_xml_xpath.h +4 -5
- data/ext/xml/ruby_xml_xpath_context.c +43 -50
- data/ext/xml/ruby_xml_xpath_context.h +3 -7
- data/ext/xml/ruby_xml_xpath_object.c +246 -0
- data/ext/xml/ruby_xml_xpath_object.h +29 -0
- data/ext/xml/ruby_xml_xpointer.c +8 -14
- data/ext/xml/ruby_xml_xpointer.h +1 -1
- data/ext/xml/ruby_xml_xpointer_context.c +1 -1
- data/ext/xml/ruby_xml_xpointer_context.h +1 -1
- data/ext/xml/sax_parser_callbacks.inc +1 -1
- data/tests/tc_xml_document.rb +5 -4
- data/tests/tc_xml_html_parser.rb +7 -4
- data/tests/tc_xml_node.rb +6 -5
- data/tests/tc_xml_node_set.rb +2 -2
- data/tests/tc_xml_node_set2.rb +3 -3
- data/tests/tc_xml_xpath.rb +3 -3
- data/tests/tc_xml_xpointer.rb +2 -2
- metadata +16 -10
data/ext/xml/ruby_xml_node.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_node.h
|
1
|
+
/* $Id: ruby_xml_node.h 189 2007-09-26 15:04:47Z danj $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -18,6 +18,7 @@ VALUE
|
|
18
18
|
ruby_xml_node2_wrap(VALUE class, xmlNodePtr xnode);
|
19
19
|
|
20
20
|
void ruby_xml_node_free(ruby_xml_node *rxn);
|
21
|
+
void ruby_xml_node_mark_common(xmlNodePtr n);
|
21
22
|
void ruby_init_xml_node(void);
|
22
23
|
VALUE ruby_xml_node_child_set(VALUE self, VALUE obj);
|
23
24
|
VALUE ruby_xml_node_name_get(VALUE self);
|
data/ext/xml/ruby_xml_node_set.c
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_node_set.c
|
1
|
+
/* $Id: ruby_xml_node_set.c 192 2007-10-05 15:13:17Z danj $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -23,21 +23,15 @@ VALUE cXMLNodeSet;
|
|
23
23
|
*/
|
24
24
|
VALUE
|
25
25
|
ruby_xml_node_set_to_a(VALUE self) {
|
26
|
-
int i;
|
27
26
|
ruby_xml_node_set *rxnset;
|
28
|
-
VALUE
|
27
|
+
VALUE r;
|
29
28
|
|
30
29
|
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
rb_ary_push(set_ary, nodeobj);
|
37
|
-
}
|
38
|
-
}
|
39
|
-
|
40
|
-
return(set_ary);
|
30
|
+
r=ruby_xml_xpath_object_to_a(rxnset->rxpop);
|
31
|
+
#ifdef NODE_DEBUG
|
32
|
+
fprintf(stderr,"node_set_to_a %s\n",rb_str2cstr(rb_ary_to_s(r),0));
|
33
|
+
#endif
|
34
|
+
return r;
|
41
35
|
}
|
42
36
|
|
43
37
|
|
@@ -49,27 +43,10 @@ ruby_xml_node_set_to_a(VALUE self) {
|
|
49
43
|
*/
|
50
44
|
VALUE
|
51
45
|
ruby_xml_node_set_each(VALUE self) {
|
52
|
-
int i;
|
53
46
|
ruby_xml_node_set *rxnset;
|
54
|
-
VALUE nodeobj;
|
55
47
|
|
56
48
|
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
57
|
-
|
58
|
-
if (rxnset->node_set == NULL)
|
59
|
-
return(Qnil);
|
60
|
-
|
61
|
-
for (i = 0; i < rxnset->node_set->nodeNr; i++) {
|
62
|
-
switch(rxnset->node_set->nodeTab[i]->type) {
|
63
|
-
case XML_ATTRIBUTE_NODE:
|
64
|
-
nodeobj = ruby_xml_attr_wrap(cXMLAttr, (xmlAttrPtr)rxnset->node_set->nodeTab[i]);
|
65
|
-
break;
|
66
|
-
default:
|
67
|
-
nodeobj = ruby_xml_node2_wrap(cXMLNode, rxnset->node_set->nodeTab[i]);
|
68
|
-
}
|
69
|
-
|
70
|
-
rb_yield(nodeobj);
|
71
|
-
}
|
72
|
-
return(self);
|
49
|
+
return ruby_xml_xpath_object_each(rxnset->rxpop);
|
73
50
|
}
|
74
51
|
|
75
52
|
|
@@ -82,8 +59,9 @@ ruby_xml_node_set_each(VALUE self) {
|
|
82
59
|
VALUE
|
83
60
|
ruby_xml_node_set_empty_q(VALUE self) {
|
84
61
|
ruby_xml_node_set *rxnset;
|
85
|
-
|
86
|
-
|
62
|
+
|
63
|
+
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
64
|
+
return ruby_xml_xpath_object_empty_q(rxnset->rxpop);
|
87
65
|
}
|
88
66
|
|
89
67
|
|
@@ -95,50 +73,12 @@ ruby_xml_node_set_empty_q(VALUE self) {
|
|
95
73
|
*/
|
96
74
|
VALUE
|
97
75
|
ruby_xml_node_set_first(VALUE self) {
|
98
|
-
ruby_xml_node_set *rxnset;
|
99
|
-
VALUE nodeobj;
|
76
|
+
ruby_xml_node_set *rxnset;
|
100
77
|
|
101
78
|
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
102
|
-
|
103
|
-
if (rxnset->node_set == NULL || rxnset->node_set->nodeNr < 1)
|
104
|
-
return(Qnil);
|
105
|
-
|
106
|
-
switch(rxnset->node_set->nodeTab[0]->type) {
|
107
|
-
case XML_ATTRIBUTE_NODE:
|
108
|
-
nodeobj = ruby_xml_attr_wrap(cXMLAttr, (xmlAttrPtr)rxnset->node_set->nodeTab[0]);
|
109
|
-
break;
|
110
|
-
default:
|
111
|
-
nodeobj = ruby_xml_node2_wrap(cXMLNode, rxnset->node_set->nodeTab[0]);
|
112
|
-
}
|
113
|
-
|
114
|
-
return(nodeobj);
|
79
|
+
return ruby_xml_xpath_object_first(rxnset->rxpop);
|
115
80
|
}
|
116
81
|
|
117
|
-
|
118
|
-
void
|
119
|
-
ruby_xml_node_set_free(ruby_xml_node_set *rxnset) {
|
120
|
-
void *data;
|
121
|
-
|
122
|
-
switch(rxnset->data_type) {
|
123
|
-
case RUBY_LIBXML_SRC_TYPE_NULL:
|
124
|
-
break;
|
125
|
-
case RUBY_LIBXML_SRC_TYPE_XPATH:
|
126
|
-
data = (void*)(rx_xpath_data *)rxnset->data;
|
127
|
-
free((rx_xpath_data *)data);
|
128
|
-
default:
|
129
|
-
rb_fatal("Unknown data type, %d", rxnset->data_type);
|
130
|
-
}
|
131
|
-
|
132
|
-
/* Don't need to free the node set because the nodeset is a child of
|
133
|
-
the XPath object that created the set.
|
134
|
-
if (rxnset->node_set != NULL)
|
135
|
-
xmlXPathFreeNodeSet(rxnset->node_set);
|
136
|
-
*/
|
137
|
-
|
138
|
-
free(rxnset);
|
139
|
-
}
|
140
|
-
|
141
|
-
|
142
82
|
/*
|
143
83
|
* call-seq:
|
144
84
|
* nodeset.length => num
|
@@ -148,45 +88,40 @@ ruby_xml_node_set_free(ruby_xml_node_set *rxnset) {
|
|
148
88
|
VALUE
|
149
89
|
ruby_xml_node_set_length(VALUE self) {
|
150
90
|
ruby_xml_node_set *rxnset;
|
91
|
+
|
151
92
|
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
152
|
-
|
153
|
-
return(INT2FIX(0));
|
154
|
-
else
|
155
|
-
return(INT2NUM(rxnset->node_set->nodeNr));
|
93
|
+
return ruby_xml_xpath_object_length(rxnset->rxpop);
|
156
94
|
}
|
157
95
|
|
158
96
|
|
159
97
|
static void
|
160
98
|
ruby_xml_node_set_mark(ruby_xml_node_set *rxnset) {
|
161
|
-
if (rxnset
|
162
|
-
if (!NIL_P(rxnset->xd)) rb_gc_mark(rxnset->xd);
|
163
|
-
if (!NIL_P(rxnset->xpath)) rb_gc_mark(rxnset->xpath);
|
99
|
+
if (!NIL_P(rxnset->rxpop)) rb_gc_mark(rxnset->rxpop);
|
164
100
|
}
|
165
101
|
|
102
|
+
static void
|
103
|
+
ruby_xml_node_set_free(ruby_xml_node_set *rxnset) {
|
104
|
+
free(rxnset);
|
105
|
+
}
|
166
106
|
|
167
107
|
VALUE
|
168
|
-
ruby_xml_node_set_new(VALUE class, VALUE
|
169
|
-
|
108
|
+
ruby_xml_node_set_new(VALUE class, VALUE rxpop)
|
109
|
+
{
|
170
110
|
ruby_xml_node_set *rxnset;
|
171
|
-
|
172
111
|
rxnset = ALLOC(ruby_xml_node_set);
|
173
|
-
rxnset->
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
return(Data_Wrap_Struct(class, ruby_xml_node_set_mark,
|
179
|
-
ruby_xml_node_set_free, rxnset));
|
112
|
+
rxnset->rxpop=rxpop;
|
113
|
+
return Data_Wrap_Struct(class,
|
114
|
+
ruby_xml_node_set_mark,
|
115
|
+
ruby_xml_node_set_free,
|
116
|
+
rxnset);
|
180
117
|
}
|
181
118
|
|
182
|
-
|
183
119
|
VALUE
|
184
|
-
ruby_xml_node_set_new2(VALUE
|
185
|
-
|
186
|
-
return
|
120
|
+
ruby_xml_node_set_new2(VALUE rxpop)
|
121
|
+
{
|
122
|
+
return ruby_xml_node_set_new(cXMLNodeSet,rxpop);
|
187
123
|
}
|
188
124
|
|
189
|
-
|
190
125
|
/*
|
191
126
|
* call-seq:
|
192
127
|
* nodeset.xpath => xpath
|
@@ -195,13 +130,7 @@ ruby_xml_node_set_new2(VALUE xd, VALUE xpath,
|
|
195
130
|
*/
|
196
131
|
VALUE
|
197
132
|
ruby_xml_node_set_xpath_get(VALUE self) {
|
198
|
-
|
199
|
-
|
200
|
-
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
201
|
-
if (NIL_P(rxnset->xpath))
|
202
|
-
return(Qnil);
|
203
|
-
else
|
204
|
-
return(rxnset->xpath);
|
133
|
+
rb_raise(rb_eRuntimeError,"xpath retrival is no longer supported");
|
205
134
|
}
|
206
135
|
|
207
136
|
|
@@ -214,15 +143,7 @@ ruby_xml_node_set_xpath_get(VALUE self) {
|
|
214
143
|
*/
|
215
144
|
VALUE
|
216
145
|
ruby_xml_node_set_xpath_data_get(VALUE self) {
|
217
|
-
|
218
|
-
rx_xpath_data *rxxpd;
|
219
|
-
|
220
|
-
Data_Get_Struct(self, ruby_xml_node_set, rxnset);
|
221
|
-
if (rxnset->data_type != RUBY_LIBXML_SRC_TYPE_XPATH)
|
222
|
-
return(Qnil);
|
223
|
-
|
224
|
-
rxxpd = (rx_xpath_data *)rxnset->data;
|
225
|
-
return(rxxpd->ctxt);
|
146
|
+
rb_raise(rb_eRuntimeError,"xpath data retrival is no longer supported");
|
226
147
|
}
|
227
148
|
|
228
149
|
// Rdoc needs to know
|
data/ext/xml/ruby_xml_node_set.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_node_set.h
|
1
|
+
/* $Id: ruby_xml_node_set.h 183 2007-09-21 14:09:52Z danj $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -8,19 +8,13 @@
|
|
8
8
|
extern VALUE cXMLNodeSet;
|
9
9
|
|
10
10
|
typedef struct ruby_xml_node_set {
|
11
|
-
|
12
|
-
VALUE xd;
|
13
|
-
VALUE xpath;
|
14
|
-
int data_type;
|
15
|
-
void *data;
|
11
|
+
VALUE rxpop;
|
16
12
|
} ruby_xml_node_set;
|
17
13
|
|
18
|
-
void ruby_xml_node_set_free(ruby_xml_node_set *rxnset);
|
19
14
|
void ruby_init_xml_node_set(void);
|
20
|
-
VALUE ruby_xml_node_set_new(VALUE class, VALUE
|
21
|
-
|
22
|
-
VALUE ruby_xml_node_set_new2(VALUE xd, VALUE xpath,
|
23
|
-
xmlNodeSetPtr node_set);
|
15
|
+
VALUE ruby_xml_node_set_new(VALUE class, VALUE xpop);
|
16
|
+
VALUE ruby_xml_node_set_new2(VALUE xpop);
|
24
17
|
VALUE ruby_xml_node_set_each(VALUE self);
|
18
|
+
VALUE ruby_xml_node_set_first(VALUE self);
|
25
19
|
|
26
20
|
#endif
|
data/ext/xml/ruby_xml_ns.c
CHANGED
data/ext/xml/ruby_xml_ns.h
CHANGED
data/ext/xml/ruby_xml_parser.c
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_parser.c
|
2
|
-
/* $Id: ruby_xml_parser.c 138 2007-08-29 18:00:35Z danj $ */
|
1
|
+
/* $Id: ruby_xml_parser.c 192 2007-10-05 15:13:17Z danj $ */
|
3
2
|
|
4
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
5
4
|
|
@@ -9,7 +8,6 @@
|
|
9
8
|
static VALUE libxml_xmlRubyErrorProc = Qnil;
|
10
9
|
static int id_call;
|
11
10
|
|
12
|
-
int ruby_xml_parser_count = 0;
|
13
11
|
VALUE cXMLParser;
|
14
12
|
VALUE eXMLParserParseError;
|
15
13
|
|
@@ -798,10 +796,6 @@ void
|
|
798
796
|
ruby_xml_parser_free(ruby_xml_parser *rxp) {
|
799
797
|
void *data;
|
800
798
|
|
801
|
-
ruby_xml_parser_count--;
|
802
|
-
if (ruby_xml_parser_count == 0)
|
803
|
-
xmlCleanupParser();
|
804
|
-
|
805
799
|
switch(rxp->data_type) {
|
806
800
|
case RUBY_LIBXML_SRC_TYPE_NULL:
|
807
801
|
break;
|
@@ -940,6 +934,8 @@ ruby_xml_parser_mark(ruby_xml_parser *rxp) {
|
|
940
934
|
if (rxp == NULL) return;
|
941
935
|
if (!NIL_P(rxp->ctxt)) rb_gc_mark(rxp->ctxt);
|
942
936
|
|
937
|
+
ruby_xml_state_marker();
|
938
|
+
|
943
939
|
switch(rxp->data_type) {
|
944
940
|
case RUBY_LIBXML_SRC_TYPE_NULL:
|
945
941
|
break;
|
@@ -1007,16 +1003,20 @@ ruby_xml_parser_memory_used(VALUE self) {
|
|
1007
1003
|
VALUE
|
1008
1004
|
ruby_xml_parser_new(VALUE class) {
|
1009
1005
|
ruby_xml_parser *rxp;
|
1006
|
+
VALUE r;
|
1007
|
+
|
1008
|
+
r=Data_Make_Struct(class,
|
1009
|
+
ruby_xml_parser,
|
1010
|
+
ruby_xml_parser_mark,
|
1011
|
+
ruby_xml_parser_free,
|
1012
|
+
rxp);
|
1010
1013
|
|
1011
|
-
ruby_xml_parser_count++;
|
1012
|
-
rxp = ALLOC(ruby_xml_parser);
|
1013
1014
|
rxp->ctxt = Qnil;
|
1014
1015
|
rxp->data_type = RUBY_LIBXML_SRC_TYPE_NULL;
|
1015
1016
|
rxp->data = NULL;
|
1016
1017
|
rxp->parsed = 0;
|
1017
1018
|
|
1018
|
-
return
|
1019
|
-
ruby_xml_parser_free, rxp));
|
1019
|
+
return r;
|
1020
1020
|
}
|
1021
1021
|
|
1022
1022
|
|
data/ext/xml/ruby_xml_parser.h
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
/* $Id: ruby_xml_parser_context.c
|
1
|
+
/* $Id: ruby_xml_parser_context.c 189 2007-09-26 15:04:47Z danj $ */
|
2
2
|
|
3
3
|
/* Please see the LICENSE file for copyright and distribution information */
|
4
4
|
|
@@ -140,18 +140,19 @@ ruby_xml_parser_context_errno_get(VALUE self) {
|
|
140
140
|
|
141
141
|
void
|
142
142
|
ruby_xml_parser_context_free(ruby_xml_parser_context *rxpc) {
|
143
|
-
if (rxpc->ctxt != NULL
|
143
|
+
if (rxpc->ctxt != NULL) {
|
144
144
|
xmlFreeParserCtxt(rxpc->ctxt);
|
145
|
-
ruby_xml_parser_count--;
|
146
145
|
rxpc->ctxt = NULL;
|
147
146
|
}
|
148
147
|
|
149
|
-
if (ruby_xml_parser_count == 0)
|
150
|
-
xmlCleanupParser();
|
151
|
-
|
152
148
|
free(rxpc);
|
153
149
|
}
|
154
150
|
|
151
|
+
void
|
152
|
+
ruby_xml_parser_context_mark(void *v) {
|
153
|
+
if ( v == NULL ) return;
|
154
|
+
ruby_xml_state_marker();
|
155
|
+
}
|
155
156
|
|
156
157
|
/*
|
157
158
|
* call-seq:
|
@@ -370,11 +371,12 @@ ruby_xml_parser_context_new(VALUE class, xmlParserCtxtPtr ctxt) {
|
|
370
371
|
ruby_xml_parser_context *rxpc;
|
371
372
|
|
372
373
|
rxpc = ALLOC(ruby_xml_parser_context);
|
373
|
-
ruby_xml_parser_count++;
|
374
374
|
|
375
375
|
rxpc->ctxt = ctxt;
|
376
|
-
|
377
|
-
|
376
|
+
return Data_Wrap_Struct(class,
|
377
|
+
ruby_xml_parser_context_mark,
|
378
|
+
ruby_xml_parser_context_free,
|
379
|
+
rxpc);
|
378
380
|
}
|
379
381
|
|
380
382
|
|
@@ -0,0 +1,114 @@
|
|
1
|
+
/* $Id$ */
|
2
|
+
|
3
|
+
#include "libxml.h"
|
4
|
+
|
5
|
+
VALUE cXMLState;
|
6
|
+
static VALUE weak_holder;
|
7
|
+
static int id_inst;
|
8
|
+
|
9
|
+
ID id_state;
|
10
|
+
|
11
|
+
#undef DEBUG
|
12
|
+
|
13
|
+
void
|
14
|
+
ruby_xml_state_free(int * dummy) {
|
15
|
+
if ( dummy==NULL ) return;
|
16
|
+
xmlCleanupParser();
|
17
|
+
free(dummy);
|
18
|
+
dummy=NULL;
|
19
|
+
weak_holder=Qnil;
|
20
|
+
rb_ivar_set(cXMLState,id_state,Qnil);
|
21
|
+
}
|
22
|
+
|
23
|
+
void
|
24
|
+
ruby_xml_state_mark(void * a) {
|
25
|
+
#ifdef DEBUG
|
26
|
+
fprintf(stderr,"marked 0x%x\n",NUM2INT(rb_ivar_get(cXMLState,id_state)));
|
27
|
+
#endif
|
28
|
+
}
|
29
|
+
|
30
|
+
VALUE
|
31
|
+
ruby_xml_state_object() {
|
32
|
+
VALUE obj,id;
|
33
|
+
int *dummy;
|
34
|
+
|
35
|
+
id=rb_ivar_get(cXMLState,id_state);
|
36
|
+
if (NIL_P(id)) {
|
37
|
+
obj = Data_Make_Struct(cXMLState, int,
|
38
|
+
ruby_xml_state_mark,
|
39
|
+
ruby_xml_state_free,
|
40
|
+
dummy);
|
41
|
+
rb_ivar_set(cXMLState,id_state,id=rb_obj_id(obj));
|
42
|
+
*dummy=0;
|
43
|
+
weak_holder=obj;
|
44
|
+
return obj;
|
45
|
+
}
|
46
|
+
|
47
|
+
#ifdef DEBUG
|
48
|
+
fprintf(stderr,"getting 0x%x\n",NUM2INT(id));
|
49
|
+
#endif
|
50
|
+
return weak_holder;
|
51
|
+
|
52
|
+
return rb_funcall(rb_const_get(rb_cModule,rb_intern("ObjectSpace")),
|
53
|
+
rb_intern("_id2ref"),
|
54
|
+
1,
|
55
|
+
id);
|
56
|
+
}
|
57
|
+
|
58
|
+
VALUE
|
59
|
+
ruby_xml_state_object_find_aux(VALUE id) {
|
60
|
+
rb_funcall(rb_const_get(rb_cModule,rb_intern("ObjectSpace")),
|
61
|
+
rb_intern("_id2ref"),
|
62
|
+
1,
|
63
|
+
id);
|
64
|
+
}
|
65
|
+
|
66
|
+
|
67
|
+
static VALUE
|
68
|
+
find_failed() {
|
69
|
+
return Qnil;
|
70
|
+
}
|
71
|
+
|
72
|
+
VALUE
|
73
|
+
ruby_xml_state_object_find(VALUE id) {
|
74
|
+
return rb_rescue(ruby_xml_state_object_find_aux, id, find_failed, 0);
|
75
|
+
}
|
76
|
+
/*
|
77
|
+
* This will establish a use and mark it or mark an existing use.
|
78
|
+
* should be called by parser.mark and document.mark
|
79
|
+
*/
|
80
|
+
void
|
81
|
+
ruby_xml_state_marker(void) {
|
82
|
+
ruby_xml_state_object();
|
83
|
+
rb_gc_mark(weak_holder);
|
84
|
+
}
|
85
|
+
|
86
|
+
VALUE
|
87
|
+
ruby_xml_state_used_p(VALUE klass)
|
88
|
+
{
|
89
|
+
return rb_ivar_get(cXMLState,id_state);
|
90
|
+
}
|
91
|
+
|
92
|
+
VALUE
|
93
|
+
ruby_xml_state_use(VALUE klass)
|
94
|
+
{
|
95
|
+
return ruby_xml_state_object();
|
96
|
+
}
|
97
|
+
|
98
|
+
// Rdoc needs to know
|
99
|
+
#ifdef RDOC_NEVER_DEFINED
|
100
|
+
mXML = rb_define_module("XML");
|
101
|
+
#endif
|
102
|
+
|
103
|
+
|
104
|
+
void
|
105
|
+
ruby_init_state(void) {
|
106
|
+
cXMLState = rb_define_class_under(mXML, "State", rb_cObject);
|
107
|
+
|
108
|
+
rb_define_singleton_method(cXMLState, "used?",
|
109
|
+
ruby_xml_state_used_p, 0);
|
110
|
+
rb_define_singleton_method(cXMLState, "use",
|
111
|
+
ruby_xml_state_use, 0);
|
112
|
+
|
113
|
+
rb_ivar_set(cXMLState, id_state=rb_intern("@stateid"), Qnil);
|
114
|
+
}
|