diff -r 56d2f2d5aad8 -r 4feced261c68 tools/pas2c/Main.hs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/pas2c/Main.hs Tue Jan 21 22:38:13 2014 +0100 @@ -0,0 +1,82 @@ +module Main( main ) where + +import System.Console.GetOpt +import System.Environment +import System.Exit +import System.IO +import Data.Maybe( fromMaybe, isJust, fromJust ) +import Data.List (find, intercalate) +import Control.Monad +import Pas2C + +main = do + args <- getArgs + if length args == 0 + then do + name <- getProgName + hPutStrLn stderr $ usageInfo header options + exitFailure + else do + case getOpt RequireOrder options args of + (flags, [], []) | enoughFlags flags -> do + let m = flag flags isName + let i = flag flags isInput + let o = flag flags isOutput + let a = fromMaybe o $ liftM extractString $ find isAlt flags + let symbols = ["PAS2C", "FPC"] ++ (map extractString $ filter isSymbol flags) + hPutStrLn stdout $ "--------Pas2C Config--------" + hPutStrLn stdout $ "Main module: " ++ m + hPutStrLn stdout $ "Input path : " ++ i + hPutStrLn stdout $ "Output path: " ++ o + hPutStrLn stdout $ "Altern path: " ++ a + hPutStrLn stdout $ "Symbols defined: " ++ (intercalate ", " symbols) + hPutStrLn stdout $ "----------------------------" + pas2C m (i++"/") (o++"/") (a++"/") symbols + hPutStrLn stdout $ "----------------------------" + | otherwise -> error $ usageInfo header options + (_, nonOpts, []) -> error $ "unrecognized arguments: " ++ unwords nonOpts + (_, _, msgs) -> error $ usageInfo header options + where + header = "Freepascal to C conversion! Please specify -n -i -o options.\n" + enoughFlags f = and $ map (isJust . flip find f) [isName, isInput, isOutput] + flag f = extractString . fromJust . flip find f + + +data Flag = HelpMessage + | Name String + | Input String + | Output String + | Alternate String + | Symbol String + + +extractString :: Flag -> String +extractString (Name s) = s +extractString (Input s) = s +extractString (Output s) = s +extractString (Alternate s) = s +extractString (Symbol s) = s +extractString _ = undefined + +isName, isInput, isOutput, isAlt, isSymbol :: Flag -> Bool +isName (Name _) = True +isName _ = False +isInput (Input _) = True +isInput _ = False +isOutput (Output _) = True +isOutput _ = False +isAlt (Alternate _) = True +isAlt _ = False +isSymbol (Symbol _) = True +isSymbol _ = False + +options :: [OptDescr Flag] +options = [ + Option ['h'] ["help"] (NoArg HelpMessage) "print this help message", + Option ['n'] ["name"] (ReqArg Name "MAIN") "name of the main Pascal module", + Option ['i'] ["input"] (ReqArg Input "DIR") "input directory, where .pas files will be read", + Option ['o'] ["output"] (ReqArg Output "DIR") "output directory, where .c/.h files will be written", + Option ['a'] ["alternate"] (ReqArg Alternate "DIR") "alternate input directory, for out of source builds", + Option ['d'] ["define"] (ReqArg Symbol "SYMBOL") "define symbol" + ] +