#include "xh_config.h"
#include "xh_core.h"
void
xh_param_assign_string(xh_char_t param[], SV *value)
{
xh_char_t *str;
if ( SvOK(value) ) {
str = XH_CHAR_CAST SvPV_nolen(value);
xh_str_copy(param, str, XH_PARAM_LEN);
}
else {
*param = 0;
}
}
void
xh_param_assign_int(xh_char_t *name, xh_int_t *param, SV *value)
{
if ( !SvOK(value) )
croak("Parameter '%s' is undefined", name);
*param = SvIV(value);
}
xh_bool_t
xh_param_assign_bool(SV *value)
{
if ( SvTRUE(value) )
return TRUE;
return FALSE;
}
void
xh_param_assign_pattern(xh_pattern_t *patt, SV *value)
{
if (patt->expr != NULL) {
SvREFCNT_dec(patt->expr);
patt->expr = NULL;
}
if ( SvOK(value) && SvTRUE(value) ) {
patt->enable = TRUE;
if ( SvRXOK(value) || (SvROK(value) && SvTYPE(SvRV(value)) == SVt_PVAV) ) {
patt->always = FALSE;
patt->expr = value;
SvREFCNT_inc(value);
}
else {
patt->always = TRUE;
}
}
else {
patt->enable = FALSE;
}
}
void
xh_param_assign_filter(xh_pattern_t *patt, SV *value)
{
if (patt->expr != NULL) {
SvREFCNT_dec(patt->expr);
patt->expr = NULL;
}
if ( SvOK(value) ) {
patt->enable = TRUE;
patt->always = FALSE;
patt->expr = value;
SvREFCNT_inc(value);
}
else {
patt->enable = FALSE;
}
}
SV *
xh_param_assign_cb(char *name, SV *value)
{
if ( !SvOK(value) )
return NULL;
if ( !SvROK(value) || SvTYPE(SvRV(value)) != SVt_PVCV)
croak("Parameter '%s' is not CODE reference", name);
value = SvRV(value);
SvREFCNT_inc(value);
return value;
}