static bool udf_arglist_foreach(const as_list * l, as_list_foreach_callback callback, void * context) { as_msg_field * field = (as_msg_field *) l->data; if ( field != NULL ) { as_unpacker unpacker; unpacker.buffer = (const unsigned char*)field->data; unpacker.length = as_msg_field_get_value_sz(field); unpacker.offset = 0; if ( unpacker.length == 0 ) return true; as_val* val = 0; int ret = as_unpack_val(&unpacker, &val); if (ret == 0 && as_val_type(val) == AS_LIST) { as_list_iterator list_iter; as_iterator* iter = (as_iterator*) &list_iter; as_list_iterator_init(&list_iter, (as_list*)val); while (as_iterator_has_next(iter)) { const as_val* v = as_iterator_next(iter); callback((as_val *) v, context); } as_iterator_destroy(iter); } as_val_destroy(val); return ret == 0; } return true; }
/** * Generator for map.values() */ static int mod_lua_map_values_next(lua_State * l) { as_iterator * iter = mod_lua_toiterator(l, 1); if ( iter && as_iterator_has_next(iter) ) { as_pair * pair = (as_pair *) as_iterator_next(iter); if ( pair ) { mod_lua_pushval(l, pair->_2); return 1; } } return 0; }