Bugfix & enhancement in rpn_if

This commit is contained in:
Yann Weber 2023-06-07 10:45:11 +02:00
commit 5d0f8519fd
5 changed files with 103 additions and 18 deletions

View file

@ -46,7 +46,8 @@ rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_value_t *memmap)
else
{
res->self_mem = 1;
res->mem = mmap(NULL, params->mem_sz, PROT_READ|PROT_WRITE,
res->mem = mmap(NULL, params->mem_sz * params->value_sz,
PROT_READ|PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0);
if(res->mem == (void*)-1)
{
@ -72,7 +73,7 @@ rpn_if_t* rpn_if_new(const rpn_if_param_t *params, rpn_value_t *memmap)
}
res->rpn_args = &(res->rpn_res[params->rpn_sz]);
res->rpn = malloc(sizeof(rpn_expr_t*) * params->rpn_sz);
res->rpn = malloc(sizeof(rpn_expr_t) * params->rpn_sz);
if(!res->rpn)
{
#if DEBUG

View file

@ -52,7 +52,8 @@ struct rpn_if_param_s
{
/**@brief Memory map size in items */
size_t mem_sz;
/**@brief Size of a memory item */
/**@brief Size of a memory item in bytes (should be a multiple of
sizeof(rpn_value_t))*/
size_t value_sz;
/**@brief RPN expression count */
size_t rpn_sz;

View file

@ -5,19 +5,22 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
{
rpn_if_param_t *res;
rpn_if_default_data_t *data;
size_t lim_sz, const_val_sz, param_sz, rpn_sz, mem_sz, argc, i;
size_t lim_sz, const_val_sz, param_sz, rpn_sz, mem_sz, ndim, value_sz, argc, i;
// Calculating full params + default_data + size_lim + const_val size
short lim_off = 0;
switch(pos_flag)
{
case RPN_IF_POSITION_LINEAR:
lim_sz = 1;
ndim = lim_sz = 1;
break;
case RPN_IF_POSITION_XY:
lim_sz = 2;
ndim = lim_sz = 2;
break;
case RPN_IF_POSITION_XDIM:
lim_sz = *lim;
ndim = lim_sz = *lim;
lim_sz++;
lim_off = 1;
break;
default:
fprintf(stderr,
@ -26,11 +29,11 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
return NULL;
}
mem_sz = 1;
for(i=1;i<lim_sz;i++)
for(i=0;i<ndim;i++)
{
mem_sz *= lim[i];
mem_sz *= lim[i+lim_off];
}
argc = rpn_sz = lim_sz;
argc = rpn_sz = ndim;
lim_sz *= sizeof(size_t);
const_val_sz = 0;
@ -39,29 +42,42 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
case RPN_IF_RES_BOOL:
rpn_sz += 1;
argc += 1;
value_sz = sizeof(rpn_value_t);
break;
case RPN_IF_RES_COUNT:
argc += 1;
value_sz = sizeof(rpn_value_t);
break;
case RPN_IF_RES_XFUN:
rpn_sz += 1;
argc += 1;
value_sz = sizeof(rpn_value_t);
break;
case RPN_IF_RES_RGB:
rpn_sz += 3;
argc += 3;
value_sz = sizeof(rpn_value_t) * 3;
break;
case RPN_IF_RES_RGBA:
rpn_sz += 4;
argc += 4;
value_sz = sizeof(rpn_value_t) * 4;
break;
case RPN_IF_RES_CONST:
const_val_sz = 1;
argc += 1;
value_sz = sizeof(rpn_value_t);
break;
/*
case RPN_IF_RES_CONST_RGB:
const_val_sz = 3;
argc += 3;
break;
*/
case RPN_IF_RES_CONST_RGBA:
const_val_sz = 4;
argc += 4;
value_sz = sizeof(rpn_value_t) * 4;
break;
default:
fprintf(stderr,
@ -93,14 +109,16 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
}
res->data = data = (rpn_if_default_data_t*)(&(res[1]));
data->size_lim = (size_t*)&(data[1]);
data->pos_flag = pos_flag;
data->res_flag = res_flag;
data->ndim = ndim;
data->size_lim = (size_t*)&(data[1]);
data->const_val = ((void*)data->size_lim) + lim_sz;
memcpy(data->size_lim, lim, lim_sz);
if(const_val_sz)
{
data->const_val = (rpn_value_t*)(&(data->size_lim[1]));
memcpy(data->const_val, val, const_val_sz);
}
else
@ -113,13 +131,60 @@ rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
res->rpn_argc = argc;
res->rpn_stack_sz = rpn_stack_sz;
res->value_sz = 1; /* @TODO set res->value_sz with a good value.. */
res->mem_sz = mem_sz * res->value_sz;
res->value_sz = value_sz;
res->mem_sz = mem_sz;
res->rpn_sz = rpn_sz;
return res;
}
int rpn_if_sizes_from_flag(short pos_flag, short res_flag, short sizes[2])
{
short *lim_sz = &sizes[0];
short *const_sz = &sizes[1];
*lim_sz = *const_sz = -1;
switch(pos_flag)
{
case RPN_IF_POSITION_LINEAR:
*lim_sz = 1;
break;
case RPN_IF_POSITION_XY:
*lim_sz = 2;
break;
case RPN_IF_POSITION_XDIM:
*lim_sz = 1;
break;
default:
return -1;
}
switch(res_flag)
{
case RPN_IF_RES_CONST:
*const_sz = 1;
break;
/*
case RPN_IF_RES_CONST_RGB:
*const_sz = 3;
break;
*/
case RPN_IF_RES_CONST_RGBA:
*const_sz = 4;
break;
case RPN_IF_RES_BOOL:
case RPN_IF_RES_COUNT:
case RPN_IF_RES_XFUN:
case RPN_IF_RES_RGB:
case RPN_IF_RES_RGBA:
*const_sz = 0;
break;
default:
return -1;
}
return 0;
}
int rpn_if_getarg_default(rpn_if_t *rif, size_t pos)
{
size_t cur_arg, i, rgb_imax;
@ -215,7 +280,7 @@ int rpn_if_setres_default(rpn_if_t *rif, size_t *pos)
/** LOG ERROR ! should never append... */
return -1;
}
rgb_imax = 3; /* rgba */
rgb_imax = 3; /* rgb */
values = rpn_if_getitem(rif, *pos);
/**@todo if(res) set the values in res too ! */
switch(data->res_flag)

View file

@ -81,7 +81,10 @@ struct rpn_if_default_data_s
*/
size_t *size_lim;
/**@brief Store constant values to set mem giver res_flag
/** Number of dimention (if XDIM ndim = len(size_lim)-1) */
size_t ndim;
/**@brief Store constant values to set mem given res_flag
* - For @ref RPN_IF_RES_CONST const_val points on a single value
* - For @ref RPN_IF_RES_CONST_RGBA const_val points on 4 values
* - Else const_val is set to NULL
@ -94,8 +97,8 @@ struct rpn_if_default_data_s
*
* @param pos_flag Binary OR combination of RPN_IF_POSITION_*
* (@ref ifs_if_default_posflag )
* @param pos_flag Binary OR combination of RPN_IF_RES_*
* (@ref ifs_if_default_posflag )
* @param res_flag Binary OR combination of RPN_IF_RES_*
* (@ref ifs_if_default_resflag )
* @param lim Depends on pos_flag parameter (
* see @ref rpn_if_default_data_s::size_lim )
* @param val Depends on res_flag parameter (
@ -106,6 +109,18 @@ struct rpn_if_default_data_s
rpn_if_param_t* rpn_if_default_params(short pos_flag, short res_flag,
const size_t *lim, const rpn_value_t *val, unsigned char rpn_stack_sz);
/** Fetch size limit and const values array sizes given flag values
* @param pos_flag (@ref ifs_if_default_posflag)
* @param res_flag (@ref ifs_if_default_resflag)
* @param short[2] size limit array size and constant values array size
* @return 0 or -1 if a flag is not valid
* @warning returns 1 for size limit when XDIM position, but actually the
* limit is given by the 1st number in the limit (example : [2,640,480],
* [3,16,640,480], ...)
* @todo replace short by int for sizes
*/
int rpn_if_sizes_from_flag(short pos_flag, short res_flag, short sizes[2]);
/**@brief Default argf function ( see @ref rpn_if_param_s.arg_f ) */
int rpn_if_getarg_default(rpn_if_t *rif, size_t pos);
/**@brief Default result function ( see @ref rpn_if_param_s.res_f ) */

View file

@ -58,6 +58,9 @@
* @todo use it */
typedef unsigned long int rpn_value_t;
#define PyLong_FromRpnValue_t PyLong_FromUnsignedLong
#define PyLong_AsRpnValue_t PyLong_AsUnsignedLong
/**@brief Function heading code
*
* - stack frame creation