module Language.Fortran.Extras.ProgramFile where
import qualified Data.ByteString.Char8 as B
import Language.Fortran.AST ( A0
, ProgramFile
)
import Language.Fortran.Version ( deduceFortranVersion
, FortranVersion(..)
)
import qualified Language.Fortran.Parser as Parser
import System.FilePath ( takeDirectory )
import Data.Either.Combinators ( fromRight' )
versionedExpandedProgramFile
:: FortranVersion -> [String] -> String -> B.ByteString -> IO (ProgramFile A0)
versionedExpandedProgramFile :: FortranVersion
-> [String] -> String -> ByteString -> IO (ProgramFile A0)
versionedExpandedProgramFile FortranVersion
v [String]
importDirs String
path ByteString
contents =
case FortranVersion
v of
FortranVersion
Fortran77Legacy ->
[String] -> ModFiles -> String -> ByteString -> IO (ProgramFile A0)
Parser.f77lIncludes (String -> String
takeDirectory String
path String -> [String] -> [String]
forall a. a -> [a] -> [a]
: [String]
importDirs) [] String
path ByteString
contents
FortranVersion
_ -> String -> IO (ProgramFile A0)
forall a. HasCallStack => String -> a
error (String -> IO (ProgramFile A0)) -> String -> IO (ProgramFile A0)
forall a b. (a -> b) -> a -> b
$ String
"Unsupported version: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ FortranVersion -> String
forall a. Show a => a -> String
show FortranVersion
v
versionedProgramFile
:: FortranVersion -> String -> B.ByteString -> ProgramFile A0
versionedProgramFile :: FortranVersion -> String -> ByteString -> ProgramFile A0
versionedProgramFile FortranVersion
v String
p ByteString
c = Either ParseErrorSimple (ProgramFile A0) -> ProgramFile A0
forall a b. Either a b -> b
fromRight' (Either ParseErrorSimple (ProgramFile A0) -> ProgramFile A0)
-> Either ParseErrorSimple (ProgramFile A0) -> ProgramFile A0
forall a b. (a -> b) -> a -> b
$ (FortranVersion -> Parser (ProgramFile A0)
Parser.byVer FortranVersion
v) String
p ByteString
c
programFile :: String -> B.ByteString -> ProgramFile A0
programFile :: String -> ByteString -> ProgramFile A0
programFile String
path ByteString
contents =
let version :: FortranVersion
version = String -> FortranVersion
deduceFortranVersion String
path
in FortranVersion -> String -> ByteString -> ProgramFile A0
versionedProgramFile FortranVersion
version String
path ByteString
contents