@@ -21,6 +21,7 @@ foreign import ccall "intToString" c_intToString :: CInt -> CString
2121foreign import ccall " bubbleSort" c_bubbleSort :: Ptr CInt -> CInt -> IO ()
2222foreign import ccall " toUpper" c_toUpper :: CString -> IO ()
2323foreign import ccall " addTwoArrays" c_addTwoArrays:: Ptr CInt -> CInt -> Ptr CInt -> Int -> IO (Ptr CInt )
24+ foreign import ccall " addThreeArrays" c_addThreeArrays:: Ptr CInt -> CInt -> Ptr CInt -> Int -> Ptr CInt -> Int -> IO (Ptr CInt )
2425
2526swapTwoNums :: Int -> Int -> (Int ,Int )
2627swapTwoNums x y = unsafePerformIO $ do
@@ -53,13 +54,31 @@ toUpper str = do
5354 withCString str $ \ str2 -> do
5455 c_toUpper str2
5556
57+ addThreeArrays :: [Int32 ] -> [Int32 ] -> [Int32 ] -> [Int32 ]
58+ addThreeArrays xs ys zs = unsafePerformIO $ do
59+ let len1 = length xs
60+ let len2 = length ys
61+ let len3 = length zs
62+ allocaBytes (len1* 4 ) $ \ ptr1 -> do
63+ pokeArray ptr1 xs
64+ allocaBytes (len2* 4 ) $ \ ptr2 -> do
65+ pokeArray ptr2 ys
66+ allocaBytes (len3* 4 ) $ \ ptr3 -> do
67+ pokeArray ptr3 zs
68+ arrPtr <- c_addThreeArrays (castPtr ptr1) (fromIntegral len1) (castPtr ptr2) (fromIntegral len2) (castPtr ptr3) (fromIntegral len3)
69+ foreignPtr <- newForeignPtr p_free arrPtr
70+ array <- withForeignPtr foreignPtr $ \ ptr -> peekArray (len1+ len2+ len3) (castPtr ptr)
71+ return array
72+
5673addTwoArrays :: [Int32 ] -> [Int32 ] -> [Int32 ]
5774addTwoArrays xs ys = unsafePerformIO $ do
5875 let len1 = length xs
5976 let len2 = length ys
60- alloca $ \ ptr1 -> do
77+ allocaBytes (len1 * 4 ) $ \ ptr1 -> do
6178 pokeArray ptr1 xs
62- alloca $ \ ptr2 -> do
79+ print $ unsafePerformIO $ peek (plusPtr ptr1 8 :: Ptr Int32 )
80+ print $ unsafePerformIO $ peek ptr1
81+ allocaBytes (len2* 4 ) $ \ ptr2 -> do
6382 pokeArray ptr2 ys
6483 arrPtr <- c_addTwoArrays (castPtr ptr1) (fromIntegral len1) (castPtr ptr2) (fromIntegral len2)
6584 foreignPtr <- newForeignPtr p_free arrPtr
@@ -88,4 +107,5 @@ main = do
88107 -- toUpper
89108 toUpper " tushar"
90109 -- merge array
91- print $ addTwoArrays [4 ,5 ,6 ,45 ,76 ,57 ] [2 ,3 ,3 ]
110+ print $ addTwoArrays [1 ,2 ,3 ] [4 ,5 ,6 ]
111+ print $ addThreeArrays [1 ,2 ,3 ] [4 ,5 ,6 ] [7 ,8 ,9 ]
0 commit comments