summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2018-11-23 17:57:42 -0500
committerJoe Crayne <joe@jerkface.net>2018-11-23 17:57:42 -0500
commit9d667c73fcb4917f83e5bed55b4bc01de180ed6d (patch)
tree71de9beeb8258a0839b8b3e1a4c9d9dfaca76c70
parentdf1bd7353b41f4c4214b77934085889b84be8839 (diff)
Add includes to stubs file.
-rw-r--r--c2haskell.hs35
1 files changed, 29 insertions, 6 deletions
diff --git a/c2haskell.hs b/c2haskell.hs
index 48b30e3..9c910ef 100644
--- a/c2haskell.hs
+++ b/c2haskell.hs
@@ -25,6 +25,7 @@ import qualified Data.Set as Set
25 ;import Data.Set (Set) 25 ;import Data.Set (Set)
26import Language.C.Data.Ident as C 26import Language.C.Data.Ident as C
27import Language.C as C hiding (prettyUsingInclude) 27import Language.C as C hiding (prettyUsingInclude)
28import qualified Language.C as C
28import Language.C.System.GCC 29import Language.C.System.GCC
29import Language.C.System.Preprocess 30import Language.C.System.Preprocess
30import Language.C.Data.Position 31import Language.C.Data.Position
@@ -66,10 +67,8 @@ prettyUsingInclude incs (CTranslUnit edecls _) =
66 isHeaderFile = (".h" `isSuffixOf`) 67 isHeaderFile = (".h" `isSuffixOf`)
67 68
68 sysfst (Left ('"':a)) (Left ('<':b)) = Prelude.GT 69 sysfst (Left ('"':a)) (Left ('<':b)) = Prelude.GT
69 sysfst (Left a) (Left b) = trace (show (a,b)) $ Prelude.GT
70 sysfst _ _ = Prelude.LT 70 sysfst _ _ = Prelude.LT
71 71
72
73includeTopLevel (IncludeStack incs) f = do 72includeTopLevel (IncludeStack incs) f = do
74 stacks <- maybeToList $ Map.lookup f incs 73 stacks <- maybeToList $ Map.lookup f incs
75 stack <- take 1 stacks 74 stack <- take 1 stacks
@@ -413,9 +412,8 @@ makeAcceptableImport (HS.TyFun a (TyCon c (UnQual d (HS.Ident e x))) xs)
413makeAcceptableImport t = t 412makeAcceptableImport t = t
414 413
415-- c2haskell :: Foldable t => C2HaskellOptions -> p -> t String -> CTranslationUnit NodeInfo -> IO () 414-- c2haskell :: Foldable t => C2HaskellOptions -> p -> t String -> CTranslationUnit NodeInfo -> IO ()
416c2haskell :: Foldable t => 415c2haskell :: C2HaskellOptions
417 C2HaskellOptions 416 -> p1 -> [String] -> IncludeStack -> CTranslationUnit NodeInfo -> IO ()
418 -> p1 -> t String -> IncludeStack -> CTranslationUnit NodeInfo -> IO ()
419c2haskell opts cs missings incs (CTranslUnit edecls _) = do 417c2haskell opts cs missings incs (CTranslUnit edecls _) = do
420 let db = foldr update initTranspile edecls 418 let db = foldr update initTranspile edecls
421 es = Map.filter (\d -> symbolLocal d && not (symbolStatic d)) (syms db) 419 es = Map.filter (\d -> symbolLocal d && not (symbolStatic d)) (syms db)
@@ -491,12 +489,30 @@ c2haskell opts cs missings incs (CTranslUnit edecls _) = do
491 -} 489 -}
492 putStrLn $ "writing " ++ stubsname 490 putStrLn $ "writing " ++ stubsname
493 withFile stubsname WriteMode $ \stubsfile -> do 491 withFile stubsname WriteMode $ \stubsfile -> do
492 {-
494 forM_ missings $ \sym -> 493 forM_ missings $ \sym ->
495 forM_ (Map.lookup sym$ syms db) $ \si -> do 494 forM_ (Map.lookup sym$ syms db) $ \si -> do
496 forM_ (take 1 $ symbolSource si) $ \d -> do 495 forM_ (take 1 $ symbolSource si) $ \d -> do
497 hPutStrLn stubsfile $ show $ pretty $ makeFunctionPointer d 496 hPutStrLn stubsfile $ show $ pretty $ makeFunctionPointer d
498 hPutStrLn stubsfile $ show $ pretty $ makeSetter d 497 hPutStrLn stubsfile $ show $ pretty $ makeSetter d
499 hPutStrLn stubsfile $ show $ pretty $ makeStub d 498 hPutStrLn stubsfile $ show $ pretty $ makeStub d
499 -}
500 -- mkNodeInfo :: Position -> Name -> NodeInfo
501 let decls = map (setPos $ initPos stubsname) $ do
502 sym <- missings
503 si <- maybeToList $ Map.lookup sym (syms db)
504 d <- take 1 $ symbolSource si
505 [ makeFunctionPointer d, makeSetter d, makeStub d]
506 ns = listify (mkQ False (\ni -> let _ = ni :: C.NodeInfo in True)) decls :: [C.NodeInfo]
507 headerOfNode n = do
508 f <- fileOfNode n
509 case includeTopLevel incs f of
510 "" -> Nothing
511 h -> Just h
512 is = uniq $ mapMaybe headerOfNode ns
513 hPutStrLn stubsfile "#include <stdio.h>"
514 hPutStrLn stubsfile $ concatMap (\i -> "#include " ++ i ++ "\n") is
515 hPutStrLn stubsfile $ show $ pretty $ CTranslUnit decls undefNode
500 516
501 Just cfun -> do 517 Just cfun -> do
502 forM_ (Map.lookup cfun $ syms db) $ \si -> do 518 forM_ (Map.lookup cfun $ syms db) $ \si -> do
@@ -558,6 +574,13 @@ changeArgList3 f (Just (CDeclr a x b c d)) = Just (CDeclr a (f x) b c d)
558changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d) 574changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d)
559changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos)) 575changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos))
560 576
577{-
578setPosOfNode :: Position -> NodeInfo -> NodeInfo
579setPosOfNode pos n = maybe (mkNodeInfoOnlyPos pos) (mkNodeInfo pos) $ nameOfNode n
580
581setPos pos (CFDefExt (CFunDef xs ys zs c n)) = (CFDefExt (CFunDef xs ys zs c $ setPosOfNode pos n))
582setPos pos (CDeclExt (CDecl xs ys n)) = (CDeclExt (CDecl xs ys $ setPosOfNode pos n))
583-}
561 584
562getArgList1 (CDeclr a xs b c d) = xs 585getArgList1 (CDeclr a xs b c d) = xs
563 586
@@ -857,7 +880,7 @@ main = do
857 Right bs -> putStrLn $ ppShow $ includeStack $ bs 880 Right bs -> putStrLn $ ppShow $ includeStack $ bs
858 _ | prettyC hopts -- -p 881 _ | prettyC hopts -- -p
859 -> do 882 -> do
860 print (fmap (\(incs,decls) -> prettyUsingInclude incs decls) r) 883 either print (\(incs,decls) -> print $ prettyUsingInclude incs decls) r
861 _ | prettyTree hopts -- -t 884 _ | prettyTree hopts -- -t
862 -> do 885 -> do
863 putStrLn $ ppShow $ everywhere (mkT eraseNodeInfo) . snd <$> r 886 putStrLn $ ppShow $ everywhere (mkT eraseNodeInfo) . snd <$> r