/** * \file */ #ifndef __MONO_DECIMAL_MS_H__ #define __MONO_DECIMAL_MS_H__ typedef struct { // Decimal.cs treats the first two shorts as one long // And they seriable the data so we need to little endian // seriliazation // The wReserved overlaps with Variant's vt member #if G_BYTE_ORDER != G_LITTLE_ENDIAN union { struct { uint8_t sign; uint8_t scale; } u; uint16_t signscale; } u; uint16_t reserved; #else uint16_t reserved; union { struct { uint8_t scale; uint8_t sign; } u; uint16_t signscale; } u; #endif uint32_t Hi32; union { struct { uint32_t Lo32; uint32_t Mid32; } v; uint64_t Lo64; } v; } MonoDecimal; typedef enum { MONO_DECIMAL_CMP_LT=-1, MONO_DECIMAL_CMP_EQ, MONO_DECIMAL_CMP_GT } MonoDecimalCompareResult; MonoDecimalCompareResult mono_decimal_compare (MonoDecimal *left, MonoDecimal *right); void mono_decimal_init_single (MonoDecimal *_this, float value); void mono_decimal_init_double (MonoDecimal *_this, double value); void mono_decimal_floor (MonoDecimal *d); int32_t mono_decimal_get_hash_code (MonoDecimal *d); void mono_decimal_multiply (MonoDecimal *d1, MonoDecimal *d2); void mono_decimal_round (MonoDecimal *d, int32_t decimals); void mono_decimal_tocurrency (MonoDecimal *decimal); double mono_decimal_to_double (MonoDecimal d); int32_t mono_decimal_to_int32 (MonoDecimal d); float mono_decimal_to_float (MonoDecimal d); void mono_decimal_truncate (MonoDecimal *d); void mono_decimal_addsub (MonoDecimal *left, MonoDecimal *right, uint8_t sign); void mono_decimal_divide (MonoDecimal *left, MonoDecimal *right); int mono_decimal_from_number (void *from, MonoDecimal *target); #endif