-----------------------------------------------------------------------------
--- $Id: DriverUtil.hs,v 1.33 2002/08/29 15:44:15 simonmar Exp $
+-- $Id: DriverUtil.hs,v 1.38 2003/06/04 15:47:59 simonmar Exp $
--
-- Utils for the driver
--
import Panic
import Config ( cLeadingUnderscore )
-import EXCEPTION as Exception
+import EXCEPTION ( Exception(..), finally, throwDyn, catchDyn, throw )
+import qualified EXCEPTION as Exception
import DYNAMIC
import DATA_IOREF ( IORef, readIORef, writeIORef )
-import Directory ( getDirectoryContents, doesDirectoryExist )
+import Directory
import IO
import List
import Char
| otherwise -> return []
matchOptions s
- | Just s1 <- my_prefix_match "{-#" s,
+ | Just s1 <- my_prefix_match "{-#" s, -- -}
Just s2 <- my_prefix_match "OPTIONS" (remove_spaces s1),
Just s3 <- my_prefix_match "}-#" (reverse s2)
= Just (reverse s3)
)
-----------------------------------------------------------------------------
+-- Create a hierarchy of directories
+
+createDirectoryHierarchy :: FilePath -> IO ()
+createDirectoryHierarchy dir = do
+ b <- doesDirectoryExist dir
+ when (not b) $ do
+ createDirectoryHierarchy (directoryOf dir)
+ createDirectory dir
+
+-----------------------------------------------------------------------------
-- Verify that the 'dirname' portion of a FilePath exists.
--
doesDirNameExist :: FilePath -> IO Bool
-doesDirNameExist fpath = doesDirectoryExist (getdir fpath)
-
+doesDirNameExist fpath = doesDirectoryExist (directoryOf fpath)
-----------------------------------------------------------------------------
-- Prefixing underscore to linker-level names
getFileSuffix :: String -> Suffix
getFileSuffix f = drop_longest_prefix f (=='.')
+-- "foo/bar/xyzzy.ext" -> ("foo/bar", "xyzzy.ext")
+splitFilenameDir :: String -> (String,String)
+splitFilenameDir str
+ = let (dir, rest) = split_longest_prefix str isPathSeparator
+ real_dir | null dir = "."
+ | otherwise = dir
+ in (real_dir, rest)
+
-- "foo/bar/xyzzy.ext" -> ("foo/bar", "xyzzy", ".ext")
splitFilename3 :: String -> (String,String,Suffix)
splitFilename3 str
(_:pre) -> (reverse pre, reverse suf)
where (suf,pre) = break pred (reverse s)
-newsuf :: String -> Suffix -> String
-newsuf suf s = remove_suffix '.' s ++ suf
+replaceFilenameSuffix :: FilePath -> Suffix -> FilePath
+replaceFilenameSuffix s suf = remove_suffix '.' s ++ suf
--- getdir strips the filename off the input string, returning the directory.
-getdir :: String -> String
-getdir s = if null dir then "." else init dir
- where dir = take_longest_prefix s isPathSeparator
+-- directoryOf strips the filename off the input string, returning
+-- the directory.
+directoryOf :: FilePath -> String
+directoryOf = fst . splitFilenameDir
-newdir :: String -> String -> String
-newdir dir s = dir ++ '/':drop_longest_prefix s isPathSeparator
+replaceFilenameDirectory :: FilePath -> String -> FilePath
+replaceFilenameDirectory s dir
+ = dir ++ '/':drop_longest_prefix s isPathSeparator
remove_spaces :: String -> String
remove_spaces = reverse . dropWhile isSpace . reverse . dropWhile isSpace