81 lines
1.9 KiB
Haskell
81 lines
1.9 KiB
Haskell
{--
|
|
HSFM, a filemanager written in Haskell.
|
|
Copyright (C) 2016 Julian Ospald
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU General Public License
|
|
version 2 as published by the Free Software Foundation.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
--}
|
|
|
|
{-# LANGUAGE OverloadedStrings #-}
|
|
{-# OPTIONS_HADDOCK ignore-exports #-}
|
|
|
|
|
|
module HSFM.GUI.Glib.GlibString where
|
|
|
|
|
|
import qualified Data.ByteString as BS
|
|
import Data.ByteString.UTF8
|
|
(
|
|
toString
|
|
)
|
|
import Data.Word8
|
|
(
|
|
_percent
|
|
)
|
|
import Foreign.C.String
|
|
(
|
|
CStringLen
|
|
, CString
|
|
)
|
|
import Foreign.C.Types
|
|
(
|
|
CSize(..)
|
|
)
|
|
import Foreign.Marshal.Utils
|
|
(
|
|
maybePeek
|
|
)
|
|
import Foreign.Ptr
|
|
(
|
|
nullPtr
|
|
, plusPtr
|
|
)
|
|
import System.Glib.UTFString
|
|
|
|
|
|
|
|
-- TODO: move this to its own module
|
|
instance GlibString BS.ByteString where
|
|
withUTFString = BS.useAsCString
|
|
withUTFStringLen s f = BS.useAsCStringLen s (f . noNullPtrs)
|
|
peekUTFString s = do
|
|
len <- c_strlen s
|
|
BS.packCStringLen (s, fromIntegral len)
|
|
maybePeekUTFString = maybePeek peekUTFString
|
|
peekUTFStringLen = BS.packCStringLen
|
|
newUTFString = newUTFString . toString
|
|
newUTFStringLen = newUTFStringLen . toString
|
|
genUTFOfs = genUTFOfs . toString
|
|
stringLength = BS.length
|
|
unPrintf s = BS.intercalate "%%" (BS.split _percent s)
|
|
|
|
|
|
foreign import ccall unsafe "string.h strlen" c_strlen
|
|
:: CString -> IO CSize
|
|
|
|
|
|
noNullPtrs :: CStringLen -> CStringLen
|
|
noNullPtrs (p, 0) | p == nullPtr = (plusPtr p 1, 0)
|
|
noNullPtrs s = s
|
|
|