[lnkForumImage]
TotalShareware - Download Free Software

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


 

Forums >

comp.lang.ruby

Copying data into a String inside a C extension

Tony Arcieri

1/11/2008 8:40:00 PM

[Note: parts of this message were removed to make it a legal post.]

I'm extracting data from a function in C which accepts a pointer to the
string to dump the data into.

I know the length beforehand, so what I need to do is create a new String of
a given length and pass the pointer to the String's buffer to function which
writes into it.

Currently I'm doing this:

str = rb_str_buf_new(length);
buffer_read(buf, RSTRING_PTR(str), length);
RSTRING(str)->as.heap.len = length; /* <-- something tells me this is bad
*/
RSTRING_PTR(str)[length] = '\0'; /* sentinel */

(this is intended for Ruby 1.9)

buffer_read is the function which writes data into the string's buffer.

The RSTRING(str)->as.heap.len = length bit was stolen from the STR_SET_LEN
macro in string.c, but this doesn't seem available in ruby.h

What's the proper way to do this sort of thing?

--
Tony Arcieri
ClickCaster, Inc.
tony@clickcaster.com

1 Answer

Adam Bozanich

1/12/2008 2:26:00 AM

0

[Note: parts of this message were removed to make it a legal post.]

On Jan 11, 2008 12:40 PM, Tony Arcieri <tony@clickcaster.com> wrote:

> I'm extracting data from a function in C which accepts a pointer to the
> string to dump the data into.
>
> I know the length beforehand, so what I need to do is create a new String
> of
> a given length and pass the pointer to the String's buffer to function
> which
> writes into it.
>
> Currently I'm doing this:
>
> str = rb_str_buf_new(length);
> buffer_read(buf, RSTRING_PTR(str), length);
> RSTRING(str)->as.heap.len = length; /* <-- something tells me this is bad
> */
> RSTRING_PTR(str)[length] = '\0'; /* sentinel */
>

Hi Tony,

You can pass the null pointer to rb_str_new() like so:

VALUE str = rb_str_new(0,length);

if you follow the call flow, it'll end up in str_new(), which allocates
space for length bytes but only copies the data in if ptr is not null.

-Adam