{-# LINE 1 "lib/Data/Deka/Decnumber.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "lib/Data/Deka/Decnumber.hsc" #-}


{-# LINE 4 "lib/Data/Deka/Decnumber.hsc" #-}

{-# LINE 5 "lib/Data/Deka/Decnumber.hsc" #-}


{-# LINE 7 "lib/Data/Deka/Decnumber.hsc" #-}

-- | Low-level bindings to the decNumber library.
module Data.Deka.Decnumber where

import Foreign.Safe
import Foreign.C
import Control.Applicative

c'NULL :: Num a => a
c'NULL = 0
{-# LINE 17 "lib/Data/Deka/Decnumber.hsc" #-}

type C'rounding = Word32
{-# LINE 19 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_CEILING :: Num a => a
c'DEC_ROUND_CEILING = 0
{-# LINE 22 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_UP :: Num a => a
c'DEC_ROUND_UP = 1
{-# LINE 25 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_HALF_UP :: Num a => a
c'DEC_ROUND_HALF_UP = 2
{-# LINE 28 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_HALF_EVEN :: Num a => a
c'DEC_ROUND_HALF_EVEN = 3
{-# LINE 31 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_HALF_DOWN :: Num a => a
c'DEC_ROUND_HALF_DOWN = 4
{-# LINE 34 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_DOWN :: Num a => a
c'DEC_ROUND_DOWN = 5
{-# LINE 37 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_FLOOR :: Num a => a
c'DEC_ROUND_FLOOR = 6
{-# LINE 40 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_05UP :: Num a => a
c'DEC_ROUND_05UP = 7
{-# LINE 43 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_ROUND_MAX :: Num a => a
c'DEC_ROUND_MAX = 8
{-# LINE 46 "lib/Data/Deka/Decnumber.hsc" #-}

type C'int32_t = Int32
{-# LINE 48 "lib/Data/Deka/Decnumber.hsc" #-}
type C'uint8_t = Word8
{-# LINE 49 "lib/Data/Deka/Decnumber.hsc" #-}
type C'uint16_t = Word16
{-# LINE 50 "lib/Data/Deka/Decnumber.hsc" #-}
type C'uint32_t = Word32
{-# LINE 51 "lib/Data/Deka/Decnumber.hsc" #-}
type C'uint64_t = Word64
{-# LINE 52 "lib/Data/Deka/Decnumber.hsc" #-}

data C'decContext = C'decContext
  { c'decContext'digits :: C'int32_t
  , c'decContext'emax :: C'int32_t
  , c'decContext'emin :: C'int32_t
  , c'decContext'round :: C'rounding
  , c'decContext'traps :: C'uint32_t
  , c'decContext'status :: C'uint32_t
  , c'decContext'clamp :: C'uint8_t
  } deriving (Eq, Show)

instance Storable C'decContext where
  sizeOf _ = (28)
{-# LINE 65 "lib/Data/Deka/Decnumber.hsc" #-}
  alignment _ = 4
{-# LINE 66 "lib/Data/Deka/Decnumber.hsc" #-}
  peek p =
    C'decContext
    <$> (\hsc_ptr -> peekByteOff hsc_ptr 0) p
{-# LINE 69 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 4) p
{-# LINE 70 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 8) p
{-# LINE 71 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 12) p
{-# LINE 72 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 16) p
{-# LINE 73 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 20) p
{-# LINE 74 "lib/Data/Deka/Decnumber.hsc" #-}
    <*> (\hsc_ptr -> peekByteOff hsc_ptr 24) p
{-# LINE 75 "lib/Data/Deka/Decnumber.hsc" #-}

  poke p (C'decContext d ex en r t s c) =
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) p d
{-# LINE 78 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 4) p ex
{-# LINE 79 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 8) p en
{-# LINE 80 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 12) p r
{-# LINE 81 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 16) p t
{-# LINE 82 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 20) p s
{-# LINE 83 "lib/Data/Deka/Decnumber.hsc" #-}
    >> (\hsc_ptr -> pokeByteOff hsc_ptr 24) p c
{-# LINE 84 "lib/Data/Deka/Decnumber.hsc" #-}

p'decContext'status :: Ptr C'decContext -> Ptr C'uint32_t
p'decContext'status = (\hsc_ptr -> hsc_ptr `plusPtr` 20)
{-# LINE 87 "lib/Data/Deka/Decnumber.hsc" #-}

p'decContext'round :: Ptr C'decContext -> Ptr C'rounding
p'decContext'round = (\hsc_ptr -> hsc_ptr `plusPtr` 12)
{-# LINE 90 "lib/Data/Deka/Decnumber.hsc" #-}

-- decContext
c'DEC_INIT_DECQUAD :: Num a => a
c'DEC_INIT_DECQUAD = 128
{-# LINE 94 "lib/Data/Deka/Decnumber.hsc" #-}

foreign import ccall unsafe "decContextDefault" unsafe'c'decContextDefault
  :: Ptr C'decContext
  -> C'int32_t
  -> IO (Ptr C'decContext)

type C'decClass = Word32
{-# LINE 101 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_SNAN :: Num a => a
c'DEC_CLASS_SNAN = 0
{-# LINE 104 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_QNAN :: Num a => a
c'DEC_CLASS_QNAN = 1
{-# LINE 107 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_NEG_INF :: Num a => a
c'DEC_CLASS_NEG_INF = 2
{-# LINE 110 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_NEG_NORMAL :: Num a => a
c'DEC_CLASS_NEG_NORMAL = 3
{-# LINE 113 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_NEG_SUBNORMAL :: Num a => a
c'DEC_CLASS_NEG_SUBNORMAL = 4
{-# LINE 116 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_NEG_ZERO :: Num a => a
c'DEC_CLASS_NEG_ZERO = 5
{-# LINE 119 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_POS_ZERO :: Num a => a
c'DEC_CLASS_POS_ZERO = 6
{-# LINE 122 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_POS_SUBNORMAL :: Num a => a
c'DEC_CLASS_POS_SUBNORMAL = 7
{-# LINE 125 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_POS_NORMAL :: Num a => a
c'DEC_CLASS_POS_NORMAL = 8
{-# LINE 128 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_CLASS_POS_INF :: Num a => a
c'DEC_CLASS_POS_INF = 9
{-# LINE 131 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Conversion_syntax :: Num a => a
c'DEC_Conversion_syntax = 1
{-# LINE 134 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Division_by_zero :: Num a => a
c'DEC_Division_by_zero = 2
{-# LINE 137 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Division_impossible :: Num a => a
c'DEC_Division_impossible = 4
{-# LINE 140 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Division_undefined :: Num a => a
c'DEC_Division_undefined = 8
{-# LINE 143 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Insufficient_storage :: Num a => a
c'DEC_Insufficient_storage = 16
{-# LINE 146 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Inexact :: Num a => a
c'DEC_Inexact = 32
{-# LINE 149 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Invalid_context :: Num a => a
c'DEC_Invalid_context = 64
{-# LINE 152 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Invalid_operation :: Num a => a
c'DEC_Invalid_operation = 128
{-# LINE 155 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Overflow :: Num a => a
c'DEC_Overflow = 512
{-# LINE 158 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Clamped :: Num a => a
c'DEC_Clamped = 1024
{-# LINE 161 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Rounded :: Num a => a
c'DEC_Rounded = 2048
{-# LINE 164 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Subnormal :: Num a => a
c'DEC_Subnormal = 4096
{-# LINE 167 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Underflow :: Num a => a
c'DEC_Underflow = 8192
{-# LINE 170 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_IEEE_754_Division_by_zero :: Num a => a
c'DEC_IEEE_754_Division_by_zero = 2
{-# LINE 173 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_IEEE_754_Inexact :: Num a => a
c'DEC_IEEE_754_Inexact = 32
{-# LINE 176 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_IEEE_754_Invalid_operation :: Num a => a
c'DEC_IEEE_754_Invalid_operation = 221
{-# LINE 179 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_IEEE_754_Overflow :: Num a => a
c'DEC_IEEE_754_Overflow = 512
{-# LINE 182 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_IEEE_754_Underflow :: Num a => a
c'DEC_IEEE_754_Underflow = 8192
{-# LINE 185 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Errors :: Num a => a
c'DEC_Errors = 8927
{-# LINE 188 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_NaNs :: Num a => a
c'DEC_NaNs = 221
{-# LINE 191 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_Condition_Length :: Num a => a
c'DEC_Condition_Length = 21
{-# LINE 194 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_INIT_BASE :: Num a => a
c'DEC_INIT_BASE = 0
{-# LINE 197 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_INIT_DECIMAL32 :: Num a => a
c'DEC_INIT_DECIMAL32 = 32
{-# LINE 200 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_INIT_DECIMAL64 :: Num a => a
c'DEC_INIT_DECIMAL64 = 64
{-# LINE 203 "lib/Data/Deka/Decnumber.hsc" #-}

c'DEC_INIT_DECIMAL128 :: Num a => a
c'DEC_INIT_DECIMAL128 = 128
{-# LINE 206 "lib/Data/Deka/Decnumber.hsc" #-}


c'DECQUAD_Bytes :: Num a => a
c'DECQUAD_Bytes = 16
{-# LINE 210 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Pmax :: Num a => a
c'DECQUAD_Pmax = 34
{-# LINE 213 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Emin :: Num a => a
c'DECQUAD_Emin = -6143
{-# LINE 216 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Emax :: Num a => a
c'DECQUAD_Emax = 6144
{-# LINE 219 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_EmaxD :: Num a => a
c'DECQUAD_EmaxD = 4
{-# LINE 222 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Bias :: Num a => a
c'DECQUAD_Bias = 6176
{-# LINE 225 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_String :: Num a => a
c'DECQUAD_String = 43
{-# LINE 228 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_EconL :: Num a => a
c'DECQUAD_EconL = 12
{-# LINE 231 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Declets :: Num a => a
c'DECQUAD_Declets = 11
{-# LINE 234 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECQUAD_Ehigh :: Num a => a
c'DECQUAD_Ehigh = 12287
{-# LINE 237 "lib/Data/Deka/Decnumber.hsc" #-}

newtype C'decQuad = C'decQuad
  { c'decQuad'bytes :: [C'uint8_t]
  } deriving (Eq, Show)

p'decQuad'bytes :: Ptr C'decQuad -> Ptr c'decQuad'bytes
p'decQuad'bytes = (\hsc_ptr -> hsc_ptr `plusPtr` 0)
{-# LINE 244 "lib/Data/Deka/Decnumber.hsc" #-}

instance Storable C'decQuad where
  sizeOf _ = (16)
{-# LINE 247 "lib/Data/Deka/Decnumber.hsc" #-}
  alignment _ = 4
{-# LINE 248 "lib/Data/Deka/Decnumber.hsc" #-}
  peek p =
    let pArr = p'decQuad'bytes p
    in fmap C'decQuad $ peekArray c'DECQUAD_Bytes pArr
  poke p (C'decQuad bs) = pokeArray (p'decQuad'bytes p) bs

c'DECFLOAT_Sign :: Num a => a
c'DECFLOAT_Sign = 2147483648
{-# LINE 255 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECFLOAT_NaN :: Num a => a
c'DECFLOAT_NaN = 2080374784
{-# LINE 258 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECFLOAT_qNaN :: Num a => a
c'DECFLOAT_qNaN = 2080374784
{-# LINE 261 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECFLOAT_sNaN :: Num a => a
c'DECFLOAT_sNaN = 2113929216
{-# LINE 264 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECFLOAT_Inf :: Num a => a
c'DECFLOAT_Inf = 2013265920
{-# LINE 267 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECFLOAT_MinSp :: Num a => a
c'DECFLOAT_MinSp = 2013265920
{-# LINE 270 "lib/Data/Deka/Decnumber.hsc" #-}


c'DECPPLUSALT :: Num a => a
c'DECPPLUSALT = 10
{-# LINE 274 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECPMINUSALT :: Num a => a
c'DECPMINUSALT = 11
{-# LINE 277 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECPPLUS :: Num a => a
c'DECPPLUS = 12
{-# LINE 280 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECPMINUS :: Num a => a
c'DECPMINUS = 13
{-# LINE 283 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECPPLUSALT2 :: Num a => a
c'DECPPLUSALT2 = 14
{-# LINE 286 "lib/Data/Deka/Decnumber.hsc" #-}

c'DECPUNSIGNED :: Num a => a
c'DECPUNSIGNED = 15
{-# LINE 289 "lib/Data/Deka/Decnumber.hsc" #-}


-- Utilities

foreign import ccall unsafe "decQuadToInt32" unsafe'c'decQuadToInt32
  :: Ptr C'decQuad
  -> Ptr C'decContext
  -> C'rounding
  -> IO C'int32_t

foreign import ccall unsafe "decQuadToInt32Exact" unsafe'c'decQuadToInt32Exact
  :: Ptr C'decQuad
  -> Ptr C'decContext
  -> C'rounding
  -> IO C'int32_t

foreign import ccall unsafe "decQuadFromInt32" unsafe'c'decQuadFromInt32
  :: Ptr C'decQuad
  -> C'int32_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFromPacked" unsafe'c'decQuadFromPacked
  :: Ptr C'decQuad
  -> C'int32_t
  -> Ptr C'uint8_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFromPackedChecked" unsafe'c'decQuadFromPackedChecked
  :: Ptr C'decQuad
  -> C'int32_t
  -> Ptr C'uint8_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFromUInt32" unsafe'c'decQuadFromUInt32
  :: Ptr C'decQuad
  -> C'uint32_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFromString" unsafe'c'decQuadFromString
  :: Ptr C'decQuad
  -> CString
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadGetCoefficient" unsafe'c'decQuadGetCoefficient
  :: Ptr C'decQuad
  -> Ptr C'uint8_t
  -> IO C'int32_t

foreign import ccall unsafe "decQuadGetExponent" unsafe'c'decQuadGetExponent
  :: Ptr C'decQuad
  -> IO C'int32_t

foreign import ccall unsafe "decQuadSetCoefficient" unsafe'c'decQuadSetCoefficient
  :: Ptr C'decQuad
  -> Ptr C'uint8_t
  -> C'int32_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadSetExponent" unsafe'c'decQuadSetExponent
  :: Ptr C'decQuad
  -> Ptr C'decContext
  -> C'int32_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadShow" unsafe'c'decQuadShow
  :: Ptr C'decQuad
  -> CString
  -> IO ()

foreign import ccall unsafe "decQuadToEngString" unsafe'c'decQuadToEngString
  :: Ptr C'decQuad
  -> CString
  -> IO CString

foreign import ccall unsafe "decQuadToString" unsafe'c'decQuadToString
  :: Ptr C'decQuad
  -> CString
  -> IO CString

foreign import ccall unsafe "decQuadToUInt32" unsafe'c'decQuadToUInt32
  :: Ptr C'decQuad
  -> Ptr C'decContext
  -> C'rounding
  -> IO C'uint32_t


foreign import ccall unsafe "decQuadToUInt32Exact" unsafe'c'decQuadToUInt32Exact
  :: Ptr C'decQuad
  -> Ptr C'decContext
  -> C'rounding
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadZero" unsafe'c'decQuadZero
  :: Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadAbs" unsafe'c'decQuadAbs
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadAdd" unsafe'c'decQuadAdd
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadAnd" unsafe'c'decQuadAnd
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadDivide" unsafe'c'decQuadDivide
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadDivideInteger" unsafe'c'decQuadDivideInteger
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFMA" unsafe'c'decQuadFMA
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadFromBCD" unsafe'c'decQuadFromBCD
  :: Ptr C'decQuad
  -> C'int32_t
  -> Ptr C'uint8_t
  -> C'int32_t
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadInvert" unsafe'c'decQuadInvert
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadLogB" unsafe'c'decQuadLogB
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMax" unsafe'c'decQuadMax
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMaxMag" unsafe'c'decQuadMaxMag
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMin" unsafe'c'decQuadMin
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMinMag" unsafe'c'decQuadMinMag
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMinus" unsafe'c'decQuadMinus
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadMultiply" unsafe'c'decQuadMultiply
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadNextMinus" unsafe'c'decQuadNextMinus
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadNextPlus" unsafe'c'decQuadNextPlus
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadNextToward" unsafe'c'decQuadNextToward
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadOr" unsafe'c'decQuadOr
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadPlus" unsafe'c'decQuadPlus
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadQuantize" unsafe'c'decQuadQuantize
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadReduce" unsafe'c'decQuadReduce
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadRemainder" unsafe'c'decQuadRemainder
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadRemainderNear" unsafe'c'decQuadRemainderNear
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadRotate" unsafe'c'decQuadRotate
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadScaleB" unsafe'c'decQuadScaleB
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadShift" unsafe'c'decQuadShift
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadSubtract" unsafe'c'decQuadSubtract
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadToBCD" unsafe'c'decQuadToBCD
  :: Ptr C'decQuad
  -> Ptr C'int32_t
  -> Ptr C'uint8_t
  -> IO C'int32_t

foreign import ccall unsafe "decQuadToIntegralValue" unsafe'c'decQuadToIntegralValue
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> C'rounding
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadToIntegralExact" unsafe'c'decQuadToIntegralExact
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadXor" unsafe'c'decQuadXor
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

-- Comparisons

foreign import ccall unsafe "decQuadCompare" unsafe'c'decQuadCompare
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCompareSignal" unsafe'c'decQuadCompareSignal
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decContext
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCompareTotal" unsafe'c'decQuadCompareTotal
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCompareTotalMag" unsafe'c'decQuadCompareTotalMag
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

-- Copies
foreign import ccall unsafe "decQuadCanonical" unsafe'c'decQuadCanonical
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCopyAbs" unsafe'c'decQuadCopyAbs
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCopyNegate" unsafe'c'decQuadCopyNegate
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCopySign" unsafe'c'decQuadCopySign
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

foreign import ccall unsafe "decQuadCopy" unsafe'c'decQuadCopy
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO (Ptr C'decQuad)

-- Non-computational

foreign import ccall unsafe "decQuadClass" unsafe'c'decQuadClass
  :: Ptr C'decQuad
  -> IO C'decClass

foreign import ccall unsafe "decQuadClassString" unsafe'c'decQuadClassString
  :: Ptr C'decQuad
  -> IO CString

foreign import ccall unsafe "decQuadDigits" unsafe'c'decQuadDigits
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsCanonical" unsafe'c'decQuadIsCanonical
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsFinite" unsafe'c'decQuadIsFinite
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsInteger" unsafe'c'decQuadIsInteger
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsLogical" unsafe'c'decQuadIsLogical
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsInfinite" unsafe'c'decQuadIsInfinite
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsNaN" unsafe'c'decQuadIsNaN
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsNegative" unsafe'c'decQuadIsNegative
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsNormal" unsafe'c'decQuadIsNormal
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsPositive" unsafe'c'decQuadIsPositive
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsSignaling" unsafe'c'decQuadIsSignaling
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsSigned" unsafe'c'decQuadIsSigned
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsSubnormal" unsafe'c'decQuadIsSubnormal
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadIsZero" unsafe'c'decQuadIsZero
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadRadix" unsafe'c'decQuadRadix
  :: Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadSameQuantum" unsafe'c'decQuadSameQuantum
  :: Ptr C'decQuad
  -> Ptr C'decQuad
  -> IO C'uint32_t

foreign import ccall unsafe "decQuadVersion" unsafe'c'decQuadVersion
  :: IO CString