!***************************************************************************************** !> author: Jacob Williams ! license: BSD ! ! JSON-Fortran kind definitions. ! !### 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. ! !@note ```-DUSE_UCS4``` is an optional preprocessor flag. ! When present, Unicode support is enabled. Note that this ! is currently only supported with the gfortran compiler. ! Example: ```gfortran -DUSE_UCS4 ... ``` #ifdef USE_UCS4 # pragma push_macro("USE_UCS4") # undef USE_UCS4 ! The documentation given here assumes ```USE_UCS4``` **is** defined. # pragma pop_macro("USE_UCS4") #else ! The documentation given here assumes ```USE_UCS4``` **is not** defined. #endif ! !@warning ```CK``` and ```CDK``` are the JSON-Fortran character kind and JSON-Fortran default ! character kind respectively. Client code **MUST** ensure characters of ```kind=CK``` ! are used for all character variables and strings passed to the JSON-Fortran ! library *EXCEPT* for file names which must be of ```'DEFAULT'``` character kind, ! provided here as ```CDK```. In particular, any variable that is a: json path, string ! value or object name passed to the JSON-Fortran library **MUST** be of type ```CK```. ! !@note Most string literal constants of default kind are fine to pass as arguments to ! JSON-Fortran procedures since they have been overloaded to accept ```intent(in)``` ! character arguments of the default (```CDK```) kind. If you find a procedure which does ! not accept an ```intent(in)``` literal string argument of default kind, please ! [file an issue](https://github.com/jacobwilliams/json-fortran/issues/new) on GitHub. ! !@note The default real kind (`RK`) and the default integer kind (`IK`) can be ! changed using optional preprocessor flags. This library was built with kinds: #ifdef REAL32 ! real(kind=real32) [4 bytes] #elif REAL64 ! real(kind=real64) [8 bytes] #elif REAL128 ! real(kind=real128) [16 bytes] #else ! real(kind=real64) [8 bytes] #endif ! and #ifdef INT8 ! integer(kind=int8) [1 byte] #elif INT16 ! integer(kind=int16) [2 bytes] #elif INT32 ! integer(kind=int32) [4 bytes] #elif INT64 ! integer(kind=int64) [8 bytes] #else ! integer(kind=int32) [4 bytes] #endif ! . ! !@note In addition to the real kind specified by `RK`, interfaces for ! the real kinds with less precision are also provided in the library, ! but all are converted to `real(RK)` variables internally. module json_kinds use,intrinsic :: iso_fortran_env implicit none private ! used for the reals with less precision ! than the default precision: #ifndef REAL32 public :: real32 #endif #ifdef REAL128 public :: real64 #endif #ifdef REAL32 integer,parameter,public :: RK = real32 !! Default real kind [4 bytes] #elif REAL64 integer,parameter,public :: RK = real64 !! Default real kind [8 bytes] #elif REAL128 integer,parameter,public :: RK = real128 !! Default real kind [16 bytes] #else integer,parameter,public :: RK = real64 !! Default real kind if not specified [8 bytes] #endif #ifdef INT8 integer,parameter,public :: IK = int8 !! Default integer kind [1 byte] #elif INT16 integer,parameter,public :: IK = int16 !! Default integer kind [2 bytes] #elif INT32 integer,parameter,public :: IK = int32 !! Default integer kind [4 bytes] #elif INT64 integer,parameter,public :: IK = int64 !! Default integer kind [8 bytes] #else integer,parameter,public :: IK = int32 !! Default integer kind if not specified [4 bytes] #endif !********************************************************* !> ! Processor dependent 'DEFAULT' character kind. ! This is 1 byte for the Intel and Gfortran compilers. integer,parameter,public :: CDK = selected_char_kind('DEFAULT') !********************************************************* !********************************************************* !> ! Default logical kind. ! This is 4 bytes for the Intel and Gfortran compilers ! (and perhaps others). ! The declaration ensures a valid kind ! if the compiler doesn't have a logical_kinds(3). integer,parameter,public :: LK = logical_kinds(min(3,size(logical_kinds))) !********************************************************* !********************************************************* !> ! String kind preprocessor macro. #if defined __GFORTRAN__ && defined USE_UCS4 ! gfortran compiler AND UCS4 support requested: character(kind=CDK,len=*),parameter :: json_fortran_string_kind = 'ISO_10646' #else ! this is the string kind to use unless compiling with GFortran AND ! UCS4/ISO 10646 support is requested character(kind=CDK,len=*),parameter :: json_fortran_string_kind = 'DEFAULT' #endif !********************************************************* !********************************************************* !> ! Default character kind used by JSON-Fortran. ! If ISO 10646 (UCS4) support is available, use that, ! otherwise, gracefully fall back on 'DEFAULT' characters. ! Currently only gfortran >= 4.9.2 will correctly support ! UCS4 which is stored in 4 bytes. ! (and perhaps others). integer,parameter,public :: CK = selected_char_kind(json_fortran_string_kind) !********************************************************* end module json_kinds !*****************************************************************************************