/* Read a configuration file (Rosetta code) in Picat. From http://rosettacode.org/wiki/Read_a_configuration_file """ The task is to read a configuration file in standard configuration file, 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 This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. main => go. % printing variables go => Vars = ["fullname","favouritefruit","needspeeling","seedsremoved","otherfamily"], Config = read_config("read_a_configuration_file_config.cfg"), foreach(Key in Vars) printf("%w = %w\n", Key, Config.get(Key,false)) end, nl. % Setting variables go2 => Config = read_config("read_a_configuration_file_config.cfg"), Vars = ["fullname","favouritefruit","needspeeling","seedsremoved","otherfamily"], [FullName,FavouriteFruit,NeedsPeeling,SeedsRemoved,OtherFamily] = [Config.get(V,false) : V in Vars], println(fullname=FullName), println(favoritefruit=FavouriteFruit), println(needspeeling=NeedsPeeling), println(seedsremoved=SeedsRemoved), println(otherfamily=OtherFamily), nl, fail, nl. read_config(File) = Config => Config = new_map(), Lines = [Line : Line in read_file_lines(File), Line != [], not membchk(Line[1],"#;")], foreach(Line in Lines) Line := strip(Line), once( append(Key,[' '|Value],Line) ; Key = Line, Value = true), if find(Value,",",_,_) then Value := [strip(Val) : Val in split(Value,",")] end, Key := strip(to_lowercase(Key)), Config.put(Key,Value) end.