/*
Called by the marshalling mechanism to retrieve a permanent copy of a
Dvector.
*/
VALUE dvector_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;
double * data;
/* depending on the first byte, the decoding will be different */
switch(*(buf++))
{
case 1:
GET_UNSIGNED(tmp, buf);
/* create a new Dvector with the right size */
ret = rb_funcall(cDvector, rb_intern("new"), 1, UINT2NUM(tmp));
data = Dvector_Data_for_Write(ret, NULL);
for(i = 0; i< tmp; i++)
{
if(buf + 8 > dest)
{
rb_raise(rb_eRuntimeError,
"corrupted data given to Dvector._load");
break;
}
else
{
data[i] = get_double(buf);
buf += 8;
}
}
break;
default:
rb_raise(rb_eRuntimeError, "corrupted data given to Dvector._load");
}
return ret;
}