aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/fdReadBuf001.hs
blob: 4c121a2b3b7375ce30d3acbaf9bdd703c6d1703f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{-# LANGUAGE NoMonomorphismRestriction #-}
import System.Posix
import Control.Monad
import Foreign
import Control.Concurrent
import Data.Char
import System.Exit

size  = 10000
block = 512

main = do
  (rd,wr) <- createPipe
  let bytes = take size (map (fromIntegral.ord) (cycle ['a'..'z']))
  allocaBytes size $ \p -> do
    pokeArray p bytes
    forkIO $ do r <- fdWriteBuf wr p (fromIntegral size)
                when (fromIntegral r /= size) $ error "fdWriteBuf failed"
  allocaBytes block $ \p -> do
    let loop text = do
           r <- fdReadBuf rd p block
           let (chunk,rest) = splitAt (fromIntegral r) text
           chars <- peekArray (fromIntegral r) p
           when (chars /= chunk) $ error "mismatch"
           when (null rest) $ exitWith ExitSuccess
           loop rest
    loop bytes