libxml-ruby 0.5.4 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. data/LICENSE +23 -23
  2. data/README +144 -144
  3. data/ext/libxml/extconf.rb +26 -27
  4. data/ext/libxml/libxml.c +7 -37
  5. data/ext/libxml/{libxml.h → ruby_libxml.h} +93 -98
  6. data/ext/libxml/ruby_xml_attr.c +405 -387
  7. data/ext/libxml/ruby_xml_attr.h +19 -18
  8. data/ext/libxml/ruby_xml_document.c +1111 -1115
  9. data/ext/libxml/ruby_xml_document.h +27 -24
  10. data/ext/libxml/ruby_xml_dtd.c +168 -168
  11. data/ext/libxml/ruby_xml_html_parser.c +449 -450
  12. data/ext/libxml/ruby_xml_html_parser.h +1 -1
  13. data/ext/libxml/ruby_xml_input_cbg.c +158 -158
  14. data/ext/libxml/ruby_xml_node.c +2410 -2395
  15. data/ext/libxml/ruby_xml_node.h +1 -1
  16. data/ext/libxml/ruby_xml_node_set.c +170 -170
  17. data/ext/libxml/ruby_xml_node_set.h +1 -1
  18. data/ext/libxml/ruby_xml_ns.c +153 -153
  19. data/ext/libxml/ruby_xml_ns.h +1 -1
  20. data/ext/libxml/ruby_xml_parser.c +1425 -1422
  21. data/ext/libxml/ruby_xml_parser.h +1 -1
  22. data/ext/libxml/ruby_xml_parser_context.c +750 -716
  23. data/ext/libxml/ruby_xml_parser_context.h +1 -1
  24. data/ext/libxml/ruby_xml_reader.c +900 -896
  25. data/ext/libxml/ruby_xml_sax_parser.c +485 -485
  26. data/ext/libxml/ruby_xml_sax_parser.h +1 -1
  27. data/ext/libxml/ruby_xml_schema.c +146 -142
  28. data/ext/libxml/ruby_xml_state.c +5 -6
  29. data/ext/libxml/ruby_xml_state.h +1 -0
  30. data/ext/libxml/ruby_xml_tree.c +43 -43
  31. data/ext/libxml/ruby_xml_tree.h +1 -1
  32. data/ext/libxml/ruby_xml_xinclude.c +20 -20
  33. data/ext/libxml/ruby_xml_xinclude.h +1 -1
  34. data/ext/libxml/ruby_xml_xpath.c +243 -252
  35. data/ext/libxml/ruby_xml_xpath.h +1 -1
  36. data/ext/libxml/ruby_xml_xpath_context.c +118 -118
  37. data/ext/libxml/ruby_xml_xpath_context.h +1 -1
  38. data/ext/libxml/ruby_xml_xpath_object.c +43 -29
  39. data/ext/libxml/ruby_xml_xpath_object.h +0 -1
  40. data/ext/libxml/ruby_xml_xpointer.c +100 -100
  41. data/ext/libxml/ruby_xml_xpointer.h +1 -1
  42. data/ext/libxml/ruby_xml_xpointer_context.c +21 -21
  43. data/ext/libxml/ruby_xml_xpointer_context.h +1 -1
  44. data/ext/libxml/sax_parser_callbacks.inc +213 -213
  45. data/ext/libxml/version.h +9 -9
  46. data/lib/libxml.rb +24 -3
  47. data/mingw/libiconv-2.dll +0 -0
  48. data/mingw/libxml2-2.dll +0 -0
  49. data/mingw/libxml_ruby.so +0 -0
  50. data/mingw/mingw.rake +36 -0
  51. data/test/dtd-test.rb +24 -24
  52. data/test/etc_doc_to_s.rb +1 -3
  53. data/test/ets_copy_bug.rb +21 -21
  54. data/test/ets_copy_bug2.rb +32 -32
  55. data/test/ets_copy_bug3.rb +38 -0
  56. data/test/ets_doc_file.rb +1 -0
  57. data/test/{model/default_validation_bug.rb → gc.log} +0 -0
  58. data/test/merge_bug.rb +55 -55
  59. data/test/schema-test.rb +74 -74
  60. data/test/tc_well_formed.rb +11 -0
  61. data/test/tc_xml_document.rb +52 -52
  62. data/test/tc_xml_document_write.rb +24 -24
  63. data/test/tc_xml_document_write2.rb +54 -54
  64. data/test/tc_xml_document_write3.rb +96 -96
  65. data/test/tc_xml_html_parser.rb +63 -63
  66. data/test/tc_xml_node.rb +59 -59
  67. data/test/tc_xml_node2.rb +25 -25
  68. data/test/tc_xml_node3.rb +27 -27
  69. data/test/tc_xml_node4.rb +86 -86
  70. data/test/tc_xml_node5.rb +52 -52
  71. data/test/tc_xml_node6.rb +27 -27
  72. data/test/tc_xml_node7.rb +35 -35
  73. data/test/tc_xml_node8.rb +32 -32
  74. data/test/tc_xml_node9.rb +32 -32
  75. data/test/tc_xml_node_set.rb +24 -24
  76. data/test/tc_xml_node_set2.rb +37 -37
  77. data/test/tc_xml_node_xlink.rb +28 -28
  78. data/test/tc_xml_parser.rb +190 -178
  79. data/test/tc_xml_parser2.rb +16 -17
  80. data/test/tc_xml_parser3.rb +23 -23
  81. data/test/tc_xml_parser4.rb +33 -33
  82. data/test/tc_xml_parser5.rb +27 -27
  83. data/test/tc_xml_parser6.rb +23 -23
  84. data/test/tc_xml_parser7.rb +28 -28
  85. data/test/tc_xml_parser8.rb +32 -32
  86. data/test/tc_xml_parser9.rb +11 -0
  87. data/test/tc_xml_parser_context.rb +88 -88
  88. data/test/tc_xml_reader.rb +112 -109
  89. data/test/tc_xml_sax_parser.rb +104 -94
  90. data/test/tc_xml_sax_parser2.rb +51 -0
  91. data/test/tc_xml_xinclude.rb +30 -30
  92. data/test/tc_xml_xpath.rb +38 -38
  93. data/test/tc_xml_xpath2.rb +14 -0
  94. data/test/tc_xml_xpointer.rb +78 -78
  95. data/vc/libxml.sln +20 -0
  96. data/vc/libxml.vcproj +389 -0
  97. data/work/Rakefile +247 -0
  98. data/work/task/make +26 -0
  99. data/work/task/memory +37 -0
  100. data/work/task/rdoc +39 -0
  101. data/work/task/setup +1616 -0
  102. data/work/task/test +29 -0
  103. data/work/test/ets_runner.rb +33 -0
  104. data/work/test/libxml_test.rb +3 -0
  105. data/work/test/runner.rb +0 -0
  106. data/work/test/runner_ets.rb +33 -0
  107. data/work/vc/debug/libxml.exp +0 -0
  108. data/work/vc/debug/libxml.ilk +0 -0
  109. data/work/vc/debug/libxml.lib +0 -0
  110. data/work/vc/debug/libxml.pdb +0 -0
  111. data/work/vc/debug/libxml.so +0 -0
  112. metadata +158 -189
  113. data/MANIFEST +0 -138
  114. data/NOTES +0 -9
  115. data/Rakefile +0 -38
  116. data/TODO +0 -75
  117. data/VERSION +0 -1
  118. data/log/Changelog-0.txt +0 -426
  119. data/log/Changelog.txt +0 -435
  120. data/meta/project.yaml +0 -27
  121. data/meta/unixname +0 -1
  122. data/setup.rb +0 -1472
  123. data/site/css/normal.css +0 -182
  124. data/site/img/raze-tiny.png +0 -0
  125. data/site/img/red-cube.jpg +0 -0
  126. data/site/img/xml-ruby.png +0 -0
  127. data/site/index.xml +0 -43
  128. data/site/install.xml +0 -77
  129. data/site/layout.rhtml +0 -38
  130. data/site/layout.xsl +0 -67
  131. data/site/license.xml +0 -32
  132. data/site/log/changelog.xml +0 -1324
  133. data/site/log/changelog.xsl +0 -42
  134. data/test/model/merge_bug_data.xml +0 -58
  135. data/test/model/rubynet.xml +0 -78
  136. data/test/model/rubynet_project +0 -13
  137. data/test/model/saxtest.xml +0 -5
  138. data/test/model/simple.xml +0 -7
  139. data/test/model/xinclude.xml +0 -5
@@ -1,485 +1,485 @@
1
- /* $Id: ruby_xml_sax_parser.c 225 2007-12-07 04:58:09Z transami $ */
2
-
3
- /* Please see the LICENSE file for copyright and distribution information */
4
-
5
- #include "libxml.h"
6
- #include "ruby_xml_sax_parser.h"
7
-
8
- VALUE cXMLSaxParser;
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;
28
-
29
- #include "sax_parser_callbacks.inc"
30
-
31
- void
32
- ruby_xml_sax_parser_free(ruby_xml_sax_parser *rxsp) {
33
- /* Apparently this isn't needed: time will tell */
34
- /* if (rxsp->xsh != NULL) */
35
- /* xmlFreeSax_Parser(rxsp->sax_parser); */
36
- }
37
-
38
- void
39
- ruby_xml_sax_parser_mark(ruby_xml_sax_parser *rxsp) {
40
- if (rxsp->callbackHandler && (rxsp->callbackHandler != Qnil)) {
41
- rb_gc_mark(rxsp->callbackHandler);
42
- }
43
-
44
- if (rxsp->filename && (rxsp->filename != Qnil)) {
45
- rb_gc_mark(rxsp->filename);
46
- }
47
-
48
- if (rxsp->str && (rxsp->str != Qnil)) {
49
- rb_gc_mark(rxsp->str);
50
- }
51
- }
52
-
53
- /*
54
- * call-seq:
55
- * XML::SaxParser.new => sax_parser
56
- *
57
- * Create a new XML::SaxParser instance.
58
- */
59
- VALUE
60
- ruby_xml_sax_parser_new(VALUE class) {
61
- ruby_xml_sax_parser *rxsp;
62
-
63
- rxsp = ALLOC(ruby_xml_sax_parser);
64
- rxsp->xsh = &rubySAXHandlerStruct;
65
-
66
- rxsp->callbackHandler = Qnil;
67
- rxsp->xpc = NULL;
68
- rxsp->filename = Qnil;
69
- rxsp->str = Qnil;
70
-
71
- return(Data_Wrap_Struct(class, ruby_xml_sax_parser_mark,
72
- ruby_xml_sax_parser_free, rxsp));
73
- }
74
-
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
-
108
- /*
109
- * call-seq:
110
- * sax_parser.filename => "filename"
111
- *
112
- * Obtain the filename this parser reads from.
113
- */
114
- VALUE
115
- ruby_xml_sax_parser_filename_get(VALUE self) {
116
- ruby_xml_sax_parser *rxsp;
117
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
118
- return(rxsp->filename);
119
- }
120
-
121
-
122
- /*
123
- * call-seq:
124
- * sax_parser.filename = "filename"
125
- *
126
- * Set the filename this parser reads from.
127
- */
128
- VALUE
129
- ruby_xml_sax_parser_filename_set(VALUE self, VALUE filename) {
130
- ruby_xml_sax_parser *rxsp;
131
- Check_Type(filename, T_STRING);
132
- Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
133
- rxsp->filename = filename;
134
- return(rxsp->filename);
135
- }
136
-
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
-
201
-
202
- /****** SaxCallbacks ******/
203
- /* These are all the same. Bloody Rdoc... */
204
-
205
- /*
206
- * call-seq:
207
- * callbacks.on_internal_subset(name, external_id, system_id)
208
- *
209
- * Called for an internal subset event.
210
- */
211
- VALUE
212
- ruby_xml_sax_callbacks_on_internal_subset(int argc, VALUE *argv, VALUE self) {
213
- return Qnil;
214
- }
215
-
216
-
217
- /*
218
- * call-seq:
219
- * callbacks.on_is_standalone()
220
- *
221
- * Called for 'is standalone' event.
222
- */
223
- VALUE
224
- ruby_xml_sax_callbacks_on_is_standalone(int argc, VALUE *argv, VALUE self) {
225
- return Qnil;
226
- }
227
-
228
-
229
- /*
230
- * call-seq:
231
- * callbacks.on_has_internal_subset()
232
- *
233
- * Called for an internal subset notification event.
234
- */
235
- VALUE
236
- ruby_xml_sax_callbacks_on_has_internal_subset(int argc, VALUE *argv, VALUE self) {
237
- return Qnil;
238
- }
239
-
240
-
241
- /*
242
- * call-seq:
243
- * callbacks.on_has_external_subset()
244
- *
245
- * Called for an external subset notification event.
246
- */
247
- VALUE
248
- ruby_xml_sax_callbacks_on_has_external_subset(int argc, VALUE *argv, VALUE self) {
249
- return Qnil;
250
- }
251
-
252
-
253
- /*
254
- * call-seq:
255
- * callbacks.on_start_document()
256
- *
257
- * Called for a start document event.
258
- */
259
- VALUE
260
- ruby_xml_sax_callbacks_on_start_document(int argc, VALUE *argv, VALUE self) {
261
- return Qnil;
262
- }
263
-
264
-
265
- /*
266
- * call-seq:
267
- * callbacks.on_end_document()
268
- *
269
- * Called for an end document event.
270
- */
271
- VALUE
272
- ruby_xml_sax_callbacks_on_end_document(int argc, VALUE *argv, VALUE self) {
273
- return Qnil;
274
- }
275
-
276
-
277
- /*
278
- * call-seq:
279
- * callbacks.on_start_element(name, attr_hash)
280
- *
281
- * Called for an element start event.
282
- */
283
- VALUE
284
- ruby_xml_sax_callbacks_on_start_element(int argc, VALUE *argv, VALUE self) {
285
- return Qnil;
286
- }
287
-
288
-
289
- /*
290
- * call-seq:
291
- * callbacks.on_end_element(name)
292
- *
293
- * Called for an element end event.
294
- */
295
- VALUE
296
- ruby_xml_sax_callbacks_on_end_element(int argc, VALUE *argv, VALUE self) {
297
- return Qnil;
298
- }
299
-
300
-
301
- /*
302
- * call-seq:
303
- * callbacks.on_reference(name)
304
- *
305
- * Called for a reference event.
306
- */
307
- VALUE
308
- ruby_xml_sax_callbacks_on_reference(int argc, VALUE *argv, VALUE self) {
309
- return Qnil;
310
- }
311
-
312
-
313
- /*
314
- * call-seq:
315
- * callbacks.on_characters(chars)
316
- *
317
- * Called for a characters event.
318
- */
319
- VALUE
320
- ruby_xml_sax_callbacks_on_characters(int argc, VALUE *argv, VALUE self) {
321
- return Qnil;
322
- }
323
-
324
-
325
- /*
326
- * call-seq:
327
- * callbacks.on_processing_instruction(target, data)
328
- *
329
- * Called for an processing instruction event.
330
- */
331
- VALUE
332
- ruby_xml_sax_callbacks_on_processing_instruction(int argc, VALUE *argv, VALUE self) {
333
- return Qnil;
334
- }
335
-
336
-
337
- /*
338
- * call-seq:
339
- * callbacks.on_comment(msg)
340
- *
341
- * Called for a comment event.
342
- */
343
- VALUE
344
- ruby_xml_sax_callbacks_on_comment(int argc, VALUE *argv, VALUE self) {
345
- return Qnil;
346
- }
347
-
348
-
349
- /*
350
- * call-seq:
351
- * callbacks.on_parser_warning(msg)
352
- *
353
- * Called for parser warnings.
354
- */
355
- VALUE
356
- ruby_xml_sax_callbacks_on_parser_warning(int argc, VALUE *argv, VALUE self) {
357
- return Qnil;
358
- }
359
-
360
-
361
- /*
362
- * call-seq:
363
- * callbacks.on_parser_error(msg)
364
- *
365
- * Called for parser errors.
366
- */
367
- VALUE
368
- ruby_xml_sax_callbacks_on_parser_error(int argc, VALUE *argv, VALUE self) {
369
- return Qnil;
370
- }
371
-
372
-
373
- /*
374
- * call-seq:
375
- * callbacks.on_parser_fatal_error(msg)
376
- *
377
- * Called for fatal parser errors.
378
- */
379
- VALUE
380
- ruby_xml_sax_callbacks_on_parser_fatal_error(int argc, VALUE *argv, VALUE self) {
381
- return Qnil;
382
- }
383
-
384
- /*
385
- * call-seq:
386
- * callbacks.on_cdata_block(cdata)
387
- *
388
- * Called for a CDATA block event.
389
- */
390
- VALUE
391
- ruby_xml_sax_callbacks_on_cdata_block(int argc, VALUE *argv, VALUE self) {
392
- return Qnil;
393
- }
394
-
395
- /*
396
- * call-seq:
397
- * callbacks.on_external_subset(name, external_id, system_id)
398
- *
399
- * Called for an external subset event.
400
- */
401
- VALUE
402
- ruby_xml_sax_callbacks_on_external_subset(int argc, VALUE *argv, VALUE self) {
403
- return Qnil;
404
- }
405
-
406
-
407
- // Rdoc needs to know
408
- #ifdef RDOC_NEVER_DEFINED
409
- mXML = rb_define_module("XML");
410
- #endif
411
-
412
- void
413
- ruby_init_xml_sax_parser(void) {
414
- cXMLSaxParser = rb_define_class_under(mXML, "SaxParser", rb_cObject);
415
- mXMLSaxParserCallbacks = rb_define_module_under(cXMLSaxParser, "Callbacks");
416
-
417
- /* SaxParser */
418
- rb_define_singleton_method(cXMLSaxParser, "new", ruby_xml_sax_parser_new, 0);
419
-
420
- rb_define_method(cXMLSaxParser, "filename",
421
- ruby_xml_sax_parser_filename_get, 0);
422
- rb_define_method(cXMLSaxParser, "filename=",
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);
428
- rb_define_method(cXMLSaxParser, "parse", ruby_xml_sax_parser_parse, 0);
429
- rb_define_method(cXMLSaxParser, "string", ruby_xml_sax_parser_str_get, 0);
430
- rb_define_method(cXMLSaxParser, "string=", ruby_xml_sax_parser_str_set, 1);
431
-
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);
485
- }
1
+ /* $Id: ruby_xml_sax_parser.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_sax_parser.h"
7
+
8
+ VALUE cXMLSaxParser;
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;
28
+
29
+ #include "sax_parser_callbacks.inc"
30
+
31
+ void
32
+ ruby_xml_sax_parser_free(ruby_xml_sax_parser *rxsp) {
33
+ /* Apparently this isn't needed: time will tell */
34
+ /* if (rxsp->xsh != NULL) */
35
+ /* xmlFreeSax_Parser(rxsp->sax_parser); */
36
+ }
37
+
38
+ void
39
+ ruby_xml_sax_parser_mark(ruby_xml_sax_parser *rxsp) {
40
+ if (rxsp->callbackHandler && (rxsp->callbackHandler != Qnil)) {
41
+ rb_gc_mark(rxsp->callbackHandler);
42
+ }
43
+
44
+ if (rxsp->filename && (rxsp->filename != Qnil)) {
45
+ rb_gc_mark(rxsp->filename);
46
+ }
47
+
48
+ if (rxsp->str && (rxsp->str != Qnil)) {
49
+ rb_gc_mark(rxsp->str);
50
+ }
51
+ }
52
+
53
+ /*
54
+ * call-seq:
55
+ * XML::SaxParser.new => sax_parser
56
+ *
57
+ * Create a new XML::SaxParser instance.
58
+ */
59
+ VALUE
60
+ ruby_xml_sax_parser_new(VALUE class) {
61
+ ruby_xml_sax_parser *rxsp;
62
+
63
+ rxsp = ALLOC(ruby_xml_sax_parser);
64
+ rxsp->xsh = &rubySAXHandlerStruct;
65
+
66
+ rxsp->callbackHandler = Qnil;
67
+ rxsp->xpc = NULL;
68
+ rxsp->filename = Qnil;
69
+ rxsp->str = Qnil;
70
+
71
+ return(Data_Wrap_Struct(class, ruby_xml_sax_parser_mark,
72
+ ruby_xml_sax_parser_free, rxsp));
73
+ }
74
+
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
+
108
+ /*
109
+ * call-seq:
110
+ * sax_parser.filename => "filename"
111
+ *
112
+ * Obtain the filename this parser reads from.
113
+ */
114
+ VALUE
115
+ ruby_xml_sax_parser_filename_get(VALUE self) {
116
+ ruby_xml_sax_parser *rxsp;
117
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
118
+ return(rxsp->filename);
119
+ }
120
+
121
+
122
+ /*
123
+ * call-seq:
124
+ * sax_parser.filename = "filename"
125
+ *
126
+ * Set the filename this parser reads from.
127
+ */
128
+ VALUE
129
+ ruby_xml_sax_parser_filename_set(VALUE self, VALUE filename) {
130
+ ruby_xml_sax_parser *rxsp;
131
+ Check_Type(filename, T_STRING);
132
+ Data_Get_Struct(self, ruby_xml_sax_parser, rxsp);
133
+ rxsp->filename = filename;
134
+ return(rxsp->filename);
135
+ }
136
+
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
+
201
+
202
+ /****** SaxCallbacks ******/
203
+ /* These are all the same. Bloody Rdoc... */
204
+
205
+ /*
206
+ * call-seq:
207
+ * callbacks.on_internal_subset(name, external_id, system_id)
208
+ *
209
+ * Called for an internal subset event.
210
+ */
211
+ VALUE
212
+ ruby_xml_sax_callbacks_on_internal_subset(int argc, VALUE *argv, VALUE self) {
213
+ return Qnil;
214
+ }
215
+
216
+
217
+ /*
218
+ * call-seq:
219
+ * callbacks.on_is_standalone()
220
+ *
221
+ * Called for 'is standalone' event.
222
+ */
223
+ VALUE
224
+ ruby_xml_sax_callbacks_on_is_standalone(int argc, VALUE *argv, VALUE self) {
225
+ return Qnil;
226
+ }
227
+
228
+
229
+ /*
230
+ * call-seq:
231
+ * callbacks.on_has_internal_subset()
232
+ *
233
+ * Called for an internal subset notification event.
234
+ */
235
+ VALUE
236
+ ruby_xml_sax_callbacks_on_has_internal_subset(int argc, VALUE *argv, VALUE self) {
237
+ return Qnil;
238
+ }
239
+
240
+
241
+ /*
242
+ * call-seq:
243
+ * callbacks.on_has_external_subset()
244
+ *
245
+ * Called for an external subset notification event.
246
+ */
247
+ VALUE
248
+ ruby_xml_sax_callbacks_on_has_external_subset(int argc, VALUE *argv, VALUE self) {
249
+ return Qnil;
250
+ }
251
+
252
+
253
+ /*
254
+ * call-seq:
255
+ * callbacks.on_start_document()
256
+ *
257
+ * Called for a start document event.
258
+ */
259
+ VALUE
260
+ ruby_xml_sax_callbacks_on_start_document(int argc, VALUE *argv, VALUE self) {
261
+ return Qnil;
262
+ }
263
+
264
+
265
+ /*
266
+ * call-seq:
267
+ * callbacks.on_end_document()
268
+ *
269
+ * Called for an end document event.
270
+ */
271
+ VALUE
272
+ ruby_xml_sax_callbacks_on_end_document(int argc, VALUE *argv, VALUE self) {
273
+ return Qnil;
274
+ }
275
+
276
+
277
+ /*
278
+ * call-seq:
279
+ * callbacks.on_start_element(name, attr_hash)
280
+ *
281
+ * Called for an element start event.
282
+ */
283
+ VALUE
284
+ ruby_xml_sax_callbacks_on_start_element(int argc, VALUE *argv, VALUE self) {
285
+ return Qnil;
286
+ }
287
+
288
+
289
+ /*
290
+ * call-seq:
291
+ * callbacks.on_end_element(name)
292
+ *
293
+ * Called for an element end event.
294
+ */
295
+ VALUE
296
+ ruby_xml_sax_callbacks_on_end_element(int argc, VALUE *argv, VALUE self) {
297
+ return Qnil;
298
+ }
299
+
300
+
301
+ /*
302
+ * call-seq:
303
+ * callbacks.on_reference(name)
304
+ *
305
+ * Called for a reference event.
306
+ */
307
+ VALUE
308
+ ruby_xml_sax_callbacks_on_reference(int argc, VALUE *argv, VALUE self) {
309
+ return Qnil;
310
+ }
311
+
312
+
313
+ /*
314
+ * call-seq:
315
+ * callbacks.on_characters(chars)
316
+ *
317
+ * Called for a characters event.
318
+ */
319
+ VALUE
320
+ ruby_xml_sax_callbacks_on_characters(int argc, VALUE *argv, VALUE self) {
321
+ return Qnil;
322
+ }
323
+
324
+
325
+ /*
326
+ * call-seq:
327
+ * callbacks.on_processing_instruction(target, data)
328
+ *
329
+ * Called for an processing instruction event.
330
+ */
331
+ VALUE
332
+ ruby_xml_sax_callbacks_on_processing_instruction(int argc, VALUE *argv, VALUE self) {
333
+ return Qnil;
334
+ }
335
+
336
+
337
+ /*
338
+ * call-seq:
339
+ * callbacks.on_comment(msg)
340
+ *
341
+ * Called for a comment event.
342
+ */
343
+ VALUE
344
+ ruby_xml_sax_callbacks_on_comment(int argc, VALUE *argv, VALUE self) {
345
+ return Qnil;
346
+ }
347
+
348
+
349
+ /*
350
+ * call-seq:
351
+ * callbacks.on_parser_warning(msg)
352
+ *
353
+ * Called for parser warnings.
354
+ */
355
+ VALUE
356
+ ruby_xml_sax_callbacks_on_parser_warning(int argc, VALUE *argv, VALUE self) {
357
+ return Qnil;
358
+ }
359
+
360
+
361
+ /*
362
+ * call-seq:
363
+ * callbacks.on_parser_error(msg)
364
+ *
365
+ * Called for parser errors.
366
+ */
367
+ VALUE
368
+ ruby_xml_sax_callbacks_on_parser_error(int argc, VALUE *argv, VALUE self) {
369
+ return Qnil;
370
+ }
371
+
372
+
373
+ /*
374
+ * call-seq:
375
+ * callbacks.on_parser_fatal_error(msg)
376
+ *
377
+ * Called for fatal parser errors.
378
+ */
379
+ VALUE
380
+ ruby_xml_sax_callbacks_on_parser_fatal_error(int argc, VALUE *argv, VALUE self) {
381
+ return Qnil;
382
+ }
383
+
384
+ /*
385
+ * call-seq:
386
+ * callbacks.on_cdata_block(cdata)
387
+ *
388
+ * Called for a CDATA block event.
389
+ */
390
+ VALUE
391
+ ruby_xml_sax_callbacks_on_cdata_block(int argc, VALUE *argv, VALUE self) {
392
+ return Qnil;
393
+ }
394
+
395
+ /*
396
+ * call-seq:
397
+ * callbacks.on_external_subset(name, external_id, system_id)
398
+ *
399
+ * Called for an external subset event.
400
+ */
401
+ VALUE
402
+ ruby_xml_sax_callbacks_on_external_subset(int argc, VALUE *argv, VALUE self) {
403
+ return Qnil;
404
+ }
405
+
406
+
407
+ // Rdoc needs to know
408
+ #ifdef RDOC_NEVER_DEFINED
409
+ mXML = rb_define_module("XML");
410
+ #endif
411
+
412
+ void
413
+ ruby_init_xml_sax_parser(void) {
414
+ cXMLSaxParser = rb_define_class_under(mXML, "SaxParser", rb_cObject);
415
+ mXMLSaxParserCallbacks = rb_define_module_under(cXMLSaxParser, "Callbacks");
416
+
417
+ /* SaxParser */
418
+ rb_define_singleton_method(cXMLSaxParser, "new", ruby_xml_sax_parser_new, 0);
419
+
420
+ rb_define_method(cXMLSaxParser, "filename",
421
+ ruby_xml_sax_parser_filename_get, 0);
422
+ rb_define_method(cXMLSaxParser, "filename=",
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);
428
+ rb_define_method(cXMLSaxParser, "parse", ruby_xml_sax_parser_parse, 0);
429
+ rb_define_method(cXMLSaxParser, "string", ruby_xml_sax_parser_str_get, 0);
430
+ rb_define_method(cXMLSaxParser, "string=", ruby_xml_sax_parser_str_set, 1);
431
+
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);
485
+ }