This section of the archives stores flipcode's complete Developer Toolbox collection, featuring a variety of mini-articles and source code contributions from our readers.

 

  Calling C Functions From Ruby
  Submitted by



The scripting language Ruby is gaining in popularity, but many developers fear speed issues, or want/need to keep their C code intact. So I wrote a simple example of calling C code(in a .dll/.so) from Ruby. I don't pretend to be a Ruby expert, but hope this code can help other developers out there.

Here is an example in C

/*
Copyright?
We don't need no stinkin copyright!
*/

#if defined (WIN32) # include "windows.h" #define EXPORT_FUNC _declspec (dllexport) #endif

#include "ruby.h"

#ifdef _NO_NUM2DBL_ extern double num2double(val) VALUE val; { struct RFloat* flt; if (NIL_P(val)) return 0; flt = RFLOAT(f_float(0, val)); return flt-value; } #endif

static VALUE Sum(obj,arg1,arg2) VALUE obj,arg1; { double val1 = NUM2DBL(arg1); double val2 = NUM2DBL(arg2); return rb_float_new(val1+val2); }

static VALUE mRUBBER;

void InitializeRubber() { mRUBBER = rb_define_module("Rubber"); rb_define_module_function(mRUBBER, "Sum", Sum, 2); rb_define_const(mRUBBER, "TestConst", INT2NUM(38)); }

EXPORT_FUNC void Init_rubber() { InitializeRubber(); }



and here is a simple ruby script to test the binding

#Simple ruby script to test ruby-C binding

require "rubber"

print "Testing\n" print "---------------------------------------------------\n" print "C Constant test : "+Rubber::TestConst.to_s()+"\n" print "C Function test : "+Rubber.Sum(100.75,50).to_s()+"\n"

The zip file viewer built into the Developer Toolbox made use of the zlib library, as well as the zlibdll source additions.

 

Copyright 1999-2008 (C) FLIPCODE.COM and/or the original content author(s). All rights reserved.
Please read our Terms, Conditions, and Privacy information.