libosmocore  0.9.3.20160317
Osmocom core library
Bit vectors

Files

file  bitvec.h
 Osmocom bit vector abstraction.
 
file  bitvec.c
 Osmocom bit vector abstraction.
 

Data Structures

struct  bitvec
 structure describing a bit vector More...
 

Macros

#define BITNUM_FROM_COMP(byte, bit)   ((byte*8)+bit)
 

Enumerations

enum  bit_value { ZERO = 0, ONE = 1, L = 2, H = 3 }
 A single GSM bit. More...
 

Functions

enum bit_value bitvec_get_bit_pos (const struct bitvec *bv, unsigned int bitnr)
 check if the bit is 0 or 1 for a given position inside a bitvec More...
 
enum bit_value bitvec_get_bit_pos_high (const struct bitvec *bv, unsigned int bitnr)
 check if the bit is L or H for a given position inside a bitvec More...
 
unsigned int bitvec_get_nth_set_bit (const struct bitvec *bv, unsigned int n)
 get the Nth set bit inside the bit vector More...
 
int bitvec_set_bit_pos (struct bitvec *bv, unsigned int bitnr, enum bit_value bit)
 set a bit at given position in a bit vector More...
 
int bitvec_set_bit (struct bitvec *bv, enum bit_value bit)
 set the next bit inside a bitvec More...
 
int bitvec_get_bit_high (struct bitvec *bv)
 get the next bit (low/high) inside a bitvec
 
int bitvec_set_bits (struct bitvec *bv, enum bit_value *bits, unsigned int count)
 set multiple bits (based on array of bitvals) at current pos More...
 
int bitvec_set_uint (struct bitvec *bv, uint32_t in, unsigned int count)
 
int bitvec_get_uint (struct bitvec *bv, unsigned int num_bits)
 get multiple bits (based on numeric value) from current pos
 
int bitvec_find_bit_pos (const struct bitvec *bv, unsigned int n, enum bit_value val)
 find first bit set in bit vector
 
int bitvec_spare_padding (struct bitvec *bv, unsigned int up_to_bit)
 pad all remaining bits up to num_bits
 
int bitvec_get_bytes (struct bitvec *bv, uint8_t *bytes, unsigned int count)
 get multiple bytes from current pos Assumes MSB first encoding. More...
 
int bitvec_set_bytes (struct bitvec *bv, const uint8_t *bytes, unsigned int count)
 set multiple bytes at current pos Assumes MSB first encoding. More...
 
struct bitvecbitvec_alloc (unsigned int size, TALLOC_CTX *bvctx)
 
void bitvec_free (struct bitvec *bv)
 
int bitvec_unhex (struct bitvec *bv, const char *src)
 
unsigned int bitvec_pack (const struct bitvec *bv, uint8_t *buffer)
 
unsigned int bitvec_unpack (struct bitvec *bv, const uint8_t *buffer)
 
uint64_t bitvec_read_field (struct bitvec *bv, unsigned int *read_index, unsigned int len)
 read part of the vector More...
 
int bitvec_write_field (struct bitvec *bv, unsigned int *write_index, uint64_t val, unsigned int len)
 write into the vector More...
 
int bitvec_fill (struct bitvec *bv, unsigned int num_bits, enum bit_value fill)
 fill num_bits with starting from the current position returns 0 on success, negative otherwise (out of vector boundary)
 
char bit_value_to_char (enum bit_value v)
 convert enum to corresponding character
 
void bitvec_to_string_r (const struct bitvec *bv, char *str)
 prints bit vector to provided string It's caller's responsibility to ensure that we won't shoot him in the foot: the provided buffer should be at lest cur_bit + 1 bytes long
 
void bitvec_zero (struct bitvec *bv)
 force bit vector to all 0 and current bit to the beginnig of the vector
 
unsigned bitvec_rl (const struct bitvec *bv, bool b)
 Return number (bits) of uninterrupted bit run in vector starting from the MSB. More...
 
void bitvec_shiftl (struct bitvec *bv, unsigned int n)
 
int16_t bitvec_get_int16_msb (const struct bitvec *bv, unsigned int num_bits)
 get multiple bits (num_bits) from beginning of vector (MSB side)
 
unsigned int bitvec_add_array (struct bitvec *bv, const uint32_t *array, unsigned int array_len, bool dry_run, unsigned int num_bits)
 Add given array to bitvec. More...
 
static unsigned int bytenum_from_bitnum (unsigned int bitnum)
 
static uint8_t bitval2mask (enum bit_value bit, uint8_t bitnum)
 
int bitvec_set_uint (struct bitvec *bv, unsigned int ui, unsigned int num_bits)
 set multiple bits (based on numeric value) at current pos
 
static unsigned leading_bits (uint8_t x, bool b)
 
void bitvec_shiftl (struct bitvec *bv, unsigned n)
 Shifts bitvec to the left, n MSB bits lost.
 

Detailed Description

Enumeration Type Documentation

enum bit_value

A single GSM bit.

In GSM mac blocks, every bit can be 0 or 1, or L or H. L/H are defined relative to the 0x2b padding pattern

Enumerator
ZERO 

A zero (0) bit.

ONE 

A one (1) bit.

A CSN.1 "L" bit.

A CSN.1 "H" bit.

Function Documentation

unsigned int bitvec_add_array ( struct bitvec bv,
const uint32_t *  array,
unsigned int  array_len,
bool  dry_run,
unsigned int  num_bits 
)

Add given array to bitvec.

Parameters
[in,out]bvbit vector to work with
[in]arrayelements to be added
[in]array_lenlength of array
[in]dry_runindicates whether to return number of bits required instead of adding anything to bv for real
[in]num_bitsnumber of bits to consider in each element of array
Returns
number of bits necessary to add array elements if dry_run is true, 0 otherwise (only in this case bv is actually changed)

N. B: no length checks are performed on bv - it's caller's job to ensure enough space is available - for example by calling with dry_run = true first.

Useful for common pattern in CSN.1 spec which looks like: { 1 < XXX : bit (num_bits) > } ** 0 which means repeat any times (between 0 and infinity), start each repetition with 1, mark end of repetitions with 0 bit see app. note in 3GPP TS 24.007 ยง B.2.1 Rule A2

References bitvec_set_bit(), and bitvec_set_uint().

enum bit_value bitvec_get_bit_pos ( const struct bitvec bv,
unsigned int  bitnr 
)

check if the bit is 0 or 1 for a given position inside a bitvec

Parameters
[in]bvthe bit vector on which to check
[in]bitnrthe bit number inside the bit vector to check
Returns

References data, data_len, ONE, and ZERO.

Referenced by bitvec_find_bit_pos(), bitvec_get_nth_set_bit(), bitvec_get_uint(), bitvec_read_field(), and bitvec_to_string_r().

enum bit_value bitvec_get_bit_pos_high ( const struct bitvec bv,
unsigned int  bitnr 
)

check if the bit is L or H for a given position inside a bitvec

Parameters
[in]bvthe bit vector on which to check
[in]bitnrthe bit number inside the bit vector to check

References data, data_len, H, and L.

Referenced by bitvec_get_bit_high().

int bitvec_get_bytes ( struct bitvec bv,
uint8_t *  bytes,
unsigned int  count 
)

get multiple bytes from current pos Assumes MSB first encoding.

Parameters
[in]bvbit vector
[in]bytesarray
[in]countnumber of bytes to copy

References cur_bit, data, and data_len.

unsigned int bitvec_get_nth_set_bit ( const struct bitvec bv,
unsigned int  n 
)

get the Nth set bit inside the bit vector

Parameters
[in]bvthe bit vector to use
[in]nthe bit number to get
Returns
the bit number (offset) of the Nth set bit in bv

References bitvec_get_bit_pos(), data_len, and ONE.

uint64_t bitvec_read_field ( struct bitvec bv,
unsigned int *  read_index,
unsigned int  len 
)

read part of the vector

Parameters
[in]bvThe boolean vector to work on
[in,out]read_indexWhere reading supposed to start in the vector
[in]lenHow many bits to read from vector
Returns
read bits or negative value on error

References bitvec_get_bit_pos(), and cur_bit.

unsigned bitvec_rl ( const struct bitvec bv,
bool  b 
)

Return number (bits) of uninterrupted bit run in vector starting from the MSB.

Parameters
[in]bvThe boolean vector to work on
[in]bThe boolean, sequence of which is looked at from the vector start
Returns
Number of consecutive bits of b in bv

References cur_bit, and data.

Referenced by osmo_t4_encode().

int bitvec_set_bit ( struct bitvec bv,
enum bit_value  bit 
)

set the next bit inside a bitvec

Parameters
[in]bvbit vector to be used
[in]bitvalue of the bit to be set
Returns
0 on success, negative value on error

References bitvec_set_bit_pos(), and cur_bit.

Referenced by bitvec_add_array(), bitvec_fill(), bitvec_set_bits(), bitvec_set_uint(), and bitvec_write_field().

int bitvec_set_bit_pos ( struct bitvec bv,
unsigned int  bitnr,
enum bit_value  bit 
)

set a bit at given position in a bit vector

Parameters
[in]bvbit vector on which to operate
[in]bitnrnumber of bit to be set
[in]bitvalue to which the bit is to be set
Returns
0 on success, negative value on error

References data, data_len, and ONE.

Referenced by bitvec_set_bit().

int bitvec_set_bits ( struct bitvec bv,
enum bit_value bits,
unsigned int  count 
)

set multiple bits (based on array of bitvals) at current pos

Parameters
[in]bvbit vector
[in]bitsarray of bit_value
[in]countnumber of bits to set

References bitvec_set_bit().

int bitvec_set_bytes ( struct bitvec bv,
const uint8_t *  bytes,
unsigned int  count 
)

set multiple bytes at current pos Assumes MSB first encoding.

Parameters
[in]bvbit vector
[in]bytesarray
[in]countnumber of bytes to copy

References cur_bit, data, and data_len.

int bitvec_write_field ( struct bitvec bv,
unsigned int *  write_index,
uint64_t  val,
unsigned int  len 
)

write into the vector

Parameters
[in]bvThe boolean vector to work on
[in,out]write_indexWhere writing supposed to start in the vector
[in]lenHow many bits to write
Returns
next write index or negative value on error

References bitvec_set_bit(), and cur_bit.