[macruby-changes] [2167] MacRuby/branches/experimental/ext/libyaml/rubyext.c
source_changes at macosforge.org
source_changes at macosforge.org
Mon Aug 3 10:45:39 PDT 2009
Revision: 2167
http://trac.macosforge.org/projects/ruby/changeset/2167
Author: pthomson at apple.com
Date: 2009-08-03 10:45:39 -0700 (Mon, 03 Aug 2009)
Log Message:
-----------
I like where this is going.
Modified Paths:
--------------
MacRuby/branches/experimental/ext/libyaml/rubyext.c
Modified: MacRuby/branches/experimental/ext/libyaml/rubyext.c
===================================================================
--- MacRuby/branches/experimental/ext/libyaml/rubyext.c 2009-08-03 17:45:38 UTC (rev 2166)
+++ MacRuby/branches/experimental/ext/libyaml/rubyext.c 2009-08-03 17:45:39 UTC (rev 2167)
@@ -19,16 +19,13 @@
VALUE rb_mLibYAML;
VALUE rb_cParser;
VALUE rb_cEmitter;
+VALUE rb_cDocument;
VALUE rb_cResolver;
VALUE rb_cNode;
VALUE rb_cScalar;
-VALUE rb_cSeq;
-VALUE rb_cMap;
-VALUE rb_DefaultResolver;
+VALUE rb_oDefaultResolver;
-static ID id_resolver;
-
static VALUE
rb_yaml_parser_alloc(VALUE klass, SEL sel)
{
@@ -37,159 +34,143 @@
return Data_Wrap_Struct(klass, NULL, NULL, yparser);
}
-static VALUE
-rb_yaml_parser_initialize(VALUE self, SEL sel, int argc, VALUE *argv)
+static int
+rb_yaml_io_read_handler(void *io_ptr, unsigned char *buffer, size_t size, size_t* size_read)
{
- VALUE resolver = Qnil;
- rb_scan_args(argc, argv, "01", &resolver);
- if (NIL_P(resolver))
+ VALUE io = (VALUE)io_ptr;
+ long result = rb_io_primitive_read(ExtractIOStruct(io), (UInt8*)buffer, size);
+ if (result == -1)
{
- resolver = rb_oDefaultResolver;
+ return 0;
}
- rb_ivar_set(self, id_resolver, resolver);
- return self;
-}
-
-static IMP rb_yaml_parser_finalize_super = NULL;
-
-static void
-rb_yaml_parser_finalize(void *rcv, SEL sel)
-{
- yaml_parser_t *parser;
- Data_Get_Struct(rcv, yaml_parser_t, parser);
- yaml_parser_delete(parser);
- if (rb_yaml_parser_finalize_super != NULL)
- {
- ((void(*)(void *, SEL))rb_yaml_parser_finalize_super)(rcv, sel);
- }
-}
-
-static int
-rb_yaml_parser_io_handler(VALUE io, unsigned char *buffer, size_t size, size_t *size_read)
-{
if (rb_io_eof(io, 0) == Qtrue)
{
*size_read = 0;
return 1;
}
- long ret = rb_io_primitive_read(ExtractIOStruct(io), (UInt8*)buffer, size);
- if (ret == -1) {
- return 0;
- }
- *size_read = (size_t)ret;
+ *size_read = result;
return 1;
}
static VALUE
-rb_yaml_parser_load(VALUE self, SEL sel, int argc, VALUE *argv)
+rb_yaml_parser_set_input(VALUE self, SEL sel, VALUE input)
{
- rb_notimplement();
+ yaml_parser_t *parser;
+ rb_ivar_set(self, rb_intern("input"), input);
+ Data_Get_Struct(self, yaml_parser_t, parser);
+ if (!NIL_P(input))
+ {
+ if (TYPE(input) == T_STRING)
+ {
+ yaml_parser_set_input_string(parser, (const unsigned char *)(RSTRING_PTR(input)), RSTRING_LEN(input));
+ }
+ else if (TYPE(input) == T_BYTESTRING)
+ {
+ // I think this will work. At least, I hope so.
+ yaml_parser_set_input_string(parser, (const unsigned char*)rb_bytestring_byte_pointer(input), rb_bytestring_length(input));
+ }
+ else if (TYPE(input) == T_IO)
+ {
+ yaml_parser_set_input(parser, rb_yaml_io_read_handler, (void*)input);
+ }
+ }
+ return input;
}
static VALUE
-rb_yaml_parser_load_documents(VALUE self, SEL sel, int argc, VALUE *argv)
+rb_yaml_parser_initialize(VALUE self, SEL sel, int argc, VALUE *argv)
{
- rb_notimplement();
+ VALUE input = Qnil;
+ rb_scan_args(argc, argv, "01", &input);
+ rb_yaml_parser_set_input(self, rb_intern("input"), input);
+ return self;
}
static VALUE
-rb_yaml_emitter_alloc(VALUE klass, SEL sel)
+rb_yaml_parser_load(VALUE self, SEL sel)
{
- yaml_emitter_t *yemitter = ALLOC(yaml_emitter_t);
- yaml_emitter_initialize(yemitter);
- return Data_Wrap_Struct(klass, NULL, NULL, yemitter);
+ yaml_parser_t *parser;
+ Data_Get_Struct(rcv, yaml_parser_t, parser);
+ yaml_document_t *document = ALLOC(yaml_document_t);
+ yaml_parser_load(parser, document);
+ return Data_Wrap_Struct(rb_cDocument, NULL, NULL, document);
}
-static VALUE
-rb_yaml_emitter_initialize(VALUE self, SEL sel)
-{
- return self;
-}
+static IMP rb_yaml_parser_finalize_super = NULL;
-static VALUE
-rb_yaml_emitter_emit(VALUE self, SEL sel, int argc, VALUE *argv)
+static void
+rb_yaml_parser_finalize(void *rcv, SEL sel)
{
- VALUE object, output;
- rb_scan_args(argc, argv, "11", &object, &output);
- if (NIL_P(output))
+ yaml_parser_t *parser;
+ Data_Get_Struct(rcv, yaml_parser_t, parser);
+ yaml_parser_delete(parser);
+ if (rb_yaml_parser_finalize_super != NULL)
{
- output = rb_bytestring_new();
+ ((void(*)(void *, SEL))rb_yaml_parser_finalize_super)(rcv, sel);
}
- rb_register_emitter_output(self, output);
- rb_emitter_emit(self, object);
- return output;
}
-static VALUE
-rb_register_emitter_output(VALUE self, VALUE output)
-{
- yaml_emitter_t *emitter;
- Data_Get_Struct(self, yaml_emitter_t, emitter);
- if (TYPE(output) = T_BYTESTRING)
- {
-
- }
-}
-static IMP rb_yaml_emitter_finalize_super = NULL;
-
-static void
-rb_yaml_emitter_finalize(void *rcv, SEL sel)
-{
- rb_notimplement();
-}
-
-static VALUE
-rb_libyaml_compile(VALUE self, SEL sel, VALUE obj)
-{
- rb_notimplement();
-}
-
-
void
Init_libyaml()
{
rb_mYAML = rb_define_module("YAML");
rb_mLibYAML = rb_define_module_under(rb_mYAML, "LibYAML");
- rb_objc_define_method(*(VALUE *)rb_mLibYAML, "load", rb_libyaml_compile, 1);
rb_define_const(rb_mLibYAML, "VERSION", rb_str_new2(yaml_get_version_string()));
rb_cParser = rb_define_class_under(rb_mLibYAML, "Parser", rb_cObject);
- rb_objc_define_method(*(VALUE *)rb_cParser, "alloc", rb_yaml_parser_alloc, 0);
- rb_define_attr(rb_cParser, "resolver", 1, 1);
rb_define_attr(rb_cParser, "input", 1, 1);
+ rb_objc_define_method(rb_cParser, "input=", rb_yaml_parser_set_input, 1);
rb_objc_define_method(rb_cParser, "initialize", rb_yaml_parser_initialize, -1);
- rb_objc_define_method(rb_cParser, "load", rb_yaml_parser_load, -1);
- rb_objc_define_method(rb_cParser, "load_documents", rb_yaml_parser_load_documents, -1);
+ // unimplemented
+ //rb_objc_define_method(rb_cParser, "encoding", rb_yaml_parser_encoding, 0);
+ //rb_objc_define_method(rb_cParser, "encoding=", rb_yaml_parser_set_encoding, 1);
+ //rb_objc_define_method(rb_cParser, "error", rb_yaml_parser_error, 0);
+ rb_objc_define_method(rb_cParser, "load", rb_yaml_parser_load, 0);
rb_yaml_parser_finalize_super = rb_objc_install_method2((Class)rb_cParser, "finalize", (IMP)rb_yaml_parser_finalize);
- rb_cEmitter = rb_define_class_under(rb_mLibYAML, "Emitter", rb_cObject);
- rb_objc_define_method(*(VALUE *)rb_cEmitter, "alloc", rb_yaml_emitter_alloc, 0);
- rb_objc_define_method(rb_cEmitter, "initialize", rb_yaml_emitter_initialize, -1);
- rb_objc_define_method(rb_cEmitter, "emit", rb_yaml_emitter_emit, -1);
- rb_yaml_emitter_finalize_super = rb_objc_install_method2((Class)rb_cEmitter, "finalize", (IMP)rb_yaml_emitter_finalize);
-
- rb_cResolver = rb_define_class_under(rb_mLibYAML, "Resolver", rb_cObject);
- rb_define_attr(rb_cResolver, "tags", 1, 1);
- rb_objc_define_method(rb_cResolver, "initialize", rb_yaml_resolver_initialize, 0);
-
rb_cDocument = rb_define_class_under(rb_mLibYAML, "Document", rb_cObject);
rb_objc_define_method(rb_cDocument, "<<", rb_yaml_document_add_node, 1);
rb_objc_define_method(rb_cDocument, "root", rb_yaml_document_root_node, 0);
rb_objc_define_method(rb_cDocument, "[]", rb_yaml_document_aref, 1);
+ rb_objc_define_method(rb_cDocument, "version", rb_yaml_document_version, 0);
+ rb_objc_define_method(rb_cDocument, "implicit_start?", rb_yaml_document_implicit_start_p, 0);
+ rb_objc_define_method(rb_cDocument, "implicit_end?", rb_yaml_document_implicit_end_p, 0);
+ rb_objc_define_method(rb_cDocument, "implicit_start=", rb_yaml_document_implicit_start_set, 1);
+ rb_objc_define_method(rb_cDocument, "implicit_end=", rb_yaml_document_implicit_end_set, 1);
rb_cNode = rb_define_class_under(rb_mLibYAML, "Node", rb_cObject);
- rb_objc_define_method(rb_cNode, "initialize_copy", rb_yaml_node_init_copy, 1);
- rb_define_attr(rb_cNode, "emitter", 1, 1);
- rb_define_attr(rb_cNode, "kind", 1, 0);
- rb_define_attr(rb_cNode, "type_id", 1, 0);
- rb_define_attr(rb_cNode, "resolver", 1, 1);
- rb_define_attr(rb_cNode, "value", 1, 0);
+ rb_objc_define_method(rb_cNode, "type", rb_yaml_node_type, 0);
+ rb_objc_define_method(rb_cNode, "scalar?", rb_yaml_node_scalar_p, 0);
+ rb_objc_define_method(rb_cNode, "mapping?", rb_yaml_node_mapping_p, 0);
+ rb_objc_define_method(rb_cNode, "sequence?", rb_yaml_node_sequence_p, 0);
+ rb_objc_define_method(rb_cNode, "style", rb_yaml_node_style, 0);
+ rb_objc_define_method(rb_cNode, "tag", rb_yaml_node_tag, 0);
+ rb_objc_define_method(rb_cNode, "value", rb_yaml_node_value, 0);
+ rb_objc_define_method(rb_cNode, "start_mark", rb_yaml_node_start_mark, 0);
+ rb_objc_define_method(rb_cNode, "end_mark", rb_yaml_node_end_mark, 0);
- rb_cScalar = rb_define_class_under(rb_mLibYAML, "Scalar", rb_cNode);
+ rb_cResolver = rb_define_class_under(rb_mLibYAML, "Resolver", rb_cObject);
+ rb_define_attr(rb_cResolver, "tags", 1, 1);
+ rb_objc_define_method(rb_cResolver, "transfer", rb_yaml_resolver_transfer, 1);
+ rb_objc_define_method(rb_cResolver, "add_domain_type", rb_yaml_resolver_add_domain_type, 2);
+ rb_objc_define_method(rb_cResolver, "add_ruby_type", rb_yaml_resolver_add_ruby_type, 1);
+ rb_objc_define_method(rb_cResolver, "add_builtin_type", rb_yaml_resolver_add_builtin_type, 1);
+ rb_objc_define_method(rb_cResolver, "add_private_type", rb_yaml_resolver_add_private_type, 1);
+ rb_oDefaultResolver = rb_vm_call(rb_cResolver, selNew, 0, NULL, true);
+ rb_define_const(rb_mLibYAML, "DEFAULT_RESOLVER", rb_oDefaultResolver);
- rb_cSeq = rb_define_class_under(rb_mLibYAML, "Seq", rb_cNode);
-
- rb_cMap = rb_define_class_under(rb_mLibYAML, "Map", rb_cNode);
+ rb_cEmitter = rb_define_class_under(rb_mLibYAML, "Emitter", rb_cObject);
+ rb_objc_define_method(*(VALUE *)rb_cEmitter, "alloc", rb_yaml_emitter_alloc, 0);
+ rb_define_attr(rb_cEmitter, "output", 1, 1);
+ rb_objc_define_method(rb_cEmitter, "output=", rb_yaml_emitter_set_output, 1);
+ rb_objc_define_method(rb_cEmitter, "initialize", rb_yaml_emitter_initialize, -1);
+ rb_objc_define_method(rb_cEmitter, "dump", rb_yaml_emitter_dump, 1);
+ rb_objc_define_method(rb_cEmitter, "error", rb_yaml_emitter_error, 0);
+ rb_objc_define_method(rb_cEmitter, "encoding", rb_yaml_emitter_encoding, 0);
+ rb_objc_define_method(rb_cEmitter, "encoding=", rb_yaml_emitter_set_encoding, 1);
+ rb_objc_define_method(rb_cEmitter, "indentation", rb_yaml_emitter_indent, 0);
+ // TODO: fill in the rest of the accessors
+ rb_yaml_emitter_finalize_super = rb_objc_install_method2((Class)rb_cEmitter, "finalize", (IMP)rb_yaml_emitter_finalize);
}
\ No newline at end of file
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090803/691cdd2d/attachment-0001.html>
More information about the macruby-changes
mailing list