Forum: Ruby 1.9.2 breaks ncurses (STR2CSTR) - pls help

Posted by R. Kumar (sentinel)
on 2010-08-21 08:17
I am on Snow Leopard, installed 1.9.2 using rvm.

Here is the runtime error I get from ncurses-0.9.1:

dyld: lazy symbol binding failed: Symbol not found: _STR2CSTR
Referenced from:
/Users/rahul/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/x86_64-darwin10/ncurses.bundle
Expected in: flat namespace dyld:
Symbol not found: _STR2CSTR
Referenced from:
/Users/rahul/.rvm/rubies/ruby-1.9.2-head/lib/ruby/site_ruby/1.9.1/x86_64-darwin10/ncurses.bundle
Expected in: flat namespace
Trace/BPT trap

Someone told me that STR2CSTR has been removed. Could someone tell me
what I should replace STR2CSTR with in the ncurses code, or what to do.
I am not familiar with the Ruby-C interface, and would appreciate some
pointers.

thanks,
rahul
p.s. I am using an older version of ncurses, since i can't get 1.2.4 to
compile or run on Snow Leopard.
Posted by Christoph Kappel (unexist)
on 2010-08-21 08:35
(Received via mailing list)
---- On Sat, 21 Aug 2010 08:17:32 +0200 R.. Kumar 1.9.1 OSX  wrote ----
>Someone told me that STR2CSTR has been removed. Could someone tell me 
>what I should replace STR2CSTR with in the ncurses code, or what to do. 
>I am not familiar with the Ruby-C interface, and would appreciate some 
>pointers. 

Actually STR2CSTR was marked as obsolete in 1.8 and removed in 1.9.1.

ruby.h:

/* obsolete API - use StringValue() */
char *rb_str2cstr _((VALUE,long*));
/* obsolete API - use StringValuePtr() */
#define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)

Basically just replace STR2CSTR by StringValuePtr or define this macro.

Wbr

Christoph
Posted by R. Kumar (sentinel)
on 2010-08-21 11:46
Christoph Kappel wrote:
> ---- On Sat, 21 Aug 2010 08:17:32 +0200 R.. Kumar 1.9.1 OSX  wrote ----
>>Someone told me that STR2CSTR has been removed. Could someone tell me 
>>what I should replace STR2CSTR with in the ncurses code, or what to do. 
>>I am not familiar with the Ruby-C interface, and would appreciate some 
>>pointers. 
> 
> Actually STR2CSTR was marked as obsolete in 1.8 and removed in 1.9.1.
> 
> ruby.h:
> 
> /* obsolete API - use StringValue() */
> char *rb_str2cstr _((VALUE,long*));
> /* obsolete API - use StringValuePtr() */
> #define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
> 
> Basically just replace STR2CSTR by StringValuePtr or define this macro.
> 
> Wbr
> 
> Christoph

I've tried various combinations. I either get runtime errors relating to 
rb_str2ctr or just make errors.

1. $ perl -p -i.b -e 's/STR2CSTR/StringValuePtr/g' *.c
   $ make

form_wrap.c: In function ‘rbncurs_c_set_field_type’:
form_wrap.c:626: error: lvalue required as unary ‘&’ operand
form_wrap.c: In function ‘rbncurs_c_set_field_fore’:
form_wrap.c:698: warning: implicit conversion shortens 64-bit value into 
a 32-bit value
form_wrap.c: In function ‘rbncurs_c_set_field_back’:
form_wrap.c:712: warning: implicit conversion shortens 64-bit value into 
a 32-bit value
form_wrap.c: In function ‘make_arg’:
form_wrap.c:1134: warning: format not a string literal and no format 
arguments
make: *** [form_wrap.o] Error 1

Posted by R. Kumar (sentinel)
on 2010-08-21 12:10
Christoph Kappel wrote:
> ---- On Sat, 21 Aug 2010 08:17:32 +0200 R.. Kumar 1.9.1 OSX  wrote ----
>>Someone told me that STR2CSTR has been removed. Could someone tell me 
>>what I should replace STR2CSTR with in the ncurses code, or what to do. 
>>I am not familiar with the Ruby-C interface, and would appreciate some 
>>pointers. 
> 
> Actually STR2CSTR was marked as obsolete in 1.8 and removed in 1.9.1.
> 
> ruby.h:
> 
> /* obsolete API - use StringValue() */
> char *rb_str2cstr _((VALUE,long*));
> /* obsolete API - use StringValuePtr() */
> #define STR2CSTR(x) rb_str2cstr((VALUE)(x),0)
> 
> Basically just replace STR2CSTR by StringValuePtr or define this macro.
> 
> Wbr
> 
> Christoph

On a fresh copy I placed the above lines, in the ncurse_wrap.h file. 
"make" worked, I created a gem and installed the gem. (I placed the 
lines above #include <ruby.h> else i get compilation errors.)

Upon execution of any sample I get: dyld: lazy symbol binding failed: 
Symbol not found: _rb_str2cstr

Perhaps, I am placing these lines in the wrong place. I tried placing in 
the .c file but i get the same run time error.
Posted by Michael Fellinger (Guest)
on 2010-08-21 13:39
(Received via mailing list)
On Sat, Aug 21, 2010 at 7:10 PM, R.. Kumar 1.9.1 OSX
<sentinel1879@gmail.com> wrote:
> Christoph Kappel wrote:
>> ---- On Sat, 21 Aug 2010 08:17:32 +0200 R.. Kumar 1.9.1 OSX  wrote ----
>>>Someone told me that STR2CSTR has been removed. Could someone tell me
>>>what I should replace STR2CSTR with in the ncurses code, or what to do.
>>>I am not familiar with the Ruby-C interface, and would appreciate some
>>>pointers.

http://github.com/seanohalpin/ffi-ncurses
Posted by R. Kumar (sentinel)
on 2010-08-21 16:37
Michael Fellinger wrote:
> On Sat, Aug 21, 2010 at 7:10 PM, R.. Kumar 1.9.1 OSX
> <sentinel1879@gmail.com> wrote:
>> Christoph Kappel wrote:
>>> ---- On Sat, 21 Aug 2010 08:17:32 +0200 R.. Kumar 1.9.1 OSX  wrote ----
>>>>Someone told me that STR2CSTR has been removed. Could someone tell me
>>>>what I should replace STR2CSTR with in the ncurses code, or what to do.
>>>>I am not familiar with the Ruby-C interface, and would appreciate some
>>>>pointers.
> 
> http://github.com/seanohalpin/ffi-ncurses

Is anything other than ncurses port required to be installed ?

I get:
$ ruby example.rb

.rvm/gems/ruby-1.9.2-head/gems/ffi-0.6.3/lib/ffi/library.rb:61:in `block 
in ffi_lib': Could not open library 'libncurses.so.5': 
dlopen(libncurses.so.5, 5): image not found. Could not open library 
'libncurses.so.5.dylib': dlopen(libncurses.so.5.dylib, 5): image not 
found (LoadError)

$ mdfind -name 'libncurses.'
/Developer/SDKs/MacOSX10.6.sdk/usr/lib/libncurses.5.4.dylib
/usr/lib/libncurses.5.4.dylib
/usr/lib/libncurses.5.dylib
/opt/local/lib/libncurses.5.dylib
/opt/local/lib/libncurses.a

$ port installed | grep ncurse
  ncurses @5.7_0+darwin_10 (active)
  ncursesw @5.7_0+darwin_10 (active)
Posted by Michael Fellinger (Guest)
on 2010-08-21 19:37
(Received via mailing list)
On Sat, Aug 21, 2010 at 11:37 PM, R.. Kumar 1.9.1 OSX
<sentinel1879@gmail.com> wrote:
>> http://github.com/seanohalpin/ffi-ncurses
>
> Is anything other than ncurses port required to be installed ?

Seems like it's a bit outdated, I fixed that for you:
http://github.com/manveru/ffi-ncurses

Not sure if that works on OSX, but I'm hopeful :)
Posted by Ralf Papenkordt (ralfpapenkordt)
on 2010-08-21 23:44
R.. Kumar 1.9.1 OSX wrote:
> I've tried various combinations. I either get runtime errors relating to 
> rb_str2ctr or just make errors.
> 
> 1. $ perl -p -i.b -e 's/STR2CSTR/StringValuePtr/g' *.c
>    $ make
> 
> form_wrap.c: In function ‘rbncurs_c_set_field_type’:
> form_wrap.c:626: error: lvalue required as unary ‘&’ operand
> form_wrap.c: In function ‘rbncurs_c_set_field_fore’:
> form_wrap.c:698: warning: implicit conversion shortens 64-bit value into 
> a 32-bit value
> form_wrap.c: In function ‘rbncurs_c_set_field_back’:
> form_wrap.c:712: warning: implicit conversion shortens 64-bit value into 
> a 32-bit value
> form_wrap.c: In function ‘make_arg’:
> form_wrap.c:1134: warning: format not a string literal and no format 
> arguments
> make: *** [form_wrap.o] Error 1

Unfortunately replacing STR2CSTR with StringValuePtr is not enough as 
outlined in 
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/.... You 
have to make two additional changes:

$ diff form_wrap.c form_wrap.c.b
626,627c626
<       VALUE tmp = rb_ary_entry(arg3, (long)i);
<       list[i] = StringValuePtr(tmp);
---
>       list[i] = STR2CSTR(rb_ary_entry(arg3, (long)i));
...

and

$ diff ncurses_wrap.c ncurses_wrap.c.b
...
2244,2245d2243
<     VALUE tmp = rb_funcall3(rb_mKernel, rb_intern("sprintf"), argc-1,
<                               argv + 1);
2247c2245,2246
<             (VALUE)StringValuePtr(tmp));
---
>             STR2CSTR(rb_funcall3(rb_mKernel, rb_intern("sprintf"), argc-1,
>                               argv + 1)));
...

Then run

make
make install

within the installed ncurses gem. After these changes I was able to run 
the 2 testcases test1.rb and test2.rb of rbcurse-1.1.3.

ruby test1.rb
Posted by R. Kumar (sentinel)
on 2010-08-22 09:04
Ralf Papenkordt wrote:

> 
> $ diff ncurses_wrap.c ncurses_wrap.c.b
> ...
> 2244,2245d2243
> <     VALUE tmp = rb_funcall3(rb_mKernel, rb_intern("sprintf"), argc-1,
> <                               argv + 1);
> 2247c2245,2246
> <             (VALUE)StringValuePtr(tmp));
> ---
>>             STR2CSTR(rb_funcall3(rb_mKernel, rb_intern("sprintf"), argc-1,
>>                               argv + 1)));
> ...
> 

Thanks a lot, Ralf. Working fine :)

I wish i could take over maintenance of this gem, but I know very basic 
C only.
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.