File: kim_sem_ver_module.f90

package info (click to toggle)
kim-api 2.4.1-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 4,624 kB
  • sloc: cpp: 32,594; f90: 12,746; ansic: 3,041; sh: 1,283; lisp: 130; python: 35; makefile: 13
file content (142 lines) | stat: -rw-r--r-- 5,175 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
!
! KIM-API: An API for interatomic models
! Copyright (c) 2013--2022, Regents of the University of Minnesota.
! All rights reserved.
!
! Contributors:
!    Ryan S. Elliott
!
! SPDX-License-Identifier: LGPL-2.1-or-later
!
! 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., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
!

!
! Release: This file is part of the kim-api.git repository.
!

!> \brief \copybrief KIM::SEM_VER
!!
!! \sa KIM::SEM_VER
!!
!! \since 2.0
module kim_sem_ver_module
  use, intrinsic :: iso_c_binding
  implicit none
  private

  public &
    ! Routines
    kim_get_sem_ver, &
    kim_is_less_than, &
    kim_parse_sem_ver

contains
  !> \brief \copybrief KIM::SEM_VER::GetSemVer
  !!
  !! \sa KIM::SEM_VER::GetSemVer, KIM_SEM_VER_GetSemVer
  !!
  !! \since 2.0
  recursive subroutine kim_get_sem_ver(version)
    use kim_convert_string_module, only: kim_convert_c_char_ptr_to_string
    implicit none
    interface
      type(c_ptr) recursive function get_sem_ver() &
        bind(c, name="KIM_SEM_VER_GetSemVer")
        use, intrinsic :: iso_c_binding
        implicit none
      end function get_sem_ver
    end interface
    character(len=*, kind=c_char), intent(out) :: version

    type(c_ptr) :: p

    p = get_sem_ver()
    call kim_convert_c_char_ptr_to_string(p, version)
  end subroutine kim_get_sem_ver

  !> \brief \copybrief KIM::SEM_VER::IsLessThan
  !!
  !! \sa KIM::SEM_VER::IsLessThan, KIM_SEM_VER_IsLessThan
  !!
  !! \since 2.0
  recursive subroutine kim_is_less_than(lhs, rhs, is_less_than, ierr)
    implicit none
    interface
      integer(c_int) recursive function is_less_than_func(lhs, rhs, &
                                                          is_less_than) &
        bind(c, name="KIM_SEM_VER_IsLessThan")
        use, intrinsic :: iso_c_binding
        implicit none
        character(c_char), intent(in) :: lhs(*)
        character(c_char), intent(in) :: rhs(*)
        integer(c_int), intent(out) :: is_less_than
      end function is_less_than_func
    end interface
    character(len=*, kind=c_char), intent(in) :: lhs
    character(len=*, kind=c_char), intent(in) :: rhs
    integer(c_int), intent(out) :: is_less_than
    integer(c_int), intent(out) :: ierr

    ierr = is_less_than_func(trim(lhs)//c_null_char, trim(rhs)//c_null_char, &
                             is_less_than)
  end subroutine kim_is_less_than

  !> \brief \copybrief KIM::SEM_VER::ParseSemVer
  !!
  !! \sa KIM::SEM_VER::ParseSemVer, KIM_SEM_VER_ParseSemVer
  !!
  !! \since 2.0
  recursive subroutine kim_parse_sem_ver(version, major, minor, patch, &
                                         prerelease, build_metadata, ierr)
    use kim_convert_string_module, only: kim_convert_c_char_array_to_string
    implicit none
    interface
      integer(c_int) recursive function parse_sem_ver( &
        version, prerelease_length, build_metadata_length, major, minor, &
        patch, prerelease, build_metadata) &
        bind(c, name="KIM_SEM_VER_ParseSemVer")
        use, intrinsic :: iso_c_binding
        implicit none
        character(c_char), intent(in) :: version(*)
        integer(c_int), intent(in), value :: prerelease_length
        integer(c_int), intent(in), value :: build_metadata_length
        integer(c_int), intent(out) :: major
        integer(c_int), intent(out) :: minor
        integer(c_int), intent(out) :: patch
        type(c_ptr), intent(in), value :: prerelease
        type(c_ptr), intent(in), value :: build_metadata
      end function parse_sem_ver
    end interface
    character(len=*, kind=c_char), intent(in) :: version
    integer(c_int), intent(out) :: major
    integer(c_int), intent(out) :: minor
    integer(c_int), intent(out) :: patch
    character(len=*, kind=c_char), intent(out) :: prerelease
    character(len=*, kind=c_char), intent(out) :: build_metadata
    integer(c_int), intent(out) :: ierr

    character(len=1, kind=c_char), target :: prerelease_local(len(prerelease))
    character(len=1, kind=c_char), target :: &
      build_metadata_local(len(build_metadata))

    ierr = parse_sem_ver(trim(version)//c_null_char, len(prerelease), &
                         len(build_metadata), major, minor, patch, &
                         c_loc(prerelease_local), c_loc(build_metadata_local))
    call kim_convert_c_char_array_to_string(prerelease_local, prerelease)
    call kim_convert_c_char_array_to_string(build_metadata_local, &
                                            build_metadata)
  end subroutine kim_parse_sem_ver
end module kim_sem_ver_module