1 -----------------------------------------------------------------------------
3 -- Module : Text.ParserCombinators.Parsec.Pos
4 -- Copyright : (c) Daan Leijen 1999-2001
5 -- License : BSD-style (see the file libraries/base/LICENSE)
7 -- Maintainer : daan@cs.uu.nl
8 -- Stability : provisional
9 -- Portability : portable
11 -- Textual source positions.
13 -----------------------------------------------------------------------------
15 module Text.ParserCombinators.Parsec.Pos
16 ( SourceName, Line, Column
18 , sourceLine, sourceColumn, sourceName
19 , incSourceLine, incSourceColumn
20 , setSourceLine, setSourceColumn, setSourceName
22 , updatePosChar, updatePosString
25 -----------------------------------------------------------
26 -- Source Positions, a file name, a line and a column.
27 -- upper left is (1,1)
28 -----------------------------------------------------------
29 type SourceName = String
33 data SourcePos = SourcePos SourceName !Line !Column
37 newPos :: SourceName -> Line -> Column -> SourcePos
38 newPos sourceName line column
39 = SourcePos sourceName line column
42 = newPos sourceName 1 1
44 sourceName (SourcePos name line column) = name
45 sourceLine (SourcePos name line column) = line
46 sourceColumn (SourcePos name line column) = column
48 incSourceLine (SourcePos name line column) n = SourcePos name (line+n) column
49 incSourceColumn (SourcePos name line column) n = SourcePos name line (column+n)
51 setSourceName (SourcePos name line column) n = SourcePos n line column
52 setSourceLine (SourcePos name line column) n = SourcePos name n column
53 setSourceColumn (SourcePos name line column) n = SourcePos name line n
55 -----------------------------------------------------------
56 -- Update source positions on characters
57 -----------------------------------------------------------
58 updatePosString :: SourcePos -> String -> SourcePos
59 updatePosString pos string
60 = forcePos (foldl updatePosChar pos string)
62 updatePosChar :: SourcePos -> Char -> SourcePos
63 updatePosChar pos@(SourcePos name line column) c
66 '\n' -> SourcePos name (line+1) 1
67 '\r' -> SourcePos name (line+1) 1
68 '\t' -> SourcePos name line (column + 8 - ((column-1) `mod` 8))
69 _ -> SourcePos name line (column + 1)
72 forcePos :: SourcePos -> SourcePos
73 forcePos pos@(SourcePos name line column)
74 = seq line (seq column (pos))
76 -----------------------------------------------------------
78 -----------------------------------------------------------
79 instance Show SourcePos where
80 show (SourcePos name line column)
81 | null name = showLineColumn
82 | otherwise = "\"" ++ name ++ "\" " ++ showLineColumn
84 showLineColumn = "(line " ++ show line ++
85 ", column " ++ show column ++