{-# LANGUAGE DeriveDataTypeable #-}
module Language.C.Data.Position (
Position(),
position,
PosLength,
posFile,posRow,posColumn,posOffset,
initPos, isSourcePos,
nopos, isNoPos,
builtinPos, isBuiltinPos,
internalPos, isInternalPos,
incPos, retPos, adjustPos,
incOffset,
Pos(..),
) where
import Data.Generics
data Position = Position { posOffset :: {-# UNPACK #-} !Int , posFile :: String , posRow :: {-# UNPACK #-} !Int , posColumn :: {-# UNPACK #-} !Int }
| NoPosition
| BuiltinPosition
| InternalPosition
deriving (Eq, Ord, Typeable, Data)
type PosLength = (Position,Int)
instance Show Position where
show (Position _ fname row _) = "(" ++ show fname ++ ": line " ++ show row ++ ")"
show NoPosition = "<no file>"
show BuiltinPosition = "<builtin>"
show InternalPosition = "<internal>"
position :: Int -> String -> Int -> Int -> Position
position = Position
class Pos a where
posOf :: a -> Position
initPos :: FilePath -> Position
initPos file = Position 0 file 1 1
isSourcePos :: Position -> Bool
isSourcePos (Position _ _ _ _) = True
isSourcePos _ = False
nopos :: Position
nopos = NoPosition
isNoPos :: Position -> Bool
isNoPos NoPosition = True
isNoPos _ = False
builtinPos :: Position
builtinPos = BuiltinPosition
isBuiltinPos :: Position -> Bool
isBuiltinPos BuiltinPosition = True
isBuiltinPos _ = False
internalPos :: Position
internalPos = InternalPosition
isInternalPos :: Position -> Bool
isInternalPos InternalPosition = True
isInternalPos _ = False
{-# INLINE incPos #-}
incPos :: Position -> Int -> Position
incPos (Position offs fname row col) n = Position (offs + n) fname row (col + n)
incPos p _ = p
{-# INLINE retPos #-}
retPos :: Position -> Position
retPos (Position offs fname row _) = Position (offs+1) fname (row + 1) 1
retPos p = p
{-# INLINE adjustPos #-}
adjustPos :: FilePath -> Int -> Position -> Position
adjustPos fname row (Position offs _ _ _) = Position offs fname row 1
adjustPos _ _ p = p
{-# INLINE incOffset #-}
incOffset :: Position -> Int -> Position
incOffset (Position o f r c) n = Position (o + n) f r c
incOffset p _ = p