📄 bstream.c
字号:
/* * bstream.c * * This file contains all functions needed to use bstreams. */#define FAIM_INTERNAL#include <aim.h> faim_internal int aim_bstream_init(aim_bstream_t *bs, fu8_t *data, int len){ if (!bs) return -1; bs->data = data; bs->len = len; bs->offset = 0; return 0;}faim_internal int aim_bstream_empty(aim_bstream_t *bs){ return bs->len - bs->offset;}faim_internal int aim_bstream_curpos(aim_bstream_t *bs){ return bs->offset;}faim_internal int aim_bstream_setpos(aim_bstream_t *bs, unsigned int off){ if (off > bs->len) return -1; bs->offset = off; return off;}faim_internal void aim_bstream_rewind(aim_bstream_t *bs){ aim_bstream_setpos(bs, 0); return;}faim_internal int aim_bstream_advance(aim_bstream_t *bs, int n){ if (aim_bstream_empty(bs) < n) return 0; /* XXX throw an exception */ bs->offset += n; return n;}faim_internal fu8_t aimbs_get8(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 1) return 0; /* XXX throw an exception */ bs->offset++; return aimutil_get8(bs->data + bs->offset - 1);}faim_internal fu16_t aimbs_get16(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 2) return 0; /* XXX throw an exception */ bs->offset += 2; return aimutil_get16(bs->data + bs->offset - 2);}faim_internal fu32_t aimbs_get32(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 4) return 0; /* XXX throw an exception */ bs->offset += 4; return aimutil_get32(bs->data + bs->offset - 4);}faim_internal fu8_t aimbs_getle8(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 1) return 0; /* XXX throw an exception */ bs->offset++; return aimutil_getle8(bs->data + bs->offset - 1);}faim_internal fu16_t aimbs_getle16(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 2) return 0; /* XXX throw an exception */ bs->offset += 2; return aimutil_getle16(bs->data + bs->offset - 2);}faim_internal fu32_t aimbs_getle32(aim_bstream_t *bs){ if (aim_bstream_empty(bs) < 4) return 0; /* XXX throw an exception */ bs->offset += 4; return aimutil_getle32(bs->data + bs->offset - 4);}faim_internal int aimbs_put8(aim_bstream_t *bs, fu8_t v){ if (aim_bstream_empty(bs) < 1) return 0; /* XXX throw an exception */ bs->offset += aimutil_put8(bs->data + bs->offset, v); return 1;}faim_internal int aimbs_put16(aim_bstream_t *bs, fu16_t v){ if (aim_bstream_empty(bs) < 2) return 0; /* XXX throw an exception */ bs->offset += aimutil_put16(bs->data + bs->offset, v); return 2;}faim_internal int aimbs_put32(aim_bstream_t *bs, fu32_t v){ if (aim_bstream_empty(bs) < 4) return 0; /* XXX throw an exception */ bs->offset += aimutil_put32(bs->data + bs->offset, v); return 1;}faim_internal int aimbs_putle8(aim_bstream_t *bs, fu8_t v){ if (aim_bstream_empty(bs) < 1) return 0; /* XXX throw an exception */ bs->offset += aimutil_putle8(bs->data + bs->offset, v); return 1;}faim_internal int aimbs_putle16(aim_bstream_t *bs, fu16_t v){ if (aim_bstream_empty(bs) < 2) return 0; /* XXX throw an exception */ bs->offset += aimutil_putle16(bs->data + bs->offset, v); return 2;}faim_internal int aimbs_putle32(aim_bstream_t *bs, fu32_t v){ if (aim_bstream_empty(bs) < 4) return 0; /* XXX throw an exception */ bs->offset += aimutil_putle32(bs->data + bs->offset, v); return 1;}faim_internal int aimbs_getrawbuf(aim_bstream_t *bs, fu8_t *buf, int len){ if (aim_bstream_empty(bs) < len) return 0; memcpy(buf, bs->data + bs->offset, len); bs->offset += len; return len;}faim_internal fu8_t *aimbs_getraw(aim_bstream_t *bs, int len){ fu8_t *ob; if (!(ob = malloc(len))) return NULL; if (aimbs_getrawbuf(bs, ob, len) < len) { free(ob); return NULL; } return ob;}faim_internal char *aimbs_getstr(aim_bstream_t *bs, int len){ char *ob; if (!(ob = malloc(len+1))) return NULL; if (aimbs_getrawbuf(bs, ob, len) < len) { free(ob); return NULL; } ob[len] = '\0'; return ob;}faim_internal int aimbs_putraw(aim_bstream_t *bs, const fu8_t *v, int len){ if (aim_bstream_empty(bs) < len) return 0; /* XXX throw an exception */ memcpy(bs->data + bs->offset, v, len); bs->offset += len; return len;}faim_internal int aimbs_putbs(aim_bstream_t *bs, aim_bstream_t *srcbs, int len){ if (aim_bstream_empty(srcbs) < len) return 0; /* XXX throw exception (underrun) */ if (aim_bstream_empty(bs) < len) return 0; /* XXX throw exception (overflow) */ memcpy(bs->data + bs->offset, srcbs->data + srcbs->offset, len); bs->offset += len; srcbs->offset += len; return len;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -