+
+
+
+-----------------------------------------
+-- Cut and pasted from ghc/compiler/SysTools
+-- Convert paths foo/baz to foo\baz on Windows
+
+dosifyPath, unDosifyPath :: String -> String
+#if defined(mingw32_HOST_OS)
+dosifyPath xs = subst '/' '\\' xs
+unDosifyPath xs = subst '\\' '/' xs
+
+subst :: Eq a => a -> a -> [a] -> [a]
+subst a b ls = map (\ x -> if x == a then b else x) ls
+#else
+dosifyPath xs = xs
+unDosifyPath xs = xs
+#endif
+
+getExecDir :: String -> IO (Maybe String)
+-- (getExecDir cmd) returns the directory in which the current
+-- executable, which should be called 'cmd', is running
+-- So if the full path is /a/b/c/d/e, and you pass "d/e" as cmd,
+-- you'll get "/a/b/c" back as the result
+#ifdef __HUGS__
+getExecDir cmd
+ = do
+ s <- getProgName
+ return (Just (reverse (drop (length cmd) (reverse (unDosifyPath s)))))
+#elif defined(mingw32_HOST_OS)
+getExecDir cmd
+ = allocaArray len $ \buf -> do
+ ret <- getModuleFileName nullPtr buf len
+ if ret == 0 then return Nothing
+ else do s <- peekCString buf
+ return (Just (reverse (drop (length cmd)
+ (reverse (unDosifyPath s)))))
+ where
+ len = 2048::Int -- Plenty, PATH_MAX is 512 under Win32.
+
+foreign import stdcall unsafe "GetModuleFileNameA"
+ getModuleFileName :: Ptr () -> CString -> Int -> IO Int32
+
+#else
+getExecDir _ = return Nothing
+#endif