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 |