/*
Called by the marshalling mechanism to retrieve a permanent copy of a
Dtable.
*/
VALUE dtable_load(VALUE klass, VALUE str)
{
VALUE ret = Qnil;
VALUE s = StringValue(str);
unsigned char * buf = (unsigned char *) StringValuePtr(s);
unsigned char * dest = buf + RSTRING_LEN(s);
unsigned i; /* for GET_UNSIGNED */
unsigned tmp = 0;
long rows, cols;
long x,y;
double ** data;
double * col;
/* depending on the first byte, the decoding will be different */
switch(*(buf++))
{
case 1:
GET_UNSIGNED(tmp, buf);
rows = tmp;
GET_UNSIGNED(tmp, buf);
cols = tmp;
/* create a new Dtable with the right size */
ret = dtable_init(dtable_alloc(cDtable), cols, rows);
data = Dtable_Ptr(ret, NULL, NULL);
for(x = 0; x < rows; x++)
{
col = data[x];
for(y = 0; y< cols; y++)
{
if(buf + 8 > dest)
{
rb_raise(rb_eRuntimeError,
"corrupted data given to Dtable._load");
break;
}
else
{
col[y] = get_double(buf);
buf += 8;
}
}
}
break;
default:
rb_raise(rb_eRuntimeError, "corrupted data given to Dtable._load");
}
return ret;
}