{-# LANGUAGE TypeApplications #-} -- | Copyright : Will Thompson, Iñaki García Etxebarria and Jonas Platte -- License : LGPL-2.1 -- Maintainer : Iñaki García Etxebarria -- -- A t'GI.Pango.Structs.ScriptIter.ScriptIter' is used to iterate through a string -- and identify ranges in different scripts. #if (MIN_VERSION_haskell_gi_overloading(1,0,0) && !defined(__HADDOCK_VERSION__)) #define ENABLE_OVERLOADING #endif module GI.Pango.Structs.ScriptIter ( -- * Exported types ScriptIter(..) , noScriptIter , -- * Methods -- ** Overloaded methods #method:Overloaded methods# #if defined(ENABLE_OVERLOADING) ResolveScriptIterMethod , #endif -- ** free #method:free# #if defined(ENABLE_OVERLOADING) ScriptIterFreeMethodInfo , #endif scriptIterFree , -- ** getRange #method:getRange# #if defined(ENABLE_OVERLOADING) ScriptIterGetRangeMethodInfo , #endif scriptIterGetRange , -- ** new #method:new# scriptIterNew , -- ** next #method:next# #if defined(ENABLE_OVERLOADING) ScriptIterNextMethodInfo , #endif scriptIterNext , ) where import Data.GI.Base.ShortPrelude import qualified Data.GI.Base.ShortPrelude as SP import qualified Data.GI.Base.Overloading as O import qualified Prelude as P import qualified Data.GI.Base.Attributes as GI.Attributes import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr import qualified Data.GI.Base.GClosure as B.GClosure import qualified Data.GI.Base.GError as B.GError import qualified Data.GI.Base.GVariant as B.GVariant import qualified Data.GI.Base.GValue as B.GValue import qualified Data.GI.Base.GParamSpec as B.GParamSpec import qualified Data.GI.Base.CallStack as B.CallStack import qualified Data.GI.Base.Properties as B.Properties import qualified Data.GI.Base.Signals as B.Signals import qualified Data.Text as T import qualified Data.ByteString.Char8 as B import qualified Data.Map as Map import qualified Foreign.Ptr as FP import qualified GHC.OverloadedLabels as OL import {-# SOURCE #-} qualified GI.Pango.Enums as Pango.Enums -- | Memory-managed wrapper type. newtype ScriptIter = ScriptIter (ManagedPtr ScriptIter) deriving (Eq) foreign import ccall "pango_script_iter_get_type" c_pango_script_iter_get_type :: IO GType instance BoxedObject ScriptIter where boxedType _ = c_pango_script_iter_get_type -- | Convert 'ScriptIter' to and from 'Data.GI.Base.GValue.GValue' with 'Data.GI.Base.GValue.toGValue' and 'Data.GI.Base.GValue.fromGValue'. instance B.GValue.IsGValue ScriptIter where toGValue o = do gtype <- c_pango_script_iter_get_type B.ManagedPtr.withManagedPtr o (B.GValue.buildGValue gtype B.GValue.set_boxed) fromGValue gv = do ptr <- B.GValue.get_boxed gv :: IO (Ptr ScriptIter) B.ManagedPtr.newBoxed ScriptIter ptr -- | A convenience alias for `Nothing` :: `Maybe` `ScriptIter`. noScriptIter :: Maybe ScriptIter noScriptIter = Nothing #if defined(ENABLE_OVERLOADING) instance O.HasAttributeList ScriptIter type instance O.AttributeList ScriptIter = ScriptIterAttributeList type ScriptIterAttributeList = ('[ ] :: [(Symbol, *)]) #endif -- method ScriptIter::new -- method type : Constructor -- Args: [ Arg -- { argCName = "text" -- , argType = TBasicType TUTF8 -- , direction = DirectionIn -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = Just "a UTF-8 string" , sinceVersion = Nothing } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferNothing -- } -- , Arg -- { argCName = "length" -- , argType = TBasicType TInt -- , direction = DirectionIn -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = -- Just "length of @text, or -1 if @text is nul-terminated." -- , sinceVersion = Nothing -- } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferNothing -- } -- ] -- Lengths: [] -- returnType: Just -- (TInterface Name { namespace = "Pango" , name = "ScriptIter" }) -- throws : False -- Skip return : False foreign import ccall "pango_script_iter_new" pango_script_iter_new :: CString -> -- text : TBasicType TUTF8 Int32 -> -- length : TBasicType TInt IO (Ptr ScriptIter) -- | Create a new t'GI.Pango.Structs.ScriptIter.ScriptIter', used to break a string of -- Unicode text into runs by Unicode script. No copy is made of -- /@text@/, so the caller needs to make sure it remains valid until -- the iterator is freed with 'GI.Pango.Structs.ScriptIter.scriptIterFree'. -- -- /Since: 1.4/ scriptIterNew :: (B.CallStack.HasCallStack, MonadIO m) => T.Text -- ^ /@text@/: a UTF-8 string -> Int32 -- ^ /@length@/: length of /@text@/, or -1 if /@text@/ is nul-terminated. -> m ScriptIter -- ^ __Returns:__ the new script iterator, initialized -- to point at the first range in the text, which should be -- freed with 'GI.Pango.Structs.ScriptIter.scriptIterFree'. If the string is -- empty, it will point at an empty range. scriptIterNew text length_ = liftIO $ do text' <- textToCString text result <- pango_script_iter_new text' length_ checkUnexpectedReturnNULL "scriptIterNew" result result' <- (wrapBoxed ScriptIter) result freeMem text' return result' #if defined(ENABLE_OVERLOADING) #endif -- method ScriptIter::free -- method type : OrdinaryMethod -- Args: [ Arg -- { argCName = "iter" -- , argType = -- TInterface Name { namespace = "Pango" , name = "ScriptIter" } -- , direction = DirectionIn -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = Just "a #PangoScriptIter" , sinceVersion = Nothing } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferNothing -- } -- ] -- Lengths: [] -- returnType: Nothing -- throws : False -- Skip return : False foreign import ccall "pango_script_iter_free" pango_script_iter_free :: Ptr ScriptIter -> -- iter : TInterface (Name {namespace = "Pango", name = "ScriptIter"}) IO () -- | Frees a t'GI.Pango.Structs.ScriptIter.ScriptIter' created with 'GI.Pango.Structs.ScriptIter.scriptIterNew'. -- -- /Since: 1.4/ scriptIterFree :: (B.CallStack.HasCallStack, MonadIO m) => ScriptIter -- ^ /@iter@/: a t'GI.Pango.Structs.ScriptIter.ScriptIter' -> m () scriptIterFree iter = liftIO $ do iter' <- unsafeManagedPtrGetPtr iter pango_script_iter_free iter' touchManagedPtr iter return () #if defined(ENABLE_OVERLOADING) data ScriptIterFreeMethodInfo instance (signature ~ (m ()), MonadIO m) => O.MethodInfo ScriptIterFreeMethodInfo ScriptIter signature where overloadedMethod = scriptIterFree #endif -- method ScriptIter::get_range -- method type : OrdinaryMethod -- Args: [ Arg -- { argCName = "iter" -- , argType = -- TInterface Name { namespace = "Pango" , name = "ScriptIter" } -- , direction = DirectionIn -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = Just "a #PangoScriptIter" , sinceVersion = Nothing } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferNothing -- } -- , Arg -- { argCName = "start" -- , argType = TBasicType TUTF8 -- , direction = DirectionOut -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = -- Just "location to store start position of the range, or %NULL" -- , sinceVersion = Nothing -- } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferEverything -- } -- , Arg -- { argCName = "end" -- , argType = TBasicType TUTF8 -- , direction = DirectionOut -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = -- Just "location to store end position of the range, or %NULL" -- , sinceVersion = Nothing -- } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferEverything -- } -- , Arg -- { argCName = "script" -- , argType = -- TInterface Name { namespace = "Pango" , name = "Script" } -- , direction = DirectionOut -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = Just "location to store script for range, or %NULL" -- , sinceVersion = Nothing -- } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferEverything -- } -- ] -- Lengths: [] -- returnType: Nothing -- throws : False -- Skip return : False foreign import ccall "pango_script_iter_get_range" pango_script_iter_get_range :: Ptr ScriptIter -> -- iter : TInterface (Name {namespace = "Pango", name = "ScriptIter"}) Ptr CString -> -- start : TBasicType TUTF8 Ptr CString -> -- end : TBasicType TUTF8 Ptr CInt -> -- script : TInterface (Name {namespace = "Pango", name = "Script"}) IO () -- | Gets information about the range to which /@iter@/ currently points. -- The range is the set of locations p where *start \<= p \< *end. -- (That is, it doesn\'t include the character stored at *end) -- -- Note that while the type of the /@script@/ argument is declared -- as PangoScript, as of Pango 1.18, this function simply returns -- GUnicodeScript values. Callers must be prepared to handle unknown -- values. -- -- /Since: 1.4/ scriptIterGetRange :: (B.CallStack.HasCallStack, MonadIO m) => ScriptIter -- ^ /@iter@/: a t'GI.Pango.Structs.ScriptIter.ScriptIter' -> m ((T.Text, T.Text, Pango.Enums.Script)) scriptIterGetRange iter = liftIO $ do iter' <- unsafeManagedPtrGetPtr iter start <- allocMem :: IO (Ptr CString) end <- allocMem :: IO (Ptr CString) script <- allocMem :: IO (Ptr CInt) pango_script_iter_get_range iter' start end script start' <- peek start start'' <- cstringToText start' freeMem start' end' <- peek end end'' <- cstringToText end' freeMem end' script' <- peek script let script'' = (toEnum . fromIntegral) script' touchManagedPtr iter freeMem start freeMem end freeMem script return (start'', end'', script'') #if defined(ENABLE_OVERLOADING) data ScriptIterGetRangeMethodInfo instance (signature ~ (m ((T.Text, T.Text, Pango.Enums.Script))), MonadIO m) => O.MethodInfo ScriptIterGetRangeMethodInfo ScriptIter signature where overloadedMethod = scriptIterGetRange #endif -- method ScriptIter::next -- method type : OrdinaryMethod -- Args: [ Arg -- { argCName = "iter" -- , argType = -- TInterface Name { namespace = "Pango" , name = "ScriptIter" } -- , direction = DirectionIn -- , mayBeNull = False -- , argDoc = -- Documentation -- { rawDocText = Just "a #PangoScriptIter" , sinceVersion = Nothing } -- , argScope = ScopeTypeInvalid -- , argClosure = -1 -- , argDestroy = -1 -- , argCallerAllocates = False -- , transfer = TransferNothing -- } -- ] -- Lengths: [] -- returnType: Just (TBasicType TBoolean) -- throws : False -- Skip return : False foreign import ccall "pango_script_iter_next" pango_script_iter_next :: Ptr ScriptIter -> -- iter : TInterface (Name {namespace = "Pango", name = "ScriptIter"}) IO CInt -- | Advances a t'GI.Pango.Structs.ScriptIter.ScriptIter' to the next range. If /@iter@/ -- is already at the end, it is left unchanged and 'P.False' -- is returned. -- -- /Since: 1.4/ scriptIterNext :: (B.CallStack.HasCallStack, MonadIO m) => ScriptIter -- ^ /@iter@/: a t'GI.Pango.Structs.ScriptIter.ScriptIter' -> m Bool -- ^ __Returns:__ 'P.True' if /@iter@/ was successfully advanced. scriptIterNext iter = liftIO $ do iter' <- unsafeManagedPtrGetPtr iter result <- pango_script_iter_next iter' let result' = (/= 0) result touchManagedPtr iter return result' #if defined(ENABLE_OVERLOADING) data ScriptIterNextMethodInfo instance (signature ~ (m Bool), MonadIO m) => O.MethodInfo ScriptIterNextMethodInfo ScriptIter signature where overloadedMethod = scriptIterNext #endif #if defined(ENABLE_OVERLOADING) type family ResolveScriptIterMethod (t :: Symbol) (o :: *) :: * where ResolveScriptIterMethod "free" o = ScriptIterFreeMethodInfo ResolveScriptIterMethod "next" o = ScriptIterNextMethodInfo ResolveScriptIterMethod "getRange" o = ScriptIterGetRangeMethodInfo ResolveScriptIterMethod l o = O.MethodResolutionFailed l o instance (info ~ ResolveScriptIterMethod t ScriptIter, O.MethodInfo info ScriptIter p) => OL.IsLabel t (ScriptIter -> p) where #if MIN_VERSION_base(4,10,0) fromLabel = O.overloadedMethod @info #else fromLabel _ = O.overloadedMethod @info #endif #endif