Add makeRelativeToCurrentDirectory
[haskell-directory.git] / System / Directory.hs
index 2a80587..beed879 100644 (file)
@@ -39,6 +39,7 @@ module System.Directory
     , copyFile                  -- :: FilePath -> FilePath -> IO ()
     
     , canonicalizePath
+    , makeRelativeToCurrentDirectory
     , findExecutable
 
     -- * Existence tests
@@ -67,6 +68,7 @@ module System.Directory
 
 import System.Directory.Internals
 import System.Environment      ( getEnv )
+import System.FilePath
 import System.IO.Error
 import Control.Monad           ( when, unless )
 
@@ -81,7 +83,7 @@ import Hugs.Directory
 import Foreign
 import Foreign.C
 
-{-# CFILES cbits/PrelIOUtils.c #-}
+{-# CFILES cbits/directory.c #-}
 
 #ifdef __GLASGOW_HASKELL__
 import Prelude
@@ -596,6 +598,12 @@ foreign import ccall unsafe "realpath"
                               -> IO CString
 #endif
 
+-- | 'makeRelative' the current directory.
+makeRelativeToCurrentDirectory :: FilePath -> IO FilePath
+makeRelativeToCurrentDirectory x = do
+    cur <- getCurrentDirectory
+    return $ makeRelative cur x
+
 -- | Given an executable file name, searches for such file
 -- in the directories listed in system PATH. The returned value 
 -- is the path to the found executable or Nothing if there isn't
@@ -862,19 +870,23 @@ fileNameEndClean name =
       i  = (length name) - 1
       ec = name !! i
 
-foreign import ccall unsafe "__hscore_R_OK" r_OK :: CMode
-foreign import ccall unsafe "__hscore_W_OK" w_OK :: CMode
-foreign import ccall unsafe "__hscore_X_OK" x_OK :: CMode
+foreign import ccall unsafe "__hscore_R_OK" r_OK :: CInt
+foreign import ccall unsafe "__hscore_W_OK" w_OK :: CInt
+foreign import ccall unsafe "__hscore_X_OK" x_OK :: CInt
 
 foreign import ccall unsafe "__hscore_S_IRUSR" s_IRUSR :: CMode
 foreign import ccall unsafe "__hscore_S_IWUSR" s_IWUSR :: CMode
 foreign import ccall unsafe "__hscore_S_IXUSR" s_IXUSR :: CMode
 
-#endif /* __GLASGOW_HASKELL__ */
-
 foreign import ccall unsafe "__hscore_long_path_size"
   long_path_size :: Int
 
+#else
+long_path_size :: Int
+long_path_size = 2048  --  // guess?
+
+#endif /* __GLASGOW_HASKELL__ */
+
 {- | Returns the current user's home directory.
 
 The directory returned is expected to be writable by the current user,