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


def optionValue
    2 get "," find
    if
        " " "-" subst "," " " subst split
        len for
            var i
            i get "-" " " subst
            rot 1 get "(" chain print i print ") = " print swap trim print nl swap 
        endfor
        drop drop
    else
        swap 1 get print " = " print swap print nl
    endif
enddef
 
0 tolist
 
"rosetta_read.cfg" "r" fopen var file
 
file 0 > if
    true
    while
        file fgets
        dup -1 != if
            trim
            len 0 > if
                1 get '#' != if
                    " " find var pos
                    pos if
                        1 pos 1 - slice
                        swap len pos - pos 1 + swap slice
                        nip 2 tolist 
                    else
                        "" 2 tolist
                    endif
                    0 put
                else
                    drop
                endif
            else
                drop
            endif
            true
        else
            drop
            file fclose
            false
        endif
    endwhile
 
    len for
        get
        1 get ";" == if 2 get print " = false" print nl
        else 2 get "" == if 1 get print " = true" print nl
            else optionValue
            endif
        endif
        drop
    endfor
endif