1/*
2 * Copyright (c) 2010, David McPaul
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without modification,
6 * are permitted provided that the following conditions are met:
7 *
8 *  * Redistributions of source code must retain the above copyright notice,
9 *    this list of conditions and the following disclaimer.
10 *  * Redistributions in binary form must reproduce the above copyright notice,
11 *    this list of conditions and the following disclaimer in the documentation
12 *    and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17 * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
18 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
19 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
21 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
22 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
23 * OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "BitParser.h"
27
28#include <math.h>
29
30BitParser::BitParser(uint8 *bits, uint32 bitLength) {
31	this->bits = bits;
32	this->bitLength = bitLength;
33	this->index = 0;
34}
35
36BitParser::BitParser() {
37	bits = NULL;
38	bitLength = 0;
39	index = 1;
40}
41
42BitParser::~BitParser() {
43	bits = NULL;
44}
45
46void
47BitParser::Init(uint8 *bits, uint32 bitLength) {
48	this->bits = bits;
49	this->bitLength = bitLength;
50	this->index = 1;
51}
52
53void
54BitParser::Skip(uint8 length) {
55	if (bitLength >= length) {
56
57		while (length-- > 0) {
58			index++;
59			bitLength--;
60
61			if (index > 8) {
62				index = 1;
63				bits++;
64			}
65		}
66	}
67}
68
69uint32
70BitParser::GetValue(uint8 length) {
71	uint32 result = 0;
72
73	if (bitLength < length) {
74		return 0;
75	}
76
77	while (length-- > 0) {
78		result = result << 1;
79		result += (*bits) & (uint8)(pow(2, 8-index)) ? 1 : 0;
80		index++;
81		bitLength--;
82
83		if (index > 8) {
84			index = 1;
85			bits++;
86		}
87	}
88
89	return result;
90}
91