Copying data into a String inside a C extension

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

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

···

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 */