static ssize_t data_triplet_format_t_lookup(data_t *data, fastcall_crud *fargs) { // {{{ ssize_t ret; uintmax_t offset; data_t converted; data_t d_key; data_t *d_key_ptr = &d_key; data_t storage_item; triplet_format_t *fdata = (triplet_format_t *)data->ptr; // fetch value from storage data_t sl_key = DATA_SLICET(fargs->key, 1, ~0); fastcall_lookup r_lookup = { { 4, ACTION_LOOKUP }, &sl_key, &storage_item }; if( (ret = data_query(&fdata->storage, &r_lookup)) < 0) return ret; // get offset for this data if(helper_key_current(fargs->key, &d_key) < 0) { d_key_ptr = fargs->key; data_get(ret, TYPE_UINTT, offset, d_key_ptr); } else { data_get(ret, TYPE_UINTT, offset, d_key_ptr); data_free(&d_key); } if(ret < 0) return ret; data_t sl_value = DATA_SLICET(&storage_item, offset, ~0); fastcall_unpack r_unpack = { { 4, ACTION_UNPACK }, offset == 0 ? &storage_item : &sl_value, &converted, FORMAT(packed) }; if( (ret = data_query(&fdata->slave, &r_unpack)) < 0) goto exit; *fargs->value = converted; exit: data_free(&storage_item); return ret; } // }}}
static ssize_t data_list_t_lookup(data_t *data, fastcall_lookup *fargs){ // {{{ ssize_t ret; uintmax_t key_uint; data_t d_key; data_t *d_key_ptr = &d_key; list_t *fdata = (list_t *)data->ptr; if(fargs->key == NULL || fargs->value == NULL) return -EINVAL; if(helper_key_current(fargs->key, &d_key) < 0) d_key_ptr = fargs->key; data_get(ret, TYPE_UINTT, key_uint, d_key_ptr); if(ret == 0){ ctx_lookup ctx = { key_uint }; if(list_t_enum(fdata, (list_t_callback)&iter_list_t_lookup, &ctx) != 0) return data_notconsumable_t(fargs->value, ctx.output); } return -EINVAL; } // }}}
ssize_t data_default_control (data_t *data, fastcall_control *fargs){ // {{{ switch(fargs->function){ case HK(datatype):; data_t d_type = DATA_PTR_DATATYPET(&data->type); fastcall_convert_from r_convert = { { 5, ACTION_CONVERT_FROM }, &d_type, FORMAT(native) }; return data_query(fargs->value, &r_convert); case HK(data):; data_t d_key = DATA_VOID; if(fargs->key && helper_key_current(fargs->key, &d_key) == 0){ // expect only empty key data_free(&d_key); return -EINVAL; } fargs->value = data; return 0; default: break; }; return -ENOSYS; } // }}}