Bugfix & enhancement in rpn_if
This commit is contained in:
parent
45c1e4e3a8
commit
5d0f8519fd
5 changed files with 103 additions and 18 deletions
5
rpn_if.c
5
rpn_if.c
|
|
@ -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
|
||||
|
|
|
|||
3
rpn_if.h
3
rpn_if.h
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 ) */
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue