summaryrefslogtreecommitdiff
path: root/utils/hpc/HpcUtils.hs
blob: 397a04196558224efd5a2eec0d109c54ca93bbd0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
module HpcUtils where

import Trace.Hpc.Util
import qualified Data.Map as Map

-- turns \n into ' '
-- | grab's the text behind a HpcPos; 
grabHpcPos :: Map.Map Int String -> HpcPos -> String
grabHpcPos hsMap srcspan = 
         case lns of
           [ln] -> (take ((c2 - c1) + 1) $ drop (c1 - 1) ln)
           _ -> let lns1 = drop (c1 -1) (head lns) : tail lns
                    lns2 = init lns1 ++ [take (c2 + 1) (last lns1) ]
                 in foldl1 (\ xs ys -> xs ++ "\n" ++ ys) lns2
  where (l1,c1,l2,c2) = fromHpcPos srcspan
        lns = map (\ n -> case Map.lookup n hsMap of
                           Just ln -> ln
                           Nothing -> error $ "bad line number : " ++ show n
                  ) [l1..l2]


readFileFromPath :: (String -> IO String) -> String -> [String] -> IO String
readFileFromPath _ filename@('/':_) _ = readFile filename
readFileFromPath err filename path0 = readTheFile path0
  where
	readTheFile [] = err $ "could not find " ++ show filename 
			         ++ " in path " ++ show path0
	readTheFile (dir:dirs) = 
		catch (do str <- readFile (dir ++ "/" ++ filename) 
			  return str) 
		      (\ _ -> readTheFile dirs)