decimal32 * decimal32FromNumber (decimal32 *d32, const decNumber *dn, decContext *set) { /* decimal32 and _Decimal32 are different types. */ union { _Decimal32 _Dec; decimal32 dec; } u; __dpd32FromNumber (d32, dn, set); /* __dpd32FromNumber returns in big endian. But _dpd_to_bid32 takes host endian. */ __ieee_to_host_32 (*d32, &u._Dec); /* Convert DPD to BID. */ _dpd_to_bid32 (&u._Dec, &u._Dec); /* dfp.c is in bid endian. */ __host_to_ieee_32 (u._Dec, &u.dec); /* d32 is returned as a pointer to _Decimal32 here. */ *d32 = u.dec; return d32; }
void foo (_Decimal32 arg) { decNumber dn; decimal32 d32; __host_to_ieee_32 (arg, &d32); __decimal32ToNumber (&d32, &dn); }
int isinfd32 (_Decimal32 arg) { decNumber dn; decimal32 d32; __host_to_ieee_32 (arg, &d32); decimal32ToNumber (&d32, &dn); return (decNumberIsInfinite (&dn)); }
decNumber * decimal32ToNumber (const decimal32 *bid32, decNumber *dn) { /* decimal32 and _Decimal32 are different types. */ union { _Decimal32 _Dec; decimal32 dec; } u; /* bid32 is a pointer to _Decimal32 in bid endian. But _bid_to_dpd32 takes host endian. */ __ieee_to_host_32 (*bid32, &u._Dec); /* Convert BID to DPD. */ _bid_to_dpd32 (&u._Dec, &u._Dec); /* __dpd32ToNumber is in bid endian. */ __host_to_ieee_32 (u._Dec, &u.dec); return __dpd32ToNumber (&u.dec, dn); }