LCOV - code coverage report
Current view: top level - src/57_iopsp_parser - upf_utils.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 10.3 % 58 6
Test Date: 2026-09-21 19:39:32 Functions: 16.7 % 6 1

            Line data    Source code
       1              : !
       2              : ! Copyright (C) 2020 Quantum ESPRESSO Foundation
       3              : ! This file is distributed under the terms of the
       4              : ! GNU General Public License. See the file `License'
       5              : ! in the root directory of the present distribution,
       6              : ! or http://www.gnu.org/copyleft/gpl.txt .
       7              : !
       8              : 
       9              : #if defined HAVE_CONFIG_H
      10              : #include "config.h"
      11              : #endif
      12              : 
      13              : #include "abi_common.h"
      14              : 
      15              : MODULE upf_utils
      16              :   !
      17              :   IMPLICIT NONE
      18              :   PRIVATE
      19              : 
      20              :   PUBLIC :: capital, lowercase, isnumeric, matches, version_compare
      21              : 
      22              : ! ... FUNCTION capital : converts a lowercase letter to uppercase
      23              : !                        returns input character if not a lowercase letter
      24              : ! ... FUNCTION lowercase : as above, in reverse
      25              : ! ... FUNCTION isnumeric : returns .true. if input character is a digit
      26              : !
      27              : ! ... FUNCTION matches   : returns .true. if string1 matches string2
      28              : !
      29              : ! ... FUNCTION version_compare: Compare two version strings; the result can be
      30              : !                               "newer", "equal", "older", ""
      31              : !
      32              :   CHARACTER(LEN=26), PARAMETER :: lower = 'abcdefghijklmnopqrstuvwxyz', &
      33              :                                   upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
      34              : 
      35              : CONTAINS
      36              : 
      37              :   !-----------------------------------------------------------------------
      38         1520 : FUNCTION capital( in_char )
      39              :   !-----------------------------------------------------------------------
      40              :   !
      41              :   ! ... converts character to capital if lowercase
      42              :   ! ... copy character to output in all other cases
      43              :   !
      44              :   !IMPLICIT NONE
      45              :   !
      46              :   CHARACTER(LEN=1), INTENT(IN) :: in_char
      47              :   CHARACTER(LEN=1)             :: capital
      48              :   INTEGER                      :: i
      49              :   !
      50        21424 :   DO i=1, 26
      51        21424 :      IF ( in_char == lower(i:i) ) THEN
      52         1328 :         capital = upper(i:i)
      53         1328 :         RETURN
      54              :      END IF
      55              :   END DO
      56          192 :   capital = in_char
      57              :   !
      58              : END FUNCTION capital
      59              : !
      60              : !-----------------------------------------------------------------------
      61            0 : FUNCTION lowercase( in_char )
      62              :   !-----------------------------------------------------------------------
      63              :   !
      64              :   ! ... converts character to lowercase if capital
      65              :   ! ... copy character to output in all other cases
      66              :   !
      67              :   !IMPLICIT NONE
      68              :   !
      69              :   CHARACTER(LEN=1), INTENT(IN) :: in_char
      70              :   CHARACTER(LEN=1)             :: lowercase
      71              :   INTEGER                      :: i
      72              :   !
      73            0 :   DO i=1, 26
      74            0 :      IF ( in_char == upper(i:i) ) THEN
      75            0 :         lowercase = lower(i:i)
      76            0 :         RETURN
      77              :      END IF
      78              :   END DO
      79            0 :   lowercase = in_char
      80              :   !
      81              : END FUNCTION lowercase
      82              : !
      83              : !-----------------------------------------------------------------------
      84            0 : LOGICAL FUNCTION isnumeric ( in_char )
      85              :   !-----------------------------------------------------------------------
      86              :   !
      87              :   ! ... check if a character is a number
      88              :   !
      89              :   !IMPLICIT NONE
      90              :   !
      91              :   CHARACTER(LEN=1), INTENT(IN) :: in_char
      92              :   CHARACTER(LEN=10), PARAMETER :: numbers = '0123456789'
      93              :   INTEGER                      :: i
      94              :   !
      95            0 :   DO i=1, 10
      96            0 :      isnumeric = ( in_char == numbers(i:i) )
      97            0 :      IF ( isnumeric ) RETURN
      98              :   END DO
      99              :   !
     100              : END FUNCTION isnumeric
     101              : !
     102              : !-----------------------------------------------------------------------
     103            0 : FUNCTION matches( string1, string2 )
     104              :   !-----------------------------------------------------------------------
     105              :   !
     106              :   ! ... .TRUE. if string1 is contained in string2, .FALSE. otherwise
     107              :   !
     108              :   !IMPLICIT NONE
     109              :   !
     110              :   CHARACTER (LEN=*), INTENT(IN) :: string1, string2
     111              :   LOGICAL                       :: matches
     112              :   INTEGER                       :: len1, len2, l
     113              :   !
     114              :   !
     115            0 :   len1 = LEN_TRIM( string1 )
     116            0 :   len2 = LEN_TRIM( string2 )
     117              :   !
     118            0 :   DO l = 1, ( len2 - len1 + 1 )
     119            0 :      IF ( string1(1:len1) == string2(l:(l+len1-1)) ) THEN
     120              :         matches = .TRUE.
     121              :         RETURN
     122              :      END IF
     123              :   END DO
     124              :   matches = .FALSE.
     125              :   !
     126              : END FUNCTION matches
     127              :   !
     128              :   !--------------------------------------------------------------------------
     129            0 :   SUBROUTINE version_parse(str, major, minor, patch, ierr)
     130              :     !--------------------------------------------------------------------------
     131              :     !
     132              :     ! Determine the major, minor and patch numbers from
     133              :     ! a version string with the fmt "i.j.k"
     134              :     !
     135              :     ! The ierr variable assumes the following values
     136              :     !
     137              :     ! ierr < 0     emtpy string
     138              :     ! ierr = 0     no problem
     139              :     ! ierr > 0     fatal error
     140              :     !
     141              :     !IMPLICIT NONE
     142              :     CHARACTER(*),     INTENT(in)    :: str
     143              :     INTEGER,          INTENT(out)   :: major, minor, patch, ierr
     144              :     !
     145              :     INTEGER       :: i1, i2, length
     146              :     INTEGER       :: ierrtot
     147              :     CHARACTER(10) :: num(3)
     148              : 
     149              :     !
     150            0 :     major = 0
     151            0 :     minor = 0
     152            0 :     patch = 0
     153              : 
     154            0 :     length = LEN_TRIM( str )
     155              :     !
     156            0 :     IF ( length == 0 ) THEN
     157              :        !
     158            0 :        ierr = -1
     159            0 :        RETURN
     160              :        !
     161              :     ENDIF
     162              : 
     163            0 :     i1 = SCAN( str, ".")
     164            0 :     i2 = SCAN( str, ".", BACK=.TRUE.)
     165              :     !
     166            0 :     IF ( i1 == 0 .OR. i2 == 0 .OR. i1 == i2 ) THEN
     167              :        !
     168            0 :        ierr = 1
     169            0 :        RETURN
     170              :        !
     171              :     ENDIF
     172              :     !
     173            0 :     num(1) = str(    1 : i1-1 )
     174            0 :     num(2) = str( i1+1 : i2-1 )
     175            0 :     num(3) = str( i2+1 : )
     176              :     !
     177            0 :     ierrtot = 0
     178              :     !
     179            0 :     READ( num(1), *, IOSTAT=ierr ) major
     180            0 :     IF (ierr/=0) RETURN
     181              :     !
     182            0 :     READ( num(2), *, IOSTAT=ierr ) minor
     183            0 :     IF (ierr/=0) RETURN
     184              :     !
     185            0 :     READ( num(3), *, IOSTAT=ierr ) patch
     186            0 :     IF (ierr/=0) RETURN
     187              :     !
     188              :   END SUBROUTINE version_parse
     189              :   !
     190              :   !--------------------------------------------------------------------------
     191            0 :   FUNCTION version_compare(str1, str2)
     192              :     !--------------------------------------------------------------------------
     193              :     !
     194              :     ! Compare two version strings; the result is
     195              :     !
     196              :     ! "newer":   str1 is newer that str2
     197              :     ! "equal":   str1 is equal   to str2
     198              :     ! "older":   str1 is older than str2
     199              :     ! " ":       str1 or str2 has a wrong format
     200              :     !
     201              :     !IMPLICIT NONE
     202              :     CHARACTER(*)  :: str1, str2
     203              :     CHARACTER(10) :: version_compare
     204              :     !
     205              :     INTEGER   :: version1(3), version2(3)
     206              :     INTEGER   :: basis, icheck1, icheck2
     207              :     INTEGER   :: ierr
     208              :     !
     209              : 
     210            0 :     version_compare = " "
     211              :     !
     212            0 :     CALL version_parse( str1, version1(1), version1(2), version1(3), ierr)
     213            0 :     IF ( ierr/=0 ) RETURN
     214              :     !
     215            0 :     CALL version_parse( str2, version2(1), version2(2), version2(3), ierr)
     216            0 :     IF ( ierr/=0 ) RETURN
     217              :     !
     218              :     !
     219            0 :     basis = 1000
     220              :     !
     221            0 :     icheck1 = version1(1) * basis**2 + version1(2)* basis + version1(3)
     222            0 :     icheck2 = version2(1) * basis**2 + version2(2)* basis + version2(3)
     223              :     !
     224            0 :     IF ( icheck1 > icheck2 ) THEN
     225              :        !
     226            0 :        version_compare = 'newer'
     227              :        !
     228            0 :     ELSEIF( icheck1 == icheck2 ) THEN
     229              :        !
     230            0 :        version_compare = 'equal'
     231              :        !
     232              :     ELSE
     233              :        !
     234            0 :        version_compare = 'older'
     235              :        !
     236              :     ENDIF
     237              :     !
     238              :   END FUNCTION version_compare
     239              : 
     240              : END MODULE upf_utils
        

Generated by: LCOV version 2.3-1