Path: blob/main/Modules/_decimal/libmpdec/mpdecimal.h
12 views
/*1* Copyright (c) 2008-2020 Stefan Krah. All rights reserved.2*3* Redistribution and use in source and binary forms, with or without4* modification, are permitted provided that the following conditions5* are met:6*7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions and the following disclaimer.9*10* 2. Redistributions in binary form must reproduce the above copyright11* notice, this list of conditions and the following disclaimer in the12* documentation and/or other materials provided with the distribution.13*14* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS "AS IS" AND15* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE16* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE17* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE18* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL19* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS20* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)21* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT22* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY23* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF24* SUCH DAMAGE.25*/262728#ifndef LIBMPDEC_MPDECIMAL_H_29#define LIBMPDEC_MPDECIMAL_H_303132#ifndef _MSC_VER33#include "pyconfig.h"34#endif3536#ifdef __cplusplus37#include <cinttypes>38#include <climits>39#include <cstdint>40#include <cstdio>41#include <cstdlib>42#define MPD_UINT8_C(x) (static_cast<uint8_t>(x))43extern "C" {44#else45#include <inttypes.h>46#include <limits.h>47#include <stdint.h>48#include <stdio.h>49#include <stdlib.h>50#define MPD_UINT8_C(x) ((uint8_t)x)51#endif525354#if (defined(__linux__) || defined(__FreeBSD__) || defined(__APPLE__)) && \55defined(__GNUC__) && __GNUC__ >= 4 && !defined(__INTEL_COMPILER)56#define MPD_PRAGMA(x) _Pragma(x)57#define MPD_HIDE_SYMBOLS_START "GCC visibility push(hidden)"58#define MPD_HIDE_SYMBOLS_END "GCC visibility pop"59#else60#define MPD_PRAGMA(x)61#define MPD_HIDE_SYMBOLS_START62#define MPD_HIDE_SYMBOLS_END63#endif6465#if defined(_MSC_VER)66#define EXTINLINE extern inline67#else68#define EXTINLINE69#endif707172/* This header file is internal for the purpose of building _decimal.so.73* All symbols should have local scope in the DSO. */74MPD_PRAGMA(MPD_HIDE_SYMBOLS_START)757677/******************************************************************************/78/* Version */79/******************************************************************************/8081#define MPD_MAJOR_VERSION 282#define MPD_MINOR_VERSION 583#define MPD_MICRO_VERSION 18485#define MPD_VERSION "2.5.1"8687#define MPD_VERSION_HEX ((MPD_MAJOR_VERSION << 24) | \88(MPD_MINOR_VERSION << 16) | \89(MPD_MICRO_VERSION << 8))9091const char *mpd_version(void);929394/******************************************************************************/95/* Configuration */96/******************************************************************************/9798#if defined(UNIVERSAL)99#if defined(CONFIG_64) || defined(CONFIG_32)100#error "cannot use CONFIG_64 or CONFIG_32 with UNIVERSAL."101#endif102#if defined(__ppc__)103#define CONFIG_32104#define ANSI105#elif defined(__ppc64__)106#define CONFIG_64107#define ANSI108#elif defined(__i386__)109#define CONFIG_32110#define ANSI111#elif defined(__x86_64__)112#define CONFIG_64113#define ASM114#elif defined(__arm64__)115#define CONFIG_64116#define ANSI117#else118#error "unknown architecture for universal build."119#endif120#endif121122123/* BEGIN CONFIG_64 */124#if defined(CONFIG_64)125/* types for modular and base arithmetic */126#define MPD_UINT_MAX UINT64_MAX127#define MPD_BITS_PER_UINT 64128typedef uint64_t mpd_uint_t; /* unsigned mod type */129130#define MPD_SIZE_MAX SIZE_MAX131typedef size_t mpd_size_t; /* unsigned size type */132133/* type for exp, digits, len, prec */134#define MPD_SSIZE_MAX INT64_MAX135#define MPD_SSIZE_MIN INT64_MIN136typedef int64_t mpd_ssize_t;137#define _mpd_strtossize strtoll138139/* decimal arithmetic */140#define MPD_RADIX 10000000000000000000ULL /* 10**19 */141#define MPD_RDIGITS 19142#define MPD_MAX_POW10 19143#define MPD_EXPDIGITS 19 /* MPD_EXPDIGITS <= MPD_RDIGITS+1 */144145#define MPD_MAXTRANSFORM_2N 4294967296ULL /* 2**32 */146#define MPD_MAX_PREC 999999999999999999LL147#define MPD_MAX_PREC_LOG2 64148#define MPD_ELIMIT 1000000000000000000LL149#define MPD_MAX_EMAX 999999999999999999LL /* ELIMIT-1 */150#define MPD_MIN_EMIN (-999999999999999999LL) /* -EMAX */151#define MPD_MIN_ETINY (MPD_MIN_EMIN-(MPD_MAX_PREC-1))152#define MPD_EXP_INF 2000000000000000001LL153#define MPD_EXP_CLAMP (-4000000000000000001LL)154#define MPD_MAXIMPORT 105263157894736842L /* ceil((2*MPD_MAX_PREC)/MPD_RDIGITS) */155#define MPD_IEEE_CONTEXT_MAX_BITS 512 /* 16*(log2(MPD_MAX_EMAX / 3)-3) */156157/* conversion specifiers */158#define PRI_mpd_uint_t PRIu64159#define PRI_mpd_ssize_t PRIi64160/* END CONFIG_64 */161162163/* BEGIN CONFIG_32 */164#elif defined(CONFIG_32)165/* types for modular and base arithmetic */166#define MPD_UINT_MAX UINT32_MAX167#define MPD_BITS_PER_UINT 32168typedef uint32_t mpd_uint_t; /* unsigned mod type */169170#ifndef LEGACY_COMPILER171#define MPD_UUINT_MAX UINT64_MAX172typedef uint64_t mpd_uuint_t; /* double width unsigned mod type */173#endif174175#define MPD_SIZE_MAX SIZE_MAX176typedef size_t mpd_size_t; /* unsigned size type */177178/* type for dec->len, dec->exp, ctx->prec */179#define MPD_SSIZE_MAX INT32_MAX180#define MPD_SSIZE_MIN INT32_MIN181typedef int32_t mpd_ssize_t;182#define _mpd_strtossize strtol183184/* decimal arithmetic */185#define MPD_RADIX 1000000000UL /* 10**9 */186#define MPD_RDIGITS 9187#define MPD_MAX_POW10 9188#define MPD_EXPDIGITS 10 /* MPD_EXPDIGITS <= MPD_RDIGITS+1 */189190#define MPD_MAXTRANSFORM_2N 33554432UL /* 2**25 */191#define MPD_MAX_PREC 425000000L192#define MPD_MAX_PREC_LOG2 32193#define MPD_ELIMIT 425000001L194#define MPD_MAX_EMAX 425000000L /* ELIMIT-1 */195#define MPD_MIN_EMIN (-425000000L) /* -EMAX */196#define MPD_MIN_ETINY (MPD_MIN_EMIN-(MPD_MAX_PREC-1))197#define MPD_EXP_INF 1000000001L /* allows for emax=999999999 in the tests */198#define MPD_EXP_CLAMP (-2000000001L) /* allows for emin=-999999999 in the tests */199#define MPD_MAXIMPORT 94444445L /* ceil((2*MPD_MAX_PREC)/MPD_RDIGITS) */200#define MPD_IEEE_CONTEXT_MAX_BITS 256 /* 16*(log2(MPD_MAX_EMAX / 3)-3) */201202/* conversion specifiers */203#define PRI_mpd_uint_t PRIu32204#define PRI_mpd_ssize_t PRIi32205/* END CONFIG_32 */206207#else208#error "define CONFIG_64 or CONFIG_32"209#endif210/* END CONFIG */211212213#if MPD_SIZE_MAX != MPD_UINT_MAX214#error "unsupported platform: need mpd_size_t == mpd_uint_t"215#endif216217218/******************************************************************************/219/* Context */220/******************************************************************************/221222enum {223MPD_ROUND_UP, /* round away from 0 */224MPD_ROUND_DOWN, /* round toward 0 (truncate) */225MPD_ROUND_CEILING, /* round toward +infinity */226MPD_ROUND_FLOOR, /* round toward -infinity */227MPD_ROUND_HALF_UP, /* 0.5 is rounded up */228MPD_ROUND_HALF_DOWN, /* 0.5 is rounded down */229MPD_ROUND_HALF_EVEN, /* 0.5 is rounded to even */230MPD_ROUND_05UP, /* round zero or five away from 0 */231MPD_ROUND_TRUNC, /* truncate, but set infinity */232MPD_ROUND_GUARD233};234235enum { MPD_CLAMP_DEFAULT, MPD_CLAMP_IEEE_754, MPD_CLAMP_GUARD };236237extern const char * const mpd_round_string[MPD_ROUND_GUARD];238extern const char * const mpd_clamp_string[MPD_CLAMP_GUARD];239240241typedef struct mpd_context_t {242mpd_ssize_t prec; /* precision */243mpd_ssize_t emax; /* max positive exp */244mpd_ssize_t emin; /* min negative exp */245uint32_t traps; /* status events that should be trapped */246uint32_t status; /* status flags */247uint32_t newtrap; /* set by mpd_addstatus_raise() */248int round; /* rounding mode */249int clamp; /* clamp mode */250int allcr; /* all functions correctly rounded */251} mpd_context_t;252253254/* Status flags */255#define MPD_Clamped 0x00000001U256#define MPD_Conversion_syntax 0x00000002U257#define MPD_Division_by_zero 0x00000004U258#define MPD_Division_impossible 0x00000008U259#define MPD_Division_undefined 0x00000010U260#define MPD_Fpu_error 0x00000020U261#define MPD_Inexact 0x00000040U262#define MPD_Invalid_context 0x00000080U263#define MPD_Invalid_operation 0x00000100U264#define MPD_Malloc_error 0x00000200U265#define MPD_Not_implemented 0x00000400U266#define MPD_Overflow 0x00000800U267#define MPD_Rounded 0x00001000U268#define MPD_Subnormal 0x00002000U269#define MPD_Underflow 0x00004000U270#define MPD_Max_status (0x00008000U-1U)271272/* Conditions that result in an IEEE 754 exception */273#define MPD_IEEE_Invalid_operation (MPD_Conversion_syntax | \274MPD_Division_impossible | \275MPD_Division_undefined | \276MPD_Fpu_error | \277MPD_Invalid_context | \278MPD_Invalid_operation | \279MPD_Malloc_error) \280281/* Errors that require the result of an operation to be set to NaN */282#define MPD_Errors (MPD_IEEE_Invalid_operation | \283MPD_Division_by_zero)284285/* Default traps */286#define MPD_Traps (MPD_IEEE_Invalid_operation | \287MPD_Division_by_zero | \288MPD_Overflow | \289MPD_Underflow)290291/* Official name */292#define MPD_Insufficient_storage MPD_Malloc_error293294/* IEEE 754 interchange format contexts */295#define MPD_DECIMAL32 32296#define MPD_DECIMAL64 64297#define MPD_DECIMAL128 128298299300#define MPD_MINALLOC_MIN 2301#define MPD_MINALLOC_MAX 64302extern mpd_ssize_t MPD_MINALLOC;303extern void (* mpd_traphandler)(mpd_context_t *);304void mpd_dflt_traphandler(mpd_context_t *);305306void mpd_setminalloc(mpd_ssize_t n);307void mpd_init(mpd_context_t *ctx, mpd_ssize_t prec);308309void mpd_maxcontext(mpd_context_t *ctx);310void mpd_defaultcontext(mpd_context_t *ctx);311void mpd_basiccontext(mpd_context_t *ctx);312int mpd_ieee_context(mpd_context_t *ctx, int bits);313314mpd_ssize_t mpd_getprec(const mpd_context_t *ctx);315mpd_ssize_t mpd_getemax(const mpd_context_t *ctx);316mpd_ssize_t mpd_getemin(const mpd_context_t *ctx);317int mpd_getround(const mpd_context_t *ctx);318uint32_t mpd_gettraps(const mpd_context_t *ctx);319uint32_t mpd_getstatus(const mpd_context_t *ctx);320int mpd_getclamp(const mpd_context_t *ctx);321int mpd_getcr(const mpd_context_t *ctx);322323int mpd_qsetprec(mpd_context_t *ctx, mpd_ssize_t prec);324int mpd_qsetemax(mpd_context_t *ctx, mpd_ssize_t emax);325int mpd_qsetemin(mpd_context_t *ctx, mpd_ssize_t emin);326int mpd_qsetround(mpd_context_t *ctx, int newround);327int mpd_qsettraps(mpd_context_t *ctx, uint32_t flags);328int mpd_qsetstatus(mpd_context_t *ctx, uint32_t flags);329int mpd_qsetclamp(mpd_context_t *ctx, int c);330int mpd_qsetcr(mpd_context_t *ctx, int c);331void mpd_addstatus_raise(mpd_context_t *ctx, uint32_t flags);332333334/******************************************************************************/335/* Decimal Arithmetic */336/******************************************************************************/337338/* mpd_t flags */339#define MPD_POS MPD_UINT8_C(0)340#define MPD_NEG MPD_UINT8_C(1)341#define MPD_INF MPD_UINT8_C(2)342#define MPD_NAN MPD_UINT8_C(4)343#define MPD_SNAN MPD_UINT8_C(8)344#define MPD_SPECIAL (MPD_INF|MPD_NAN|MPD_SNAN)345#define MPD_STATIC MPD_UINT8_C(16)346#define MPD_STATIC_DATA MPD_UINT8_C(32)347#define MPD_SHARED_DATA MPD_UINT8_C(64)348#define MPD_CONST_DATA MPD_UINT8_C(128)349#define MPD_DATAFLAGS (MPD_STATIC_DATA|MPD_SHARED_DATA|MPD_CONST_DATA)350351/* mpd_t */352typedef struct mpd_t {353uint8_t flags;354mpd_ssize_t exp;355mpd_ssize_t digits;356mpd_ssize_t len;357mpd_ssize_t alloc;358mpd_uint_t *data;359} mpd_t;360361362/******************************************************************************/363/* Triple */364/******************************************************************************/365366/* status cases for getting a triple */367enum mpd_triple_class {368MPD_TRIPLE_NORMAL,369MPD_TRIPLE_INF,370MPD_TRIPLE_QNAN,371MPD_TRIPLE_SNAN,372MPD_TRIPLE_ERROR,373};374375typedef struct {376enum mpd_triple_class tag;377uint8_t sign;378uint64_t hi;379uint64_t lo;380int64_t exp;381} mpd_uint128_triple_t;382383int mpd_from_uint128_triple(mpd_t *result, const mpd_uint128_triple_t *triple, uint32_t *status);384mpd_uint128_triple_t mpd_as_uint128_triple(const mpd_t *a);385386387/******************************************************************************/388/* Quiet, thread-safe functions */389/******************************************************************************/390391/* format specification */392typedef struct mpd_spec_t {393mpd_ssize_t min_width; /* minimum field width */394mpd_ssize_t prec; /* fraction digits or significant digits */395char type; /* conversion specifier */396char align; /* alignment */397char sign; /* sign printing/alignment */398char fill[5]; /* fill character */399const char *dot; /* decimal point */400const char *sep; /* thousands separator */401const char *grouping; /* grouping of digits */402} mpd_spec_t;403404/* output to a string */405char *mpd_to_sci(const mpd_t *dec, int fmt);406char *mpd_to_eng(const mpd_t *dec, int fmt);407mpd_ssize_t mpd_to_sci_size(char **res, const mpd_t *dec, int fmt);408mpd_ssize_t mpd_to_eng_size(char **res, const mpd_t *dec, int fmt);409int mpd_validate_lconv(mpd_spec_t *spec);410int mpd_parse_fmt_str(mpd_spec_t *spec, const char *fmt, int caps);411char *mpd_qformat_spec(const mpd_t *dec, const mpd_spec_t *spec, const mpd_context_t *ctx, uint32_t *status);412char *mpd_qformat(const mpd_t *dec, const char *fmt, const mpd_context_t *ctx, uint32_t *status);413414#define MPD_NUM_FLAGS 15415#define MPD_MAX_FLAG_STRING 208416#define MPD_MAX_FLAG_LIST (MPD_MAX_FLAG_STRING+18)417#define MPD_MAX_SIGNAL_LIST 121418int mpd_snprint_flags(char *dest, int nmemb, uint32_t flags);419int mpd_lsnprint_flags(char *dest, int nmemb, uint32_t flags, const char *flag_string[]);420int mpd_lsnprint_signals(char *dest, int nmemb, uint32_t flags, const char *signal_string[]);421422/* output to a file */423void mpd_fprint(FILE *file, const mpd_t *dec);424void mpd_print(const mpd_t *dec);425426/* assignment from a string */427void mpd_qset_string(mpd_t *dec, const char *s, const mpd_context_t *ctx, uint32_t *status);428void mpd_qset_string_exact(mpd_t *dec, const char *s, uint32_t *status);429430/* set to NaN with error flags */431void mpd_seterror(mpd_t *result, uint32_t flags, uint32_t *status);432/* set a special with sign and type */433void mpd_setspecial(mpd_t *result, uint8_t sign, uint8_t type);434/* set coefficient to zero or all nines */435void mpd_zerocoeff(mpd_t *result);436void mpd_qmaxcoeff(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);437438/* quietly assign a C integer type to an mpd_t */439void mpd_qset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, uint32_t *status);440void mpd_qset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx, uint32_t *status);441void mpd_qset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, uint32_t *status);442void mpd_qset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t *status);443#ifndef LEGACY_COMPILER444void mpd_qset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status);445void mpd_qset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status);446void mpd_qset_i64_exact(mpd_t *result, int64_t a, uint32_t *status);447void mpd_qset_u64_exact(mpd_t *result, uint64_t a, uint32_t *status);448#endif449450/* quietly assign a C integer type to an mpd_t with a static coefficient */451void mpd_qsset_ssize(mpd_t *result, mpd_ssize_t a, const mpd_context_t *ctx, uint32_t *status);452void mpd_qsset_i32(mpd_t *result, int32_t a, const mpd_context_t *ctx, uint32_t *status);453void mpd_qsset_uint(mpd_t *result, mpd_uint_t a, const mpd_context_t *ctx, uint32_t *status);454void mpd_qsset_u32(mpd_t *result, uint32_t a, const mpd_context_t *ctx, uint32_t *status);455456/* quietly get a C integer type from an mpd_t */457mpd_ssize_t mpd_qget_ssize(const mpd_t *dec, uint32_t *status);458mpd_uint_t mpd_qget_uint(const mpd_t *dec, uint32_t *status);459mpd_uint_t mpd_qabs_uint(const mpd_t *dec, uint32_t *status);460461int32_t mpd_qget_i32(const mpd_t *dec, uint32_t *status);462uint32_t mpd_qget_u32(const mpd_t *dec, uint32_t *status);463#ifndef LEGACY_COMPILER464int64_t mpd_qget_i64(const mpd_t *dec, uint32_t *status);465uint64_t mpd_qget_u64(const mpd_t *dec, uint32_t *status);466#endif467468/* quiet functions */469int mpd_qcheck_nan(mpd_t *nanresult, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);470int mpd_qcheck_nans(mpd_t *nanresult, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);471void mpd_qfinalize(mpd_t *result, const mpd_context_t *ctx, uint32_t *status);472473const char *mpd_class(const mpd_t *a, const mpd_context_t *ctx);474475int mpd_qcopy(mpd_t *result, const mpd_t *a, uint32_t *status);476int mpd_qcopy_cxx(mpd_t *result, const mpd_t *a);477mpd_t *mpd_qncopy(const mpd_t *a);478int mpd_qcopy_abs(mpd_t *result, const mpd_t *a, uint32_t *status);479int mpd_qcopy_negate(mpd_t *result, const mpd_t *a, uint32_t *status);480int mpd_qcopy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, uint32_t *status);481482void mpd_qand(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);483void mpd_qinvert(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);484void mpd_qlogb(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);485void mpd_qor(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);486void mpd_qscaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);487void mpd_qxor(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);488int mpd_same_quantum(const mpd_t *a, const mpd_t *b);489490void mpd_qrotate(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);491int mpd_qshiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status);492mpd_uint_t mpd_qshiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, uint32_t *status);493mpd_uint_t mpd_qshiftr_inplace(mpd_t *result, mpd_ssize_t n);494void mpd_qshift(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);495void mpd_qshiftn(mpd_t *result, const mpd_t *a, mpd_ssize_t n, const mpd_context_t *ctx, uint32_t *status);496497int mpd_qcmp(const mpd_t *a, const mpd_t *b, uint32_t *status);498int mpd_qcompare(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);499int mpd_qcompare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);500int mpd_cmp_total(const mpd_t *a, const mpd_t *b);501int mpd_cmp_total_mag(const mpd_t *a, const mpd_t *b);502int mpd_compare_total(mpd_t *result, const mpd_t *a, const mpd_t *b);503int mpd_compare_total_mag(mpd_t *result, const mpd_t *a, const mpd_t *b);504505void mpd_qround_to_intx(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);506void mpd_qround_to_int(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);507void mpd_qtrunc(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);508void mpd_qfloor(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);509void mpd_qceil(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);510511void mpd_qabs(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);512void mpd_qmax(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);513void mpd_qmax_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);514void mpd_qmin(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);515void mpd_qmin_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);516void mpd_qminus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);517void mpd_qplus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);518void mpd_qnext_minus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);519void mpd_qnext_plus(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);520void mpd_qnext_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);521void mpd_qquantize(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);522void mpd_qrescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, const mpd_context_t *ctx, uint32_t *status);523void mpd_qrescale_fmt(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, const mpd_context_t *ctx, uint32_t *status);524void mpd_qreduce(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);525void mpd_qadd(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);526void mpd_qadd_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);527void mpd_qadd_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);528void mpd_qadd_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);529void mpd_qadd_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);530void mpd_qsub(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);531void mpd_qsub_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);532void mpd_qsub_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);533void mpd_qsub_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);534void mpd_qsub_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);535void mpd_qmul(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);536void mpd_qmul_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);537void mpd_qmul_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);538void mpd_qmul_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);539void mpd_qmul_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);540void mpd_qfma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, const mpd_context_t *ctx, uint32_t *status);541void mpd_qdiv(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);542void mpd_qdiv_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, const mpd_context_t *ctx, uint32_t *status);543void mpd_qdiv_i32(mpd_t *result, const mpd_t *a, int32_t b, const mpd_context_t *ctx, uint32_t *status);544void mpd_qdiv_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, const mpd_context_t *ctx, uint32_t *status);545void mpd_qdiv_u32(mpd_t *result, const mpd_t *a, uint32_t b, const mpd_context_t *ctx, uint32_t *status);546void mpd_qdivint(mpd_t *q, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);547void mpd_qrem(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);548void mpd_qrem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);549void mpd_qdivmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, const mpd_context_t *ctx, uint32_t *status);550void mpd_qpow(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_context_t *ctx, uint32_t *status);551void mpd_qpowmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_t *mod, const mpd_context_t *ctx, uint32_t *status);552void mpd_qexp(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);553void mpd_qln10(mpd_t *result, mpd_ssize_t prec, uint32_t *status);554void mpd_qln(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);555void mpd_qlog10(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);556void mpd_qsqrt(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);557void mpd_qinvroot(mpd_t *result, const mpd_t *a, const mpd_context_t *ctx, uint32_t *status);558559#ifndef LEGACY_COMPILER560void mpd_qadd_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);561void mpd_qadd_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);562void mpd_qsub_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);563void mpd_qsub_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);564void mpd_qmul_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);565void mpd_qmul_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);566void mpd_qdiv_i64(mpd_t *result, const mpd_t *a, int64_t b, const mpd_context_t *ctx, uint32_t *status);567void mpd_qdiv_u64(mpd_t *result, const mpd_t *a, uint64_t b, const mpd_context_t *ctx, uint32_t *status);568#endif569570571size_t mpd_sizeinbase(const mpd_t *a, uint32_t base);572void mpd_qimport_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen,573uint8_t srcsign, uint32_t srcbase,574const mpd_context_t *ctx, uint32_t *status);575void mpd_qimport_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen,576uint8_t srcsign, uint32_t srcbase,577const mpd_context_t *ctx, uint32_t *status);578size_t mpd_qexport_u16(uint16_t **rdata, size_t rlen, uint32_t base,579const mpd_t *src, uint32_t *status);580size_t mpd_qexport_u32(uint32_t **rdata, size_t rlen, uint32_t base,581const mpd_t *src, uint32_t *status);582583584/******************************************************************************/585/* Signalling functions */586/******************************************************************************/587588char *mpd_format(const mpd_t *dec, const char *fmt, mpd_context_t *ctx);589void mpd_import_u16(mpd_t *result, const uint16_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);590void mpd_import_u32(mpd_t *result, const uint32_t *srcdata, size_t srclen, uint8_t srcsign, uint32_t base, mpd_context_t *ctx);591size_t mpd_export_u16(uint16_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);592size_t mpd_export_u32(uint32_t **rdata, size_t rlen, uint32_t base, const mpd_t *src, mpd_context_t *ctx);593void mpd_finalize(mpd_t *result, mpd_context_t *ctx);594int mpd_check_nan(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);595int mpd_check_nans(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);596void mpd_set_string(mpd_t *result, const char *s, mpd_context_t *ctx);597void mpd_maxcoeff(mpd_t *result, mpd_context_t *ctx);598void mpd_sset_ssize(mpd_t *result, mpd_ssize_t a, mpd_context_t *ctx);599void mpd_sset_i32(mpd_t *result, int32_t a, mpd_context_t *ctx);600void mpd_sset_uint(mpd_t *result, mpd_uint_t a, mpd_context_t *ctx);601void mpd_sset_u32(mpd_t *result, uint32_t a, mpd_context_t *ctx);602void mpd_set_ssize(mpd_t *result, mpd_ssize_t a, mpd_context_t *ctx);603void mpd_set_i32(mpd_t *result, int32_t a, mpd_context_t *ctx);604void mpd_set_uint(mpd_t *result, mpd_uint_t a, mpd_context_t *ctx);605void mpd_set_u32(mpd_t *result, uint32_t a, mpd_context_t *ctx);606#ifndef LEGACY_COMPILER607void mpd_set_i64(mpd_t *result, int64_t a, mpd_context_t *ctx);608void mpd_set_u64(mpd_t *result, uint64_t a, mpd_context_t *ctx);609#endif610mpd_ssize_t mpd_get_ssize(const mpd_t *a, mpd_context_t *ctx);611mpd_uint_t mpd_get_uint(const mpd_t *a, mpd_context_t *ctx);612mpd_uint_t mpd_abs_uint(const mpd_t *a, mpd_context_t *ctx);613int32_t mpd_get_i32(const mpd_t *a, mpd_context_t *ctx);614uint32_t mpd_get_u32(const mpd_t *a, mpd_context_t *ctx);615#ifndef LEGACY_COMPILER616int64_t mpd_get_i64(const mpd_t *a, mpd_context_t *ctx);617uint64_t mpd_get_u64(const mpd_t *a, mpd_context_t *ctx);618#endif619void mpd_and(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);620void mpd_copy(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);621void mpd_canonical(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);622void mpd_copy_abs(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);623void mpd_copy_negate(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);624void mpd_copy_sign(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);625void mpd_invert(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);626void mpd_logb(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);627void mpd_or(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);628void mpd_rotate(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);629void mpd_scaleb(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);630void mpd_shiftl(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);631mpd_uint_t mpd_shiftr(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);632void mpd_shiftn(mpd_t *result, const mpd_t *a, mpd_ssize_t n, mpd_context_t *ctx);633void mpd_shift(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);634void mpd_xor(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);635void mpd_abs(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);636int mpd_cmp(const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);637int mpd_compare(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);638int mpd_compare_signal(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);639void mpd_add(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);640void mpd_add_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);641void mpd_add_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);642void mpd_add_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);643void mpd_add_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);644void mpd_sub(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);645void mpd_sub_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);646void mpd_sub_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);647void mpd_sub_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);648void mpd_sub_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);649void mpd_div(mpd_t *q, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);650void mpd_div_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);651void mpd_div_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);652void mpd_div_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);653void mpd_div_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);654void mpd_divmod(mpd_t *q, mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);655void mpd_divint(mpd_t *q, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);656void mpd_exp(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);657void mpd_fma(mpd_t *result, const mpd_t *a, const mpd_t *b, const mpd_t *c, mpd_context_t *ctx);658void mpd_ln(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);659void mpd_log10(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);660void mpd_max(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);661void mpd_max_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);662void mpd_min(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);663void mpd_min_mag(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);664void mpd_minus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);665void mpd_mul(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);666void mpd_mul_ssize(mpd_t *result, const mpd_t *a, mpd_ssize_t b, mpd_context_t *ctx);667void mpd_mul_i32(mpd_t *result, const mpd_t *a, int32_t b, mpd_context_t *ctx);668void mpd_mul_uint(mpd_t *result, const mpd_t *a, mpd_uint_t b, mpd_context_t *ctx);669void mpd_mul_u32(mpd_t *result, const mpd_t *a, uint32_t b, mpd_context_t *ctx);670void mpd_next_minus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);671void mpd_next_plus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);672void mpd_next_toward(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);673void mpd_plus(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);674void mpd_pow(mpd_t *result, const mpd_t *base, const mpd_t *exp, mpd_context_t *ctx);675void mpd_powmod(mpd_t *result, const mpd_t *base, const mpd_t *exp, const mpd_t *mod, mpd_context_t *ctx);676void mpd_quantize(mpd_t *result, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);677void mpd_rescale(mpd_t *result, const mpd_t *a, mpd_ssize_t exp, mpd_context_t *ctx);678void mpd_reduce(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);679void mpd_rem(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);680void mpd_rem_near(mpd_t *r, const mpd_t *a, const mpd_t *b, mpd_context_t *ctx);681void mpd_round_to_intx(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);682void mpd_round_to_int(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);683void mpd_trunc(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);684void mpd_floor(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);685void mpd_ceil(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);686void mpd_sqrt(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);687void mpd_invroot(mpd_t *result, const mpd_t *a, mpd_context_t *ctx);688689#ifndef LEGACY_COMPILER690void mpd_add_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);691void mpd_add_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);692void mpd_sub_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);693void mpd_sub_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);694void mpd_div_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);695void mpd_div_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);696void mpd_mul_i64(mpd_t *result, const mpd_t *a, int64_t b, mpd_context_t *ctx);697void mpd_mul_u64(mpd_t *result, const mpd_t *a, uint64_t b, mpd_context_t *ctx);698#endif699700701/******************************************************************************/702/* Configuration specific */703/******************************************************************************/704705#ifdef CONFIG_64706void mpd_qsset_i64(mpd_t *result, int64_t a, const mpd_context_t *ctx, uint32_t *status);707void mpd_qsset_u64(mpd_t *result, uint64_t a, const mpd_context_t *ctx, uint32_t *status);708void mpd_sset_i64(mpd_t *result, int64_t a, mpd_context_t *ctx);709void mpd_sset_u64(mpd_t *result, uint64_t a, mpd_context_t *ctx);710#endif711712713/******************************************************************************/714/* Get attributes of a decimal */715/******************************************************************************/716717EXTINLINE mpd_ssize_t mpd_adjexp(const mpd_t *dec);718EXTINLINE mpd_ssize_t mpd_etiny(const mpd_context_t *ctx);719EXTINLINE mpd_ssize_t mpd_etop(const mpd_context_t *ctx);720EXTINLINE mpd_uint_t mpd_msword(const mpd_t *dec);721EXTINLINE int mpd_word_digits(mpd_uint_t word);722/* most significant digit of a word */723EXTINLINE mpd_uint_t mpd_msd(mpd_uint_t word);724/* least significant digit of a word */725EXTINLINE mpd_uint_t mpd_lsd(mpd_uint_t word);726/* coefficient size needed to store 'digits' */727EXTINLINE mpd_ssize_t mpd_digits_to_size(mpd_ssize_t digits);728/* number of digits in the exponent, undefined for MPD_SSIZE_MIN */729EXTINLINE int mpd_exp_digits(mpd_ssize_t exp);730EXTINLINE int mpd_iscanonical(const mpd_t *dec);731EXTINLINE int mpd_isfinite(const mpd_t *dec);732EXTINLINE int mpd_isinfinite(const mpd_t *dec);733EXTINLINE int mpd_isinteger(const mpd_t *dec);734EXTINLINE int mpd_isnan(const mpd_t *dec);735EXTINLINE int mpd_isnegative(const mpd_t *dec);736EXTINLINE int mpd_ispositive(const mpd_t *dec);737EXTINLINE int mpd_isqnan(const mpd_t *dec);738EXTINLINE int mpd_issigned(const mpd_t *dec);739EXTINLINE int mpd_issnan(const mpd_t *dec);740EXTINLINE int mpd_isspecial(const mpd_t *dec);741EXTINLINE int mpd_iszero(const mpd_t *dec);742/* undefined for special numbers */743EXTINLINE int mpd_iszerocoeff(const mpd_t *dec);744EXTINLINE int mpd_isnormal(const mpd_t *dec, const mpd_context_t *ctx);745EXTINLINE int mpd_issubnormal(const mpd_t *dec, const mpd_context_t *ctx);746/* odd word */747EXTINLINE int mpd_isoddword(mpd_uint_t word);748/* odd coefficient */749EXTINLINE int mpd_isoddcoeff(const mpd_t *dec);750/* odd decimal, only defined for integers */751int mpd_isodd(const mpd_t *dec);752/* even decimal, only defined for integers */753int mpd_iseven(const mpd_t *dec);754/* 0 if dec is positive, 1 if dec is negative */755EXTINLINE uint8_t mpd_sign(const mpd_t *dec);756/* 1 if dec is positive, -1 if dec is negative */757EXTINLINE int mpd_arith_sign(const mpd_t *dec);758EXTINLINE long mpd_radix(void);759EXTINLINE int mpd_isdynamic(const mpd_t *dec);760EXTINLINE int mpd_isstatic(const mpd_t *dec);761EXTINLINE int mpd_isdynamic_data(const mpd_t *dec);762EXTINLINE int mpd_isstatic_data(const mpd_t *dec);763EXTINLINE int mpd_isshared_data(const mpd_t *dec);764EXTINLINE int mpd_isconst_data(const mpd_t *dec);765EXTINLINE mpd_ssize_t mpd_trail_zeros(const mpd_t *dec);766767768/******************************************************************************/769/* Set attributes of a decimal */770/******************************************************************************/771772/* set number of decimal digits in the coefficient */773EXTINLINE void mpd_setdigits(mpd_t *result);774EXTINLINE void mpd_set_sign(mpd_t *result, uint8_t sign);775/* copy sign from another decimal */776EXTINLINE void mpd_signcpy(mpd_t *result, const mpd_t *a);777EXTINLINE void mpd_set_infinity(mpd_t *result);778EXTINLINE void mpd_set_qnan(mpd_t *result);779EXTINLINE void mpd_set_snan(mpd_t *result);780EXTINLINE void mpd_set_negative(mpd_t *result);781EXTINLINE void mpd_set_positive(mpd_t *result);782EXTINLINE void mpd_set_dynamic(mpd_t *result);783EXTINLINE void mpd_set_static(mpd_t *result);784EXTINLINE void mpd_set_dynamic_data(mpd_t *result);785EXTINLINE void mpd_set_static_data(mpd_t *result);786EXTINLINE void mpd_set_shared_data(mpd_t *result);787EXTINLINE void mpd_set_const_data(mpd_t *result);788EXTINLINE void mpd_clear_flags(mpd_t *result);789EXTINLINE void mpd_set_flags(mpd_t *result, uint8_t flags);790EXTINLINE void mpd_copy_flags(mpd_t *result, const mpd_t *a);791792793/******************************************************************************/794/* Error Macros */795/******************************************************************************/796797#define mpd_err_fatal(...) \798do {fprintf(stderr, "%s:%d: error: ", __FILE__, __LINE__); \799fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); \800abort(); \801} while (0)802#define mpd_err_warn(...) \803do {fprintf(stderr, "%s:%d: warning: ", __FILE__, __LINE__); \804fprintf(stderr, __VA_ARGS__); fputc('\n', stderr); \805} while (0)806807808/******************************************************************************/809/* Memory handling */810/******************************************************************************/811812extern void *(* mpd_mallocfunc)(size_t size);813extern void *(* mpd_callocfunc)(size_t nmemb, size_t size);814extern void *(* mpd_reallocfunc)(void *ptr, size_t size);815extern void (* mpd_free)(void *ptr);816817void *mpd_callocfunc_em(size_t nmemb, size_t size);818819void *mpd_alloc(mpd_size_t nmemb, mpd_size_t size);820void *mpd_calloc(mpd_size_t nmemb, mpd_size_t size);821void *mpd_realloc(void *ptr, mpd_size_t nmemb, mpd_size_t size, uint8_t *err);822void *mpd_sh_alloc(mpd_size_t struct_size, mpd_size_t nmemb, mpd_size_t size);823824mpd_t *mpd_qnew(void);825mpd_t *mpd_new(mpd_context_t *ctx);826mpd_t *mpd_qnew_size(mpd_ssize_t nwords);827EXTINLINE void mpd_del(mpd_t *dec);828829EXTINLINE void mpd_uint_zero(mpd_uint_t *dest, mpd_size_t len);830EXTINLINE int mpd_qresize(mpd_t *result, mpd_ssize_t nwords, uint32_t *status);831EXTINLINE int mpd_qresize_zero(mpd_t *result, mpd_ssize_t nwords, uint32_t *status);832EXTINLINE void mpd_minalloc(mpd_t *result);833834int mpd_resize(mpd_t *result, mpd_ssize_t nwords, mpd_context_t *ctx);835int mpd_resize_zero(mpd_t *result, mpd_ssize_t nwords, mpd_context_t *ctx);836837838MPD_PRAGMA(MPD_HIDE_SYMBOLS_END) /* restore previous scope rules */839840841#ifdef __cplusplus842} /* END extern "C" */843#endif844845846#endif /* LIBMPDEC_MPDECIMAL_H_ */847848849