snappy-c 0.1.0 → 0.1.1
raw patch · 2 files changed
+66/−70 lines, 2 filesdep ~basedep ~bytestringdep ~data-defaultnew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, bytestring, data-default, random, tasty-quickcheck
API changes (from Hackage documentation)
Files
- snappy-c.cabal +9/−9
- src/Codec/Compression/SnappyC/Raw.hs +57/−61
snappy-c.cabal view
@@ -1,6 +1,6 @@ cabal-version: 3.0 name: snappy-c-version: 0.1.0+version: 0.1.1 synopsis: Bindings to Google's Snappy: A fast compression library description: [Snappy](https://github.com/google/snappy) is a fast (de)compression library. It is written in C++, but a basic@@ -17,10 +17,11 @@ build-type: Simple extra-source-files: README.md extra-doc-files: CHANGELOG.md-tested-with: GHC==9.2.8+tested-with: GHC==8.10.7+ , GHC==9.2.8 , GHC==9.4.8 , GHC==9.6.4- , GHC==9.8.1+ , GHC==9.8.2 source-repository head type: git@@ -33,7 +34,7 @@ -Wprepositive-qualified-module -Widentities build-depends:- base >= 4.16 && < 4.20+ base >= 4.14 && < 4.20 default-language: Haskell2010 default-extensions:@@ -76,7 +77,7 @@ Codec.Compression.SnappyC.Internal.FrameFormat Codec.Compression.SnappyC.Internal.Util build-depends:- , bytestring >= 0.11 && < 0.13+ , bytestring >= 0.10 && < 0.13 , data-default >= 0.7 && < 0.8 , digest >= 0.0.2 && < 0.0.3 , mtl >= 2.2.2 && < 2.4@@ -93,7 +94,7 @@ build-depends: snappy-c - , bytestring >= 0.11 && < 0.13+ , bytestring >= 0.10 && < 0.13 , conduit >= 1.3.5 && < 1.4 , data-default >= 0.7 && < 0.8 , optparse-applicative >= 0.18 && < 0.19@@ -101,7 +102,6 @@ -threaded -rtsopts --- TODO bounds here test-suite test-snappy-c import: lang@@ -119,7 +119,7 @@ , snappy-c build-depends: -- External dependencies- , bytestring >= 0.11 && < 0.13+ , bytestring >= 0.10 && < 0.13 , tasty >= 1.5 && < 1.6 , tasty-hunit >= 0.10 && < 0.11 , tasty-quickcheck >= 0.10 && < 0.11@@ -139,7 +139,7 @@ , snappy-c -- external- , bytestring >= 0.11 && < 0.13+ , bytestring >= 0.10 && < 0.13 , criterion >= 1.6.3 && < 1.7 , deepseq >= 1.4 && < 1.6 , random >= 1.2.1 && < 1.3
src/Codec/Compression/SnappyC/Raw.hs view
@@ -21,80 +21,76 @@ import Data.ByteString.Internal (ByteString(..)) import Foreign import System.IO.Unsafe+import Data.ByteString.Unsafe -- | Compress the input using [Snappy](https://github.com/google/snappy/). -- -- The result is in Snappy raw format, /not/ the framing format. compress :: ByteString -> ByteString-compress (BS sfp slen) =- unsafePerformIO $ do+compress bs = unsafePerformIO $ do+ unsafeUseAsCStringLen bs $ \(sptr, slen) -> do let dlen = C.snappy_max_compressed_length (fromIntegral slen)- dfp <- mallocForeignPtrBytes (fromIntegral dlen)- withForeignPtr sfp $ \sptr ->- withForeignPtr dfp $ \dptr ->- with dlen $ \dlen_ptr ->- case- C.snappy_compress- (castPtr sptr)- (fromIntegral slen)- (castPtr dptr)- dlen_ptr- of- 0 ->- BS dfp . fromIntegral <$> peek dlen_ptr- 1 ->- error "impossible: there is no invalid input for compression"- 2 ->- error "impossible: the buffer size is always set correctly"- status ->- error $- "impossible: unexpected status from snappy_compress: " ++- show status+ dptr <- mallocBytes (fromIntegral dlen)+ with dlen $ \dlen_ptr ->+ case+ C.snappy_compress+ (castPtr sptr)+ (fromIntegral slen)+ (castPtr dptr)+ dlen_ptr+ of+ 0 -> do+ len <- fromIntegral <$> peek dlen_ptr+ unsafePackMallocCStringLen (dptr, len)+ 1 ->+ error "impossible: there is no invalid input for compression"+ 2 ->+ error "impossible: the buffer size is always set correctly"+ status ->+ error $+ "impossible: unexpected status from snappy_compress: " +++ show status -- | Decompress the input using [Snappy](https://github.com/google/snappy/). -- -- Returns 'Nothing' if the input is not in Snappy raw format or -- otherwise ill-formed. decompress :: ByteString -> Maybe ByteString-decompress (BS sfp slen) =- unsafePerformIO $ do- withForeignPtr sfp $- \sptr ->- alloca $- \dlen_ptr ->- case- C.snappy_uncompressed_length+decompress bs = unsafePerformIO $ do+ unsafeUseAsCStringLen bs $ \(sptr, slen) ->+ alloca $ \dlen_ptr ->+ case+ C.snappy_uncompressed_length+ (castPtr sptr)+ (fromIntegral slen)+ dlen_ptr+ of+ 0 -> do+ dlen <- fromIntegral <$> peek dlen_ptr+ dptr <- mallocBytes dlen+ case+ C.snappy_uncompress (castPtr sptr) (fromIntegral slen)+ (castPtr dptr) dlen_ptr- of- 0 -> do- dlen <- fromIntegral <$> peek dlen_ptr- dfp <- mallocForeignPtrBytes dlen- withForeignPtr dfp $- \dptr ->- case- C.snappy_uncompress- (castPtr sptr)- (fromIntegral slen)- (castPtr dptr)- dlen_ptr- of- 0 ->- Just . BS dfp . fromIntegral <$> peek dlen_ptr- 1 ->- -- Invalid input. Successful result from- -- snappy_uncompressed_length does *not* mean the- -- input is completely valid- return Nothing- status ->- error $- "impossible: decompression failed with status " ++- show status- 1 ->- return Nothing- status ->- error $- "impossible: snappy_uncompressed_length failed with " ++- "status" ++ show status+ of+ 0 -> do+ len <- fromIntegral <$> peek dlen_ptr+ Just <$> unsafePackMallocCStringLen (dptr, len)+ 1 ->+ -- Invalid input. Successful result from+ -- snappy_uncompressed_length does *not* mean the+ -- input is completely valid+ return Nothing+ status ->+ error $+ "impossible: decompression failed with status " +++ show status+ 1 ->+ return Nothing+ status ->+ error $+ "impossible: snappy_uncompressed_length failed with " +++ "status" ++ show status