1 #include "ficl.h"
2
ficlBitGet(const unsigned char * bits,size_t index)3 int ficlBitGet(const unsigned char *bits, size_t index)
4 {
5 int byteIndex = index >> 3;
6 int bitIndex = index & 7;
7 unsigned char mask = (unsigned char)(128 >> bitIndex);
8
9 return ((mask & bits[byteIndex]) ? 1 : 0);
10 }
11
12
13
ficlBitSet(unsigned char * bits,size_t index,int value)14 void ficlBitSet(unsigned char *bits, size_t index, int value)
15 {
16 int byteIndex = index >> 3;
17 int bitIndex = index & 7;
18 unsigned char mask = (unsigned char)(128 >> bitIndex);
19
20 if (value)
21 bits[byteIndex] |= mask;
22 else
23 bits[byteIndex] &= ~mask;
24 }
25
26
ficlBitGetString(unsigned char * destination,const unsigned char * source,int offset,int count,int destAlignment)27 void ficlBitGetString(unsigned char *destination, const unsigned char *source, int offset, int count, int destAlignment)
28 {
29 int bit = destAlignment - count;
30 while (count--)
31 ficlBitSet(destination, bit++, ficlBitGet(source, offset++));
32 }
33
34
35 /*
36 ** This will actually work correctly *regardless* of the local architecture.
37 ** --lch
38 **/
ficlNetworkUnsigned16(ficlUnsigned16 number)39 ficlUnsigned16 ficlNetworkUnsigned16(ficlUnsigned16 number)
40 {
41 ficlUnsigned8 *pointer = (ficlUnsigned8 *)&number;
42 return (ficlUnsigned16)(((ficlUnsigned16)(pointer[0] << 8)) | (pointer[1]));
43 }
44
ficlNetworkUnsigned32(ficlUnsigned32 number)45 ficlUnsigned32 ficlNetworkUnsigned32(ficlUnsigned32 number)
46 {
47 ficlUnsigned16 *pointer = (ficlUnsigned16 *)&number;
48 return ((ficlUnsigned32)(ficlNetworkUnsigned16(pointer[0]) << 16)) | ficlNetworkUnsigned16(pointer[1]);
49 }
50