// // Pick_Vector: C // void Pick_Vector(REBVAL *out, const REBVAL *value, const REBVAL *picker) { REBSER *vect = VAL_SERIES(value); REBINT n; if (IS_INTEGER(picker) || IS_DECIMAL(picker)) n = Int32(picker); else fail (Error_Invalid_Arg(picker)); n += VAL_INDEX(value); if (n <= 0 || cast(REBCNT, n) > SER_LEN(vect)) { SET_VOID(out); // out of range of vector data return; } REBYTE *vp = SER_DATA_RAW(vect); REBINT bits = VECT_TYPE(vect); if (bits < VTSF08) SET_INTEGER(out, get_vect(bits, vp, n - 1)); // 64-bit else { VAL_RESET_HEADER(out, REB_DECIMAL); INIT_DECIMAL_BITS(out, get_vect(bits, vp, n - 1)); // 64-bit } }
// // Binary_To_Decimal: C // static void Binary_To_Decimal(const REBVAL *bin, REBVAL *out) { REBI64 n = 0; REBSER *ser = VAL_SERIES(bin); REBCNT idx = VAL_INDEX(bin); REBCNT len = VAL_LEN_AT(bin); if (len > 8) len = 8; for (; len; len--, idx++) n = (n << 8) | (REBI64)(GET_ANY_CHAR(ser, idx)); VAL_RESET_HEADER(out, REB_DECIMAL); INIT_DECIMAL_BITS(out, n); }
// // Set_Vector_Value: C // void Set_Vector_Value(REBVAL *var, REBSER *series, REBCNT index) { REBYTE *data = SER_DATA_RAW(series); REBCNT bits = VECT_TYPE(series); if (bits >= VTSF08) { VAL_RESET_HEADER(var, REB_DECIMAL); INIT_DECIMAL_BITS(var, get_vect(bits, data, index)); } else { VAL_RESET_HEADER(var, REB_INTEGER); VAL_INT64(var) = get_vect(bits, data, index); } }