From d1a85eb87934d348c9789aec59c751fa615ec363 Mon Sep 17 00:00:00 2001 From: Benjamin Barenblat Date: Thu, 23 Aug 2018 17:24:47 -0400 Subject: Clean up casts Use unsigned char buffers more pervasively throughout the code. This removes most calls to `asCUCharBuf`, isolating `unsafeCoerce` further. By making some type signatures slightly more flexible, also eliminate most explicit integer conversions. --- src/BTLS/Buffer.hs | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/BTLS/Buffer.hs (limited to 'src/BTLS/Buffer.hs') diff --git a/src/BTLS/Buffer.hs b/src/BTLS/Buffer.hs new file mode 100644 index 0000000..d7b3f14 --- /dev/null +++ b/src/BTLS/Buffer.hs @@ -0,0 +1,41 @@ +-- Copyright 2018 Google LLC +-- +-- Licensed under the Apache License, Version 2.0 (the "License"); you may not +-- use this file except in compliance with the License. You may obtain a copy of +-- the License at +-- +-- https://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, software +-- distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +-- WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +-- License for the specific language governing permissions and limitations under +-- the License. + +module BTLS.Buffer + ( unsafeUseAsCUStringLen + , packCUStringLen + ) where + +import Data.ByteString (ByteString) +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Unsafe as ByteString +import Foreign (Ptr) +import Foreign.C.Types +import Unsafe.Coerce (unsafeCoerce) + +unsafeUseAsCUStringLen :: + Integral n => ByteString -> ((Ptr CUChar, n) -> IO a) -> IO a +unsafeUseAsCUStringLen bs f = + ByteString.unsafeUseAsCStringLen bs $ \(pStr, len) -> + f (asCUCharBuf pStr, fromIntegral len) + +packCUStringLen :: Integral n => (Ptr CUChar, n) -> IO ByteString +packCUStringLen (pStr, len) = + ByteString.packCStringLen (asCCharBuf pStr, fromIntegral len) + +asCUCharBuf :: Ptr CChar -> Ptr CUChar +asCUCharBuf = unsafeCoerce + +asCCharBuf :: Ptr CUChar -> Ptr CChar +asCCharBuf = unsafeCoerce -- cgit v1.2.3