{-# LINE 1 "src/System/Directory/Glob.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
module System.Directory.Glob (
(<>),
glob,
globDefaults,
globMany,
GlobFlag,
globMark,
globNoCheck,
globNoEscape,
globNoSort
) where
import Control.Monad (unless, forM_)
import Data.Monoid ((<>))
import Foreign (alloca, peekArray)
import Foreign.C.String (CString, peekCString, withCString)
import Foreign.C.Types (CInt(..))
import Foreign.Ptr (Ptr, nullPtr)
import Foreign.Storable (Storable(..))
import System.Directory.Glob.Internal
c_glob' :: Ptr CGlob -> GlobFlag -> String -> IO ()
c_glob' globPtr (GlobFlag f) p = withCString p $ \p' -> do
errCode <- c_glob p' f nullPtr globPtr
unless (errCode == 0 || errCode == (3))
{-# LINE 44 "src/System/Directory/Glob.hsc" #-}
(error $ "glob failed with exit code: " ++ show errCode)
glob :: GlobFlag
-> String
-> IO [FilePath]
glob flags pat = alloca $ \globPtr -> do
c_glob' globPtr flags pat
CGlob strs <- peek globPtr
res <- mapM peekCString strs
c_globfree globPtr
return res
globMany :: GlobFlag
-> [String]
-> IO [FilePath]
globMany _ [] = return []
globMany flags (p0:ps) = alloca $ \globPtr -> do
c_glob' globPtr flags p0
forM_ ps . c_glob' globPtr $ flags <> globAppend
CGlob strs <- peek globPtr
res <- mapM peekCString strs
c_globfree globPtr
return res
newtype CGlob = CGlob [CString]
instance Storable CGlob where
sizeOf _ = (72)
{-# LINE 94 "src/System/Directory/Glob.hsc" #-}
alignment _ = 8
{-# LINE 95 "src/System/Directory/Glob.hsc" #-}
peek ptr = do
pathC <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 97 "src/System/Directory/Glob.hsc" #-}
pathV <- peekArray pathC =<< ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 98 "src/System/Directory/Glob.hsc" #-}
return $ CGlob pathV
poke _ _ = error "Poke unsupported for CGlob"
type C_ErrorFunc = Ptr ()
foreign import ccall "glob.h glob"
c_glob :: CString -> CInt -> C_ErrorFunc -> Ptr CGlob -> IO CInt
foreign import ccall "glob.h globfree"
c_globfree :: Ptr CGlob -> IO ()