/*
Called by the marshalling mechanism to store a permanent copy of a
Dvector. _limit_ is simply ignored.
*/
VALUE dvector_dump(VALUE ary, VALUE limit)
{
int i; /* for STORE_UNSIGNED */
long len;
double * data = Dvector_Data_for_Read(ary, &len);
long target_len = 1 /* first signature byte */
+ 4 /* length */
+ len * 8 ;
unsigned u_len = (unsigned) len; /* this is bad, I know, but it
won't hurt before it is common
that computers have 32 GB of RAM...
*/
VALUE str = rb_str_new2("");
rb_str_resize(str,target_len); /* This seems to do the trick */
/* \begin{playing with ruby's internals} */
unsigned char * ptr = (unsigned char *) RSTRING_PTR(str);
/* signature byte */
(*ptr++) = DVECTOR_DUMP_VERSION;
STORE_UNSIGNED(u_len, ptr); /* destroys u_len */
while(len-- > 0)
{
store_double(*(data++), ptr);
ptr += 8;
}
/* RSTRING_LEN(str) = target_len; */
return str;
/* \end{playing with ruby's internals} */
}