diff options
author | Joe Crayne <joe@jerkface.net> | 2018-11-24 00:12:14 -0500 |
---|---|---|
committer | Joe Crayne <joe@jerkface.net> | 2018-11-24 00:12:14 -0500 |
commit | e728b91d49807a327e66f1c56c25dd02626ce2ce (patch) | |
tree | 53f771e1ef2ef781b9a33789f320eeff433f6c33 | |
parent | 49b428e18dfcf599600f77c9c2ba492dd3ede26f (diff) |
It worked!
-rw-r--r-- | c2haskell.hs | 105 |
1 files changed, 79 insertions, 26 deletions
diff --git a/c2haskell.hs b/c2haskell.hs index 41d9ba0..92fafe4 100644 --- a/c2haskell.hs +++ b/c2haskell.hs | |||
@@ -232,34 +232,43 @@ hsTypeSpec (CTypeSpec unhandled) = trace ("hsTypeSpec unhandled: "++ show (const | |||
232 | hsTypeSpec _ = [] | 232 | hsTypeSpec _ = [] |
233 | 233 | ||
234 | 234 | ||
235 | -- fieldInfo :: CDeclarator b -> (Maybe (CDeclarator b), Maybe (CInitializer b), Maybe (CExpression b)) | ||
236 | -- fieldInfo var = (Just var,Nothing,Nothing) | ||
237 | fieldInfo :: (Maybe (CDeclarator b), Maybe (CInitializer b), Maybe (CExpression b)) -> [CDeclarator b] | ||
238 | fieldInfo (Just var,_,_) = [var] | ||
239 | fieldInfo _ = [] | ||
240 | |||
235 | -- hsTransField :: [CDeclarationSpecifier t3] -> [(Maybe (CDeclarator t2), Maybe t1, Maybe t)] -> [HS.Decl ()] | 241 | -- hsTransField :: [CDeclarationSpecifier t3] -> [(Maybe (CDeclarator t2), Maybe t1, Maybe t)] -> [HS.Decl ()] |
236 | -- recursive for function signatures. | 242 | -- recursive for function signatures. |
237 | hsTransField :: Show b => | 243 | hsTransField :: Show b => |
238 | [CDeclarationSpecifier b] -- c structure name | 244 | [CDeclarationSpecifier b] -- c structure name |
239 | -> [(Maybe (CDeclarator b), Maybe (CInitializer b), Maybe (CExpression b))] -- c variable declarations | 245 | -- -> [(Maybe (CDeclarator b), Maybe (CInitializer b), Maybe (CExpression b))] -- c variable declarations |
246 | -> [CDeclarator b] -- c variable declarations | ||
240 | -> [(String{-field name-}, HS.Type () {- haskell type -}) ] | 247 | -> [(String{-field name-}, HS.Type () {- haskell type -}) ] |
241 | hsTransField ctyps vars | 248 | hsTransField ctyps vars |
242 | = do | 249 | = do |
243 | typname <- hsMkName . either (capitalize . identToString) id <$> (hsTypeSpec =<< ctyps) | 250 | typname <- hsMkName . either (capitalize . identToString) id <$> (hsTypeSpec =<< ctyps) |
244 | trace ("typname="++show typname) $ return () | 251 | trace ("typname="++show typname) $ return () |
245 | (var,Nothing,Nothing) <- vars | 252 | -- (var,Nothing,Nothing) <- vars |
253 | var <- vars | ||
246 | trace ("var="++show var) $ return () | 254 | trace ("var="++show var) $ return () |
247 | CDeclr (Just fident) ptrdeclr Nothing [] _ <- maybeToList var | 255 | -- CDeclr (Just fident) ptrdeclr Nothing [] _ <- maybeToList var |
248 | trace ("fident="++show fident) $ return () | 256 | let CDeclr mfident ptrdeclr Nothing [] _ = var |
257 | trace ("fident="++show mfident) $ return () | ||
249 | trace ("ptrdeclr="++show ptrdeclr) $ return () | 258 | trace ("ptrdeclr="++show ptrdeclr) $ return () |
250 | let btyp = HS.TyCon () typname | 259 | let btyp = HS.TyCon () typname |
251 | grok bs b = case bs of | 260 | grok bs b = case bs of |
252 | [] -> b | 261 | [] -> b |
253 | (CPtrDeclr [] _:cs) -> HS.TyApp () (HS.TyCon () (hsMkName "Ptr")) (grok cs b) | 262 | (CPtrDeclr [] _:cs) -> HS.TyApp () (HS.TyCon () (hsMkName "Ptr")) (grok cs b) |
254 | CFunDeclr (Right (args,flg)) attrs _:p -> | 263 | CFunDeclr (Right (args,flg)) attrs _:p -> |
255 | let (as,ts) = unzip $ concatMap (\(CDecl rs as _) -> hsTransField rs as) args | 264 | let (as,ts) = unzip $ concatMap (\(CDecl rs as _) -> hsTransField rs $ concatMap fieldInfo as) args |
256 | b0 = case p of | 265 | b0 = case p of |
257 | CPtrDeclr [] _:cs -> HS.TyApp () (HS.TyCon () (hsMkName "Ptr")) (grok cs b) | 266 | CPtrDeclr [] _:cs -> HS.TyApp () (HS.TyCon () (hsMkName "Ptr")) (grok cs b) |
258 | [] -> b | 267 | [] -> b |
259 | in foldr (HS.TyFun ()) b0 ts | 268 | in foldr (HS.TyFun ()) b0 ts |
260 | _ -> HS.TyCon () (hsMkName $ show $ map (fmap (const ())) ptrdeclr) | 269 | _ -> HS.TyCon () (hsMkName $ show $ map (fmap (const ())) ptrdeclr) |
261 | ftyp = grok ptrdeclr btyp | 270 | ftyp = grok ptrdeclr btyp |
262 | fieldName = identToString fident | 271 | fieldName = maybe ("_") identToString mfident |
263 | [ ( fieldName, ftyp ) ] | 272 | [ ( fieldName, ftyp ) ] |
264 | {- | 273 | {- |
265 | transField (CDecl [CTypeSpec (CSUType (CStruct CStructTag mctyp Nothing [] _) _)] vars _) | 274 | transField (CDecl [CTypeSpec (CSUType (CStruct CStructTag mctyp Nothing [] _) _)] vars _) |
@@ -279,11 +288,15 @@ extractType (HS.TypeDecl _ _ ftyp) = ftyp | |||
279 | extractType (HS.TypeSig _ _ ftyp) = ftyp | 288 | extractType (HS.TypeSig _ _ ftyp) = ftyp |
280 | extractType _ = TyCon () (Special () (UnitCon ())) | 289 | extractType _ = TyCon () (Special () (UnitCon ())) |
281 | 290 | ||
291 | {- | ||
282 | hsTransFieldExt :: Show b => | 292 | hsTransFieldExt :: Show b => |
283 | [CDeclarationSpecifier b] | 293 | [CDeclarationSpecifier b] |
284 | -> [(Maybe (CDeclarator b), Maybe (CInitializer b), | 294 | -> [(Maybe (CDeclarator b), Maybe (CInitializer b), |
285 | Maybe (CExpression b))] | 295 | Maybe (CExpression b))] |
286 | -> [Decl ()] | 296 | -> [Decl ()] |
297 | -} | ||
298 | hsTransFieldExt :: Show b => | ||
299 | [CDeclarationSpecifier b] -> [CDeclarator b] -> [Decl ()] | ||
287 | hsTransFieldExt rs as = concatMap (\(fieldName,ftyp)-> [ HS.TypeSig () [ HS.Ident () fieldName ] ftyp ]) | 300 | hsTransFieldExt rs as = concatMap (\(fieldName,ftyp)-> [ HS.TypeSig () [ HS.Ident () fieldName ] ftyp ]) |
288 | $ hsTransField rs as | 301 | $ hsTransField rs as |
289 | 302 | ||
@@ -311,11 +324,31 @@ unpointer t = case getPtrType t of | |||
311 | Nothing -> t | 324 | Nothing -> t |
312 | Just t' -> t' | 325 | Just t' -> t' |
313 | 326 | ||
314 | sig :: Show t => CExternalDeclaration t -> [HS.Decl ()] | 327 | -- sig :: Show t => CExternalDeclaration t -> [HS.Decl ()] |
328 | sig :: CExternalDeclaration NodeInfo -> [Decl ()] | ||
315 | sig = sigf hsTransFieldExt | 329 | sig = sigf hsTransFieldExt |
316 | 330 | ||
317 | sigf f (CDeclExt (CDecl rs as _)) = f rs as | 331 | -- • Couldn't match expected type ‘CDerivedDeclarator a -> (Maybe (CDeclarator a), Maybe (CInitializer a), Maybe (CExpression a))’ |
318 | sigf f (CFDefExt (CFunDef rs cdeclr [] bdy _)) = f rs [(Just cdeclr, Nothing, Nothing)] | 332 | -- with actual type ‘(CDerivedDeclarator NodeInfo -> Maybe (CDeclarator NodeInfo), Maybe a0, Maybe a1)’ |
333 | |||
334 | |||
335 | -- CDeclr (Maybe Ident) | ||
336 | -- [CDerivedDeclarator a] | ||
337 | -- (Maybe (CStringLiteral a)) | ||
338 | -- [CAttribute a] | ||
339 | -- a | ||
340 | -- sigf f d@(CDeclExt (CDecl rs ((Just (CDeclr i x j k l),b,c):zs) n)) = f rs $ map (\v -> (Just (CDeclr Nothing [v] Nothing [] n),Nothing,Nothing)) x | ||
341 | sigf :: ([CDeclarationSpecifier b] -> [CDeclarator b] -> p) -> CExternalDeclaration b -> p | ||
342 | sigf f (CDeclExt (CDecl rs as _)) = f rs $ concatMap fieldInfo as | ||
343 | sigf f (CFDefExt (CFunDef rs cdeclr [] bdy _)) = f rs [cdeclr] | ||
344 | {- | ||
345 | sigf f d = f (getReturnValue d) $ do | ||
346 | arg <- getArgList d | ||
347 | let node (CDeclExt (CDecl rs as n)) = n | ||
348 | node (CFDefExt (CFunDef rs cdeclr [] bdy n)) = n | ||
349 | s = listToMaybe $ catMaybes $ sym d | ||
350 | return $ CDeclr s [arg] Nothing [] (node d) | ||
351 | -} | ||
319 | 352 | ||
320 | body0 (CFDefExt (CFunDef rs cdeclr [] bdy _)) = Just bdy | 353 | body0 (CFDefExt (CFunDef rs cdeclr [] bdy _)) = Just bdy |
321 | body0 _ = Nothing | 354 | body0 _ = Nothing |
@@ -386,10 +419,14 @@ parseOptions ("-v":args) opts = parseOptions args opts | |||
386 | parseOptions as x = error (show as) | 419 | parseOptions as x = error (show as) |
387 | 420 | ||
388 | getsig (k,si) = do | 421 | getsig (k,si) = do |
389 | d <- take 1 $ symbolSource si | 422 | d0 <- take 1 $ symbolSource si |
390 | let ts = filter notKnown $ map tname $ map unpointer $ concatMap types $ sigf hsTransSig d | 423 | let d = case getArgList d0 of |
424 | oargs:xs -> let args = fst $ makeParameterNames oargs | ||
425 | in changeArgList (const $ args:xs) d0 | ||
426 | _ -> d0 | ||
427 | ts = filter notKnown $ map tname $ map unpointer $ concatMap types $ sigf hsTransSig d | ||
391 | s = sig d | 428 | s = sig d |
392 | [(ts,(k,s))] | 429 | [(ts,(k,s,d))] |
393 | 430 | ||
394 | isAcceptableImport (HS.TyFun _ (TyCon _ (UnQual _ (HS.Ident _ x))) xs) | not (notKnown x) = isAcceptableImport xs | 431 | isAcceptableImport (HS.TyFun _ (TyCon _ (UnQual _ (HS.Ident _ x))) xs) | not (notKnown x) = isAcceptableImport xs |
395 | isAcceptableImport (HS.TyFun _ (TyApp _ (TyCon _ (UnQual _ (HS.Ident _ "Ptr"))) x) xs) = isAcceptableImport xs | 432 | isAcceptableImport (HS.TyFun _ (TyApp _ (TyCon _ (UnQual _ (HS.Ident _ "Ptr"))) x) xs) = isAcceptableImport xs |
@@ -413,15 +450,18 @@ makeAcceptableImport t = t | |||
413 | 450 | ||
414 | -- c2haskell :: Foldable t => C2HaskellOptions -> p -> t String -> CTranslationUnit NodeInfo -> IO () | 451 | -- c2haskell :: Foldable t => C2HaskellOptions -> p -> t String -> CTranslationUnit NodeInfo -> IO () |
415 | c2haskell :: C2HaskellOptions | 452 | c2haskell :: C2HaskellOptions |
416 | -> p1 -> [String] -> IncludeStack -> CTranslationUnit NodeInfo -> IO () | 453 | -> p1 -> FilePath -> [String] -> IncludeStack -> CTranslationUnit NodeInfo -> IO () |
417 | c2haskell opts cs missings incs (CTranslUnit edecls _) = do | 454 | c2haskell opts cs cmodname missings incs (CTranslUnit edecls _) = do |
418 | let db = foldr update initTranspile edecls | 455 | let db = foldr update initTranspile edecls |
419 | es = Map.filter (\d -> symbolLocal d && not (symbolStatic d)) (syms db) | 456 | es = Map.filter (\d -> symbolLocal d && not (symbolStatic d)) (syms db) |
420 | case selectFunction opts of | 457 | case selectFunction opts of |
421 | Nothing -> do | 458 | Nothing -> do |
422 | createDirectoryIfMissing False "MonkeyPatch" | 459 | createDirectoryIfMissing False "MonkeyPatch" |
423 | let fname = ("MonkeyPatch/" ++ modname ++ ".hs") | 460 | let fname = ("MonkeyPatch/" ++ modname ++ ".hs") |
424 | modname = "T" -- todo | 461 | basename f = case break (=='.') $ takeWhile (/='/') $ reverse f of |
462 | (ext,_:rname) -> reverse rname | ||
463 | (rname,_) -> reverse rname | ||
464 | modname = capitalize $ basename cmodname | ||
425 | stubsname = "MonkeyPatch/t_stubs.c" -- todo | 465 | stubsname = "MonkeyPatch/t_stubs.c" -- todo |
426 | putStrLn $ "writing " ++ fname | 466 | putStrLn $ "writing " ++ fname |
427 | withFile fname WriteMode $ \haskmod -> do | 467 | withFile fname WriteMode $ \haskmod -> do |
@@ -443,11 +483,14 @@ c2haskell opts cs missings incs (CTranslUnit edecls _) = do | |||
443 | putStrLn $ "-- ip_is_lan `elem` sigs2 = " ++ show (elem "ip_is_lan" sigs2) | 483 | putStrLn $ "-- ip_is_lan `elem` sigs2 = " ++ show (elem "ip_is_lan" sigs2) |
444 | forM_ (uniq $ ts ++ sigs2) $ \t -> do | 484 | forM_ (uniq $ ts ++ sigs2) $ \t -> do |
445 | hPutStrLn haskmod $ "data " ++ t | 485 | hPutStrLn haskmod $ "data " ++ t |
446 | forM_ sigs $ \(_,(k,hs)) -> do | 486 | forM_ sigs $ \(_,(k,hs,d)) -> do |
447 | forM_ hs $ \hdecl -> do | 487 | forM_ hs $ \hdecl -> do |
488 | hPutStr haskmod (commented k) | ||
489 | hPutStr haskmod (commented $ show $ pretty d) | ||
490 | hPutStr haskmod (commented $ show $ getReturnValue d) | ||
491 | hPutStr haskmod (commented $ show hdecl) | ||
492 | -- hPutStr haskmod $ commented $ show $ length $ symbolSource si | ||
448 | {- | 493 | {- |
449 | putStr (commented k) | ||
450 | putStr $ commented $ show $ length $ symbolSource si | ||
451 | forM_ (take 1 $ symbolSource si) $ \d -> do | 494 | forM_ (take 1 $ symbolSource si) $ \d -> do |
452 | let ts = filter notKnown $ map tname $ pointers $ concatMap types $ sigf hsTransSig d | 495 | let ts = filter notKnown $ map tname $ pointers $ concatMap types $ sigf hsTransSig d |
453 | -- putStr $ commented (ppShow (fmap (const ()) d)) | 496 | -- putStr $ commented (ppShow (fmap (const ()) d)) |
@@ -517,6 +560,7 @@ c2haskell opts cs missings incs (CTranslUnit edecls _) = do | |||
517 | Just cfun -> do | 560 | Just cfun -> do |
518 | forM_ (Map.lookup cfun $ syms db) $ \si -> do | 561 | forM_ (Map.lookup cfun $ syms db) $ \si -> do |
519 | forM_ (take 1 $ symbolSource si) $ \d -> do | 562 | forM_ (take 1 $ symbolSource si) $ \d -> do |
563 | putStrLn $ concatMap HS.prettyPrint $ sig d | ||
520 | putStrLn $ show $ pretty d | 564 | putStrLn $ show $ pretty d |
521 | putStrLn $ show $ pretty $ makeFunctionPointer d | 565 | putStrLn $ show $ pretty $ makeFunctionPointer d |
522 | putStrLn $ show $ pretty $ makeSetter d | 566 | putStrLn $ show $ pretty $ makeSetter d |
@@ -571,6 +615,8 @@ changeArgList2 f ((a,b,c):zs) = (changeArgList3 f a,b,c):zs | |||
571 | 615 | ||
572 | changeArgList3 f (Just (CDeclr a x b c d)) = Just (CDeclr a (f x) b c d) | 616 | changeArgList3 f (Just (CDeclr a x b c d)) = Just (CDeclr a (f x) b c d) |
573 | 617 | ||
618 | changeArgList :: ([CDerivedDeclarator a] -> [CDerivedDeclarator a]) | ||
619 | -> CExternalDeclaration a -> CExternalDeclaration a | ||
574 | changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d) | 620 | changeArgList f (CFDefExt (CFunDef xs ys zs c d)) = CFDefExt (CFunDef xs (changeArgList1 f ys) zs c d) |
575 | changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos)) | 621 | changeArgList f (CDeclExt (CDecl xs ys pos)) = (CDeclExt (CDecl xs (changeArgList2 f ys) pos)) |
576 | 622 | ||
@@ -586,6 +632,7 @@ getArgList2 ((a,b,c):zs) = getArgList3 a | |||
586 | 632 | ||
587 | getArgList3 (Just (CDeclr a x b c d)) = x | 633 | getArgList3 (Just (CDeclr a x b c d)) = x |
588 | 634 | ||
635 | getArgList :: CExternalDeclaration a -> [CDerivedDeclarator a] | ||
589 | getArgList (CFDefExt (CFunDef xs ys zs c d)) = getArgList1 ys | 636 | getArgList (CFDefExt (CFunDef xs ys zs c d)) = getArgList1 ys |
590 | getArgList (CDeclExt (CDecl xs ys pos)) = getArgList2 ys | 637 | getArgList (CDeclExt (CDecl xs ys pos)) = getArgList2 ys |
591 | 638 | ||
@@ -598,7 +645,7 @@ getReturnValue (CDeclExt (CDecl xs ys pos)) = xs | |||
598 | voidReturnType = [ CTypeSpec (CVoidType undefNode) ] | 645 | voidReturnType = [ CTypeSpec (CVoidType undefNode) ] |
599 | 646 | ||
600 | setBody bdy (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs bdy d)) | 647 | setBody bdy (CFDefExt (CFunDef xs ys zs c d)) = (CFDefExt (CFunDef xs ys zs bdy d)) |
601 | setBody bdy (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] bdy pos)) | 648 | setBody bdy (CDeclExt (CDecl xs ys pos)) = (CFDefExt (CFunDef xs v [] bdy pos)) |
602 | where v = case ys of | 649 | where v = case ys of |
603 | (Just y,_,_):_ -> y | 650 | (Just y,_,_):_ -> y |
604 | _ -> CDeclr Nothing [] Nothing [] pos | 651 | _ -> CDeclr Nothing [] Nothing [] pos |
@@ -608,7 +655,7 @@ makeStub d = -- @(CDeclExt (CDecl xs ys pos)) = | |||
608 | [ CTypeSpec (CVoidType _) ] -> False -- void function. | 655 | [ CTypeSpec (CVoidType _) ] -> False -- void function. |
609 | _ -> True | 656 | _ -> True |
610 | name = concatMap identToString $ take 1 $ catMaybes $ sym d | 657 | name = concatMap identToString $ take 1 $ catMaybes $ sym d |
611 | msg = "undefined: " ++ HS.prettyPrint (makeAcceptableDecl $ head $ sig d) ++ "\n" | 658 | msg = "undefined: " ++ concatMap (HS.prettyPrint . makeAcceptableDecl) (take 1 $ sig d) ++ "\n" |
612 | in case getArgList d of | 659 | in case getArgList d of |
613 | oargs:xs -> | 660 | oargs:xs -> |
614 | let (args,vs) = makeParameterNames oargs | 661 | let (args,vs) = makeParameterNames oargs |
@@ -622,7 +669,8 @@ parameterIdent (CDecl _ xs n) = listToMaybe $ do | |||
622 | return x | 669 | return x |
623 | 670 | ||
624 | 671 | ||
625 | makeParameterNames :: CDerivedDeclarator NodeInfo -> (CDerivedDeclarator NodeInfo,[CExpression NodeInfo]) | 672 | -- makeParameterNames :: CDerivedDeclarator NodeInfo -> (CDerivedDeclarator NodeInfo,[CExpression NodeInfo]) |
673 | makeParameterNames :: CDerivedDeclarator n -> (CDerivedDeclarator n,[CExpression n]) | ||
626 | makeParameterNames (CFunDeclr (Right (ps, flg)) z2 z3) = case ps of | 674 | makeParameterNames (CFunDeclr (Right (ps, flg)) z2 z3) = case ps of |
627 | [CDecl [CTypeSpec (CVoidType _)] [] _] -> ( CFunDeclr (Right (ps, flg)) z2 z3 , []) -- void argument list. | 675 | [CDecl [CTypeSpec (CVoidType _)] [] _] -> ( CFunDeclr (Right (ps, flg)) z2 z3 , []) -- void argument list. |
628 | _ -> ( CFunDeclr (Right (qs, flg)) z2 z3 , map expr qs ) | 676 | _ -> ( CFunDeclr (Right (qs, flg)) z2 z3 , map expr qs ) |
@@ -630,9 +678,9 @@ makeParameterNames (CFunDeclr (Right (ps, flg)) z2 z3) = case ps of | |||
630 | -- TODO: ensure uniqueness of generated parameter names | 678 | -- TODO: ensure uniqueness of generated parameter names |
631 | qs = zipWith mkp [0..] ps | 679 | qs = zipWith mkp [0..] ps |
632 | mkp num (CDecl rtyp ((Just (CDeclr Nothing typ x ys z),a,b):xs) n) | 680 | mkp num (CDecl rtyp ((Just (CDeclr Nothing typ x ys z),a,b):xs) n) |
633 | = (CDecl rtyp ((Just (CDeclr (Just $ mkidn num n) typ x ys z),a,b):xs) n) | 681 | = (CDecl rtyp ((Just (CDeclr (Just $ mkidn num undefNode) typ x ys z),a,b):xs) n) |
634 | mkp num (CDecl rtyp [] n) | 682 | mkp num (CDecl rtyp [] n) |
635 | = (CDecl rtyp ((Just (CDeclr (Just $ mkidn num n) [] Nothing [] n),Nothing,Nothing):[]) n) | 683 | = (CDecl rtyp ((Just (CDeclr (Just $ mkidn num undefNode) [] Nothing [] n),Nothing,Nothing):[]) n) |
636 | mkp num p = p | 684 | mkp num p = p |
637 | 685 | ||
638 | expr :: CDeclaration a -> CExpression a | 686 | expr :: CDeclaration a -> CExpression a |
@@ -717,10 +765,14 @@ goMissing :: Show b => | |||
717 | Handle -> Transpile [CExternalDeclaration b] -> String -> IO () | 765 | Handle -> Transpile [CExternalDeclaration b] -> String -> IO () |
718 | goMissing haskmod db cfun = do | 766 | goMissing haskmod db cfun = do |
719 | forM_ (Map.lookup cfun $ syms db) $ \si -> do | 767 | forM_ (Map.lookup cfun $ syms db) $ \si -> do |
720 | forM_ (take 1 $ symbolSource si) $ \d -> do | 768 | forM_ (take 1 $ symbolSource si) $ \d0 -> do |
721 | -- putStr $ commented (ppShow (fmap (const ()) d)) | 769 | -- putStr $ commented (ppShow (fmap (const ()) d)) |
722 | -- putStr $ commented (show $ pretty d) | 770 | -- putStr $ commented (show $ pretty d) |
723 | -- when (verbose opts) $ print (sig d) | 771 | -- when (verbose opts) $ print (sig d) |
772 | let d = case getArgList d0 of | ||
773 | oargs:xs -> let args = fst $ makeParameterNames oargs | ||
774 | in changeArgList (const $ args:xs) d0 | ||
775 | _ -> d0 | ||
724 | let ts = filter notKnown $ map tname $ pointers $ concatMap types $ sigf hsTransSig d | 776 | let ts = filter notKnown $ map tname $ pointers $ concatMap types $ sigf hsTransSig d |
725 | -- forM_ ts $ \t -> putStrLn $ "data " ++ t | 777 | -- forM_ ts $ \t -> putStrLn $ "data " ++ t |
726 | forM_ (sigf hsTransSig d) $ \hs -> do | 778 | forM_ (sigf hsTransSig d) $ \hs -> do |
@@ -796,7 +848,7 @@ usage :: [String] -> Maybe (C2HaskellOptions, [String], [FilePath]) | |||
796 | usage args = | 848 | usage args = |
797 | case break (=="--") args of | 849 | case break (=="--") args of |
798 | (targs,_:cargs0) -> do | 850 | (targs,_:cargs0) -> do |
799 | let (rfs,ropts) = span isModule cargs0 | 851 | let (rfs,ropts) = span isModule $ reverse cargs0 |
800 | opts = reverse ropts | 852 | opts = reverse ropts |
801 | cargs = (sanitizeArgs opts) | 853 | cargs = (sanitizeArgs opts) |
802 | hopts = parseOptions targs defopts | 854 | hopts = parseOptions targs defopts |
@@ -875,6 +927,7 @@ main = do | |||
875 | let usageString = self ++ " [--cpp | -p | -t ] [-v] [-f <sym>] -- [gcc options] [modules] <cfile>" | 927 | let usageString = self ++ " [--cpp | -p | -t ] [-v] [-f <sym>] -- [gcc options] [modules] <cfile>" |
876 | let m = usage args | 928 | let m = usage args |
877 | fromMaybe (putStrLn usageString) $ m <&> \(hopts,cargs,fname:fs) -> do | 929 | fromMaybe (putStrLn usageString) $ m <&> \(hopts,cargs,fname:fs) -> do |
930 | putStrLn $ "fname = " ++ fname | ||
878 | prer <- runPreprocessor (newGCC "gcc") (rawCppArgs cargs fname) | 931 | prer <- runPreprocessor (newGCC "gcc") (rawCppArgs cargs fname) |
879 | let r = do | 932 | let r = do |
880 | pre <- left Left $ prer | 933 | pre <- left Left $ prer |
@@ -895,4 +948,4 @@ main = do | |||
895 | putStrLn $ ppShow $ everywhere (mkT eraseNodeInfo) . snd <$> r | 948 | putStrLn $ ppShow $ everywhere (mkT eraseNodeInfo) . snd <$> r |
896 | _ -> do | 949 | _ -> do |
897 | syms <- linker (cargs ++ reverse fs) fname | 950 | syms <- linker (cargs ++ reverse fs) fname |
898 | either print (uncurry $ c2haskell hopts cs syms) r | 951 | either print (uncurry $ c2haskell hopts cs fname syms) r |