Copyright | (c) Don Stewart 2006-2008 (c) Duncan Coutts 2006-2012 |
---|---|
License | BSD-style |
Maintainer | dons00@gmail.com, duncan@community.haskell.org |
Stability | unstable |
Portability | non-portable |
Safe Haskell | Unsafe |
Language | Haskell98 |
A module containing semi-public ByteString
internals. This exposes the
ByteString
representation and low level construction functions. As such
all the functions in this module are unsafe. The API is also not stable.
Where possible application should instead use the functions from the normal public interface modules, such as Data.ByteString.Unsafe. Packages that extend the ByteString system at a low level will need to use this module.
Synopsis
- data ByteString = PS !(ForeignPtr Word8) !Int !Int
- packBytes :: [Word8] -> ByteString
- packUptoLenBytes :: Int -> [Word8] -> (ByteString, [Word8])
- unsafePackLenBytes :: Int -> [Word8] -> ByteString
- packChars :: [Char] -> ByteString
- packUptoLenChars :: Int -> [Char] -> (ByteString, [Char])
- unsafePackLenChars :: Int -> [Char] -> ByteString
- unpackBytes :: ByteString -> [Word8]
- unpackAppendBytesLazy :: ByteString -> [Word8] -> [Word8]
- unpackAppendBytesStrict :: ByteString -> [Word8] -> [Word8]
- unpackChars :: ByteString -> [Char]
- unpackAppendCharsLazy :: ByteString -> [Char] -> [Char]
- unpackAppendCharsStrict :: ByteString -> [Char] -> [Char]
- unsafePackAddress :: Addr# -> IO ByteString
- create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString
- createUptoN :: Int -> (Ptr Word8 -> IO Int) -> IO ByteString
- createAndTrim :: Int -> (Ptr Word8 -> IO Int) -> IO ByteString
- createAndTrim' :: Int -> (Ptr Word8 -> IO (Int, Int, a)) -> IO (ByteString, a)
- unsafeCreate :: Int -> (Ptr Word8 -> IO ()) -> ByteString
- unsafeCreateUptoN :: Int -> (Ptr Word8 -> IO Int) -> ByteString
- mallocByteString :: Int -> IO (ForeignPtr a)
- fromForeignPtr :: ForeignPtr Word8 -> Int -> Int -> ByteString
- toForeignPtr :: ByteString -> (ForeignPtr Word8, Int, Int)
- nullForeignPtr :: ForeignPtr Word8
- checkedAdd :: String -> Int -> Int -> Int
- c_strlen :: CString -> IO CSize
- c_free_finalizer :: FunPtr (Ptr Word8 -> IO ())
- memchr :: Ptr Word8 -> Word8 -> CSize -> IO (Ptr Word8)
- memcmp :: Ptr Word8 -> Ptr Word8 -> Int -> IO CInt
- memcpy :: Ptr Word8 -> Ptr Word8 -> Int -> IO ()
- memset :: Ptr Word8 -> Word8 -> CSize -> IO (Ptr Word8)
- c_reverse :: Ptr Word8 -> Ptr Word8 -> CULong -> IO ()
- c_intersperse :: Ptr Word8 -> Ptr Word8 -> CULong -> Word8 -> IO ()
- c_maximum :: Ptr Word8 -> CULong -> IO Word8
- c_minimum :: Ptr Word8 -> CULong -> IO Word8
- c_count :: Ptr Word8 -> CULong -> Word8 -> IO CULong
- w2c :: Word8 -> Char
- c2w :: Char -> Word8
- isSpaceWord8 :: Word8 -> Bool
- isSpaceChar8 :: Char -> Bool
- accursedUnutterablePerformIO :: IO a -> a
- inlinePerformIO :: IO a -> a
The ByteString
type and representation
data ByteString Source #
A space-efficient representation of a Word8
vector, supporting many
efficient operations.
A ByteString
contains 8-bit bytes, or by using the operations from
Data.ByteString.Char8 it can be interpreted as containing 8-bit
characters.
PS !(ForeignPtr Word8) !Int !Int |
Instances
Conversion with lists: packing and unpacking
packBytes :: [Word8] -> ByteString Source #
packUptoLenBytes :: Int -> [Word8] -> (ByteString, [Word8]) Source #
unsafePackLenBytes :: Int -> [Word8] -> ByteString Source #
packChars :: [Char] -> ByteString Source #
packUptoLenChars :: Int -> [Char] -> (ByteString, [Char]) Source #
unsafePackLenChars :: Int -> [Char] -> ByteString Source #
unpackBytes :: ByteString -> [Word8] Source #
unpackAppendBytesLazy :: ByteString -> [Word8] -> [Word8] Source #
unpackAppendBytesStrict :: ByteString -> [Word8] -> [Word8] Source #
unpackChars :: ByteString -> [Char] Source #
unpackAppendCharsLazy :: ByteString -> [Char] -> [Char] Source #
unpackAppendCharsStrict :: ByteString -> [Char] -> [Char] Source #
unsafePackAddress :: Addr# -> IO ByteString Source #
O(n) Pack a null-terminated sequence of bytes, pointed to by an
Addr# (an arbitrary machine address assumed to point outside the
garbage-collected heap) into a ByteString
. A much faster way to
create an Addr# is with an unboxed string literal, than to pack a
boxed string. A unboxed string literal is compiled to a static char
[]
by GHC. Establishing the length of the string requires a call to
strlen(3)
, so the Addr# must point to a null-terminated buffer (as
is the case with "string"# literals in GHC). Use unsafePackAddressLen
if you know the length of the string statically.
An example:
literalFS = unsafePackAddress "literal"#
This function is unsafe. If you modify the buffer pointed to by the
original Addr# this modification will be reflected in the resulting
ByteString
, breaking referential transparency.
Note this also won't work if your Addr# has embedded '0' characters in
the string, as strlen
will return too short a length.
Low level imperative construction
create :: Int -> (Ptr Word8 -> IO ()) -> IO ByteString Source #
Create ByteString of size l
and use action f
to fill it's contents.
createUptoN :: Int -> (Ptr Word8 -> IO Int) -> IO ByteString Source #
Create ByteString of up to size size l
and use action f
to fill it's
contents which returns its true size.
createAndTrim :: Int -> (Ptr Word8 -> IO Int) -> IO ByteString Source #
Given the maximum size needed and a function to make the contents
of a ByteString, createAndTrim makes the ByteString
. The generating
function is required to return the actual final size (<= the maximum
size), and the resulting byte array is realloced to this size.
createAndTrim is the main mechanism for creating custom, efficient ByteString functions, using Haskell or C functions to fill the space.
unsafeCreate :: Int -> (Ptr Word8 -> IO ()) -> ByteString Source #
A way of creating ByteStrings outside the IO monad. The Int
argument gives the final size of the ByteString.
unsafeCreateUptoN :: Int -> (Ptr Word8 -> IO Int) -> ByteString Source #
Like unsafeCreate
but instead of giving the final size of the
ByteString, it is just an upper bound. The inner action returns
the actual size. Unlike createAndTrim
the ByteString is not
reallocated if the final size is less than the estimated size.
mallocByteString :: Int -> IO (ForeignPtr a) Source #
Wrapper of mallocForeignPtrBytes
with faster implementation for GHC
Conversion to and from ForeignPtrs
:: ForeignPtr Word8 | |
-> Int | Offset |
-> Int | Length |
-> ByteString |
O(1) Build a ByteString from a ForeignPtr.
If you do not need the offset parameter then you do should be using
unsafePackCStringLen
or
unsafePackCStringFinalizer
instead.
:: ByteString | |
-> (ForeignPtr Word8, Int, Int) | (ptr, offset, length) |
O(1) Deconstruct a ForeignPtr from a ByteString
Utilities
nullForeignPtr :: ForeignPtr Word8 Source #
The 0 pointer. Used to indicate the empty Bytestring.
checkedAdd :: String -> Int -> Int -> Int Source #
Add two non-negative numbers. Errors out on overflow.
Standard C Functions
cbits functions
Chars
isSpaceWord8 :: Word8 -> Bool Source #
Selects words corresponding to white-space characters in the Latin-1 range ordered by frequency.
isSpaceChar8 :: Char -> Bool Source #
Selects white-space characters in the Latin-1 range
Deprecated and unmentionable
accursedUnutterablePerformIO :: IO a -> a Source #
This "function" has a superficial similarity to unsafePerformIO
but
it is in fact a malevolent agent of chaos. It unpicks the seams of reality
(and the IO
monad) so that the normal rules no longer apply. It lulls you
into thinking it is reasonable, but when you are not looking it stabs you
in the back and aliases all of your mutable buffers. The carcass of many a
seasoned Haskell programmer lie strewn at its feet.
Witness the trail of destruction:
- https://github.com/haskell/bytestring/commit/71c4b438c675aa360c79d79acc9a491e7bbc26e7
- https://github.com/haskell/bytestring/commit/210c656390ae617d9ee3b8bcff5c88dd17cef8da
- https://ghc.haskell.org/trac/ghc/ticket/3486
- https://ghc.haskell.org/trac/ghc/ticket/3487
- https://ghc.haskell.org/trac/ghc/ticket/7270
Do not talk about "safe"! You do not know what is safe!
Yield not to its blasphemous call! Flee traveller! Flee or you will be corrupted and devoured!
inlinePerformIO :: IO a -> a Source #
Deprecated: If you think you know what you are doing, use unsafePerformIO
. If you are sure you know what you are doing, use unsafeDupablePerformIO
. If you enjoy sharing an address space with a malevolent agent of chaos, try accursedUnutterablePerformIO
.