+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 (reverse s3)
+ | otherwise
+ = Nothing
+
+-----------------------------------------------------------------------------
+-- A version of getDirectoryContents that is non-fatal if the
+-- directory doesn't exist.
+
+softGetDirectoryContents d
+ = IO.catch (getDirectoryContents d)
+ (\_ -> do hPutStrLn stderr
+ ("WARNING: error while reading directory " ++ d)
+ return []
+ )
+
+-----------------------------------------------------------------------------
+-- 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
+ | cLeadingUnderscore == "YES" = ('_':)
+ | otherwise = id