{-# LINE 1 "lib/Numeric/GSL/Special/Internal.hsc" #-} {-# LANGUAGE ForeignFunctionInterface #-} {-# LINE 2 "lib/Numeric/GSL/Special/Internal.hsc" #-} ----------------------------------------------------------------------------- {- | Module : Numeric.GSL.Special.Internal Copyright : (c) Alberto Ruiz 2007 License : GPL-style Maintainer : Alberto Ruiz (aruiz at um dot es) Stability : provisional Portability : uses ffi Support for Special functions. <http://www.gnu.org/software/gsl/manual/html_node/Special-Functions.html#Special-Functions> -} ----------------------------------------------------------------------------- {-# LINE 19 "lib/Numeric/GSL/Special/Internal.hsc" #-} {-# LINE 20 "lib/Numeric/GSL/Special/Internal.hsc" #-} module Numeric.GSL.Special.Internal ( createSFR, createSFR_E10, Precision(..), Gsl_mode_t, Size_t, precCode ) where import Foreign import Data.Packed.Internal(check,(//)) import Foreign.C.Types(CSize,CInt) data Precision = PrecDouble | PrecSingle | PrecApprox precCode :: Precision -> Int precCode PrecDouble = 0 precCode PrecSingle = 1 precCode PrecApprox = 2 type Gsl_mode_t = Int type Size_t = CSize --------------------------------------------------- data Gsl_sf_result = SF Double Double deriving (Show) instance Storable Gsl_sf_result where sizeOf _ = (16) {-# LINE 54 "lib/Numeric/GSL/Special/Internal.hsc" #-} alignment _ = 4 {-# LINE 55 "lib/Numeric/GSL/Special/Internal.hsc" #-} peek ptr = do val <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr {-# LINE 57 "lib/Numeric/GSL/Special/Internal.hsc" #-} err <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr {-# LINE 58 "lib/Numeric/GSL/Special/Internal.hsc" #-} return (SF val err) poke ptr (SF val err) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr val {-# LINE 61 "lib/Numeric/GSL/Special/Internal.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr err {-# LINE 62 "lib/Numeric/GSL/Special/Internal.hsc" #-} data Gsl_sf_result_e10 = SFE Double Double CInt deriving (Show) instance Storable Gsl_sf_result_e10 where sizeOf _ = (20) {-# LINE 69 "lib/Numeric/GSL/Special/Internal.hsc" #-} alignment _ = 4 {-# LINE 70 "lib/Numeric/GSL/Special/Internal.hsc" #-} peek ptr = do val <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr {-# LINE 72 "lib/Numeric/GSL/Special/Internal.hsc" #-} err <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr {-# LINE 73 "lib/Numeric/GSL/Special/Internal.hsc" #-} e10 <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr {-# LINE 74 "lib/Numeric/GSL/Special/Internal.hsc" #-} return (SFE val err e10) poke ptr (SFE val err e10) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr val {-# LINE 77 "lib/Numeric/GSL/Special/Internal.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr err {-# LINE 78 "lib/Numeric/GSL/Special/Internal.hsc" #-} ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr e10 {-# LINE 79 "lib/Numeric/GSL/Special/Internal.hsc" #-} ---------------------------------------------------------------- -- | access to a sf_result createSFR :: String -> (Ptr a -> IO CInt) -> (Double, Double) createSFR s f = unsafePerformIO $ do p <- malloc :: IO (Ptr Gsl_sf_result) f (castPtr p) // check s SF val err <- peek p free p return (val,err) --------------------------------------------------------------------- -- the sf_result_e10 contains two doubles and the exponent -- | access to sf_result_e10 createSFR_E10 :: String -> (Ptr a -> IO CInt) -> (Double, Int, Double) createSFR_E10 s f = unsafePerformIO $ do p <- malloc :: IO (Ptr Gsl_sf_result_e10) f (castPtr p) // check s SFE val err expo <- peek p free p return (val, fromIntegral expo,err)