-----------------------------------------------------------------------------
--- $Id: DriverUtil.hs,v 1.31 2002/02/27 16:24:00 simonmar Exp $
+-- $Id: DriverUtil.hs,v 1.44 2004/09/30 10:37:11 simonpj Exp $
--
-- Utils for the driver
--
--
-----------------------------------------------------------------------------
-module DriverUtil where
-
-#include "../includes/config.h"
+module DriverUtil (
+ getOptionsFromSource, softGetDirectoryContents,
+ createDirectoryHierarchy, doesDirNameExist, prefixUnderscore,
+ unknownFlagErr, unknownFlagsErr, missingArgErr,
+ later, handleDyn, handle,
+ split, add, addNoDups,
+ Suffix, splitFilename, getFileSuffix,
+ splitFilename3, remove_suffix, split_longest_prefix,
+ replaceFilenameSuffix, directoryOf, replaceFilenameDirectory,
+ remove_spaces, escapeSpaces,
+ ) where
+
+#include "../includes/ghcconfig.h"
#include "HsVersions.h"
import Util
import Panic
import Config ( cLeadingUnderscore )
-import IOExts
-import Exception
-import Dynamic
+import EXCEPTION ( Exception(..), finally, throwDyn, catchDyn, throw )
+import qualified EXCEPTION as Exception
+import DYNAMIC
+import DATA_IOREF ( IORef, readIORef, writeIORef )
-import Directory ( getDirectoryContents )
+import Directory
import IO
import List
import Char
catchJust ioErrors (look h `finally` hClose h)
(\e -> if isEOFError e then return [] else ioError e)
where
+
look h = do
l' <- hGetLine h
let l = remove_spaces l'
| otherwise -> return []
matchOptions s
- | Just s1 <- my_prefix_match "{-#" s,
- Just s2 <- my_prefix_match "OPTIONS" (remove_spaces s1),
- Just s3 <- my_prefix_match "}-#" (reverse s2)
+ | Just s1 <- maybePrefixMatch "{-#" s, -- -}
+ Just s2 <- maybePrefixMatch "OPTIONS" (remove_spaces s1),
+ Just s3 <- maybePrefixMatch "}-#" (reverse s2)
= Just (reverse s3)
| otherwise
= Nothing
)
-----------------------------------------------------------------------------
+-- 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 (directoryOf fpath)
+
+-----------------------------------------------------------------------------
-- Prefixing underscore to linker-level names
prefixUnderscore :: String -> String
prefixUnderscore
unknownFlagErr :: String -> a
unknownFlagErr f = throwDyn (UsageError ("unrecognised flag: " ++ f))
-my_partition :: (a -> Maybe b) -> [a] -> ([(a,b)],[a])
-my_partition _ [] = ([],[])
-my_partition p (a:as)
- = let (bs,cs) = my_partition p as in
- case p a of
- Nothing -> (bs,a:cs)
- Just b -> ((a,b):bs,cs)
-
-my_prefix_match :: String -> String -> Maybe String
-my_prefix_match [] rest = Just rest
-my_prefix_match (_:_) [] = Nothing
-my_prefix_match (p:pat) (r:rest)
- | p == r = my_prefix_match pat rest
- | otherwise = Nothing
+unknownFlagsErr :: [String] -> a
+unknownFlagsErr fs = throwDyn (UsageError ("unrecognised flags: " ++ unwords fs))
+
+missingArgErr :: String -> a
+missingArgErr f = throwDyn (UsageError ("missing argument for flag: " ++ f))
later = flip finally
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
remove_suffix :: Char -> String -> Suffix
remove_suffix c s
- | null pre = reverse suf
+ | null pre = s
| otherwise = reverse pre
where (suf,pre) = break (==c) (reverse s)
(_: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