-
Notifications
You must be signed in to change notification settings - Fork 87
/
Copy pathjson_parameters.F90
144 lines (122 loc) · 8.98 KB
/
json_parameters.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
!*****************************************************************************************
!> author: Jacob Williams
! license: BSD
!
! Other parameters used by JSON-Fortran.
! This is a low-level module not meant to be used by a JSON-Fortran user.
!
!### 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_parameters
use json_kinds
implicit none
public
character(kind=CDK,len=*),parameter :: json_ext = '.json' !! JSON file extension
! The types of JSON data.
integer(IK),parameter :: json_unknown = 0 !! Unknown JSON data type
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_null = 1 !! Null JSON data type
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_object = 2 !! Object JSON data type
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_array = 3 !! Array JSON data type
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_logical = 4 !! Logical JSON data type (`logical(LK)`)
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_integer = 5 !! Integer JSON data type (`integer(IK)`)
!! (see [[json_file_variable_info]] and [[json_info]]).
integer(IK),parameter :: json_real = 6 !! Real number JSON data type (`real(RK)`)
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_string = 7 !! String JSON data type (`character(CK)`)
!! (see [[json_file_variable_info]] and [[json_info]])
integer(IK),parameter :: json_double = json_real !! Equivalent to `json_real` for
!! backward compatibility.
!special JSON characters
character(kind=CK,len=*),parameter :: space = CK_' ' !! space character
character(kind=CK,len=*),parameter :: start_object = CK_'{' !! start of a JSON object
character(kind=CK,len=*),parameter :: end_object = CK_'}' !! end of a JSON object
character(kind=CK,len=*),parameter :: start_array = CK_'[' !! start of a JSON array
character(kind=CK,len=*),parameter :: end_array = CK_']' !! end of a JSON array
character(kind=CK,len=*),parameter :: delimiter = CK_',' !! delimiter for JSON
character(kind=CK,len=*),parameter :: colon_char = CK_':' !! colon character for JSON
character(kind=CK,len=*),parameter :: start_array_alt = CK_'(' !! alternate start of JSON array for
!! [[json_get_by_path_default]]
character(kind=CK,len=*),parameter :: end_array_alt = CK_')' !! alternate end of JSON array for
!! [[json_get_by_path_default]]
character(kind=CK,len=*),parameter :: root = CK_'$' !! root for [[json_get_by_path_default]]
character(kind=CK,len=*),parameter :: this = CK_'@' !! 'this' for [[json_get_by_path_default]]
character(kind=CK,len=*),parameter :: dot = CK_'.' !! path separator for [[json_get_by_path_default]]
character(kind=CK,len=*),parameter :: tilde = CK_'~' !! RFC 6901 escape character
character(kind=CK,len=*),parameter :: single_quote = CK_"'" !! for JSONPath bracket-notation
character(kind=CK,len=*),parameter :: slash = CK_'/' !! JSON special character
character(kind=CK,len=*),parameter :: backslash = CK_'\' !! JSON special character
character(kind=CK,len=*),parameter :: quotation_mark = CK_'"' !! JSON special character
character(kind=CK,len=*),parameter :: bspace = achar(8, kind=CK) !! JSON special character
character(kind=CK,len=*),parameter :: horizontal_tab = achar(9, kind=CK) !! JSON special character
character(kind=CK,len=*),parameter :: newline = achar(10, kind=CK) !! JSON special character
character(kind=CK,len=*),parameter :: formfeed = achar(12, kind=CK) !! JSON special character
character(kind=CK,len=*),parameter :: carriage_return = achar(13, kind=CK) !! JSON special character
!> default real number format statement (for writing real values to strings and files).
! Note that this can be overridden by calling [[json_initialize]].
#ifdef REAL32
character(kind=CDK,len=*),parameter :: default_real_fmt = '(ss,E17.8E3)'
#elif REAL128
character(kind=CDK,len=*),parameter :: default_real_fmt = '(ss,E46.35E5)'
#else
character(kind=CDK,len=*),parameter :: default_real_fmt = '(ss,E27.17E4)'
#endif
character(kind=CK,len=*),parameter :: star = CK_'*' !! for invalid numbers and
!! list-directed real output
#if defined __GFORTRAN__
!not parameters due to gfortran bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65141)
character(kind=CK,len=26),protected :: upper = CK_'ABCDEFGHIJKLMNOPQRSTUVWXYZ' !! uppercase characters
character(kind=CK,len=26),protected :: lower = CK_'abcdefghijklmnopqrstuvwxyz' !! lowercase characters
#else
character(kind=CK,len=*),parameter :: upper = CK_'ABCDEFGHIJKLMNOPQRSTUVWXYZ' !! uppercase characters
character(kind=CK,len=*),parameter :: lower = CK_'abcdefghijklmnopqrstuvwxyz' !! lowercase characters
#endif
#if defined __GFORTRAN__
!not parameters due to gfortran bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65141)
character(kind=CK,len=4),protected :: null_str = CK_'null' !! JSON Null variable string
character(kind=CK,len=4),protected :: true_str = CK_'true' !! JSON logical True string
character(kind=CK,len=5),protected :: false_str = CK_'false' !! JSON logical False string
#else
character(kind=CK,len=*),parameter :: null_str = CK_'null' !! JSON Null variable string
character(kind=CK,len=*),parameter :: true_str = CK_'true' !! JSON logical True string
character(kind=CK,len=*),parameter :: false_str = CK_'false' !! JSON logical False string
#endif
integer, private :: i_ !! just a counter for `control_chars` array
character(kind=CK,len=*),dimension(32),parameter :: control_chars = &
[(achar(i_,kind=CK),i_=1,31), achar(127,kind=CK)] !! Control characters, possibly in unicode
!find out the precision of the floating point number system
!and set safety factors
integer(IK),parameter :: rp_safety_factor = 1_IK
integer(IK),parameter :: rp_addl_safety = 2_IK
integer(IK),parameter :: real_precision = rp_safety_factor*precision(1.0_RK) + &
rp_addl_safety
!Get the number of possible digits in the exponent when using decimal number system
integer(IK),parameter :: maxexp = maxexponent(1.0_RK)
integer(IK),parameter :: minexp = minexponent(1.0_RK)
integer(IK),parameter :: real_exponent_digits = floor( 1_IK + log10( &
real(max(maxexp,abs(maxexp)),&
kind=RK) ) )
integer(IK),parameter :: max_numeric_str_len = real_precision + real_exponent_digits + 6_IK
!! 6 = sign + leading 0 + decimal + 'E' + exponent sign + 1 extra
character(kind=CDK,len=*),parameter :: int_fmt = '(ss,I0)' !! minimum width format for integers
integer(IK),parameter :: max_integer_str_len = 256_IK !! maximum string length of an integer.
!! This is totally arbitrary (any way
!! to get the compiler to tell us this?)
integer(IK),parameter :: chunk_size = 256_IK !! for allocatable strings: allocate chunks of this size
integer(IK),parameter :: unit2str = -1_IK !! unit number to cause stuff to be
!! output to strings rather than files.
!! See 9.5.6.12 in the F2003/08 standard
character(kind=CK,len=*),parameter :: blank_chunk = repeat(space, chunk_size) !! a blank string
integer(IK),parameter :: seq_chunk_size = 256_IK !! chunk size for reading sequential files
integer(IK),parameter :: stream_chunk_size = 256_IK !! chunk size for reading stream files
integer(IK),parameter :: print_str_chunk_size = 1000_IK !! chunk size for writing JSON to a string
integer(IK),parameter :: pushed_char_size = 10_IK !! size for `pushed_char`
!! array in [[json_core(type)]]
end module json_parameters
!*****************************************************************************************