[project @ 2000-04-26 10:43:23 by simonmar]
authorsimonmar <unknown>
Wed, 26 Apr 2000 10:43:23 +0000 (10:43 +0000)
committersimonmar <unknown>
Wed, 26 Apr 2000 10:43:23 +0000 (10:43 +0000)
Add Sven's qsort foreign export dynamic test.

ghc/tests/ccall/should_run/Makefile
ghc/tests/ccall/should_run/fed001.hs [new file with mode: 0644]
ghc/tests/ccall/should_run/fed001.stdout [new file with mode: 0644]

index ee5edb1..c0e5e3e 100644 (file)
@@ -1,5 +1,5 @@
 #-----------------------------------------------------------------------------
-# $Id: Makefile,v 1.1 1999/11/02 11:57:16 simonmar Exp $
+# $Id: Makefile,v 1.2 2000/04/26 10:43:23 simonmar Exp $
 
 TOP = ../..
 include $(TOP)/mk/boilerplate.mk
@@ -7,5 +7,8 @@ include $(TOP)/mk/should_run.mk
 
 SRC_HC_OPTS += -dcore-lint -fglasgow-exts
 
+callback_LD_OPTS = callback_stub.o
+fed001_LD_OPTS = fed001_stub.o
+
 include $(TOP)/mk/target.mk
 
diff --git a/ghc/tests/ccall/should_run/fed001.hs b/ghc/tests/ccall/should_run/fed001.hs
new file mode 100644 (file)
index 0000000..22a4352
--- /dev/null
@@ -0,0 +1,24 @@
+import Foreign
+import Monad
+
+type CInt  = Int32
+type CSize = Word32
+
+foreign export dynamic mkComparator :: (Addr -> Addr -> IO CInt) -> IO Addr
+foreign import qsort :: Addr -> CSize -> CSize -> Addr -> IO ()
+
+compareInts :: Addr -> Addr -> IO CInt
+compareInts a1 a2 = do
+   i1 <- peek a1
+   i2 <- peek a2
+   return (fromIntegral (i1 - i2 :: Int))
+
+main :: IO ()
+main = do
+   let values = [ 12, 56, 90, 34, 78 ] :: [Int]
+       n      = length values
+   buf <- mallocElems (head values) n
+   zipWithM_ (pokeElemOff buf) [ 0 .. ] values
+   c <- mkComparator compareInts
+   qsort buf (fromIntegral n) (fromIntegral (sizeOf (head values))) c
+   mapM (peekElemOff buf) [ 0 .. n-1 ] >>= (print :: [Int] -> IO ())
diff --git a/ghc/tests/ccall/should_run/fed001.stdout b/ghc/tests/ccall/should_run/fed001.stdout
new file mode 100644 (file)
index 0000000..e69de29