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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
module Data.PropertyFile
( readPropertyFile, updatePropertyFile
, getPropertyFromFile, getPropertiesFromFile
)
where
import Data.Char
import System.Directory
import System.IO
readPropertyFile :: String -> IO [(String,String)]
readPropertyFile file = do
pfexists <- doesFileExist file
if pfexists
then do
rcs <- openFile file ReadMode >>= hGetContents
return $ splitEqs . filter (\l->not (null l) && isAlpha (head l))
. lines $ rcs
else return []
where
splitEqs [] = []
splitEqs (eq:eqs) = case break (=='=') eq of
(prop,_:val) -> (prop,val) : splitEqs eqs
_ -> splitEqs eqs
updatePropertyFile :: String -> String -> String -> IO ()
updatePropertyFile file pname pval = do
props <- readPropertyFile file
if lookup pname props == Nothing
then appendFile file (pname++"="++pval++"\n")
else changePropertyInFile file pname pval
changePropertyInFile :: String -> String -> String -> IO ()
changePropertyInFile file pname pval = do
rcs <- openFile file ReadMode >>= hGetContents
writeFile file (unlines . map changeProp . lines $ rcs)
where
changeProp l = let (s1,s2) = break (=='=') l
in if null l || not (isAlpha (head l)) || null s2
then l
else if s1 == pname then s1 ++ "=" ++ pval
else l
getPropertyFromFile :: String -> String -> IO (Maybe String)
getPropertyFromFile propfile propname = do
props <- readPropertyFile propfile
return $ lookup (map toLower propname)
(map (\ (a, b) -> (map toLower a, b)) props)
getPropertiesFromFile :: String -> [String] -> IO [Maybe String]
getPropertiesFromFile propfile propnames = do
props <- readPropertyFile propfile
return (map (flip lookup (map (\ (a, b) -> (map toLower a, b)) props))
(map (map toLower) propnames))
|