mirror of https://gitlab.com/QEF/q-e.git
7299 lines
205 KiB
Fortran
7299 lines
205 KiB
Fortran
# 1 "iotk_error.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_error.spp"
|
|
|
|
# 33 "iotk_error.spp"
|
|
|
|
! ERROR ROUTINES
|
|
subroutine iotk_error_init_e(error)
|
|
use iotk_base
|
|
implicit none
|
|
type(iotk_error), intent(out) :: error
|
|
nullify(error%str)
|
|
end subroutine iotk_error_init_e
|
|
|
|
subroutine iotk_error_init_i(ierr)
|
|
implicit none
|
|
integer, intent(out) :: ierr
|
|
ierr = 0
|
|
end subroutine iotk_error_init_i
|
|
|
|
subroutine iotk_error_clear_e(error)
|
|
use iotk_base
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
if(associated(error%str)) deallocate(error%str)
|
|
end subroutine iotk_error_clear_e
|
|
|
|
subroutine iotk_error_clear_i(ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
if(abs(ierr)>0 .and. abs(ierr)<=iotk_error_pool_size) then
|
|
if(iotk_error_pool_used(abs(ierr))) then
|
|
call iotk_error_clear(iotk_error_pool(abs(ierr)))
|
|
iotk_error_pool_used(abs(ierr)) = .false.
|
|
iotk_error_pool_order(abs(ierr)) = 0
|
|
end if
|
|
end if
|
|
ierr = 0
|
|
end subroutine iotk_error_clear_i
|
|
|
|
function iotk_error_add_x()
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer :: i,ii(1),order
|
|
integer :: iotk_error_add_x
|
|
do i = 1 , iotk_error_pool_size
|
|
if(.not. iotk_error_pool_used(i)) exit
|
|
end do
|
|
if(i>iotk_error_pool_size) then
|
|
order=0
|
|
do order=1,iotk_error_pool_size
|
|
ii = minloc(iotk_error_pool_order,iotk_error_pool_order>=order)
|
|
iotk_error_pool_order(ii(1)) = order
|
|
end do
|
|
if(iotk_error_warn_overflow) then
|
|
write(iotk_error_unit,*) "Warning: ERROR OVERFLOW"
|
|
call iotk_error_print(iotk_error_pool(iotk_error_pool_size),iotk_error_unit)
|
|
end if
|
|
ii = minloc(iotk_error_pool_order)
|
|
i = ii(1)
|
|
call iotk_error_clear(iotk_error_pool(i))
|
|
end if
|
|
iotk_error_pool_order(i) = maxval(iotk_error_pool_order)+1
|
|
iotk_error_pool_used(i) = .true.
|
|
call iotk_error_init(iotk_error_pool(i))
|
|
iotk_error_add_x=i
|
|
end function iotk_error_add_x
|
|
|
|
|
|
subroutine iotk_error_append_e(error,str)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: str
|
|
character, pointer :: tmp(:)
|
|
integer :: i,strlen
|
|
strlen = min(len(str),iotk_error_linelength)
|
|
if(.not.associated(error%str)) then
|
|
allocate(error%str(strlen+1))
|
|
do i = 1 , strlen
|
|
error%str(i) = str(i:i)
|
|
end do
|
|
error%str(strlen+1) = iotk_eos
|
|
else
|
|
tmp => error%str
|
|
allocate(error%str(size(tmp)+strlen+1))
|
|
error%str (1:size(tmp)) = tmp
|
|
do i = 1 , strlen
|
|
error%str (size(tmp)+i) = str(i:i)
|
|
end do
|
|
error%str(size(tmp)+strlen+1) = iotk_eos
|
|
deallocate(tmp)
|
|
end if
|
|
end subroutine iotk_error_append_e
|
|
|
|
subroutine iotk_error_append_i(ierr,str)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: str
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_append(iotk_error_pool(abs(ierr)),str)
|
|
end subroutine iotk_error_append_i
|
|
|
|
subroutine iotk_error_print_e(error,unit)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(in) :: error
|
|
integer, intent(in) :: unit
|
|
integer :: i
|
|
if(.not.associated(error%str)) return
|
|
do i=1,size(error%str)
|
|
if(error%str(i)==iotk_eos) then
|
|
write(unit,"(a)")
|
|
else
|
|
write(unit,"(a)",advance='no') error%str(i)
|
|
end if
|
|
end do
|
|
end subroutine iotk_error_print_e
|
|
|
|
subroutine iotk_error_print_i(ierr,unit)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
integer, intent(in) :: unit
|
|
if(ierr==0) return
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_print(iotk_error_pool(abs(ierr)),unit)
|
|
end subroutine iotk_error_print_i
|
|
|
|
subroutine iotk_error_issue_e(error,sub,file,line)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: sub
|
|
character(len=*), intent(in) :: file
|
|
integer, intent(in) :: line
|
|
call iotk_error_append(error,"# ERROR IN: "//trim(sub)//" ("//trim(file)//":"//trim(iotk_itoa(line))//")")
|
|
end subroutine iotk_error_issue_e
|
|
|
|
subroutine iotk_error_issue_i(ierr,sub,file,line)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: sub
|
|
character(len=*), intent(in) :: file
|
|
integer, intent(in) :: line
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_issue(iotk_error_pool(abs(ierr)),sub,file,line)
|
|
end subroutine iotk_error_issue_i
|
|
|
|
subroutine iotk_error_msg_e(error,msg)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: msg
|
|
call iotk_error_append(error,"# "//msg)
|
|
end subroutine iotk_error_msg_e
|
|
|
|
subroutine iotk_error_msg_i(ierr,msg)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: msg
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_msg(iotk_error_pool(abs(ierr)),msg)
|
|
end subroutine iotk_error_msg_i
|
|
|
|
function iotk_error_check_e(error)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(in) :: error
|
|
logical :: iotk_error_check_e
|
|
iotk_error_check_e = .false.
|
|
if(associated(error%str)) iotk_error_check_e = .true.
|
|
end function iotk_error_check_e
|
|
|
|
function iotk_error_check_i(ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
logical :: iotk_error_check_i
|
|
iotk_error_check_i = .false.
|
|
if(ierr==0) return
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
iotk_error_check_i = .true.
|
|
end function iotk_error_check_i
|
|
|
|
subroutine iotk_error_write_character_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: name
|
|
character(len=*), intent(in) :: val
|
|
integer :: namelen,vallen
|
|
namelen=verify(name,alphabet_//numbers//".()%")-1
|
|
if(namelen<0) namelen=len(name)
|
|
vallen =scan (val,iotk_eos)-1
|
|
if(vallen<0) vallen=len(val)
|
|
call iotk_error_append(error,name(1:namelen)//"="//val(1:vallen))
|
|
end subroutine iotk_error_write_character_e
|
|
|
|
subroutine iotk_error_write_character_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
character(len=*), intent(in) :: val
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_write(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_write_character_i
|
|
|
|
subroutine iotk_error_write_logical_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: name
|
|
logical, intent(in) :: val
|
|
integer :: namelen
|
|
character :: valc
|
|
namelen=verify(name,alphabet_//numbers//".()%")-1
|
|
if(namelen<0) namelen=len(name)
|
|
valc="F"
|
|
if(val) valc="T"
|
|
call iotk_error_append(error,name(1:namelen)//"="//valc)
|
|
end subroutine iotk_error_write_logical_e
|
|
|
|
subroutine iotk_error_write_logical_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
logical, intent(in) :: val
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_write(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_write_logical_i
|
|
|
|
subroutine iotk_error_write_integer_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(inout) :: error
|
|
character(len=*), intent(in) :: name
|
|
integer, intent(in) :: val
|
|
integer :: namelen
|
|
namelen=verify(name,alphabet_//numbers//".()%")-1
|
|
if(namelen<0) namelen=len(name)
|
|
call iotk_error_append(error,name(1:namelen)//"="//trim(iotk_itoa(val)))
|
|
end subroutine iotk_error_write_integer_e
|
|
|
|
subroutine iotk_error_write_integer_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(inout) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
integer, intent(in) :: val
|
|
if(ierr==0) ierr = iotk_error_add()
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_write(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_write_integer_i
|
|
|
|
subroutine iotk_error_scan_character_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(in) :: error
|
|
character(len=*), intent(in) :: name
|
|
#ifdef __IOTK_WORKAROUND6
|
|
character(len=*) :: val
|
|
#else
|
|
character(len=*), intent(out):: val
|
|
#endif
|
|
integer :: i1,i2,i3
|
|
logical :: eos,found
|
|
val=""
|
|
found = .false.
|
|
if(.not.associated(error%str)) return
|
|
do i1 = size(error%str) , 0 , -1
|
|
eos = .false.
|
|
if(i1==0) eos = .true.
|
|
if(.not.eos) then
|
|
if(error%str(i1)==iotk_eos) eos = .true.
|
|
end if
|
|
if(eos) then
|
|
do i2=1,len(name)
|
|
if(i1+i2 > size(error%str)) goto 1
|
|
if(error%str(i1+i2)/=name(i2:i2)) goto 1
|
|
end do
|
|
if(i1+i2 > size(error%str)) goto 1
|
|
if(error%str(i1+i2)/="=") goto 1
|
|
found=.true.
|
|
exit
|
|
end if
|
|
1 continue
|
|
end do
|
|
val=""
|
|
if(found) then
|
|
do i3=1,len(val)
|
|
if(i1+i2+i3>size(error%str)) exit
|
|
if(error%str(i1+i2+i3)==iotk_eos) exit
|
|
val(i3:i3)=error%str(i1+i2+i3)
|
|
end do
|
|
end if
|
|
end subroutine iotk_error_scan_character_e
|
|
|
|
subroutine iotk_error_scan_character_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
#ifdef __IOTK_WORKAROUND6
|
|
character(len=*) :: val
|
|
#else
|
|
character(len=*), intent(out):: val
|
|
#endif
|
|
val = ""
|
|
if(ierr==0) return
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_scan(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_scan_character_i
|
|
|
|
subroutine iotk_error_scan_logical_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(in) :: error
|
|
character(len=*), intent(in) :: name
|
|
logical, intent(out):: val
|
|
character :: valc
|
|
val = .false.
|
|
call iotk_error_scan(error,name,valc)
|
|
if(valc=="T" .or. valc=="t") val=.true.
|
|
end subroutine iotk_error_scan_logical_e
|
|
|
|
subroutine iotk_error_scan_logical_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
logical, intent(out):: val
|
|
val = .false.
|
|
if(ierr==0) return
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_scan(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_scan_logical_i
|
|
|
|
subroutine iotk_error_scan_integer_e(error,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_error), intent(in) :: error
|
|
character(len=*), intent(in) :: name
|
|
integer, intent(out):: val
|
|
character(range(val)+2) :: valc
|
|
call iotk_error_scan(error,name,valc)
|
|
call iotk_atoi(val,valc)
|
|
end subroutine iotk_error_scan_integer_e
|
|
|
|
subroutine iotk_error_scan_integer_i(ierr,name,val)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
character(len=*), intent(in) :: name
|
|
integer, intent(out):: val
|
|
val = 0
|
|
if(ierr==0) return
|
|
if(abs(ierr)>iotk_error_pool_size) return
|
|
if(.not. iotk_error_pool_used(abs(ierr))) return
|
|
call iotk_error_scan(iotk_error_pool(abs(ierr)),name,val)
|
|
end subroutine iotk_error_scan_integer_i
|
|
|
|
function iotk_error_pool_pending_x()
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer :: iotk_error_pool_pending_x
|
|
iotk_error_pool_pending_x = count (iotk_error_pool_used)
|
|
end function iotk_error_pool_pending_x
|
|
|
|
subroutine iotk_error_handler_x(ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ierr
|
|
integer :: pending,i
|
|
#ifdef __IOTK_MPI_ABORT
|
|
include 'mpif.h'
|
|
integer :: ierrx
|
|
#endif
|
|
if(ierr==0) return
|
|
do i = 1 , iotk_error_linelength
|
|
write(iotk_error_unit,"(a)",advance='no') "#"
|
|
end do
|
|
write(iotk_error_unit,*)
|
|
pending = iotk_error_pool_pending()
|
|
if(pending>1) then
|
|
write(iotk_error_unit,"(a)") "# WARNING: there are pending errors"
|
|
do i = 1 , iotk_error_pool_size
|
|
if(iotk_error_pool_used(i) .and. i/=abs(ierr)) then
|
|
write(iotk_error_unit,"(a)") "# PENDING ERROR (ierr="//trim(iotk_itoa(i))//")"
|
|
call iotk_error_print(i,iotk_error_unit)
|
|
end if
|
|
end do
|
|
end if
|
|
write(iotk_error_unit,"(a)") "# UNRECOVERABLE ERROR (ierr="//trim(iotk_itoa(ierr))//")"
|
|
call iotk_error_print(ierr,0)
|
|
do i = 1 , iotk_error_linelength
|
|
write(iotk_error_unit,"(a)",advance='no') "#"
|
|
end do
|
|
write(iotk_error_unit,*)
|
|
#ifdef __IOTK_MPI_ABORT
|
|
call MPI_Abort(MPI_COMM_WORLD,1,ierrx)
|
|
#else
|
|
stop
|
|
#endif
|
|
end subroutine iotk_error_handler_x
|
|
# 1 "iotk_files.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_files.spp"
|
|
|
|
# 33 "iotk_files.spp"
|
|
|
|
# 35 "iotk_files.spp"
|
|
subroutine iotk_copyfile_x(dummy,source,dest,source_unit,dest_unit,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_dummytype), optional :: dummy
|
|
character(len=*), optional, intent(in) :: source
|
|
character(len=*), optional, intent(in) :: dest
|
|
integer, optional, intent(in) :: source_unit
|
|
integer, optional, intent(in) :: dest_unit
|
|
integer, optional, intent(out):: ierr
|
|
integer :: ierrl,unit1,unit2
|
|
integer :: iostat,length
|
|
character(len=iotk_linlenx) :: line
|
|
iostat = 0
|
|
ierrl = 0
|
|
if(present(source) .eqv. present(source_unit)) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 55 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 55 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Use exactly one between source and source_unit')
|
|
goto 1
|
|
end if
|
|
if(present(dest) .eqv. present(dest_unit)) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 59 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 59 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Use exactly one between dest and dest_unit')
|
|
goto 1
|
|
end if
|
|
if(present(source)) then
|
|
call iotk_free_unit(unit1,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 65 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 65 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error searching for a free unit')
|
|
goto 1
|
|
end if
|
|
open(unit1,file=trim(iotk_strpad(source)),iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 70 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 70 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'messaggio')
|
|
# 70 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"sourcefile",trim(iotk_strpad(source)))
|
|
# 70 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"sourceunit",unit1)
|
|
# 70 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
else
|
|
unit1=source_unit
|
|
end if
|
|
if(present(dest)) then
|
|
call iotk_free_unit(unit2,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 79 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
open(unit2,file=trim(iotk_strpad(dest)),iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 84 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 84 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error opening destination file')
|
|
# 84 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"destfile",trim(iotk_strpad(dest)))
|
|
# 84 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"destunit",unit2)
|
|
# 84 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
else
|
|
unit2=dest_unit
|
|
end if
|
|
do
|
|
call iotk_getline(unit1,line,length,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_scan(ierrl,"iostat",iostat)
|
|
if(iostat<0) then
|
|
call iotk_error_clear(ierrl)
|
|
exit
|
|
end if
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 98 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 98 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error reading source file')
|
|
# 98 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"sourceunit",unit1)
|
|
goto 1
|
|
end if
|
|
write(unit2,"(a)",iostat=iostat) line(1:length)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 103 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 103 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing destination file')
|
|
# 103 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"destunit",unit2)
|
|
# 103 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end do
|
|
iostat=0
|
|
if(present(source)) then
|
|
close(unit1,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 111 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 111 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error closing source file')
|
|
# 111 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"sourcefile",trim(iotk_strpad(source)))
|
|
# 111 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"sourceunit",unit1)
|
|
# 111 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(present(dest)) then
|
|
close(unit2,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copyfile_x",__FILE__,__LINE__)
|
|
# 118 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 118 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error closing destination file')
|
|
# 118 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"destfile",trim(iotk_strpad(dest)))
|
|
# 118 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"destunit",unit2)
|
|
# 118 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_copyfile_x
|
|
|
|
# 131 "iotk_files.spp"
|
|
subroutine iotk_link_x(unit,name,file,dummy,binary,raw,create,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_files_interf
|
|
use iotk_str_interf
|
|
use iotk_write_interf
|
|
use iotk_misc_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
character(*), intent(in) :: file
|
|
type(iotk_dummytype), optional :: dummy
|
|
logical, optional, intent(in) :: binary
|
|
logical, optional, intent(in) :: raw
|
|
logical, optional, intent(in) :: create
|
|
integer, optional, intent(out) :: ierr
|
|
logical :: lbinary,lraw,lcreate
|
|
integer :: ierrl,iostat
|
|
integer :: lunit,link_unit
|
|
type(iotk_unit), pointer :: this_unit
|
|
character(iotk_attlenx) :: attr
|
|
character(iotk_fillenx) :: oldfile
|
|
ierrl = 0
|
|
iostat = 0
|
|
lbinary=.false.
|
|
lraw =.false.
|
|
lcreate=.false.
|
|
if(present(binary)) lbinary = binary
|
|
if(present(raw)) lraw = raw
|
|
if(present(create)) lcreate = create
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(.not.associated(this_unit)) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 166 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 166 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Links do not apply to units which are not explicitly connected')
|
|
goto 1
|
|
end if
|
|
call iotk_write_attr(attr,"iotk_link",iotk_strtrim(file),ierr=ierrl,first=.true.)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 171 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(lraw) then
|
|
if(lbinary) then
|
|
call iotk_write_attr(attr,"iotk_binary",lbinary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 178 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_write_attr(attr,"iotk_raw",lraw,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 184 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_write_begin(unit,name,attr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 190 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_write_comment(unit,"This is a link to the file indicated in the iotk_link attribute",ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 195 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_write_end (unit,name,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 200 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(lcreate) then
|
|
call iotk_free_unit(link_unit,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 206 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
inquire(unit=lunit,name=oldfile,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 211 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 211 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error inquiring')
|
|
# 211 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"unit",lunit)
|
|
# 211 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"file",trim(oldfile))
|
|
# 211 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
call iotk_open_write(link_unit,file=iotk_complete_filepath(file,trim(oldfile)), &
|
|
binary=lbinary,raw=lraw,skip_root=.true.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 217 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_unit_parent(parent=lunit,son=link_unit,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_link",__FILE__,__LINE__)
|
|
# 222 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_link_x
|
|
|
|
# 235 "iotk_files.spp"
|
|
subroutine iotk_open_write_x(unit,file,dummy,attr,binary,new,raw,root,skip_root,skip_head,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_str_interf
|
|
use iotk_write_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), optional, intent(in) :: file
|
|
type(iotk_dummytype), optional :: dummy
|
|
character(*), optional, intent(in) :: attr
|
|
logical, optional, intent(in) :: binary
|
|
logical, optional, intent(in) :: new
|
|
logical, optional, intent(in) :: raw
|
|
character(*), optional, intent(in) :: root
|
|
logical, optional, intent(in) :: skip_root
|
|
logical, optional, intent(in) :: skip_head
|
|
integer, optional, intent(out) :: ierr
|
|
! Opens a file properly
|
|
integer :: iostat
|
|
character(50) :: status,form
|
|
character(iotk_namlenx) :: lroot
|
|
character(iotk_attlenx) :: lattr
|
|
integer :: ierrl
|
|
logical :: lbinary,lraw,lnew,lskip_root,lskip_head
|
|
type (iotk_unit), pointer :: this
|
|
ierrl = 0
|
|
iostat = 0
|
|
lroot = "Root"
|
|
lraw = .false.
|
|
lnew = .false.
|
|
lbinary = .false.
|
|
lskip_root = .false.
|
|
lskip_head = .false.
|
|
if(present(root)) lroot = root
|
|
if(present(raw)) lraw=raw
|
|
if(present(binary)) lbinary = binary
|
|
if(present(new)) lnew = new
|
|
if(present(skip_root)) lskip_root = skip_root
|
|
if(lskip_root) lroot=""
|
|
if(present(skip_head)) lskip_head = skip_head
|
|
if(present(file)) then
|
|
form = "formatted"
|
|
if(lbinary) form = "unformatted"
|
|
status = "unknown"
|
|
if(lnew) status = "new"
|
|
open(unit=unit,file=file,status=status,form=form,position="rewind",iostat=iostat,action="write")
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error opening file')
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"unit",unit)
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"file",file)
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"binary",lbinary)
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"new",lnew)
|
|
# 285 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
else
|
|
call iotk_inquire(unit,binary=lbinary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 291 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(.not.lraw) then
|
|
if(.not.lskip_head) then
|
|
if(.not. lbinary) then
|
|
write(unit,"(a)",iostat=iostat) '<?xml version="1.0"?>'
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 300 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 300 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing XML tag')
|
|
# 300 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"unit",unit)
|
|
# 300 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_write_attr(lattr,"version",trim(iotk_version),first=.true.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 306 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 306 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing version attribute')
|
|
goto 1
|
|
end if
|
|
call iotk_write_pi(unit,"iotk",lattr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 311 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 311 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing version tag')
|
|
goto 1
|
|
end if
|
|
call iotk_write_attr(lattr,"file_version",trim(iotk_file_version),first=.true.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 316 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 316 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing file_version attribute')
|
|
goto 1
|
|
end if
|
|
call iotk_write_pi(unit,"iotk",lattr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 321 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 321 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing version tag')
|
|
goto 1
|
|
end if
|
|
call iotk_write_attr(lattr,"binary",lbinary,first=.true.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 326 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 326 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing binary attribute')
|
|
goto 1
|
|
end if
|
|
call iotk_write_pi(unit,"iotk",lattr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 331 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 331 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing binary tag')
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(.not.lskip_root) then
|
|
lattr(1:1) = iotk_eos
|
|
if(present(attr)) then
|
|
call iotk_strcpy(lattr,attr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 340 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 340 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing attributes from the root tag')
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_write_begin(unit,lroot,attr=lattr,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 346 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 346 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error writing the root tag')
|
|
goto 1
|
|
end if
|
|
end if
|
|
end if
|
|
call iotk_unit_add(unit,this,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_write",__FILE__,__LINE__)
|
|
# 353 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 353 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'Error adding the unit to the list')
|
|
goto 1
|
|
end if
|
|
this%root=lroot
|
|
this%raw=lraw
|
|
this%close_at_end=present(file)
|
|
this%skip_root=lskip_root
|
|
if(lskip_root) this%level = -1
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_open_write_x
|
|
|
|
# 370 "iotk_files.spp"
|
|
recursive subroutine iotk_close_write_x(unit,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_write_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
! Closes a file properly
|
|
logical :: binary
|
|
integer :: ierrl,iostat
|
|
type(iotk_unit), pointer :: this
|
|
nullify(this)
|
|
ierrl = 0
|
|
iostat = 0
|
|
call iotk_unit_get(unit,pointer=this)
|
|
if(.not.associated(this)) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 389 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_inquire(unit,binary,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 394 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(.not.this%raw) then
|
|
if(.not.this%skip_root) then
|
|
call iotk_write_end(unit,this%root,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 401 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
end if
|
|
if(this%close_at_end) then
|
|
if(.not.binary) then
|
|
write(unit,*,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 410 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 410 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'unit')
|
|
# 410 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
close(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 416 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 416 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'unit')
|
|
# 416 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_unit_del(unit,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_write",__FILE__,__LINE__)
|
|
# 422 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_close_write_x
|
|
|
|
|
|
# 435 "iotk_files.spp"
|
|
subroutine iotk_open_read_x(unit,file,dummy,attr,binary,raw,root,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_str_interf
|
|
use iotk_attr_interf
|
|
use iotk_scan_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
use iotk_files_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), optional, intent(in) :: file
|
|
type(iotk_dummytype), optional :: dummy
|
|
logical, optional, intent(in) :: binary
|
|
logical, optional, intent(in) :: raw
|
|
#ifdef __IOTK_WORKARUND6
|
|
character(len=*), optional :: attr
|
|
character(len=*), optional :: root
|
|
#else
|
|
character(len=*), optional, intent(out) :: attr
|
|
character(len=*), optional, intent(out) :: root
|
|
#endif
|
|
integer, optional, intent(out) :: ierr
|
|
character(50) :: status,form
|
|
character(iotk_attlenx) :: lattr
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_namlenx) :: lroot
|
|
type(iotk_unit),pointer :: this
|
|
integer :: ierrl,control,iostat
|
|
logical :: lbinary,lraw
|
|
ierrl = 0
|
|
iostat = 0
|
|
lbinary=.false.
|
|
lraw=.false.
|
|
lroot = " "
|
|
lattr(1:1) = iotk_eos
|
|
if(present(raw)) lraw=raw
|
|
if(present(file)) then
|
|
if(present(binary)) lbinary = binary
|
|
if(.not.lbinary .and. .not. lraw) call iotk_magic(file,lbinary)
|
|
form = "formatted"
|
|
if(lbinary) form = "unformatted"
|
|
open(unit=unit,file=trim(file(1:iotk_strlen(file))),status="old",form=form,position="rewind",iostat=iostat,action="read")
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 479 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 479 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'unit')
|
|
# 479 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"file",file)
|
|
# 479 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"binary",lbinary)
|
|
# 479 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
else
|
|
call iotk_inquire(unit,binary=lbinary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 485 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(.not.lraw) then
|
|
do
|
|
call iotk_scan_tag(unit,+1,control,tag,lbinary,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 493 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
select case(control)
|
|
case(1)
|
|
call iotk_tag_parse(tag,lroot,lattr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 500 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
exit
|
|
case(2:3)
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'End or empty tag at the beginning of a file')
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"unit",unit)
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"file",trim(file(1:iotk_strlen(file))))
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"binary",lbinary)
|
|
# 505 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
case(5)
|
|
call iotk_tag_parse(tag,lroot,lattr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 510 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(iotk_strcomp(lroot,"iotk")) then
|
|
call iotk_check_iotk_attr(unit,lattr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 516 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
end select
|
|
end do
|
|
end if
|
|
if(present(root)) root = lroot
|
|
if(present(attr)) call iotk_strcpy(attr,lattr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 526 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_unit_add(unit,this,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_open_read",__FILE__,__LINE__)
|
|
# 531 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
this%root=lroot
|
|
this%raw=lraw
|
|
this%close_at_end=present(file)
|
|
this%skip_root=.false.
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_open_read_x
|
|
|
|
# 547 "iotk_files.spp"
|
|
subroutine iotk_close_read_x(unit,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
integer :: ierrl
|
|
integer :: iostat
|
|
type(iotk_unit), pointer :: this
|
|
character(iotk_namlenx) :: root
|
|
logical :: raw
|
|
logical :: close_at_end
|
|
ierrl = 0
|
|
iostat = 0
|
|
call iotk_unit_get(unit,pointer=this)
|
|
if(.not.associated(this)) then
|
|
call iotk_error_issue(ierrl,"iotk_close_read",__FILE__,__LINE__)
|
|
# 567 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
root = this%root
|
|
close_at_end = this%close_at_end
|
|
raw = this%raw
|
|
call iotk_unit_del(unit,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_read",__FILE__,__LINE__)
|
|
# 575 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(.not.raw) then
|
|
call iotk_scan_end(unit,root,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_read",__FILE__,__LINE__)
|
|
# 581 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(close_at_end) then
|
|
close(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_close_read",__FILE__,__LINE__)
|
|
# 588 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 588 "iotk_files.spp"
|
|
call iotk_error_msg(ierrl,'unit')
|
|
# 588 "iotk_files.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_close_read_x
|
|
|
|
subroutine iotk_magic_x(file,binary)
|
|
use iotk_base
|
|
use iotk_str_interf
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_unit_interf
|
|
use iotk_attr_interf
|
|
character(len=*), intent(in) :: file
|
|
logical, intent(out):: binary
|
|
integer :: iostat,unit,control,ierrl
|
|
logical :: found,opened
|
|
character(len=iotk_taglenx) :: tag
|
|
character(len=iotk_namlenx) :: name
|
|
character(len=iotk_attlenx) :: attr
|
|
binary=.false.
|
|
call iotk_free_unit(unit)
|
|
open(unit=unit,file=trim(file(1:iotk_strlen(file))),status="old",form="unformatted", &
|
|
position="rewind",iostat=iostat,action="read")
|
|
if(iostat/=0) goto 1
|
|
do
|
|
call iotk_scan_tag(unit,+1,control,tag,.true.,ierrl)
|
|
if(ierrl/=0) goto 1
|
|
if(control==1) then
|
|
exit
|
|
else if(control==5) then
|
|
call iotk_tag_parse(tag,name,attr,ierrl)
|
|
if(iotk_strcomp(name,"iotk")) then
|
|
call iotk_scan_attr(attr,"binary",binary,found=found,ierr=ierrl)
|
|
if(ierrl/=0) goto 1
|
|
if(found) goto 1
|
|
end if
|
|
end if
|
|
end do
|
|
1 continue
|
|
if(ierrl/=0) call iotk_error_clear(ierrl)
|
|
inquire(unit=unit,opened=opened)
|
|
if(opened) close(unit,iostat=iostat)
|
|
end subroutine iotk_magic_x
|
|
# 1 "iotk_fmt.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_fmt.spp"
|
|
|
|
# 33 "iotk_fmt.spp"
|
|
|
|
function iotk_basefmt_x(type,ikind,ilen)
|
|
use iotk_base
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(100) :: iotk_basefmt_x
|
|
integer, intent(in) :: ikind,ilen
|
|
character(*), intent(in) :: type
|
|
integer :: nexp,exp,ndig,baselen
|
|
logical, save :: first_call = .true.
|
|
# 45 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
integer (__IOTK_INTEGER1) :: example_INTEGER1
|
|
character(46), save :: save_basefmt_integer1 = ""
|
|
#endif
|
|
#ifdef __IOTK_REAL1
|
|
real (__IOTK_REAL1) :: example_REAL1
|
|
character(46), save :: save_basefmt_real1 = ""
|
|
#endif
|
|
# 45 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
integer (__IOTK_INTEGER2) :: example_INTEGER2
|
|
character(46), save :: save_basefmt_integer2 = ""
|
|
#endif
|
|
#ifdef __IOTK_REAL2
|
|
real (__IOTK_REAL2) :: example_REAL2
|
|
character(46), save :: save_basefmt_real2 = ""
|
|
#endif
|
|
# 45 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
integer (__IOTK_INTEGER3) :: example_INTEGER3
|
|
character(46), save :: save_basefmt_integer3 = ""
|
|
#endif
|
|
#ifdef __IOTK_REAL3
|
|
real (__IOTK_REAL3) :: example_REAL3
|
|
character(46), save :: save_basefmt_real3 = ""
|
|
#endif
|
|
# 45 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
integer (__IOTK_INTEGER4) :: example_INTEGER4
|
|
character(46), save :: save_basefmt_integer4 = ""
|
|
#endif
|
|
#ifdef __IOTK_REAL4
|
|
real (__IOTK_REAL4) :: example_REAL4
|
|
character(46), save :: save_basefmt_real4 = ""
|
|
#endif
|
|
# 54 "iotk_fmt.spp"
|
|
if(first_call) then
|
|
# 56 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
baselen = range(example_INTEGER1) + 1
|
|
save_basefmt_integer1 = "(i"//trim(iotk_itoa(baselen))//")"
|
|
#endif
|
|
#ifdef __IOTK_REAL1
|
|
ndig = precision(example_REAL1)+1
|
|
exp = range(example_REAL1)+1
|
|
nexp = 1
|
|
do
|
|
if(exp < 10) exit
|
|
exp = exp / 10
|
|
nexp = nexp + 1
|
|
end do
|
|
baselen = nexp+ndig-1+5
|
|
save_basefmt_real1 = "(ES"//trim(iotk_itoa(baselen))//"." &
|
|
//trim(iotk_itoa(ndig-1))//"E"//trim(iotk_itoa(nexp))//")"
|
|
|
|
#endif
|
|
# 56 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
baselen = range(example_INTEGER2) + 1
|
|
save_basefmt_integer2 = "(i"//trim(iotk_itoa(baselen))//")"
|
|
#endif
|
|
#ifdef __IOTK_REAL2
|
|
ndig = precision(example_REAL2)+1
|
|
exp = range(example_REAL2)+1
|
|
nexp = 1
|
|
do
|
|
if(exp < 10) exit
|
|
exp = exp / 10
|
|
nexp = nexp + 1
|
|
end do
|
|
baselen = nexp+ndig-1+5
|
|
save_basefmt_real2 = "(ES"//trim(iotk_itoa(baselen))//"." &
|
|
//trim(iotk_itoa(ndig-1))//"E"//trim(iotk_itoa(nexp))//")"
|
|
|
|
#endif
|
|
# 56 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
baselen = range(example_INTEGER3) + 1
|
|
save_basefmt_integer3 = "(i"//trim(iotk_itoa(baselen))//")"
|
|
#endif
|
|
#ifdef __IOTK_REAL3
|
|
ndig = precision(example_REAL3)+1
|
|
exp = range(example_REAL3)+1
|
|
nexp = 1
|
|
do
|
|
if(exp < 10) exit
|
|
exp = exp / 10
|
|
nexp = nexp + 1
|
|
end do
|
|
baselen = nexp+ndig-1+5
|
|
save_basefmt_real3 = "(ES"//trim(iotk_itoa(baselen))//"." &
|
|
//trim(iotk_itoa(ndig-1))//"E"//trim(iotk_itoa(nexp))//")"
|
|
|
|
#endif
|
|
# 56 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
baselen = range(example_INTEGER4) + 1
|
|
save_basefmt_integer4 = "(i"//trim(iotk_itoa(baselen))//")"
|
|
#endif
|
|
#ifdef __IOTK_REAL4
|
|
ndig = precision(example_REAL4)+1
|
|
exp = range(example_REAL4)+1
|
|
nexp = 1
|
|
do
|
|
if(exp < 10) exit
|
|
exp = exp / 10
|
|
nexp = nexp + 1
|
|
end do
|
|
baselen = nexp+ndig-1+5
|
|
save_basefmt_real4 = "(ES"//trim(iotk_itoa(baselen))//"." &
|
|
//trim(iotk_itoa(ndig-1))//"E"//trim(iotk_itoa(nexp))//")"
|
|
|
|
#endif
|
|
# 75 "iotk_fmt.spp"
|
|
first_call = .false.
|
|
end if
|
|
select case(type)
|
|
case("LOGICAL")
|
|
iotk_basefmt_x = "(l1)"
|
|
case("INTEGER")
|
|
select case(ikind)
|
|
# 83 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
case(__IOTK_INTEGER1)
|
|
iotk_basefmt_x = save_basefmt_integer1
|
|
#endif
|
|
# 83 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
case(__IOTK_INTEGER2)
|
|
iotk_basefmt_x = save_basefmt_integer2
|
|
#endif
|
|
# 83 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
case(__IOTK_INTEGER3)
|
|
iotk_basefmt_x = save_basefmt_integer3
|
|
#endif
|
|
# 83 "iotk_fmt.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
case(__IOTK_INTEGER4)
|
|
iotk_basefmt_x = save_basefmt_integer4
|
|
#endif
|
|
# 88 "iotk_fmt.spp"
|
|
end select
|
|
case("REAL")
|
|
select case(ikind)
|
|
# 92 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL1
|
|
case(__IOTK_REAL1)
|
|
iotk_basefmt_x = save_basefmt_real1
|
|
#endif
|
|
# 92 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL2
|
|
case(__IOTK_REAL2)
|
|
iotk_basefmt_x = save_basefmt_real2
|
|
#endif
|
|
# 92 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL3
|
|
case(__IOTK_REAL3)
|
|
iotk_basefmt_x = save_basefmt_real3
|
|
#endif
|
|
# 92 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL4
|
|
case(__IOTK_REAL4)
|
|
iotk_basefmt_x = save_basefmt_real4
|
|
#endif
|
|
# 97 "iotk_fmt.spp"
|
|
end select
|
|
case("COMPLEX")
|
|
select case(ikind)
|
|
# 101 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL1
|
|
case(__IOTK_REAL1)
|
|
iotk_basefmt_x = "("//trim(save_basefmt_real1)//",',',"//trim(save_basefmt_real1)//")"
|
|
#endif
|
|
# 101 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL2
|
|
case(__IOTK_REAL2)
|
|
iotk_basefmt_x = "("//trim(save_basefmt_real2)//",',',"//trim(save_basefmt_real2)//")"
|
|
#endif
|
|
# 101 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL3
|
|
case(__IOTK_REAL3)
|
|
iotk_basefmt_x = "("//trim(save_basefmt_real3)//",',',"//trim(save_basefmt_real3)//")"
|
|
#endif
|
|
# 101 "iotk_fmt.spp"
|
|
#ifdef __IOTK_REAL4
|
|
case(__IOTK_REAL4)
|
|
iotk_basefmt_x = "("//trim(save_basefmt_real4)//",',',"//trim(save_basefmt_real4)//")"
|
|
#endif
|
|
# 106 "iotk_fmt.spp"
|
|
end select
|
|
case("CHARACTER")
|
|
if(ilen>=0) then
|
|
iotk_basefmt_x = "(a"//trim(iotk_itoa(ilen))//")"
|
|
else
|
|
iotk_basefmt_x = "(a)"
|
|
end if
|
|
end select
|
|
end function iotk_basefmt_x
|
|
|
|
function iotk_wfmt_x(type,ikind,isize,ilen)
|
|
use iotk_base
|
|
use iotk_xtox_interf
|
|
use iotk_fmt_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: ikind
|
|
character(*), intent(in) :: type
|
|
integer, intent(in) :: isize
|
|
integer, intent(in) :: ilen
|
|
character(150) :: iotk_wfmt_x
|
|
if(isize==1) then
|
|
iotk_wfmt_x = "("//trim(iotk_basefmt(type,ikind,ilen))//")"
|
|
else
|
|
iotk_wfmt_x = "("//trim(iotk_itoa(isize))//"("//trim(iotk_basefmt(type,ikind,ilen)) &
|
|
//",:,','))"
|
|
end if
|
|
!write(0,*) "FMT:"//trim(iotk_wfmt_x)
|
|
end function iotk_wfmt_x
|
|
# 1 "iotk_misc.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_misc.spp"
|
|
|
|
# 33 "iotk_misc.spp"
|
|
|
|
# 35 "iotk_misc.spp"
|
|
subroutine iotk_copy_tag_x(source,dest,dummy,maxsize,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_scan_interf
|
|
use iotk_write_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: source
|
|
integer, intent(in) :: dest
|
|
type(iotk_dummytype),optional :: dummy
|
|
integer, optional, intent(in) :: maxsize
|
|
integer, optional, intent(out) :: ierr
|
|
logical :: source_binary,dest_binary
|
|
integer :: ierrl,control,maxsizel
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_namlenx) :: name
|
|
character(iotk_attlenx) :: attr
|
|
character(iotk_vallenx) :: type
|
|
type(iotk_unit), pointer :: this
|
|
integer :: taglen
|
|
logical :: finish
|
|
ierrl = 0
|
|
maxsizel = -1
|
|
if(present(maxsize)) maxsizel = maxsize
|
|
call iotk_inquire(source,binary=source_binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 64 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
call iotk_inquire(dest ,binary=dest_binary, ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 69 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
call iotk_unit_get(source,pointer=this)
|
|
if(.not.associated(this)) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 74 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
# 74 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,'unit')
|
|
goto 1
|
|
end if
|
|
do
|
|
call iotk_scan_tag(source,+1,control,tag,source_binary,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 80 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
if(control/=4) then ! SKIP FOR COMMENTS
|
|
call iotk_tag_parse(tag,name,attr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 86 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(iotk_strcomp(name,this%root)) then
|
|
call iotk_scan_tag(source,-1,control,tag,source_binary,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 93 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
return
|
|
end if
|
|
select case(control)
|
|
case(1)
|
|
call iotk_scan_attr(attr,"type",type,ierr=ierrl,eos=.true.,default=" ")
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 102 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
if((iotk_strcomp(type,"real") .or. iotk_strcomp(type,"integer") .or. iotk_strcomp(type,"logical") &
|
|
.or. iotk_strcomp(type,"character") .or. iotk_strcomp(type,"complex")) .and. control==1) then
|
|
call iotk_copy_dat(source,dest,source_binary,dest_binary,name,attr,maxsize=maxsizel,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 109 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
call iotk_scan_tag(source,+1,control,tag,source_binary,ierrl)
|
|
else
|
|
call iotk_write_begin(dest,name,attr,ierr=ierrl)
|
|
end if
|
|
case(2)
|
|
call iotk_write_end(dest,name,ierr=ierrl)
|
|
case(3)
|
|
call iotk_write_empty(dest,name,attr,ierr=ierrl)
|
|
case(4)
|
|
call iotk_write_comment(dest,tag,ierr=ierrl)
|
|
case(5)
|
|
call iotk_write_pi(dest,name,attr,ierr=ierrl)
|
|
end select
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_copy_tag",__FILE__,__LINE__)
|
|
# 126 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
end do
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_copy_tag_x
|
|
|
|
# 139 "iotk_misc.spp"
|
|
subroutine iotk_parse_dat_x(attr,type,ikind,isize,ilen,fmt,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_scan_interf
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: attr
|
|
#ifdef __WORKAROUND6
|
|
character(len=*) :: type
|
|
#else
|
|
character(len=*), intent(out) :: type
|
|
#endif
|
|
integer, intent(out) :: ikind
|
|
integer, intent(out) :: isize
|
|
integer, intent(out) :: ilen
|
|
#ifdef __WORKAROUND6
|
|
character(len=*) :: fmt
|
|
#else
|
|
character(len=*), intent(out) :: fmt
|
|
#endif
|
|
integer, intent(out) :: ierr
|
|
character(iotk_vallenx) :: typename
|
|
integer :: typelen
|
|
ierr = 0
|
|
call iotk_scan_attr(attr,"type",typename,ierr=ierr,eos=.true.,default=iotk_eos)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_parse_dat",__FILE__,__LINE__)
|
|
# 167 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
typelen = iotk_strlen(typename)
|
|
type = iotk_toupper(typename)
|
|
call iotk_scan_attr(attr,"kind",ikind,ierr=ierr,default=-1)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_parse_dat",__FILE__,__LINE__)
|
|
# 174 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
call iotk_scan_attr(attr,"size",isize,ierr=ierr,default=-1)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_parse_dat",__FILE__,__LINE__)
|
|
# 179 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
call iotk_scan_attr(attr,"len", ilen, ierr=ierr,default=-1)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_parse_dat",__FILE__,__LINE__)
|
|
# 184 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
call iotk_scan_attr(attr,"fmt", fmt, ierr=ierr,eos=.true.,default="!"//iotk_eos)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_parse_dat",__FILE__,__LINE__)
|
|
# 189 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
end subroutine iotk_parse_dat_x
|
|
|
|
# 195 "iotk_misc.spp"
|
|
subroutine iotk_set_options_x(dummy,unitmin,unitmax,getline_buffer,error_warn_overflow,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_dummytype),optional :: dummy
|
|
integer, optional, intent(in) :: unitmin
|
|
integer, optional, intent(in) :: unitmax
|
|
integer, optional, intent(in) :: getline_buffer
|
|
logical, optional, intent(in) :: error_warn_overflow
|
|
integer, optional, intent(out):: ierr
|
|
integer :: ierrl
|
|
ierrl = 0
|
|
if(present(error_warn_overflow)) then
|
|
iotk_error_warn_overflow = error_warn_overflow
|
|
end if
|
|
if(present(unitmin)) then
|
|
if(unitmin<0) then
|
|
call iotk_error_issue(ierrl,"iotk_set_options",__FILE__,__LINE__)
|
|
# 213 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
iotk_unitmin = unitmin
|
|
end if
|
|
if(present(unitmax)) then
|
|
if(unitmax<iotk_unitmin) then
|
|
call iotk_error_issue(ierrl,"iotk_set_options",__FILE__,__LINE__)
|
|
# 220 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
iotk_unitmax = unitmax
|
|
end if
|
|
if(present(getline_buffer)) then
|
|
if(getline_buffer<1) then
|
|
call iotk_error_issue(ierrl,"iotk_set_options",__FILE__,__LINE__)
|
|
# 227 "iotk_misc.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.17 ")
|
|
goto 1
|
|
end if
|
|
iotk_getline_buffer = getline_buffer
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_set_options_x
|
|
|
|
# 241 "iotk_misc.spp"
|
|
subroutine iotk_get_options_x(dummy,unitmin,unitmax,getline_buffer,error_warn_overflow)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
type(iotk_dummytype),optional :: dummy
|
|
integer, optional, intent(out):: unitmin
|
|
integer, optional, intent(out):: unitmax
|
|
integer, optional, intent(out):: getline_buffer
|
|
logical, optional, intent(out):: error_warn_overflow
|
|
if(present(unitmin)) unitmin = iotk_unitmin
|
|
if(present(unitmax)) unitmax = iotk_unitmax
|
|
if(present(unitmax)) getline_buffer = iotk_getline_buffer
|
|
if(present(error_warn_overflow)) error_warn_overflow = iotk_error_warn_overflow
|
|
end subroutine iotk_get_options_x
|
|
|
|
# 257 "iotk_misc.spp"
|
|
subroutine iotk_print_kinds_x
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
use iotk_xtox_interf
|
|
implicit none
|
|
character(100) :: string
|
|
write(*,"(a,i5)") "Maximum rank : ", iotk_maxrank
|
|
write(*,"(a,i5)") "Maximum rank hard limit : ", iotk_maxrank
|
|
# 266 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL1
|
|
string = "logical(kind="//trim(iotk_itoa(__IOTK_LOGICAL1))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 266 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL2
|
|
string = "logical(kind="//trim(iotk_itoa(__IOTK_LOGICAL2))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 266 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL3
|
|
string = "logical(kind="//trim(iotk_itoa(__IOTK_LOGICAL3))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 266 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL4
|
|
string = "logical(kind="//trim(iotk_itoa(__IOTK_LOGICAL4))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 272 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
string = "integer(kind="//trim(iotk_itoa(__IOTK_INTEGER1))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 272 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
string = "integer(kind="//trim(iotk_itoa(__IOTK_INTEGER2))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 272 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
string = "integer(kind="//trim(iotk_itoa(__IOTK_INTEGER3))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 272 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
string = "integer(kind="//trim(iotk_itoa(__IOTK_INTEGER4))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 278 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL1
|
|
string = "real(kind="//trim(iotk_itoa(__IOTK_REAL1))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 278 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL2
|
|
string = "real(kind="//trim(iotk_itoa(__IOTK_REAL2))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 278 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL3
|
|
string = "real(kind="//trim(iotk_itoa(__IOTK_REAL3))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 278 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL4
|
|
string = "real(kind="//trim(iotk_itoa(__IOTK_REAL4))//")"
|
|
write(*,"(a)") trim(string)
|
|
#endif
|
|
# 283 "iotk_misc.spp"
|
|
string = "character(kind="//trim(iotk_itoa(__IOTK_CHARACTER1))//")"
|
|
write(*,"(a)") trim(string)
|
|
end subroutine iotk_print_kinds_x
|
|
|
|
|
|
# 289 "iotk_misc.spp"
|
|
subroutine iotk_copy_dat_aux_x(source,dest,source_binary,dest_binary,name,type,ikind,isize,ilen,fmt,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_dat_interf
|
|
use iotk_scan_interf
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: source
|
|
integer, intent(in) :: dest
|
|
logical, intent(in) :: source_binary
|
|
logical, intent(in) :: dest_binary
|
|
character(*), intent(in) :: name
|
|
character(*), intent(in) :: type
|
|
integer, intent(in) :: ikind
|
|
integer, intent(in) :: isize
|
|
integer, intent(in) :: ilen
|
|
character(*), intent(in) :: fmt
|
|
integer, intent(out) :: ierr
|
|
|
|
integer :: tmpkind
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL1
|
|
# 317 "iotk_misc.spp"
|
|
LOGICAL (kind=__IOTK_LOGICAL1), allocatable :: dat_LOGICAL1 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL2
|
|
# 317 "iotk_misc.spp"
|
|
LOGICAL (kind=__IOTK_LOGICAL2), allocatable :: dat_LOGICAL2 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL3
|
|
# 317 "iotk_misc.spp"
|
|
LOGICAL (kind=__IOTK_LOGICAL3), allocatable :: dat_LOGICAL3 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL4
|
|
# 317 "iotk_misc.spp"
|
|
LOGICAL (kind=__IOTK_LOGICAL4), allocatable :: dat_LOGICAL4 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
# 317 "iotk_misc.spp"
|
|
INTEGER (kind=__IOTK_INTEGER1), allocatable :: dat_INTEGER1 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
# 317 "iotk_misc.spp"
|
|
INTEGER (kind=__IOTK_INTEGER2), allocatable :: dat_INTEGER2 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
# 317 "iotk_misc.spp"
|
|
INTEGER (kind=__IOTK_INTEGER3), allocatable :: dat_INTEGER3 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
# 317 "iotk_misc.spp"
|
|
INTEGER (kind=__IOTK_INTEGER4), allocatable :: dat_INTEGER4 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# 317 "iotk_misc.spp"
|
|
REAL (kind=__IOTK_REAL1), allocatable :: dat_REAL1 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# 317 "iotk_misc.spp"
|
|
REAL (kind=__IOTK_REAL2), allocatable :: dat_REAL2 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# 317 "iotk_misc.spp"
|
|
REAL (kind=__IOTK_REAL3), allocatable :: dat_REAL3 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# 317 "iotk_misc.spp"
|
|
REAL (kind=__IOTK_REAL4), allocatable :: dat_REAL4 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX1
|
|
# 317 "iotk_misc.spp"
|
|
COMPLEX (kind=__IOTK_COMPLEX1), allocatable :: dat_COMPLEX1 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX2
|
|
# 317 "iotk_misc.spp"
|
|
COMPLEX (kind=__IOTK_COMPLEX2), allocatable :: dat_COMPLEX2 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX3
|
|
# 317 "iotk_misc.spp"
|
|
COMPLEX (kind=__IOTK_COMPLEX3), allocatable :: dat_COMPLEX3 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX4
|
|
# 317 "iotk_misc.spp"
|
|
COMPLEX (kind=__IOTK_COMPLEX4), allocatable :: dat_COMPLEX4 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 313 "iotk_misc.spp"
|
|
#ifdef __IOTK_CHARACTER1
|
|
# 315 "iotk_misc.spp"
|
|
CHARACTER (kind=__IOTK_CHARACTER1,len=ilen), allocatable :: dat_CHARACTER1 (:)
|
|
# 319 "iotk_misc.spp"
|
|
#endif
|
|
# 323 "iotk_misc.spp"
|
|
|
|
! la regola e' semplice
|
|
! SE SOURCE E' BINARIO: usa il kind di source
|
|
! SE SOURCE E' TESTUALE: use il kind di default se e' definito
|
|
! altrimenti usa il primo kind disponibile
|
|
! ad ogni modo, il kind e' calcolato run-time, dunque in futuro lo si potrebbe
|
|
! chiedere all'utente
|
|
ierr=0
|
|
select case(type(1:iotk_strlen(type)))
|
|
# 333 "iotk_misc.spp"
|
|
case("LOGICAL")
|
|
# 337 "iotk_misc.spp"
|
|
if(source_binary) then
|
|
tmpkind=ikind
|
|
else
|
|
tmpkind=0
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL1
|
|
if(tmpkind==0) tmpkind=__IOTK_LOGICAL1
|
|
if(__IOTK_LOGICAL1 == iotk_defkind_LOGICAL) then
|
|
tmpkind=iotk_defkind_LOGICAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL2
|
|
if(tmpkind==0) tmpkind=__IOTK_LOGICAL2
|
|
if(__IOTK_LOGICAL2 == iotk_defkind_LOGICAL) then
|
|
tmpkind=iotk_defkind_LOGICAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL3
|
|
if(tmpkind==0) tmpkind=__IOTK_LOGICAL3
|
|
if(__IOTK_LOGICAL3 == iotk_defkind_LOGICAL) then
|
|
tmpkind=iotk_defkind_LOGICAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL4
|
|
if(tmpkind==0) tmpkind=__IOTK_LOGICAL4
|
|
if(__IOTK_LOGICAL4 == iotk_defkind_LOGICAL) then
|
|
tmpkind=iotk_defkind_LOGICAL
|
|
end if
|
|
#endif
|
|
# 349 "iotk_misc.spp"
|
|
end if
|
|
# 351 "iotk_misc.spp"
|
|
select case(tmpkind)
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL1
|
|
case(__IOTK_LOGICAL1)
|
|
allocate(dat_LOGICAL1(isize))
|
|
call iotk_scan_dat_aux(source,dat_LOGICAL1,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_LOGICAL1,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_LOGICAL1)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL2
|
|
case(__IOTK_LOGICAL2)
|
|
allocate(dat_LOGICAL2(isize))
|
|
call iotk_scan_dat_aux(source,dat_LOGICAL2,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_LOGICAL2,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_LOGICAL2)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL3
|
|
case(__IOTK_LOGICAL3)
|
|
allocate(dat_LOGICAL3(isize))
|
|
call iotk_scan_dat_aux(source,dat_LOGICAL3,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_LOGICAL3,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_LOGICAL3)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_LOGICAL4
|
|
case(__IOTK_LOGICAL4)
|
|
allocate(dat_LOGICAL4(isize))
|
|
call iotk_scan_dat_aux(source,dat_LOGICAL4,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_LOGICAL4,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_LOGICAL4)
|
|
#endif
|
|
# 363 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
# 333 "iotk_misc.spp"
|
|
case("INTEGER")
|
|
# 337 "iotk_misc.spp"
|
|
if(source_binary) then
|
|
tmpkind=ikind
|
|
else
|
|
tmpkind=0
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
if(tmpkind==0) tmpkind=__IOTK_INTEGER1
|
|
if(__IOTK_INTEGER1 == iotk_defkind_INTEGER) then
|
|
tmpkind=iotk_defkind_INTEGER
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
if(tmpkind==0) tmpkind=__IOTK_INTEGER2
|
|
if(__IOTK_INTEGER2 == iotk_defkind_INTEGER) then
|
|
tmpkind=iotk_defkind_INTEGER
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
if(tmpkind==0) tmpkind=__IOTK_INTEGER3
|
|
if(__IOTK_INTEGER3 == iotk_defkind_INTEGER) then
|
|
tmpkind=iotk_defkind_INTEGER
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
if(tmpkind==0) tmpkind=__IOTK_INTEGER4
|
|
if(__IOTK_INTEGER4 == iotk_defkind_INTEGER) then
|
|
tmpkind=iotk_defkind_INTEGER
|
|
end if
|
|
#endif
|
|
# 349 "iotk_misc.spp"
|
|
end if
|
|
# 351 "iotk_misc.spp"
|
|
select case(tmpkind)
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
case(__IOTK_INTEGER1)
|
|
allocate(dat_INTEGER1(isize))
|
|
call iotk_scan_dat_aux(source,dat_INTEGER1,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_INTEGER1,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_INTEGER1)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
case(__IOTK_INTEGER2)
|
|
allocate(dat_INTEGER2(isize))
|
|
call iotk_scan_dat_aux(source,dat_INTEGER2,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_INTEGER2,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_INTEGER2)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
case(__IOTK_INTEGER3)
|
|
allocate(dat_INTEGER3(isize))
|
|
call iotk_scan_dat_aux(source,dat_INTEGER3,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_INTEGER3,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_INTEGER3)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
case(__IOTK_INTEGER4)
|
|
allocate(dat_INTEGER4(isize))
|
|
call iotk_scan_dat_aux(source,dat_INTEGER4,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_INTEGER4,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_INTEGER4)
|
|
#endif
|
|
# 363 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
# 333 "iotk_misc.spp"
|
|
case("REAL")
|
|
# 337 "iotk_misc.spp"
|
|
if(source_binary) then
|
|
tmpkind=ikind
|
|
else
|
|
tmpkind=0
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL1
|
|
if(tmpkind==0) tmpkind=__IOTK_REAL1
|
|
if(__IOTK_REAL1 == iotk_defkind_REAL) then
|
|
tmpkind=iotk_defkind_REAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL2
|
|
if(tmpkind==0) tmpkind=__IOTK_REAL2
|
|
if(__IOTK_REAL2 == iotk_defkind_REAL) then
|
|
tmpkind=iotk_defkind_REAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL3
|
|
if(tmpkind==0) tmpkind=__IOTK_REAL3
|
|
if(__IOTK_REAL3 == iotk_defkind_REAL) then
|
|
tmpkind=iotk_defkind_REAL
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL4
|
|
if(tmpkind==0) tmpkind=__IOTK_REAL4
|
|
if(__IOTK_REAL4 == iotk_defkind_REAL) then
|
|
tmpkind=iotk_defkind_REAL
|
|
end if
|
|
#endif
|
|
# 349 "iotk_misc.spp"
|
|
end if
|
|
# 351 "iotk_misc.spp"
|
|
select case(tmpkind)
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL1
|
|
case(__IOTK_REAL1)
|
|
allocate(dat_REAL1(isize))
|
|
call iotk_scan_dat_aux(source,dat_REAL1,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_REAL1,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_REAL1)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL2
|
|
case(__IOTK_REAL2)
|
|
allocate(dat_REAL2(isize))
|
|
call iotk_scan_dat_aux(source,dat_REAL2,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_REAL2,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_REAL2)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL3
|
|
case(__IOTK_REAL3)
|
|
allocate(dat_REAL3(isize))
|
|
call iotk_scan_dat_aux(source,dat_REAL3,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_REAL3,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_REAL3)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_REAL4
|
|
case(__IOTK_REAL4)
|
|
allocate(dat_REAL4(isize))
|
|
call iotk_scan_dat_aux(source,dat_REAL4,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_REAL4,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_REAL4)
|
|
#endif
|
|
# 363 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
# 333 "iotk_misc.spp"
|
|
case("COMPLEX")
|
|
# 337 "iotk_misc.spp"
|
|
if(source_binary) then
|
|
tmpkind=ikind
|
|
else
|
|
tmpkind=0
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX1
|
|
if(tmpkind==0) tmpkind=__IOTK_COMPLEX1
|
|
if(__IOTK_COMPLEX1 == iotk_defkind_COMPLEX) then
|
|
tmpkind=iotk_defkind_COMPLEX
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX2
|
|
if(tmpkind==0) tmpkind=__IOTK_COMPLEX2
|
|
if(__IOTK_COMPLEX2 == iotk_defkind_COMPLEX) then
|
|
tmpkind=iotk_defkind_COMPLEX
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX3
|
|
if(tmpkind==0) tmpkind=__IOTK_COMPLEX3
|
|
if(__IOTK_COMPLEX3 == iotk_defkind_COMPLEX) then
|
|
tmpkind=iotk_defkind_COMPLEX
|
|
end if
|
|
#endif
|
|
# 342 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX4
|
|
if(tmpkind==0) tmpkind=__IOTK_COMPLEX4
|
|
if(__IOTK_COMPLEX4 == iotk_defkind_COMPLEX) then
|
|
tmpkind=iotk_defkind_COMPLEX
|
|
end if
|
|
#endif
|
|
# 349 "iotk_misc.spp"
|
|
end if
|
|
# 351 "iotk_misc.spp"
|
|
select case(tmpkind)
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX1
|
|
case(__IOTK_COMPLEX1)
|
|
allocate(dat_COMPLEX1(isize))
|
|
call iotk_scan_dat_aux(source,dat_COMPLEX1,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_COMPLEX1,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_COMPLEX1)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX2
|
|
case(__IOTK_COMPLEX2)
|
|
allocate(dat_COMPLEX2(isize))
|
|
call iotk_scan_dat_aux(source,dat_COMPLEX2,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_COMPLEX2,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_COMPLEX2)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX3
|
|
case(__IOTK_COMPLEX3)
|
|
allocate(dat_COMPLEX3(isize))
|
|
call iotk_scan_dat_aux(source,dat_COMPLEX3,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_COMPLEX3,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_COMPLEX3)
|
|
#endif
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_COMPLEX4
|
|
case(__IOTK_COMPLEX4)
|
|
allocate(dat_COMPLEX4(isize))
|
|
call iotk_scan_dat_aux(source,dat_COMPLEX4,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_COMPLEX4,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_COMPLEX4)
|
|
#endif
|
|
# 363 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
# 333 "iotk_misc.spp"
|
|
case("CHARACTER")
|
|
# 335 "iotk_misc.spp"
|
|
tmpkind=iotk_defkind_CHARACTER
|
|
# 351 "iotk_misc.spp"
|
|
select case(tmpkind)
|
|
# 354 "iotk_misc.spp"
|
|
#ifdef __IOTK_CHARACTER1
|
|
case(__IOTK_CHARACTER1)
|
|
allocate(dat_CHARACTER1(isize))
|
|
call iotk_scan_dat_aux(source,dat_CHARACTER1,ikind,ilen,fmt,ierr)
|
|
if(ierr==0) call iotk_write_dat(dest,name,dat_CHARACTER1,ierr=ierr,fmt=fmt)
|
|
deallocate(dat_CHARACTER1)
|
|
#endif
|
|
# 363 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 364 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
# 367 "iotk_misc.spp"
|
|
case default
|
|
call iotk_error_issue(ierr,"iotk_copy_dat_aux",__FILE__,__LINE__)
|
|
# 368 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 368 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'internal error')
|
|
end select
|
|
|
|
end subroutine iotk_copy_dat_aux_x
|
|
|
|
|
|
# 375 "iotk_misc.spp"
|
|
subroutine iotk_copy_dat_x(source,dest,source_binary,dest_binary,name,attr,maxsize,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_write_interf
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: source
|
|
integer, intent(in) :: dest
|
|
logical, intent(in) :: source_binary
|
|
logical, intent(in) :: dest_binary
|
|
character(*), intent(in) :: name
|
|
character(*), intent(in) :: attr
|
|
integer, intent(in) :: maxsize
|
|
integer, intent(out) :: ierr
|
|
character(9) :: type
|
|
integer :: ikind,isize,ilen
|
|
character(iotk_vallenx) :: fmt
|
|
character(iotk_attlenx) :: attr1
|
|
ierr = 0
|
|
call iotk_parse_dat(attr,type,ikind,isize,ilen,fmt,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 398 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(iotk_strcomp(type,iotk_eos)) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 402 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(isize==-1) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 406 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(ilen==-1 .and. iotk_strcomp(type,"CHARACTER")) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 410 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(isize<=maxsize .or. maxsize==-1 .or. dest_binary) then
|
|
call iotk_copy_dat_aux(source,dest,source_binary,dest_binary,name,type,ikind,isize,ilen,fmt,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 416 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
else
|
|
call iotk_strcpy(attr1,attr,ierr=ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 422 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
call iotk_write_attr (attr1,"trunc",.true.,ierr=ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 427 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
call iotk_write_empty(dest,name,attr=attr1,ierr=ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_copy_dat",__FILE__,__LINE__)
|
|
# 432 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
end if
|
|
end subroutine iotk_copy_dat_x
|
|
|
|
# 439 "iotk_misc.spp"
|
|
subroutine iotk_check_iotk_attr_x(unit,attr,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_scan_interf
|
|
use iotk_str_interf
|
|
use iotk_xtox_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(iotk_attlenx), intent(in) :: attr
|
|
integer, intent(out) :: ierr
|
|
character(iotk_vallenx) :: version,file_version
|
|
logical :: binary,rbinary,check,found
|
|
integer :: pos1,pos2,attlen,itmp_major,itmp_minor
|
|
ierr = 0
|
|
call iotk_scan_attr(attr,"file_version",file_version,eos=.true.,ierr=ierr,found=found)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 458 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(found) then
|
|
attlen = iotk_strlen(file_version)
|
|
pos1 = iotk_strscan(file_version,".")
|
|
if(pos1<=1 .or. pos1>=attlen) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 465 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 465 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Problems reading file version')
|
|
# 465 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"file_version",file_version)
|
|
# 465 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"attlen",attlen)
|
|
# 465 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"pos1",pos1)
|
|
return
|
|
end if
|
|
pos2 = pos1 + verify(file_version(pos1+1:attlen),numbers)
|
|
if(pos2==pos1+1) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Problems reading file version')
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"file_version",file_version)
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"attlen",attlen)
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"pos1",pos1)
|
|
# 470 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"pos2",pos2)
|
|
return
|
|
end if
|
|
if(pos2==pos1) pos2 = attlen+1
|
|
call iotk_atoi(itmp_major,file_version(1:pos1-1),check)
|
|
if(.not.check) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 476 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 476 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Problems reading file version')
|
|
# 476 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"file_version",file_version)
|
|
return
|
|
end if
|
|
call iotk_atoi(itmp_minor,file_version(pos1+1:pos2-1),check)
|
|
if(.not.check) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 481 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 481 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Problems reading file version')
|
|
# 481 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"file_version",file_version)
|
|
return
|
|
end if
|
|
if(itmp_major > iotk_file_version_major .or. &
|
|
(itmp_major==iotk_file_version_major .and. itmp_minor > iotk_file_version_minor) ) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 486 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 486 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'File version is newer than internal version')
|
|
# 486 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"file_version",file_version)
|
|
# 486 "iotk_misc.spp"
|
|
call iotk_error_write(ierr,"internal_version",iotk_file_version)
|
|
return
|
|
end if
|
|
end if
|
|
call iotk_scan_attr(attr,"binary",rbinary,ierr=ierr,found=found)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 492 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(found) then
|
|
call iotk_inquire(unit,binary,ierr=ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 498 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
if(rbinary .neqv. binary) then
|
|
call iotk_error_issue(ierr,"iotk_check_iotk_attr",__FILE__,__LINE__)
|
|
# 502 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
return
|
|
end if
|
|
end if
|
|
end subroutine iotk_check_iotk_attr_x
|
|
|
|
# 509 "iotk_misc.spp"
|
|
function iotk_index_scal(index)
|
|
use iotk_base
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
integer, intent(in) :: index
|
|
character(len=range(index)+3) :: iotk_index_scal
|
|
iotk_index_scal="."//iotk_itoa(index)
|
|
end function iotk_index_scal
|
|
|
|
# 519 "iotk_misc.spp"
|
|
function iotk_index_vec(index)
|
|
use iotk_base
|
|
use iotk_xtox_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: index(:)
|
|
character(len=(range(index)+3)*size(index)) :: iotk_index_vec
|
|
integer :: length,i
|
|
length = 0
|
|
iotk_index_vec = " "
|
|
do i = 1,size(index)
|
|
iotk_index_vec(length+1:length+1+(range(index)+3)) = "."//iotk_itoa(index(i))
|
|
length = len_trim(iotk_index_vec)
|
|
end do
|
|
end function iotk_index_vec
|
|
|
|
|
|
# 537 "iotk_misc.spp"
|
|
subroutine iotk_tag_parse_x(tag,name,attr,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(iotk_taglenx), intent(in) :: tag
|
|
character(iotk_namlenx), intent(out) :: name
|
|
character(iotk_attlenx), intent(out) :: attr
|
|
integer, intent(out) :: ierr
|
|
integer :: pos,lenatt,lentag
|
|
ierr = 0
|
|
lentag=iotk_strlen(tag)
|
|
if(verify(tag(1:1),iotk_namcharfirst)/=0) then
|
|
call iotk_error_issue(ierr,"iotk_tag_parse",__FILE__,__LINE__)
|
|
# 551 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 551 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Wrong syntax in tag')
|
|
call iotk_error_write(ierr,"tag",tag(1:lentag))
|
|
return
|
|
end if
|
|
pos = scan(tag(1:lentag)," ")
|
|
if(pos==0) pos=lentag+1
|
|
if(pos>len(name)+1) then
|
|
call iotk_error_issue(ierr,"iotk_tag_parse",__FILE__,__LINE__)
|
|
# 558 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 558 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Tag name too long')
|
|
return
|
|
end if
|
|
name = tag(1:pos-1)
|
|
if(pos<=len(name)) name(pos:pos) = iotk_eos
|
|
lenatt = len_trim(tag(pos:lentag))
|
|
if(lenatt>iotk_attlenx) then
|
|
call iotk_error_issue(ierr,"iotk_tag_parse",__FILE__,__LINE__)
|
|
# 565 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.17 ")
|
|
# 565 "iotk_misc.spp"
|
|
call iotk_error_msg(ierr,'Attribute string too long')
|
|
return
|
|
end if
|
|
if(lenatt>0) then
|
|
attr(1:lenatt) = tag(pos:pos+lenatt-1)
|
|
if(lenatt+1<=len(attr)) attr(lenatt+1:lenatt+1)=iotk_eos
|
|
else
|
|
attr(1:1)=iotk_eos
|
|
end if
|
|
end subroutine iotk_tag_parse_x
|
|
|
|
# 577 "iotk_misc.spp"
|
|
function iotk_complete_filepath_x(newfile,oldfile)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: newfile
|
|
character(len=*), intent(in) :: oldfile
|
|
character(len=len(newfile)+len(oldfile)) :: iotk_complete_filepath_x
|
|
character(len=len(oldfile)) :: prefix
|
|
integer :: pos
|
|
if(newfile(1:1)=="/") then
|
|
iotk_complete_filepath_x = newfile
|
|
else
|
|
pos = scan(oldfile,"/",back=.true.)
|
|
prefix = " "
|
|
if(pos>0) prefix = oldfile(1:pos)
|
|
iotk_complete_filepath_x = trim(prefix)//trim(newfile)
|
|
end if
|
|
end function iotk_complete_filepath_x
|
|
|
|
# 597 "iotk_misc.spp"
|
|
function iotk_check_name_x(name)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: name
|
|
logical :: iotk_check_name_x
|
|
! Checks a single name
|
|
integer :: len_name
|
|
iotk_check_name_x = .true.
|
|
len_name = iotk_strlen_trim(name)
|
|
if(len_name>iotk_namlenx) iotk_check_name_x = .false.
|
|
if(verify(name(1:1),iotk_namcharfirst)/=0) iotk_check_name_x = .false.
|
|
if(len_name>1) then
|
|
if(verify(name(2:len_name),iotk_namchar)/=0) iotk_check_name_x = .false.
|
|
end if
|
|
end function iotk_check_name_x
|
|
# 1 "iotk_str.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_str.spp"
|
|
|
|
# 33 "iotk_str.spp"
|
|
|
|
function iotk_toupper_x(str)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
character(len=len(str)) :: iotk_toupper_x
|
|
integer :: i,pos
|
|
do i = 1,len(str)
|
|
if(str(i:i)==iotk_eos) exit
|
|
pos=scan(lowalphabet,str(i:i))
|
|
if(pos==0) then
|
|
iotk_toupper_x(i:i) = str(i:i)
|
|
else
|
|
iotk_toupper_x(i:i) = upalphabet(pos:pos)
|
|
end if
|
|
end do
|
|
if(i<=len(iotk_toupper_x)) iotk_toupper_x(i:i) = iotk_eos
|
|
end function iotk_toupper_x
|
|
|
|
function iotk_tolower_x(str)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
character(len=len(str)) :: iotk_tolower_x
|
|
integer :: i,pos
|
|
do i = 1,len(str)
|
|
if(str(i:i)==iotk_eos) exit
|
|
pos=scan(upalphabet,str(i:i))
|
|
if(pos==0) then
|
|
iotk_tolower_x(i:i) = str(i:i)
|
|
else
|
|
iotk_tolower_x(i:i) = lowalphabet(pos:pos)
|
|
end if
|
|
end do
|
|
if(i<=len(iotk_tolower_x)) iotk_tolower_x(i:i) = iotk_eos
|
|
end function iotk_tolower_x
|
|
|
|
subroutine iotk_escape_x(to,from)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: from
|
|
#ifdef __IOTK_WORKAROUND6
|
|
character(len=*) :: to
|
|
#else
|
|
character(len=*), intent(out) :: to
|
|
#endif
|
|
integer :: pos,pos1,semic,fromlen
|
|
pos = 1
|
|
pos1 = 1
|
|
fromlen = iotk_strlen(from)
|
|
do
|
|
if(pos>fromlen) exit
|
|
if(from(pos:pos)=="&" .and. pos/=fromlen) then
|
|
semic = scan(from(pos+1:fromlen),";")
|
|
if(semic<=1) to(pos1:pos1)="&"
|
|
select case(from(pos+1:pos+semic-1))
|
|
case("amp")
|
|
to(pos1:pos1)="&"
|
|
case("lt")
|
|
to(pos1:pos1)="<"
|
|
case("gt")
|
|
to(pos1:pos1)=">"
|
|
case("quot")
|
|
to(pos1:pos1)='"'
|
|
case("apos")
|
|
to(pos1:pos1)="'"
|
|
case default
|
|
to(pos1:pos1+semic) = from(pos:pos+semic)
|
|
pos1 = pos1 + semic
|
|
end select
|
|
pos = pos + semic
|
|
else
|
|
to(pos1:pos1)=from(pos:pos)
|
|
end if
|
|
pos = pos + 1
|
|
pos1 = pos1 + 1
|
|
if(pos1>len(to)) exit
|
|
end do
|
|
if(pos1<=len(to)) to(pos1:pos1)=iotk_eos
|
|
end subroutine iotk_escape_x
|
|
|
|
subroutine iotk_deescape_x(to,from,quot,apos)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: from
|
|
#ifdef __IOTK_WORKAROUND6
|
|
character(len=*) :: to
|
|
#else
|
|
character(len=*), intent(out) :: to
|
|
#endif
|
|
logical, optional, intent(in) :: quot,apos
|
|
logical :: lquot,lapos
|
|
integer :: pos,pos1
|
|
lquot=.false.
|
|
lapos=.false.
|
|
if(present(quot)) lquot = quot
|
|
if(present(apos)) lapos = apos
|
|
pos = 1
|
|
pos1 = 1
|
|
do
|
|
if(pos>len(from) .or. pos1>len(to)) exit ! i due test devono essere separati
|
|
if(from(pos:pos)==iotk_eos) exit
|
|
select case(from(pos:pos))
|
|
case("&")
|
|
if(pos1+4<=len(to)) to(pos1:pos1+4)="&"
|
|
pos1=pos1+4
|
|
case("<")
|
|
if(pos1+3<=len(to)) to(pos1:pos1+3)="<"
|
|
pos1=pos1+3
|
|
case(">")
|
|
if(pos1+3<=len(to)) to(pos1:pos1+3)=">"
|
|
pos1=pos1+3
|
|
case('"')
|
|
if(lquot) then
|
|
if(pos1+5<=len(to)) to(pos1:pos1+5)="""
|
|
pos1=pos1+5
|
|
else
|
|
to(pos1:pos1) = from(pos:pos)
|
|
end if
|
|
case("'")
|
|
if(lapos) then
|
|
if(pos1+5<=len(to)) to(pos1:pos1+5)="'"
|
|
pos1=pos1+5
|
|
else
|
|
to(pos1:pos1) = from(pos:pos)
|
|
end if
|
|
case default
|
|
to(pos1:pos1) = from(pos:pos)
|
|
end select
|
|
pos = pos + 1
|
|
pos1 = pos1 + 1
|
|
end do
|
|
if(pos1<=len(to)) to(pos1:pos1)=iotk_eos
|
|
end subroutine iotk_deescape_x
|
|
|
|
function iotk_strtrim_x(str)
|
|
use iotk_base
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
character(len=len(str)) :: iotk_strtrim_x
|
|
integer :: lentrim
|
|
lentrim = len_trim(str(1:iotk_strlen(str)))
|
|
iotk_strtrim_x(1:lentrim) = str(1:lentrim)
|
|
if(lentrim<len(iotk_strtrim_x)) iotk_strtrim_x(lentrim+1:lentrim+1) = iotk_eos
|
|
end function iotk_strtrim_x
|
|
|
|
function iotk_strlen_trim_x(str)
|
|
use iotk_base
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
integer :: iotk_strlen_trim_x
|
|
iotk_strlen_trim_x = len_trim(str(1:iotk_strlen(str)))
|
|
end function iotk_strlen_trim_x
|
|
|
|
function iotk_strscan_x(string,set,back)
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: string
|
|
character(len=*), intent(in) :: set
|
|
logical, optional, intent(in) :: back
|
|
integer :: iotk_strscan_x
|
|
logical :: backl
|
|
backl = .false.
|
|
if(present(back)) backl=back
|
|
iotk_strscan_x = scan(string(1:iotk_strlen(string)),set(1:iotk_strlen(set)),backl)
|
|
end function iotk_strscan_x
|
|
|
|
function iotk_strlen_x(str)
|
|
use iotk_base
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
integer :: iotk_strlen_x
|
|
integer :: pos
|
|
pos = scan(str,iotk_eos) - 1
|
|
if(pos>=0) then
|
|
iotk_strlen_x = pos
|
|
else
|
|
iotk_strlen_x = len(str)
|
|
end if
|
|
end function iotk_strlen_x
|
|
|
|
function iotk_strpad_x(str)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: str
|
|
character(len=len(str)) :: iotk_strpad_x
|
|
integer :: strlen
|
|
strlen = iotk_strlen(str)
|
|
iotk_strpad_x(1:strlen) = str(1:strlen)
|
|
if(strlen<len(iotk_strpad_x)) iotk_strpad_x(strlen+1:) = " "
|
|
end function iotk_strpad_x
|
|
|
|
# 239 "iotk_str.spp"
|
|
subroutine iotk_strcpy_x(to,from,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
#ifdef __IOTK_WORKAROUND6
|
|
character(len=*) :: to
|
|
#else
|
|
character(len=*), intent(out) :: to
|
|
#endif
|
|
character(len=*), intent(in) :: from
|
|
integer, intent(out) :: ierr
|
|
integer :: i,fromlen
|
|
ierr = 0
|
|
do i=1,min(len(from),len(to))
|
|
if(from(i:i)==iotk_eos) exit
|
|
to(i:i)=from(i:i)
|
|
end do
|
|
if(i>len(to) .and. i<=len(from)) then
|
|
if(from(i:i)/=iotk_eos) then
|
|
call iotk_error_issue(ierr,"iotk_strcpy",__FILE__,__LINE__)
|
|
# 259 "iotk_str.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.8 ")
|
|
return
|
|
end if
|
|
end if
|
|
if(i<=len(to)) to(i:i) = iotk_eos
|
|
end subroutine iotk_strcpy_x
|
|
|
|
# 267 "iotk_str.spp"
|
|
subroutine iotk_strcat_x(to,from,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(inout):: to
|
|
character(len=*), intent(in) :: from
|
|
integer, intent(out):: ierr
|
|
integer :: tolen,fromlen
|
|
ierr = 0
|
|
tolen = iotk_strlen(to)
|
|
fromlen = iotk_strlen(from)
|
|
if(tolen+fromlen>len(to)) then
|
|
call iotk_error_issue(ierr,"iotk_strcat",__FILE__,__LINE__)
|
|
# 281 "iotk_str.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.8 ")
|
|
end if
|
|
if(ierr/=0) return
|
|
to(tolen+1:tolen+fromlen) = from(1:fromlen)
|
|
if(tolen+fromlen+1<=len(to)) to(tolen+fromlen+1:tolen+fromlen+1)=iotk_eos
|
|
end subroutine iotk_strcat_x
|
|
|
|
# 289 "iotk_str.spp"
|
|
function iotk_strcomp_x(str1,str2)
|
|
use iotk_base
|
|
implicit none
|
|
logical :: iotk_strcomp_x
|
|
character(len=*), intent(in) :: str1,str2
|
|
integer :: i
|
|
iotk_strcomp_x = .false.
|
|
do i=1,min(len(str1),len(str2))
|
|
if(str1(i:i)/=str2(i:i)) return
|
|
if(str1(i:i)==iotk_eos) exit
|
|
end do
|
|
if(i>len(str1)) then
|
|
if(i<=len(str2)) then
|
|
if(str2(i:i)/=iotk_eos) return
|
|
end if
|
|
else if(i>len(str2)) then
|
|
if(i<=len(str1)) then
|
|
if(str1(i:i)/=iotk_eos) return
|
|
end if
|
|
end if
|
|
iotk_strcomp_x = .true.
|
|
end function iotk_strcomp_x
|
|
# 1 "iotk_unit.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_unit.spp"
|
|
|
|
# 33 "iotk_unit.spp"
|
|
|
|
# 35 "iotk_unit.spp"
|
|
subroutine iotk_free_unit_x(unit,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
implicit none
|
|
! This subroutine sets 'unit' to the number of
|
|
! an I/O unit which is free (i.e. not already opened).
|
|
! The search is carried out starting from unit
|
|
! 'unitmin' in a range of 'nsearch' units.
|
|
! The starting unit for the search is increased at each
|
|
! call, so that a number of subsequent ask can be done
|
|
! obtaining different units.
|
|
integer, intent(out) :: unit
|
|
integer, optional, intent(out) :: ierr
|
|
integer, save :: offset = 0
|
|
logical :: opened,exist
|
|
integer :: isearch,nsearch,unitmin
|
|
integer :: ierrl
|
|
integer :: iostat
|
|
iostat = 0
|
|
unitmin = iotk_unitmin
|
|
nsearch = iotk_unitmax - iotk_unitmin + 1
|
|
ierrl = 0
|
|
do isearch=0,nsearch-1
|
|
unit = modulo(isearch+offset,nsearch) + unitmin
|
|
inquire(unit=unit,opened=opened,exist=exist,iostat=iostat)
|
|
if((.not.opened .and. exist) .or. iostat/=0) exit
|
|
end do
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_free_unit",__FILE__,__LINE__)
|
|
# 63 "iotk_unit.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.9 ")
|
|
# 63 "iotk_unit.spp"
|
|
call iotk_error_msg(ierrl,'Error inquiring')
|
|
# 63 "iotk_unit.spp"
|
|
call iotk_error_write(ierrl,"unit",unit)
|
|
# 63 "iotk_unit.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 1
|
|
end if
|
|
if(isearch>=nsearch) then
|
|
call iotk_error_issue(ierrl,"iotk_free_unit",__FILE__,__LINE__)
|
|
# 67 "iotk_unit.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.9 ")
|
|
# 67 "iotk_unit.spp"
|
|
call iotk_error_msg(ierrl,'There are no units left')
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
offset = modulo(unit - unitmin + 1,nsearch)
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_free_unit_x
|
|
|
|
# 80 "iotk_unit.spp"
|
|
function iotk_phys_unit_x(unit) result(result)
|
|
use iotk_base
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
integer :: result
|
|
integer :: ierrl
|
|
type(iotk_unit), pointer :: this
|
|
ierrl = 0
|
|
result = unit
|
|
if(.not. iotk_units_init) then
|
|
iotk_units_init = .true.
|
|
nullify(iotk_units)
|
|
end if
|
|
call iotk_unit_get(unit,pointer=this)
|
|
if(.not.associated(this)) return
|
|
do
|
|
if(.not. associated(this%son)) exit
|
|
this => this%son
|
|
end do
|
|
result = this%unit
|
|
end function iotk_phys_unit_x
|
|
|
|
# 104 "iotk_unit.spp"
|
|
subroutine iotk_unit_print_x(unit)
|
|
use iotk_base
|
|
use iotk_str_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
type (iotk_unit), pointer :: this
|
|
this => iotk_units
|
|
write(unit,"(a)") "IOTK units"
|
|
do
|
|
if(.not. associated(this)) exit
|
|
write(unit,"(a,i8)") "Unit :",this%unit
|
|
write(unit,"(a,a,a,i8)") "Root :",this%root(1:iotk_strlen_trim(this%root)),"Level:",this%level
|
|
write(unit,"(a,l8)") "Raw :",this%raw
|
|
if(associated(this%son)) then
|
|
write(unit,"(a,i8)") "Son :",this%son%unit
|
|
end if
|
|
if(associated(this%parent)) then
|
|
write(unit,"(a,i8)") "Parent :",this%parent%unit
|
|
end if
|
|
this => this%next
|
|
end do
|
|
write(unit,"(a)") "end IOTK units"
|
|
end subroutine iotk_unit_print_x
|
|
|
|
# 129 "iotk_unit.spp"
|
|
subroutine iotk_unit_add_x(unit,this,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
type (iotk_unit), pointer :: this
|
|
integer, intent(out) :: ierr
|
|
ierr = 0
|
|
if(.not. iotk_units_init) then
|
|
iotk_units_init = .true.
|
|
nullify(iotk_units)
|
|
end if
|
|
this => iotk_units
|
|
do
|
|
if(.not.associated(this)) exit
|
|
if(this%unit == unit) then
|
|
call iotk_error_issue(ierr,"iotk_unit_add",__FILE__,__LINE__)
|
|
# 145 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
# 145 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,'unit')
|
|
return
|
|
end if
|
|
this => this%next
|
|
end do
|
|
allocate(this)
|
|
this%unit = unit
|
|
this%root = ""
|
|
this%skip_root = .false.
|
|
this%raw = .false.
|
|
this%level = 0
|
|
this%close_at_end = .false.
|
|
this%next => iotk_units
|
|
nullify(this%son)
|
|
nullify(this%parent)
|
|
iotk_units => this
|
|
end subroutine iotk_unit_add_x
|
|
|
|
# 164 "iotk_unit.spp"
|
|
subroutine iotk_inquire_x(unit,binary,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_str_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
logical, intent(out) :: binary
|
|
integer, intent(out) :: ierr
|
|
character(50) :: form,access,pad,blank
|
|
logical :: opened
|
|
integer :: iostat
|
|
iostat = 0
|
|
ierr = 0
|
|
inquire(unit=unit,form=form,iostat=iostat,access=access,pad=pad,blank=blank,opened=opened)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_inquire",__FILE__,__LINE__)
|
|
# 180 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
# 180 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,'Error inquiring')
|
|
return
|
|
end if
|
|
if(opened .and. iotk_toupper(form)=="UNFORMATTED") then
|
|
binary = .true.
|
|
else
|
|
binary = .false.
|
|
end if
|
|
if(opened .and. iotk_toupper(access)/="SEQUENTIAL") then
|
|
call iotk_error_issue(ierr,"iotk_inquire",__FILE__,__LINE__)
|
|
# 189 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(.not. binary) then
|
|
if(opened .and. iotk_toupper(blank)/="NULL") then
|
|
call iotk_error_issue(ierr,"iotk_inquire",__FILE__,__LINE__)
|
|
# 194 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(opened .and. iotk_toupper(pad) /="YES") then
|
|
call iotk_error_issue(ierr,"iotk_inquire",__FILE__,__LINE__)
|
|
# 198 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
end if
|
|
end subroutine iotk_inquire_x
|
|
|
|
# 205 "iotk_unit.spp"
|
|
subroutine iotk_unit_del_x(unit,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
integer, intent(out) :: ierr
|
|
type (iotk_unit), pointer :: this,prev
|
|
ierr = 0
|
|
if(.not. iotk_units_init) then
|
|
iotk_units_init = .true.
|
|
nullify(iotk_units)
|
|
end if
|
|
nullify(prev)
|
|
this => iotk_units
|
|
do
|
|
if(.not.associated(this)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_del",__FILE__,__LINE__)
|
|
# 222 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(this%unit == unit) exit
|
|
prev => this
|
|
this => this%next
|
|
end do
|
|
if(associated(this%son)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_del",__FILE__,__LINE__)
|
|
# 230 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(associated(this%parent)) then
|
|
end if
|
|
if(associated(this%parent)) nullify(this%parent%son)
|
|
if(associated(prev)) then
|
|
prev%next => this%next
|
|
else
|
|
iotk_units => this%next
|
|
end if
|
|
deallocate(this)
|
|
end subroutine iotk_unit_del_x
|
|
|
|
# 245 "iotk_unit.spp"
|
|
subroutine iotk_unit_parent_x(parent,son,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: parent,son
|
|
integer, intent(out) :: ierr
|
|
type(iotk_unit), pointer :: this_parent,this_son
|
|
ierr = 0
|
|
call iotk_unit_get(parent,pointer=this_parent)
|
|
if(.not.associated(this_parent)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_parent",__FILE__,__LINE__)
|
|
# 257 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
call iotk_unit_get(son,pointer=this_son)
|
|
if(.not.associated(this_son)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_parent",__FILE__,__LINE__)
|
|
# 262 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(associated(this_parent%son)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_parent",__FILE__,__LINE__)
|
|
# 266 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
if(associated(this_son%parent)) then
|
|
call iotk_error_issue(ierr,"iotk_unit_parent",__FILE__,__LINE__)
|
|
# 270 "iotk_unit.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.9 ")
|
|
return
|
|
end if
|
|
this_parent%son => this_son
|
|
this_son%parent => this_parent
|
|
end subroutine iotk_unit_parent_x
|
|
|
|
# 278 "iotk_unit.spp"
|
|
subroutine iotk_unit_get_x(unit,pointer)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
type(iotk_unit), optional, pointer :: pointer
|
|
type (iotk_unit), pointer :: this
|
|
if(present(pointer)) nullify(pointer)
|
|
if(.not. iotk_units_init) then
|
|
iotk_units_init = .true.
|
|
nullify(iotk_units)
|
|
end if
|
|
this => iotk_units
|
|
do
|
|
if(.not.associated(this)) exit
|
|
if(this%unit == unit) exit
|
|
this => this%next
|
|
end do
|
|
if(associated(this)) then
|
|
if(present(pointer)) pointer => this
|
|
end if
|
|
end subroutine iotk_unit_get_x
|
|
# 1 "iotk_scan.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_scan.spp"
|
|
|
|
! SISTEMARE RAW
|
|
|
|
# 35 "iotk_scan.spp"
|
|
|
|
# 37 "iotk_scan.spp"
|
|
recursive subroutine iotk_scan_begin_x(unit,name,attr,dummy,found,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_attr_interf
|
|
use iotk_scan_interf
|
|
use iotk_files_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(len=*), intent(in) :: name
|
|
#ifdef __WORKAROUND6
|
|
character(len=*), optional :: attr
|
|
#else
|
|
character(len=*), optional, intent(out) :: attr
|
|
#endif
|
|
type(iotk_dummytype), optional :: dummy
|
|
logical, optional, intent(out) :: found
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_namlenx) :: namel
|
|
character(iotk_attlenx) :: attrl
|
|
character(iotk_vallenx) :: link
|
|
logical :: link_binary,link_raw
|
|
integer :: link_unit
|
|
logical :: binary
|
|
integer :: ierrl,iostat
|
|
logical :: link_found,foundl
|
|
type(iotk_unit), pointer :: this_unit
|
|
integer :: lunit
|
|
character(iotk_fillenx) :: oldfile
|
|
ierrl = 0
|
|
if(present(attr)) attr(1:1)=iotk_eos
|
|
foundl = .false.
|
|
call iotk_strcpy(namel,iotk_strtrim(name),ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 73 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
iostat = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(associated(this_unit)) then
|
|
if(this_unit%raw) then
|
|
foundl = .true.
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 87 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_scan(lunit, 1,1,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 92 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) then
|
|
call iotk_scan(lunit,-1,1,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 98 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 98 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'')
|
|
# 98 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",namel)
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) goto 1
|
|
end if
|
|
call iotk_scan_attr(attrl,"iotk_link",link,found=link_found,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 105 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
link_binary=.false.
|
|
if(link_found) then
|
|
call iotk_scan_attr(attrl,"iotk_raw",link_raw,default=.false.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 112 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(link_raw) then
|
|
call iotk_scan_attr(attrl,"iotk_binary",link_binary,default=.false.,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 118 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_free_unit(link_unit,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 124 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
inquire(unit=lunit,name=oldfile,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 129 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_open_read(link_unit,file=iotk_complete_filepath(link,oldfile),attr=attrl, &
|
|
binary=link_binary,raw=link_raw,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 135 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_unit_parent(parent=lunit,son=link_unit,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 140 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
if(present(attr)) call iotk_strcpy(attr,attrl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 146 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(ierrl/=0) foundl=.false.
|
|
if(present(found)) found = foundl
|
|
if(ierrl==0 .and. .not. present(found) .and. .not. foundl) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_begin",__FILE__,__LINE__)
|
|
# 153 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 153 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'Tag not found')
|
|
# 153 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",namel)
|
|
ierrl = - ierrl
|
|
end if
|
|
if(ierrl==0 .and. foundl .and. associated(this_unit)) then
|
|
this_unit%level = this_unit%level + 1
|
|
!write(0,*) "LEVEL=",this_unit%level,"incrementato"
|
|
end if
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl>0 .or. .not.present(found)) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_scan_begin_x
|
|
|
|
# 168 "iotk_scan.spp"
|
|
recursive subroutine iotk_scan_end_x(unit,name,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_files_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_namlenx) :: namel
|
|
logical :: binary,foundl,raw
|
|
character(iotk_attlenx) :: attrl
|
|
integer :: ierrl
|
|
integer :: lunit
|
|
type(iotk_unit), pointer :: this_unit
|
|
ierrl = 0
|
|
raw = .false.
|
|
call iotk_strcpy(namel,iotk_strtrim(name),ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_end",__FILE__,__LINE__)
|
|
# 191 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(associated(this_unit)) then
|
|
if(associated(this_unit%parent) .and. this_unit%level == 0) then
|
|
this_unit => this_unit%parent
|
|
call iotk_close_read(lunit,ierr=ierrl)
|
|
if(ierrl/=0) goto 1
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
end if
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) goto 1
|
|
call iotk_scan(lunit,1,2,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0 .or. .not. foundl) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_end",__FILE__,__LINE__)
|
|
# 209 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 209 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'foundl')
|
|
goto 1
|
|
end if
|
|
if(iotk_strlen(attrl)/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_end",__FILE__,__LINE__)
|
|
# 213 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 213 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'An end tag should not contain attributes')
|
|
# 213 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"name",trim(name))
|
|
# 213 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"attr",attrl)
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) this_unit%level = this_unit%level - 1
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_scan_end_x
|
|
|
|
# 226 "iotk_scan.spp"
|
|
subroutine iotk_scan_pi_x(unit,name,attr,dummy,found,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_unit_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
#ifdef __WORKAROUND6
|
|
character(len=*), optional :: attr
|
|
#else
|
|
character(len=*), optional, intent(out) :: attr
|
|
#endif
|
|
type(iotk_dummytype), optional :: dummy
|
|
logical, optional, intent(out) :: found
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_namlenx) :: namel
|
|
character(iotk_attlenx) :: attrl
|
|
type(iotk_unit), pointer :: this
|
|
logical :: binary,foundl
|
|
integer :: ierrl,lunit
|
|
ierrl = 0
|
|
if(present(attr)) attr(1:1)=iotk_eos
|
|
call iotk_strcpy(namel,iotk_strtrim(name),ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_pi",__FILE__,__LINE__)
|
|
# 253 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this)
|
|
if(associated(this)) then
|
|
if(this%raw) then
|
|
foundl=.true.
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) goto 1
|
|
call iotk_scan(lunit,1,5,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_pi",__FILE__,__LINE__)
|
|
# 268 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) then
|
|
call iotk_scan(lunit,-1,5,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_pi",__FILE__,__LINE__)
|
|
# 274 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 274 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'')
|
|
# 274 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",namel)
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) goto 1
|
|
end if
|
|
if(present(attr)) call iotk_strcpy(attr,attrl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_pi",__FILE__,__LINE__)
|
|
# 281 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
end if
|
|
1 continue
|
|
if(ierrl/=0) foundl=.false.
|
|
if(present(found)) found = foundl
|
|
if(ierrl==0 .and. .not. present(found) .and. .not. foundl) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_pi",__FILE__,__LINE__)
|
|
# 287 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 287 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'Tag not found')
|
|
# 287 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",namel)
|
|
ierrl = - ierrl
|
|
end if
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl>0 .or. .not.present(found)) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_scan_pi_x
|
|
|
|
# 298 "iotk_scan.spp"
|
|
subroutine iotk_scan_empty_x(unit,name,attr,dummy,found,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(len=*), intent(in) :: name
|
|
#ifdef __WORKAROUND6
|
|
character(len=*), optional :: attr
|
|
#else
|
|
character(len=*), optional, intent(out) :: attr
|
|
#endif
|
|
type(iotk_dummytype), optional :: dummy
|
|
logical, optional, intent(out) :: found
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_namlenx) :: namel
|
|
character(iotk_attlenx) :: attrl
|
|
type(iotk_unit),pointer :: this
|
|
logical :: binary,foundl
|
|
integer :: ierrl,lunit
|
|
ierrl = 0
|
|
if(present(attr)) attr(1:1)=iotk_eos
|
|
call iotk_strcpy(namel,iotk_strtrim(name),ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 325 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this)
|
|
if(associated(this)) then
|
|
if(this%raw) then
|
|
foundl=.true.
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 338 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
call iotk_scan(lunit,1,3,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 343 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) then
|
|
call iotk_scan(lunit,-1,3,namel,attrl,binary,foundl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 349 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 349 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'')
|
|
# 349 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",(namel(1:iotk_strlen(namel))))
|
|
goto 1
|
|
end if
|
|
if(.not.foundl) goto 1
|
|
end if
|
|
if(present(attr)) call iotk_strcpy(attr,attrl,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 356 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
end if
|
|
1 continue
|
|
if(ierrl/=0) foundl=.false.
|
|
if(present(found)) found = foundl
|
|
if(ierrl==0 .and. .not. present(found) .and. .not. foundl) then
|
|
call iotk_error_issue(ierrl,"iotk_scan_empty",__FILE__,__LINE__)
|
|
# 362 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 362 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'Tag not found')
|
|
# 362 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"namel",namel)
|
|
ierrl = - ierrl
|
|
end if
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl>0 .or. .not.present(found)) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_scan_empty_x
|
|
|
|
# 373 "iotk_scan.spp"
|
|
subroutine iotk_scan_tag_x(unit,direction,control,tag,binary,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
integer, intent(in) :: direction
|
|
integer, intent(out) :: control
|
|
character(iotk_taglenx), intent(out) :: tag
|
|
logical, intent(in) :: binary
|
|
integer, intent(out) :: ierr
|
|
|
|
integer(iotk_header_kind) :: header
|
|
integer :: taglen,pos,pos1,res,length,iostat
|
|
character(2) :: begin,end
|
|
character(iotk_linlenx) :: line
|
|
character(4) :: predelim
|
|
character(3) :: postdelim
|
|
logical :: found
|
|
ierr = 0
|
|
iostat = 0
|
|
tag = " "
|
|
if(binary) then
|
|
found = .false.
|
|
do
|
|
if(direction<0) then
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 403 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 403 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 403 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
end if
|
|
read(unit,iostat=iostat) header
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 409 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 409 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 409 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
control = modulo(header,iotk_ncontrol+1)
|
|
if(control/=0 .and. control/=128) then
|
|
found = .true.
|
|
taglen = modulo(header/(iotk_ncontrol+1),iotk_taglenx+1)
|
|
read(unit,iostat=iostat) header,tag(1:taglen)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 418 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 418 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 418 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
!!!!!!
|
|
! AGGIUNGO QUESTO PER TOGLIERE I DELIMITATORI DI TAG
|
|
! IN MODO CHE SI POSSANO OPZIONALMENTE METTERE NEI FILE BINARI
|
|
select case(control)
|
|
case(1)
|
|
predelim="<" ; postdelim=">"
|
|
case(2)
|
|
predelim="</" ; postdelim=">"
|
|
case(3)
|
|
predelim="<" ; postdelim="/>"
|
|
case(4)
|
|
predelim="<!--" ; postdelim="-->"
|
|
case(5)
|
|
predelim="<?" ; postdelim="?>"
|
|
end select
|
|
pos = index(tag(1:taglen),trim(predelim))
|
|
if(pos/=0) pos=pos+len(trim(predelim))
|
|
if(pos==0) pos=1
|
|
pos1= index(tag(1:taglen),trim(postdelim),back=.true.)
|
|
if(pos1/=0) pos1=pos1-1
|
|
if(pos1==0) pos1=taglen
|
|
tag(1:1+pos1-pos) = tag(pos:pos1)
|
|
taglen=1+pos1-pos
|
|
!!!!!!
|
|
if(taglen<len(tag)) tag(taglen+1:taglen+1)=iotk_eos
|
|
end if
|
|
if(direction<0) then
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 450 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 450 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 450 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
end if
|
|
if(found) exit
|
|
end do
|
|
if(direction<0) then
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 459 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 459 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 459 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
end if
|
|
else
|
|
! RISISTEMARE IN MODO CHE SI POSSA AVERE NELLA TAG ANCHE < e >
|
|
if(direction>=0) then
|
|
taglen = 0
|
|
do
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 470 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
! pos = scan(line(1:length),"<")
|
|
pos = iotk_strscan(line,"<")
|
|
if(pos/=0) exit
|
|
end do
|
|
do
|
|
! pos1 = scan(line(pos+1:length),">") + pos
|
|
pos1 = iotk_strscan(line(pos+1:),">") + pos
|
|
if(pos1/=pos) exit
|
|
if(taglen+length-pos+1>len(tag)) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 482 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 482 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,'Tag too long')
|
|
return
|
|
end if
|
|
tag(taglen+1:taglen+1) = " "
|
|
tag(taglen+2:taglen+length-pos+1) = line(pos+1:length)
|
|
taglen = taglen+length-pos+1
|
|
pos = 0
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 491 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
end do
|
|
if(taglen+pos1-pos>len(tag)) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 496 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 496 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,'Tag too long')
|
|
return
|
|
end if
|
|
tag(taglen+1:taglen+1) = " "
|
|
tag(taglen+2:taglen+pos1-pos) = line(pos+1:pos1-1)
|
|
taglen =taglen+pos1-pos
|
|
res = len_trim(line(1:length))-pos1 ! LA LUNGHEZZA E' TRIMMATA. IN QUESTO MODO SI VA A CAPO
|
|
! SE CI SONO SOLO SPAZI
|
|
if(res>0) then
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 507 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 507 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 507 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 512 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 517 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 517 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,' ')
|
|
# 517 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
res = length-res
|
|
read(unit,"(a)",iostat=iostat,advance='no') line(1:res)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 523 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 523 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,'length')
|
|
# 523 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"res",res)
|
|
# 523 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
return
|
|
end if
|
|
end if
|
|
! pos = verify(tag," ")
|
|
! pos1 = len_trim(tag(1:taglen))
|
|
! pos1 = taglen
|
|
pos = 2
|
|
pos1=taglen
|
|
else
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 535 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
res = length
|
|
!write(0,*) ">>>",res
|
|
do
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 543 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 548 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
!write(0,*) ">>>%",length,res
|
|
pos = length - res
|
|
pos = scan(line(1:pos),">",back=.true.)
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 556 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
if(pos/=0) exit
|
|
res = 0
|
|
end do
|
|
taglen=len(tag)+1
|
|
do
|
|
pos1 = scan(line(1:pos-1),"<",back=.true.)
|
|
res = taglen
|
|
if(pos1>0) exit
|
|
!CHECK
|
|
tag(res-1:res-1) = " "
|
|
tag(res-pos:res-2) = line(1:pos-1)
|
|
taglen=taglen-pos
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 573 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
call iotk_getline(unit,line,length,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 578 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
backspace(unit,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 583 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
pos = length+1
|
|
end do
|
|
!CHECK
|
|
tag(res-1:res-1) = " "
|
|
tag(res-pos+pos1:res-2) = line(pos1+1:pos-1)
|
|
tag(1:len(tag)-res+pos-pos1+1) =tag(res-pos+pos1:len(tag))
|
|
!write(0,*) "%%%%"//tag(1:len(tag)-res+pos-pos1+1)//"%%%%"
|
|
read(unit,"(a)",iostat=iostat,advance="no") line(1:pos1-1)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan_tag",__FILE__,__LINE__)
|
|
# 595 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
! pos1 = len_trim(tag(1:len(tag)-res+pos-pos1+1))
|
|
pos1 = len(tag)-res+pos-pos1+1-1
|
|
! pos = verify(tag," ")
|
|
pos = 1
|
|
end if
|
|
tag(pos1+1:pos1+1) = iotk_eos
|
|
! write(0,*) "**",direction,"%"//(tag(1:iotk_strlen(tag)))//"%",pos,pos1
|
|
! UNA VOLTA RISISTEMATO SOPRA, FARE CONTROLLI PIU' STRINGENTI QUI
|
|
if(tag(pos:pos)=="/" .and. tag(pos1:pos1)/="/") then
|
|
control = 2
|
|
tag = tag(pos+1:pos1)//iotk_eos
|
|
else if(tag(pos:pos)/="/" .and. tag(pos1:pos1)=="/") then
|
|
control = 3
|
|
tag = tag(pos:pos1-1)//iotk_eos
|
|
else if(tag(pos:pos)=="?" .and. tag(pos1:pos1)=="?") then
|
|
control = 5
|
|
tag = tag(pos+1:pos1-1)//iotk_eos
|
|
else if(tag(pos:pos+2)=="!--" .and. tag(pos1-1:pos1)=="--") then
|
|
control = 4
|
|
tag = tag(pos+3:pos1-2)//iotk_eos
|
|
else
|
|
control = 1
|
|
tag = tag(pos:pos1)//iotk_eos
|
|
end if
|
|
! write(0,*) "**",control,"%"//(tag(1:iotk_strlen(tag)))//"%"
|
|
end if
|
|
end subroutine iotk_scan_tag_x
|
|
|
|
# 627 "iotk_scan.spp"
|
|
subroutine iotk_scan_x(unit,direction,control,name,attr,binary,found,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_scan_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
integer, intent(in) :: direction
|
|
integer, intent(in) :: control
|
|
character(iotk_namlenx), intent(in) :: name
|
|
character(iotk_attlenx), intent(out) :: attr
|
|
logical, intent(in) :: binary
|
|
logical, intent(out) :: found
|
|
integer, intent(out) :: ierr
|
|
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_namlenx) :: r_name
|
|
integer :: level,r_control,pos,pos1
|
|
logical :: lall,match
|
|
|
|
found=.false.
|
|
ierr = 0
|
|
if(control==2 .and. direction<0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 651 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
level = 0
|
|
ierr = 0
|
|
do
|
|
lall=.false.
|
|
if(direction>=0 .and. level==0) lall=.true.
|
|
if(direction<0 .and. level==0 .and. control/=1) lall=.true.
|
|
if(direction<0 .and. level==1 .and. control==1) lall=.true.
|
|
call iotk_scan_tag(unit,direction,r_control,tag,binary,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 663 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
if(r_control==4) cycle
|
|
if(lall .or. r_control==5) then
|
|
call iotk_tag_parse(tag,r_name,attr,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 670 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
# 670 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,'direction')
|
|
# 670 "iotk_scan.spp"
|
|
call iotk_error_write(ierr,"control",control)
|
|
return
|
|
end if
|
|
end if
|
|
match = lall .and. r_control==control .and. iotk_strcomp(r_name,iotk_strtrim(name))
|
|
if(r_control==5) then
|
|
if(r_name=="iotk") then
|
|
call iotk_check_iotk_attr(unit,attr,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 679 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
end if
|
|
end if
|
|
select case(direction)
|
|
case(0:)
|
|
select case(r_control)
|
|
case(1)
|
|
if(level==0 .and. match) exit
|
|
level = level + 1
|
|
case(2)
|
|
if(level==0 .and. match) exit
|
|
if(level==0) then
|
|
call iotk_scan_tag(unit,-1,r_control,tag,binary,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 695 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
return
|
|
end if
|
|
level = level - 1
|
|
case(3)
|
|
if(level==0 .and. match) exit
|
|
case(5)
|
|
if(level==0 .and. match) exit
|
|
end select
|
|
case(:-1)
|
|
select case(r_control)
|
|
case(2)
|
|
level = level + 1
|
|
case(1)
|
|
if(level==1 .and. match) exit
|
|
if(level==0) then
|
|
call iotk_scan_tag(unit,+1,r_control,tag,binary,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 715 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
return
|
|
end if
|
|
return
|
|
end if
|
|
level = level - 1
|
|
case(3)
|
|
if(level==0 .and. match) exit
|
|
case(5)
|
|
if(level==0 .and. match) exit
|
|
end select
|
|
end select
|
|
end do
|
|
if(direction<0) then
|
|
call iotk_scan_tag(unit,+1,r_control,tag,binary,ierr)
|
|
if(ierr/=0) then
|
|
call iotk_error_issue(ierr,"iotk_scan",__FILE__,__LINE__)
|
|
# 731 "iotk_scan.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.14 ")
|
|
end if
|
|
end if
|
|
found=.true.
|
|
end subroutine iotk_scan_x
|
|
|
|
# 738 "iotk_scan.spp"
|
|
subroutine iotk_getline_x(unit,line,length,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
#ifdef __WORKAROUND6
|
|
character(len=*) :: line
|
|
#else
|
|
character(len=*), intent(out) :: line
|
|
#endif
|
|
integer, optional, intent(out) :: length
|
|
integer, optional, intent(out) :: ierr
|
|
integer :: iostat
|
|
#if defined __IOTK_WORKAROUND1
|
|
character(len=iotk_linlenx) :: buffer
|
|
#else
|
|
character(len=iotk_getline_buffer) :: buffer
|
|
#endif
|
|
integer :: pos,buflen,ierrl,pos1
|
|
logical :: eor
|
|
pos = 0
|
|
ierrl=0
|
|
#ifdef __IOTK_WORKAROUND1
|
|
! Prima soluzione: Lettura advancing
|
|
read(unit,"(a)",iostat=iostat) buffer
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_getline",__FILE__,__LINE__)
|
|
# 765 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 765 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'')
|
|
# 765 "iotk_scan.spp"
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 2
|
|
end if
|
|
buflen = len_trim(buffer)
|
|
line(1:buflen) = buffer(1:buflen)
|
|
line(buflen+1:buflen+1) = iotk_eos
|
|
if(present(length)) length = buflen
|
|
#else
|
|
do
|
|
eor = .true.
|
|
read(unit,"(a)",iostat=iostat,eor=1,size=buflen,advance="no") buffer
|
|
3 continue
|
|
eor = .false.
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_getline",__FILE__,__LINE__)
|
|
# 779 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
call iotk_error_write(ierrl,"iostat",iostat)
|
|
goto 2
|
|
end if
|
|
1 continue
|
|
if(buflen==0) exit
|
|
pos1 = min(pos+buflen,len(line))
|
|
line(pos+1:pos1) = buffer(1:pos1-pos)
|
|
pos = pos1
|
|
if(eor .or. pos>=len(line)) exit
|
|
end do
|
|
if(pos<len(line)) line(pos+1:pos+1) = iotk_eos
|
|
if(present(length)) length = pos
|
|
if(pos>=len(line)) then
|
|
call iotk_error_issue(ierrl,"iotk_getline",__FILE__,__LINE__)
|
|
# 793 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 793 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'Line too long')
|
|
read(unit,*,iostat=iostat)
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_getline",__FILE__,__LINE__)
|
|
# 796 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.14 ")
|
|
# 796 "iotk_scan.spp"
|
|
call iotk_error_msg(ierrl,'iostat')
|
|
goto 2
|
|
end if
|
|
end if
|
|
#endif
|
|
2 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
|
|
end subroutine iotk_getline_x
|
|
# 1 "iotk_write.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_write.spp"
|
|
|
|
# 33 "iotk_write.spp"
|
|
|
|
# 35 "iotk_write.spp"
|
|
subroutine iotk_write_begin_x(unit,name,attr,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
use iotk_write_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
character(*), optional, intent(in) :: attr
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_attlenx) :: attrl
|
|
character(iotk_fillenx) :: oldfile
|
|
type(iotk_unit), pointer :: this_unit
|
|
integer :: indent
|
|
logical :: binary
|
|
integer :: ierrl,lunit,link_unit,iostat
|
|
ierrl = 0
|
|
iostat = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
ierrl=0
|
|
indent=0
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(associated(this_unit)) then
|
|
if(this_unit%raw) goto 1
|
|
end if
|
|
if(.not.iotk_check_name(name)) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 65 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
# 65 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,'Wrong tag name')
|
|
# 65 "iotk_write.spp"
|
|
call iotk_error_write(ierrl,"name",name)
|
|
goto 1
|
|
end if
|
|
attrl(1:1)=iotk_eos
|
|
if(present(attr)) then
|
|
call iotk_strcpy(attrl,attr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 72 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_strcpy(tag,iotk_strtrim(name),ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 78 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_strcat(tag,attrl,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 83 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 88 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) indent = iotk_indent*(this_unit%level+1)
|
|
call iotk_write_tag(lunit,1,tag,binary,indent,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_begin",__FILE__,__LINE__)
|
|
# 94 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
# 94 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,'Error writing tag')
|
|
# 94 "iotk_write.spp"
|
|
call iotk_error_write(ierrl,"name",name)
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(ierrl==0 .and. associated(this_unit)) then
|
|
this_unit%level = this_unit%level + 1
|
|
end if
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_write_begin_x
|
|
|
|
# 109 "iotk_write.spp"
|
|
subroutine iotk_write_end_x(unit,name,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_files_interf
|
|
use iotk_write_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_taglenx) :: tag
|
|
logical :: binary
|
|
integer :: ierrl,lunit,indent
|
|
type(iotk_unit), pointer :: this_unit
|
|
ierrl = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
ierrl=0
|
|
indent=0
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(.not.iotk_check_name(name)) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 132 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
# 132 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,'Wrong tag name')
|
|
# 132 "iotk_write.spp"
|
|
call iotk_error_write(ierrl,"name",iotk_strtrim(name))
|
|
goto 1
|
|
end if
|
|
call iotk_strcpy(tag,iotk_strtrim(name),ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 137 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) then
|
|
if(this_unit%raw) goto 2
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 145 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) indent = iotk_indent * this_unit%level
|
|
call iotk_write_tag(lunit,2,tag,binary,indent,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 151 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
2 continue
|
|
if(ierrl==0 .and. associated(this_unit)) then
|
|
this_unit%level = this_unit%level - 1
|
|
end if
|
|
if(associated(this_unit) .and. unit/=lunit) then
|
|
if(associated(this_unit%parent) .and. this_unit%level == -1 .and. this_unit%skip_root) then
|
|
call iotk_close_write(lunit,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 162 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(.not.associated(this_unit)) then
|
|
call iotk_error_issue(ierrl,"iotk_write_end",__FILE__,__LINE__)
|
|
# 168 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_write_end_x
|
|
|
|
# 182 "iotk_write.spp"
|
|
subroutine iotk_write_pi_x(unit,name,attr,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_write_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
character(*), optional, intent(in) :: attr
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_attlenx) :: attrl
|
|
logical :: binary
|
|
integer :: ierrl,lunit,indent
|
|
type(iotk_unit), pointer :: this_unit
|
|
ierrl = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
ierrl=0
|
|
indent=0
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(associated(this_unit)) then
|
|
if(this_unit%raw) goto 1
|
|
end if
|
|
if(.not.iotk_check_name(name)) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 209 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
# 209 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,'Wrong tag name')
|
|
# 209 "iotk_write.spp"
|
|
call iotk_error_write(ierrl,"name",iotk_strtrim(name))
|
|
goto 1
|
|
end if
|
|
attrl(1:1)=iotk_eos
|
|
if(present(attr)) then
|
|
call iotk_strcpy(attrl,attr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 216 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_strcpy(tag,iotk_strtrim(name),ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 222 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_strcat(tag,attrl,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 227 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 232 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) indent = iotk_indent*(this_unit%level+1)
|
|
call iotk_write_tag(lunit,5,tag,binary,indent,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_pi",__FILE__,__LINE__)
|
|
# 238 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_write_pi_x
|
|
|
|
# 250 "iotk_write.spp"
|
|
subroutine iotk_write_comment_x(unit,text,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_write_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: text
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
integer :: ierrl,lunit
|
|
integer :: taglen,indent
|
|
logical :: binary
|
|
character(iotk_taglenx) :: tag
|
|
type(iotk_unit), pointer :: this
|
|
ierrl = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
ierrl=0
|
|
indent = 0
|
|
call iotk_unit_get(lunit,pointer=this)
|
|
if(associated(this)) then
|
|
if(this%raw) goto 1
|
|
end if
|
|
call iotk_deescape(tag,text)
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_comment",__FILE__,__LINE__)
|
|
# 278 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this)) indent = iotk_indent*(this%level+1)
|
|
call iotk_write_tag(lunit,4,tag,binary,indent,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_comment",__FILE__,__LINE__)
|
|
# 284 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_write_comment_x
|
|
|
|
# 296 "iotk_write.spp"
|
|
subroutine iotk_write_empty_x(unit,name,attr,dummy,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_write_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
use iotk_unit_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
character(*), intent(in) :: name
|
|
character(*), optional, intent(in) :: attr
|
|
type(iotk_dummytype), optional :: dummy
|
|
integer, optional, intent(out) :: ierr
|
|
character(iotk_taglenx) :: tag
|
|
character(iotk_attlenx) :: attrl
|
|
type(iotk_unit), pointer :: this_unit
|
|
logical :: binary
|
|
integer :: ierrl,lunit,indent
|
|
indent = 0
|
|
ierrl = 0
|
|
lunit = iotk_phys_unit(unit)
|
|
call iotk_unit_get(lunit,pointer=this_unit)
|
|
if(associated(this_unit)) then
|
|
if(this_unit%raw) goto 1
|
|
end if
|
|
if(.not.iotk_check_name(name)) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 322 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
# 322 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,'Wrong tag name')
|
|
# 322 "iotk_write.spp"
|
|
call iotk_error_write(ierrl,"name",trim(name))
|
|
goto 1
|
|
end if
|
|
attrl(1:1)=iotk_eos
|
|
if(present(attr)) then
|
|
call iotk_strcpy(attrl,attr,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 329 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
end if
|
|
call iotk_strcpy(tag,iotk_strtrim(name),ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 335 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_strcat(tag,attrl,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 340 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
call iotk_inquire(lunit,binary=binary,ierr=ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 345 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
if(associated(this_unit)) indent = iotk_indent*(this_unit%level+1)
|
|
call iotk_write_tag(lunit,3,tag,binary,indent,ierrl)
|
|
if(ierrl/=0) then
|
|
call iotk_error_issue(ierrl,"iotk_write_empty",__FILE__,__LINE__)
|
|
# 351 "iotk_write.spp"
|
|
call iotk_error_msg(ierrl,"CVS Revision: 1.16 ")
|
|
goto 1
|
|
end if
|
|
1 continue
|
|
if(present(ierr)) then
|
|
ierr = ierrl
|
|
else
|
|
if(ierrl/=0) call iotk_error_handler(ierrl)
|
|
end if
|
|
end subroutine iotk_write_empty_x
|
|
|
|
# 363 "iotk_write.spp"
|
|
subroutine iotk_write_tag_x(unit,control,tag,binary,indent,ierr)
|
|
use iotk_base
|
|
use iotk_error_interf
|
|
use iotk_misc_interf
|
|
use iotk_str_interf
|
|
implicit none
|
|
integer, intent(in) :: unit
|
|
integer, intent(in) :: control
|
|
character(iotk_taglenx), intent(in) :: tag
|
|
logical, intent(in) :: binary
|
|
integer, intent(in) :: indent
|
|
integer, intent(out) :: ierr
|
|
integer(iotk_header_kind) :: header,header2
|
|
integer :: taglen,taglenp
|
|
integer :: iostat,pos1,pos2
|
|
integer :: lindent
|
|
character(iotk_maxindent), parameter :: indentstr=""
|
|
character(4) :: begin,end
|
|
lindent = min(len(indentstr),indent)
|
|
iostat = 0
|
|
ierr = 0
|
|
taglen = iotk_strlen(tag)
|
|
select case(control)
|
|
case(1)
|
|
begin = "<"
|
|
end = ">"
|
|
case(2)
|
|
begin = "</"
|
|
end = ">"
|
|
case(3)
|
|
begin = "<"
|
|
end = "/>"
|
|
case(4)
|
|
begin = "<!--"
|
|
end = "-->"
|
|
case(5)
|
|
begin = "<?"
|
|
end = "?>"
|
|
end select
|
|
if(binary) then
|
|
taglenp = taglen + len_trim(begin) + len_trim(end) + 2 + lindent
|
|
header = control + taglenp*(iotk_ncontrol+1)
|
|
header2 = 128 + taglenp*(iotk_ncontrol+1)
|
|
! taglenp e' la lunghezza TOTALE (inclusi delimitatori e newlines)
|
|
write(unit,iostat=iostat) header
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_write_tag",__FILE__,__LINE__)
|
|
# 409 "iotk_write.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.16 ")
|
|
# 409 "iotk_write.spp"
|
|
call iotk_error_msg(ierr,'error writing the header record')
|
|
# 409 "iotk_write.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
end if
|
|
write(unit,iostat=iostat) header2,iotk_newline//indentstr(1:lindent)// &
|
|
trim(begin)//tag(1:taglen)//trim(end)//iotk_newline
|
|
else
|
|
pos1=0
|
|
write(unit,"(a)",iostat=iostat,advance="no") indentstr(1:lindent)//trim(begin)
|
|
do
|
|
if(pos1+iotk_linlen >= taglen ) then
|
|
pos2 = taglen+1
|
|
else
|
|
pos2 = pos1 + scan(tag(pos1+1:pos1+iotk_linlen)," ",back=.true.)
|
|
if(pos2<=pos1) then
|
|
pos2 = pos1+iotk_linlen + scan(tag(pos1+iotk_linlen+1:taglen)," ")
|
|
if(pos2<=pos1+iotk_linlen) pos2=taglen+1
|
|
end if
|
|
end if
|
|
write(unit,"(a)",iostat=iostat,advance="no") tag(pos1+1:pos2-1)
|
|
pos1=pos2
|
|
if(pos1>taglen) exit
|
|
write(unit,*,iostat=iostat)
|
|
end do
|
|
write(unit,"(a)",iostat=iostat) trim(end)
|
|
end if
|
|
if(iostat/=0) then
|
|
call iotk_error_issue(ierr,"iotk_write_tag",__FILE__,__LINE__)
|
|
# 434 "iotk_write.spp"
|
|
call iotk_error_msg(ierr,"CVS Revision: 1.16 ")
|
|
# 434 "iotk_write.spp"
|
|
call iotk_error_msg(ierr,'error writing')
|
|
# 434 "iotk_write.spp"
|
|
call iotk_error_write(ierr,"iostat",iostat)
|
|
end if
|
|
end subroutine iotk_write_tag_x
|
|
# 1 "iotk_xtox.spp"
|
|
! Input/Output Tool Kit (IOTK)
|
|
! Copyright (C) 2004,2005 Giovanni Bussi
|
|
!
|
|
! This library is free software; you can redistribute it and/or
|
|
! modify it under the terms of the GNU Lesser General Public
|
|
! License as published by the Free Software Foundation; either
|
|
! version 2.1 of the License, or (at your option) any later version.
|
|
!
|
|
! This library is distributed in the hope that it will be useful,
|
|
! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
! Lesser General Public License for more details.
|
|
!
|
|
! You should have received a copy of the GNU Lesser General Public
|
|
! License along with this library; if not, write to the Free Software
|
|
! Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
!------------------------------------------------------------------------------!
|
|
! Inclusion of configuration file
|
|
#include "iotk_config.h"
|
|
!------------------------------------------------------------------------------!
|
|
|
|
# 2 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_AUXMACROS
|
|
#define __IOTK_AUXMACROS
|
|
|
|
! The macros are defined with -D option or inside iotk_config.h
|
|
! The default values are set here
|
|
! Maximum rank of an array
|
|
#ifndef __IOTK_MAXRANK
|
|
# define __IOTK_MAXRANK 7
|
|
#endif
|
|
! Minimum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMIN
|
|
# define __IOTK_UNITMIN 90000
|
|
#endif
|
|
! Maximum value used in iotk_free_unit
|
|
#ifndef __IOTK_UNITMAX
|
|
# define __IOTK_UNITMAX 99999
|
|
#endif
|
|
! Unit for errors
|
|
#ifndef __IOTK_ERROR_UNIT
|
|
# define __IOTK_ERROR_UNIT 0
|
|
#endif
|
|
! Kind for header in binary files
|
|
#ifndef __IOTK_HEADER_KIND
|
|
# define __IOTK_HEADER_KIND selected_int_kind(8)
|
|
#endif
|
|
! Character (or eventually string) for newline
|
|
! It may be adjusted for particular systems
|
|
! Unix achar(10)
|
|
! Mac-OS achar(13)
|
|
! Windows ? (now it should be a single byte)
|
|
#ifndef __IOTK_NEWLINE
|
|
# define __IOTK_NEWLINE achar(10)
|
|
#endif
|
|
! Character for EOS
|
|
#ifndef __IOTK_EOS
|
|
# define __IOTK_EOS achar(0)
|
|
#endif
|
|
! These are the default kinds, which depend on the options used
|
|
! during the library compilation
|
|
! Only default characters are implemented
|
|
#define __IOTK_CHARACTER1 iotk_defkind_character
|
|
! For logical, integer and real types, the c precompiler
|
|
! looks for defined kinds. If no kind is found, the default
|
|
! is used as __IOTK_type1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_LOGICAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_LOGICAL1 iotk_defkind_LOGICAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_INTEGER4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_INTEGER1 iotk_defkind_INTEGER
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL1
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL2
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL3
|
|
# 50 "../include/iotk_auxmacros.spp"
|
|
#ifndef __IOTK_REAL4
|
|
# 52 "../include/iotk_auxmacros.spp"
|
|
#define __IOTK_REAL1 iotk_defkind_REAL
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 55 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
# 58 "../include/iotk_auxmacros.spp"
|
|
|
|
! Some useful check follow
|
|
#if __IOTK_MAXRANK > 7
|
|
# error
|
|
#endif
|
|
#if __IOTK_MAXRANK < 1
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_LOGICAL10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_INTEGER10
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL5
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL6
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL7
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL8
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL9
|
|
# error
|
|
#endif
|
|
# 68 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL10
|
|
# error
|
|
#endif
|
|
# 73 "../include/iotk_auxmacros.spp"
|
|
#endif
|
|
|
|
! Complex are treated indentically to reals
|
|
! These lines map the definitions.
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL1
|
|
# define __IOTK_COMPLEX1 __IOTK_REAL1
|
|
#else
|
|
# undef __IOTK_COMPLEX1
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL2
|
|
# define __IOTK_COMPLEX2 __IOTK_REAL2
|
|
#else
|
|
# undef __IOTK_COMPLEX2
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL3
|
|
# define __IOTK_COMPLEX3 __IOTK_REAL3
|
|
#else
|
|
# undef __IOTK_COMPLEX3
|
|
#endif
|
|
# 78 "../include/iotk_auxmacros.spp"
|
|
#ifdef __IOTK_REAL4
|
|
# define __IOTK_COMPLEX4 __IOTK_REAL4
|
|
#else
|
|
# undef __IOTK_COMPLEX4
|
|
#endif
|
|
# 84 "../include/iotk_auxmacros.spp"
|
|
|
|
|
|
# 30 "iotk_xtox.spp"
|
|
|
|
# 33 "iotk_xtox.spp"
|
|
|
|
# 35 "iotk_xtox.spp"
|
|
function iotk_atol_x(a,check)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: a
|
|
logical, optional, intent(out) :: check
|
|
logical :: iotk_atol_x
|
|
integer :: i
|
|
iotk_atol_x = .false.
|
|
if(present(check)) check = .false.
|
|
if(len(a)==0) return
|
|
do i = 1 , len(a)
|
|
if(a(i:i)/=" " .and. a(i:i)/=".") exit
|
|
end do
|
|
if(i>len(a)) return
|
|
if(present(check)) check = .true.
|
|
if(a(i:i)=="T" .or. a(i:i)=="t") then
|
|
iotk_atol_x = .true.
|
|
else if(a(i:i)=="F" .or. a(i:i)=="f") then
|
|
iotk_atol_x = .false.
|
|
else
|
|
if(present(check)) check = .false.
|
|
end if
|
|
end function iotk_atol_x
|
|
|
|
# 61 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
subroutine iotk_atoi1(i,a,check)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: a
|
|
logical, optional, intent(out) :: check
|
|
integer(kind=__IOTK_INTEGER1), intent(out) :: i
|
|
logical :: minus
|
|
integer :: pos,index,ii
|
|
integer(kind=__IOTK_INTEGER1) :: j
|
|
#ifdef __IOTK_WORKAROUND5
|
|
integer(kind=__IOTK_INTEGER1) :: limit(0:9)
|
|
integer(kind=__IOTK_INTEGER1) :: hug
|
|
hug = huge(j)
|
|
limit(0:9) = (/ ((hug-j)/10,j=0,9) /)
|
|
#else
|
|
integer(kind=__IOTK_INTEGER1), parameter :: limit(0:9) = (/ ((huge(j)-j)/10,j=0,9) /)
|
|
#endif
|
|
minus = .false.
|
|
i = 0
|
|
if(present(check)) check = .false.
|
|
if(len(a)==0) return
|
|
do ii = 1 , len(a)
|
|
if(a(ii:ii)/=" ") exit
|
|
end do
|
|
if(ii>len(a)) return
|
|
if(a(ii:ii)=="-") then
|
|
minus = .true.
|
|
ii = ii + 1
|
|
else if(a(ii:ii)=="+") then
|
|
ii = ii + 1
|
|
end if
|
|
if(ii>len(a)) return
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
index = iachar(a(ii:ii)) - iachar("0")
|
|
if(index<0 .or. index>9) exit
|
|
if(i>limit(index)) exit ! Check sull'overflow
|
|
i = i*10 + index
|
|
end do
|
|
if(minus) i = - i
|
|
if(present(check)) then
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
if(a(ii:ii)/=" ") return
|
|
end do
|
|
check = .true.
|
|
end if
|
|
end subroutine iotk_atoi1
|
|
#endif
|
|
# 61 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
subroutine iotk_atoi2(i,a,check)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: a
|
|
logical, optional, intent(out) :: check
|
|
integer(kind=__IOTK_INTEGER2), intent(out) :: i
|
|
logical :: minus
|
|
integer :: pos,index,ii
|
|
integer(kind=__IOTK_INTEGER2) :: j
|
|
#ifdef __IOTK_WORKAROUND5
|
|
integer(kind=__IOTK_INTEGER2) :: limit(0:9)
|
|
integer(kind=__IOTK_INTEGER2) :: hug
|
|
hug = huge(j)
|
|
limit(0:9) = (/ ((hug-j)/10,j=0,9) /)
|
|
#else
|
|
integer(kind=__IOTK_INTEGER2), parameter :: limit(0:9) = (/ ((huge(j)-j)/10,j=0,9) /)
|
|
#endif
|
|
minus = .false.
|
|
i = 0
|
|
if(present(check)) check = .false.
|
|
if(len(a)==0) return
|
|
do ii = 1 , len(a)
|
|
if(a(ii:ii)/=" ") exit
|
|
end do
|
|
if(ii>len(a)) return
|
|
if(a(ii:ii)=="-") then
|
|
minus = .true.
|
|
ii = ii + 1
|
|
else if(a(ii:ii)=="+") then
|
|
ii = ii + 1
|
|
end if
|
|
if(ii>len(a)) return
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
index = iachar(a(ii:ii)) - iachar("0")
|
|
if(index<0 .or. index>9) exit
|
|
if(i>limit(index)) exit ! Check sull'overflow
|
|
i = i*10 + index
|
|
end do
|
|
if(minus) i = - i
|
|
if(present(check)) then
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
if(a(ii:ii)/=" ") return
|
|
end do
|
|
check = .true.
|
|
end if
|
|
end subroutine iotk_atoi2
|
|
#endif
|
|
# 61 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
subroutine iotk_atoi3(i,a,check)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: a
|
|
logical, optional, intent(out) :: check
|
|
integer(kind=__IOTK_INTEGER3), intent(out) :: i
|
|
logical :: minus
|
|
integer :: pos,index,ii
|
|
integer(kind=__IOTK_INTEGER3) :: j
|
|
#ifdef __IOTK_WORKAROUND5
|
|
integer(kind=__IOTK_INTEGER3) :: limit(0:9)
|
|
integer(kind=__IOTK_INTEGER3) :: hug
|
|
hug = huge(j)
|
|
limit(0:9) = (/ ((hug-j)/10,j=0,9) /)
|
|
#else
|
|
integer(kind=__IOTK_INTEGER3), parameter :: limit(0:9) = (/ ((huge(j)-j)/10,j=0,9) /)
|
|
#endif
|
|
minus = .false.
|
|
i = 0
|
|
if(present(check)) check = .false.
|
|
if(len(a)==0) return
|
|
do ii = 1 , len(a)
|
|
if(a(ii:ii)/=" ") exit
|
|
end do
|
|
if(ii>len(a)) return
|
|
if(a(ii:ii)=="-") then
|
|
minus = .true.
|
|
ii = ii + 1
|
|
else if(a(ii:ii)=="+") then
|
|
ii = ii + 1
|
|
end if
|
|
if(ii>len(a)) return
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
index = iachar(a(ii:ii)) - iachar("0")
|
|
if(index<0 .or. index>9) exit
|
|
if(i>limit(index)) exit ! Check sull'overflow
|
|
i = i*10 + index
|
|
end do
|
|
if(minus) i = - i
|
|
if(present(check)) then
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
if(a(ii:ii)/=" ") return
|
|
end do
|
|
check = .true.
|
|
end if
|
|
end subroutine iotk_atoi3
|
|
#endif
|
|
# 61 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
subroutine iotk_atoi4(i,a,check)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
character(len=*), intent(in) :: a
|
|
logical, optional, intent(out) :: check
|
|
integer(kind=__IOTK_INTEGER4), intent(out) :: i
|
|
logical :: minus
|
|
integer :: pos,index,ii
|
|
integer(kind=__IOTK_INTEGER4) :: j
|
|
#ifdef __IOTK_WORKAROUND5
|
|
integer(kind=__IOTK_INTEGER4) :: limit(0:9)
|
|
integer(kind=__IOTK_INTEGER4) :: hug
|
|
hug = huge(j)
|
|
limit(0:9) = (/ ((hug-j)/10,j=0,9) /)
|
|
#else
|
|
integer(kind=__IOTK_INTEGER4), parameter :: limit(0:9) = (/ ((huge(j)-j)/10,j=0,9) /)
|
|
#endif
|
|
minus = .false.
|
|
i = 0
|
|
if(present(check)) check = .false.
|
|
if(len(a)==0) return
|
|
do ii = 1 , len(a)
|
|
if(a(ii:ii)/=" ") exit
|
|
end do
|
|
if(ii>len(a)) return
|
|
if(a(ii:ii)=="-") then
|
|
minus = .true.
|
|
ii = ii + 1
|
|
else if(a(ii:ii)=="+") then
|
|
ii = ii + 1
|
|
end if
|
|
if(ii>len(a)) return
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
index = iachar(a(ii:ii)) - iachar("0")
|
|
if(index<0 .or. index>9) exit
|
|
if(i>limit(index)) exit ! Check sull'overflow
|
|
i = i*10 + index
|
|
end do
|
|
if(minus) i = - i
|
|
if(present(check)) then
|
|
pos = ii
|
|
do ii=pos,len(a)
|
|
if(a(ii:ii)/=" ") return
|
|
end do
|
|
check = .true.
|
|
end if
|
|
end subroutine iotk_atoi4
|
|
#endif
|
|
# 113 "iotk_xtox.spp"
|
|
|
|
# 115 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER1
|
|
function iotk_itoa1(i,length)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer(kind=__IOTK_INTEGER1), intent(in) :: i
|
|
integer, optional, intent(out) :: length
|
|
character(len=range(i)+2) :: iotk_itoa1
|
|
integer(kind=__IOTK_INTEGER1) :: itmp
|
|
integer :: pos,pos1
|
|
character(len=range(i)+2) :: tmp
|
|
itmp = abs(i)
|
|
do pos = 1 , len(tmp)
|
|
tmp(pos:pos) = achar( modulo(itmp,int(10,kind(itmp))) + iachar("0") )
|
|
itmp = itmp/10
|
|
if(itmp==0) exit
|
|
if(pos==len(tmp)) exit
|
|
end do
|
|
if(i<0) then
|
|
tmp(pos+1:pos+1)="-"
|
|
pos = pos + 1
|
|
end if
|
|
do pos1=1,pos
|
|
iotk_itoa1(pos1:pos1) = tmp(pos-pos1+1:pos-pos1+1)
|
|
end do
|
|
if(present(length)) length = pos
|
|
do pos1=pos+1,len(iotk_itoa1)
|
|
iotk_itoa1(pos1:pos1) = " "
|
|
end do
|
|
end function iotk_itoa1
|
|
#endif
|
|
# 115 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER2
|
|
function iotk_itoa2(i,length)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer(kind=__IOTK_INTEGER2), intent(in) :: i
|
|
integer, optional, intent(out) :: length
|
|
character(len=range(i)+2) :: iotk_itoa2
|
|
integer(kind=__IOTK_INTEGER2) :: itmp
|
|
integer :: pos,pos1
|
|
character(len=range(i)+2) :: tmp
|
|
itmp = abs(i)
|
|
do pos = 1 , len(tmp)
|
|
tmp(pos:pos) = achar( modulo(itmp,int(10,kind(itmp))) + iachar("0") )
|
|
itmp = itmp/10
|
|
if(itmp==0) exit
|
|
if(pos==len(tmp)) exit
|
|
end do
|
|
if(i<0) then
|
|
tmp(pos+1:pos+1)="-"
|
|
pos = pos + 1
|
|
end if
|
|
do pos1=1,pos
|
|
iotk_itoa2(pos1:pos1) = tmp(pos-pos1+1:pos-pos1+1)
|
|
end do
|
|
if(present(length)) length = pos
|
|
do pos1=pos+1,len(iotk_itoa2)
|
|
iotk_itoa2(pos1:pos1) = " "
|
|
end do
|
|
end function iotk_itoa2
|
|
#endif
|
|
# 115 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER3
|
|
function iotk_itoa3(i,length)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer(kind=__IOTK_INTEGER3), intent(in) :: i
|
|
integer, optional, intent(out) :: length
|
|
character(len=range(i)+2) :: iotk_itoa3
|
|
integer(kind=__IOTK_INTEGER3) :: itmp
|
|
integer :: pos,pos1
|
|
character(len=range(i)+2) :: tmp
|
|
itmp = abs(i)
|
|
do pos = 1 , len(tmp)
|
|
tmp(pos:pos) = achar( modulo(itmp,int(10,kind(itmp))) + iachar("0") )
|
|
itmp = itmp/10
|
|
if(itmp==0) exit
|
|
if(pos==len(tmp)) exit
|
|
end do
|
|
if(i<0) then
|
|
tmp(pos+1:pos+1)="-"
|
|
pos = pos + 1
|
|
end if
|
|
do pos1=1,pos
|
|
iotk_itoa3(pos1:pos1) = tmp(pos-pos1+1:pos-pos1+1)
|
|
end do
|
|
if(present(length)) length = pos
|
|
do pos1=pos+1,len(iotk_itoa3)
|
|
iotk_itoa3(pos1:pos1) = " "
|
|
end do
|
|
end function iotk_itoa3
|
|
#endif
|
|
# 115 "iotk_xtox.spp"
|
|
#ifdef __IOTK_INTEGER4
|
|
function iotk_itoa4(i,length)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
integer(kind=__IOTK_INTEGER4), intent(in) :: i
|
|
integer, optional, intent(out) :: length
|
|
character(len=range(i)+2) :: iotk_itoa4
|
|
integer(kind=__IOTK_INTEGER4) :: itmp
|
|
integer :: pos,pos1
|
|
character(len=range(i)+2) :: tmp
|
|
itmp = abs(i)
|
|
do pos = 1 , len(tmp)
|
|
tmp(pos:pos) = achar( modulo(itmp,int(10,kind(itmp))) + iachar("0") )
|
|
itmp = itmp/10
|
|
if(itmp==0) exit
|
|
if(pos==len(tmp)) exit
|
|
end do
|
|
if(i<0) then
|
|
tmp(pos+1:pos+1)="-"
|
|
pos = pos + 1
|
|
end if
|
|
do pos1=1,pos
|
|
iotk_itoa4(pos1:pos1) = tmp(pos-pos1+1:pos-pos1+1)
|
|
end do
|
|
if(present(length)) length = pos
|
|
do pos1=pos+1,len(iotk_itoa4)
|
|
iotk_itoa4(pos1:pos1) = " "
|
|
end do
|
|
end function iotk_itoa4
|
|
#endif
|
|
# 147 "iotk_xtox.spp"
|
|
|
|
# 149 "iotk_xtox.spp"
|
|
#ifdef __IOTK_LOGICAL1
|
|
function iotk_ltoa1(l)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
logical(kind=__IOTK_LOGICAL1), intent(in) :: l
|
|
character :: iotk_ltoa1
|
|
if(l) then
|
|
iotk_ltoa1 = "T"
|
|
else
|
|
iotk_ltoa1 = "F"
|
|
end if
|
|
end function iotk_ltoa1
|
|
#endif
|
|
# 149 "iotk_xtox.spp"
|
|
#ifdef __IOTK_LOGICAL2
|
|
function iotk_ltoa2(l)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
logical(kind=__IOTK_LOGICAL2), intent(in) :: l
|
|
character :: iotk_ltoa2
|
|
if(l) then
|
|
iotk_ltoa2 = "T"
|
|
else
|
|
iotk_ltoa2 = "F"
|
|
end if
|
|
end function iotk_ltoa2
|
|
#endif
|
|
# 149 "iotk_xtox.spp"
|
|
#ifdef __IOTK_LOGICAL3
|
|
function iotk_ltoa3(l)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
logical(kind=__IOTK_LOGICAL3), intent(in) :: l
|
|
character :: iotk_ltoa3
|
|
if(l) then
|
|
iotk_ltoa3 = "T"
|
|
else
|
|
iotk_ltoa3 = "F"
|
|
end if
|
|
end function iotk_ltoa3
|
|
#endif
|
|
# 149 "iotk_xtox.spp"
|
|
#ifdef __IOTK_LOGICAL4
|
|
function iotk_ltoa4(l)
|
|
use iotk_base
|
|
use iotk_misc_interf
|
|
implicit none
|
|
logical(kind=__IOTK_LOGICAL4), intent(in) :: l
|
|
character :: iotk_ltoa4
|
|
if(l) then
|
|
iotk_ltoa4 = "T"
|
|
else
|
|
iotk_ltoa4 = "F"
|
|
end if
|
|
end function iotk_ltoa4
|
|
#endif
|