[project @ 2002-05-31 12:22:33 by panne]
[ghc-base.git] / Text / ParserCombinators / Parsec / Pos.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  Text.ParserCombinators.Parsec.Pos
4 -- Copyright   :  (c) Daan Leijen 1999-2001
5 -- License     :  BSD-style (see the file libraries/base/LICENSE)
6 -- 
7 -- Maintainer  :  daan@cs.uu.nl
8 -- Stability   :  provisional
9 -- Portability :  portable
10 --
11 -- Textual source positions.
12 -- 
13 -----------------------------------------------------------------------------
14
15 module Text.ParserCombinators.Parsec.Pos
16                   ( SourceName, Line, Column                 
17                   , SourcePos
18                   , sourceLine, sourceColumn, sourceName
19                   , incSourceLine, incSourceColumn
20                   , setSourceLine, setSourceColumn, setSourceName
21                   , newPos, initialPos
22                   , updatePosChar, updatePosString
23                   ) where
24
25 -----------------------------------------------------------
26 -- Source Positions, a file name, a line and a column.
27 -- upper left is (1,1)
28 -----------------------------------------------------------                         
29 type SourceName     = String
30 type Line           = Int
31 type Column         = Int
32
33 data SourcePos      = SourcePos SourceName !Line !Column
34                      deriving (Eq,Ord)
35                 
36
37 newPos :: SourceName -> Line -> Column -> SourcePos
38 newPos sourceName line column
39     = SourcePos sourceName line column
40
41 initialPos sourceName
42     = newPos sourceName 1 1
43
44 sourceName   (SourcePos name line column)   = name    
45 sourceLine   (SourcePos name line column)   = line    
46 sourceColumn (SourcePos name line column)   = column
47
48 incSourceLine   (SourcePos name line column) n    = SourcePos name (line+n) column
49 incSourceColumn (SourcePos name line column) n    = SourcePos name line (column+n)
50
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
54
55 -----------------------------------------------------------
56 -- Update source positions on characters
57 -----------------------------------------------------------                         
58 updatePosString :: SourcePos -> String -> SourcePos
59 updatePosString pos string
60     = forcePos (foldl updatePosChar pos string)
61
62 updatePosChar   :: SourcePos -> Char -> SourcePos
63 updatePosChar pos@(SourcePos name line column) c   
64     = forcePos $
65       case c of
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)
70         
71
72 forcePos :: SourcePos -> SourcePos      
73 forcePos pos@(SourcePos name line column)
74     = seq line (seq column (pos))
75
76 -----------------------------------------------------------
77 -- Show positions 
78 -----------------------------------------------------------                                                 
79 instance Show SourcePos where
80   show (SourcePos name line column)
81     | null name = showLineColumn
82     | otherwise = "\"" ++ name ++ "\" " ++ showLineColumn
83     where
84       showLineColumn    = "(line " ++ show line ++
85                           ", column " ++ show column ++
86                           ")"