| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * varbit.h |
| 4 | * Functions for the SQL datatypes BIT() and BIT VARYING(). |
| 5 | * |
| 6 | * Code originally contributed by Adriaan Joubert. |
| 7 | * |
| 8 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 9 | * Portions Copyright (c) 1994, Regents of the University of California |
| 10 | * |
| 11 | * src/include/utils/varbit.h |
| 12 | * |
| 13 | *------------------------------------------------------------------------- |
| 14 | */ |
| 15 | #ifndef VARBIT_H |
| 16 | #define VARBIT_H |
| 17 | |
| 18 | #include <limits.h> |
| 19 | |
| 20 | #include "fmgr.h" |
| 21 | |
| 22 | /* |
| 23 | * Modeled on struct varlena from postgres.h, but data type is bits8. |
| 24 | * |
| 25 | * Caution: if bit_len is not a multiple of BITS_PER_BYTE, the low-order |
| 26 | * bits of the last byte of bit_dat[] are unused and MUST be zeroes. |
| 27 | * (This allows bit_cmp() to not bother masking the last byte.) |
| 28 | * Also, there should not be any excess bytes counted in the header length. |
| 29 | */ |
| 30 | typedef struct |
| 31 | { |
| 32 | int32 vl_len_; /* varlena header (do not touch directly!) */ |
| 33 | int32 bit_len; /* number of valid bits */ |
| 34 | bits8 bit_dat[FLEXIBLE_ARRAY_MEMBER]; /* bit string, most sig. byte |
| 35 | * first */ |
| 36 | } VarBit; |
| 37 | |
| 38 | /* |
| 39 | * fmgr interface macros |
| 40 | * |
| 41 | * BIT and BIT VARYING are toastable varlena types. They are the same |
| 42 | * as far as representation goes, so we just have one set of macros. |
| 43 | */ |
| 44 | #define DatumGetVarBitP(X) ((VarBit *) PG_DETOAST_DATUM(X)) |
| 45 | #define DatumGetVarBitPCopy(X) ((VarBit *) PG_DETOAST_DATUM_COPY(X)) |
| 46 | #define VarBitPGetDatum(X) PointerGetDatum(X) |
| 47 | #define PG_GETARG_VARBIT_P(n) DatumGetVarBitP(PG_GETARG_DATUM(n)) |
| 48 | #define PG_GETARG_VARBIT_P_COPY(n) DatumGetVarBitPCopy(PG_GETARG_DATUM(n)) |
| 49 | #define PG_RETURN_VARBIT_P(x) return VarBitPGetDatum(x) |
| 50 | |
| 51 | /* Header overhead *in addition to* VARHDRSZ */ |
| 52 | #define VARBITHDRSZ sizeof(int32) |
| 53 | /* Number of bits in this bit string */ |
| 54 | #define VARBITLEN(PTR) (((VarBit *) (PTR))->bit_len) |
| 55 | /* Pointer to the first byte containing bit string data */ |
| 56 | #define VARBITS(PTR) (((VarBit *) (PTR))->bit_dat) |
| 57 | /* Number of bytes in the data section of a bit string */ |
| 58 | #define VARBITBYTES(PTR) (VARSIZE(PTR) - VARHDRSZ - VARBITHDRSZ) |
| 59 | /* Padding of the bit string at the end (in bits) */ |
| 60 | #define VARBITPAD(PTR) (VARBITBYTES(PTR)*BITS_PER_BYTE - VARBITLEN(PTR)) |
| 61 | /* Number of bytes needed to store a bit string of a given length */ |
| 62 | #define VARBITTOTALLEN(BITLEN) (((BITLEN) + BITS_PER_BYTE-1)/BITS_PER_BYTE + \ |
| 63 | VARHDRSZ + VARBITHDRSZ) |
| 64 | /* |
| 65 | * Maximum number of bits. Several code sites assume no overflow from |
| 66 | * computing bitlen + X; VARBITTOTALLEN() has the largest such X. |
| 67 | */ |
| 68 | #define VARBITMAXLEN (INT_MAX - BITS_PER_BYTE + 1) |
| 69 | /* pointer beyond the end of the bit string (like end() in STL containers) */ |
| 70 | #define VARBITEND(PTR) (((bits8 *) (PTR)) + VARSIZE(PTR)) |
| 71 | /* Mask that will cover exactly one byte, i.e. BITS_PER_BYTE bits */ |
| 72 | #define BITMASK 0xFF |
| 73 | |
| 74 | #endif |
| 75 | |