File: bits.h

package info (click to toggle)
liboil 0.3.1-2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 4,276 kB
  • ctags: 2,005
  • sloc: ansic: 14,199; sh: 8,527; xml: 7,375; makefile: 429
file content (120 lines) | stat: -rw-r--r-- 1,524 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

#ifndef __BITS_H__
#define __BITS_H__

typedef struct bits_struct bits_t;
struct bits_struct {
	unsigned char *ptr;
	int idx;
	unsigned char *end;
};

static inline int bits_needbits(bits_t *b, int n_bytes)
{
	if(b->ptr==NULL)return 1;
	if(b->ptr + n_bytes > b->end)return 1;

	return 0;
}

static inline int getbit(bits_t *b)
{
	int r;

	r = ((*b->ptr)>>(7-b->idx))&1;

	b->idx++;
	if(b->idx>=8){
		b->ptr++;
		b->idx = 0;
	}

	return r;
}

static inline unsigned int getbits(bits_t *b, int n)
{
	unsigned long r = 0;
	int i;

	for(i=0;i<n;i++){
		r <<=1;
		r |= getbit(b);
	}

	return r;
}

static inline unsigned int peekbits(bits_t *b, int n)
{
	bits_t tmp = *b;

	return getbits(&tmp, n);
}

static inline int getsbits(bits_t *b, int n)
{
	unsigned long r = 0;
	int i;

	if(n==0)return 0;
	r = -getbit(b);
	for(i=1;i<n;i++){
		r <<=1;
		r |= getbit(b);
	}

	return r;
}

static inline unsigned int peek_u8(bits_t *b)
{
	return *b->ptr;
}

static inline unsigned int get_u8(bits_t *b)
{
	return *b->ptr++;
}

static inline unsigned int get_u16(bits_t *b)
{
	unsigned int r;

	r = b->ptr[0] | (b->ptr[1]<<8);
	b->ptr+=2;

	return r;
}

static inline unsigned int get_be_u16(bits_t *b)
{
	unsigned int r;

	r = (b->ptr[0]<<8) | b->ptr[1];
	b->ptr+=2;

	return r;
}

static inline unsigned int get_u32(bits_t *b)
{
	unsigned int r;

	r = b->ptr[0] | (b->ptr[1]<<8) | (b->ptr[2]<<16) | (b->ptr[3]<<24);
	b->ptr+=4;

	return r;
}

static inline void syncbits(bits_t *b)
{
	if(b->idx){
		b->ptr++;
		b->idx=0;
	}

}

#endif