3 use,
intrinsic :: iso_fortran_env
14 if (command_argument_count() /= 1)
then
19 call get_command_argument(1, path)
22 call check_call(reader%open_path(trim(path)),
"opening path")
23 call check_call(frame%initialise(reader),
"initialising frame")
28 call check_call(frame%column_count(ncols),
"getting column count")
31 call check_call(decoder%initialise(),
"initialising decoder")
32 call check_call(decoder%defaults_from_frame(frame),
"setting decoder structure")
33 call check_call(decoder%decode(frame, nrows),
"decoding data")
35 call check_call(decoder%free(),
"cleaning up decoder")
42 call check_call(reader%close(),
"closing reader")
47 integer,
intent(in) :: err
48 character(*),
intent(in) :: desc
51 write(error_unit, *)
'**** An error occurred in ODC library'
52 write(error_unit, *)
'Description: ', desc
59 write(error_unit,*)
'Usage:'
60 write(error_unit,*)
' odc-fortran-ls <odb2 file>'
65 integer,
intent(in) :: ncols
66 character(:),
allocatable :: name_str
71 call check_call(frame%column_attributes(col, name=name_str),
"getting column name")
72 write(output_unit,
'(3a)', advance=
'no')
'. ', name_str, char(9)
80 integer(8),
intent(in) :: nrows
81 integer,
intent(in) :: ncols
83 real(8),
pointer :: array_data(:,:)
84 integer :: ncols_decoder, ncols_frame, col, current_index
85 integer(8) :: missing_integer
86 real(8) :: missing_double
87 integer,
dimension(ncols) :: types, sizes, indexes
89 call check_call(decoder%data(array_data),
"getting access to data")
91 call check_call(decoder%column_count(ncols_decoder),
"getting decoder column count")
92 call check_call(frame%column_count(ncols_frame),
"getting frame column count")
93 if (ncols_decoder /= ncols_frame .or. ncols_decoder /= ncols)
then
94 write(error_unit, *)
'Something went wrong in the decode target initialisation'
100 call check_call(frame%column_attributes(col, type=types(col)),
"getting column type")
101 call check_call(decoder%column_data_array(col, element_size_doubles=sizes(col)),
"getting element size")
102 indexes(col) = current_index
103 current_index = current_index + sizes(col)
111 select case(types(col))
113 if (int(array_data(row, indexes(col))) == missing_integer)
then
114 write(output_unit,
'(a)', advance=
'no')
'.'
116 call write_integer(output_unit, int(array_data(row, indexes(col))))
119 if (int(array_data(row, indexes(col))) == 0)
then
120 write(output_unit,
'(a)', advance=
'no')
'.'
122 call write_integer(output_unit, int(array_data(row, indexes(col))))
125 if (array_data(row, indexes(col)) == missing_double)
then
126 write(output_unit,
'(a)', advance=
'no')
'.'
128 call write_double(output_unit, array_data(row, indexes(col)))
131 call write_string(output_unit, array_data(row, indexes(col):(indexes(col)+sizes(col)-1)))
133 write(output_unit,
'(a)', advance=
'no')
'<unknown>'
135 write(output_unit,
'(a)', advance=
'no') char(9)
137 write(output_unit, *)
142 integer,
intent(in) :: iunit, i
145 write(iunit,
'(a)', advance=
'no') trim(adjustl(val))
149 integer,
intent(in) :: iunit
150 real(8),
intent(in) :: r
153 write(iunit,
'(a)', advance=
'no') trim(adjustl(val))
157 integer,
intent(in) :: iunit
158 real(8),
intent(in),
dimension(:) :: double_string
159 character(8*size(double_string)) :: strtmp
160 if (all(transfer(double_string, 1_8,
size(double_string)) == 0))
then
161 write(iunit,
'(a)', advance=
'no')
'.'
163 write(iunit,
'(a)', advance=
'no') trim(adjustl(transfer(double_string, strtmp)))
const char * odc_error_string(int err)
integer(c_int), parameter, public odc_real
integer, parameter, public odc_iteration_complete
integer(c_int), parameter, public odc_string
integer(c_int), parameter, public odc_double
integer(c_int), parameter, public odc_bitfield
integer(c_int), parameter, public odc_integer
integer, parameter, public odc_success
subroutine write_integer(iunit, i)
subroutine write_data(decoder, frame, nrows, ncols)
subroutine write_double(iunit, r)
subroutine write_string(iunit, double_string)
subroutine write_header(frame, ncols)
subroutine check_call(err, desc)