/******************************************************************************* * This file is part of SWIFT. * Copyright (C) 2016 James Willis (james.s.willis@durham.ac.uk). * 2018 Peter W. Draper (p.w.draper@durham.ac.uk) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * ******************************************************************************/ #include "parser.h" #include #include #include #include int main(int argc, char *argv[]) { const char *input_file = argv[1]; /* Create a structure to read file into. */ struct swift_params param_file; /* Read the parameter file. */ parser_read_file(input_file, ¶m_file); /* Print the contents of the structure to stdout. */ printf("\n--- Values read from file:\n"); parser_print_params(¶m_file); /* Check if some parameters that do exist, do, and some that don't, don't. */ const int should_exist = parser_does_param_exist(¶m_file, "Scheduler:no_of_threads"); const int shouldnt_exist = parser_does_param_exist(¶m_file, "FakeSection:fake_parameter"); if (!should_exist || shouldnt_exist) { return 1; } /* Retrieve parameters and store them in variables defined above. * Have to specify the name of the parameter as it appears in the * input file: testParserInput.yaml.*/ const int no_of_threads = parser_get_param_int(¶m_file, "Scheduler:no_of_threads"); const int no_of_time_steps = parser_get_param_int(¶m_file, "Simulation:no_of_time_steps"); const float max_h = parser_get_param_float(¶m_file, "Simulation:max_h"); const double start_time = parser_get_param_double(¶m_file, "Simulation:start_time"); const int kernel = parser_get_param_int(¶m_file, "kernel"); const int optional1 = parser_get_opt_param_int(¶m_file, "Simulation:optional", 1); /* Check if we can read it again */ const int optional2 = parser_get_opt_param_int(¶m_file, "Simulation:optional", 1); /* Optional things not mentioned in parameter file. Should be in output * files.*/ parser_get_opt_param_int(¶m_file, "Virtual:param1", 1); parser_get_opt_param_int(¶m_file, "Virtual:param2", 2); parser_get_opt_param_int(¶m_file, "Virtual:param3", 3); parser_get_opt_param_int(¶m_file, "Virtual:param4", 4); /* Check if we can read it again */ parser_get_opt_param_int(¶m_file, "Virtual:param1", 1); char ic_file[PARSER_MAX_LINE_SIZE]; parser_get_param_string(¶m_file, "IO:ic_file", ic_file); char csides[3]; parser_get_param_char_array(¶m_file, "Box:csides", 3, csides); int isides[3]; parser_get_param_int_array(¶m_file, "Box:isides", 3, isides); float fsides[3]; parser_get_param_float_array(¶m_file, "Box:fsides", 3, fsides); double dsides[3]; parser_get_param_double_array(¶m_file, "Box:dsides", 3, dsides); int optsides[5] = {1, 2, 3, 4, 5}; int haveopt1 = parser_get_opt_param_int_array(¶m_file, "Box:moresides", 5, optsides); /* Check if we can read it again */ int haveopt2 = parser_get_opt_param_int_array(¶m_file, "Box:moresides", 5, optsides); char **var_result; int nvar_result; parser_get_param_string_array(¶m_file, "Words:list", &nvar_result, &var_result); printf("\nList from Words:list parameter\n"); for (int i = 0; i < nvar_result; i++) printf(" %d: %s\n", i, var_result[i]); /* Get same list without []. */ char **var_result2; int nvar_result2; parser_get_param_string_array(¶m_file, "Words:nonstdlist", &nvar_result2, &var_result2); assert(nvar_result == nvar_result2); for (int i = 0; i < nvar_result; i++) assert(strcmp(var_result[i], var_result2[i]) == 0); parser_free_param_string_array(nvar_result, var_result); parser_free_param_string_array(nvar_result2, var_result2); const char *optwords[4] = {"Word1", "Word2", "Word3", "Word4"}; int noptwords = 4; int haveoptwords1 = parser_get_opt_param_string_array( ¶m_file, "Simulation:optwords", &nvar_result, &var_result, noptwords, optwords); parser_free_param_string_array(nvar_result, var_result); /* Check if we can read it again */ int haveoptwords2 = parser_get_opt_param_string_array( ¶m_file, "Simulation:optwords", &nvar_result, &var_result, noptwords, optwords); printf("\nList from Simulation:optwords parameter (%d of %d)\n", nvar_result, noptwords); assert(noptwords == nvar_result); for (int i = 0; i < nvar_result; i++) { assert(strcmp(optwords[i], var_result[i]) == 0); printf(" %d: %s\n", i, var_result[i]); } parser_free_param_string_array(nvar_result, var_result); /* Long list of values. */ parser_get_param_string_array(¶m_file, "Words:long", &nvar_result, &var_result); printf("No of letters in alphabet = %d\n", nvar_result); assert(nvar_result == 26); char alphabet[27]; for (int i = 0; i < nvar_result; i++) { alphabet[i] = var_result[i][0]; } alphabet[26] = '\0'; printf("The alphabet: %s\n", alphabet); assert(strcmp("abcdefghijklmnopqrstuvwxyz", alphabet) == 0); parser_free_param_string_array(nvar_result, var_result); /* Unfinished list of values. Should read last improperly quoted string. * Note length should be CHUNK + 1. */ parser_get_param_string_array(¶m_file, "Words:unfinished", &nvar_result, &var_result); assert(nvar_result == 11); printf("\nList from Words:unfinished parameter (%d)\n", nvar_result); for (int i = 0; i < nvar_result; i++) { printf(" %d: %s\n", i, var_result[i]); } assert(strcmp("abcdefg", var_result[nvar_result - 1]) == 0); parser_free_param_string_array(nvar_result, var_result); /* Print the contents of the structure to stdout now used. */ printf("\n--- Values after being used:\n"); parser_print_params(¶m_file); /* Print the variables to check their values are correct. */ printf( "\nValues read from file:\n" "no_of_threads: %d, no_of_time_steps: %d, max_h: %f, start_time: %lf," " ic_file: %s, kernel: %d optional: %d\n", no_of_threads, no_of_time_steps, max_h, start_time, ic_file, kernel, optional1); printf("Box: [%d, %d, %d]\n", isides[0], isides[1], isides[2]); /* Print the contents of the structure to a file in YAML format. */ parser_write_params_to_file(¶m_file, "used_parser_output.yml", 1); parser_write_params_to_file(¶m_file, "unused_parser_output.yml", 0); assert(no_of_threads == 16); assert(no_of_time_steps == 10); assert(fabs(max_h - 1.1255) < 0.00001); assert(fabs(start_time - 1.23456789) < 0.00001); assert(strcmp(ic_file, "ic_file.ini") == 0); /*strcmp returns 0 if correct.*/ assert(kernel == 4); assert(optional1 == 1); assert(optional2 == 1); assert(csides[0] == 'a'); assert(csides[1] == 'b'); assert(csides[2] == 'c'); assert(isides[0] == 2); assert(isides[1] == 3); assert(isides[2] == 4); assert(fsides[0] == 2.0); assert(fsides[1] == 3.0); assert(fsides[2] == 4.0); assert(dsides[0] == 2.0); assert(dsides[1] == 3.0); assert(dsides[2] == 4.0); assert(haveopt1 == 0); assert(haveopt2 == 1); assert(optsides[0] == 1); assert(optsides[1] == 2); assert(optsides[2] == 3); assert(optsides[3] == 4); assert(optsides[4] == 5); assert(haveoptwords1 == 0); assert(haveoptwords2 == 1); /* Issue 681, parser_get_opt_param_string returns same value. */ char run_name_1[80]; char run_name_2[80]; parser_get_opt_param_string(¶m_file, "MetaData:run_name", run_name_1, "Untitled SWIFT simulation"); parser_get_opt_param_string(¶m_file, "MetaData:run_name", run_name_2, "Untitled SWIFT simulation"); assert(strcmp(run_name_1, run_name_2) == 0); /* Read a very big number */ long long bignum = parser_get_param_longlong(¶m_file, "LongLong:bignum"); assert(bignum == 1152921504606846975LL); return 0; }