Extension to Samba IDL.

Luke Kenneth Casson Leighton lkcl at samba.org
Mon Jun 19 23:16:36 GMT 2000


> c) Simply
> 	prs_uint_bitfield("flags", &bitfield, ps, 14, ...);

io_struct
{
	char *data_p;
	int data_size;

	int data_offset;
	int bit_offset;
};

prs_uint32_bitfield(char *desc, io_struct *ps, uint32 *il, int bit_size, 
        int flags)
{
 	uint32 mask = (1 << bit_size)-1;
	char *data = io_mem_get_bits(ps, bitsize);
	if (UNMARSHALLING(ps))
	{
		uint64 v = I64VAL(data, 0);
		*il = (v >> ps->bit_offset) & mask;
	}
	else
	{
		uint64 v = I64VAL(data, 0);
		v &= (~mask) >> ps->bit_offset;
		v |= ((*il) & mask) >> ps->bit_offset);
	}

	ps->bit_offset += bit_size;
	while (ps->bit_offset > 8)
	{
		ps->bit_offset -= 8;
		ps->byte_offset++;
	}
}

hack-hack.



More information about the samba-technical mailing list