X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Fmain%2FDriverUtil.hs;h=d8fe68c2b20be52a115e958c371f275ed2f263c0;hb=8575cfe27f04474172a2b244bd5a575b4cbe735c;hp=0be0937df748ec59d679455e39c8926a3d6ec854;hpb=46c2362e62e881124ea6d82cee17ffa3b5115088;p=ghc-hetmet.git diff --git a/ghc/compiler/main/DriverUtil.hs b/ghc/compiler/main/DriverUtil.hs index 0be0937..d8fe68c 100644 --- a/ghc/compiler/main/DriverUtil.hs +++ b/ghc/compiler/main/DriverUtil.hs @@ -1,5 +1,5 @@ ----------------------------------------------------------------------------- --- $Id: DriverUtil.hs,v 1.29 2002/01/22 14:47:52 simonmar Exp $ +-- $Id: DriverUtil.hs,v 1.39 2003/08/20 15:07:57 simonmar Exp $ -- -- Utils for the driver -- @@ -16,21 +16,17 @@ import Util import Panic import Config ( cLeadingUnderscore ) -import IOExts -import Exception -import Dynamic -import RegexString +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 import Monad - ------------------------------------------------------------------------------ --- Errors - ----------------------------------------------------------------------------- -- Reading OPTIONS pragmas @@ -49,12 +45,18 @@ getOptionsFromSource file () | null l -> look h | prefixMatch "#" l -> look h | prefixMatch "{-# LINE" l -> look h -- -} - | Just (opts:_) <- matchRegex optionRegex l + | Just opts <- matchOptions l -> do rest <- look h return (words opts ++ rest) | otherwise -> return [] -optionRegex = mkRegex "\\{-#[ \t]+OPTIONS[ \t]+(.*)#-\\}" -- -} +matchOptions s + | Just s1 <- maybePrefixMatch "{-#" s, -- -} + Just s2 <- maybePrefixMatch "OPTIONS" (remove_spaces s1), + Just s3 <- maybePrefixMatch "}-#" (reverse s2) + = Just (reverse s3) + | otherwise + = Nothing ----------------------------------------------------------------------------- -- A version of getDirectoryContents that is non-fatal if the @@ -68,6 +70,22 @@ softGetDirectoryContents d ) ----------------------------------------------------------------------------- +-- 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 @@ -80,6 +98,9 @@ prefixUnderscore unknownFlagErr :: String -> a unknownFlagErr f = throwDyn (UsageError ("unrecognised flag: " ++ f)) +unknownFlagsErr :: [String] -> a +unknownFlagsErr fs = throwDyn (UsageError ("unrecognised flags: " ++ unwords fs)) + my_partition :: (a -> Maybe b) -> [a] -> ([(a,b)],[a]) my_partition _ [] = ([],[]) my_partition p (a:as) @@ -88,13 +109,6 @@ my_partition p (a:as) 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 - later = flip finally handleDyn :: Typeable ex => (ex -> IO a) -> IO a -> IO a @@ -137,6 +151,14 @@ splitFilename f = split_longest_prefix f (=='.') 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 @@ -176,20 +198,24 @@ split_longest_prefix s pred (_: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 +escapeSpaces :: String -> String +escapeSpaces = foldr (\c s -> if isSpace c then '\\':c:s else c:s) "" + isPathSeparator :: Char -> Bool isPathSeparator ch = #ifdef mingw32_TARGET_OS