1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
zxuchr* zx_vluMulEq( zxuchr *src, size_t sbits, zxuchr *val, size_t vbits )
{
size_t s = 0, pi = 0, I = 0, end = 0;
zxumax ssize = sbits, vsize = vbits;
zxuchr *des = NULL, *tmp = NULL, bit = zxLastCharBit;
if ( !src || !sbits )
return src;
if ( !val || !vbits )
{
for ( ; s < sbits; s += CHAR_BIT, ++I )
src[ I ] = 0u;
return src;
}
if ( zx_udiv( &ssize, 2 ) )
++ssize;
if ( zx_udiv( &vsize, 2 ) )
++vsize;
des = (zxuchr*)malloc( (size_t)ssize );
for ( ; s < sbits; s += CHAR_BIT, ++I )
des[ I ] = 0u;
for ( pi = sbits, s = pi - 1, I = (size_t)(vsize - 1); s != pi; --s, --pi )
{
if ( val[ I ] & bit )
{
tmp = zx_vluMvl( src, sbits, s );
zx_vluAddEq( des, sbits, tmp, sbits );
free( tmp );
}
bit >>= 1;
if ( !bit )
{
bit = zxLastCharBit;
--I;
}
}
for ( s = 0, I = 0; s < sbits; ++I, s+= CHAR_BIT )
src[ I ] = des[ I ];
free( des );
return src;
}
|