module Language.Trans.CStructs2MsgHandlers where
import qualified Language.C.AbsC as C ( TranslationUnit (MkTranslationUnit) )
import Language.Copilot.CStruct ( CStruct (cStructName) )
import Language.Trans.CStruct2CopilotStruct ( camelCaseTypeName, mkCStruct )
cstructs2MsgHandlers :: C.TranslationUnit -> Either String String
cstructs2MsgHandlers :: TranslationUnit -> Either String String
cstructs2MsgHandlers (C.MkTranslationUnit [ExternalDeclaration]
gs) =
[String] -> String
unlines ([String] -> String)
-> Either String [String] -> Either String String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (ExternalDeclaration -> Either String String)
-> [ExternalDeclaration] -> Either String [String]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM ((CStruct -> String)
-> Either String CStruct -> Either String String
forall a b. (a -> b) -> Either String a -> Either String b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap CStruct -> String
cstruct2MsgHandler (Either String CStruct -> Either String String)
-> (ExternalDeclaration -> Either String CStruct)
-> ExternalDeclaration
-> Either String String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ExternalDeclaration -> Either String CStruct
mkCStruct) [ExternalDeclaration]
gs
cstruct2MsgHandler :: CStruct -> String
cstruct2MsgHandler :: CStruct -> String
cstruct2MsgHandler CStruct
cstruct = [String] -> String
unlines
[ String
nameCStruct String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nameLocalVar String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
";"
, String
""
, String
"/**"
, String
"* Make ICAROUS data available to Copilot and run monitors."
, String
"*/"
, String
"void COPILOT_Process" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nameVar String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"Monitor(void)"
, String
"{"
, String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nameCStruct String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"* msg;"
, String
" msg = (" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nameCStruct String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"*) COPILOTMsgPtr;"
, String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nameLocalVar String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" = *msg;"
, String
""
, String
" // Run all copilot monitors."
, String
" step();"
, String
"}"
]
where
nameCStruct :: String
nameCStruct = CStruct -> String
cStructName CStruct
cstruct
nameVar :: String
nameVar = String -> String
camelCaseTypeName String
nameCStruct
nameLocalVar :: String
nameLocalVar = Char
'm' Char -> String -> String
forall a. a -> [a] -> [a]
: Char
'y' Char -> String -> String
forall a. a -> [a] -> [a]
: String -> String
camelCaseTypeName String
nameCStruct