| 
									
										
										
										
											2005-04-24 08:51:33 +00:00
										 |  |  | {-# OPTIONS -fglasgow-exts -fffi #-} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module PluginEvalAux where | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-05-15 06:03:55 +00:00
										 |  |  | import System.Plugins.Make | 
					
						
							|  |  |  | import System.Plugins.Load | 
					
						
							|  |  |  | import System.Plugins.Utils | 
					
						
							| 
									
										
										
										
											2005-04-24 08:51:33 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | import Foreign.C | 
					
						
							|  |  |  | import Control.Exception        ( evaluate ) | 
					
						
							|  |  |  | import System.IO | 
					
						
							|  |  |  | import System.Directory         ( renameFile, removeFile ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | symbol = "resource" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | evalWithStringResult :: FilePath -> String -> IO String | 
					
						
							|  |  |  | evalWithStringResult srcFile s = do | 
					
						
							| 
									
										
										
										
											2010-09-22 05:10:19 +00:00
										 |  |  |   status <- make srcFile ["-O0"] | 
					
						
							| 
									
										
										
										
											2005-04-24 08:51:33 +00:00
										 |  |  |   case status of | 
					
						
							|  |  |  |       MakeFailure err   -> putStrLn "error occured" >> return (show err) | 
					
						
							|  |  |  |       MakeSuccess _ obj -> load' obj | 
					
						
							|  |  |  |   where | 
					
						
							|  |  |  |     load' obj = do | 
					
						
							|  |  |  |       loadResult <- load obj [] [] symbol | 
					
						
							|  |  |  |       case loadResult of | 
					
						
							|  |  |  |         LoadFailure errs -> putStrLn "load error" >> return (show errs) | 
					
						
							|  |  |  | 	LoadSuccess m (rsrc :: String -> IO String) -> do | 
					
						
							|  |  |  | 	  v' <- rsrc s | 
					
						
							|  |  |  | 	  unload m | 
					
						
							|  |  |  | 	  mapM_ removeFile [ obj, replaceSuffix obj ".hi" ] | 
					
						
							|  |  |  | 	  return v' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | foreign export ccall evalhaskell_CString :: CString -> CString -> IO CString | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | evalhaskell_CString :: CString -> CString -> IO CString | 
					
						
							|  |  |  | evalhaskell_CString filePathCS sCS = do | 
					
						
							|  |  |  |   s <- peekCString sCS | 
					
						
							|  |  |  |   filePath <- peekCString filePathCS | 
					
						
							|  |  |  |   retval <- evalWithStringResult filePath s | 
					
						
							|  |  |  |   newCString retval | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | -- vi:sw=2 sts=2 | 
					
						
							|  |  |  | 
 |