content: {-# OPTIONS -fglasgow-exts -fffi #-}
  
  module PluginEvalAux where
  
  import System.Plugins.Make
  import System.Plugins.Load
  import System.Plugins.Utils
  
  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
    status <- make srcFile ["-O0"]
    case status of
        MakeFailure err   -> putStrLn "error occurred" >> 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
  
  