static void _push_array(lua_State *L, pbc_array array, char type, int index) { switch (type) { case 'I': { int v = pbc_array_integer(array, index, NULL); lua_pushinteger(L, v); break; } case 'D': { uint32_t hi = 0; uint32_t low = pbc_array_integer(array, index, &hi); uint64_t v = (uint64_t)hi << 32 | (uint64_t)low; lua_pushinteger(L, v); break; } case 'B': { int v = pbc_array_integer(array, index, NULL); lua_pushboolean(L, v); break; } case 'X': { uint32_t hi = 0; uint32_t low = pbc_array_integer(array, index, &hi); uint64_t v = (uint64_t)low | (uint64_t)hi << 32; lua_pushlstring(L, (char *)&v, 8); break; } case 'R': { double v = pbc_array_real(array, index); lua_pushnumber(L, v); break; } case 'S': { struct pbc_slice * slice = pbc_array_slice(array, index); lua_pushlstring(L, (const char *)slice->buffer,slice->len); break; } case 'M': { struct pbc_slice * slice = pbc_array_slice(array, index); lua_createtable(L,2,0); lua_pushlightuserdata(L,slice->buffer); lua_rawseti(L,-2,1); lua_pushinteger(L,slice->len); lua_rawseti(L,-2,2); break; } } lua_rawseti(L,-2,index+1); }
static void test_pattern_unpack(struct pbc_env *env, struct pbc_slice * slice) { struct person p; int r = pbc_pattern_unpack(pat, slice, &p); if (r>=0) { printf("name = %s\n",(const char *)p.name.buffer); printf("id = %d\n",p.id); printf("email = %s\n",(const char *)p.email.buffer); int n = pbc_array_size(p.phone); int i; for (i=0;i<n;i++) { struct pbc_slice * bytes = pbc_array_slice(p.phone, i); struct person_phone pp; pbc_pattern_unpack(pat_phone , bytes , &pp); printf("\tnumber = %s\n" , (const char*)pp.number.buffer); printf("\ttype = %d\n" , pp.type); } n = pbc_array_size(p.test); for (i=0;i<n;i++) { printf("test[%d] = %d\n",i, pbc_array_integer(p.test, i , NULL)); } pbc_pattern_close_arrays(pat,&p); } }