content: module ParseAttrs(module ParseAttrs,module Attrs) where
  import Char(isSpace)
  import FileUtils(readFileNow)
  import MUtils
  
  import Attrs
  
  {-
  Read an attribute file.
  
   Attribute files use a textual file format for association lists.
   Each line in an attribute file may specify a binding of a tag
   string to a value string using a single colon to separate the
   two.  If the colon is omitted, then a value of "" is assumed.
   Leading whitespace at the beginning of each line and preceding
   the value (i.e., after the first, if any, colon) is ignored.
   Lines containing only whitespace, or in which the first
   non-whitespace character is a '#' are treated as comments.
   (Despite this, we do not intend attribute files to be a
   human-readable format under normal circumstances.)
  --
   Here is a sample attribute file:
  --
   # This is a comment
   
   foo: your name here!
   date:today
   
   # here is a line with no value ...
   set filec
   
   foo:bar
   # if the same tag is used more than once, then
   # we simply get multiple attribute values with
   # the same tag.
   
  -}
  
  --readAttrs  :: FilePath -> IO Attrs
  readAttrs path = parseAttrs # readFileNow path
  
  type Line  = String
  
  parseAttrs = map readAttr . filter (not . comment) . map trim . lines
      where 
  	  trim           :: Line -> Line
  	  trim            = dropWhile isSpace
  
  	  comment        :: Line -> Bool
  	  comment l       = null l || (head l == '#')
  
  	  readAttr       :: String -> Attr
  	  readAttr l      = case span (':'/=) l of
  			      (tag, (c:val)) -> (tag, trim val)
  			      prop           -> prop
  
  {-+
  certFiles returns the list of files found in an attribute set.
  -}
  certFiles attrs = [path|(name,path)<-attrs,namesFile name]
  