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


      BOOL = 1
      NAME = 2
      ARRAY = 3
 
      optfile$ = "options.cfg"
 
      fullname$ = FNoption(optfile$, "FULLNAME", NAME)
      favouritefruit$ = FNoption(optfile$, "FAVOURITEFRUIT", NAME)
      needspeeling% = FNoption(optfile$, "NEEDSPEELING", BOOL)
      seedsremoved% = FNoption(optfile$, "SEEDSREMOVED", BOOL)
      !^otherfamily$() = FNoption(optfile$, "OTHERFAMILY", ARRAY)
 
      PRINT "fullname = " fullname$
      PRINT "favouritefruit = " favouritefruit$
      PRINT "needspeeling = "; : IF needspeeling% PRINT "true" ELSE PRINT "false"
      PRINT "seedsremoved = "; : IF seedsremoved% PRINT "true" ELSE PRINT "false"
      PRINT "otherfamily(1) = " otherfamily$(1)
      PRINT "otherfamily(2) = " otherfamily$(2)
      END
 
      DEF FNoption(file$, key$, type%)
      LOCAL file%, opt$, comma%, bool%, name$, size%, !^array$()
      file% = OPENIN(file$)
      IF file% = 0 THEN = 0
      WHILE NOT EOF#file%
        opt$ = GET$#file%
        WHILE RIGHT$(opt$) = " " opt$ = LEFT$(opt$) : ENDWHILE
        IF opt$ = key$ OR LEFT$(opt$, LEN(key$)+1) = key$ + " " THEN
          opt$ = MID$(opt$, LEN(key$) + 1)
          WHILE LEFT$(opt$,1) = " " opt$ = MID$(opt$,2) : ENDWHILE
          CASE type% OF
            WHEN BOOL: bool% = TRUE : EXIT WHILE
            WHEN NAME: name$ = opt$ : EXIT WHILE
            WHEN ARRAY:
              REPEAT
                comma% = INSTR(opt$, ",", comma%+1)
                IF comma% size% += 1
              UNTIL comma% = 0
              DIM array$(size% + 1)
              size% = 0
              REPEAT
                comma% = INSTR(opt$, ",")
                IF comma% THEN
                  size% += 1
                  array$(size%) = LEFT$(opt$, comma%-1)
                  opt$ = MID$(opt$, comma%+1)
                  WHILE LEFT$(opt$,1) = " " opt$ = MID$(opt$,2) : ENDWHILE
                ENDIF
              UNTIL comma% = 0
              array$(size% + 1) = opt$
              EXIT WHILE
          ENDCASE
        ENDIF
      ENDWHILE
      CLOSE #file%
      CASE type% OF
        WHEN BOOL: = bool%
        WHEN NAME: = name$
        WHEN ARRAY: = !^array$()
      ENDCASE
      = 0