From ea8b09b7939d7d7dfc608b221eea4e3df1f7897d Mon Sep 17 00:00:00 2001 From: "Erik S. Chang" Date: Wed, 9 Dec 2009 01:32:06 +0000 Subject: [PATCH] make C++ users happy git-svn-id: https://lwes.svn.sourceforge.net/svnroot/lwes/lwes-ruby/trunk@356 a2f82657-cdd2-4550-bd36-68a8e7111808 --- ext/lwes/emitter.c | 28 ++++++++++++++++++++++------ test/unit/test_emit_struct.rb | 27 +++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/ext/lwes/emitter.c b/ext/lwes/emitter.c index e9478e8..d8691e6 100644 --- a/ext/lwes/emitter.c +++ b/ext/lwes/emitter.c @@ -198,12 +198,19 @@ static struct lwes_event_type_db * get_type_db(VALUE event) return lwesrb_get_type_db(type_db); } -static VALUE emit_struct(VALUE self, VALUE name, VALUE _event) +static VALUE emit_struct(VALUE self, VALUE _event) { VALUE argv[3]; struct lwes_event_type_db *db = get_type_db(_event); - struct lwes_event *event = lwes_event_create(db, RSTRING_PTR(name)); + struct lwes_event *event; + VALUE name = rb_const_get(CLASS_OF(_event), SYM2ID(sym_NAME)); + if (TYPE(name) != T_STRING) + rb_raise(rb_eArgError, + "could not get event NAME from Struct: %s", + RSTRING_PTR(rb_inspect(_event))); + + event = lwes_event_create(db, RSTRING_PTR(name)); if (!event) rb_raise(rb_eRuntimeError, "failed to create lwes_event"); @@ -215,6 +222,16 @@ static VALUE emit_struct(VALUE self, VALUE name, VALUE _event) return _event; } +static VALUE emitter_ltlt(VALUE self, VALUE event) +{ + if (TYPE(event) != T_STRUCT) + rb_raise(rb_eArgError, + "Must be a Struct: %s", + RSTRING_PTR(rb_inspect(event))); + + return emit_struct(self, event); +} + /* * call-seq: * emitter = LWES::Emitter.new @@ -246,8 +263,7 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self) "second argument not allowed when first" " is a Struct"); event = name; - name = rb_const_get(CLASS_OF(event), SYM2ID(sym_NAME)); - return emit_struct(self, name, event); + return emit_struct(self, event); case T_CLASS: if (TYPE(event) != T_HASH) rb_raise(rb_eArgError, @@ -259,8 +275,7 @@ static VALUE emitter_emit(int argc, VALUE *argv, VALUE self) * struct created */ event = rb_funcall(name, id_new, 1, event); - name = rb_const_get(name, SYM2ID(sym_NAME)); - return emit_struct(self, name, event); + return emit_struct(self, event); default: rb_raise(rb_eArgError, "bad argument: %s, must be a String, Struct or Class", @@ -355,6 +370,7 @@ void lwesrb_init_emitter(void) VALUE mLWES = rb_define_module("LWES"); cLWES_Emitter = rb_define_class_under(mLWES, "Emitter", rb_cObject); + rb_define_method(cLWES_Emitter, "<<", emitter_ltlt, 1); rb_define_method(cLWES_Emitter, "emit", emitter_emit, -1); rb_define_method(cLWES_Emitter, "_create", _create, 1); rb_define_method(cLWES_Emitter, "close", emitter_close, 0); diff --git a/test/unit/test_emit_struct.rb b/test/unit/test_emit_struct.rb index 159b7cd..f58b88b 100644 --- a/test/unit/test_emit_struct.rb +++ b/test/unit/test_emit_struct.rb @@ -35,6 +35,33 @@ class TestEmitStruct < Test::Unit::TestCase end end + def test_emit_struct_cplusplus + s = nil + out = lwes_listener do + assert_nothing_raised do + emitter = LWES::Emitter.new(@options) + s = Event1.new + s.t_bool = true + s.t_int16 = -1000 + s.t_uint16 = 1000 + s.t_int32 = -64444 + s.t_uint32 = 64444 + s.t_int64 = 10_000_000_000 + s.t_uint64 = 10_000_000_000 + s.t_ip_addr = '192.168.0.1' + s.t_string = "STRING" + emitter << s + end + end + out = out.readlines + s.members.each do |m| + value = s[m.to_sym] or next + regex = /\b#{m} = #{value};/ + assert_equal 1, out.grep(regex).size, + "#{regex.inspect} didn't match #{out.inspect}" + end + end + def test_emit_from_class opt = { :t_bool => true, -- 2.11.4.GIT