-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | A liberalised re-implementation of cpp, the C pre-processor.
--   
--   Cpphs is a re-implementation of the C pre-processor that is both more
--   compatible with Haskell, and itself written in Haskell so that it can
--   be distributed with compilers.
--   
--   This version of the C pre-processor is pretty-much feature-complete
--   and compatible with traditional (K&R) pre-processors. Additional
--   features include: a plain-text mode; an option to unlit literate code
--   files; and an option to turn off macro-expansion.
--   
--   Old homepage:
--   https://archives.haskell.org/projects.haskell.org/cpphs/
@package cpphs
@version 1.20.10

-- | Part of this code is from "Report on the Programming Language
--   Haskell", version 1.2, appendix C.
module Language.Preprocessor.Unlit

-- | unlit takes a filename (for error reports), and transforms the
--   given string, to eliminate the literate comments from the program
--   text.
unlit :: FilePath -> String -> String

-- | Include the interface that is exported
module Language.Preprocessor.Cpphs
runCpphs :: CpphsOptions -> FilePath -> String -> IO String
runCpphsPass1 :: CpphsOptions -> FilePath -> String -> IO [(Posn, String)]
runCpphsPass2 :: BoolOptions -> [(String, String)] -> FilePath -> [(Posn, String)] -> IO String
runCpphsReturningSymTab :: CpphsOptions -> FilePath -> String -> IO (String, [(String, String)])

-- | Run a first pass of cpp, evaluating #ifdef's and processing
--   #include's, whilst taking account of #define's and #undef's as we
--   encounter them.
cppIfdef :: FilePath -> [(String, String)] -> [String] -> BoolOptions -> String -> IO [(Posn, String)]

-- | tokenise is, broadly-speaking, Prelude.words, except that: * the input
--   is already divided into lines * each word-like "token" is categorised
--   as one of {Ident,Other,Cmd} * #define's are parsed and returned
--   out-of-band using the Cmd variant * All whitespace is preserved intact
--   as tokens. * C-comments are converted to white-space (depending on
--   first param) * Parens and commas are tokens in their own right. * Any
--   cpp line continuations are respected. No errors can be raised. The
--   inverse of tokenise is (concatMap deWordStyle).
tokenise :: Bool -> Bool -> Bool -> Bool -> [(Posn, String)] -> [WordStyle]

-- | Each token is classified as one of Ident, Other, or Cmd: * Ident is a
--   word that could potentially match a macro name. * Cmd is a complete
--   cpp directive (#define etc). * Other is anything else.
data WordStyle
Ident :: Posn -> String -> WordStyle
Other :: String -> WordStyle
Cmd :: Maybe HashDefine -> WordStyle

-- | Walk through the document, replacing calls of macros with the expanded
--   RHS.
macroPass :: [(String, String)] -> BoolOptions -> [(Posn, String)] -> IO String

-- | Walk through the document, replacing calls of macros with the expanded
--   RHS. Additionally returns the active symbol table after processing.
macroPassReturningSymTab :: [(String, String)] -> BoolOptions -> [(Posn, String)] -> IO (String, [(String, String)])

-- | Cpphs options structure.
data CpphsOptions
CpphsOptions :: [FilePath] -> [FilePath] -> [(String, String)] -> [String] -> [FilePath] -> BoolOptions -> CpphsOptions
[infiles] :: CpphsOptions -> [FilePath]
[outfiles] :: CpphsOptions -> [FilePath]
[defines] :: CpphsOptions -> [(String, String)]
[includes] :: CpphsOptions -> [String]

-- | Files to #include before anything else
[preInclude] :: CpphsOptions -> [FilePath]
[boolopts] :: CpphsOptions -> BoolOptions

-- | Options representable as Booleans.
data BoolOptions
BoolOptions :: Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> Bool -> BoolOptions

-- | Leave #define and #undef in output of ifdef?
[macros] :: BoolOptions -> Bool

-- | Place #line droppings in output?
[locations] :: BoolOptions -> Bool

-- | Write #line or {-# LINE #-} ?
[hashline] :: BoolOptions -> Bool

-- | Keep #pragma in final output?
[pragma] :: BoolOptions -> Bool

-- | Remove C eol (//) comments everywhere?
[stripEol] :: BoolOptions -> Bool

-- | Remove C inline (/**/) comments everywhere?
[stripC89] :: BoolOptions -> Bool

-- | Lex input as Haskell code?
[lang] :: BoolOptions -> Bool

-- | Permit stringise # and catenate ## operators?
[ansi] :: BoolOptions -> Bool

-- | Retain newlines in macro expansions?
[layout] :: BoolOptions -> Bool

-- | Remove literate markup?
[literate] :: BoolOptions -> Bool

-- | Issue warnings?
[warnings] :: BoolOptions -> Bool

-- | Parse all command-line options.
parseOptions :: [String] -> Either String CpphsOptions

-- | Default options.
defaultCpphsOptions :: CpphsOptions

-- | Default settings of boolean options.
defaultBoolOptions :: BoolOptions

-- | Project the directory of the filename.
directory :: Posn -> FilePath

-- | Source positions contain a filename, line, column, and an inclusion
--   point, which is itself another source position, recursively.
data Posn
Pn :: String -> !Int -> !Int -> Maybe Posn -> Posn

-- | Constructor. Argument is filename.
newfile :: String -> Posn

-- | Increment row number, reset column to 1.
newline :: Posn -> Posn

-- | Increment row number by given quantity.
newlines :: Int -> Posn -> Posn

-- | cpp-style printing of file position
cppline :: Posn -> String

-- | Conversion from a cpp-style "#line" to haskell-style pragma.
cpp2hask :: String -> String

-- | Update position with a new row, and possible filename.
newpos :: Int -> Maybe String -> Posn -> Posn

-- | Project the filename.
filename :: Posn -> String

-- | Project the line number.
lineno :: Posn -> Int

-- | Increment column number by given quantity.
addcol :: Int -> Posn -> Posn

-- | Increment column number, tab stops are every 8 chars.
tab :: Posn -> Posn

-- | haskell-style printing of file position
haskline :: Posn -> String

-- | Sigh. Mixing Windows filepaths with unix is bad. Make sure there is a
--   canonical path separator.
cleanPath :: FilePath -> FilePath
