1 /* Copyright (C) 2007-2018 Free Software Foundation, Inc. 2 3 This file is part of GCC. 4 5 GCC is free software; you can redistribute it and/or modify it under 6 the terms of the GNU General Public License as published by the Free 7 Software Foundation; either version 3, or (at your option) any later 8 version. 9 10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY 11 WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 for more details. 14 15 Under Section 7 of GPL version 3, you are granted additional 16 permissions described in the GCC Runtime Library Exception, version 17 3.1, as published by the Free Software Foundation. 18 19 You should have received a copy of the GNU General Public License and 20 a copy of the GCC Runtime Library Exception along with this program; 21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 22 <http://www.gnu.org/licenses/>. */ 23 24 #define decimal64FromString __dpd64FromString 25 #define decimal64ToString __dpd64ToString 26 #define decimal64ToEngString __dpd64ToEngString 27 #define decimal64FromNumber __dpd64FromNumber 28 #define decimal64ToNumber __dpd64ToNumber 29 30 #include "dpd/decimal64.c" 31 32 #undef decimal64FromString 33 #undef decimal64ToString 34 #undef decimal64ToEngString 35 #undef decimal64FromNumber 36 #undef decimal64ToNumber 37 38 #include "bid-dpd.h" 39 40 #ifdef IN_LIBGCC2 41 #define decimal64FromString __decimal64FromString 42 #define decimal64ToString __decimal64ToString 43 #define decimal64ToEngString __decimal64ToEngString 44 #define decimal64FromNumber __decimal64FromNumber 45 #define decimal64ToNumber __decimal64ToNumber 46 #endif 47 48 decimal64 *decimal64FromString (decimal64 *, const char *, decContext *); 49 char *decimal64ToString (const decimal64 *, char *); 50 char *decimal64ToEngString (const decimal64 *, char *); 51 decimal64 *decimal64FromNumber (decimal64 *, const decNumber *, decContext *); 52 decNumber *decimal64ToNumber (const decimal64 *, decNumber *); 53 54 void __host_to_ieee_64 (_Decimal64 in, decimal64 *out); 55 void __ieee_to_host_64 (decimal64 in, _Decimal64 *out); 56 57 decimal64 * 58 decimal64FromNumber (decimal64 *d64, const decNumber *dn, 59 decContext *set) 60 { 61 /* decimal64 and _Decimal64 are different types. */ 62 union 63 { 64 _Decimal64 _Dec; 65 decimal64 dec; 66 } u; 67 68 __dpd64FromNumber (d64, dn, set); 69 70 /* __dpd64FromNumber returns in big endian. But _dpd_to_bid64 takes 71 host endian. */ 72 __ieee_to_host_64 (*d64, &u._Dec); 73 74 /* Convert DPD to BID. */ 75 _dpd_to_bid64 (&u._Dec, &u._Dec); 76 77 /* dfp.c is in bid endian. */ 78 __host_to_ieee_64 (u._Dec, &u.dec); 79 80 /* d64 is returned as a pointer to _Decimal64 here. */ 81 *d64 = u.dec; 82 83 return d64; 84 } 85 86 decNumber * 87 decimal64ToNumber (const decimal64 *bid64, decNumber *dn) 88 { 89 /* decimal64 and _Decimal64 are different types. */ 90 union 91 { 92 _Decimal64 _Dec; 93 decimal64 dec; 94 } u; 95 96 /* bid64 is a pointer to _Decimal64 in bid endian. But _bid_to_dpd64 97 takes host endian. */ 98 __ieee_to_host_64 (*bid64, &u._Dec); 99 100 /* Convert BID to DPD. */ 101 _bid_to_dpd64 (&u._Dec, &u._Dec); 102 103 /* __dpd64ToNumber is in bid endian. */ 104 __host_to_ieee_64 (u._Dec, &u.dec); 105 106 return __dpd64ToNumber (&u.dec, dn); 107 } 108 109 char * 110 decimal64ToString (const decimal64 *d64, char *string) 111 { 112 decNumber dn; /* work */ 113 decimal64ToNumber (d64, &dn); 114 decNumberToString (&dn, string); 115 return string; 116 } 117 118 char * 119 decimal64ToEngString (const decimal64 *d64, char *string) 120 { 121 decNumber dn; /* work */ 122 decimal64ToNumber (d64, &dn); 123 decNumberToEngString (&dn, string); 124 return string; 125 } 126 127 decimal64 * 128 decimal64FromString (decimal64 *result, const char *string, 129 decContext *set) 130 { 131 decContext dc; /* work */ 132 decNumber dn; /* .. */ 133 134 decContextDefault (&dc, DEC_INIT_DECIMAL64); /* no traps, please */ 135 dc.round = set->round; /* use supplied rounding */ 136 137 decNumberFromString (&dn, string, &dc); /* will round if needed */ 138 decimal64FromNumber (result, &dn, &dc); 139 if (dc.status != 0) 140 { /* something happened */ 141 decContextSetStatus (set, dc.status); /* .. pass it on */ 142 } 143 return result; 144 } 145