ssize_t action_query_to_hash(void *userdata, fastcall_query *fargs, f_fast_to_hash callback){ // {{{ request_t r_next[] = { { HK(action), DATA_PTR_ACTIONT( &fargs->header.action ) }, { HK(request), DATA_PTR_HASHT( fargs->request ) }, hash_end }; return callback(userdata, r_next); } // }}}
static ssize_t data_list_t_convert_to(data_t *src, fastcall_convert_to *fargs){ // {{{ ssize_t ret = 0; ssize_t qret; list_chunk_t *chunk; list_t *fdata = (list_t *)src->ptr; data_t sl_output = DATA_SLIDERT(fargs->dest, 0); switch(fargs->format){ case FORMAT(packed):; for(chunk = fdata->head; chunk; chunk = chunk->cnext){ // remove ref_t from top hash_t r_key[] = { { 0, DATA_HASHKEYT(HK(data)) }, hash_end }; data_t d_key = DATA_PTR_HASHT(r_key); fastcall_control r_control = { { 5, ACTION_CONTROL }, HK(data), &d_key, NULL }; if( (ret = data_query(&chunk->data, &r_control)) < 0) break; data_t d_data = DATA_PTR_DATAT(r_control.value); fastcall_convert_to r_convert = { { 5, ACTION_CONVERT_TO }, &sl_output, FORMAT(packed) }; ret = data_query(&d_data, &r_convert); data_slider_t_set_offset(&sl_output, r_convert.transfered, SEEK_CUR); if(ret < 0) break; } // terminate list data_t terminator = { TYPE_LISTENDT, NULL }; data_t d_data = DATA_PTR_DATAT(&terminator); fastcall_convert_to r_convert = { { 5, ACTION_CONVERT_TO }, &sl_output, FORMAT(packed) }; qret = data_query(&d_data, &r_convert); data_slider_t_set_offset(&sl_output, r_convert.transfered, SEEK_CUR); if(qret < 0) ret = qret; break; default: return -ENOSYS; } if(fargs->header.nargs >= 5) fargs->transfered = data_slider_t_get_offset(&sl_output); return ret; } // }}}
static ssize_t implode_request(machine_t *machine, request_t *request){ // {{{ implode_userdata *userdata = (implode_userdata *)machine->userdata; request_t r_next[] = { { userdata->buffer, DATA_PTR_HASHT(request) }, hash_inline(request), hash_end }; return machine_pass(machine, r_next); } // }}}
static ssize_t try_handler(machine_t *machine, request_t *request){ // {{{ ssize_t ret; data_t freeme; request_t *try_request; try_userdata *userdata = (try_userdata *)machine->userdata; try_threaddata *threaddata = thread_data_get(&userdata->thread_data); threaddata->machine = machine; threaddata->request = request; threaddata->ret = 0; data_set_void(&freeme); if(userdata->request == 0){ try_request = request; }else{ if( (ret = get_hash(hash_data_find(request, userdata->request), &freeme, &try_request)) < 0) return ret; } request_t r_next[] = { { userdata->return_to, DATA_MACHINET(userdata->try_end) }, hash_inline(try_request), hash_end }; fastcall_query r_query = { { 3, ACTION_QUERY }, r_next }; if( (ret = data_query(&userdata->machine, &r_query)) < 0){ if(userdata->request == 0){ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_pass); }else{ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(try_request), hash_end }; request_t r_next[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, { userdata->request_out, DATA_PTR_HASHT(r_pass) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_next); } } data_free(&freeme); return threaddata->ret; } // }}}
ssize_t api_unpack_fastcall_output(data_t *input, fastcall_t *output){ // {{{ ssize_t ret; data_t d_request = DATA_PTR_HASHT(NULL); fastcall_convert_from r_convert_from = { { 4, ACTION_CONVERT_FROM }, input, FORMAT(packed) }; if( (ret = data_query(&d_request, &r_convert_from)) < 0) return ret; ret = api_convert_request_to_fastcall(output->hargs, data_get_ptr(&d_request), (f_hash_to_fast)api_unpack_fastcall_output_callback); output->d_request = d_request; return ret; } // }}}
static ssize_t try_end_handler(machine_t *machine, request_t *request){ // {{{ try_userdata *userdata = (try_userdata *)machine->userdata; try_threaddata *threaddata = thread_data_get(&userdata->thread_data); if(userdata->request == 0){ threaddata->ret = machine_pass(threaddata->machine, request); }else{ request_t r_next[] = { { userdata->request_out, DATA_PTR_HASHT(request) }, hash_inline(threaddata->request), hash_end }; threaddata->ret = machine_pass(threaddata->machine, r_next); } return 0; } // }}}
static ssize_t api_pack_fastcall_callback(data_t *output, request_t *request){ // {{{ data_t d_request = DATA_PTR_HASHT(request); fastcall_convert_to r_convert_to = { { 4, ACTION_CONVERT_TO }, output, FORMAT(packed) }; return data_query(&d_request, &r_convert_to); } // }}}