diff options
author | Joe Crayne <joe@jerkface.net> | 2018-11-21 13:48:13 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2018-11-21 13:48:13 -0500 |
commit | 708e7fe2ce4872fa381f54ddb03890306444ca7b (patch) | |
tree | 81a6082fd97727ac88a39f435506281cf85a57ad | |
parent | 23fbc6d4afd3787f9e74df149d0235c6dbfd50fd (diff) |
wip: monkey-patch stub. function body.
-rw-r--r-- | c2haskell.hs | 45 |
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 | ||
501 | makeSetter d@(CDeclExt (CDecl xs ys pos)) = | 501 | makeSetter 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 | ||
505 | changeArgList1 f (CDeclr a xs b c d) = CDeclr a (f xs) b c d | 505 | changeArgList1 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 | ||
527 | voidReturnType = [ CTypeSpec (CVoidType undefNode) ] | 527 | voidReturnType = [ CTypeSpec (CVoidType undefNode) ] |
528 | 528 | ||
529 | setSetterBody name (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs (setterBody name) d)) | 529 | setBody bdy (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs bdy d)) |
530 | setSetterBody name (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] (setterBody name) pos)) | 530 | setBody 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 | |||
535 | makeStub d@(CDeclExt (CDecl xs ys pos)) = | 535 | makeStub 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 | ||
540 | parameterIdent :: CDeclaration a -> Maybe Ident | 544 | parameterIdent :: CDeclaration a -> Maybe Ident |
541 | parameterIdent (CDecl _ xs n) = listToMaybe $ do | 545 | parameterIdent (CDecl _ xs n) = listToMaybe $ do |
@@ -582,6 +586,39 @@ voidp = [ CFunDeclr | |||
582 | where n = undefNode | 586 | where n = undefNode |
583 | 587 | ||
584 | 588 | ||
589 | stubBody 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 | |||
585 | setterBody :: String -> CStatement NodeInfo | 622 | setterBody :: String -> CStatement NodeInfo |
586 | setterBody name = | 623 | setterBody name = |
587 | CCompound [] | 624 | CCompound [] |