summaryrefslogtreecommitdiff
path: root/testsuite/tests/ffi/should_run/ffi013.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/ffi/should_run/ffi013.hs')
-rw-r--r--testsuite/tests/ffi/should_run/ffi013.hs26
1 files changed, 26 insertions, 0 deletions
diff --git a/testsuite/tests/ffi/should_run/ffi013.hs b/testsuite/tests/ffi/should_run/ffi013.hs
new file mode 100644
index 0000000000..ae38c71b10
--- /dev/null
+++ b/testsuite/tests/ffi/should_run/ffi013.hs
@@ -0,0 +1,26 @@
+import Foreign
+import Foreign.C.Types
+
+foreign import ccall "wrapper"
+ mkComparator :: (Ptr Int -> Ptr Int -> IO CInt)
+ -> IO (FunPtr (Ptr Int -> Ptr Int -> IO CInt))
+
+foreign import ccall
+ qsort :: Ptr Int -> CSize -> CSize -> FunPtr (Ptr Int -> Ptr Int -> IO CInt)
+ -> IO ()
+
+compareInts :: Ptr Int -> Ptr Int -> IO CInt
+compareInts a1 a2 = do
+ i1 <- peek a1
+ i2 <- peek a2
+ return (fromIntegral (i1 - i2 :: Int))
+
+main :: IO ()
+main = do
+ c <- mkComparator compareInts
+ let values = [ 12, 56, 90, 34, 78 ] :: [Int]
+ n = length values
+ withArray values $ \ buf -> do
+ qsort buf (fromIntegral n) (fromIntegral (sizeOf (head values))) c
+ values' <- peekArray n buf
+ print values'