static void unpack_table(lua_State *L, struct read_block *rb, int array_size) { if (array_size == MAX_COOKIE-1) { uint8_t type; uint8_t *t = rb_read(rb, sizeof(type)); if (t==NULL) { invalid_stream(L,rb); } type = *t; int cookie = type >> 3; if ((type & 7) != TYPE_NUMBER || cookie == TYPE_NUMBER_REAL) { invalid_stream(L,rb); } array_size = get_integer(L,rb,cookie); }
static void get_buffer(lua_State *L, struct read_block *rb, int len) { char * p = rb_read(rb,len); if (p == NULL) { invalid_stream(L,rb); } lua_pushlstring(L,p,len); }
static lua_Integer get_integer(lua_State *L, struct read_block *rb, int cookie) { switch (cookie) { case TYPE_NUMBER_ZERO: return 0; case TYPE_NUMBER_BYTE: { uint8_t n; uint8_t * pn = rb_read(rb, &n, sizeof(n)); if (pn == NULL) invalid_stream(L, rb); n = *pn; return n; } case TYPE_NUMBER_WORD: { uint16_t n; uint16_t * pn = rb_read(rb, &n, sizeof(n)); if (pn == NULL) invalid_stream(L, rb); memcpy(&n, pn, sizeof(n)); return n; } case TYPE_NUMBER_DWORD: { int32_t n; int32_t * pn = rb_read(rb, &n, sizeof(n)); if (pn == NULL) invalid_stream(L, rb); memcpy(&n, pn, sizeof(n)); return n; } case TYPE_NUMBER_QWORD: { int64_t n; int64_t * pn = rb_read(rb, &n, sizeof(n)); if (pn == NULL) invalid_stream(L, rb); memcpy(&n, pn, sizeof(n)); return n; } default: invalid_stream(L, rb); return 0; } }
static double get_real(lua_State *L, struct read_block *rb) { double n; double * pn = rb_read(rb,sizeof(n)); if (pn == NULL) invalid_stream(L,rb); memcpy(&n, pn, sizeof(n)); return n; }
static void * get_pointer(lua_State *L, struct read_block *rb) { void * userdata = 0; void ** v = (void **)rb_read(rb,&userdata,sizeof(userdata)); if (v == NULL) { invalid_stream(L,rb); } return *v; }