diff --git a/.gitignore b/.gitignore index e8df1add99cc25e5137741c66e654b1115d586fc..924cf8bcb5bda25d6501eafcbe54969c60bad69b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ /drag.exe /build/ /srcF/*.mod -/parser/*.mod +/config-parser/*.mod .idea diff --git a/CMakeLists.txt b/CMakeLists.txt index 485c6b590f2c820ffbd8c12bcc42481ea7370f0d..23e174faa8ec5fad3aa38bfc85242909ba1a1334 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,7 @@ endif () set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) if(USE_CONFIG_PARSER) - add_subdirectory(parser/) + add_subdirectory(config-parser/) add_definitions(-DUSE_CONFIG_PARSER) # list(APPEND RUN_MACRO -DUSE_CONFIG_PARSER) set(USE_CXX ON) @@ -75,7 +75,6 @@ set(SOURCES_F srcF/sfx_sheba.f90 srcF/sfx_sheba_param.f90 srcF/sfx_fc_wrapper.F90 - srcF/parser_subfunctions.f90 ) set(HEADERS_F @@ -153,7 +152,7 @@ set_property(TARGET sfx PROPERTY LINKER_LANGUAGE Fortran) target_include_directories(sfx PUBLIC ${CMAKE_BINARY_DIR}/modules/) if(USE_CONFIG_PARSER) - target_link_libraries(sfx parser_F parser_CXX) + target_link_libraries(sfx config_parser_F config_parser_CXX) endif(USE_CONFIG_PARSER) # copy data & configs on post build diff --git a/parser/CMakeLists.txt b/config-parser/CMakeLists.txt similarity index 67% rename from parser/CMakeLists.txt rename to config-parser/CMakeLists.txt index c2aa35d9621979495542c170e9de3c7091720c98..f5db371ec88562084d8c670215cc86a0011a035a 100644 --- a/parser/CMakeLists.txt +++ b/config-parser/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.19) # option(INCLUDE_CXX "CXX build in mode" OFF) -project(Pars) +project(config_parser) enable_language(Fortran) enable_language(C) @@ -10,7 +10,7 @@ enable_language(CXX) set(CMAKE_CXX_STANDARD 11) set(SOURCES_CXX - call_parser.cpp + c-config-parser.cpp cfg-cmd.cpp cfg-value.cpp cfg-vec.cpp @@ -21,7 +21,7 @@ set(SOURCES_CXX lexeme-parser.cpp ) set(HEADERS_CXX - call_parser.h + c-config-parser.h cfg-cmd.h cfg-value.h cfg-vec.h @@ -36,11 +36,11 @@ set(HEADERS_CXX ) set(SOURCES_C - call_parser.c + c-config-parser.c ) set(SOURCES_F - call_parser.F90 + config-parser.f90 ) set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) @@ -48,7 +48,7 @@ set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) set(SOURCES_CXX ${SOURCES_CXX} ${SOURCES_C}) set(HEADERS_CXX ${HEADERS_CXX}) -add_library(parser_CXX STATIC ${HEADERS_CXX} ${SOURCES_CXX}) -add_library(parser_F STATIC ${SOURCES_F}) -set_property(TARGET parser_F PROPERTY LINKER_LANGUAGE Fortran) -target_link_libraries(parser_F parser_CXX) +add_library(config_parser_CXX STATIC ${HEADERS_CXX} ${SOURCES_CXX}) +add_library(config_parser_F STATIC ${SOURCES_F}) +set_property(TARGET config_parser_F PROPERTY LINKER_LANGUAGE Fortran) +target_link_libraries(config_parser_F config_parser_CXX) diff --git a/config-parser/c-config-parser.c b/config-parser/c-config-parser.c new file mode 100644 index 0000000000000000000000000000000000000000..0f2b97c392c3f00729f9ea877e53a15b68e0e13f --- /dev/null +++ b/config-parser/c-config-parser.c @@ -0,0 +1,30 @@ +#include "c-config-parser.h" +#include <stdio.h> + +void c_config_run(const char* filename, int* status) { + (*status) = config_run(filename); +} + +void c_config_is_varname(const char* name, int* status) { + (*status) = config_is_varname(name); +} + +void c_config_get_int(const char* name, int* value, int* status) { + (*status) = config_get_int(name, value); +} +void c_config_get_float(const char* name, float* value, int* status) { + (*status) = config_get_float(name, value); +} +void c_config_get_double(const char* name, double* value, int* status) { + (*status) = config_get_double(name, value); +} + +void c_config_get_string_len(const char* name, int *length) { + (*length) = config_get_string_len(name); +} + +void c_config_get_string_unsafe(const char* name, + char* value, int* status) +{ + (*status) = config_get_string_unsafe(name, value); +} diff --git a/config-parser/c-config-parser.cpp b/config-parser/c-config-parser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f580e0acf2280d32d4cb4e93913ec9a481e65eaf --- /dev/null +++ b/config-parser/c-config-parser.cpp @@ -0,0 +1,53 @@ +#include "c-config-parser.h" + +#include "config-parser.h" +#include <string> + +// *: static class +static scm::ConfigParser config; + + +#ifdef __cplusplus +extern "C" { +#endif + + int config_run(const char* filename) { + return (int)config.run(filename); + } + + int config_is_varname(const char* name) { + return (int)config.is_varname(name); + } + + int config_get_int(const char* name, int* value) { + return (int)config.get_value(name, value); + } + int config_get_float(const char* name, float* value) { + return (int)config.get_value(name, value); + } + int config_get_double(const char* name, double* value) { + return (int)config.get_value(name, value); + } + + int config_get_string_len(const char* name) + { + std::string str; + bool status = config.get_value(name, str); + + if (!status) return 0; + return (int)str.size(); + } + + int config_get_string_unsafe(const char* name, char* c_str) + { + std::string str; + bool status = config.get_value(name, str); + if (!status) return 0; + + memcpy(c_str, str.c_str(), (int)str.size() * sizeof(char)); + return 1; + } + +#ifdef __cplusplus +} +#endif diff --git a/config-parser/c-config-parser.h b/config-parser/c-config-parser.h new file mode 100644 index 0000000000000000000000000000000000000000..cd518ec967af109588ec0ca6ea81eac101db1a93 --- /dev/null +++ b/config-parser/c-config-parser.h @@ -0,0 +1,26 @@ +#pragma once + +/* class [configParser] static C++ wrapper for C interface */ + +#ifdef __cplusplus +extern "C" { +#endif + + /* main run call */ + int config_run(const char* filename); + + /* check calls */ + int config_is_varname(const char* name); + + /* get calls */ + int config_get_int(const char* name, int* value); + int config_get_float(const char* name, float* value); + int config_get_double(const char* name, double* value); + + int config_get_string_len(const char* name); + /* --- unsafe call: assumes 'c_str' is allocated to [len] elements */ + int config_get_string_unsafe(const char* name, char* c_str); + +#ifdef __cplusplus +} +#endif diff --git a/parser/cfg-cmd.cpp b/config-parser/cfg-cmd.cpp similarity index 100% rename from parser/cfg-cmd.cpp rename to config-parser/cfg-cmd.cpp diff --git a/parser/cfg-cmd.h b/config-parser/cfg-cmd.h similarity index 100% rename from parser/cfg-cmd.h rename to config-parser/cfg-cmd.h diff --git a/parser/cfg-value.cpp b/config-parser/cfg-value.cpp similarity index 100% rename from parser/cfg-value.cpp rename to config-parser/cfg-value.cpp diff --git a/parser/cfg-value.h b/config-parser/cfg-value.h similarity index 100% rename from parser/cfg-value.h rename to config-parser/cfg-value.h diff --git a/parser/cfg-vec.cpp b/config-parser/cfg-vec.cpp similarity index 100% rename from parser/cfg-vec.cpp rename to config-parser/cfg-vec.cpp diff --git a/parser/cfg-vec.h b/config-parser/cfg-vec.h similarity index 100% rename from parser/cfg-vec.h rename to config-parser/cfg-vec.h diff --git a/parser/config-parser.cpp b/config-parser/config-parser.cpp similarity index 100% rename from parser/config-parser.cpp rename to config-parser/config-parser.cpp diff --git a/config-parser/config-parser.f90 b/config-parser/config-parser.f90 new file mode 100644 index 0000000000000000000000000000000000000000..1ee8abac9b5bbba849c11aae83b302706c19d8a5 --- /dev/null +++ b/config-parser/config-parser.f90 @@ -0,0 +1,103 @@ +module config_parser + + !< @brief C->Fortran interface + interface + !< process configuration file [filename], status = [0 (ERROR), 1 (OK)] + subroutine c_config_run(filename, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: filename(*) + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_run + + !< check if variable [name] is defined, status = [0 (FALSE), 1 (TRUE)] + subroutine c_config_is_varname(name, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_is_varname + + !< get (int) [value] of variable [name], status = [0 (ERROR), 1 (OK)] + subroutine c_config_get_int(name, value, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + integer (kind=C_INT), intent(out) :: value + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_get_int + + !< get (float) [value] of variable [name], status = [0 (ERROR), 1 (OK)] + subroutine c_config_get_float(name, value, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT, C_FLOAT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + real (kind=C_FLOAT), intent(out) :: value + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_get_float + + !< get (double) [value] of variable [name], status = [0 (ERROR), 1 (OK)] + subroutine c_config_get_double(name, value, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT, C_DOUBLE + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + real (kind=C_DOUBLE), intent(out) :: value + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_get_double + + !< get (int) [len] of string variable [name] + !< [len] = 0 if variable is not defined or not a string + subroutine c_config_get_string_len(name, len) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + integer (kind=C_INT), intent(out) :: len + end subroutine c_config_get_string_len + + !< get (char*) [c_str] of string variable [name], status = [0 (ERROR), 1 (OK)] + !< *: [c_str] should be allocated up to hold at least [len] bytes + !< *: [c_str] output doesn't contain the null terminated character + subroutine c_config_get_string_unsafe(name, c_str, status) BIND(C) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + character (kind=C_CHAR), intent(out) :: c_str(*) + integer (kind=C_INT), intent(out) :: status + end subroutine c_config_get_string_unsafe + + end interface + + contains + + !< @brief additional C->Fortran wrappers + ! -------------------------------------------------------------------------------- + + !< get (char*) [c_str] of string variable [name], status = [0 (ERROR), 1 (OK)] + ! *: [c_str] allocation is performed in-place + ! *: [c_str] output doesn't contain the null terminated character + subroutine c_config_get_string(name, c_str, status) + use, intrinsic :: iso_c_binding, only: C_CHAR, C_INT + implicit none + character (kind=C_CHAR), intent(in) :: name(*) + character (kind=C_CHAR), allocatable, intent(out) :: c_str(:) + integer (kind=C_INT), intent(out) :: status + + ! local variables + ! -------------------------------------------------------------------------------- + integer :: len + ! -------------------------------------------------------------------------------- + + call c_config_get_string_len(name, len) + + if (allocated(c_str)) deallocate(c_str) + if (len > 0) allocate(c_str(len)) + + call c_config_get_string_unsafe(name, c_str, status) + end subroutine c_config_get_string + ! -------------------------------------------------------------------------------- + + !< @brief Fortran nice wrappers + ! -------------------------------------------------------------------------------- + ! -------------------------------------------------------------------------------- + +end module config_parser \ No newline at end of file diff --git a/parser/config-parser.h b/config-parser/config-parser.h similarity index 100% rename from parser/config-parser.h rename to config-parser/config-parser.h diff --git a/parser/io-guts.cpp b/config-parser/io-guts.cpp similarity index 100% rename from parser/io-guts.cpp rename to config-parser/io-guts.cpp diff --git a/parser/io-guts.h b/config-parser/io-guts.h similarity index 100% rename from parser/io-guts.h rename to config-parser/io-guts.h diff --git a/parser/lexeme-list.cpp b/config-parser/lexeme-list.cpp similarity index 100% rename from parser/lexeme-list.cpp rename to config-parser/lexeme-list.cpp diff --git a/parser/lexeme-list.h b/config-parser/lexeme-list.h similarity index 100% rename from parser/lexeme-list.h rename to config-parser/lexeme-list.h diff --git a/parser/lexeme-parser.cpp b/config-parser/lexeme-parser.cpp similarity index 100% rename from parser/lexeme-parser.cpp rename to config-parser/lexeme-parser.cpp diff --git a/parser/lexeme-parser.h b/config-parser/lexeme-parser.h similarity index 100% rename from parser/lexeme-parser.h rename to config-parser/lexeme-parser.h diff --git a/parser/lexeme.cpp b/config-parser/lexeme.cpp similarity index 100% rename from parser/lexeme.cpp rename to config-parser/lexeme.cpp diff --git a/parser/lexeme.h b/config-parser/lexeme.h similarity index 100% rename from parser/lexeme.h rename to config-parser/lexeme.h diff --git a/parser/mem-buffer.h b/config-parser/mem-buffer.h similarity index 100% rename from parser/mem-buffer.h rename to config-parser/mem-buffer.h diff --git a/parser/scm-mem.h b/config-parser/scm-mem.h similarity index 100% rename from parser/scm-mem.h rename to config-parser/scm-mem.h diff --git a/parser/scm-sys.h b/config-parser/scm-sys.h similarity index 100% rename from parser/scm-sys.h rename to config-parser/scm-sys.h diff --git a/parser/call_parser.F90 b/parser/call_parser.F90 deleted file mode 100644 index 475dcda23d62bfab3449d1e0596fbee0a1e21771..0000000000000000000000000000000000000000 --- a/parser/call_parser.F90 +++ /dev/null @@ -1,78 +0,0 @@ -module PARSER - INTERFACE - SUBROUTINE run(filename) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: filename(*) - END SUBROUTINE run - - SUBROUTINE get_int(name, value) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - INTEGER (KIND=C_INT), intent(out) :: value - END SUBROUTINE get_int - - SUBROUTINE get_float(name, value) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_FLOAT - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - REAL (KIND=C_FLOAT), intent(out) :: value - END SUBROUTINE get_float - - SUBROUTINE get_double(name, value) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_DOUBLE - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - REAL (KIND=C_DOUBLE), intent(out) :: value - END SUBROUTINE get_double - - ! TODO: - SUBROUTINE get_char_len(name, len) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - INTEGER (KIND=C_INT), intent(out) :: len - END SUBROUTINE get_char_len - - SUBROUTINE get_char_c(name, value) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - CHARACTER (KIND=C_CHAR), intent(out) :: value(*) - END SUBROUTINE get_char_c - - SUBROUTINE is_varname(name, status) BIND(C) - USE, INTRINSIC :: ISO_C_BINDING, ONLY: C_CHAR, C_INT - IMPLICIT NONE - CHARACTER (KIND=C_CHAR), intent(in) :: name(*) - INTEGER (KIND=C_INT), intent(out) :: status - END SUBROUTINE is_varname - - END INTERFACE - - contains - - SUBROUTINE get_char_lenf(name, len) - IMPLICIT NONE - CHARACTER, intent(in) :: name(*) - INTEGER, intent(out) :: len - - call get_char_len(name, len) - END SUBROUTINE get_char_lenf - - SUBROUTINE get_charf(name, char_value) - IMPLICIT NONE - CHARACTER, allocatable, intent(OUT) :: char_value(:) - CHARACTER, intent(in) :: name(*) - INTEGER :: len - - call get_char_lenf(name, len) - - IF(allocated(char_value)) deallocate(char_value) - allocate(char_value(len)) - - call get_char_c(name, char_value) - END SUBROUTINE get_charf - -end module PARSER \ No newline at end of file diff --git a/parser/call_parser.c b/parser/call_parser.c deleted file mode 100644 index f0d020ae110a2e6be13da7d081acf4429090bc06..0000000000000000000000000000000000000000 --- a/parser/call_parser.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "call_parser.h" -#include <stdio.h> - -int run(const char* filename) -{ - return runCXX(filename); -} - -int get_int(const char* name, int* value) -{ - return get_intCXX(name, value); -} - -int get_float(const char* name, float* value) -{ - return get_floatCXX(name, value); -} - -int get_double(const char* name, double* value) -{ - return get_doubleCXX(name, value); -} - -int get_char_c(const char* name, char* value) -{ - return get_charCXX(name, value); -} - -void get_char_len(const char* name, int *len) -{ - *len = get_char_lenCXX(name); -} - -void is_varname(const char* name, int* status) -{ - is_varnameCXX(name, status); -} - -// int get_bool(const char* name, bool* value) -// { -// return get_valueCXX(name, value); -// } \ No newline at end of file diff --git a/parser/call_parser.cpp b/parser/call_parser.cpp deleted file mode 100644 index 259a532627b6eb3b406a8026060f5be95c015252..0000000000000000000000000000000000000000 --- a/parser/call_parser.cpp +++ /dev/null @@ -1,82 +0,0 @@ -#include "call_parser.h" -#include "config-parser.h" -#include <string> - -static scm::ConfigParser Parser; - -#ifdef __cplusplus -extern "C" { -#endif - - int runCXX(const char* filename) - { - bool res = Parser.run(filename); - - if(res == false) return 0; - return 1; - } - - int get_intCXX(const char* name, int* value) - { - bool res = Parser.get_value(name, value); - - if(res == false) return 0; - return 1; - } - - int get_floatCXX(const char* name, float* value) - { - bool res = Parser.get_value(name, value); - - if(res == false) return 0; - return 1; - } - - int get_doubleCXX(const char* name, double* value) - { - bool res = Parser.get_value(name, value); - - if(res == false) return 0; - return 1; - } - - int get_char_lenCXX(const char* name) - { - std::string target_res; - bool res = Parser.get_value(name, target_res); - - return target_res.size(); - } - - int get_charCXX(const char* name, char* value) - { - std::string target_res; - bool res = Parser.get_value(name, target_res); - - const int n = target_res.size(); - - for (int i = 0; i < n; i++) - value[i] = target_res[i]; - - if(res == false) return 0; - return 1; - } - - void is_varnameCXX(const char* name, int* status) - { - bool flag = Parser.is_varname(name); - (*status) = (int)flag; - } - - // bool get_valueCXX(const char* name, std::string& value) - // { - // return Parser.get_value(name, value); - // } - - // bool get_valueCXX(const char* name, bool* value) - // { - // return Parser.get_value(name, value); - // } -#ifdef __cplusplus -} -#endif \ No newline at end of file diff --git a/parser/call_parser.h b/parser/call_parser.h deleted file mode 100644 index cfc5a64b608937ae86dd7a8b7cb39ff29ae753e4..0000000000000000000000000000000000000000 --- a/parser/call_parser.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#ifdef __cplusplus -extern "C" { -#endif - - int runCXX(const char* filename); - int get_intCXX(const char* name, int* value); - int get_floatCXX(const char* name, float* value); - int get_doubleCXX(const char* name, double* value); - // bool get_valueCXX(const char* name, long double* value); - - int get_char_lenCXX(const char* name); - int get_charCXX(const char* name, char* value); - - void is_varnameCXX(const char* name, int* status); - - // bool get_valueCXX(const char* name, bool* value); - -#ifdef __cplusplus -} -#endif diff --git a/srcF/parser_subfunctions.f90 b/srcF/parser_subfunctions.f90 deleted file mode 100644 index 3bd2bb3f1db0f4d9f9edb41924a4935c6daf2a87..0000000000000000000000000000000000000000 --- a/srcF/parser_subfunctions.f90 +++ /dev/null @@ -1,55 +0,0 @@ -#ifdef USE_CONFIG_PARSER -module PARSER_SUB_F - contains - - FUNCTION compare_char_arrays(arr1, arr2) RESULT(isEqual) - IMPLICIT NONE - INTEGER :: size1, size2 - CHARACTER, intent(in) :: arr1(:) - CHARACTER(len=*), intent(in) :: arr2 - LOGICAL:: isEqual - INTEGER :: N, i - size1 = size(arr1) - size2 = len(arr2) - - isEqual = .TRUE. - - IF (size1.NE.size2) THEN - isEqual = .FALSE. - RETURN - END IF - - N = size1 - - DO i = 1, N - IF (arr1(i) .NE. arr2(i:i)) THEN - isEqual = .FALSE. - RETURN - END IF - END DO - END FUNCTION compare_char_arrays - - FUNCTION get_sfx_type(config_var_name) RESULT(type) - USE PARSER - USE sfx_surface - IMPLICIT NONE - CHARACTER, intent(in) :: config_var_name(*) - CHARACTER, allocatable :: sfx_type(:) - INTEGER :: type - - call get_charf(config_var_name, sfx_type) - - if ( compare_char_arrays(sfx_type, "ocean") ) then - type = surface_ocean - else if ( compare_char_arrays(sfx_type, "lake") ) then - type = surface_lake - else if ( compare_char_arrays(sfx_type, "land") ) then - type = surface_land - end if - - deallocate(sfx_type) - END FUNCTION get_sfx_type - -end module PARSER_SUB_F -#endif - diff --git a/srcF/sfx_main.f90 b/srcF/sfx_main.f90 index dcabad5f2ab4f35008ea870ca7b0f08ce1bdd13b..c96cc2890879301a40c0ea162e94389b33a10dac 100644 --- a/srcF/sfx_main.f90 +++ b/srcF/sfx_main.f90 @@ -150,9 +150,7 @@ program sfx_main ! modules used ! -------------------------------------------------------------------------------- #ifdef USE_CONFIG_PARSER - use parser_sub_f - use parser - use sfx_surface + use config_parser use iso_c_binding, only: C_NULL_CHAR #endif @@ -323,11 +321,16 @@ program sfx_main call get_command_argument(i + 1, arg) #ifdef USE_CONFIG_PARSER - call run(trim(arg)//C_NULL_CHAR) + call c_config_run(trim(arg)//C_NULL_CHAR, status) + if (status == 0) then + write(*, *) ' FAILURE! > unable to parse configuration file: ', trim(arg) + stop + end if - call is_varname("model.id"//C_NULL_CHAR, status) + call c_config_is_varname("model.id"//C_NULL_CHAR, status) if (status /= 0) then - call get_charf("model.id"//C_NULL_CHAR, config_field) + call c_config_get_string("model.id"//C_NULL_CHAR, config_field, status) + ! *: check status model = get_model_id(char_array2str(config_field)) if (model == -1) then write(*, *) ' FAILURE! > unknown model [key]: ', trim(char_array2str(config_field)) @@ -335,9 +338,10 @@ program sfx_main end if end if - call is_varname("dataset.id"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.id"//C_NULL_CHAR, status) if (status /= 0) then - call get_charf("dataset.id"//C_NULL_CHAR, config_field) + call c_config_get_string("dataset.id"//C_NULL_CHAR, config_field, status) + ! *: check status id = get_dataset_id(char_array2str(config_field)) if (id == -1) then write(*, *) ' FAILURE! > unknown dataset [key]: ', trim(char_array2str(config_field)) @@ -348,40 +352,42 @@ program sfx_main call set_dataset(dataset, id) dataset%nmax = nmax - call is_varname("dataset.filename"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.filename"//C_NULL_CHAR, status) if ((status /= 0).or.(dataset%id == dataset_user)) then !< mandatory in user dataset - call get_charf("dataset.filename"//C_NULL_CHAR, config_field) + call c_config_get_string("dataset.filename"//C_NULL_CHAR, config_field, status) + ! *: check status dataset%filename = char_array2str(config_field) end if - call is_varname("dataset.h"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.h"//C_NULL_CHAR, status) if ((status /= 0).or.(dataset%id == dataset_user)) then !< mandatory in user dataset - call get_float("dataset.h"//C_NULL_CHAR, dataset%h) + call c_config_get_float("dataset.h"//C_NULL_CHAR, dataset%h, status) end if - call is_varname("dataset.z0_m"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.z0_m"//C_NULL_CHAR, status) if ((status /= 0).or.(dataset%id == dataset_user)) then !< mandatory in user dataset - call get_float("dataset.z0_m"//C_NULL_CHAR, dataset%z0_m) + call c_config_get_float("dataset.z0_m"//C_NULL_CHAR, dataset%z0_m, status) end if - call is_varname("dataset.z0_h"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.z0_h"//C_NULL_CHAR, status) if ((status /= 0).or.(dataset%id == dataset_user)) then !< mandatory in user dataset - call get_float("dataset.z0_h"//C_NULL_CHAR, dataset%z0_h) + call c_config_get_float("dataset.z0_h"//C_NULL_CHAR, dataset%z0_h, status) end if end if - call is_varname("dataset.nmax"//C_NULL_CHAR, status) + call c_config_is_varname("dataset.nmax"//C_NULL_CHAR, status) if (status /= 0) then - call get_int("dataset.nmax"//C_NULL_CHAR, dataset%nmax) + call c_config_get_int("dataset.nmax"//C_NULL_CHAR, dataset%nmax, status) end if - call is_varname("output.filename"//C_NULL_CHAR, status) + call c_config_is_varname("output.filename"//C_NULL_CHAR, status) if (status /= 0) then - call get_charf("output.filename"//C_NULL_CHAR, config_field) + call c_config_get_string("output.filename"//C_NULL_CHAR, config_field, status) + ! *: check status filename_out = char_array2str(config_field) is_output_set = 1