packages feed

simple-pango-0.1.0.1: src/Foreign/C/String/ForeignCStringLen.hs

{-# LANGUAGE LambdaCase, TupleSections #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Foreign.C.String.ForeignCStringLen (
	ForeignCStringLen, copyToForeignCStringLen, withForeignCStringLen
	) where

import Foreign.ForeignPtr hiding (newForeignPtr)
import Foreign.Concurrent
import Foreign.Marshal
import Foreign.C.String
import Foreign.C.Types

type ForeignCStringLen = (ForeignPtr CChar, Int)

copyToForeignCStringLen :: CStringLen -> IO ForeignCStringLen
copyToForeignCStringLen (cs, n) = do
	p <- mallocBytes n
	copyBytes p cs n
	newForeignCStringLen (p, n) (free p)

newForeignCStringLen :: CStringLen -> IO () -> IO ForeignCStringLen
newForeignCStringLen (p, l) fr = (, l) <$> newForeignPtr p fr

withForeignCStringLen :: ForeignCStringLen -> (CStringLen -> IO a) -> IO a
withForeignCStringLen (fp, l) f = withForeignPtr fp $ f . (, l)