    {- |
       Module      :  System.Win32.String
       Copyright   :  2013 shelarcy
       License     :  BSD-style

       Maintainer  :  shelarcy@gmail.com
       Stability   :  Provisional
       Portability :  Non-portable (Win32 API)

       Utilities for primitive marshalling of Windows' C strings.
    -}
    module System.Win32.String
      ( LPSTR, LPCSTR, LPWSTR, LPCWSTR
      , TCHAR, LPTSTR, LPCTSTR, LPCTSTR_
      , withTString, withTStringLen, peekTString, peekTStringLen
      , newTString
      , withTStringBuffer, withTStringBufferLen
      ) where
    import System.Win32.Types

    -- | Marshal a dummy Haskell string into a NUL terminated C wide string

    -- using temporary storage.

    --

    -- * the Haskell string is created by length parameter. And the Haskell

    --   string contains /only/ NUL characters.

    --

    -- * the memory is freed when the subcomputation terminates (either

    --   normally or via an exception), so the pointer to the temporary

    --   storage must /not/ be used after this.

    --

    withTStringBuffer :: Int -> (LPTSTR -> IO a) -> IO a
    withTStringBuffer :: forall a. Int -> (LPTSTR -> IO a) -> IO a
    withTStringBuffer Int
    maxLength
      = let dummyBuffer :: [Char]
    dummyBuffer = forall a. Int -> a -> [a]
    replicate Int
    maxLength Char
    '\0'
        in  forall a. [Char] -> (LPTSTR -> IO a) -> IO a
    withTString [Char]
    dummyBuffer

    -- | Marshal a dummy Haskell string into a C wide string (i.e. wide

    -- character array) in temporary storage, with explicit length

    -- information.

    --

    -- * the Haskell string is created by length parameter. And the Haskell

    --   string contains /only/ NUL characters.

    --

    -- * the memory is freed when the subcomputation terminates (either

    --   normally or via an exception), so the pointer to the temporary

    --   storage must /not/ be used after this.

    --

    withTStringBufferLen :: Int -> ((LPTSTR, Int) -> IO a) -> IO a
    withTStringBufferLen :: forall a. Int -> ((LPTSTR, Int) -> IO a) -> IO a
    withTStringBufferLen Int
    maxLength
      = let dummyBuffer :: [Char]
    dummyBuffer = forall a. Int -> a -> [a]
    replicate Int
    maxLength Char
    '\0'
        in  forall a. [Char] -> ((LPTSTR, Int) -> IO a) -> IO a
    withTStringLen [Char]
    dummyBuffer