/* 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; }