[macruby-changes] [2162] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Mon Aug 3 10:45:33 PDT 2009


Revision: 2162
          http://trac.macosforge.org/projects/ruby/changeset/2162
Author:   pthomson at apple.com
Date:     2009-08-03 10:45:32 -0700 (Mon, 03 Aug 2009)
Log Message:
-----------
okay, YAML::load sort of works.

Modified Paths:
--------------
    MacRuby/branches/experimental/ext/libyaml/rubyext.c
    MacRuby/branches/experimental/include/ruby/intern.h
    MacRuby/branches/experimental/include/ruby/io.h

Added Paths:
-----------
    MacRuby/branches/experimental/ext/libyaml/extconf.rb

Added: MacRuby/branches/experimental/ext/libyaml/extconf.rb
===================================================================
--- MacRuby/branches/experimental/ext/libyaml/extconf.rb	                        (rev 0)
+++ MacRuby/branches/experimental/ext/libyaml/extconf.rb	2009-08-03 17:45:32 UTC (rev 2162)
@@ -0,0 +1,7 @@
+require 'mkmf'
+
+have_header("yaml.h")
+have_header("yaml_private.h")
+$INCFLAGS << ' -I../..'
+create_makefile("libyaml")
+

Modified: MacRuby/branches/experimental/ext/libyaml/rubyext.c
===================================================================
--- MacRuby/branches/experimental/ext/libyaml/rubyext.c	2009-08-03 17:45:31 UTC (rev 2161)
+++ MacRuby/branches/experimental/ext/libyaml/rubyext.c	2009-08-03 17:45:32 UTC (rev 2162)
@@ -7,31 +7,107 @@
  */ 
 
 #include "ruby/ruby.h"
+#include "ruby/intern.h"
+#include "ruby/io.h"
+#include "objc.h"
 #include "yaml.h"
 
+long rb_io_primitive_read(struct rb_io_t *io_struct, UInt8 *buffer, long len);
+VALUE rb_ary_last(VALUE, SEL, int, VALUE*);
+
+VALUE rb_mYAML;
+VALUE rb_mLibYAML;
+VALUE rb_cParser;
+VALUE rb_cEmitter;
+
 static VALUE
-yaml_load(VALUE module, SEL sel, VALUE input)
+rb_yaml_parser_alloc(VALUE klass, SEL sel)
 {
-	return Qnil;
+	yaml_parser_t *parser = ALLOC(yaml_parser_t);
+	yaml_parser_initialize(parser);
+	return Data_Wrap_Struct(klass, NULL, NULL, parser);
 }
 
 static VALUE
-yaml_dump(VALUE module, SEL sel, int argc, VALUE* argv)
+rb_yaml_object_from_event(yaml_event_t *event)
 {
-	return Qnil;
+	VALUE str = rb_str_new2((const char*)event->data.scalar.value);
+	return str;
 }
 
 static VALUE
-rb_yaml_parser_alloc(VALUE klass, SEL sel)
+rb_yaml_parse(yaml_parser_t *parser)
 {
-	yaml_parser_t *parser = ALLOC(yaml_parser_t);
-	yaml_parser_initialize(parser);
-	// XXX: Figure out how to pass the yaml_parser_delete() method to the parser upon deallocation.
-	return Data_Wrap_Struct(klass, NULL, NULL, parser);
+    yaml_event_t event;
+    int done = 0;
+	VALUE obj, temp;
+	VALUE stack = rb_ary_new();
+    while(!done) {
+        if(!yaml_parser_parse(parser, &event)) {
+			rb_raise(rb_eRuntimeError, "internal yaml parsing error");
+		}
+        done = (event.type == YAML_STREAM_END_EVENT);
+        switch(event.type) {
+            case YAML_SCALAR_EVENT:
+				obj = rb_yaml_object_from_event(&event);
+				temp = rb_ary_last(stack, 0, 0, 0);
+				if (TYPE(temp) == T_ARRAY)
+				{
+					rb_ary_push(temp, obj);
+				}
+				else if (TYPE(temp) == T_HASH)
+				{
+					rb_ary_push(stack, obj);
+				}
+				else
+				{
+					rb_objc_retain((void*)temp);
+					rb_ary_pop(stack);
+					rb_hash_aset(rb_ary_last(stack, 0, 0, 0), temp, obj);
+				}                
+                break;
+            case YAML_SEQUENCE_START_EVENT:
+                rb_ary_push(stack, rb_ary_new());
+                break;
+            case YAML_MAPPING_START_EVENT:
+				rb_ary_push(stack, rb_hash_new());
+                break;
+            case YAML_SEQUENCE_END_EVENT:
+            case YAML_MAPPING_END_EVENT:
+				// TODO: Check for retain count errors.
+				temp = rb_ary_pop(stack);
+				VALUE last = rb_ary_last(stack, 0, 0, 0);
+				if (NIL_P(last)) 
+				{
+					rb_ary_push(stack, temp);
+				}
+				else if (TYPE(last) == T_ARRAY)
+				{
+					rb_ary_push(last, temp);
+				}
+				else if (TYPE(last) == T_HASH)
+				{
+					rb_ary_push(stack, temp);
+				}
+				else
+				{
+					obj = rb_ary_last(stack, 0, 0, 0);
+					rb_objc_retain((void*)obj);
+					rb_hash_aset(rb_ary_last(stack, 0, 0, 0), obj, temp);
+				}
+                break;
+            case YAML_NO_EVENT:
+                break;
+            default:
+                break;
+        }
+        yaml_event_delete(&event);
+    }
+    return stack;
 }
 
 static int
-rb_yaml_parser_io_handler(VALUE io, unsigned char *out_buffer, size_t size, size_t *size_read)
+rb_yaml_parser_io_handler(VALUE io, unsigned char *buffer, size_t size, size_t *size_read)
 {
 	if (rb_io_eof(io, 0) == Qtrue)
 	{
@@ -51,7 +127,13 @@
 {
 	yaml_parser_t *parser;
 	Data_Get_Struct(self, yaml_parser_t, parser);
-	yaml_parser_set_input(parser, (yaml_read_handler_t*)rb_yaml_parser_io_handler, io);
+	if (TYPE(io) == T_STRING)
+	{
+		yaml_parser_set_input_string(parser, (const unsigned char*)RSTRING_PTR(io), (size_t)RSTRING_LEN(io));
+	} else {
+		yaml_parser_set_input(parser, (yaml_read_handler_t*)rb_yaml_parser_io_handler, (void*)io);
+	}
+	return rb_yaml_parse(parser);
 }
 
 static IMP rb_yaml_parser_finalize_super = NULL; 
@@ -71,26 +153,40 @@
 static VALUE
 rb_yaml_emitter_emit(VALUE self, SEL sel, int argc, VALUE *argv)
 {
+	rb_notimplement();
+}
+
+static VALUE
+yaml_load(VALUE module, SEL sel, VALUE input)
+{
+	VALUE parser = rb_yaml_parser_alloc(rb_cParser, 0);
+	VALUE ary = rb_yaml_parser_load(parser, 0, input);
+}
+
+static VALUE
+yaml_dump(VALUE module, SEL sel, int argc, VALUE* argv)
+{
 	return Qnil;
 }
 
+
 void
-Init_yaml()
+Init_libyaml()
 {
-	VALUE rb_mYAML = rb_define_module("YAML");
+	rb_mYAML = rb_define_module("YAML");
 	
 	rb_objc_define_method(*(VALUE *)rb_mYAML, "load", yaml_load, 1);
 	rb_objc_define_method(*(VALUE *)rb_mYAML, "dump", yaml_dump, -1);
 	
-	VALUE rb_mLibYAML = rb_define_module_under(rb_mYAML, "LibYAML");
+	rb_mLibYAML = rb_define_module_under(rb_mYAML, "LibYAML");
 	rb_define_const(rb_mLibYAML, "VERSION", rb_str_new2(yaml_get_version_string()));
 	
-	VALUE rb_cParser = rb_define_class_under(rb_mLibYAML, "Parser", rb_cObject);
+	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_objc_define_method(rb_cParser, "load", rb_yaml_parser_load, 1);
 	
-	rb_yaml_parser_finalize_super = rb_objc_install_method2((Class)rb_cParser, "finalize", (IMP)rb_yaml_parser_finalize);
+	rb_yaml_parser_finalize_super = rb_objc_install_method((Class)rb_cParser, sel_registerName("finalize"), (IMP)rb_yaml_parser_finalize);
 	
-	VALUE rb_cEmitter = rb_define_class_under(rb_mLibYAML, "Emitter", rb_cObject);
+	rb_cEmitter = rb_define_class_under(rb_mLibYAML, "Emitter", rb_cObject);
 	rb_objc_define_method(rb_cEmitter, "emit", rb_yaml_emitter_emit, -1);
 }
\ No newline at end of file

Modified: MacRuby/branches/experimental/include/ruby/intern.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/intern.h	2009-08-03 17:45:31 UTC (rev 2161)
+++ MacRuby/branches/experimental/include/ruby/intern.h	2009-08-03 17:45:32 UTC (rev 2162)
@@ -394,7 +394,6 @@
 VALUE rb_io_printf(VALUE, SEL, int, VALUE *);
 VALUE rb_io_print(VALUE, SEL, int, VALUE *);
 VALUE rb_io_fdopen(int, int, const char*);
-long rb_io_primitive_read(rb_io_t *, UInt8 *, long);
 VALUE rb_gets(void);
 void rb_write_error(const char*);
 void rb_write_error2(const char*, long);

Modified: MacRuby/branches/experimental/include/ruby/io.h
===================================================================
--- MacRuby/branches/experimental/include/ruby/io.h	2009-08-03 17:45:31 UTC (rev 2161)
+++ MacRuby/branches/experimental/include/ruby/io.h	2009-08-03 17:45:32 UTC (rev 2162)
@@ -77,8 +77,8 @@
 NORETURN(void rb_eof_error(void));
 
 void rb_io_assert_writable(rb_io_t *io);
+long rb_io_primitive_read(struct rb_io_t *io_struct, UInt8 *buffer, long len);
 
-
 #if defined(__cplusplus)
 #if 0
 { /* satisfy cc-mode */
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090803/8fc28215/attachment.html>


More information about the macruby-changes mailing list