[project @ 2001-03-08 09:50:18 by simonmar]
[ghc-hetmet.git] / ghc / compiler / main / DriverUtil.hs
index 4301d86..9c282f6 100644 (file)
@@ -1,5 +1,5 @@
 -----------------------------------------------------------------------------
--- $Id: DriverUtil.hs,v 1.12 2000/12/11 12:30:58 rrt Exp $
+-- $Id: DriverUtil.hs,v 1.19 2001/03/08 09:50:18 simonmar Exp $
 --
 -- Utils for the driver
 --
@@ -13,7 +13,7 @@ module DriverUtil where
 #include "HsVersions.h"
 
 import Util
-import TmpFiles ( newTempName )
+import Panic
 
 import IOExts
 import Exception
@@ -22,7 +22,6 @@ import RegexString
 
 import IO
 import System
-import Directory ( removeFile )
 import List
 import Char
 import Monad
@@ -30,8 +29,6 @@ import Monad
 -----------------------------------------------------------------------------
 -- Errors
 
-short_usage = "Usage: For basic information, try the `--help' option."
-   
 GLOBAL_VAR(v_Path_usage,  "",  String)
 
 long_usage = do
@@ -41,38 +38,9 @@ long_usage = do
   exitWith ExitSuccess
   where
      dump "" = return ()
-     dump ('$':'$':s) = hPutStr stderr prog_name >> dump s
+     dump ('$':'$':s) = hPutStr stderr progName >> dump s
      dump (c:s) = hPutChar stderr c >> dump s
 
-data BarfKind
-  = PhaseFailed String ExitCode
-  | Interrupted
-  | UsageError String                  -- prints the short usage msg after the error
-  | OtherError String                  -- just prints the error message
-  deriving Eq
-
-prog_name = unsafePerformIO (getProgName)
-{-# NOINLINE prog_name #-}
-
-instance Show BarfKind where
-  showsPrec _ e = showString prog_name . showString ": " . showBarf e
-
-showBarf (UsageError str)
-   = showString str . showChar '\n' . showString short_usage
-showBarf (OtherError str)
-   = showString str
-showBarf (PhaseFailed phase code)
-   = showString phase . showString " failed, code = " . shows code
-showBarf (Interrupted)
-   = showString "interrupted"
-
-unknownFlagErr f = throwDyn (UsageError ("unrecognised flag: " ++ f))
-
-barfKindTc = mkTyCon "BarfKind"
-{-# NOINLINE barfKindTc #-}
-instance Typeable BarfKind where
-  typeOf _ = mkAppTy barfKindTc []
-
 -----------------------------------------------------------------------------
 -- Reading OPTIONS pragmas
 
@@ -91,7 +59,8 @@ getOptionsFromSource file
                   | prefixMatch "#" l -> look h
                   | prefixMatch "{-# LINE" l -> look h   -- -}
                   | Just (opts:_) <- matchRegex optionRegex l
-                       -> return (words opts)
+                       -> do rest <- look h
+                              return (words opts ++ rest)
                   | otherwise -> return []
 
 optionRegex = mkRegex "\\{-#[ \t]+OPTIONS[ \t]+(.*)#-\\}"   -- -}
@@ -99,6 +68,9 @@ optionRegex = mkRegex "\\{-#[ \t]+OPTIONS[ \t]+(.*)#-\\}"   -- -}
 -----------------------------------------------------------------------------
 -- Utils
 
+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)
@@ -119,6 +91,9 @@ later = flip finally
 handleDyn :: Typeable ex => (ex -> IO a) -> IO a -> IO a
 handleDyn = flip catchDyn
 
+handle :: (Exception -> IO a) -> IO a -> IO a
+handle = flip Exception.catchAllIO
+
 split :: Char -> String -> [String]
 split c s = case rest of
                []     -> [chunk] 
@@ -185,20 +160,3 @@ newdir dir s = dir ++ '/':drop_longest_prefix s '/'
 remove_spaces :: String -> String
 remove_spaces = reverse . dropWhile isSpace . reverse . dropWhile isSpace
 
--- system that works feasibly under Windows (i.e. passes the command line to sh,
--- because system() under Windows doesn't look at SHELL, and always uses CMD.EXE)
-kludgedSystem cmd phase_name
- = do
-#ifndef mingw32_TARGET_OS
-   exit_code <- system cmd `catchAllIO` 
-                  (\_ -> throwDyn (PhaseFailed phase_name (ExitFailure 1)))
-#else
-   tmp <- newTempName "sh"
-   h <- openFile tmp WriteMode
-   hPutStrLn h cmd
-   hClose h
-   exit_code <- system ("sh - " ++ tmp) `catchAllIO` 
-                  (\_ -> throwDyn (PhaseFailed phase_name (ExitFailure 1)))
-   removeFile tmp
-#endif
-   return exit_code