libxml-ruby 0.3.8.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/CHANGELOG +6 -0
  2. data/LICENSE +1 -1
  3. data/README +1 -1
  4. data/Rakefile +8 -5
  5. data/TODO +1 -1
  6. data/ext/xml/extconf.rb +4 -5
  7. data/ext/xml/libxml.c +5 -2
  8. data/ext/xml/libxml.h +16 -7
  9. data/ext/xml/libxml.rb +3 -3
  10. data/ext/xml/ruby_xml_attr.c +118 -99
  11. data/ext/xml/ruby_xml_attr.h +4 -7
  12. data/ext/xml/ruby_xml_document.c +131 -170
  13. data/ext/xml/ruby_xml_document.h +5 -9
  14. data/ext/xml/ruby_xml_html_parser.c +453 -0
  15. data/ext/xml/ruby_xml_html_parser.h +29 -0
  16. data/ext/xml/ruby_xml_node.c +219 -253
  17. data/ext/xml/ruby_xml_node.h +4 -7
  18. data/ext/xml/ruby_xml_node_set.c +6 -6
  19. data/ext/xml/ruby_xml_node_set.h +1 -1
  20. data/ext/xml/ruby_xml_ns.c +1 -1
  21. data/ext/xml/ruby_xml_ns.h +1 -1
  22. data/ext/xml/ruby_xml_parser.c +5 -8
  23. data/ext/xml/ruby_xml_parser.h +1 -1
  24. data/ext/xml/ruby_xml_parser_context.c +3 -4
  25. data/ext/xml/ruby_xml_parser_context.h +1 -1
  26. data/ext/xml/ruby_xml_reader.c +893 -0
  27. data/ext/xml/ruby_xml_reader.h +14 -0
  28. data/ext/xml/ruby_xml_sax_parser.c +255 -204
  29. data/ext/xml/ruby_xml_sax_parser.h +6 -2
  30. data/ext/xml/ruby_xml_tree.c +1 -1
  31. data/ext/xml/ruby_xml_tree.h +1 -1
  32. data/ext/xml/ruby_xml_xinclude.c +1 -1
  33. data/ext/xml/ruby_xml_xinclude.h +1 -1
  34. data/ext/xml/ruby_xml_xpath.c +3 -2
  35. data/ext/xml/ruby_xml_xpath.h +1 -1
  36. data/ext/xml/ruby_xml_xpath_context.c +4 -4
  37. data/ext/xml/ruby_xml_xpath_context.h +1 -1
  38. data/ext/xml/ruby_xml_xpointer.c +10 -4
  39. data/ext/xml/ruby_xml_xpointer.h +1 -1
  40. data/ext/xml/ruby_xml_xpointer_context.c +1 -1
  41. data/ext/xml/ruby_xml_xpointer_context.h +1 -1
  42. data/ext/xml/sax_parser_callbacks.inc +55 -54
  43. data/tests/model/rubynet_project +1 -1
  44. data/tests/model/simple.xml +7 -0
  45. data/tests/tc_xml_document.rb +1 -1
  46. data/tests/tc_xml_document_write.rb +1 -1
  47. data/tests/tc_xml_document_write2.rb +1 -1
  48. data/tests/tc_xml_document_write3.rb +1 -1
  49. data/tests/tc_xml_html_parser.rb +60 -0
  50. data/tests/tc_xml_node.rb +1 -1
  51. data/tests/tc_xml_node2.rb +1 -1
  52. data/tests/tc_xml_node3.rb +1 -1
  53. data/tests/tc_xml_node4.rb +8 -5
  54. data/tests/tc_xml_node5.rb +1 -1
  55. data/tests/tc_xml_node6.rb +1 -1
  56. data/tests/tc_xml_node7.rb +1 -1
  57. data/tests/tc_xml_node_set.rb +1 -1
  58. data/tests/tc_xml_node_set2.rb +1 -1
  59. data/tests/tc_xml_node_xlink.rb +1 -1
  60. data/tests/tc_xml_parser.rb +5 -1
  61. data/tests/tc_xml_parser2.rb +1 -1
  62. data/tests/tc_xml_parser3.rb +1 -1
  63. data/tests/tc_xml_parser4.rb +1 -1
  64. data/tests/tc_xml_parser5.rb +1 -1
  65. data/tests/tc_xml_parser6.rb +1 -1
  66. data/tests/tc_xml_parser7.rb +1 -1
  67. data/tests/tc_xml_parser8.rb +1 -1
  68. data/tests/tc_xml_parser_context.rb +1 -1
  69. data/tests/tc_xml_reader.rb +101 -0
  70. data/tests/tc_xml_sax_parser.rb +95 -0
  71. data/tests/tc_xml_xinclude.rb +1 -1
  72. data/tests/tc_xml_xpath.rb +1 -1
  73. data/tests/tc_xml_xpointer.rb +1 -1
  74. metadata +79 -73
  75. data/ext/xml/ruby_xml_attribute.c +0 -224
  76. data/ext/xml/ruby_xml_attribute.h +0 -21
  77. data/tests/test_xml_sax_parser.rb +0 -64
@@ -0,0 +1,14 @@
1
+ /* Copyright (c) 2006 Apple Computer Inc.
2
+ * Please see the LICENSE file for copyright and distribution information. */
3
+
4
+ #ifndef __RUBY_XML_READER__
5
+ #define __RUBY_XML_READER__
6
+
7
+ extern VALUE cXMLReader;
8
+
9
+ void ruby_init_xml_reader(void);
10
+
11
+ /* Exported to be used by XML::Document#reader */
12
+ VALUE ruby_xml_reader_new_walker(VALUE self, VALUE doc);
13
+
14
+ #endif /* __RUBY_XML_READER__ */
@@ -1,4 +1,4 @@
1
- /* $Id: ruby_xml_sax_parser.c,v 1.6 2006/08/15 13:53:45 roscopeco Exp $ */
1
+ /* $Id: ruby_xml_sax_parser.c 111 2006-11-20 01:39:14Z roscopeco $ */
2
2
 
3
3
  /* Please see the LICENSE file for copyright and distribution information */
4
4
 
@@ -6,7 +6,25 @@
6
6
  #include "ruby_xml_sax_parser.h"
7
7
 
8
8
  VALUE cXMLSaxParser;
9
- VALUE callsym;
9
+ VALUE mXMLSaxParserCallbacks;
10
+
11
+ VALUE cbidOnInternalSubset;
12
+ VALUE cbidOnIsStandalone;
13
+ VALUE cbidOnHasInternalSubset;
14
+ VALUE cbidOnHasExternalSubset;
15
+ VALUE cbidOnStartDocument;
16
+ VALUE cbidOnEndDocument;
17
+ VALUE cbidOnStartElement;
18
+ VALUE cbidOnEndElement;
19
+ VALUE cbidOnReference;
20
+ VALUE cbidOnCharacters;
21
+ VALUE cbidOnProcessingInstruction;
22
+ VALUE cbidOnComment;
23
+ VALUE cbidOnXmlParserWarning;
24
+ VALUE cbidOnXmlParserError;
25
+ VALUE cbidOnXmlParserFatalError;
26
+ VALUE cbidOnCdataBlock;
27
+ VALUE cbidOnExternalSubset;
10
28
 
11
29
  #include "sax_parser_callbacks.inc"
12
30
 
@@ -17,39 +35,21 @@ ruby_xml_sax_parser_free(ruby_xml_sax_parser *rxsp) {
17
35
  /* xmlFreeSax_Parser(rxsp->sax_parser); */
18
36
  }
19
37
 
20
- #define mark_handler(rxsp, handler) \
21
- if (rxsp->cbp->handler && (rxsp->cbp->handler != Qnil)) \
22
- rb_gc_mark(rxsp->cbp->handler)
23
-
24
38
  void
25
39
  ruby_xml_sax_parser_mark(ruby_xml_sax_parser *rxsp) {
26
- mark_handler(rxsp, internalSubset);
27
- mark_handler(rxsp, isStandalone);
28
- mark_handler(rxsp, hasInternalSubset);
29
- mark_handler(rxsp, hasExternalSubset);
30
- mark_handler(rxsp, startDocument);
31
- mark_handler(rxsp, endDocument);
32
- mark_handler(rxsp, startElement);
33
- mark_handler(rxsp, endElement);
34
- mark_handler(rxsp, reference);
35
- mark_handler(rxsp, characters);
36
- mark_handler(rxsp, processingInstruction);
37
- mark_handler(rxsp, comment);
38
- mark_handler(rxsp, xmlParserWarning);
39
- mark_handler(rxsp, xmlParserError);
40
- mark_handler(rxsp, xmlParserFatalError);
41
- mark_handler(rxsp, cdataBlock);
40
+ if (rxsp->callbackHandler && (rxsp->callbackHandler != Qnil)) {
41
+ rb_gc_mark(rxsp->callbackHandler);
42
+ }
42
43
 
43
44
  if (rxsp->filename && (rxsp->filename != Qnil)) {
44
- rb_gc_mark(rxsp->filename);
45
+ rb_gc_mark(rxsp->filename);
45
46
  }
46
-
47
+
47
48
  if (rxsp->str && (rxsp->str != Qnil)) {
48
- rb_gc_mark(rxsp->str);
49
+ rb_gc_mark(rxsp->str);
49
50
  }
50
51
  }
51
52
 
52
-
53
53
  /*
54
54
  * call-seq:
55
55
  * XML::SaxParser.new => sax_parser
@@ -61,10 +61,9 @@ ruby_xml_sax_parser_new(VALUE class) {
61
61
  ruby_xml_sax_parser *rxsp;
62
62
 
63
63
  rxsp = ALLOC(ruby_xml_sax_parser);
64
- rxsp->cbp = ALLOC(ruby_xml_sax_parser_callbacks);
65
- memset(rxsp->cbp, 0, sizeof(ruby_xml_sax_parser_callbacks));
66
64
  rxsp->xsh = &rubySAXHandlerStruct;
67
-
65
+
66
+ rxsp->callbackHandler = Qnil;
68
67
  rxsp->xpc = NULL;
69
68
  rxsp->filename = Qnil;
70
69
  rxsp->str = Qnil;
@@ -74,6 +73,38 @@ ruby_xml_sax_parser_new(VALUE class) {
74
73
  }
75
74
 
76
75
 
76
+ /*
77
+ * call-seq:
78
+ * sax_parser.callbacks => #<XML::SaxParser::Callbacks subclass>
79
+ *
80
+ * Obtain the callbacks used by this parser.
81
+ */
82
+ VALUE
83
+ ruby_xml_sax_parser_callbacks_get(VALUE self) {
84
+ ruby_xml_sax_parser *rxsp;
85
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
86
+ return(rxsp->callbackHandler);
87
+ }
88
+
89
+
90
+ /*
91
+ * call-seq:
92
+ * sax_parser.callbacks = #<XML::SaxParser::Callbacks subclass>
93
+ *
94
+ * Set the callbacks used by this parser. The value assigned to
95
+ * this attribute will usually be an object that extends the the
96
+ * XML::SaxParser::Callbacks module, overriding the callbacks it
97
+ * wishes to process.
98
+ */
99
+ VALUE
100
+ ruby_xml_sax_parser_callbacks_set(VALUE self, VALUE callbacks) {
101
+ ruby_xml_sax_parser *rxsp;
102
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
103
+ rxsp->callbackHandler = callbacks;
104
+ return(rxsp->callbackHandler);
105
+ }
106
+
107
+
77
108
  /*
78
109
  * call-seq:
79
110
  * sax_parser.filename => "filename"
@@ -103,280 +134,276 @@ ruby_xml_sax_parser_filename_set(VALUE self, VALUE filename) {
103
134
  return(rxsp->filename);
104
135
  }
105
136
 
106
- #define set_handler(self, argc, argv, handler) \
107
- VALUE proc; \
108
- ruby_xml_sax_parser *rxsp; \
109
- rb_scan_args(argc, argv, "0&", &proc); \
110
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp); \
111
- rxsp->cbp->handler = proc; \
112
- return(Qnil);
137
+
138
+ /*
139
+ * call-seq:
140
+ * parser.parse => (true|false)
141
+ *
142
+ * Parse the input XML, generating callbacks to the object
143
+ * registered via the +callbacks+ attribute.
144
+ */
145
+ VALUE
146
+ ruby_xml_sax_parser_parse(VALUE self) {
147
+ char *str;
148
+ int status = 1;
149
+ ruby_xml_sax_parser *rxsp;
150
+
151
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
152
+
153
+ if (rxsp->filename != Qnil) {
154
+ status = xmlSAXUserParseFile(rxsp->xsh, rxsp, StringValuePtr(rxsp->filename));
155
+ } else if (rxsp->str != Qnil) {
156
+ str = StringValuePtr(rxsp->str);
157
+ status = //ruby_xml_document_new(cXMLDocument,
158
+ xmlSAXUserParseMemory(rxsp->xsh, rxsp,
159
+ str, strlen(str)); //);
160
+ }
161
+
162
+ /* XXX This should return an exception for the various error codes
163
+ * that can come back in status, but I'm too lazy to do that right
164
+ * now. */
165
+ if (status)
166
+ return(Qfalse);
167
+ else
168
+ return(Qtrue);
169
+ }
170
+
171
+
172
+ /*
173
+ * call-seq:
174
+ * parser.string => "xml"
175
+ *
176
+ * Obtain the parser's input string.
177
+ */
178
+ VALUE
179
+ ruby_xml_sax_parser_str_get(VALUE self) {
180
+ ruby_xml_sax_parser *rxsp;
181
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
182
+ return(rxsp->str);
183
+ }
184
+
185
+
186
+ /*
187
+ * call-seq:
188
+ * parser.string = "xml"
189
+ *
190
+ * Set the parser's input string.
191
+ */
192
+ VALUE
193
+ ruby_xml_sax_parser_str_set(VALUE self, VALUE str) {
194
+ ruby_xml_sax_parser *rxsp;
195
+ Check_Type(str, T_STRING);
196
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
197
+ rxsp->str = str;
198
+ return(rxsp->str);
199
+ }
200
+
113
201
 
202
+ /****** SaxCallbacks ******/
203
+ /* These are all the same. Bloody Rdoc... */
114
204
 
115
205
  /*
116
206
  * call-seq:
117
- * parser.on_internal_subset { |name, external_id, system_id| ... } => nil
207
+ * callbacks.on_internal_subset(name, external_id, system_id)
118
208
  *
119
- * Set the callback block for an internal subset event.
209
+ * Called for an internal subset event.
120
210
  */
121
211
  VALUE
122
- ruby_xml_sax_parser_on_internal_subset(int argc, VALUE *argv, VALUE self) {
123
- set_handler(self, argc, argv, internalSubset);
212
+ ruby_xml_sax_callbacks_on_internal_subset(int argc, VALUE *argv, VALUE self) {
213
+ return Qnil;
124
214
  }
125
215
 
126
216
 
127
217
  /*
128
218
  * call-seq:
129
- * parser.on_is_standalone { || ... } => nil
219
+ * callbacks.on_is_standalone()
130
220
  *
131
- * Set the callback proc for 'is standalone' event.
221
+ * Called for 'is standalone' event.
132
222
  */
133
223
  VALUE
134
- ruby_xml_sax_parser_on_is_standalone(int argc, VALUE *argv, VALUE self) {
135
- set_handler(self, argc, argv, isStandalone);
224
+ ruby_xml_sax_callbacks_on_is_standalone(int argc, VALUE *argv, VALUE self) {
225
+ return Qnil;
136
226
  }
137
227
 
138
228
 
139
229
  /*
140
230
  * call-seq:
141
- * parser.on_has_internal_subset { || ... } => nil
231
+ * callbacks.on_has_internal_subset()
142
232
  *
143
- * Set the callback proc for an internal subset notification event.
233
+ * Called for an internal subset notification event.
144
234
  */
145
235
  VALUE
146
- ruby_xml_sax_parser_on_has_internal_subset(int argc, VALUE *argv, VALUE self) {
147
- set_handler(self, argc, argv, hasInternalSubset);
236
+ ruby_xml_sax_callbacks_on_has_internal_subset(int argc, VALUE *argv, VALUE self) {
237
+ return Qnil;
148
238
  }
149
239
 
150
240
 
151
241
  /*
152
242
  * call-seq:
153
- * parser.on_has_external_subset { || ... } => nil
243
+ * callbacks.on_has_external_subset()
154
244
  *
155
- * Set the callback proc for an external subset notification event.
245
+ * Called for an external subset notification event.
156
246
  */
157
247
  VALUE
158
- ruby_xml_sax_parser_on_has_external_subset(int argc, VALUE *argv, VALUE self) {
159
- set_handler(self, argc, argv, hasExternalSubset);
248
+ ruby_xml_sax_callbacks_on_has_external_subset(int argc, VALUE *argv, VALUE self) {
249
+ return Qnil;
160
250
  }
161
251
 
162
252
 
163
253
  /*
164
254
  * call-seq:
165
- * parser.on_start_document { || ... } => nil
255
+ * callbacks.on_start_document()
166
256
  *
167
- * Set the callback proc for a start document event.
257
+ * Called for a start document event.
168
258
  */
169
259
  VALUE
170
- ruby_xml_sax_parser_on_start_document(int argc, VALUE *argv, VALUE self) {
171
- set_handler(self, argc, argv, startDocument);
260
+ ruby_xml_sax_callbacks_on_start_document(int argc, VALUE *argv, VALUE self) {
261
+ return Qnil;
172
262
  }
173
263
 
174
264
 
175
265
  /*
176
266
  * call-seq:
177
- * parser.on_end_document { || ... } => nil
267
+ * callbacks.on_end_document()
178
268
  *
179
- * Set the callback proc for an end document event.
269
+ * Called for an end document event.
180
270
  */
181
271
  VALUE
182
- ruby_xml_sax_parser_on_end_document(int argc, VALUE *argv, VALUE self) {
183
- set_handler(self, argc, argv, endDocument);
272
+ ruby_xml_sax_callbacks_on_end_document(int argc, VALUE *argv, VALUE self) {
273
+ return Qnil;
184
274
  }
185
275
 
186
276
 
187
277
  /*
188
278
  * call-seq:
189
- * parser.on_start_element { |name, attr_hash| ... } => nil
279
+ * callbacks.on_start_element(name, attr_hash)
190
280
  *
191
- * Set the callback proc for an element start event.
281
+ * Called for an element start event.
192
282
  */
193
283
  VALUE
194
- ruby_xml_sax_parser_on_start_element(int argc, VALUE *argv, VALUE self) {
195
- set_handler(self, argc, argv, startElement);
284
+ ruby_xml_sax_callbacks_on_start_element(int argc, VALUE *argv, VALUE self) {
285
+ return Qnil;
196
286
  }
197
287
 
198
288
 
199
289
  /*
200
290
  * call-seq:
201
- * parser.on_end_element { |name| ... } => nil
291
+ * callbacks.on_end_element(name)
202
292
  *
203
- * Set the callback proc for an element end event.
293
+ * Called for an element end event.
204
294
  */
205
295
  VALUE
206
- ruby_xml_sax_parser_on_end_element(int argc, VALUE *argv, VALUE self) {
207
- set_handler(self, argc, argv, endElement);
296
+ ruby_xml_sax_callbacks_on_end_element(int argc, VALUE *argv, VALUE self) {
297
+ return Qnil;
208
298
  }
209
299
 
210
300
 
211
301
  /*
212
302
  * call-seq:
213
- * parser.on_reference { |name| ... } => nil
303
+ * callbacks.on_reference(name)
214
304
  *
215
- * Set the callback proc for a reference event.
305
+ * Called for a reference event.
216
306
  */
217
307
  VALUE
218
- ruby_xml_sax_parser_on_reference(int argc, VALUE *argv, VALUE self) {
219
- set_handler(self, argc, argv, reference);
308
+ ruby_xml_sax_callbacks_on_reference(int argc, VALUE *argv, VALUE self) {
309
+ return Qnil;
220
310
  }
221
311
 
222
312
 
223
313
  /*
224
314
  * call-seq:
225
- * parser.on_characters { |chars| ... } => nil
315
+ * callbacks.on_characters(chars)
226
316
  *
227
- * Set the callback proc for a characters event.
317
+ * Called for a characters event.
228
318
  */
229
319
  VALUE
230
- ruby_xml_sax_parser_on_characters(int argc, VALUE *argv, VALUE self) {
231
- set_handler(self, argc, argv, characters);
320
+ ruby_xml_sax_callbacks_on_characters(int argc, VALUE *argv, VALUE self) {
321
+ return Qnil;
232
322
  }
233
323
 
234
324
 
235
325
  /*
236
326
  * call-seq:
237
- * parser.on_processing_instruction { |target, data| ... } => nil
327
+ * callbacks.on_processing_instruction(target, data)
238
328
  *
239
- * Set the callback proc for an processing instruction event.
329
+ * Called for an processing instruction event.
240
330
  */
241
331
  VALUE
242
- ruby_xml_sax_parser_on_processing_instruction(int argc, VALUE *argv, VALUE self) {
243
- set_handler(self, argc, argv, processingInstruction);
332
+ ruby_xml_sax_callbacks_on_processing_instruction(int argc, VALUE *argv, VALUE self) {
333
+ return Qnil;
244
334
  }
245
335
 
246
336
 
247
337
  /*
248
338
  * call-seq:
249
- * parser.on_comment { |msg| ... } => nil
339
+ * callbacks.on_comment(msg)
250
340
  *
251
- * Set the callback proc for a comment event.
341
+ * Called for a comment event.
252
342
  */
253
343
  VALUE
254
- ruby_xml_sax_parser_on_comment(int argc, VALUE *argv, VALUE self) {
255
- set_handler(self, argc, argv, comment);
344
+ ruby_xml_sax_callbacks_on_comment(int argc, VALUE *argv, VALUE self) {
345
+ return Qnil;
256
346
  }
257
347
 
258
348
 
259
349
  /*
260
350
  * call-seq:
261
- * parser.on_parser_warning { |msg| ... } => nil
351
+ * callbacks.on_parser_warning(msg)
262
352
  *
263
- * Set the callback proc that receives parser warnings.
353
+ * Called for parser warnings.
264
354
  */
265
355
  VALUE
266
- ruby_xml_sax_parser_on_parser_warning(int argc, VALUE *argv, VALUE self) {
267
- set_handler(self, argc, argv, xmlParserWarning);
356
+ ruby_xml_sax_callbacks_on_parser_warning(int argc, VALUE *argv, VALUE self) {
357
+ return Qnil;
268
358
  }
269
359
 
270
360
 
271
361
  /*
272
362
  * call-seq:
273
- * parser.on_parser_error { |msg| ... } => nil
363
+ * callbacks.on_parser_error(msg)
274
364
  *
275
- * Set the callback proc that receives parser errors.
365
+ * Called for parser errors.
276
366
  */
277
367
  VALUE
278
- ruby_xml_sax_parser_on_parser_error(int argc, VALUE *argv, VALUE self) {
279
- set_handler(self, argc, argv, xmlParserError);
368
+ ruby_xml_sax_callbacks_on_parser_error(int argc, VALUE *argv, VALUE self) {
369
+ return Qnil;
280
370
  }
281
371
 
282
372
 
283
373
  /*
284
374
  * call-seq:
285
- * parser.on_parser_fatal_error { |msg| ... } => nil
375
+ * callbacks.on_parser_fatal_error(msg)
286
376
  *
287
- * Set the callback proc that receives fatal parser errors.
377
+ * Called for fatal parser errors.
288
378
  */
289
379
  VALUE
290
- ruby_xml_sax_parser_on_parser_fatal_error(int argc, VALUE *argv, VALUE self) {
291
- set_handler(self, argc, argv, xmlParserFatalError);
380
+ ruby_xml_sax_callbacks_on_parser_fatal_error(int argc, VALUE *argv, VALUE self) {
381
+ return Qnil;
292
382
  }
293
383
 
294
384
  /*
295
385
  * call-seq:
296
- * parser.on_cdata_block { |cdata| ... } => nil
386
+ * callbacks.on_cdata_block(cdata)
297
387
  *
298
- * Set the callback proc for a CDATA block event.
388
+ * Called for a CDATA block event.
299
389
  */
300
390
  VALUE
301
- ruby_xml_sax_parser_on_cdata_block(int argc, VALUE *argv, VALUE self) {
302
- set_handler(self, argc, argv, cdataBlock);
391
+ ruby_xml_sax_callbacks_on_cdata_block(int argc, VALUE *argv, VALUE self) {
392
+ return Qnil;
303
393
  }
304
394
 
305
395
  /*
306
396
  * call-seq:
307
- * parser.on_external_subset { |name, external_id, system_id| ... } => nil
397
+ * callbacks.on_external_subset(name, external_id, system_id)
308
398
  *
309
- * Set the callback proc for an external subset event.
310
- */
311
- VALUE
312
- ruby_xml_sax_parser_on_external_subset(int argc, VALUE *argv, VALUE self) {
313
- set_handler(self, argc, argv, externalSubset);
314
- }
315
-
316
-
317
- /*
318
- * call-seq:
319
- * parser.parse => (true|false)
320
- *
321
- * Parse the input XML, generating callbacks to the procs
322
- * registered with the parser (via the on_xxxx attributes).
323
- */
324
- VALUE
325
- ruby_xml_sax_parser_parse(VALUE self) {
326
- char *str;
327
- int status = 1;
328
- ruby_xml_sax_parser *rxsp;
329
-
330
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
331
-
332
- if (rxsp->filename != Qnil) {
333
- status = xmlSAXUserParseFile(rxsp->xsh, rxsp->cbp, StringValuePtr(rxsp->filename));
334
- } else if (rxsp->str != Qnil) {
335
- str = StringValuePtr(rxsp->str);
336
- status = //ruby_xml_document_new(cXMLDocument,
337
- xmlSAXUserParseMemory(rxsp->xsh, rxsp->cbp,
338
- str, strlen(str)); //);
339
- }
340
-
341
- /* XXX This should return an exception for the various error codes
342
- * that can come back in status, but I'm too lazy to do that right
343
- * now. */
344
- if (status)
345
- return(Qfalse);
346
- else
347
- return(Qtrue);
348
- }
349
-
350
-
351
- /*
352
- * call-seq:
353
- * parser.string => "xml"
354
- *
355
- * Obtain the parser's input string.
399
+ * Called for an external subset event.
356
400
  */
357
401
  VALUE
358
- ruby_xml_sax_parser_str_get(VALUE self) {
359
- ruby_xml_sax_parser *rxsp;
360
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
361
- return(rxsp->str);
402
+ ruby_xml_sax_callbacks_on_external_subset(int argc, VALUE *argv, VALUE self) {
403
+ return Qnil;
362
404
  }
363
405
 
364
406
 
365
- /*
366
- * call-seq:
367
- * parser.string = "xml"
368
- *
369
- * Set the parser's input string.
370
- */
371
- VALUE
372
- ruby_xml_sax_parser_str_set(VALUE self, VALUE str) {
373
- ruby_xml_sax_parser *rxsp;
374
- Check_Type(str, T_STRING);
375
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
376
- rxsp->str = str;
377
- return(rxsp->str);
378
- }
379
-
380
407
  // Rdoc needs to know
381
408
  #ifdef RDOC_NEVER_DEFINED
382
409
  mXML = rb_define_module("XML");
@@ -385,50 +412,74 @@ ruby_xml_sax_parser_str_set(VALUE self, VALUE str) {
385
412
  void
386
413
  ruby_init_xml_sax_parser(void) {
387
414
  cXMLSaxParser = rb_define_class_under(mXML, "SaxParser", rb_cObject);
388
- callsym = rb_intern("call");
415
+ mXMLSaxParserCallbacks = rb_define_module_under(cXMLSaxParser, "Callbacks");
389
416
 
417
+ /* SaxParser */
390
418
  rb_define_singleton_method(cXMLSaxParser, "new", ruby_xml_sax_parser_new, 0);
391
419
 
392
420
  rb_define_method(cXMLSaxParser, "filename",
393
- ruby_xml_sax_parser_filename_get, 0);
421
+ ruby_xml_sax_parser_filename_get, 0);
394
422
  rb_define_method(cXMLSaxParser, "filename=",
395
- ruby_xml_sax_parser_filename_set, 1);
423
+ ruby_xml_sax_parser_filename_set, 1);
424
+ rb_define_method(cXMLSaxParser, "callbacks",
425
+ ruby_xml_sax_parser_callbacks_get, 0);
426
+ rb_define_method(cXMLSaxParser, "callbacks=",
427
+ ruby_xml_sax_parser_callbacks_set, 1);
396
428
  rb_define_method(cXMLSaxParser, "parse", ruby_xml_sax_parser_parse, 0);
397
429
  rb_define_method(cXMLSaxParser, "string", ruby_xml_sax_parser_str_get, 0);
398
430
  rb_define_method(cXMLSaxParser, "string=", ruby_xml_sax_parser_str_set, 1);
399
431
 
400
- rb_define_method(cXMLSaxParser, "on_internal_subset",
401
- ruby_xml_sax_parser_on_internal_subset, -1);
402
- rb_define_method(cXMLSaxParser, "on_is_standalone",
403
- ruby_xml_sax_parser_on_is_standalone, -1);
404
- rb_define_method(cXMLSaxParser, "on_has_internal_subset",
405
- ruby_xml_sax_parser_on_has_internal_subset, -1);
406
- rb_define_method(cXMLSaxParser, "on_has_external_subset",
407
- ruby_xml_sax_parser_on_has_external_subset, -1);
408
- rb_define_method(cXMLSaxParser, "on_start_document",
409
- ruby_xml_sax_parser_on_start_document, -1);
410
- rb_define_method(cXMLSaxParser, "on_end_document",
411
- ruby_xml_sax_parser_on_end_document, -1);
412
- rb_define_method(cXMLSaxParser, "on_start_element",
413
- ruby_xml_sax_parser_on_start_element, -1);
414
- rb_define_method(cXMLSaxParser, "on_end_element",
415
- ruby_xml_sax_parser_on_end_element, -1);
416
- rb_define_method(cXMLSaxParser, "on_reference",
417
- ruby_xml_sax_parser_on_reference, -1);
418
- rb_define_method(cXMLSaxParser, "on_characters",
419
- ruby_xml_sax_parser_on_characters, -1);
420
- rb_define_method(cXMLSaxParser, "on_processing_instruction",
421
- ruby_xml_sax_parser_on_processing_instruction, -1);
422
- rb_define_method(cXMLSaxParser, "on_comment",
423
- ruby_xml_sax_parser_on_comment, -1);
424
- rb_define_method(cXMLSaxParser, "on_parser_warning",
425
- ruby_xml_sax_parser_on_parser_warning, -1);
426
- rb_define_method(cXMLSaxParser, "on_parser_error",
427
- ruby_xml_sax_parser_on_parser_error, -1);
428
- rb_define_method(cXMLSaxParser, "on_parser_fatal_error",
429
- ruby_xml_sax_parser_on_parser_fatal_error, -1);
430
- rb_define_method(cXMLSaxParser, "on_cdata_block",
431
- ruby_xml_sax_parser_on_cdata_block, -1);
432
- rb_define_method(cXMLSaxParser, "on_external_subset",
433
- ruby_xml_sax_parser_on_external_subset, -1);
432
+ /* SaxCallbacks */
433
+ cbidOnInternalSubset = rb_intern("on_internal_subset");
434
+ cbidOnIsStandalone = rb_intern("on_is_standalone");
435
+ cbidOnHasInternalSubset = rb_intern("on_has_internal_subset");
436
+ cbidOnHasExternalSubset = rb_intern("on_has_external_subset");
437
+ cbidOnStartDocument = rb_intern("on_start_document");
438
+ cbidOnEndDocument = rb_intern("on_end_document");
439
+ cbidOnStartElement = rb_intern("on_start_element");
440
+ cbidOnEndElement = rb_intern("on_end_element");
441
+ cbidOnReference = rb_intern("on_reference");
442
+ cbidOnCharacters = rb_intern("on_characters");
443
+ cbidOnProcessingInstruction = rb_intern("on_processing_instruction");
444
+ cbidOnComment = rb_intern("on_comment");
445
+ cbidOnXmlParserWarning = rb_intern("on_parser_warning");
446
+ cbidOnXmlParserError = rb_intern("on_parser_error");
447
+ cbidOnXmlParserFatalError = rb_intern("on_parser_fatal_error");
448
+ cbidOnCdataBlock = rb_intern("on_cdata_block");
449
+ cbidOnExternalSubset = rb_intern("on_external_subset");
450
+
451
+ rb_define_method(mXMLSaxParserCallbacks, "on_internal_subset",
452
+ ruby_xml_sax_callbacks_on_internal_subset, -1);
453
+ rb_define_method(mXMLSaxParserCallbacks, "on_is_standalone",
454
+ ruby_xml_sax_callbacks_on_is_standalone, -1);
455
+ rb_define_method(mXMLSaxParserCallbacks, "on_has_internal_subset",
456
+ ruby_xml_sax_callbacks_on_has_internal_subset, -1);
457
+ rb_define_method(mXMLSaxParserCallbacks, "on_has_external_subset",
458
+ ruby_xml_sax_callbacks_on_has_external_subset, -1);
459
+ rb_define_method(mXMLSaxParserCallbacks, "on_start_document",
460
+ ruby_xml_sax_callbacks_on_start_document, -1);
461
+ rb_define_method(mXMLSaxParserCallbacks, "on_end_document",
462
+ ruby_xml_sax_callbacks_on_end_document, -1);
463
+ rb_define_method(mXMLSaxParserCallbacks, "on_start_element",
464
+ ruby_xml_sax_callbacks_on_start_element, -1);
465
+ rb_define_method(mXMLSaxParserCallbacks, "on_end_element",
466
+ ruby_xml_sax_callbacks_on_end_element, -1);
467
+ rb_define_method(mXMLSaxParserCallbacks, "on_reference",
468
+ ruby_xml_sax_callbacks_on_reference, -1);
469
+ rb_define_method(mXMLSaxParserCallbacks, "on_characters",
470
+ ruby_xml_sax_callbacks_on_characters, -1);
471
+ rb_define_method(mXMLSaxParserCallbacks, "on_processing_instruction",
472
+ ruby_xml_sax_callbacks_on_processing_instruction, -1);
473
+ rb_define_method(mXMLSaxParserCallbacks, "on_comment",
474
+ ruby_xml_sax_callbacks_on_comment, -1);
475
+ rb_define_method(mXMLSaxParserCallbacks, "on_parser_warning",
476
+ ruby_xml_sax_callbacks_on_parser_warning, -1);
477
+ rb_define_method(mXMLSaxParserCallbacks, "on_parser_error",
478
+ ruby_xml_sax_callbacks_on_parser_error, -1);
479
+ rb_define_method(mXMLSaxParserCallbacks, "on_parser_fatal_error",
480
+ ruby_xml_sax_callbacks_on_parser_fatal_error, -1);
481
+ rb_define_method(mXMLSaxParserCallbacks, "on_cdata_block",
482
+ ruby_xml_sax_callbacks_on_cdata_block, -1);
483
+ rb_define_method(mXMLSaxParserCallbacks, "on_external_subset",
484
+ ruby_xml_sax_callbacks_on_external_subset, -1);
434
485
  }