diff options
author | Joe Crayne <joe@jerkface.net> | 2018-11-23 17:57:42 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2018-11-23 17:57:42 -0500 |
commit | 9d667c73fcb4917f83e5bed55b4bc01de180ed6d (patch) | |
tree | 71de9beeb8258a0839b8b3e1a4c9d9dfaca76c70 | |
parent | df1bd7353b41f4c4214b77934085889b84be8839 (diff) |
Add includes to stubs file.
-rw-r--r-- | c2haskell.hs | 35 |
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) |
26 | import Language.C.Data.Ident as C | 26 | import Language.C.Data.Ident as C |
27 | import Language.C as C hiding (prettyUsingInclude) | 27 | import Language.C as C hiding (prettyUsingInclude) |
28 | import qualified Language.C as C | ||
28 | import Language.C.System.GCC | 29 | import Language.C.System.GCC |
29 | import Language.C.System.Preprocess | 30 | import Language.C.System.Preprocess |
30 | import Language.C.Data.Position | 31 | import 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 | |||
73 | includeTopLevel (IncludeStack incs) f = do | 72 | includeTopLevel (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) | |||
413 | makeAcceptableImport t = t | 412 | makeAcceptableImport 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 () |
416 | c2haskell :: Foldable t => | 415 | c2haskell :: C2HaskellOptions |
417 | C2HaskellOptions | 416 | -> p1 -> [String] -> IncludeStack -> CTranslationUnit NodeInfo -> IO () |
418 | -> p1 -> t String -> IncludeStack -> CTranslationUnit NodeInfo -> IO () | ||
419 | c2haskell opts cs missings incs (CTranslUnit edecls _) = do | 417 | c2haskell 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) | |||
558 | changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d) | 574 | changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d) |
559 | changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos)) | 575 | changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos)) |
560 | 576 | ||
577 | {- | ||
578 | setPosOfNode :: Position -> NodeInfo -> NodeInfo | ||
579 | setPosOfNode pos n = maybe (mkNodeInfoOnlyPos pos) (mkNodeInfo pos) $ nameOfNode n | ||
580 | |||
581 | setPos pos (CFDefExt (CFunDef xs ys zs c n)) = (CFDefExt (CFunDef xs ys zs c $ setPosOfNode pos n)) | ||
582 | setPos pos (CDeclExt (CDecl xs ys n)) = (CDeclExt (CDecl xs ys $ setPosOfNode pos n)) | ||
583 | -} | ||
561 | 584 | ||
562 | getArgList1 (CDeclr a xs b c d) = xs | 585 | getArgList1 (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 |