/* * The routine VALconvert transforms a value for interpretation in a * certain type. It uses some standard cast conventions to do this. * The result, a pointer to a value, is returned. If there are illegal * values, or type combinations involved, it gives up with an * ILLEGALVALUE. */ ptr VALconvert(int typ, ValPtr t) { int src_tpe = t->vtype; ValRecord dst; dst.vtype = typ; /* use base types for user types */ if (src_tpe > TYPE_str) src_tpe = ATOMstorage(src_tpe); if (dst.vtype > TYPE_str) dst.vtype = ATOMstorage(dst.vtype); else if (dst.vtype == TYPE_void) dst.vtype = TYPE_oid; /* first convert into a new location */ if (VARconvert(&dst, t, 0) == GDK_FAIL) return ILLEGALVALUE; /* then maybe free the old */ if (src_tpe != dst.vtype && t->vtype != typ && dst.vtype != TYPE_void && (src_tpe >= TYPE_str || dst.vtype >= TYPE_str)) VALclear(t); /* and finally copy the result */ *t = dst; /* make sure we return the correct type (not the storage type) */ t->vtype = typ; return VALget(t); }
/* Convert (cast) the value in T to the type TYP, do this in place. * Return a pointer to the converted value, or NULL if the conversion * didn't succeed. If the conversion didn't succeed, the original * value is not modified. Also see VARconvert. */ ptr VALconvert(int typ, ValPtr t) { int src_tpe = t->vtype; ValRecord dst; dst.vtype = typ; /* first convert into a new location */ if (VARconvert(&dst, t, 0) != GDK_SUCCEED) return NULL; /* then maybe free the old */ if (src_tpe != dst.vtype && t->vtype != typ && dst.vtype != TYPE_void && (src_tpe >= TYPE_str || dst.vtype >= TYPE_str)) VALclear(t); /* and finally copy the result */ *t = dst; /* make sure we return the correct type (not the storage type) */ t->vtype = typ; return VALget(t); }