Code:
int _alu_add( alu_t *alu, int num, int val )
{
bool carry = 0;
int ret = _alu_check2( alu, num, val );
alu_reg_t *N, *V;
alu_bit_t n, v = {0};
size_t bits;
if ( ret != 0 )
return ret;
N = alu->regv + num;
V = alu->regv + val;
n = N->init;
v = V->init;
bits = N->upto.b;
for ( ; n.b < bits; alu_bit_inc( &n ), alu_bit_inc( &v ) )
{
if ( carry )
{
if ( (*(n.S) & n.B) )
*(n.S) ^= n.B;
else
{
*(n.S) |= n.B;
carry = false;
}
}
if ( *(v.S) & v.B )
{
if ( *(n.S) & n.B )
{
*(n.S) ^= n.B;
carry = true;
}
else
*(n.S) |= n.B;
}
}
return carry ? EOVERFLOW : 0;
}
int __alu_shl( alu_t *alu, int num, size_t by )
{
alu_reg_t *N;
alu_bit_t n = {0}, v, e;
int ret = _alu_check1( alu, num );
alu_printf( "ret = %i", ret );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
N = alu->regv + num;
e = N->upto;
n = N->last;
alu_printf( "by = %zu, n.b = %zu", by, n.b );
if ( by > n.b )
{
for ( ; n.b; alu_bit_dec( &n ) )
{
*(n.S) |= n.B;
*(n.S) ^= n.B;
}
return 0;
}
alu_bit_set_bit( &v, N->part, n.b - by );
fprintf( stderr, "%s:%i: N->init.b = %zu, v.b = %zu, n.b = %zu\n",
__FILE__, __LINE__, N->init.b, v.b, n.b );
if ( n.s > v.s )
{
*(n.S) &= (ALU_SEG_MAX << n.p);
while ( n.s > v.s )
{
*(n.S) = 0;
n.s--;
n.S--;
n.b -= ALU_SEG_WIDTH;
}
*(n.S) &= ~(ALU_SEG_MAX << v.p);
}
else
{
for ( alu_bit_dec( &n ); n.b > v.b; alu_bit_dec( &n ) )
{
*(n.S) |= n.B;
*(n.S) ^= n.B;
}
}
n = N->last;
fprintf( stderr, "%s:%i: N->init.b = %zu, v.b = %zu, n.b = %zu\n",
__FILE__, __LINE__, N->init.b, v.b, n.b );
while ( v.b )
{
alu_bit_dec( &v );
alu_bit_dec( &n );
fprintf( stderr, "v.b = %zu\n", v.b );
if ( *(v.S) & v.B )
{
*(n.S) |= n.B;
*(v.S) ^= v.B;
}
}
return 0;
}
int _alu_shl( alu_t *alu, int num, int val )
{
alu_reg_t *N;
int ret = _alu_check2( alu, num, val ), tmp = -1, cmp;
size_t by = 0, bit;
alu_printf( "ret = %i", ret );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
ret = alu_get_reg( alu, &tmp );
alu_printf( "ret = %i", ret );
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
N = alu->regv + num;
ret = alu_size2reg( alu, tmp, N->upto.b );
alu_printf( "ret = %i", ret );
if ( ret != 0 )
{
alu->buff.qty.used--;
alu_error( ret );
return ret;
}
ret = _alu_cmp( alu, val, tmp, &cmp, &bit );
alu_printf( "ret = %i", ret );
alu->buff.qty.used--;
if ( ret != 0 )
{
alu_error( ret );
return ret;
}
if ( cmp >= 0 )
return __alu_shl( alu, num, -1 );
ret = alu_reg2size( alu, val, &by );
alu_printf( "ret = %i", ret );
if ( ret )
{
alu_error( ret );
return ret;
}
return __alu_shl( alu, num, by );
}
I also attached a zip of the project in case you wanna look for the declaration and/or definition of something