static ssize_t morph_handler(machine_t *machine, request_t *request){ // {{{ ssize_t ret; hash_t *pipelines; morph_userdata *userdata = (morph_userdata *)machine->userdata; if(userdata->running == 0){ config_t child_config[] = { { 0, DATA_HASHT( hash_inline(request), hash_inline(userdata->machine_config), hash_end )}, hash_end }; if( (ret = pipelines_new(&pipelines, child_config)) < 0) return ret; userdata->running = 1; userdata->machine = pipelines[0].data.ptr; data_set_void(&pipelines[0].data); hash_free(pipelines); if(userdata->pass_first == 0) return 0; } return machine_pass(userdata->machine, request); } // }}}
static ssize_t data_fastcall_t_free(data_t *data, fastcall_free *fargs){ // {{{ fastcall_t *fdata = (fastcall_t *)data->ptr; data_free(&fdata->d_request); data_set_void(data); return 0; } // }}}
void data_complexkey_end_t_destroy (data_t *data){ // {{{ complexkey_end_t *fdata = (complexkey_end_t *)data->ptr; if(fdata){ data_free(&fdata->value); free(fdata); } data_set_void(data); } // }}}
static ssize_t iter_list_t_convert_from(hash_t *hash_item, data_t *ctx){ // {{{ ssize_t ret; list_t *fdata = (list_t *)ctx->ptr; ret = list_t_push(fdata, &hash_item->data); data_set_void(&hash_item->data); return (ret < 0) ? ITER_BREAK : ITER_CONTINUE; } // }}}
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; } // }}}
static ssize_t data_uint16_t_view(data_t *data, fastcall_view *fargs){ // {{{ switch(fargs->format){ case FORMAT(native):; fargs->ptr = &data->ptr; fargs->length = sizeof(uint16_t); data_set_void(&fargs->freeit); return 0; default: break; } return data_default_view(data, fargs); } // }}}
static ssize_t data_machine_t_convert_from(data_t *dst, fastcall_convert_from *fargs){ // {{{ ssize_t ret; char buffer[DEF_BUFFER_SIZE]; if(fargs->src == NULL) return -EINVAL; switch(fargs->format){ case FORMAT(native):; if(fargs->src->type != TYPE_MACHINET) return -EFAULT; dst->ptr = fargs->src->ptr; machine_acquire(dst->ptr); return 0; case FORMAT(hash):; hash_t *config; hash_t *pipelines; data_get(ret, TYPE_HASHT, config, fargs->src); if(ret != 0) return -EINVAL; if( (ret = pipelines_new(&pipelines, config)) < 0) return ret; *dst = pipelines[0].data; data_set_void(&pipelines[0].data); hash_free(pipelines); goto check; case FORMAT(config):; case FORMAT(human):; // TODO data_convert call with FORMAT(native) :( default:; fastcall_read r_read = { { 5, ACTION_READ }, 0, &buffer, sizeof(buffer) - 1 }; if(data_query(fargs->src, &r_read) != 0) return -EFAULT; buffer[r_read.buffer_size] = '\0'; dst->ptr = machine_find(buffer); goto check; } check: if(dst->ptr != NULL) return 0; return -EFAULT; } // }}}
static ssize_t pcre_t_new(pcre_t **pfdata, config_t *config){ // {{{ ssize_t ret; char *cfg_regexp = NULL; int options = 0; int erroffset; const char *errmsg; pcre_t *fdata; if( (fdata = calloc(1, sizeof(pcre_t))) == NULL) return error("calloc returns null"); hash_data_convert(ret, TYPE_STRINGT, cfg_regexp, config, HDK(regexp)); if(ret != 0){ ret = error("regexp not supplied"); goto error; } if( (fdata->re = pcre_compile( cfg_regexp, options, &errmsg, &erroffset, NULL)) == NULL ){ ret = error("regexp compile failed"); goto error; } fdata->options = 0; fdata->data = NULL; data_set_void(&fdata->freeit); *pfdata = fdata; free(cfg_regexp); return 0; error: free(fdata); return ret; } // }}}
ssize_t data_default_view (data_t *data, fastcall_view *fargs){ // {{{ ssize_t ret; switch(fargs->format){ case FORMAT(native):; if(data->ptr == NULL) return -EINVAL; fastcall_length r_len = { { 3, ACTION_LENGTH }, 0, FORMAT(native) }; data_query(data, &r_len); fargs->ptr = data->ptr; fargs->length = r_len.length; data_set_void(&fargs->freeit); return 0; default:; data_t d_view = DATA_RAWT_EMPTY(); fastcall_convert_to r_convert = { { 5, ACTION_CONVERT_TO }, &d_view, fargs->format }; if( (ret = data_query(data, &r_convert)) < 0) return ret; fastcall_view r_view = { { 6, ACTION_VIEW }, FORMAT(native) }; if( (ret = data_query(&d_view, &r_view)) < 0){ data_free(&d_view); return ret; } fargs->ptr = r_view.ptr; fargs->length = r_view.length; fargs->freeit = d_view; return 0; } return -ENOSYS; } // }}}
static ssize_t data_uint16_t_free(data_t *data, fastcall_free *fargs){ // {{{ if(data->ptr != NULL) free(data->ptr); data_set_void(data); return 0; } // }}}
static ssize_t data_complexkey_end_uint_t_free(data_t *data, fastcall_free *fargs){ // {{{ data_set_void(data); return 0; } // }}}
static ssize_t data_list_t_convert_from(data_t *dst, fastcall_convert_from *fargs){ // {{{ ssize_t ret = 0; list_t *fdata; uintmax_t transfered = 0; data_t sl_input = DATA_SLIDERT(fargs->src, 0); switch(fargs->format){ case FORMAT(native): case FORMAT(human): case FORMAT(config):; return data_list_t(dst); case FORMAT(hash):; hash_t *config; data_get(ret, TYPE_HASHT, config, fargs->src); if(ret != 0) return -EINVAL; if((fdata = dst->ptr) == NULL){ if( (fdata = dst->ptr = list_t_alloc()) == NULL) return -ENOMEM; } if(hash_iter(config, (hash_iterator)&iter_list_t_convert_from, dst, 0) != ITER_OK){ list_t_free(dst->ptr); return -EFAULT; } return 0; case FORMAT(packed):; data_t item; data_t d_item = DATA_PTR_DATAT(&item); if((fdata = dst->ptr) == NULL){ if( (fdata = dst->ptr = list_t_alloc()) == NULL) return -ENOMEM; } while(1){ data_set_void(&item); fastcall_convert_from r_convert = { { 5, ACTION_CONVERT_FROM }, &sl_input, FORMAT(packed) }; if( (ret = data_query(&d_item, &r_convert)) < 0) break; data_slider_t_set_offset(&sl_input, r_convert.transfered, SEEK_CUR); if(item.type == TYPE_LISTENDT) break; if( (ret = list_t_push(fdata, &item)) < 0) break; } transfered = data_slider_t_get_offset(&sl_input); break; default: return -ENOSYS; }; if(fargs->header.nargs >= 5) fargs->transfered = transfered; return ret; } // }}}
ssize_t action_crud_copy_output(fastcall_crud *src, fastcall_crud *dest){ // {{{ // FIXME change to holder_consume *dest->key = *src->key; data_set_void(src->key); *dest->value = *src->value; data_set_void(src->value); return 0; } // }}}
ssize_t action_enum_copy_output(fastcall_enum *src, fastcall_enum *dest){ // {{{ // FIXME change to holder_consume *dest->dest = *src->dest; data_set_void(src->dest); return 0; } // }}}
ssize_t action_pop_copy_output(fastcall_pop *src, fastcall_pop *dest){ // {{{ // FIXME change to holder_consume *dest->data = *src->data; data_set_void(src->data); return 0; } // }}}
static ssize_t data_triplet_format_t_free(data_t *data, fastcall_free *fargs) { // {{{ data_triplet_format_t_destroy(data); data_set_void(data); return 0; } // }}}