[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