1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
{-
-- The main program for cpphs, a simple C pre-processor written in Haskell.
-- Copyright (c) 2004 Malcolm Wallace
-- This file is LGPL (relicensed from the GPL by Malcolm Wallace, October 2011).
-}
module Language.Preprocessor.Cpphs.RunCpphs ( runCpphs
, runCpphsReturningSymTab
) where
import Language.Preprocessor.Cpphs.CppIfdef (cppIfdef)
import Language.Preprocessor.Cpphs.MacroPass(macroPass,macroPassReturningSymTab)
import Language.Preprocessor.Cpphs.Options (CpphsOptions(..), BoolOptions(..)
,trailing)
import Language.Preprocessor.Cpphs.Tokenise (deWordStyle, tokenise)
import Language.Preprocessor.Cpphs.Position (cleanPath)
import Language.Preprocessor.Unlit as Unlit (unlit)
runCpphs :: CpphsOptions -> FilePath -> String -> IO String
runCpphs options' filename input = do
let options= options'{ includes= map (trailing "\\/") (includes options') }
let bools = boolopts options
preInc = case preInclude options of
[] -> ""
is -> concatMap (\f->"#include \""++f++"\"\n") is
++ "#line 1 \""++cleanPath filename++"\"\n"
pass1 <- cppIfdef filename (defines options) (includes options) bools
(preInc++input)
pass2 <- macroPass (defines options) bools pass1
let result= if not (macros bools)
then if stripC89 bools || stripEol bools
then concatMap deWordStyle $
tokenise (stripEol bools) (stripC89 bools)
(ansi bools) (lang bools) pass1
else unlines (map snd pass1)
else pass2
pass3 = if literate bools then Unlit.unlit filename else id
return (pass3 result)
runCpphsReturningSymTab :: CpphsOptions -> FilePath -> String
-> IO (String,[(String,String)])
runCpphsReturningSymTab options' filename input = do
let options= options'{ includes= map (trailing "\\/") (includes options') }
let bools = boolopts options
preInc = case preInclude options of
[] -> ""
is -> concatMap (\f->"#include \""++f++"\"\n") is
++ "#line 1 \""++cleanPath filename++"\"\n"
(pass2,syms) <-
if macros bools then do
pass1 <- cppIfdef filename (defines options) (includes options)
bools (preInc++input)
macroPassReturningSymTab (defines options) bools pass1
else do
pass1 <- cppIfdef filename (defines options) (includes options)
bools{macros=True} (preInc++input)
(_,syms) <- macroPassReturningSymTab (defines options) bools pass1
pass1 <- cppIfdef filename (defines options) (includes options)
bools (preInc++input)
let result = if stripC89 bools || stripEol bools
then concatMap deWordStyle $
tokenise (stripEol bools) (stripC89 bools)
(ansi bools) (lang bools) pass1
else init $ unlines (map snd pass1)
return (result,syms)
let pass3 = if literate bools then Unlit.unlit filename else id
return (pass3 pass2, syms)
|