Str_buf safety

Is it safe so set the length of a String Buffer like so:
{
  VALUE str_buf;
  long len = len_of_ext_data_source;
  unsigned char *buf = ptr_to_ext_data_source;

  str_buf = rb_str_buf_new(len);
  /* bug: Dangerous to set Ruby String fields directly? */
  MEMCPY(RSTRING(str_buf)->ptr, buf, unsigned char, len);
  RSTRING(str_buf)->len = len;
  return str_buf;
}
Where len is the length of some buffer and buf is a pointer to that buffer.
-Charlie

I just realized this example suggests I should use:
VALUE str = rb_str_new(buf, len);
Unfortunately I cannot do that (without allocating 2 buffers) since I have a routine pack() which packs an object into a buffer.
I was hoping I could do the following:
{
  long len = pack_size(obj);
  VALUE str_buf = rb_str_buf_new(len);
  pack(obj, RSTRING(str_buf)->ptr, len);
  RSTRING(str_buf)->len = len;
  return str_buf;
}

I am sure something similar is done with the read() system call in io.c, ... I will look there.
-Charlie

···

On Jul 19, 2004, at 11:25 AM, Charles Mills wrote:

Is it safe so set the length of a String Buffer like so:
{
  VALUE str_buf;
  long len = len_of_ext_data_source;
  unsigned char *buf = ptr_to_ext_data_source;

  str_buf = rb_str_buf_new(len);
  /* bug: Dangerous to set Ruby String fields directly? */
  MEMCPY(RSTRING(str_buf)->ptr, buf, unsigned char, len);
  RSTRING(str_buf)->len = len;
  return str_buf;
}
Where len is the length of some buffer and buf is a pointer to that buffer.
-Charlie