summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Crayne <joe@jerkface.net>2018-11-21 13:48:13 -0500
committerJoe Crayne <joe@jerkface.net>2018-11-21 13:48:13 -0500
commit708e7fe2ce4872fa381f54ddb03890306444ca7b (patch)
tree81a6082fd97727ac88a39f435506281cf85a57ad
parent23fbc6d4afd3787f9e74df149d0235c6dbfd50fd (diff)
wip: monkey-patch stub. function body.
-rw-r--r--c2haskell.hs45
1 files changed, 41 insertions, 4 deletions
diff --git a/c2haskell.hs b/c2haskell.hs
index 7a345e6..1b3144f 100644
--- a/c2haskell.hs
+++ b/c2haskell.hs
@@ -500,7 +500,7 @@ makeAcceptableDecl (HS.TypeDecl a (DHead b (HS.Ident c signame)) ftyp)
500 500
501makeSetter d@(CDeclExt (CDecl xs ys pos)) = 501makeSetter d@(CDeclExt (CDecl xs ys pos)) =
502 let name = concatMap identToString $ take 1 $ catMaybes $ sym d 502 let name = concatMap identToString $ take 1 $ catMaybes $ sym d
503 in setSetterBody ("f_"++name) $ changeReturnValue (const voidReturnType) $ changeArgList (const voidp) $ changeName ("setf_"++) d 503 in setBody (setterBody ("f_"++name)) $ changeReturnValue (const voidReturnType) $ changeArgList (const voidp) $ changeName ("setf_"++) d
504 504
505changeArgList1 f (CDeclr a xs b c d) = CDeclr a (f xs) b c d 505changeArgList1 f (CDeclr a xs b c d) = CDeclr a (f xs) b c d
506 506
@@ -526,8 +526,8 @@ changeReturnValue f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl (f xs) ys po
526 526
527voidReturnType = [ CTypeSpec (CVoidType undefNode) ] 527voidReturnType = [ CTypeSpec (CVoidType undefNode) ]
528 528
529setSetterBody name (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs (setterBody name) d)) 529setBody bdy (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs bdy d))
530setSetterBody name (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] (setterBody name) pos)) 530setBody bdy (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] bdy pos))
531 where v = case ys of 531 where v = case ys of
532 (Just y,_,_):_ -> y 532 (Just y,_,_):_ -> y
533 _ -> CDeclr Nothing [] Nothing [] pos 533 _ -> CDeclr Nothing [] Nothing [] pos
@@ -535,7 +535,11 @@ setSetterBody name (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] (se
535makeStub d@(CDeclExt (CDecl xs ys pos)) = 535makeStub d@(CDeclExt (CDecl xs ys pos)) =
536 let oargs:xs = getArgList d 536 let oargs:xs = getArgList d
537 (args,vs) = makeParameterNames oargs 537 (args,vs) = makeParameterNames oargs
538 in changeArgList (const $ args:xs) d 538 name = concatMap identToString $ take 1 $ catMaybes $ sym d
539 rval = () -- todo
540 in setBody (stubBody ("f_"++name) vs rval) $ changeArgList (const $ args:xs) d
541
542
539 543
540parameterIdent :: CDeclaration a -> Maybe Ident 544parameterIdent :: CDeclaration a -> Maybe Ident
541parameterIdent (CDecl _ xs n) = listToMaybe $ do 545parameterIdent (CDecl _ xs n) = listToMaybe $ do
@@ -582,6 +586,39 @@ voidp = [ CFunDeclr
582 where n = undefNode 586 where n = undefNode
583 587
584 588
589stubBody name vs rval =
590 CCompound []
591 [ CBlockStmt
592 (CIf
593 (CVar (C.Ident name 0 undefNode) undefNode)
594 (CReturn
595 (Just
596 (C.CCall
597 (CVar (C.Ident name 0 undefNode) undefNode)
598 vs
599 undefNode))
600 undefNode)
601 (Just
602 (CExpr
603 (Just
604 (C.CCall
605 (CVar
606 (C.Ident
607 "printf"
608 0
609 undefNode)
610 undefNode)
611 [ CConst
612 (CStrConst
613 (cString $ "missing symbol: " ++ name ++ ".\n")
614 undefNode)
615 ]
616 undefNode))
617 undefNode))
618 undefNode)
619 ]
620 undefNode
621
585setterBody :: String -> CStatement NodeInfo 622setterBody :: String -> CStatement NodeInfo
586setterBody name = 623setterBody name =
587 CCompound [] 624 CCompound []