tools/pas2c.hs
changeset 7066 12cc2bd84b0b
parent 7062 7efe16575779
child 7067 f98ec3aecf4e
equal deleted inserted replaced
7065:e80e0d3273c5 7066:12cc2bd84b0b
   551                 t <- withState' f $ mapM (tvar2C False) tvs
   551                 t <- withState' f $ mapM (tvar2C False) tvs
   552                 return $ text "struct" $+$ braces (nest 4 (vcat . map (<> semi) . concat $ t)) <> semi
   552                 return $ text "struct" $+$ braces (nest 4 (vcat . map (<> semi) . concat $ t)) <> semi
   553     type2C' (RangeType r) = return (text "int" <+>)
   553     type2C' (RangeType r) = return (text "int" <+>)
   554     type2C' (Sequence ids) = do
   554     type2C' (Sequence ids) = do
   555         is <- mapM (id2C IOInsert . setBaseType bt) ids
   555         is <- mapM (id2C IOInsert . setBaseType bt) ids
   556         return (text "enum" <+> (braces . vcat . punctuate comma . map (\(a, b) -> a <+> equals <+> text "0x" <> text (showHex b "")) $ zip is [1..]) <+>)
   556         return (text "enum" <+> (braces . vcat . punctuate comma . map (\(a, b) -> a <+> equals <+> text "0x" <> text (showHex b "")) $ zip is [0..]) <+>)
   557         where
   557         where
   558             bt = BTEnum $ map (\(Identifier i _) -> map toLower i) ids
   558             bt = BTEnum $ map (\(Identifier i _) -> map toLower i) ids
   559     type2C' (ArrayDecl Nothing t) = type2C (PointerTo t)
   559     type2C' (ArrayDecl Nothing t) = type2C (PointerTo t)
   560     type2C' (ArrayDecl (Just r) t) = do
   560     type2C' (ArrayDecl (Just r) t) = do
   561         t' <- type2C t
   561         t' <- type2C t
       
   562         lt <- gets lastType
       
   563         ft <- case lt of
       
   564                 BTFunction {} -> type2C (PointerTo t)
       
   565                 _ -> return t'
   562         r' <- initExpr2C (InitRange r)
   566         r' <- initExpr2C (InitRange r)
   563         return $ \i -> t' i <> brackets r'
   567         return $ \i -> ft i <> brackets r'
   564     type2C' (Set t) = return (text "<<set>>" <+>)
   568     type2C' (Set t) = return (text "<<set>>" <+>)
   565     type2C' (FunctionType returnType params) = do
   569     type2C' (FunctionType returnType params) = do
   566         t <- type2C returnType
   570         t <- type2C returnType
   567         p <- withState' id $ functionParams2C params
   571         p <- withState' id $ functionParams2C params
   568         return (\i -> t empty <+> i <> parens p)
   572         return (\i -> t empty <+> i <> parens p)
   599     elsePart | isNothing mphrase2 = return $ empty
   603     elsePart | isNothing mphrase2 = return $ empty
   600              | otherwise = liftM (text "else" $$) $ (phrase2C . wrapPhrase) (fromJust mphrase2)
   604              | otherwise = liftM (text "else" $$) $ (phrase2C . wrapPhrase) (fromJust mphrase2)
   601 phrase2C (Assignment ref expr) = do
   605 phrase2C (Assignment ref expr) = do
   602     r <- ref2C ref
   606     r <- ref2C ref
   603     t <- gets lastType
   607     t <- gets lastType
   604     e <- case (t, expr) of
   608     case (t, expr) of
   605          (BTFunction {}, (Reference r')) -> ref2C r'
   609         (BTFunction {}, (Reference r')) -> do
   606          _ -> expr2C expr
   610             e <- ref2C r'
   607     return $ r <+> text "=" <+> e <> semi
   611             return $ r <+> text "=" <+> e <> semi
       
   612         (BTArray (Range _) _ _, _) -> phrase2C $ 
       
   613             ProcCall (FunCall
       
   614                 [
       
   615                 Reference $ Address ref
       
   616                 , Reference $ Address $ RefExpression expr
       
   617                 , Reference $ FunCall [expr] (SimpleReference (Identifier "sizeof" BTUnknown))
       
   618                 ]
       
   619                 (SimpleReference (Identifier "memcpy" BTUnknown))
       
   620                 ) []
       
   621         _ -> do
       
   622             e <- expr2C expr
       
   623             return $ r <+> text "=" <+> e <> semi
   608 phrase2C (WhileCycle expr phrase) = do
   624 phrase2C (WhileCycle expr phrase) = do
   609     e <- expr2C expr
   625     e <- expr2C expr
   610     p <- phrase2C $ wrapPhrase phrase
   626     p <- phrase2C $ wrapPhrase phrase
   611     return $ text "while" <> parens e $$ p
   627     return $ text "while" <> parens e $$ p
   612 phrase2C (SwitchCase expr cases mphrase) = do
   628 phrase2C (SwitchCase expr cases mphrase) = do