problems with rb_str_split()

I

Ian Macdonald

You're way ahead of me... I'm not sure I even understand the problem.
:-(

I have a piece of code that look like this:

const char *comma_sp = ", ";

cap_list = rb_str_split(rb_str_new2(txt), comma_sp);

This worked fine in Ruby 1.6.x, but in 1.8.x, it generates a warning in
any code that invokes the method:

/usr/bin/mycal:101: warning: string pattern instead of regexp; metacharacters no longer effective

Now, I understand why this happens and I'm quite capable of fixing the
same error when it occurs in pure Ruby code, but I can't seem to figure
out how to fix it in Ruby C.

The prototype from intern.h looks like this:

VALUE rb_str_split _((VALUE, const char*));

So, what's the problem? How do I pass rb_str_split a regex as its second
argument, instead of a string?

I thought the answer might be this:

cap_list = rb_str_split(rb_str_new2(txt),
rb_reg_new(comma_sp,
strlen(comma_sp), 0));

but that makes a VALUE out of the second argument, which is not what the
prototype expects, so a warning is issued during compilation.

Any ideas?

Ian
--
Ian Macdonald | Ashes to ashes, dust to dust, If God won't
System Administrator | have you, the devil must.
(e-mail address removed) |
http://www.caliban.org |
|
 
T

ts

I> This worked fine in Ruby 1.6.x, but in 1.8.x, it generates a warning in
I> any code that invokes the method:

Well, I don't have this problem with 1.8.1

nasun% cat aa.c
#include <ruby.h>

void Init_aa()
{
VALUE res;
const char *comma_sp = ", ";
int i;

res = rb_str_split(rb_str_new2("abc, def"), ", ");
for (i = 0; i < RARRAY(res)->len; i++) {
rb_warn("found %s", StringValuePtr(RARRAY(res)->ptr));
}
}
nasun%

nasun% ruby -raa -ve 1
ruby 1.8.1 (2003-10-31) [sparc-solaris2.8]
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context
nasun%


Guy Decoux
 
I

Ian Macdonald

I> This worked fine in Ruby 1.6.x, but in 1.8.x, it generates a warning in
I> any code that invokes the method:

Well, I don't have this problem with 1.8.1

nasun% cat aa.c
#include <ruby.h>

void Init_aa()
{
VALUE res;
const char *comma_sp = ", ";
int i;

res = rb_str_split(rb_str_new2("abc, def"), ", ");
for (i = 0; i < RARRAY(res)->len; i++) {
rb_warn("found %s", StringValuePtr(RARRAY(res)->ptr));
}
}
nasun%

nasun% ruby -raa -ve 1
ruby 1.8.1 (2003-10-31) [sparc-solaris2.8]
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context
nasun%


Try running it with warnings enabled (-w):

[ianmacd@jiskefet]$ ruby -raa -wve 1
ruby 1.8.0 (2003-08-04) [i686-linux-gnu]
./aa.so: warning: string pattern instead of regexp; metacharacters no longer effective
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context

So, how do I get rid of the "string pattern instead of regexp" warning?

Ian
--
Ian Macdonald | A is for Apple. -- Hester Pryne
System Administrator |
(e-mail address removed) |
http://www.caliban.org |
|
 
T

ts

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I> Try running it with warnings enabled (-w):

With -v warning are enabled

I> [ianmacd@jiskefet]$ ruby -raa -wve 1
I> ruby 1.8.0 (2003-08-04) [i686-linux-gnu]

nasun% ruby -raa -wve 1
ruby 1.8.1 (2003-10-31) [sparc-solaris2.8]
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context
nasun%


Guy Decoux
 
I

Ian Macdonald

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
I> Try running it with warnings enabled (-w):

With -v warning are enabled

I> [ianmacd@jiskefet]$ ruby -raa -wve 1
I> ruby 1.8.0 (2003-08-04) [i686-linux-gnu]

nasun% ruby -raa -wve 1
ruby 1.8.1 (2003-10-31) [sparc-solaris2.8]
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context
nasun%

So, it was just a bug in 1.8.0? Unfortunately, that's still the latest
official version, so I'm stuck with the issue at work for the time
being.

Thanks for your reply.

Ian
--
Ian Macdonald | Fifth Law of Procrastination:
System Administrator | Procrastination avoids boredom; one never
(e-mail address removed) | has the feeling that there is nothing
http://www.caliban.org | important to do.
|
 
T

ts

I> So, it was just a bug in 1.8.0? Unfortunately, that's still the latest
I> official version, so I'm stuck with the issue at work for the time
I> being.

svg% diff -u aa.c~ aa.c
--- aa.c~ 2003-11-13 11:34:19.000000000 +0100
+++ aa.c 2003-11-13 11:37:33.000000000 +0100
@@ -2,11 +2,14 @@

void Init_aa()
{
- VALUE res;
+ VALUE res, rv;
const char *comma_sp = ", ";
int i;

+ rv = ruby_verbose;
+ ruby_verbose = Qnil;
res = rb_str_split(rb_str_new2("abc, def"), ", ");
+ ruby_verbose = rv;
for (i = 0; i < RARRAY(res)->len; i++) {
rb_warn("found %s", StringValuePtr(RARRAY(res)->ptr));
}
svg%

svg% ruby -raa -vwe 1
ruby 1.8.0 (2003-08-04) [i686-linux]
./aa.so: warning: found abc
./aa.so: warning: found def
-e:1: warning: useless use of a literal in void context
svg%



Guy Decoux
 
I

Ian Macdonald

I> So, it was just a bug in 1.8.0? Unfortunately, that's still the latest
I> official version, so I'm stuck with the issue at work for the time
I> being.

svg% diff -u aa.c~ aa.c
--- aa.c~ 2003-11-13 11:34:19.000000000 +0100
+++ aa.c 2003-11-13 11:37:33.000000000 +0100
@@ -2,11 +2,14 @@

void Init_aa()
{
- VALUE res;
+ VALUE res, rv;
const char *comma_sp = ", ";
int i;

+ rv = ruby_verbose;
+ ruby_verbose = Qnil;
res = rb_str_split(rb_str_new2("abc, def"), ", ");
+ ruby_verbose = rv;
for (i = 0; i < RARRAY(res)->len; i++) {
rb_warn("found %s", StringValuePtr(RARRAY(res)->ptr));
}


That's a nice way around the problem.

Thanks!

Ian
--
Ian Macdonald | Actually, what I'd like is a little toy
System Administrator | spaceship!!
(e-mail address removed) |
http://www.caliban.org |
|
 
T

ts

I> That's a nice way around the problem.

You can still use

res = rb_funcall(rb_str_new2("abc, def"), rb_intern("split"),
1, rb_reg_new(", ", 2, 0));


Guy Decoux
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,122
Latest member
VinayKumarNevatia_
Top