[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

problems with rb_str_split

Ian Macdonald

11/12/2003 9:58:00 AM


> Ian Macdonald wrote:
> > On Wed 29 Oct 2003 at 17:06:07 -0500, Ian Macdonald wrote:
> >
> > > This can probably be fixed with this:
> > >
> > > cap_list = rb_str_split(rb_reg_new(txt, strlen(txt), 0), comma_sp);
> > >
> > > but this is entirely untested. Do you want to give it a try?
> >
> > OK, so that doesn't work. I know what the problem is, but I don't know
> > how to fix it.
>
> 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.
ian@caliban.org |
http://www.c... |
|

7 Answers

ts

11/12/2003 11:03:00 AM

0

>>>>> "I" == Ian Macdonald <ian@caliban.org> writes:

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[i]));
}
}
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

Ian Macdonald

11/13/2003 8:58:00 AM

0

On Wed 12 Nov 2003 at 20:02:33 +0900, ts wrote:

> >>>>> "I" == Ian Macdonald <ian@caliban.org> writes:
>
> 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[i]));
> }
> }
> 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 |
ian@caliban.org |
http://www.c... |
|

ts

11/13/2003 9:17:00 AM

0

>>>>> "I" == Ian Macdonald <ian@caliban.org> writes:

I> On Wed 12 Nov 2003 at 20:02:33 +0900, ts wrote:

>> Well, I don't have this problem with 1.8.1
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
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

Ian Macdonald

11/13/2003 10:29:00 AM

0

On Thu 13 Nov 2003 at 18:17:27 +0900, ts wrote:

> >>>>> "I" == Ian Macdonald <ian@caliban.org> writes:
>
> I> On Wed 12 Nov 2003 at 20:02:33 +0900, ts wrote:
>
> >> Well, I don't have this problem with 1.8.1
> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> 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
ian@caliban.org | has the feeling that there is nothing
http://www.c... | important to do.
|

ts

11/13/2003 10:39:00 AM

0

>>>>> "I" == Ian Macdonald <ian@caliban.org> writes:

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[i]));
}
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

Ian Macdonald

11/13/2003 10:55:00 AM

0

On Thu 13 Nov 2003 at 19:39:20 +0900, ts wrote:

> >>>>> "I" == Ian Macdonald <ian@caliban.org> writes:
>
> 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[i]));
> }

That's a nice way around the problem.

Thanks!

Ian
--
Ian Macdonald | Actually, what I'd like is a little toy
System Administrator | spaceship!!
ian@caliban.org |
http://www.c... |
|

ts

11/13/2003 11:06:00 AM

0

>>>>> "I" == Ian Macdonald <ian@caliban.org> writes:

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