/*
Called by the marshalling mechanism to store a permanent copy of a
Dtable. _limit_ is simply ignored.
*/
VALUE dtable_dump(VALUE ary, VALUE limit)
{
int i; /* for STORE_UNSIGNED */
long rows, cols;
long x, y;
double ** data = Dtable_Ptr(ary, &cols, &rows);
double * col;
long target_len = 1 /* first signature byte */
+ 8 /* 2 * length */
+ cols * rows * 8 ;
unsigned u_len;
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++) = DTABLE_DUMP_VERSION;
u_len = (unsigned) rows; /* limits to 4 billions rows */
STORE_UNSIGNED(u_len, ptr); /* destroys u_len */
u_len = (unsigned) cols; /* limits to 4 billions columns */
STORE_UNSIGNED(u_len, ptr); /* destroys u_len */
for(x = 0; x < rows; x++)
{
col = data[x];
for(y = 0; y < cols; y++)
{
store_double(*(col++), ptr);
ptr += 8;
}
}
/* RSTRING_LEN(str) = target_len;*/
return str;
/* \end{playing with ruby's internals} */
}