packages feed

HSFFIG-1.1: programs/ProcHdr.hs

-- Processing Utilities for a Tokenized C Header File

module ProcHdr where

import C_Lexer
import C_BNF
import Text.ParserCombinators.Parsec
import TokenOps
import qualified Data.Map as Map

-- Extract file name from a TKFILE token

ppFile (TKFILE s p) = Just (read $ (\(a:b:c:ds) -> c) (words s))
ppFile _ = Nothing

-- Get header file name. If a header was preprocessed,
-- its first token will be PPFILE containing the filename
-- for the header to process. The function below makes
-- an attempt to extract such a filename. If the first
-- token in the list is not PPFILE, Nothing is returned.

getHeaderFileName :: [Token] -> Maybe String

getHeaderFileName [] = Nothing
getHeaderFileName (t:ts) = ppFile t

-- Parse the list of tokens.

type TParser a = GenParser Token () a

--

isPpDef (TKDEF _ _) = True
isPpDef _           = False

isCDef (TKDEF _ _)  = False
isCDef (TKFILE _ _) = False
isCDef _            = True

procHeader shs = runParser bnfParser (PState 0 Map.empty) "" $  
  ((ppdefsFrom shs) ++ (cdefsFrom shs)) 
    where ppdefsFrom l = isPpDef `filter` l
          cdefsFrom  l = isCDef `filter` l