[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