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


$ include "seed7_05.s7i";
  include "scanfile.s7i";
 
var string:  fullname is "";
var string:  favouritefruit is "";
var boolean: needspeeling is FALSE;
var boolean: seedsremoved is FALSE;
var array string: otherfamily is 0 times "";
 
const proc: main is func
  local
    var file: configFile is STD_NULL;
    var string: symbol is "";
    var integer: index is 0;
  begin
    configFile := open("readcfg.txt", "r");
    configFile.bufferChar := getc(configFile);
    symbol := lower(getWord(configFile));
    while symbol <> "" do
      skipSpace(configFile);
      if symbol = "#" or symbol = ";" then
        skipLine(configFile);
      elsif symbol = "fullname" then
        fullname := getLine(configFile);
      elsif symbol = "favouritefruit" then
        favouritefruit := getLine(configFile);
      elsif symbol = "needspeeling" then
        needspeeling := TRUE;
      elsif symbol = "seedsremoved" then
        seedsremoved := TRUE;
      elsif symbol = "otherfamily" then
        otherfamily := split(getLine(configFile), ",");
        for key index range otherfamily do
          otherfamily[index] := trim(otherfamily[index]);
        end for;
      else
        writeln(" *** Illegal line " <& literal(getLine(configFile)));
      end if;
      symbol := lower(getWord(configFile));
    end while;
    close(configFile);
    writeln("fullname:       " <& fullname);
    writeln("favouritefruit: " <& favouritefruit);
    writeln("needspeeling:   " <& needspeeling);
    writeln("seedsremoved:   " <& seedsremoved);
    for key index range otherfamily do
      writeln(("otherfamily[" <& index <& "]:") rpad 16 <& otherfamily[index]);
    end for;
  end func;