exip
Alpha 0.5.4
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
src
streamIO
src
streamRead.c
Go to the documentation of this file.
1
/*==================================================================*\
2
| EXIP - Embeddable EXI Processor in C |
3
|--------------------------------------------------------------------|
4
| This work is licensed under BSD 3-Clause License |
5
| The full license terms and conditions are located in LICENSE.txt |
6
\===================================================================*/
7
18
#include "
streamRead.h
"
19
#include "
ioUtil.h
"
20
21
const
unsigned
char
BIT_MASK
[] = { (char) 0x00,
// 0b00000000
22
(
char
) 0x01,
// 0b00000001
23
(char) 0x03,
// 0b00000011
24
(
char
) 0x07,
// 0b00000111
25
(char) 0x0F,
// 0b00001111
26
(
char
) 0x1F,
// 0b00011111
27
(char) 0x3F,
// 0b00111111
28
(
char
) 0x7F,
// 0b01111111
29
(char) 0xFF };
// 0b11111111
30
31
errorCode
readNextBit
(
EXIStream
* strm,
boolean
* bit_val)
32
{
33
if
(strm->
buffer
.
bufContent
<= strm->
context
.
bufferIndx
)
// the whole buffer is parsed! read another portion
34
{
35
strm->
context
.
bitPointer
= 0;
36
strm->
context
.
bufferIndx
= 0;
37
strm->
buffer
.
bufContent
= 0;
38
if
(strm->
buffer
.
ioStrm
.
readWriteToStream
==
NULL
)
39
return
EXIP_BUFFER_END_REACHED
;
40
strm->
buffer
.
bufContent
= strm->
buffer
.
ioStrm
.
readWriteToStream
(strm->
buffer
.
buf
, strm->
buffer
.
bufLen
, strm->
buffer
.
ioStrm
.
stream
);
41
if
(strm->
buffer
.
bufContent
== 0)
42
return
EXIP_BUFFER_END_REACHED
;
43
}
44
45
*bit_val = (strm->
buffer
.
buf
[strm->
context
.
bufferIndx
] & (1<<
REVERSE_BIT_POSITION
(strm->
context
.
bitPointer
))) != 0;
46
47
moveBitPointer
(strm, 1);
48
DEBUG_MSG
(
INFO
,
DEBUG_STREAM_IO
, (
" @%u:%u"
, (
unsigned
int
) strm->
context
.
bufferIndx
, strm->
context
.
bitPointer
));
49
return
EXIP_OK
;
50
}
51
52
errorCode
readBits
(
EXIStream
* strm,
unsigned
char
n,
unsigned
int
* bits_val)
53
{
54
unsigned
int
numBytesToBeRead = 1 + ((n + strm->
context
.
bitPointer
- 1) / 8);
55
unsigned
int
byteIndx = 1;
56
unsigned
char
*buf;
57
58
if
(strm->
buffer
.
bufContent
< strm->
context
.
bufferIndx
+ numBytesToBeRead)
59
{
60
// The buffer end is reached: there are fewer than n bits left unparsed
61
errorCode
tmp_err_code =
EXIP_UNEXPECTED_ERROR
;
62
63
TRY
(
readEXIChunkForParsing
(strm, numBytesToBeRead));
64
}
65
66
buf = (
unsigned
char
*) strm->
buffer
.
buf
+ strm->
context
.
bufferIndx
;
67
68
*bits_val = (buf[0] &
BIT_MASK
[8 - strm->
context
.
bitPointer
])<<((numBytesToBeRead-1)*8);
69
70
while
(byteIndx < numBytesToBeRead)
71
{
72
*bits_val += (
unsigned
int) (buf[byteIndx])<<((numBytesToBeRead-byteIndx-1)*8);
73
byteIndx++;
74
}
75
76
*bits_val = *bits_val >> (numBytesToBeRead*8 - n - strm->
context
.
bitPointer
);
77
78
DEBUG_MSG
(
INFO
,
DEBUG_STREAM_IO
, (
">> %d [0x%X] (%u bits)"
, *bits_val, *bits_val, n));
79
80
n += strm->
context
.
bitPointer
;
81
strm->
context
.
bufferIndx
+= n / 8;
82
strm->
context
.
bitPointer
= n % 8;
83
84
DEBUG_MSG
(
INFO
,
DEBUG_STREAM_IO
, (
" @%u:%u\n"
, (
unsigned
int
) strm->
context
.
bufferIndx
, strm->
context
.
bitPointer
));
85
86
return
EXIP_OK
;
87
}
88
Generated on Thu Nov 27 2014 10:56:09 for exip by
1.8.4