module Coadjute.Util.File(
doesPathExist, allPathsExist,
toAbsolutePath
) where
import System.Directory (getCurrentDirectory)
import System.FilePath ((</>), isAbsolute)
#if mingw32_HOST_OS
import System.Win32.Types (withTString)
import System.Win32.File (c_GetFileAttributes)
#else
import Foreign.C.String (withCString)
import Foreign.Marshal.Alloc (allocaBytes)
import System.FilePath
(isDrive, dropTrailingPathSeparator, addTrailingPathSeparator)
import System.Posix.Internals (sizeof_stat, lstat)
#endif
import Coadjute.Util.Monad (allM)
doesPathExist :: FilePath -> IO Bool
#if mingw32_HOST_OS
doesPathExist = flip withTString (fmap (/= 0xffffffff).c_GetFileAttributes)
#else
doesPathExist s =
allocaBytes sizeof_stat $ \p ->
withCString
(if isDrive s
then addTrailingPathSeparator s
else dropTrailingPathSeparator s)
$ \c -> fmap (==0) (lstat c p)
#endif
allPathsExist :: [FilePath] -> IO Bool
allPathsExist = allM doesPathExist
toAbsolutePath :: FilePath -> IO FilePath
toAbsolutePath p =
if isAbsolute p
then return p
else fmap (</> p) getCurrentDirectory