The task is to read a configuration file in standard configuration file format,
and set variables accordingly.

For this task, we have a configuration file as follows:

# This is a configuration file in standard configuration file format
#
# Lines beginning with a hash or a semicolon are ignored by the application
# program. Blank lines are also ignored by the application program.

# This is the fullname parameter
FULLNAME Foo Barber

# This is a favourite fruit
FAVOURITEFRUIT banana

# This is a boolean that should be set
NEEDSPEELING

# This boolean is commented out
; SEEDSREMOVED

# Configuration option names are not case sensitive, but configuration parameter
# data is case sensitive and may be preserved by the application program.

# An optional equals sign can be used to separate configuration parameter data
# from the option name. This is dropped by the parser. 

# A configuration option may take multiple parameters separated by commas.
# Leading and trailing whitespace around parameter names and parameter data fields
# are ignored by the application program.

OTHERFAMILY Rhu Barber, Harry Barber



For the task we need to set four variables according to the configuration entries as follows:

fullname = Foo Barber
favouritefruit = banana
needspeeling = true
seedsremoved = false


We also have an option that contains multiple parameters. These may be stored in an array.

 otherfamily(1) = Rhu Barber
 otherfamily(2) = Harry Barber


Related tasks
 Update a configuration file


 
class Main
{
  // remove the given key and an optional '=' from start of line
  Str removeKey (Str key, Str line)
  {
    remainder := line[key.size..-1].trim
    if (remainder.startsWith("="))
    {
      remainder = remainder.replace("=", "").trim
    }
    return remainder
  }
 
  Void main ()
  {
    // define the variables which need configuring
    fullname := ""
    favouritefruit := "" 
    needspeeling := false 
    seedsremoved := false
    Str[] otherfamily := [,]
 
    // loop through the file, setting variables as needed
    File(`config.dat`).eachLine |Str line|
    {
      line = line.trim
      if (line.isEmpty || line.startsWith("#") || line.startsWith(";")) 
      { 
        // do nothing for empty and comment lines
      }
      else if (line.upper.startsWith("FULLNAME"))
      {
        fullname = removeKey("FULLNAME", line)
      }
      else if (line.upper.startsWith("FAVOURITEFRUIT"))
      {
        favouritefruit = removeKey("FAVOURITEFRUIT", line)
      }
      else if (line.upper.startsWith("NEEDSPEELING"))
      {
        needspeeling = true
      }
      else if (line.upper.startsWith("SEEDSREMOVED"))
      {
        seedsremoved = true
      }
      else if (line.upper.startsWith("OTHERFAMILY"))
      {
        otherfamily = removeKey("OTHERFAMILY", line).split(',')
      }
    }
 
    // report results
    echo ("Full name is $fullname")
    echo ("Favourite fruit is $favouritefruit")
    echo ("Needs peeling is $needspeeling")
    echo ("Seeds removed is $seedsremoved")
    echo ("Other family is " + otherfamily.join(", "))
  }
}
 