module SMR.CLI.Driver.Load
(runLoadFileDecls)
where
import qualified SMR.Prim.Op as Prim
import qualified SMR.Prim.Name as Prim
import qualified SMR.Source.Parser as Source
import qualified SMR.Source.Lexer as Source
import qualified SMR.Codec.Peek as Codec
import SMR.Core.Exp (Decl)
import SMR.Prim.Op.Base (Prim)
import qualified Foreign.Marshal.Alloc as Foreign
import qualified System.FilePath as System
import qualified System.IO as System
import Control.Monad
import Data.Text (Text)
runLoadFileDecls :: FilePath -> IO [Decl Text Prim]
runLoadFileDecls path
| System.takeExtension path == ".smr"
= do str <- readFile path
let (ts, _loc, _csRest)
= Source.lexTokens (Source.L 1 1) str
let config
= Source.Config
{ Source.configReadSym = Just
, Source.configReadPrm = Prim.readPrim Prim.primOpTextNames }
case Source.parseDecls config ts of
Left err -> error $ show err
Right decls -> return decls
| System.takeExtension path == ".sms"
= do
h <- System.openBinaryFile path System.ReadMode
nSize <- fmap fromIntegral $ System.hFileSize h
Foreign.allocaBytes nSize $ \pBuf
-> do nRead <- System.hGetBuf h pBuf nSize
when (nRead /= nSize) $ error "runConvert: short read"
(decls, _p, _n) <- Codec.peekFileDecls pBuf nSize
return decls
| otherwise
= error "runLoadFileDecls: cannot load this file"