From 61e74e7ab28ddb64e08f9cf31b82d1a7b1bf42c5 Mon Sep 17 00:00:00 2001 From: Yann Weber Date: Mon, 30 Mar 2020 09:52:16 +0200 Subject: [PATCH] Adds ifs function implementations (begining) --- rpn_if_default.c | 45 +++++++++++----------- rpn_ifs.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 21 deletions(-) create mode 100644 rpn_ifs.c diff --git a/rpn_if_default.c b/rpn_if_default.c index 4892063..fd09d50 100644 --- a/rpn_if_default.c +++ b/rpn_if_default.c @@ -7,7 +7,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args) rpn_if_default_data_t *data; rpn_value_t *values; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; switch(data->pos_flag) { @@ -24,7 +24,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args) cur_arg = *(data->size_lim); break; } - if(cur_arg > rif->params.rpn_argc) + if(cur_arg > rif->params->rpn_argc) { /* Too many arguments for given rif !! */ return -1; @@ -50,7 +50,7 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args) } break; case RPN_IF_RES_XFUN: - for(i=0; i < rif->params.rpn_sz - cur_arg; i++) + for(i=0; i < rif->params->rpn_sz - cur_arg; i++) { args[cur_arg+i] = values[i]; } @@ -62,36 +62,38 @@ int rpn_if_argf_default(rpn_if_t *rif, size_t pos, rpn_value_t *args) return -1; } -int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data) +int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *res) { rpn_if_default_data_t *data; size_t cur_arg, i, rgb_imax; + rpn_value_t *values; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; switch(data->pos_flag) { case RPN_IF_POSITION_LINEAR: - rpn_if_resf_linear(rif, pos, data); + rpn_if_resf_linear(rif, pos, res); cur_arg = 1; break; case RPN_IF_POSITION_XY: - rpn_if_resf_xy(rif, pos, data); + rpn_if_resf_xy(rif, pos, res); cur_arg = 2; break; case RPN_IF_POSITION_XDIM: - rpn_if_resf_xdim(rif, pos, data); + rpn_if_resf_xdim(rif, pos, res); cur_arg = *(data->size_lim); break; } - if(cur_arg > rif->params.rpn_argc) + if(cur_arg > rif->params->rpn_argc) { /** LOG ERROR ! should never append... */ return -1; } rgb_imax = 3; /* rgba */ - values = rpn_if_getimtem(rif, pos); - siwtch(data->res-flag) + values = rpn_if_getitem(rif, *pos); + /**@todo if(res) set the values in res too ! */ + switch(data->res_flag) { case RPN_IF_RES_BOOL: *values = 1; @@ -102,12 +104,12 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data) break; case RPN_IF_RES_COUNT: - *values++; - beak; + (*values)++; + break; case RPN_IF_RES_CONST_RGBA: rgb_imax = 4; - case RPN_IF_RES_CONST_RGB: + //case RPN_IF_RES_CONST_RGB: for(i=0;iconst_val[i]; @@ -124,7 +126,7 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data) break; case RPN_IF_RES_XFUN: - for(i=0; iparams.rpn_sz - cur_arg; i++) + for(i=0; iparams->rpn_sz - cur_arg; i++) { values[i] = rif->rpn_res[cur_arg+i]; } @@ -134,12 +136,13 @@ int rpn_if_resf_default(rpn_if_t *rif, size_t *pos, rpn_value_t *data) /* LOG ERROR */ return -1; } + return 0; } int rpn_if_argf_linear(rpn_if_t *rif, size_t pos, rpn_value_t *args) { rpn_if_default_data_t *data; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; if(data->size_lim && pos >= *data->size_lim) { if(data->pos_flag & RPN_IF_POSITION_OF_ERR) @@ -156,7 +159,7 @@ int rpn_if_resf_linear(rpn_if_t *rif, size_t *pos, rpn_value_t *_data) { rpn_if_default_data_t *data; size_t res; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; res = rif->rpn_res[0]; if(data->size_lim && res >= *data->size_lim) { @@ -174,7 +177,7 @@ int rpn_if_argf_xy(rpn_if_t *rif, size_t pos, rpn_value_t *args) { rpn_if_default_data_t *data; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; if(!data->size_lim) { return -1; @@ -197,7 +200,7 @@ int rpn_if_resf_xy(rpn_if_t *rif, size_t *pos, rpn_value_t *_data) rpn_if_default_data_t *data; size_t xy[2]; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; xy[0] = rif->rpn_res[0]; xy[1] = rif->rpn_res[1]; @@ -225,7 +228,7 @@ int rpn_if_argf_xdim(rpn_if_t *rif, size_t pos, rpn_value_t *args) rpn_if_default_data_t *data; size_t i, curdim_sz, curpos; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; if(!data->size_lim) { @@ -262,7 +265,7 @@ int rpn_if_resf_xdim(rpn_if_t *rif, size_t *pos, rpn_value_t *_data) rpn_if_default_data_t *data; size_t i, res, cur, curlim, prevlim; - data = (rpn_if_default_data_t*)rif->params.data; + data = (rpn_if_default_data_t*)rif->params->data; res = 0; if(!data->size_lim) diff --git a/rpn_ifs.c b/rpn_ifs.c new file mode 100644 index 0000000..f4f5b06 --- /dev/null +++ b/rpn_ifs.c @@ -0,0 +1,97 @@ +#include "rpn_ifs.h" + +rpn_ifs_t* rpn_ifs_new(rpn_if_param_t *params, rpn_value_t *memmap) +{ + rpn_ifs_t *res; + int err; + + if(!(res = malloc(sizeof(rpn_ifs_t)))) + { + goto error; + } + bzero(res, sizeof(rpn_ifs_t)); + + memcpy(&(res->params), params, sizeof(rpn_if_param_t)); + + if(memmap) + { + res->self_mem = 0; + res->mem = memmap; + } + else + { + res->self_mem = 1; + res->mem = mmap(NULL, params->mem_sz, PROT_READ|PROT_WRITE, MAP_ANON, + -1, 0); + if(res->mem == (void*)-1) + { + goto mmap_err; + } + } + + return res; + + mmap_err: + err = errno; + free(res); + error: + err = errno; + errno = err; + return NULL; +} + +void rpn_ifs_free(rpn_ifs_t *rifs) +{ + while(rifs->if_sz) + { + rpn_if_free(rifs->rpn_if[--(rifs->if_sz)]); + } + if(rifs->self_mem) + { + munmap(rifs->mem, rifs->params.mem_sz); + } + if(rifs->rpn_if) + { + free(rifs->rpn_if); + } + if(rifs->weight) + { + free(rifs->weight); + } +} + +size_t rpn_ifs_add_if(rpn_ifs_t *rifs, rpn_expr_t **exprs, unsigned int weight) +{ + size_t res; + void *tmp; + + res = rifs->if_sz + 1; + + if(!(tmp = realloc(rifs->rpn_if, sizeof(rpn_if_t*) * res))) + { + return 0; + } + rifs->rpn_if = tmp; + + if(!(tmp = realloc(rifs->weight, sizeof(unsigned int) * res))) + { + return 0; + } + rifs->weight = tmp; + + rifs->weight[rifs->if_sz] = weight; + //WRONG expr ARGUMENT !!! + rifs->rpn_if[rifs->if_sz] = rpn_if_new(&(rifs->params), *exprs, rifs->mem); + if(!rifs->rpn_if[rifs->if_sz]) + { + return 0; + } + + rifs->if_sz++; + if(rpn_ifs_weight_update(rifs) < 0) + { + rpn_ifs_del_if(rifs, res); // don't attempt to ceck for errors.. + return 0; + } + return res; +}