packages feed

bytestring-handle 0.1.0.0 → 0.1.0.1

raw patch · 2 files changed

+36/−20 lines, 2 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

bytestring-handle.cabal view
@@ -1,5 +1,5 @@ name:                bytestring-handle-version:             0.1.0.0+version:             0.1.0.1 synopsis:            ByteString-backed Handles -- description: homepage:            http://hub.darcs.net/ganesh/bytestring-handle
src/Data/ByteString/Handle/Read.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP, DeriveDataTypeable #-}+{-# LANGUAGE CPP, DeriveDataTypeable, ForeignFunctionInterface #-} module Data.ByteString.Handle.Read     ( readHandle     ) where@@ -11,14 +11,18 @@ import Data.Maybe ( fromMaybe ) import Data.Typeable ( Typeable ) import Data.Word ( Word8 )+import Foreign.C.Types ( CSize(..) ) import Foreign.ForeignPtr ( newForeignPtr_ )-import Foreign.Ptr ( nullPtr )+import Foreign.Ptr ( Ptr, nullPtr, plusPtr ) import System.IO     ( Handle, IOMode( ReadMode )     , noNewlineTranslation, nativeNewlineMode     ) -import GHC.IO.Buffer ( BufferState(..), emptyBuffer, Buffer(..) )+import GHC.IO.Buffer+    ( BufferState(..), Buffer(..)+    , emptyBuffer, isEmptyBuffer, newBuffer, newByteBuffer+    , bufferElems, withBuffer, withRawBuffer ) import GHC.IO.BufferedIO ( BufferedIO(..) ) import GHC.IO.Device ( IODevice(..), IODeviceType(..), SeekMode(..) ) #if MIN_VERSION_base(4,5,0)@@ -62,6 +66,9 @@                          0                          ReadBuffer +foreign import ccall unsafe "memmove"+   memmove :: Ptr a -> Ptr a -> CSize -> IO (Ptr a)+ instance BufferedIO ReadState where     emptyWriteBuffer _ _ = ioException unsupportedOperation     flushWriteBuffer _ _ = ioException unsupportedOperation@@ -74,26 +81,35 @@        (count, buf) <- fillReadBuffer0 rs bufIn        return (fromMaybe 0 count, buf) -    fillReadBuffer0 rs _ = do+    fillReadBuffer0 rs bufIn = do         ss <- readIORef (read_seek_state rs)         case seek_after ss of               [] -> do-                buf <- nullReadBuffer-                return (Nothing, buf)+                return (Nothing, bufIn)               (chunk:chunks) ->-                let (ptr, bsOffset, _) = BI.toForeignPtr chunk-                    buf = (emptyBuffer ptr (bsOffset + B.length chunk) ReadBuffer) {-                              bufL = bsOffset + seek_pos ss, bufR = bsOffset + B.length chunk-                          }-                in do writeIORef (read_seek_state rs)-                                 (SeekState {-                                      seek_before = chunk:seek_before ss,-                                      seek_after = chunks,-                                      seek_pos = 0,-                                      seek_before_length = fromIntegral (B.length chunk) + seek_before_length ss-                                  })-                      return (Just (B.length chunk - seek_pos ss), buf)-+                  let (ptr, bsOffset_noseek, _) = BI.toForeignPtr chunk+                      bsOffset = bsOffset_noseek + seek_pos ss+                      bsOffsetEnd = bsOffset_noseek + B.length chunk+                  in do buf <- if isEmptyBuffer bufIn+                                then return (emptyBuffer ptr bsOffsetEnd ReadBuffer) {+                                                bufL = bsOffset, bufR = bsOffsetEnd+                                            }+                                else do let sz = bufferElems bufIn + B.length chunk - seek_pos ss+                                        buf <- newByteBuffer sz ReadBuffer+                                        withBuffer buf $ \buf_ptr -> do+                                          withBuffer bufIn $ \buf_in_ptr ->+                                            memmove buf_ptr (buf_in_ptr `plusPtr` bufL bufIn) (fromIntegral $ bufferElems bufIn)+                                          withRawBuffer ptr $ \ptr_ptr ->+                                            memmove (buf_ptr `plusPtr` bufferElems bufIn) (ptr_ptr `plusPtr` bsOffset) (fromIntegral (bsOffsetEnd - bsOffset))+                                        return (buf { bufR = sz })+                        writeIORef (read_seek_state rs)+                                   (SeekState {+                                        seek_before = chunk:seek_before ss,+                                        seek_after = chunks,+                                        seek_pos = 0,+                                        seek_before_length = fromIntegral (B.length chunk) + seek_before_length ss+                                    })+                        return (Just (B.length chunk - seek_pos ss), buf)  normalisedSeekState :: [B.ByteString] -> [B.ByteString] -> Integer -> Integer -> Maybe SeekState normalisedSeekState (x:before) after beforeLen pos