// // Mold_Bitset: C // void Mold_Bitset(const REBVAL *value, REB_MOLD *mold) { REBSER *ser = VAL_SERIES(value); if (BITS_NOT(ser)) Append_Unencoded(mold->series, "[not bits "); Mold_Binary(value, mold); if (BITS_NOT(ser)) Append_Codepoint_Raw(mold->series, ']'); }
// // CT_Bitset: C // REBINT CT_Bitset(const REBVAL *a, const REBVAL *b, REBINT mode) { if (mode == 3) return VAL_SERIES(a) == VAL_SERIES(b); if (mode >= 0) return ( BITS_NOT(VAL_SERIES(a)) == BITS_NOT(VAL_SERIES(b)) && Compare_Binary_Vals(a, b) == 0 ); return -1; }
// // Check_Bit: C // // Check bit indicated. Returns TRUE if set. // If uncased is TRUE, try to match either upper or lower case. // REBOOL Check_Bit(REBSER *bset, REBCNT c, REBOOL uncased) { REBCNT i, n = c; REBCNT tail = SER_LEN(bset); REBOOL flag = FALSE; if (uncased) { if (n >= UNICODE_CASES) uncased = FALSE; // no need to check else n = LO_CASE(c); } // Check lowercase char: retry: i = n >> 3; if (i < tail) flag = LOGICAL(BIN_HEAD(bset)[i] & (1 << (7 - ((n) & 7)))); // Check uppercase if needed: if (uncased && !flag) { n = UP_CASE(c); uncased = FALSE; goto retry; } return BITS_NOT(bset) ? NOT(flag) : flag; }
*/ REBFLG Check_Bit(REBSER *bset, REBCNT c, REBFLG uncased) /* ** Check bit indicated. Returns TRUE if set. ** If uncased is TRUE, try to match either upper or lower case. ** ***********************************************************************/ { REBCNT i, n = c; REBCNT tail = SERIES_TAIL(bset); REBFLG flag = 0; if (uncased) { if (n >= UNICODE_CASES) uncased = FALSE; // no need to check else n = LO_CASE(c); } // Check lowercase char: retry: i = n >> 3; if (i < tail) flag = (0 != (BIN_HEAD(bset)[i] & (1 << (7 - ((n) & 7))))); // Check uppercase if needed: if (uncased && !flag) { n = UP_CASE(c); uncased = FALSE; goto retry; } return (BITS_NOT(bset)) ? !flag : flag; }
// // Make_Bitset: C // // Return a bitset series (binary. // // len: the # of bits in the bitset. // REBSER *Make_Bitset(REBCNT len) { REBSER *ser; len = (len + 7) / 8; ser = Make_Binary(len); Clear_Series(ser); SET_SERIES_LEN(ser, len); BITS_NOT(ser) = FALSE; return ser; }
*/ REBSER *Make_Bitset(REBCNT len) /* ** Return a bitset series (binary. ** ** len: the # of bits in the bitset. ** ***********************************************************************/ { REBSER *ser; len = (len + 7) / 8; ser = Make_Binary(len); Clear_Series(ser); SERIES_TAIL(ser) = len; BITS_NOT(ser) = 0; return ser; }
// // MT_Bitset: C // REBOOL MT_Bitset(REBVAL *out, REBVAL *data, enum Reb_Kind type) { REBOOL is_not = FALSE; if (IS_BLOCK(data)) { REBINT len = Find_Max_Bit(data); REBSER *ser; if (len < 0 || len > 0xFFFFFF) fail (Error_Invalid_Arg(data)); ser = Make_Bitset(len); Set_Bits(ser, data, TRUE); Val_Init_Bitset(out, ser); return TRUE; } if (!IS_BINARY(data)) return FALSE; Val_Init_Bitset(out, Copy_Sequence_At_Position(data)); BITS_NOT(VAL_SERIES(out)) = FALSE; return TRUE; }
*/ REBFLG MT_Bitset(REBVAL *out, REBVAL *data, REBCNT type) /* ***********************************************************************/ { REBFLG is_not = 0; if (IS_BLOCK(data)) { REBINT len = Find_Max_Bit(data); REBSER *ser; if (len < 0 || len > 0xFFFFFF) raise Error_Invalid_Arg(data); ser = Make_Bitset(len); Set_Bits(ser, data, TRUE); Val_Init_Bitset(out, ser); return TRUE; } if (!IS_BINARY(data)) return FALSE; Val_Init_Bitset(out, Copy_Sequence_At_Position(data)); BITS_NOT(VAL_SERIES(out)) = 0; return TRUE; }