2021SC@SDUSC
decoder.c分析
zbar_decoder_get_configs方法,其中调用了decoder_get_configp方法,获取传入的译码器的config参数,并赋给指针变量,方法返回指针变量指向内存的值。
unsigned int zbar_decoder_get_configs (const zbar_decoder_t *dcode,
zbar_symbol_type_t sym)
{
const unsigned *config = decoder_get_configp(dcode, sym);
if(!config)
return(0);
return(*config);
}
decoder_set_config_int方法,根据条形码类型,通过输入val参数,对解码器CFG变量进行赋值。
static inline int decoder_set_config_int (zbar_decoder_t *dcode,
zbar_symbol_type_t sym,
zbar_config_t cfg,
int val)
{
switch(sym) {
#ifdef ENABLE_I25
case ZBAR_I25:
CFG(dcode->i25, cfg) = val;
break;
#endif
#ifdef ENABLE_CODABAR
case ZBAR_CODABAR:
CFG(dcode->codabar, cfg) = val;
break;
#endif
#ifdef ENABLE_CODE39
case ZBAR_CODE39:
CFG(dcode->code39, cfg) = val;
break;
#endif
#ifdef ENABLE_CODE93
case ZBAR_CODE93:
CFG(dcode->code93, cfg) = val;
break;
#endif
#ifdef ENABLE_CODE128
case ZBAR_CODE128:
CFG(dcode->code128, cfg) = val;
break;
#endif
#ifdef ENABLE_PDF417
case ZBAR_PDF417:
CFG(dcode->pdf417, cfg) = val;
break;
#endif
default:
return(1);
}
return(0);
}
decoder_set_config_bool方法,通过输入的译码器,cfg,val变量,对config进行比较判断,对val的值进行判断,若为0,通过指针对译码器的config变量进行赋值:先将cfg各二进制数左移1位,按位取反,与config按位与后赋值;若为1,通过指针对译码器的config变量进行赋值:先将cfg各二进制数左移1位,按位取反,与config按位或后赋值。
static inline int decoder_set_config_bool (zbar_decoder_t *dcode,
zbar_symbol_type_t sym,
zbar_config_t cfg,
int val)
{
unsigned *config = (void*)decoder_get_configp(dcode, sym);
if(!config || cfg >= ZBAR_CFG_NUM)
return(1);
if(!val)
*config &= ~(1 << cfg);
else if(val == 1)
*config |= (1 << cfg);
else
return(1);
#ifdef ENABLE_EAN
dcode->ean.enable = TEST_CFG(dcode->ean.ean13_config |
dcode->ean.ean2_config |
dcode->ean.ean5_config |
dcode->ean.ean8_config |
dcode->ean.upca_config |
dcode->ean.upce_config |
dcode->ean.isbn10_config |
dcode->ean.isbn13_config,
ZBAR_CFG_ENABLE);
#endif
return(0);
}