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


\ declare the configuration variables in the FORTH app
FORTH DEFINITIONS
 
32 CONSTANT $SIZE
 
VARIABLE FULLNAME       $SIZE ALLOT
VARIABLE FAVOURITEFRUIT $SIZE ALLOT
VARIABLE NEEDSPEELING
VARIABLE SEEDSREMOVED
VARIABLE OTHERFAMILY(1) $SIZE ALLOT
VARIABLE OTHERFAMILY(2) $SIZE ALLOT
 
: -leading  ( addr len -- addr' len' )
            begin over c@ bl = while 1 /string repeat ;   \ remove leading blanks
 
: trim      ( addr len -- addr len) -leading -trailing ;  \ remove blanks both ends
 
\ create the config file interpreter -------
VOCABULARY CONFIG                                          \ create a namespace
CONFIG DEFINITIONS                                         \ put things in the namespace
: SET     ( addr --) true swap ! ;
: RESET   ( addr --) false swap ! ;
: #        ( -- )      1 PARSE 2DROP ;                     \ parse line and throw away
: =        ( addr --)  1 PARSE trim ROT PLACE ;            \ string assignment operator
synonym ;  #                                               \ 2nd comment operator is simple
 
FORTH DEFINITIONS
\ this command reads and interprets the config.txt file
: CONFIGURE ( -- ) CONFIG  s" CONFIG.TXT" INCLUDED  FORTH ;
\ config file interpreter ends ------
 
\ tools to validate the CONFIG interpreter
: $.      ( str --)  count type ;
: BOOL.   ( ? --)    @ IF ." ON"  ELSE ." OFF" THEN ;
 
: .CONFIG       CR  ." Fullname       : " FULLNAME $.
                CR  ." Favourite fruit: " FAVOURITEFRUIT $.
                CR  ." Needs peeling  : " NEEDSPEELING bool.
                CR  ." Seeds removed  : " SEEDSREMOVED bool.
                CR  ." Family:"
                CR   otherfamily(1) $.
                CR   otherfamily(2) $.  ;