Skip to content

Commit

Permalink
Decimal64.xs - rewrite _is_neg_zero(), and add explicit casts to _Dec…
Browse files Browse the repository at this point in the history
…imal64
  • Loading branch information
sisyphus committed Mar 5, 2015
1 parent a26172b commit 9366c6f
Showing 1 changed file with 67 additions and 49 deletions.
116 changes: 67 additions & 49 deletions Decimal64.xs
Expand Up @@ -86,21 +86,39 @@ int _is_inf(_Decimal64 x) {
return 0; /* Finite Real */
}

int _is_neg_zero(_Decimal64 x) {
char * buffer;
/* Replaced */
/*
//int _is_neg_zero(_Decimal64 x) {
// char * buffer;
//
// if(x != 0.0DD) return 0;
//
// Newx(buffer, 2, char);
// sprintf(buffer, "%.0f", (double)x);
//
// if(strcmp(buffer, "-0")) {
// Safefree(buffer);
// return 0;
// }
//
// Safefree(buffer);
// return 1;
//}
*/

if(x != 0.0DD) return 0;
int _is_neg_zero(_Decimal64 d64) {

Newx(buffer, 2, char);
sprintf(buffer, "%.0f", (double)x);
int n = sizeof(_Decimal64);
void * p = &d64;

if(strcmp(buffer, "-0")) {
Safefree(buffer);
return 0;
}
if(d64 != 0.0DD) return 0;

Safefree(buffer);
return 1;
#ifdef WE_HAVE_BENDIAN /* Big Endian architecture */
if(((unsigned char*)p)[0] >= 128) return 1;
#else
if(((unsigned char*)p)[n - 1] >= 128) return 1;
#endif
return 0;
}

SV * _is_nan_NV(pTHX_ SV * x) {
Expand Down Expand Up @@ -731,12 +749,12 @@ SV * _overload_add(pTHX_ SV * a, SV * b, SV * third) {
SvREADONLY_on(obj);

if(SvUOK(b)) {
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) + SvUV(b);
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) + (D64)SvUV(b);
return obj_ref;
}

if(SvIOK(b)) {
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) + SvIV(b);
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) + (D64)SvIV(b);
return obj_ref;
}

Expand Down Expand Up @@ -771,12 +789,12 @@ SV * _overload_mul(pTHX_ SV * a, SV * b, SV * third) {
SvREADONLY_on(obj);

if(SvUOK(b)) {
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) * SvUV(b);
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) * (D64)SvUV(b);
return obj_ref;
}

if(SvIOK(b)) {
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) * SvIV(b);
*d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) * (D64)SvIV(b);
return obj_ref;
}

Expand Down Expand Up @@ -811,14 +829,14 @@ SV * _overload_sub(pTHX_ SV * a, SV * b, SV * third) {
SvREADONLY_on(obj);

if(SvUOK(b)) {
if(third == &PL_sv_yes) *d64 = SvUV(b) - *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) - SvUV(b);
if(third == &PL_sv_yes) *d64 = (D64)SvUV(b) - *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) - (D64)SvUV(b);
return obj_ref;
}

if(SvIOK(b)) {
if(third == &PL_sv_yes) *d64 = SvIV(b) - *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) - SvIV(b);
if(third == &PL_sv_yes) *d64 = (D64)SvIV(b) - *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) - (D64)SvIV(b);
return obj_ref;
}

Expand Down Expand Up @@ -878,14 +896,14 @@ SV * _overload_div(pTHX_ SV * a, SV * b, SV * third) {
SvREADONLY_on(obj);

if(SvUOK(b)) {
if(third == &PL_sv_yes) *d64 = SvUV(b) / *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) / SvUV(b);
if(third == &PL_sv_yes) *d64 = (D64)SvUV(b) / *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) / (D64)SvUV(b);
return obj_ref;
}

if(SvIOK(b)) {
if(third == &PL_sv_yes) *d64 = SvIV(b) / *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) / SvIV(b);
if(third == &PL_sv_yes) *d64 = (D64)SvIV(b) / *(INT2PTR(_Decimal64 *, SvIV(SvRV(a))));
else *d64 = *(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) / (D64)SvIV(b);
return obj_ref;
}

Expand All @@ -911,11 +929,11 @@ SV * _overload_add_eq(pTHX_ SV * a, SV * b, SV * third) {
SvREFCNT_inc(a);

if(SvUOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) += SvUV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) += (D64)SvUV(b);
return a;
}
if(SvIOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) += SvIV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) += (D64)SvIV(b);
return a;
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -941,11 +959,11 @@ SV * _overload_mul_eq(pTHX_ SV * a, SV * b, SV * third) {
SvREFCNT_inc(a);

if(SvUOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) *= SvUV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) *= (D64)SvUV(b);
return a;
}
if(SvIOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) *= SvIV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) *= (D64)SvIV(b);
return a;
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -971,11 +989,11 @@ SV * _overload_sub_eq(pTHX_ SV * a, SV * b, SV * third) {
SvREFCNT_inc(a);

if(SvUOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) -= SvUV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) -= (D64)SvUV(b);
return a;
}
if(SvIOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) -= SvIV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) -= (D64)SvIV(b);
return a;
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -1001,11 +1019,11 @@ SV * _overload_div_eq(pTHX_ SV * a, SV * b, SV * third) {
SvREFCNT_inc(a);

if(SvUOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) /= SvUV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) /= (D64)SvUV(b);
return a;
}
if(SvIOK(b)) {
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) /= SvIV(b);
*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) /= (D64)SvIV(b);
return a;
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -1029,12 +1047,12 @@ SV * _overload_div_eq(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_equiv(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -1056,12 +1074,12 @@ SV * _overload_equiv(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_not_equiv(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) != SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) != (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) != SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) != (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}
if(SvPOK(b) && !SvNOK(b)) {
Expand All @@ -1083,12 +1101,12 @@ SV * _overload_not_equiv(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_lt(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}

Expand All @@ -1111,12 +1129,12 @@ SV * _overload_lt(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_gt(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}

Expand All @@ -1139,12 +1157,12 @@ SV * _overload_gt(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_lte(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) <= SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) <= (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) <= SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) <= (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}

Expand All @@ -1167,12 +1185,12 @@ SV * _overload_lte(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_gte(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) >= SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) >= (D64)SvUV(b)) return newSViv(1);
return newSViv(0);
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) >= SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) >= (D64)SvIV(b)) return newSViv(1);
return newSViv(0);
}

Expand All @@ -1195,16 +1213,16 @@ SV * _overload_gte(pTHX_ SV * a, SV * b, SV * third) {
SV * _overload_spaceship(pTHX_ SV * a, SV * b, SV * third) {

if(SvUOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < SvUV(b)) return newSViv(-1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == SvUV(b)) return newSViv(0);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > (D64)SvUV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < (D64)SvUV(b)) return newSViv(-1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == (D64)SvUV(b)) return newSViv(0);
return &PL_sv_undef; /* Math::Decimal64 object (1st arg) is a nan */
}

if(SvIOK(b)) {
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < SvIV(b)) return newSViv(-1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == SvIV(b)) return newSViv(0);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) > (D64)SvIV(b)) return newSViv(1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) < (D64)SvIV(b)) return newSViv(-1);
if(*(INT2PTR(_Decimal64 *, SvIV(SvRV(a)))) == (D64)SvIV(b)) return newSViv(0);
return &PL_sv_undef; /* Math::Decimal64 object (1st arg) is a nan */
}

Expand Down

0 comments on commit 9366c6f

Please sign in to comment.