Whoa... very nice...u rock!! this is just what i needed...thanx!!! :: Mikkel Bruun > -----Oprindelig meddelelse----- > Fra: ts [mailto:decoux / moulon.inra.fr] > Sendt: 22 October 2001 15:23 > Til: ruby-talk / ruby-lang.org > Cc: ruby-talk / ruby-lang.org > Emne: [ruby-talk:22958] Re: rb_iterate help needed... > > > >>>>> "M" == Mikkel Bruun <mikkel.bruun / valtech.dk> writes: > > M> So, the .handle method should go instead of method, the > symbol and the > M> string should be contained in args. > M> *block should be puts. > > This is just an example, it's stupid but it's normal :-) > > pigeon% cat tt.c > #include <ruby.h> > > extern VALUE rb_defout; > static VALUE tt_cDispatch; > > static VALUE > tt_iter(tmp) > VALUE *tmp; > { > return rb_funcall2(tmp[0], rb_intern("handle"), 2, tmp + 1); > } > > static VALUE > tt_yield(element) > VALUE element; > { > return rb_funcall2(rb_defout, rb_intern("puts"), 1, &element); > } > > static VALUE > tt_foo(obj, xml) > VALUE obj, xml; > { > VALUE tmp[3]; > > xml = rb_str_to_str(xml); > tmp[0] = rb_funcall2(tt_cDispatch, rb_intern("new"), 1, &xml); > tmp[1] = ID2SYM(rb_intern("start_element")); > tmp[2] = rb_ary_new3(1, rb_str_new2("chapter")); > rb_iterate(tt_iter, (VALUE)tmp, tt_yield, 0); > return rb_funcall2(tmp[0], rb_intern("start"), 0, 0); > } > > void Init_tt() > { > VALUE tt_cTt; > > rb_require("nqxml/dispatcher"); > tt_cDispatch = rb_const_get(rb_const_get(rb_cObject, > rb_intern("NQXML")), > rb_intern("Dispatcher")); > tt_cTt = rb_define_class("Tt", rb_cObject); > rb_define_singleton_method(tt_cTt, "foo", tt_foo, 1); > } > pigeon% > > pigeon% cat b.rb > #!/usr/bin/ruby > require 'tt' > > xml = '<?xml version="1.0"?> > <!DOCTYPE book SYSTEM "foo.bar"> > <book>My Book > <!-- My Book, which is mine, is a book. That is mine. --> > <intro> > <p>This is the intro to my book,which has<bold>bold ideas</bold> > </p> > </intro> > <chapter> > <p>This is the first chapter. It has <bold>bold text</bold></p> > <note>Should match chapter/*</note> > </chapter> > <appendix> > <chapter>a chapter in the appendix > <figure>Should match chapter/*</figure> > </chapter> > </appendix> > </book> > > <chapter> > <p>Should match chapter/*</p> > </chapter> > ' > > Tt::foo(xml) > pigeon% > > pigeon% b.rb > <chapter> > <chapter> > <chapter> > pigeon% > > > Guy Decoux >