First implementation of CLASSPATH and JAR files reading.
[hs-java.git] / Java / META / Parser.hs
1
2 module Java.META.Parser where
3
4 import qualified Data.Map as M
5 import Text.Parsec
6 import Text.Parsec.String
7
8 import Java.META.Types
9
10 pNewLine :: Parser ()
11 pNewLine = choice $ map try $ [
12               string "\r\n" >> return (),
13               char '\r' >> return (),
14               char '\n' >> return () ]
15
16 blankline :: Parser ()
17 blankline = do
18   pNewLine <?> "first newline in blankline"
19   return ()
20
21 pSection :: Parser Section
22 pSection = do
23   list <- many1 pHeader
24   blankline <?> "blank line"
25   return $ M.fromList list
26
27 pHeader :: Parser (String, String) 
28 pHeader = do
29     name <- many1 headerChar <?> "header name"
30     char ':'
31     value <- pValue
32     return (name, value)
33   where
34     headerChar = oneOf "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
35
36 pValue :: Parser String
37 pValue = do
38   list <- manyLines
39   return (concat list)
40
41 manyLines :: Parser [String]
42 manyLines = do
43   char ' '
44   many space
45   s <- many1 (noneOf "\n\r\0")
46   pNewLine <?> "new line at end of value line"
47   c <- lookAhead anyChar
48   if c == ' '
49     then do
50          next <- manyLines
51          return (s: next)
52     else return [s]
53
54 pMETA :: Parser META
55 pMETA = many1 pSection
56
57 parseMetaFile :: FilePath -> IO (Either ParseError META)
58 parseMetaFile path = do
59   str <- readFile path
60   return $ parse pMETA path (str ++ "\n\n")