# 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" !***************************************************************************************** !> author: Jacob Williams ! license: BSD ! ! Higher-level [[json_file]] interface for the [[json_value]] type. ! !### License ! * JSON-Fortran is released under a BSD-style license. ! See the [LICENSE](https://github.com/jacobwilliams/json-fortran/blob/master/LICENSE) ! file for details. module json_file_module use,intrinsic :: iso_fortran_env use json_kinds use json_parameters, only: unit2str use json_string_utilities use json_value_module implicit none private # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_macros.inc" 1 ! JSON-Fortran preprocessor macros. ! ! License ! JSON-Fortran is released under a BSD-style license. ! See the [LICENSE](https://github.com/jacobwilliams/json-fortran/blob/master/LICENSE) ! file for details. !********************************************************* ! File encoding preprocessor macro. ! # 15 ! don't ask for utf-8 file encoding unless using UCS4 ! this may let us use unformatted stream io to read in files more quickly ! even with unicode support turned on `inquire( ... encoding=FL_ENCODING)` ! may be able to detect json files in which each character is exactly one ! byte !********************************************************* !********************************************************* ! This C preprocessor macro will take a procedure name as an ! input, and output either that same procedure name if the ! code is compiled without USE_UCS4 being defined or it will ! expand the procedure name to the original procedure name, ! followed by a comma and then the original procedure name ! with 'wrap_' prepended to it. This is suitable for creating ! overloaded interfaces that will accept UCS4 character actual ! arguments as well as DEFAULT/ASCII character arguments, ! based on whether or not ISO 10646 is supported and requested. ! # 55 !********************************************************* # 25 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 !********************************************************* !> author: Jacob Williams ! date: 12/9/2013 ! ! The `json_file` is the main public class that is ! used to open a file and get data from it. ! ! A `json_file` contains only two items: an instance of a [[json_core(type)]], ! which is used for all data manipulation, and a [[json_value]] pointer, ! which is used to construct the linked-list data structure. ! Note that most methods in the `json_file` class are simply wrappers ! to the lower-level routines in the [[json_value_module]]. ! !### Example ! !```fortran ! program test ! use json_module ! implicit none ! type(json_file) :: json ! integer :: ival ! real(real64) :: rval ! character(len=:),allocatable :: cval ! logical :: found ! call json%initialize(compact_reals=.true.) ! call json%load(filename='myfile.json') ! call json%print() !print to the console ! call json%get('var.i',ival,found) ! call json%get('var.r(3)',rval,found) ! call json%get('var.c',cval,found) ! call json%destroy() ! end program test !``` ! !@note The `destroy()` method may be called to free the memory if necessary. ! [[json_file(type)]] includes a finalizer that also calls ! `destroy()` when the variable goes out of scope. type,public :: json_file private type(json_core) :: core !! The instance of the [[json_core(type)]] !! factory used for this file. type(json_value),pointer :: p => null() !! the JSON structure read from the file contains generic,public :: initialize => initialize_json_core_in_file,& set_json_core_in_file procedure,public :: get_core => get_json_core_in_file !> ! Load JSON from a file. procedure,public :: load => json_file_load !> ! The same as `load`, but only here for backward compatibility procedure,public :: load_file => json_file_load !> ! Load JSON from a string. generic,public :: deserialize => json_file_load_from_string !> ! The same as `deserialize`, but only here for backward compatibility generic,public :: load_from_string => json_file_load_from_string !> ! Print the [[json_value]] structure to an allocatable string procedure,public :: serialize => json_file_print_to_string !> ! The same as `serialize`, but only here for backward compatibility procedure,public :: print_to_string => json_file_print_to_string procedure,public :: destroy => json_file_destroy procedure,public :: nullify => json_file_nullify procedure,public :: move => json_file_move_pointer generic,public :: info => json_file_variable_info generic,public :: matrix_info => json_file_variable_matrix_info !error checking: procedure,public :: failed => json_file_failed procedure,public :: print_error_message => json_file_print_error_message procedure,public :: check_for_errors => json_file_check_for_errors procedure,public :: clear_exceptions => json_file_clear_exceptions generic,public :: print => json_file_print_to_console, & json_file_print_to_unit, & json_file_print_to_filename !> ! The same as `print`, but only here for backward compatibility generic,public :: print_file => json_file_print_to_console, & json_file_print_to_unit, & json_file_print_to_filename !> ! Rename a variable, specifying it by path generic,public :: rename => json_file_rename # 131 !> ! Verify that a path is valid ! (i.e., a variable with this path exists in the file). generic,public :: valid_path => json_file_valid_path !> ! Get a variable from a [[json_file(type)]], by specifying the path. generic,public :: get => json_file_get_object, & json_file_get_integer, & json_file_get_real32, & json_file_get_real, & # 148 json_file_get_logical, & json_file_get_string, & json_file_get_integer_vec, & json_file_get_real32_vec, & json_file_get_real_vec, & # 158 json_file_get_logical_vec, & json_file_get_string_vec, & json_file_get_alloc_string_vec, & json_file_get_root !> ! Add a variable to a [[json_file(type)]], by specifying the path. ! !### Example ! !```fortran ! program test ! use json_module, rk=>json_rk, ik=>json_ik ! implicit none ! type(json_file) :: f ! call f%initialize() ! specify whatever init options you want. ! call f%add('inputs.t', 0.0_rk) ! call f%add('inputs.x', [1.0_rk,2.0_rk,3.0_rk]) ! call f%add('inputs.flag', .true.) ! call f%print() ! print to the console ! end program test !``` generic,public :: add => json_file_add, & json_file_add_object, & json_file_add_integer, & json_file_add_real32, & json_file_add_real, & # 190 json_file_add_logical, & json_file_add_string, & json_file_add_integer_vec, & json_file_add_real32_vec, & json_file_add_real_vec, & # 200 json_file_add_logical_vec, & json_file_add_string_vec # 208 !> ! Update a scalar variable in a [[json_file(type)]], ! by specifying the path. ! !@note These have been mostly supplanted by the `add` ! methods, which do a similar thing (and can be used for ! scalars and vectors, etc.) generic,public :: update => json_file_update_integer, & json_file_update_logical, & json_file_update_real32, & json_file_update_real, & # 225 json_file_update_string # 230 !> ! Remove a variable from a [[json_file(type)]] ! by specifying the path. generic,public :: remove => json_file_remove !traverse procedure,public :: traverse => json_file_traverse ! *************************************************** ! operators ! *************************************************** generic,public :: operator(.in.) => json_file_valid_path_op procedure,pass(me) :: json_file_valid_path_op generic,public :: assignment(=) => assign_json_file,& assign_json_file_to_string,& assign_string_to_json_file procedure :: assign_json_file procedure,pass(me) :: assign_json_file_to_string procedure :: assign_string_to_json_file ! *************************************************** ! private routines ! *************************************************** !load from string: procedure :: json_file_load_from_string !initialize procedure :: initialize_json_core_in_file procedure :: set_json_core_in_file !get info: procedure :: json_file_variable_info procedure :: json_file_variable_matrix_info !rename: procedure :: json_file_rename # 274 !validate path: procedure :: json_file_valid_path !get: procedure :: json_file_get_object procedure :: json_file_get_integer procedure :: json_file_get_real32 procedure :: json_file_get_real # 288 procedure :: json_file_get_logical procedure :: json_file_get_string procedure :: json_file_get_integer_vec procedure :: json_file_get_real32_vec procedure :: json_file_get_real_vec # 298 procedure :: json_file_get_logical_vec procedure :: json_file_get_string_vec procedure :: json_file_get_alloc_string_vec procedure :: json_file_get_root !add: procedure :: json_file_add procedure :: json_file_add_object procedure :: json_file_add_integer procedure :: json_file_add_real32 procedure :: json_file_add_real # 314 procedure :: json_file_add_logical procedure :: json_file_add_string procedure :: json_file_add_integer_vec procedure :: json_file_add_real32_vec procedure :: json_file_add_real_vec # 324 procedure :: json_file_add_logical_vec procedure :: json_file_add_string_vec # 332 !update: procedure :: json_file_update_integer procedure :: json_file_update_logical procedure :: json_file_update_real32 procedure :: json_file_update_real # 343 procedure :: json_file_update_string # 348 !remove: procedure :: json_file_remove !print: procedure :: json_file_print_to_console procedure :: json_file_print_to_unit procedure :: json_file_print_to_filename final :: finalize_json_file end type json_file !********************************************************* !********************************************************* !> author: Izaak Beekman ! date: 07/23/2015 ! ! Structure constructor to initialize a [[json_file(type)]] ! object with an existing [[json_value]] object or a JSON ! string, and either the [[json_core(type)]] settings or a ! [[json_core(type)]] instance. ! !### Example ! !```fortran ! ... ! type(json_file) :: my_file ! type(json_value),pointer :: json_object ! type(json_core) :: json_core_object ! ... ! ! Construct a json_object: ! !could do this: ! my_file = json_file(json_object) ! !or: ! my_file = json_file(json_object,verbose=.true.) ! !or: ! my_file = json_file('{"x": [1]}',verbose=.true.) ! !or: ! my_file = json_file(json_object,json_core_object) ! !or: ! my_file = json_file('{"x": [1]}',json_core_object) !``` interface json_file module procedure initialize_json_file, & initialize_json_file_v2, & initialize_json_file_from_string, & initialize_json_file_from_string_v2 end interface !************************************************************************************* contains !***************************************************************************************** !***************************************************************************************** !> ! Finalizer for [[json_file]] class. ! ! Just a wrapper for [[json_file_destroy]]. subroutine finalize_json_file(me) implicit none type(json_file),intent(inout) :: me call me%destroy(destroy_core=.true.) end subroutine finalize_json_file !***************************************************************************************** !***************************************************************************************** !> ! Check error status in the file. pure function json_file_failed(me) result(failed) implicit none class(json_file),intent(in) :: me logical(LK) :: failed !! will be true if there has been an error. failed = me%core%failed() end function json_file_failed !***************************************************************************************** !***************************************************************************************** !> ! Retrieve error status and message from the class. subroutine json_file_check_for_errors(me,status_ok,error_msg) implicit none class(json_file),intent(inout) :: me logical(LK),intent(out),optional :: status_ok !! true if there were no errors character(kind=CK,len=:),allocatable,intent(out),optional :: error_msg !! the error message !! (if there were errors) # 453 call me%core%check_for_errors(status_ok,error_msg) end subroutine json_file_check_for_errors !***************************************************************************************** !***************************************************************************************** !> ! Clear exceptions in the class. pure subroutine json_file_clear_exceptions(me) implicit none class(json_file),intent(inout) :: me call me%core%clear_exceptions() end subroutine json_file_clear_exceptions !***************************************************************************************** !***************************************************************************************** !> ! This is a wrapper for [[json_print_error_message]]. subroutine json_file_print_error_message(me,io_unit) implicit none class(json_file),intent(inout) :: me integer, intent(in), optional :: io_unit call me%core%print_error_message(io_unit) end subroutine json_file_print_error_message !***************************************************************************************** !***************************************************************************************** !> ! Initialize the [[json_core(type)]] for this [[json_file]]. ! This is just a wrapper for [[json_initialize]]. ! !@note This does not destroy the data in the file. ! !@note [[initialize_json_core]], [[json_initialize]], ! [[initialize_json_core_in_file]], [[initialize_json_file]], ! [[initialize_json_file_v2]], [[initialize_json_file_from_string]], ! and [[initialize_json_file_from_string_v2]] ! all have a similar interface. subroutine initialize_json_core_in_file(me,& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 506 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) implicit none class(json_file),intent(inout) :: me # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc logical(LK),intent(in),optional :: verbose !! mainly useful for debugging (default is false) logical(LK),intent(in),optional :: compact_reals !! to compact the real number strings for output (default is true) logical(LK),intent(in),optional :: print_signs !! always print numeric sign (default is false) character(kind=CDK,len=*),intent(in),optional :: real_format !! Real number format: 'E' [default], '*', 'G', 'EN', or 'ES' integer(IK),intent(in),optional :: spaces_per_tab !! number of spaces per tab for indenting (default is 2) logical(LK),intent(in),optional :: strict_type_checking !! if true, no integer, double, or logical type !! conversions are done for the `get` routines !! (default is false). logical(LK),intent(in),optional :: trailing_spaces_significant !! for name and path comparisons, is trailing !! space to be considered significant. !! (default is false) logical(LK),intent(in),optional :: case_sensitive_keys !! for name and path comparisons, are they !! case sensitive. (default is true) logical(LK),intent(in),optional :: no_whitespace !! if true, printing the JSON structure is !! done without adding any non-significant !! spaces or linebreaks (default is false) logical(LK),intent(in),optional :: unescape_strings !! If false, then the raw escaped !! string is returned from [[json_get_string]] !! and similar routines. If true [default], !! then the string is returned unescaped. character(kind=CK,len=*),intent(in),optional :: comment_char !! If present, these characters are used !! to denote comments in the JSON file, !! which will be ignored if present. !! Example: `!`, `#`, or `/!#`. Setting this !! to a blank string disables the !! ignoring of comments. (Default is `/!#`). integer(IK),intent(in),optional :: path_mode !! How the path strings are interpreted in the !! `get_by_path` routines: !! !! * 1 : Default mode (see [[json_get_by_path_default]]) !! * 2 : as RFC 6901 "JSON Pointer" paths !! (see [[json_get_by_path_rfc6901]]) !! * 3 : JSONPath "bracket-notation" !! see [[json_get_by_path_jsonpath_bracket]]) character(kind=CK,len=1),intent(in),optional :: path_separator !! The `path` separator to use !! in the "default" mode for !! the paths in the various !! `get_by_path` routines. !! Example: `.` [default] or `%`. !! Note: if `path_mode/=1` !! then this is ignored. logical(LK),intent(in),optional :: compress_vectors !! If true, then arrays of integers, !! nulls, doubles, and logicals are !! printed all on one line. !! [Note: `no_whitespace` will !! override this option if necessary]. !! (Default is False). logical(LK),intent(in),optional :: allow_duplicate_keys !! * If True [default] then no special checks !! are done to check for duplicate keys. !! * If False, then after parsing, if any duplicate !! keys are found, an error is thrown. A call to !! [[json_value_validate]] will also check for !! duplicates. logical(LK),intent(in),optional :: escape_solidus !! * If True then the solidus "`/`" is always escaped !! "`\/`" when serializing JSON !! * If False [default], then it is not escaped. !! !! Note that this option does not affect parsing !! (both escaped and unescaped are still valid in !! all cases). logical(LK),intent(in),optional :: stop_on_error !! If an exception is raised, then immediately quit. !! (Default is False). integer(IK),intent(in),optional :: null_to_real_mode !! if `strict_type_checking=false`: !! !! * 1 : an exception will be raised if !! try to retrieve a `null` as a real. !! * 2 : a `null` retrieved as a real !! will return a NaN. [default] !! * 3 : a `null` retrieved as a real !! will return 0.0. integer(IK),intent(in),optional :: non_normal_mode !! How to serialize NaN, Infinity, and !! -Infinity real values: !! !! * 1 : as strings (e.g., "NaN", !! "Infinity", "-Infinity") [default] !! * 2 : as JSON `null` values logical(LK),intent(in),optional :: use_quiet_nan !! * If true [default], `null_to_real_mode=2` !! and [[string_to_real]] will use !! `ieee_quiet_nan` for NaN values. !! * If false, !! `ieee_signaling_nan` will be used. logical(LK),intent(in),optional :: strict_integer_type_checking !! * If false, when parsing JSON, if an integer numeric value !! cannot be converted to an integer (`integer(IK)`), !! then an attempt is then make to convert it !! to a real (`real(RK)`). !! * If true, an exception will be raised if the integer !! value cannot be read. !! !! (default is true) # 512 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call me%core%initialize(& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 515 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) end subroutine initialize_json_core_in_file !***************************************************************************************** !***************************************************************************************** !> ! Set the [[json_core(type)]] for this [[json_file]]. ! !@note This does not destroy the data in the file. ! !@note This one is used if you want to initialize the file with ! an already-existing [[json_core(type)]] (presumably, this was already ! initialized by a call to [[initialize_json_core]] or similar). subroutine set_json_core_in_file(me,core) implicit none class(json_file),intent(inout) :: me type(json_core),intent(in) :: core me%core = core end subroutine set_json_core_in_file !***************************************************************************************** !***************************************************************************************** !> ! Get a copy of the [[json_core(type)]] in this [[json_file]]. subroutine get_json_core_in_file(me,core) implicit none class(json_file),intent(in) :: me type(json_core),intent(out) :: core core = me%core end subroutine get_json_core_in_file !***************************************************************************************** !***************************************************************************************** !> author: Izaak Beekman ! date: 07/23/2015 ! ! Cast a [[json_value]] object as a [[json_file(type)]] object. ! It also calls the `initialize()` method. ! !@note [[initialize_json_core]], [[json_initialize]], ! [[initialize_json_core_in_file]], [[initialize_json_file]], ! [[initialize_json_file_v2]], [[initialize_json_file_from_string]], ! and [[initialize_json_file_from_string_v2]] ! all have a similar interface. function initialize_json_file(p,& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 572 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none type(json_file) :: file_object type(json_value),pointer,optional :: p !! `json_value` object to cast !! as a `json_file` object. This !! will be nullified. # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc logical(LK),intent(in),optional :: verbose !! mainly useful for debugging (default is false) logical(LK),intent(in),optional :: compact_reals !! to compact the real number strings for output (default is true) logical(LK),intent(in),optional :: print_signs !! always print numeric sign (default is false) character(kind=CDK,len=*),intent(in),optional :: real_format !! Real number format: 'E' [default], '*', 'G', 'EN', or 'ES' integer(IK),intent(in),optional :: spaces_per_tab !! number of spaces per tab for indenting (default is 2) logical(LK),intent(in),optional :: strict_type_checking !! if true, no integer, double, or logical type !! conversions are done for the `get` routines !! (default is false). logical(LK),intent(in),optional :: trailing_spaces_significant !! for name and path comparisons, is trailing !! space to be considered significant. !! (default is false) logical(LK),intent(in),optional :: case_sensitive_keys !! for name and path comparisons, are they !! case sensitive. (default is true) logical(LK),intent(in),optional :: no_whitespace !! if true, printing the JSON structure is !! done without adding any non-significant !! spaces or linebreaks (default is false) logical(LK),intent(in),optional :: unescape_strings !! If false, then the raw escaped !! string is returned from [[json_get_string]] !! and similar routines. If true [default], !! then the string is returned unescaped. character(kind=CK,len=*),intent(in),optional :: comment_char !! If present, these characters are used !! to denote comments in the JSON file, !! which will be ignored if present. !! Example: `!`, `#`, or `/!#`. Setting this !! to a blank string disables the !! ignoring of comments. (Default is `/!#`). integer(IK),intent(in),optional :: path_mode !! How the path strings are interpreted in the !! `get_by_path` routines: !! !! * 1 : Default mode (see [[json_get_by_path_default]]) !! * 2 : as RFC 6901 "JSON Pointer" paths !! (see [[json_get_by_path_rfc6901]]) !! * 3 : JSONPath "bracket-notation" !! see [[json_get_by_path_jsonpath_bracket]]) character(kind=CK,len=1),intent(in),optional :: path_separator !! The `path` separator to use !! in the "default" mode for !! the paths in the various !! `get_by_path` routines. !! Example: `.` [default] or `%`. !! Note: if `path_mode/=1` !! then this is ignored. logical(LK),intent(in),optional :: compress_vectors !! If true, then arrays of integers, !! nulls, doubles, and logicals are !! printed all on one line. !! [Note: `no_whitespace` will !! override this option if necessary]. !! (Default is False). logical(LK),intent(in),optional :: allow_duplicate_keys !! * If True [default] then no special checks !! are done to check for duplicate keys. !! * If False, then after parsing, if any duplicate !! keys are found, an error is thrown. A call to !! [[json_value_validate]] will also check for !! duplicates. logical(LK),intent(in),optional :: escape_solidus !! * If True then the solidus "`/`" is always escaped !! "`\/`" when serializing JSON !! * If False [default], then it is not escaped. !! !! Note that this option does not affect parsing !! (both escaped and unescaped are still valid in !! all cases). logical(LK),intent(in),optional :: stop_on_error !! If an exception is raised, then immediately quit. !! (Default is False). integer(IK),intent(in),optional :: null_to_real_mode !! if `strict_type_checking=false`: !! !! * 1 : an exception will be raised if !! try to retrieve a `null` as a real. !! * 2 : a `null` retrieved as a real !! will return a NaN. [default] !! * 3 : a `null` retrieved as a real !! will return 0.0. integer(IK),intent(in),optional :: non_normal_mode !! How to serialize NaN, Infinity, and !! -Infinity real values: !! !! * 1 : as strings (e.g., "NaN", !! "Infinity", "-Infinity") [default] !! * 2 : as JSON `null` values logical(LK),intent(in),optional :: use_quiet_nan !! * If true [default], `null_to_real_mode=2` !! and [[string_to_real]] will use !! `ieee_quiet_nan` for NaN values. !! * If false, !! `ieee_signaling_nan` will be used. logical(LK),intent(in),optional :: strict_integer_type_checking !! * If false, when parsing JSON, if an integer numeric value !! cannot be converted to an integer (`integer(IK)`), !! then an attempt is then make to convert it !! to a real (`real(RK)`). !! * If true, an exception will be raised if the integer !! value cannot be read. !! !! (default is true) # 581 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call file_object%initialize(& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 584 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) if (present(p)) then file_object%p => p ! we have to nullify it to avoid ! a dangling pointer when the file ! goes out of scope nullify(p) end if end function initialize_json_file !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 4/26/2016 ! ! Cast a [[json_value]] pointer and a [[json_core(type)]] object ! as a [[json_file(type)]] object. function initialize_json_file_v2(json_value_object,json_core_object) & result(file_object) implicit none type(json_file) :: file_object type(json_value),pointer,intent(in) :: json_value_object type(json_core),intent(in) :: json_core_object file_object%p => json_value_object file_object%core = json_core_object end function initialize_json_file_v2 !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 01/19/2019 ! ! Cast a JSON string as a [[json_file(type)]] object. ! It also calls the `initialize()` method. ! !### Example ! !```fortran ! type(json_file) :: f ! f = json_file('{"key ": 1}', trailing_spaces_significant=.true.) !``` ! !@note [[initialize_json_core]], [[json_initialize]], ! [[initialize_json_core_in_file]], [[initialize_json_file]], ! [[initialize_json_file_v2]], [[initialize_json_file_from_string]], ! and [[initialize_json_file_from_string_v2]] ! all have a similar interface. function initialize_json_file_from_string(str,& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 641 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none type(json_file) :: file_object character(kind=CK,len=*),intent(in) :: str !! string to load JSON data from # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc logical(LK),intent(in),optional :: verbose !! mainly useful for debugging (default is false) logical(LK),intent(in),optional :: compact_reals !! to compact the real number strings for output (default is true) logical(LK),intent(in),optional :: print_signs !! always print numeric sign (default is false) character(kind=CDK,len=*),intent(in),optional :: real_format !! Real number format: 'E' [default], '*', 'G', 'EN', or 'ES' integer(IK),intent(in),optional :: spaces_per_tab !! number of spaces per tab for indenting (default is 2) logical(LK),intent(in),optional :: strict_type_checking !! if true, no integer, double, or logical type !! conversions are done for the `get` routines !! (default is false). logical(LK),intent(in),optional :: trailing_spaces_significant !! for name and path comparisons, is trailing !! space to be considered significant. !! (default is false) logical(LK),intent(in),optional :: case_sensitive_keys !! for name and path comparisons, are they !! case sensitive. (default is true) logical(LK),intent(in),optional :: no_whitespace !! if true, printing the JSON structure is !! done without adding any non-significant !! spaces or linebreaks (default is false) logical(LK),intent(in),optional :: unescape_strings !! If false, then the raw escaped !! string is returned from [[json_get_string]] !! and similar routines. If true [default], !! then the string is returned unescaped. character(kind=CK,len=*),intent(in),optional :: comment_char !! If present, these characters are used !! to denote comments in the JSON file, !! which will be ignored if present. !! Example: `!`, `#`, or `/!#`. Setting this !! to a blank string disables the !! ignoring of comments. (Default is `/!#`). integer(IK),intent(in),optional :: path_mode !! How the path strings are interpreted in the !! `get_by_path` routines: !! !! * 1 : Default mode (see [[json_get_by_path_default]]) !! * 2 : as RFC 6901 "JSON Pointer" paths !! (see [[json_get_by_path_rfc6901]]) !! * 3 : JSONPath "bracket-notation" !! see [[json_get_by_path_jsonpath_bracket]]) character(kind=CK,len=1),intent(in),optional :: path_separator !! The `path` separator to use !! in the "default" mode for !! the paths in the various !! `get_by_path` routines. !! Example: `.` [default] or `%`. !! Note: if `path_mode/=1` !! then this is ignored. logical(LK),intent(in),optional :: compress_vectors !! If true, then arrays of integers, !! nulls, doubles, and logicals are !! printed all on one line. !! [Note: `no_whitespace` will !! override this option if necessary]. !! (Default is False). logical(LK),intent(in),optional :: allow_duplicate_keys !! * If True [default] then no special checks !! are done to check for duplicate keys. !! * If False, then after parsing, if any duplicate !! keys are found, an error is thrown. A call to !! [[json_value_validate]] will also check for !! duplicates. logical(LK),intent(in),optional :: escape_solidus !! * If True then the solidus "`/`" is always escaped !! "`\/`" when serializing JSON !! * If False [default], then it is not escaped. !! !! Note that this option does not affect parsing !! (both escaped and unescaped are still valid in !! all cases). logical(LK),intent(in),optional :: stop_on_error !! If an exception is raised, then immediately quit. !! (Default is False). integer(IK),intent(in),optional :: null_to_real_mode !! if `strict_type_checking=false`: !! !! * 1 : an exception will be raised if !! try to retrieve a `null` as a real. !! * 2 : a `null` retrieved as a real !! will return a NaN. [default] !! * 3 : a `null` retrieved as a real !! will return 0.0. integer(IK),intent(in),optional :: non_normal_mode !! How to serialize NaN, Infinity, and !! -Infinity real values: !! !! * 1 : as strings (e.g., "NaN", !! "Infinity", "-Infinity") [default] !! * 2 : as JSON `null` values logical(LK),intent(in),optional :: use_quiet_nan !! * If true [default], `null_to_real_mode=2` !! and [[string_to_real]] will use !! `ieee_quiet_nan` for NaN values. !! * If false, !! `ieee_signaling_nan` will be used. logical(LK),intent(in),optional :: strict_integer_type_checking !! * If false, when parsing JSON, if an integer numeric value !! cannot be converted to an integer (`integer(IK)`), !! then an attempt is then make to convert it !! to a real (`real(RK)`). !! * If true, an exception will be raised if the integer !! value cannot be read. !! !! (default is true) # 648 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 call file_object%initialize(& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 651 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) call file_object%deserialize(str) end function initialize_json_file_from_string !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[initialize_json_file_from_string]], where "str" is kind=CDK. function wrap_initialize_json_file_from_string(str,& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 663 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) result(file_object) implicit none type(json_file) :: file_object character(kind=CDK,len=*),intent(in) :: str !! string to load JSON data from # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_arguments.inc" 1 ! The argument list for the various `initialize` subroutines. ! ! See also: json_initialize_dummy_arguments.inc logical(LK),intent(in),optional :: verbose !! mainly useful for debugging (default is false) logical(LK),intent(in),optional :: compact_reals !! to compact the real number strings for output (default is true) logical(LK),intent(in),optional :: print_signs !! always print numeric sign (default is false) character(kind=CDK,len=*),intent(in),optional :: real_format !! Real number format: 'E' [default], '*', 'G', 'EN', or 'ES' integer(IK),intent(in),optional :: spaces_per_tab !! number of spaces per tab for indenting (default is 2) logical(LK),intent(in),optional :: strict_type_checking !! if true, no integer, double, or logical type !! conversions are done for the `get` routines !! (default is false). logical(LK),intent(in),optional :: trailing_spaces_significant !! for name and path comparisons, is trailing !! space to be considered significant. !! (default is false) logical(LK),intent(in),optional :: case_sensitive_keys !! for name and path comparisons, are they !! case sensitive. (default is true) logical(LK),intent(in),optional :: no_whitespace !! if true, printing the JSON structure is !! done without adding any non-significant !! spaces or linebreaks (default is false) logical(LK),intent(in),optional :: unescape_strings !! If false, then the raw escaped !! string is returned from [[json_get_string]] !! and similar routines. If true [default], !! then the string is returned unescaped. character(kind=CK,len=*),intent(in),optional :: comment_char !! If present, these characters are used !! to denote comments in the JSON file, !! which will be ignored if present. !! Example: `!`, `#`, or `/!#`. Setting this !! to a blank string disables the !! ignoring of comments. (Default is `/!#`). integer(IK),intent(in),optional :: path_mode !! How the path strings are interpreted in the !! `get_by_path` routines: !! !! * 1 : Default mode (see [[json_get_by_path_default]]) !! * 2 : as RFC 6901 "JSON Pointer" paths !! (see [[json_get_by_path_rfc6901]]) !! * 3 : JSONPath "bracket-notation" !! see [[json_get_by_path_jsonpath_bracket]]) character(kind=CK,len=1),intent(in),optional :: path_separator !! The `path` separator to use !! in the "default" mode for !! the paths in the various !! `get_by_path` routines. !! Example: `.` [default] or `%`. !! Note: if `path_mode/=1` !! then this is ignored. logical(LK),intent(in),optional :: compress_vectors !! If true, then arrays of integers, !! nulls, doubles, and logicals are !! printed all on one line. !! [Note: `no_whitespace` will !! override this option if necessary]. !! (Default is False). logical(LK),intent(in),optional :: allow_duplicate_keys !! * If True [default] then no special checks !! are done to check for duplicate keys. !! * If False, then after parsing, if any duplicate !! keys are found, an error is thrown. A call to !! [[json_value_validate]] will also check for !! duplicates. logical(LK),intent(in),optional :: escape_solidus !! * If True then the solidus "`/`" is always escaped !! "`\/`" when serializing JSON !! * If False [default], then it is not escaped. !! !! Note that this option does not affect parsing !! (both escaped and unescaped are still valid in !! all cases). logical(LK),intent(in),optional :: stop_on_error !! If an exception is raised, then immediately quit. !! (Default is False). integer(IK),intent(in),optional :: null_to_real_mode !! if `strict_type_checking=false`: !! !! * 1 : an exception will be raised if !! try to retrieve a `null` as a real. !! * 2 : a `null` retrieved as a real !! will return a NaN. [default] !! * 3 : a `null` retrieved as a real !! will return 0.0. integer(IK),intent(in),optional :: non_normal_mode !! How to serialize NaN, Infinity, and !! -Infinity real values: !! !! * 1 : as strings (e.g., "NaN", !! "Infinity", "-Infinity") [default] !! * 2 : as JSON `null` values logical(LK),intent(in),optional :: use_quiet_nan !! * If true [default], `null_to_real_mode=2` !! and [[string_to_real]] will use !! `ieee_quiet_nan` for NaN values. !! * If false, !! `ieee_signaling_nan` will be used. logical(LK),intent(in),optional :: strict_integer_type_checking !! * If false, when parsing JSON, if an integer numeric value !! cannot be converted to an integer (`integer(IK)`), !! then an attempt is then make to convert it !! to a real (`real(RK)`). !! * If true, an exception will be raised if the integer !! value cannot be read. !! !! (default is true) # 670 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 file_object = initialize_json_file_from_string(& to_unicode(str),& # 1 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_initialize_dummy_arguments.inc" 1 ! The dummy argument list for the various `initialize` subroutines. ! ! See also: json_initialize_argument.inc verbose,& compact_reals,& print_signs,& real_format,& spaces_per_tab,& strict_type_checking,& trailing_spaces_significant,& case_sensitive_keys,& no_whitespace,& unescape_strings,& comment_char,& path_mode,& path_separator,& compress_vectors,& allow_duplicate_keys,& escape_solidus,& stop_on_error,& null_to_real_mode,& non_normal_mode,& use_quiet_nan, & strict_integer_type_checking & # 674 "/mnt/c/Projects/VSIM/SimulationCore2/Common/json-fortran/json_file_module.F90" 2 ) end function wrap_initialize_json_file_from_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/19/2019 ! ! Cast a JSON string and a [[json_core(type)]] object ! as a [[json_file(type)]] object. function initialize_json_file_from_string_v2(str, json_core_object) & result(file_object) implicit none type(json_file) :: file_object character(kind=CK,len=*),intent(in) :: str !! string to load JSON data from type(json_core),intent(in) :: json_core_object file_object%core = json_core_object call file_object%deserialize(str) end function initialize_json_file_from_string_v2 !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[initialize_json_file_from_string_v2]], where "str" is kind=CDK. function wrap_initialize_json_file_from_string_v2(str,json_core_object) & result(file_object) implicit none type(json_file) :: file_object character(kind=CDK,len=*),intent(in) :: str !! string to load JSON data from type(json_core),intent(in) :: json_core_object file_object = initialize_json_file_from_string_v2(to_unicode(str),json_core_object) end function wrap_initialize_json_file_from_string_v2 !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Nullify the [[json_value]] pointer in a [[json_file(type)]], ! but do not destroy it. ! ! This should normally only be done if the pointer is the target of ! another pointer outside the class that is still intended to be in ! scope after the [[json_file(type)]] has gone out of scope. ! Otherwise, this would result in a memory leak. ! !### See also ! * [[json_file_destroy]] ! !### History ! * 6/30/2019 : Created subroutine json_file_nullify(me) implicit none class(json_file),intent(inout) :: me nullify(me%p) end subroutine json_file_nullify !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Destroy the [[json_value]] data in a [[json_file(type)]]. ! This may be done when the variable is no longer needed, ! or will be reused to open a different file. ! Otherwise a memory leak will occur. ! ! Optionally, also destroy the [[json_core(type)]] instance (this ! is not necessary to prevent memory leaks, since a [[json_core(type)]] ! does not use pointers). ! !### See also ! * [[json_file_nullify]] ! !### History ! * 12/9/2013 : Created ! * 4/26/2016 : Added optional `destroy_core` argument ! !@note This routine will be called automatically when the variable ! goes out of scope. subroutine json_file_destroy(me,destroy_core) implicit none class(json_file),intent(inout) :: me logical,intent(in),optional :: destroy_core !! to also destroy the [[json_core(type)]]. !! default is to leave it as is. if (associated(me%p)) call me%core%destroy(me%p) if (present(destroy_core)) then if (destroy_core) call me%core%destroy() end if end subroutine json_file_destroy !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/5/2014 ! ! Move the [[json_value]] pointer from one [[json_file(type)]] to another. ! The "from" pointer is then nullified, but not destroyed. ! !@note If "from%p" is not associated, then an error is thrown. subroutine json_file_move_pointer(to,from) implicit none class(json_file),intent(inout) :: to class(json_file),intent(inout) :: from if (associated(from%p)) then if (from%failed()) then !Don't get the data if the FROM file has an !active exception, since it may not be valid. call to%core%throw_exception('Error in json_file_move_pointer: '//& 'error exception in FROM file.') else call to%initialize() !initialize and clear any exceptions that may be present to%p => from%p nullify(from%p) end if else call to%core%throw_exception('Error in json_file_move_pointer: '//& 'pointer is not associated.') end if end subroutine json_file_move_pointer !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Load the JSON data from a file. ! !### Example ! !```fortran ! program main ! use json_module ! implicit none ! type(json_file) :: f ! call f%load('my_file.json') ! !... ! call f%destroy() ! end program main !``` subroutine json_file_load(me, filename, unit) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: filename !! the filename to open integer(IK),intent(in),optional :: unit !! the unit number to use !! (if not present, a newunit !! is used) call me%core%load(file=filename, p=me%p, unit=unit) end subroutine json_file_load !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/13/2015 ! ! Load the JSON data from a string. ! !### Example ! ! Load JSON from a string: !```fortran ! type(json_file) :: f ! call f%deserialize('{ "name": "Leonidas" }') !``` subroutine json_file_load_from_string(me, str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: str !! string to load JSON data from call me%core%deserialize(me%p, str) end subroutine json_file_load_from_string !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_load_from_string]], where "str" is kind=CDK. subroutine wrap_json_file_load_from_string(me, str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: str call me%deserialize(to_unicode(str)) end subroutine wrap_json_file_load_from_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/11/2015 ! ! Print the JSON file to the console. subroutine json_file_print_to_console(me) implicit none class(json_file),intent(inout) :: me call me%core%print(me%p,iunit=int(output_unit,IK)) end subroutine json_file_print_to_console !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Prints the JSON file to the specified file unit number. subroutine json_file_print_to_unit(me, iunit) implicit none class(json_file),intent(inout) :: me integer(IK),intent(in) :: iunit !! file unit number (must not be -1) if (iunit/=unit2str) then call me%core%print(me%p,iunit=iunit) else call me%core%throw_exception('Error in json_file_print_to_unit: iunit must not be -1.') end if end subroutine json_file_print_to_unit !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/11/2015 ! ! Print the JSON structure to the specified filename. ! The file is opened, printed, and then closed. ! !### Example ! Example loading a JSON file, changing a value, and then printing ! result to a new file: !```fortran ! type(json_file) :: f ! logical :: found ! call f%load('my_file.json') !open the original file ! call f%update('version',4,found) !change the value of a variable ! call f%print('my_file_2.json') !save file as new name !``` subroutine json_file_print_to_filename(me,filename) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: filename !! filename to print to call me%core%print(me%p,filename) end subroutine json_file_print_to_filename !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/11/2015 ! ! Print the JSON file to a string. ! !### Example ! ! Open a JSON file, and then print the contents to a string: !```fortran ! type(json_file) :: f ! character(kind=CK,len=:),allocatable :: str ! call f%load('my_file.json') ! call f%serialize(str) !``` subroutine json_file_print_to_string(me,str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=:),allocatable,intent(out) :: str !! string to print JSON data to call me%core%serialize(me%p,str) end subroutine json_file_print_to_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 2/3/2014 ! ! Returns information about a variable in a [[json_file(type)]]. ! !@note If `found` is present, no exceptions will be thrown if an ! error occurs. Otherwise, an exception will be thrown if the ! variable is not found. subroutine json_file_variable_info(me,path,found,var_type,n_children,name) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! path to the variable logical(LK),intent(out),optional :: found !! the variable exists in the structure integer(IK),intent(out),optional :: var_type !! variable type integer(IK),intent(out),optional :: n_children !! number of children character(kind=CK,len=:),allocatable,intent(out),optional :: name !! variable name call me%core%info(me%p,path,found,var_type,n_children,name) end subroutine json_file_variable_info !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_variable_info]], where "path" is kind=CDK. ! !@note If `found` is present, no exceptions will be thrown if an ! error occurs. Otherwise, an exception will be thrown if the ! variable is not found. subroutine wrap_json_file_variable_info(me,path,found,var_type,n_children,name) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path logical(LK),intent(out),optional :: found integer(IK),intent(out),optional :: var_type integer(IK),intent(out),optional :: n_children character(kind=CK,len=:),allocatable,intent(out),optional :: name !! variable name call me%info(to_unicode(path),found,var_type,n_children,name) end subroutine wrap_json_file_variable_info !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 6/26/2016 ! ! Returns matrix information about a variable in a [[json_file(type)]]. ! !@note If `found` is present, no exceptions will be thrown if an ! error occurs. Otherwise, an exception will be thrown if the ! variable is not found. subroutine json_file_variable_matrix_info(me,path,is_matrix,found,& var_type,n_sets,set_size,name) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! path to the variable logical(LK),intent(out) :: is_matrix !! true if it is a valid matrix logical(LK),intent(out),optional :: found !! true if it was found integer(IK),intent(out),optional :: var_type !! variable type of data in !! the matrix (if all elements have !! the same type) integer(IK),intent(out),optional :: n_sets !! number of data sets (i.e., matrix !! rows if using row-major order) integer(IK),intent(out),optional :: set_size !! size of each data set (i.e., matrix !! cols if using row-major order) character(kind=CK,len=:),allocatable,intent(out),optional :: name !! variable name call me%core%matrix_info(me%p,path,is_matrix,found,var_type,n_sets,set_size,name) end subroutine json_file_variable_matrix_info !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_variable_matrix_info]], where "path" is kind=CDK. ! !@note If `found` is present, no exceptions will be thrown if an ! error occurs. Otherwise, an exception will be thrown if the ! variable is not found. subroutine wrap_json_file_variable_matrix_info(me,path,is_matrix,found,& var_type,n_sets,set_size,name) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! path to the variable logical(LK),intent(out) :: is_matrix !! true if it is a valid matrix logical(LK),intent(out),optional :: found !! true if it was found integer(IK),intent(out),optional :: var_type !! variable type of data in !! the matrix (if all elements have !! the same type) integer(IK),intent(out),optional :: n_sets !! number of data sets (i.e., matrix !! rows if using row-major order) integer(IK),intent(out),optional :: set_size !! size of each data set (i.e., matrix !! cols if using row-major order) character(kind=CK,len=:),allocatable,intent(out),optional :: name !! variable name call me%matrix_info(to_unicode(path),is_matrix,found,var_type,n_sets,set_size,name) end subroutine wrap_json_file_variable_matrix_info !***************************************************************************************** !***************************************************************************************** !> author: Izaak Beekman ! date: 7/23/2015 ! ! Get a [[json_value]] pointer to the JSON file root. ! !@note This is equivalent to calling ```[[json_file]]%get('$',p)``` subroutine json_file_get_root(me,p) implicit none class(json_file),intent(inout) :: me type(json_value),pointer,intent(out) :: p !! pointer to the variable p => me%p end subroutine json_file_get_root !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Assignment operator for [[json_core(type)]] = [[json_core(type)]]. ! This will duplicate the [[json_core(type)]] and also ! perform a deep copy of the [[json_value(type)]] data structure. subroutine assign_json_file(me,f) implicit none class(json_file),intent(out) :: me type(json_file),intent(in) :: f me%core = f%core ! no pointers here so OK to copy call me%core%clone(f%p,me%p) end subroutine assign_json_file !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Assignment operator for character = [[json_core(type)]]. ! This is just a wrapper for the [[json_value_to_string]] routine. ! !### Note ! * If an exception is raised or the file contains no data, ! this will return an empty string. subroutine assign_json_file_to_string(str,me) implicit none character(kind=CK,len=:),allocatable,intent(out) :: str class(json_file),intent(in) :: me type(json_core) :: core_copy !! a copy of `core` from `me` if (me%core%failed() .or. .not. associated(me%p)) then str = CK_'' else ! This is sort of a hack. Since `me` has to have `intent(in)` ! for the assignment to work, we need to make a copy of `me%core` ! so we can call the low level routine (since it needs it to ! be `intent(inout)`) because it's possible for this ! function to raise an exception. core_copy = me%core ! copy the parser settings call core_copy%serialize(me%p,str) if (me%core%failed()) str = CK_'' end if end subroutine assign_json_file_to_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Assignment operator for [[json_core(type)]] = character. ! This is just a wrapper for the [[json_file_load_from_string]] routine. subroutine assign_string_to_json_file(me,str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: str if (associated(me%p)) call me%destroy() if (me%core%failed()) call me%core%clear_exceptions() call me%deserialize(str) end subroutine assign_string_to_json_file !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[assign_string_to_json_file]], where "str" is kind=CDK. subroutine wrap_assign_string_to_json_file(me,str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: str call me%assign_string_to_json_file(to_unicode(str)) end subroutine wrap_assign_string_to_json_file !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! A wrapper for [[json_file_valid_path]] for the `.in.` operator function json_file_valid_path_op(path,me) result(found) implicit none character(kind=CK,len=*),intent(in) :: path !! the path to the variable class(json_file),intent(in) :: me !! the JSON file logical(LK) :: found !! if the variable was found type(json_core) :: core_copy !! a copy of `core` from `me` ! This is sort of a hack. Since `me` has to have `intent(in)` ! for the operator to work, we need to make a copy of `me%core` ! so we can call the low level routine (since it needs it to ! be `intent(inout)`) because it's technically possible for this ! function to raise an exception. This normally should never ! happen here unless the JSON structure is malformed. core_copy = me%core ! copy the settings (need them to know ! how to interpret the path) found = core_copy%valid_path(me%p, path) ! call the low-level routine call core_copy%destroy() ! just in case (but not really necessary) end function json_file_valid_path_op !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_valid_path_op]], where "path" is kind=CDK. function wrap_json_file_valid_path_op(path,me) result(found) implicit none character(kind=CDK,len=*),intent(in) :: path !! the path to the variable class(json_file),intent(in) :: me !! the JSON file logical(LK) :: found !! if the variable was found found = to_unicode(path) .in. me end function wrap_json_file_valid_path_op !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Returns true if the `path` is present in the JSON file. function json_file_valid_path(me,path) result(found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable logical(LK) :: found !! if the variable was found found = me%core%valid_path(me%p, path) end function json_file_valid_path !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_valid_path]], where "path" is kind=CDK. function wrap_json_file_valid_path(me,path) result(found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable logical(LK) :: found !! if the variable was found found = me%valid_path(to_unicode(path)) end function wrap_json_file_valid_path !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Rename a variable in a JSON file. subroutine json_file_rename(me,path,name,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),intent(in) :: name !! the new name logical(LK),intent(out),optional :: found !! if the variable was found call me%core%rename(me%p, path, name, found) end subroutine json_file_rename !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_rename]], where "path" and "name" are kind=CDK. subroutine wrap_json_file_rename(me,path,name,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),intent(in) :: name !! the new name logical(LK),intent(out),optional :: found !! if the variable was found call me%json_file_rename(to_unicode(path),to_unicode(name),found) end subroutine wrap_json_file_rename !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Wrapper for [[json_file_rename]] where "path" is kind=CDK). subroutine json_file_rename_path_ascii(me,path,name,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),intent(in) :: name !! the new name logical(LK),intent(out),optional :: found !! if the variable was found call me%json_file_rename(to_unicode(path),name,found) end subroutine json_file_rename_path_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Wrapper for [[json_file_rename]] where "name" is kind=CDK). subroutine json_file_rename_name_ascii(me,path,name,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),intent(in) :: name !! the new name logical(LK),intent(out),optional :: found !! if the variable was found call me%json_file_rename(path,to_unicode(name),found) end subroutine json_file_rename_name_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 2/3/2014 ! ! Get a [[json_value]] pointer to an object from a JSON file. subroutine json_file_get_object(me, path, p, found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable type(json_value),pointer,intent(out) :: p !! pointer to the variable logical(LK),intent(out),optional :: found !! if it was really found call me%core%get(me%p, path, p, found) end subroutine json_file_get_object !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_object]], where "path" is kind=CDK. subroutine wrap_json_file_get_object(me, path, p, found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable type(json_value),pointer,intent(out) :: p !! pointer to the variable logical(LK),intent(out),optional :: found !! if it was really found call me%get(to_unicode(path), p, found) end subroutine wrap_json_file_get_object !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Get an integer value from a JSON file. subroutine json_file_get_integer(me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable integer(IK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found integer(IK),intent(in),optional :: default call me%core%get(me%p, path, val, found, default) end subroutine json_file_get_integer !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_integer]], where "path" is kind=CDK. subroutine wrap_json_file_get_integer(me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable integer(IK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found integer(IK),intent(in),optional :: default call me%get(to_unicode(path), val, found, default) end subroutine wrap_json_file_get_integer !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/20/2014 ! ! Get an integer vector from a JSON file. subroutine json_file_get_integer_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable integer(IK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found integer(IK),dimension(:),intent(in),optional :: default call me%core%get(me%p, path, vec, found, default) end subroutine json_file_get_integer_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_integer_vec]], where "path" is kind=CDK. subroutine wrap_json_file_get_integer_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable integer(IK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found integer(IK),dimension(:),intent(in),optional :: default call me%get(to_unicode(path), vec, found, default) end subroutine wrap_json_file_get_integer_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Get a real(RK) variable value from a JSON file. subroutine json_file_get_real (me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(RK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found real(RK),intent(in),optional :: default call me%core%get(me%p, path, val, found, default) end subroutine json_file_get_real !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_real]], where "path" is kind=CDK. subroutine wrap_json_file_get_real (me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(RK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found real(RK),intent(in),optional :: default call me%get(to_unicode(path), val, found, default) end subroutine wrap_json_file_get_real !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/19/2014 ! ! Get a real(RK) vector from a JSON file. subroutine json_file_get_real_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(RK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found real(RK),dimension(:),intent(in),optional :: default call me%core%get(me%p, path, vec, found, default) end subroutine json_file_get_real_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_real_vec]], where "path" is kind=CDK. subroutine wrap_json_file_get_real_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(RK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found real(RK),dimension(:),intent(in),optional :: default call me%get(to_unicode(path), vec, found, default) end subroutine wrap_json_file_get_real_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/21/2019 ! ! Alternate version of [[json_file_get_real]] where `val` is `real32`. subroutine json_file_get_real32 (me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(real32),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found real(real32),intent(in),optional :: default call me%core%get(me%p, path, val, found, default) end subroutine json_file_get_real32 !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_real32]], where "path" is kind=CDK. subroutine wrap_json_file_get_real32 (me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(real32),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found real(real32),intent(in),optional :: default call me%get(to_unicode(path), val, found, default) end subroutine wrap_json_file_get_real32 !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/21/2019 ! ! Alternate version of [[json_file_get_real_vec]] where `vec` is `real32`. subroutine json_file_get_real32_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(real32),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found real(real32),dimension(:),intent(in),optional :: default call me%core%get(me%p, path, vec, found, default) end subroutine json_file_get_real32_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_real32_vec]], where "path" is kind=CDK. subroutine wrap_json_file_get_real32_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(real32),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found real(real32),dimension(:),intent(in),optional :: default call me%get(to_unicode(path), vec, found, default) end subroutine wrap_json_file_get_real32_vec !***************************************************************************************** # 1748 !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Get a logical(LK) value from a JSON file. subroutine json_file_get_logical(me,path,val,found,default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable logical(LK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found logical(LK),intent(in),optional :: default call me%core%get(me%p, path, val, found, default) end subroutine json_file_get_logical !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_logical]], where "path" is kind=CDK. subroutine wrap_json_file_get_logical(me,path,val,found,default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable logical(LK),intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found logical(LK),intent(in),optional :: default call me%get(to_unicode(path), val, found, default) end subroutine wrap_json_file_get_logical !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/20/2014 ! ! Get a logical(LK) vector from a JSON file. subroutine json_file_get_logical_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable logical(LK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found logical(LK),dimension(:),intent(in),optional :: default call me%core%get(me%p, path, vec, found, default) end subroutine json_file_get_logical_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_logical_vec]], where "path" is kind=CDK. subroutine wrap_json_file_get_logical_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable logical(LK),dimension(:),allocatable,intent(out) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if it was really found logical(LK),dimension(:),intent(in),optional :: default call me%get(to_unicode(path), vec, found, default) end subroutine wrap_json_file_get_logical_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/9/2013 ! ! Get a character string from a json file. ! The output val is an allocatable character string. subroutine json_file_get_string(me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=:),allocatable,intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found character(kind=CK,len=*),intent(in),optional :: default call me%core%get(me%p, path, val, found, default) end subroutine json_file_get_string !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_string]], where "path" is kind=CDK. subroutine wrap_json_file_get_string(me, path, val, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=:),allocatable,intent(out) :: val !! value logical(LK),intent(out),optional :: found !! if it was really found character(kind=CK,len=*),intent(in),optional :: default call me%get(to_unicode(path), val, found, default) end subroutine wrap_json_file_get_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/19/2014 ! ! Get a string vector from a JSON file. subroutine json_file_get_string_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),dimension(:),allocatable,intent(out) :: vec !! value vector logical(LK),intent(out),optional :: found !! if it was really found character(kind=CK,len=*),dimension(:),intent(in),optional :: default call me%core%get(me%p, path, vec, found, default) end subroutine json_file_get_string_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_string_vec]], where "path" is kind=CDK. subroutine wrap_json_file_get_string_vec(me, path, vec, found, default) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),dimension(:),allocatable,intent(out) :: vec !! value vector logical(LK),intent(out),optional :: found !! if it was really found character(kind=CK,len=*),dimension(:),intent(in),optional :: default call me%get(to_unicode(path), vec, found, default) end subroutine wrap_json_file_get_string_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 12/17/2016 ! ! Get an (allocatable length) string vector from a JSON file. ! This is just a wrapper for [[json_get_alloc_string_vec_by_path]]. subroutine json_file_get_alloc_string_vec(me, path, vec, ilen, found, default, default_ilen) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=:),dimension(:),allocatable,intent(out) :: vec !! value vector integer(IK),dimension(:),allocatable,intent(out) :: ilen !! the actual length !! of each character !! string in the array logical(LK),intent(out),optional :: found character(kind=CK,len=*),dimension(:),intent(in),optional :: default integer(IK),dimension(:),intent(in),optional :: default_ilen !! the actual !! length of `default` call me%core%get(me%p, path, vec, ilen, found, default, default_ilen) end subroutine json_file_get_alloc_string_vec !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_get_alloc_string_vec]], where "path" is kind=CDK. ! This is just a wrapper for [[wrap_json_get_alloc_string_vec_by_path]]. subroutine wrap_json_file_get_alloc_string_vec(me, path, vec, ilen, found, default, default_ilen) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=:),dimension(:),allocatable,intent(out) :: vec !! value vector integer(IK),dimension(:),allocatable,intent(out) :: ilen !! the actual length !! of each character !! string in the array logical(LK),intent(out),optional :: found character(kind=CK,len=*),dimension(:),intent(in),optional :: default integer(IK),dimension(:),intent(in),optional :: default_ilen !! the actual !! length of `default` call me%get(to_unicode(path), vec, ilen, found, default, default_ilen) end subroutine wrap_json_file_get_alloc_string_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a [[json_value]] pointer as the root object to a JSON file. ! !### Note ! ! This is mostly equivalent to: !```fortran ! f = [[json_file]](p) !``` ! But without the finalization calls. ! ! And: !```fortran ! if (destroy_original) call [[json_file]]%destroy() ! call [[json_file]]%add('$',p) !``` subroutine json_file_add(me,p,destroy_original) implicit none class(json_file),intent(inout) :: me type(json_value),pointer,intent(in) :: p !! pointer to the variable to add logical(LK),intent(in),optional :: destroy_original !! if the file currently contains !! an associated pointer, it is !! destroyed. [Default is True] logical(LK) :: destroy !! if `me%p` is to be destroyed if (present(destroy_original)) then destroy = destroy_original else destroy = .true. ! default end if if (destroy) call me%core%destroy(me%p) me%p => p end subroutine json_file_add !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a [[json_value]] pointer to an object to a JSON file. subroutine json_file_add_object(me,path,p,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable type(json_value),pointer,intent(in) :: p !! pointer to the variable to add logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,p,found,was_created) end subroutine json_file_add_object !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_object]], where "path" is kind=CDK. subroutine wrap_json_file_add_object(me,path,p,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable type(json_value),pointer,intent(in) :: p !! pointer to the variable to add logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_object(to_unicode(path),p,found,was_created) end subroutine wrap_json_file_add_object !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add an integer value to a JSON file. subroutine json_file_add_integer(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable integer(IK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,val,found,was_created) end subroutine json_file_add_integer !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_integer]], where "path" is kind=CDK. subroutine wrap_json_file_add_integer(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable integer(IK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_integer(to_unicode(path),val,found,was_created) end subroutine wrap_json_file_add_integer !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add an integer vector to a JSON file. subroutine json_file_add_integer_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable integer(IK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,vec,found,was_created) end subroutine json_file_add_integer_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_integer_vec]], where "path" is kind=CDK. subroutine wrap_json_file_add_integer_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable integer(IK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_integer_vec(to_unicode(path),vec,found,was_created) end subroutine wrap_json_file_add_integer_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a real(RK) variable value to a JSON file. subroutine json_file_add_real(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(RK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,val,found,was_created) end subroutine json_file_add_real !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real]], where "path" is kind=CDK. subroutine wrap_json_file_add_real(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(RK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_real(to_unicode(path),val,found,was_created) end subroutine wrap_json_file_add_real !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a real(RK) vector to a JSON file. subroutine json_file_add_real_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(RK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,vec,found,was_created) end subroutine json_file_add_real_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real_vec]], where "path" is kind=CDK. subroutine wrap_json_file_add_real_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(RK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_real_vec(to_unicode(path),vec,found,was_created) end subroutine wrap_json_file_add_real_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real]] where `val` is `real32`. subroutine json_file_add_real32(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(real32),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%core%add_by_path(me%p,path,val,found,was_created) end subroutine json_file_add_real32 !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real32]], where "path" is kind=CDK. subroutine wrap_json_file_add_real32(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(real32),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_real32(to_unicode(path),val,found,was_created) end subroutine wrap_json_file_add_real32 !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real_vec]] where `vec` is `real32`. subroutine json_file_add_real32_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable real(real32),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%core%add_by_path(me%p,path,vec,found,was_created) end subroutine json_file_add_real32_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_real32_vec]], where "path" is kind=CDK. subroutine wrap_json_file_add_real32_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable real(real32),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_real32_vec(to_unicode(path),vec,found,was_created) end subroutine wrap_json_file_add_real32_vec !***************************************************************************************** # 2379 !***************************************************************************************** !> author: Jacob Williams ! ! Add a logical(LK) value to a JSON file. subroutine json_file_add_logical(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable logical(LK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,val,found,was_created) end subroutine json_file_add_logical !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_logical]], where "path" is kind=CDK. subroutine wrap_json_file_add_logical(me,path,val,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable logical(LK),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_logical(to_unicode(path),val,found,was_created) end subroutine wrap_json_file_add_logical !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a logical(LK) vector to a JSON file. subroutine json_file_add_logical_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable logical(LK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,vec,found,was_created) end subroutine json_file_add_logical_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_logical_vec]], where "path" is kind=CDK. subroutine wrap_json_file_add_logical_vec(me,path,vec,found,was_created) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable logical(LK),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created call me%json_file_add_logical_vec(to_unicode(path),vec,found,was_created) end subroutine wrap_json_file_add_logical_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a character string to a json file. subroutine json_file_add_string(me,path,val,found,was_created,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,val,found,was_created,trim_str,adjustl_str) end subroutine json_file_add_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_string]], where "path" and "val" are kind=CDK. subroutine wrap_json_file_add_string(me,path,val,found,was_created,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) call me%json_file_add_string(to_unicode(path),to_unicode(val),found,& was_created,trim_str,adjustl_str) end subroutine wrap_json_file_add_string !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Wrapper for [[json_file_add_string]] where "path" is kind=CDK). subroutine json_file_add_string_path_ascii(me,path,val,found,& was_created,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%json_file_add_string(to_unicode(path),val,found,& was_created,trim_str,adjustl_str) end subroutine json_file_add_string_path_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Wrapper for [[json_file_add_string]] where "val" is kind=CDK). subroutine json_file_add_string_value_ascii(me,path,val,found,& was_created,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),intent(in) :: val !! value logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%json_file_add_string(path,to_unicode(val),found,& was_created,trim_str,adjustl_str) end subroutine json_file_add_string_value_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Add a string vector to a JSON file. subroutine json_file_add_string_vec(me,path,vec,found,& was_created,ilen,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created integer(IK),dimension(:),intent(in),optional :: ilen !! the string lengths of each !! element in `value`. If not present, !! the full `len(value)` string is added !! for each element. logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for each element logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for each element !! (note that ADJUSTL is done before TRIM) if (.not. associated(me%p)) call me%core%create_object(me%p,ck_'') ! create root call me%core%add_by_path(me%p,path,vec,found,was_created,ilen,trim_str,adjustl_str) end subroutine json_file_add_string_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_string_vec]], where "path" and "vec" are kind=CDK. subroutine wrap_json_file_add_string_vec(me,path,vec,found,& was_created,ilen,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),dimension(:),intent(in):: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created integer(IK),dimension(:),intent(in),optional :: ilen !! the string lengths of each !! element in `value`. If not present, !! the full `len(value)` string is added !! for each element. logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for each element logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for each element !! (note that ADJUSTL is done before TRIM) call me%json_file_add_string_vec(to_unicode(path),to_unicode(vec),found,& was_created,ilen,trim_str,adjustl_str) end subroutine wrap_json_file_add_string_vec !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_string_vec]], where "path" is kind=CDK. subroutine json_file_add_string_vec_path_ascii(me,path,vec,found,& was_created,ilen,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable character(kind=CK,len=*),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created integer(IK),dimension(:),intent(in),optional :: ilen !! the string lengths of each !! element in `value`. If not present, !! the full `len(value)` string is added !! for each element. logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for each element logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for each element !! (note that ADJUSTL is done before TRIM) call me%json_file_add_string_vec(to_unicode(path),vec,found,& was_created,ilen,trim_str,adjustl_str) end subroutine json_file_add_string_vec_path_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! ! Alternate version of [[json_file_add_string_vec]], where "vec" is kind=CDK. subroutine json_file_add_string_vec_vec_ascii(me,path,vec,found,& was_created,ilen,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable character(kind=CDK,len=*),dimension(:),intent(in) :: vec !! the value vector logical(LK),intent(out),optional :: found !! if the variable was found logical(LK),intent(out),optional :: was_created !! if the variable had to be created integer(IK),dimension(:),intent(in),optional :: ilen !! the string lengths of each !! element in `value`. If not present, !! the full `len(value)` string is added !! for each element. logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for each element logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for each element !! (note that ADJUSTL is done before TRIM) call me%json_file_add_string_vec(path,to_unicode(vec),found,& was_created,ilen,trim_str,adjustl_str) end subroutine json_file_add_string_vec_vec_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/10/2015 ! ! Given the path string, if the variable is present in the file, ! and is a scalar, then update its value. ! If it is not present, then create it and set its value. ! !### See also ! * [[json_update_integer]] subroutine json_file_update_integer(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path integer(IK),intent(in) :: val logical(LK),intent(out) :: found if (.not. me%core%failed()) call me%core%update(me%p,path,val,found) end subroutine json_file_update_integer !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_integer]], where "path" is kind=CDK. subroutine wrap_json_file_update_integer(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path integer(IK),intent(in) :: val logical(LK),intent(out) :: found call me%update(to_unicode(path),val,found) end subroutine wrap_json_file_update_integer !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/10/2015 ! ! Given the path string, if the variable is present in the file, ! and is a scalar, then update its value. ! If it is not present, then create it and set its value. ! !### See also ! * [[json_update_logical]] subroutine json_file_update_logical(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path logical(LK),intent(in) :: val logical(LK),intent(out) :: found if (.not. me%core%failed()) call me%core%update(me%p,path,val,found) end subroutine json_file_update_logical !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_logical]], where "path" is kind=CDK. subroutine wrap_json_file_update_logical(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path logical(LK),intent(in) :: val logical(LK),intent(out) :: found call me%update(to_unicode(path),val,found) end subroutine wrap_json_file_update_logical !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/10/2015 ! ! Given the path string, if the variable is present in the file, ! and is a scalar, then update its value. ! If it is not present, then create it and set its value. subroutine json_file_update_real(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path real(RK),intent(in) :: val logical(LK),intent(out) :: found if (.not. me%core%failed()) call me%core%update(me%p,path,val,found) end subroutine json_file_update_real !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_real]], where "path" is kind=CDK. subroutine wrap_json_file_update_real(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path real(RK),intent(in) :: val logical(LK),intent(out) :: found call me%update(to_unicode(path),val,found) end subroutine wrap_json_file_update_real !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 1/21/2019 ! ! Alternate version of [[json_file_update_real]] where `val` is `real32`. subroutine json_file_update_real32(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path real(real32),intent(in) :: val logical(LK),intent(out) :: found call me%update(path,real(val,RK),found) end subroutine json_file_update_real32 !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_real32]], where "path" is kind=CDK. subroutine wrap_json_file_update_real32(me,path,val,found) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path real(real32),intent(in) :: val logical(LK),intent(out) :: found call me%update(to_unicode(path),val,found) end subroutine wrap_json_file_update_real32 !***************************************************************************************** # 2889 !***************************************************************************************** !> author: Jacob Williams ! date: 1/10/2015 ! ! Given the path string, if the variable is present in the file, ! and is a scalar, then update its value. ! If it is not present, then create it and set its value. ! !### See also ! * [[json_update_string]] subroutine json_file_update_string(me,path,val,found,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path character(kind=CK,len=*),intent(in) :: val logical(LK),intent(out) :: found logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) if (.not. me%core%failed()) call me%core%update(me%p,path,val,found,trim_str,adjustl_str) end subroutine json_file_update_string !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_string]], where "path" and "val" are kind=CDK. subroutine wrap_json_file_update_string(me,path,val,found,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path character(kind=CDK,len=*),intent(in) :: val logical(LK),intent(out) :: found logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) call me%update(to_unicode(path),to_unicode(val),found,trim_str,adjustl_str) end subroutine wrap_json_file_update_string !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_string]], where "path" is kind=CDK. subroutine json_file_update_string_name_ascii(me,path,val,found,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path character(kind=CK, len=*),intent(in) :: val logical(LK),intent(out) :: found logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) call me%update(to_unicode(path),val,found,trim_str,adjustl_str) end subroutine json_file_update_string_name_ascii !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_update_string]], where "val" is kind=CDK. subroutine json_file_update_string_val_ascii(me,path,val,found,trim_str,adjustl_str) implicit none class(json_file),intent(inout) :: me character(kind=CK, len=*),intent(in) :: path character(kind=CDK,len=*),intent(in) :: val logical(LK),intent(out) :: found logical(LK),intent(in),optional :: trim_str !! if TRIM() should be called for the `val` logical(LK),intent(in),optional :: adjustl_str !! if ADJUSTL() should be called for the `val` !! (note that ADJUSTL is done before TRIM) call me%update(path,to_unicode(val),found,trim_str,adjustl_str) end subroutine json_file_update_string_val_ascii !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 6/11/2016 ! ! Traverse the JSON structure in the file. ! This routine calls the user-specified [[json_traverse_callback_func]] ! for each element of the structure. subroutine json_file_traverse(me,traverse_callback) implicit none class(json_file),intent(inout) :: me procedure(json_traverse_callback_func) :: traverse_callback call me%core%traverse(me%p,traverse_callback) end subroutine json_file_traverse !***************************************************************************************** !***************************************************************************************** !> author: Jacob Williams ! date: 7/7/2018 ! ! Remove a variable from a JSON file. ! !@note This is just a wrapper to [[remove_if_present]]. subroutine json_file_remove(me,path) implicit none class(json_file),intent(inout) :: me character(kind=CK,len=*),intent(in) :: path !! the path to the variable call me%core%remove_if_present(me%p,path) end subroutine json_file_remove !***************************************************************************************** !***************************************************************************************** !> ! Alternate version of [[json_file_remove]], where "path" is kind=CDK. subroutine wrap_json_file_remove(me,path) implicit none class(json_file),intent(inout) :: me character(kind=CDK,len=*),intent(in) :: path !! the path to the variable call me%remove(to_unicode(path)) end subroutine wrap_json_file_remove !***************************************************************************************** !***************************************************************************************** end module json_file_module !*****************************************************************************************