4
* This file contains all functions needed to use bstreams.
10
faim_internal int aim_bstream_init(aim_bstream_t *bs, fu8_t *data, int len)
23
faim_internal int aim_bstream_empty(aim_bstream_t *bs)
25
return bs->len - bs->offset;
28
faim_internal int aim_bstream_curpos(aim_bstream_t *bs)
33
faim_internal int aim_bstream_setpos(aim_bstream_t *bs, int off)
44
faim_internal void aim_bstream_rewind(aim_bstream_t *bs)
47
aim_bstream_setpos(bs, 0);
52
faim_internal int aim_bstream_advance(aim_bstream_t *bs, int n)
55
if (aim_bstream_empty(bs) < n)
56
return 0; /* XXX throw an exception */
63
faim_internal fu8_t aimbs_get8(aim_bstream_t *bs)
66
if (aim_bstream_empty(bs) < 1)
67
return 0; /* XXX throw an exception */
71
return aimutil_get8(bs->data + bs->offset - 1);
74
faim_internal fu16_t aimbs_get16(aim_bstream_t *bs)
77
if (aim_bstream_empty(bs) < 2)
78
return 0; /* XXX throw an exception */
82
return aimutil_get16(bs->data + bs->offset - 2);
85
faim_internal fu32_t aimbs_get32(aim_bstream_t *bs)
88
if (aim_bstream_empty(bs) < 4)
89
return 0; /* XXX throw an exception */
93
return aimutil_get32(bs->data + bs->offset - 4);
96
faim_internal fu8_t aimbs_getle8(aim_bstream_t *bs)
99
if (aim_bstream_empty(bs) < 1)
100
return 0; /* XXX throw an exception */
104
return aimutil_getle8(bs->data + bs->offset - 1);
107
faim_internal fu16_t aimbs_getle16(aim_bstream_t *bs)
110
if (aim_bstream_empty(bs) < 2)
111
return 0; /* XXX throw an exception */
115
return aimutil_getle16(bs->data + bs->offset - 2);
118
faim_internal fu32_t aimbs_getle32(aim_bstream_t *bs)
121
if (aim_bstream_empty(bs) < 4)
122
return 0; /* XXX throw an exception */
126
return aimutil_getle32(bs->data + bs->offset - 4);
129
faim_internal int aimbs_put8(aim_bstream_t *bs, fu8_t v)
132
if (aim_bstream_empty(bs) < 1)
133
return 0; /* XXX throw an exception */
135
bs->offset += aimutil_put8(bs->data + bs->offset, v);
140
faim_internal int aimbs_put16(aim_bstream_t *bs, fu16_t v)
143
if (aim_bstream_empty(bs) < 2)
144
return 0; /* XXX throw an exception */
146
bs->offset += aimutil_put16(bs->data + bs->offset, v);
151
faim_internal int aimbs_put32(aim_bstream_t *bs, fu32_t v)
154
if (aim_bstream_empty(bs) < 4)
155
return 0; /* XXX throw an exception */
157
bs->offset += aimutil_put32(bs->data + bs->offset, v);
162
faim_internal int aimbs_putle8(aim_bstream_t *bs, fu8_t v)
165
if (aim_bstream_empty(bs) < 1)
166
return 0; /* XXX throw an exception */
168
bs->offset += aimutil_putle8(bs->data + bs->offset, v);
173
faim_internal int aimbs_putle16(aim_bstream_t *bs, fu16_t v)
176
if (aim_bstream_empty(bs) < 2)
177
return 0; /* XXX throw an exception */
179
bs->offset += aimutil_putle16(bs->data + bs->offset, v);
184
faim_internal int aimbs_putle32(aim_bstream_t *bs, fu32_t v)
187
if (aim_bstream_empty(bs) < 4)
188
return 0; /* XXX throw an exception */
190
bs->offset += aimutil_putle32(bs->data + bs->offset, v);
195
faim_internal int aimbs_getrawbuf(aim_bstream_t *bs, fu8_t *buf, int len)
198
if (aim_bstream_empty(bs) < len)
201
memcpy(buf, bs->data + bs->offset, len);
207
faim_internal fu8_t *aimbs_getraw(aim_bstream_t *bs, int len)
211
if (!(ob = malloc(len)))
214
if (aimbs_getrawbuf(bs, ob, len) < len) {
222
faim_internal char *aimbs_getstr(aim_bstream_t *bs, int len)
226
if (!(ob = malloc(len+1)))
229
if (aimbs_getrawbuf(bs, ob, len) < len) {
239
faim_internal int aimbs_putraw(aim_bstream_t *bs, const fu8_t *v, int len)
242
if (aim_bstream_empty(bs) < len)
243
return 0; /* XXX throw an exception */
245
memcpy(bs->data + bs->offset, v, len);
251
faim_internal int aimbs_putbs(aim_bstream_t *bs, aim_bstream_t *srcbs, int len)
254
if (aim_bstream_empty(srcbs) < len)
255
return 0; /* XXX throw exception (underrun) */
257
if (aim_bstream_empty(bs) < len)
258
return 0; /* XXX throw exception (overflow) */
260
memcpy(bs->data + bs->offset, srcbs->data + srcbs->offset, len);
262
srcbs->offset += len;