{-# LINE 1 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
{- |
{-# LINE 2 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
A Unicode-aware module for interacting with files.  We just need enough to support
filename completion.  In particular, these functions will silently handle all errors
(for example, file does not exist)
-}
module System.Console.Haskeline.Directory(
                    getDirectoryContents,
                    doesDirectoryExist,
                    getHomeDirectory
                    ) where


{-# LINE 13 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}

import Foreign
import Foreign.C
import System.Win32.Types

{-# LINE 18 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
import qualified System.Directory

{-# LINE 20 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}


{-# LINE 22 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}

{-# LINE 23 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}

#if defined(i386_HOST_ARCH)
# define WINDOWS_CCONV stdcall
#elif defined(x86_64_HOST_ARCH)
# define WINDOWS_CCONV ccall
#else
# error Unknown mingw32 arch
#endif

foreign import WINDOWS_CCONV "FindFirstFileW" c_FindFirstFile
            :: LPCTSTR -> Ptr () -> IO HANDLE

foreign import WINDOWS_CCONV "FindNextFileW" c_FindNextFile
            :: HANDLE -> Ptr () -> IO Bool

foreign import WINDOWS_CCONV "FindClose" c_FindClose :: HANDLE -> IO BOOL

getDirectoryContents :: FilePath -> IO [FilePath]
getDirectoryContents fp = allocaBytes ((320)) $ \findP ->
{-# LINE 42 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
    withCWString (fp ++ "\\*") $ \t_arr -> do
        h <- c_FindFirstFile t_arr findP
        if h == iNVALID_HANDLE_VALUE
            then return []
            else loop h findP
  where
    loop h findP = do
        f <- peekFileName findP
        isNext <- c_FindNextFile h findP
        if isNext
            then do {fs <- loop h findP; return (f:fs)}
            else c_FindClose h >> return [f]
    peekFileName = peekCWString . ((\hsc_ptr -> hsc_ptr `plusPtr` 44))
{-# LINE 55 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}

foreign import WINDOWS_CCONV "GetFileAttributesW" c_GetFileAttributes
            :: LPCTSTR -> IO DWORD

doesDirectoryExist :: FilePath -> IO Bool
doesDirectoryExist file = do
    attrs <- withCWString file c_GetFileAttributes
    return $ attrs /= (4294967295)
{-# LINE 63 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
            && (attrs .&. (16)) /= 0
{-# LINE 64 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}


{-# LINE 66 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}
getHomeDirectory :: IO FilePath
getHomeDirectory = System.Directory.getHomeDirectory

{-# LINE 82 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}


{-# LINE 121 "libraries\haskeline\System\Console\Haskeline\Directory.hsc" #-}