[macruby-changes] [2170] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Mon Aug 3 10:45:42 PDT 2009
Revision: 2170
http://trac.macosforge.org/projects/ruby/changeset/2170
Author: pthomson at apple.com
Date: 2009-08-03 10:45:42 -0700 (Mon, 03 Aug 2009)
Log Message:
-----------
almost ready to output some yaml for the first time. hooray.
Modified Paths:
--------------
MacRuby/branches/experimental/ext/libyaml/rubyext.c
MacRuby/branches/experimental/lib/yaml.rb
Modified: MacRuby/branches/experimental/ext/libyaml/rubyext.c
===================================================================
--- MacRuby/branches/experimental/ext/libyaml/rubyext.c 2009-08-03 17:45:41 UTC (rev 2169)
+++ MacRuby/branches/experimental/ext/libyaml/rubyext.c 2009-08-03 17:45:42 UTC (rev 2170)
@@ -24,6 +24,7 @@
VALUE rb_cDocument;
VALUE rb_cResolver;
VALUE rb_cNode;
+VALUE rb_cSeqNode;
VALUE rb_cScalar;
VALUE rb_cOut;
@@ -119,7 +120,6 @@
rb_yaml_document_alloc(VALUE klass, SEL sel)
{
yaml_document_t *document = ALLOC(yaml_document_t);
- // XXX: still need to write a finalizer
yaml_document_initialize(document, NULL, NULL, NULL, 1, 1);
return Data_Wrap_Struct(rb_cDocument, NULL, NULL, document);
}
@@ -143,18 +143,28 @@
if (rb_block_given_p())
{
yaml_node_t *node = yaml_document_get_node(document, nodeID);
- VALUE n = rb_yaml_node_new(node);
+ VALUE n = rb_yaml_node_new(node, nodeID, self);
rb_yield(n);
}
return self;
}
static VALUE
+rb_yaml_document_add_scalar(VALUE self, SEL sel, VALUE taguri, VALUE str, VALUE style)
+{
+ yaml_document_t *document;
+ Data_Get_Struct(self, yaml_document_t, document);
+ // TODO: stop ignoring the style
+ int scalID = yaml_document_add_scalar(document, RSTRING_PTR(taguri), RSTRING_PTR(str), RSTRING_LEN(str), YAML_ANY_SCALAR_STYLE);
+ return rb_yaml_node_new(yaml_document_get_node(document, scalID), scalID, self);
+}
+
+static VALUE
rb_yaml_document_root_node(VALUE self, SEL sel)
{
yaml_document_t *document;
Data_Get_Struct(self, yaml_document_t, document);
- return rb_yaml_node_new(yaml_document_get_root_node(document));
+ return rb_yaml_node_new(yaml_document_get_root_node(document), 0, self);
}
static VALUE
@@ -188,29 +198,46 @@
}
static VALUE
-rb_yaml_node_new(yaml_node_t *node)
+rb_yaml_node_new(yaml_node_t *node, int id, VALUE document)
{
- VALUE n = Data_Wrap_Struct(rb_cNode, NULL, NULL, node);
+ VALUE klass;
switch (node->type)
{
case YAML_SCALAR_NODE:
- rb_ivar_set(n, rb_intern("type"), rb_intern("scalar"));
+ klass = rb_cNode; // fix me.
break;
case YAML_MAPPING_NODE:
- rb_ivar_set(n, rb_intern("type"), rb_intern("mapping"));
+ klass = rb_cNode; // fix me, too.
break;
case YAML_SEQUENCE_NODE:
- rb_ivar_set(n, rb_intern("type"), rb_intern("sequence"));
+ klass = rb_cSeqNode;
break;
case YAML_NO_NODE:
- rb_raise(rb_eRuntimeError, "what the hell is going on?!");
+ rb_raise(rb_eRuntimeError, "unexpected empty node");
}
+ VALUE n = Data_Wrap_Struct(rb_cNode, NULL, NULL, node);
+ rb_ivar_set(n, rb_intern("node_id"), INT2FIX(id));
+ rb_ivar_set(n, rb_intern("document"), document);
return n;
}
+static VALUE
+rb_sequence_node_add(VALUE self, SEL sel, VALUE obj)
+{
+ VALUE doc = rb_ivar_get(self, rb_intern("document"));
+ yaml_document_t *document;
+ Data_Get_Struct(doc, yaml_document_t, document);
+ VALUE scalar_node = rb_vm_call_with_cache(obj, "to_yaml", 1, &doc, true);
+ int seqID = FIX2INT(rb_ivar_get(self, rb_intern("node_id")));
+ int scalID = FIX2INT(rb_ivar_get(scalar_node, rb_intern("node_id")));
+ printf("Appending item %d to sequence %d\n", seqID, scalID);
+ yaml_document_append_sequence_item(document, seqID, scalID);
+ return self;
+}
+
#if 0 // still need to think about this some more.
static VALUE
rb_yaml_node_tag(VALUE self, SEL sel)
@@ -360,6 +387,8 @@
rb_yaml_document_finalize_super = rb_objc_install_method2((Class)rb_cDocument, "finalize", (IMP)rb_yaml_document_finalize);
rb_cNode = rb_define_class_under(rb_mLibYAML, "Node", rb_cObject);
+ rb_define_attr(rb_cNode, "document", 1, 1);
+ rb_define_attr(rb_cNode, "node_id", 1, 1);
//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);
@@ -370,6 +399,9 @@
//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_cSeqNode = rb_define_class_under(rb_mLibYAML, "Seq", rb_cNode);
+ rb_objc_define_method(rb_cNode, "add", rb_sequence_node_add, 1);
+
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);
Modified: MacRuby/branches/experimental/lib/yaml.rb
===================================================================
--- MacRuby/branches/experimental/lib/yaml.rb 2009-08-03 17:45:41 UTC (rev 2169)
+++ MacRuby/branches/experimental/lib/yaml.rb 2009-08-03 17:45:42 UTC (rev 2170)
@@ -20,7 +20,9 @@
end
def YAML.dump(obj, io=nil)
-
+ document = YAML::Document.new
+ obj.to_yaml(document)
+ Emitter.new(io).dump(document).output
end
def YAML.load(io)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090803/8be05865/attachment-0001.html>
More information about the macruby-changes
mailing list