demo_bytes_to_anything.f90 Source File


Source Code

        program demo_bytes_to_anything
        use, intrinsic :: ISO_FORTRAN_ENV, only: &
             CSZ => CHARACTER_STORAGE_SIZE, &
             stderr => error_unit
        use :: M_anything, only : bytes_to_anything, anything_to_bytes
        implicit none
        character(len=1), allocatable :: chars(:)
        character(len=:), allocatable :: line
        character(len=:), allocatable :: lines(:)
        integer                       :: ints(10)
        integer                       :: i, int
        integer,allocatable           :: somesize(:)

        call header('integer array to bytes')
        chars = anything_to_bytes([(i*i, i=1, size(ints))])
        write (*, '(/,4(1x,z2.2))') chars
        call bytes_to_anything(chars, ints)
        write(*,*)'and bytes back to integer array'
        write (*, '(/,*(g0,1x))') ints

        call header('integer scalar to bytes')
        chars = anything_to_bytes(1234)
        write (*, '(/,"CHARS=",*(1x,z2.2))') chars
        call bytes_to_anything(chars, int)
        write(*,*)'and bytes back to integer scalar'
        write (*, '(/,"INT=",*(g0,1x))') int

        call header('a string')
        chars = anything_to_bytes('this is a string')
        write (*, '(/,"CHARS=",*(1x,z2.2))') chars
        write (*, '(/,"CHARS=",*(g0,1x))') chars
        ! string must be long enough to hold chars
        line=repeat(' ',size(chars))
        call bytes_to_anything(chars, line)
        write (*, '(/,"LINE=",*(g0,1x))') line

        call header(&
        'a string array (have to know length or size you wish to return to)')
        chars = anything_to_bytes([character(len=4) :: 'a', 'bb', 'ccc' ])
        write (*, '(/,"CHARS=",*(1x,z2.2))') chars
        write (*, '(/,"CHARS=",*(g0,1x))') chars
        ! string must be long enough to hold chars, and have enough elements
        ! can just return as a scalar string if unknown length
        lines=[repeat(' ',size(chars))]
        ! of for that matter just work with the chars(1) array,
        ! but assuming know length in this case
        lines=[(repeat('#',4),i=1,3)]
        call bytes_to_anything(chars, lines)
        write (*, '(/,"LINES=",*("[",g0,"]",1x:))') lines

        call header('calculating size to allocate for non-string types')
        ! make sure array is of sufficient size to hold results
        chars = anything_to_bytes([11,22,33,44])
        write (*, '(/,"CHARS=",*(1x,z2.2))') chars
        allocate(somesize(size(chars)/(storage_size(0)/CSZ)))
        call bytes_to_anything(chars, somesize)
        write (*, '(/,"SOMESIZE=",*("[",g0,"]",1x:))') somesize
        contains
        subroutine header(line)
        character(len=*),intent(in) :: line
        write(*,'(*(a))')'#',repeat('=',len(line)+2),'#'
        write(*,'("|",1x,a,1x,"|")') line
        write(*,'(*(a))')'#',repeat('=',len(line)+2),'#'
        end subroutine header
        end program demo_bytes_to_anything