+{-# OPTIONS -fno-implicit-prelude #-}
+
-----------------------------------------------------------------------------
-- |
-- Module : System.FilePath
, changeFileExt
, isRootedPath
, isAbsolutePath
+ , dropAbsolutePrefix
, pathParents
, commonParent
, isPathSeparator
, pathSeparator
, searchPathSeparator
+
+ -- * Filename extensions
+ , exeExtension
+ , objExtension
+ , dllExtension
) where
-import Data.List(intersperse)
+#ifdef __GLASGOW_HASKELL__
+import GHC.Base
+import GHC.IOBase(FilePath)
+import GHC.Num
+#else
+import Prelude -- necessary to get dependencies right
+#endif
+import Data.Maybe
+import Data.List
--------------------------------------------------------------
-- * FilePath
#endif
isAbsolutePath _ = False
+-- | If the function is applied to an absolute path then it returns a
+-- local path obtained by dropping the absolute prefix from the path.
+-- Under Windows the prefix is @\"\\\"@, @\"c:\"@ or @\"c:\\\"@.
+-- Under Unix the prefix is always @\"\/\"@.
+dropAbsolutePrefix :: FilePath -> FilePath
+dropAbsolutePrefix (c:cs) | isPathSeparator c = cs
+#ifdef mingw32_TARGET_OS
+dropAbsolutePrefix (_:':':c:cs) | isPathSeparator c = cs -- path with drive letter
+dropAbsolutePrefix (_:':':cs) = cs
+#endif
+dropAbsolutePrefix cs = cs
+
-- | Gets this path and all its parents.
-- The function is useful in case if you want to create
-- some file but you aren\'t sure whether all directories
#endif
mb_path -> mb_path
where
+#ifdef mingw32_TARGET_OS
getDrive (d:':':_) ds
| not (d `elem` ds) = d:ds
getDrive _ ds = ds
+#endif
common i acc [] ps = checkSep i acc ps
common i acc (c:cs) ps
-- * Separators
--------------------------------------------------------------
--- | Checks whether the character is a valid path separator for the host platform.
--- The valid character is a 'pathSeparator' but since the Windows operating system
--- also accepts a backslash (\"\\\") the function also checks for \"\/\" on this platform.
+-- | Checks whether the character is a valid path separator for the host
+-- platform. The valid character is a 'pathSeparator' but since the Windows
+-- operating system also accepts a slash (\"\/\") since DOS 2, the function
+-- checks for it on this platform, too.
isPathSeparator :: Char -> Bool
-isPathSeparator ch =
#ifdef mingw32_TARGET_OS
- ch == '/' || ch == '\\'
+isPathSeparator ch = ch == '/' || ch == '\\'
#else
- ch == '/'
+isPathSeparator ch = ch == '/'
#endif
--- | Provides a platform-specific character used to separate directory levels in a
--- path string that reflects a hierarchical file system organization.
--- The separator is a slash (\"\/\") on Unix and Macintosh, and a backslash (\"\\\") on the
--- Windows operating system.
+-- | Provides a platform-specific character used to separate directory levels in
+-- a path string that reflects a hierarchical file system organization. The
+-- separator is a slash (@\"\/\"@) on Unix and Macintosh, and a backslash
+-- (@\"\\\"@) on the Windows operating system.
pathSeparator :: Char
#ifdef mingw32_TARGET_OS
pathSeparator = '\\'
pathSeparator = '/'
#endif
--- | A platform-specific character used to separate search path strings in
--- environment variables. The separator is a colon (\":\") on Unix and Macintosh,
--- and a semicolon (\";\") on the Windows operating system.
+-- | A platform-specific character used to separate search path strings in
+-- environment variables. The separator is a colon (@\":\"@) on Unix and
+-- Macintosh, and a semicolon (@\";\"@) on the Windows operating system.
searchPathSeparator :: Char
#ifdef mingw32_TARGET_OS
searchPathSeparator = ';'
#else
searchPathSeparator = ':'
#endif
+
+-- ToDo: This should be determined via autoconf (AC_EXEEXT)
+-- | Extension for executable files
+-- (typically @\"\"@ on Unix and @\"exe\"@ on Windows or OS\/2)
+exeExtension :: String
+#ifdef mingw32_TARGET_OS
+exeExtension = "exe"
+#else
+exeExtension = ""
+#endif
+
+-- ToDo: This should be determined via autoconf (AC_OBJEXT)
+-- | Extension for object files
+-- (typically @\"o\"@ on Unix and @\"obj\"@ on Windows)
+objExtension :: String
+#ifdef mingw32_TARGET_OS
+objExtension = "obj"
+#else
+objExtension = "o"
+#endif
+
+-- | Extension for dynamically linked (or shared) libraries
+-- (typically @\"so\"@ on Unix and @\"dll\"@ on Windows)
+dllExtension :: String
+#ifdef mingw32_TARGET_OS
+dllExtension = "dll"
+#else
+dllExtension = "so"
+#endif