diff -r 53a87a4c7b35 -r 4463ee51c9ec tools/pas2c.hs --- a/tools/pas2c.hs Fri Apr 13 01:41:11 2012 +0200 +++ b/tools/pas2c.hs Sat Apr 14 22:24:09 2012 +0400 @@ -367,7 +367,7 @@ initExpr2C (InitReference i) = id2C IOLookup i initExpr2C (InitRecord fields) = do (fs :: [Doc]) <- mapM (\(Identifier a _, b) -> liftM (text "." <> text a <+> equals <+>) $ initExpr2C b) fields - return $ lbrace $+$ (nest 4 . vcat $ fs) $+$ rbrace + return $ lbrace $+$ (nest 4 . vcat . punctuate comma $ fs) $+$ rbrace initExpr2C (InitArray [value]) = initExpr2C value initExpr2C (InitArray values) = liftM (braces . vcat . punctuate comma) $ mapM initExpr2C values initExpr2C (InitRange (Range i)) = id2C IOLookup i @@ -399,7 +399,17 @@ type2C' (PointerTo t) = liftM (\t a -> t (text "*" <> a)) $ type2C t type2C' (RecordType tvs union) = do t <- withState' id $ mapM (tvar2C False) tvs - return $ \i -> text "struct" <+> lbrace $+$ (nest 4 . vcat . map (<> semi) . concat $ t) $+$ rbrace <+> i + u <- unions + return $ \i -> text "struct" <+> lbrace $+$ nest 4 ((vcat . map (<> semi) . concat $ t) $$ u) $+$ rbrace <+> i + where + unions = case union of + Nothing -> return empty + Just a -> do + structs <- mapM struct2C a + return $ text "union" $+$ braces (nest 4 $ vcat structs) <> semi + struct2C tvs = do + t <- withState' id $ mapM (tvar2C False) tvs + return $ text "struct" $+$ braces (nest 4 (vcat . map (<> semi) . concat $ t)) <> semi type2C' (RangeType r) = return (text "<>" <+>) type2C' (Sequence ids) = do is <- mapM (id2C IOInsert . setBaseType bt) ids