{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE TupleSections #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Data.Text.ToolsYj (cstrToText) where

import Foreign.Ptr
import Foreign.Storable
import Foreign.C.String
import Data.Text qualified as Txt
import Data.Text.Foreign qualified as Txt

cstrToText :: CString -> IO Txt.Text
cstrToText :: CString -> IO Text
cstrToText CString
cs = CStringLen -> IO Text
Txt.peekCStringLen (CStringLen -> IO Text) -> IO CStringLen -> IO Text
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< CString -> IO CStringLen
cstringToCStringLen CString
cs

cstringLength :: CString -> IO Int
cstringLength :: CString -> IO Int
cstringLength CString
pc = do
	c <- CString -> IO CChar
forall a. Storable a => Ptr a -> IO a
peek CString
pc
	case c of
		CChar
0 -> Int -> IO Int
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0
		CChar
_ -> (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int -> Int) -> IO Int -> IO Int
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CString -> IO Int
cstringLength (CString
pc CString -> Int -> CString
forall a b. Ptr a -> Int -> Ptr b
`plusPtr` Int
1)

cstringToCStringLen :: CString -> IO CStringLen
cstringToCStringLen :: CString -> IO CStringLen
cstringToCStringLen CString
cs = (CString
cs ,) (Int -> CStringLen) -> IO Int -> IO CStringLen
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CString -> IO Int
cstringLength CString
cs