Changeset 5745


Ignore:
Timestamp:
Jul 1, 2025, 5:14:13 PM (6 hours ago)
Author:
dcugnet
Message:

Put the type of ther returned value of functions in the declaration line.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/misc/strings_mod.f90

    r5510 r5745  
    3838CONTAINS
    3939
    40 
    4140!==============================================================================================================================
    4241SUBROUTINE init_printout(lunout_, prt_level_)
     
    177176!=== Lower/upper case conversion function. ====================================================================================
    178177!==============================================================================================================================
    179 ELEMENTAL FUNCTION strLower(str) RESULT(out)
     178ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strLower(str) RESULT(out)
    180179  IMPLICIT NONE
    181180  CHARACTER(LEN=*), INTENT(IN) :: str
    182181  INTEGER :: k
    183   CHARACTER(LEN=maxlen) :: out
    184182  out = str
    185183  DO k=1,LEN_TRIM(str)
     
    188186END FUNCTION strLower
    189187!==============================================================================================================================
    190 ELEMENTAL FUNCTION strUpper(str) RESULT(out)
     188ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION strUpper(str) RESULT(out)
    191189  IMPLICIT NONE
    192190  CHARACTER(LEN=*), INTENT(IN) :: str
    193191  INTEGER :: k
    194   CHARACTER(LEN=maxlen)  :: out
    195192  out = str
    196193  DO k=1,LEN_TRIM(str)
     
    207204!===    * strHead(..,.TRUE.)  = 'a_b'         ${str%$sep*}                                                     ================
    208205!==============================================================================================================================
    209   FUNCTION strHead_1(str, sep, lBackward) RESULT(out)
     206CHARACTER(LEN=maxlen) FUNCTION strHead_1(str, sep, lBackward) RESULT(out)
    210207  IMPLICIT NONE
    211208  CHARACTER(LEN=*),           INTENT(IN) :: str
    212209  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
    213210  LOGICAL,          OPTIONAL, INTENT(IN) :: lBackward
    214   CHARACTER(LEN=maxlen) :: out
    215211!------------------------------------------------------------------------------------------------------------------------------
    216212  IF(PRESENT(sep)) THEN
     
    246242!===    * strTail(str, '_', .TRUE.)  = 'c'           ${str##*$sep}                                             ================
    247243!==============================================================================================================================
    248   FUNCTION strTail_1(str, sep, lBackWard) RESULT(out)
     244CHARACTER(LEN=maxlen) FUNCTION strTail_1(str, sep, lBackWard) RESULT(out)
    249245  IMPLICIT NONE
    250246  CHARACTER(LEN=*),           INTENT(IN) :: str
    251247  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: sep
    252248  LOGICAL,          OPTIONAL, INTENT(IN) :: lBackWard
    253   CHARACTER(LEN=maxlen) :: out
    254249!------------------------------------------------------------------------------------------------------------------------------
    255250  IF(PRESENT(sep)) THEN
     
    412407!=== OPTIONALY: GET THE NUMBER OF FOUND ELEMENTS "n". NB: UNFOUND => INDEX=0                       ============================
    413408!==============================================================================================================================
    414   FUNCTION strIdx_1(str, s) RESULT(out)
     409INTEGER FUNCTION strIdx_1(str, s) RESULT(out)
    415410  IMPLICIT NONE
    416411  CHARACTER(LEN=*), INTENT(IN) :: str(:), s
    417   INTEGER :: out
    418412  DO out = 1, SIZE(str); IF(str(out) == s) EXIT; END DO
    419413  IF(out == 1+SIZE(str) .OR. SIZE(str)==0) out = 0
     
    482476FUNCTION booFind(l,n) RESULT(out)
    483477   IMPLICIT NONE
    484  LOGICAL,           INTENT(IN)  :: l(:)
     478   LOGICAL,           INTENT(IN)  :: l(:)
    485479  INTEGER, OPTIONAL, INTENT(OUT) :: n
    486480  INTEGER,           ALLOCATABLE :: out(:)
     
    498492!===                     * THEN TEST WHETHER THE STRING FROM START TO THE FOUND SEPARATOR IS A CORRECTLY FORMATTED NUMBER
    499493!==============================================================================================================================
    500  FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)
     494LOGICAL FUNCTION strIdx_prv(rawList, del, ibeg, idx, idel, lSc) RESULT(lerr)
    501495  IMPLICIT NONE
    502496  CHARACTER(LEN=*),  INTENT(IN)  :: rawList                          !--- String in which delimiters have to be identified
     
    505499  INTEGER,           INTENT(OUT) :: idx                              !--- Index of the first identified delimiter in "rawList"
    506500  INTEGER,           INTENT(OUT) :: idel                             !--- Index of the identified delimiter (0 if idx==0)
    507   LOGICAL, OPTIONAL, INTENT(IN)  :: lSc 
    508   LOGICAL :: lerr
    509 !--- Care about nbs with front sign or in scient. notation
     501  LOGICAL, OPTIONAL, INTENT(IN)  :: lSc                              !--- Care about nbs with front sign or in scient. notation
    510502!------------------------------------------------------------------------------------------------------------------------------
    511503  INTEGER :: idx0                                                    !--- Used to display an identified non-numeric string
     
    535527
    536528!------------------------------------------------------------------------------------------------------------------------------
    537  FUNCTION strIdx1(str, del, ib, id) RESULT(i)
     529INTEGER FUNCTION strIdx1(str, del, ib, id) RESULT(i)
    538530!--- Get the index of the first appereance of one of the delimiters "del(:)" in "str" starting from position "ib".
    539531!--- "id" is the index in "del(:)" of the first delimiter found.
     
    542534  INTEGER,           INTENT(IN)  :: ib
    543535  INTEGER,           INTENT(OUT) :: id
    544   INTEGER :: i
    545536!------------------------------------------------------------------------------------------------------------------------------
    546537  DO i = ib, LEN_TRIM(str); id = strIdx(del, str(i:i)); IF(id /= 0) EXIT; END DO
     
    555546!=== Count the number of elements separated by "delimiter" in list "rawList". =================================================
    556547!==============================================================================================================================
    557  FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)
     548LOGICAL FUNCTION strCount_11(rawList, delimiter, nb, lSc) RESULT(lerr)
    558549  IMPLICIT NONE
    559550  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
     
    561552  INTEGER,           INTENT(OUT) :: nb
    562553  LOGICAL, OPTIONAL, INTENT(IN)  :: lSc
    563   LOGICAL :: lerr
    564554!------------------------------------------------------------------------------------------------------------------------------
    565555  LOGICAL :: ll
     
    568558END FUNCTION strCount_11
    569559!==============================================================================================================================
    570  FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)
     560LOGICAL FUNCTION strCount_m1(rawList, delimiter, nb, lSc) RESULT(lerr)
    571561  IMPLICIT NONE
    572562  CHARACTER(LEN=*),     INTENT(IN)  :: rawList(:)
     
    574564  INTEGER, ALLOCATABLE, INTENT(OUT) :: nb(:)
    575565  LOGICAL,    OPTIONAL, INTENT(IN)  :: lSc
    576   LOGICAL :: lerr
    577566!------------------------------------------------------------------------------------------------------------------------------
    578567  LOGICAL :: ll
     
    586575END FUNCTION strCount_m1
    587576!==============================================================================================================================
    588  FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)
     577LOGICAL FUNCTION strCount_1m(rawList, delimiter, nb, lSc) RESULT(lerr)
    589578  IMPLICIT NONE
    590579  CHARACTER(LEN=*),  INTENT(IN)  :: rawList
     
    596585  LOGICAL              :: ll
    597586  CHARACTER(LEN=1024)  :: r
    598   LOGICAL :: lerr
    599  
    600587  lerr = .FALSE.
    601588  ll   = .FALSE.; IF(PRESENT(lSc)) ll = lSc
     
    619606!===          Corresponding "vals" remains empty if the element does not contain "=" sign. ====================================
    620607!==============================================================================================================================
    621  FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)
     608LOGICAL FUNCTION strParse(rawList, delimiter, keys, n, vals) RESULT(lerr)
    622609  IMPLICIT NONE
    623610  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter
     
    625612  INTEGER,                            OPTIONAL, INTENT(OUT) :: n
    626613  CHARACTER(LEN=maxlen), ALLOCATABLE, OPTIONAL, INTENT(OUT) :: vals(:)
    627   LOGICAL :: lerr
    628614!------------------------------------------------------------------------------------------------------------------------------
    629615  CHARACTER(LEN=1024) :: r
     
    640626
    641627!------------------------------------------------------------------------------------------------------------------------------
    642  FUNCTION countK() RESULT(nkeys)
     628INTEGER FUNCTION countK() RESULT(nkeys)
    643629!--- Get the number of elements after parsing.
    644630  IMPLICIT NONE
    645   INTEGER :: nkeys
    646631!------------------------------------------------------------------------------------------------------------------------------
    647632  INTEGER :: ib, ie, nl
     
    696681END FUNCTION strParse
    697682!==============================================================================================================================
    698  FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)
     683LOGICAL FUNCTION strParse_m(rawList, delimiter, keys, n, vals, lSc, id) RESULT(lerr)
    699684  IMPLICIT NONE
    700685  CHARACTER(LEN=*),                             INTENT(IN)  :: rawList, delimiter(:)
     
    704689  LOGICAL,               OPTIONAL,              INTENT(IN)  :: lSc      !--- Take care about numbers in scientific notation
    705690  INTEGER,               OPTIONAL, ALLOCATABLE, INTENT(OUT) :: id(:)    !--- Indexes of the separators in "delimiter(:)" vector
    706   LOGICAL :: lerr
    707691!------------------------------------------------------------------------------------------------------------------------------
    708692  CHARACTER(LEN=1024) :: r
     
    12121196
    12131197!==============================================================================================================================
    1214   FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr)
     1198LOGICAL FUNCTION dispNamelist(unt, p, titles, s, i, r, rFmt, llast) RESULT(lerr)
    12151199  IMPLICIT NONE
    12161200  INTEGER,                    INTENT(IN)  :: unt           !--- Output unit
     
    12221206  CHARACTER(LEN=*), OPTIONAL, INTENT(IN)  :: rFmt          !--- Format for reals
    12231207  LOGICAL,          OPTIONAL, INTENT(IN)  :: llast         !--- Last variable: no final ','
    1224   LOGICAL :: lerr
    12251208!------------------------------------------------------------------------------------------------------------------------------
    12261209  CHARACTER(LEN=maxlen)  :: rFm, el
     
    12961279
    12971280!==============================================================================================================================
    1298   FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr)
     1281LOGICAL FUNCTION dispOutliers_1(ll, a, n, err_msg, nam, subn, nRowmax, nColMax, nHead, unit) RESULT(lerr)
    12991282  IMPLICIT NONE
    13001283! Display outliers list in tables
     
    13081291  INTEGER,          OPTIONAL, INTENT(IN)  :: nHead                   !--- Number of front columns to duplicate  (default: 1)
    13091292  INTEGER,          OPTIONAL, INTENT(IN)  :: unit                    !--- Output unit                           (def: lunout)
    1310   LOGICAL :: lerr
    13111293!------------------------------------------------------------------------------------------------------------------------------
    13121294  CHARACTER(LEN=maxlen),      ALLOCATABLE :: ttl(:)
     
    13761358END FUNCTION dispOutliers_1
    13771359!==============================================================================================================================
    1378   FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr)
     1360LOGICAL FUNCTION dispOutliers_2(ll, a, n, err_msg, nam, subn, nRowMax, nColMax, nHead, unit) RESULT(lerr)
    13791361  IMPLICIT NONE
    13801362! Display outliers list in tables
     
    13881370  INTEGER,          OPTIONAL, INTENT(IN)  :: nHead                   !--- Number of front columns to duplicate  (default: 1)
    13891371  INTEGER,          OPTIONAL, INTENT(IN)  :: unit                    !--- Output unit                           (def: lunout)
    1390   LOGICAL :: lerr
    13911372!------------------------------------------------------------------------------------------------------------------------------
    13921373  CHARACTER(LEN=maxlen)                   :: mes, sub, fm='(f12.9)', prf
     
    14351416!=== Reduce an algebrical expression (basic operations and parenthesis) to a single number (string format) ====================
    14361417!==============================================================================================================================
    1437   FUNCTION reduceExpr_1(str, val) RESULT(lerr)
     1418LOGICAL FUNCTION reduceExpr_1(str, val) RESULT(lerr)
    14381419  IMPLICIT NONE
    14391420  CHARACTER(LEN=*),      INTENT(IN)  :: str
    14401421  CHARACTER(LEN=maxlen), INTENT(OUT) :: val
    1441   LOGICAL :: lerr
    14421422!------------------------------------------------------------------------------------------------------------------------------
    14431423  CHARACTER(LEN=maxlen)              :: v
     
    14861466!=== Reduce a simple algebrical expression (basic operations, no parenthesis) to a single number (string format) ==============
    14871467!==============================================================================================================================
    1488  FUNCTION reduceExpr_basic(str, val) RESULT(lerr)
     1468LOGICAL FUNCTION reduceExpr_basic(str, val) RESULT(lerr)
    14891469  IMPLICIT NONE
    14901470  CHARACTER(LEN=*),      INTENT(IN)  :: str
     
    14941474  CHARACTER(LEN=maxlen), ALLOCATABLE :: ky(:)
    14951475  CHARACTER(LEN=1),      ALLOCATABLE :: op(:)
    1496   LOGICAL :: lerr
    14971476!------------------------------------------------------------------------------------------------------------------------------
    14981477  CHARACTER(LEN=1024) :: s
     
    15471526!=== Check whether a string is a number or not ================================================================================
    15481527!==============================================================================================================================
    1549 ELEMENTAL FUNCTION is_numeric(str) RESULT(out)
     1528ELEMENTAL LOGICAL FUNCTION is_numeric(str) RESULT(out)
    15501529  IMPLICIT NONE
    15511530  CHARACTER(LEN=*), INTENT(IN) :: str
     
    15531532  INTEGER :: e
    15541533  CHARACTER(LEN=12) :: fmt
    1555   LOGICAL :: out
    1556  
    15571534  IF(TRIM(str) == '') THEN; out = .FALSE.; RETURN; END IF
    15581535  WRITE(fmt,'("(f",i0,".0)")') LEN_TRIM(str)
     
    15661543!=== Convert a string into a logical/integer integer or an integer/real into a string =========================================
    15671544!==============================================================================================================================
    1568 ELEMENTAL FUNCTION str2bool(str) RESULT(out)  !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean
     1545ELEMENTAL INTEGER FUNCTION str2bool(str) RESULT(out)  !--- Result: 0/1 for .FALSE./.TRUE., -1 if not a valid boolean
    15691546  IMPLICIT NONE
    15701547  CHARACTER(LEN=*), INTENT(IN) :: str
    15711548  INTEGER :: ierr
    15721549  LOGICAL :: lout
    1573   INTEGER :: out
    1574 
    15751550  READ(str,*,IOSTAT=ierr) lout
    1576  
    15771551  out = -HUGE(1)
    15781552  IF(ierr /= 0) THEN
     
    15841558END FUNCTION str2bool
    15851559!==============================================================================================================================
    1586 ELEMENTAL FUNCTION str2int(str) RESULT(out)
     1560ELEMENTAL INTEGER FUNCTION str2int(str) RESULT(out)
    15871561  IMPLICIT NONE
    15881562  CHARACTER(LEN=*), INTENT(IN) :: str
    15891563  INTEGER :: ierr
    1590   INTEGER :: out
    1591  
    15921564  READ(str,*,IOSTAT=ierr) out
    15931565  IF(ierr/=0) out = -HUGE(1)
    15941566END FUNCTION str2int
    15951567!==============================================================================================================================
    1596 ELEMENTAL FUNCTION str2real(str) RESULT(out)
     1568ELEMENTAL REAL FUNCTION str2real(str) RESULT(out)
    15971569  IMPLICIT NONE
    15981570  CHARACTER(LEN=*), INTENT(IN) :: str
    15991571  INTEGER :: ierr
    1600   REAL :: out
    1601  
    16021572  READ(str,*,IOSTAT=ierr) out
    16031573  IF(ierr/=0) out = -HUGE(1.)
    16041574END FUNCTION str2real
    16051575!==============================================================================================================================
    1606 ELEMENTAL FUNCTION str2dble(str) RESULT(out)
     1576ELEMENTAL DOUBLE PRECISION FUNCTION str2dble(str) RESULT(out)
    16071577  IMPLICIT NONE
    16081578  CHARACTER(LEN=*), INTENT(IN) :: str
    16091579  INTEGER :: ierr
    1610   DOUBLE PRECISION :: out
    1611  
    16121580  READ(str,*,IOSTAT=ierr) out
    16131581  IF(ierr/=0) out = -HUGE(1.d0)
    16141582END FUNCTION str2dble
    16151583!==============================================================================================================================
    1616 ELEMENTAL FUNCTION bool2str(b) RESULT(out)
     1584ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION bool2str(b) RESULT(out)
    16171585  IMPLICIT NONE
    16181586  LOGICAL, INTENT(IN) :: b
    1619   CHARACTER(LEN=maxlen) :: out
    16201587  WRITE(out,*)b
    16211588  out = ADJUSTL(out)
    16221589END FUNCTION bool2str
    16231590!==============================================================================================================================
    1624 ELEMENTAL FUNCTION int2str(i, nDigits) RESULT(out)
     1591ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION int2str(i, nDigits) RESULT(out)
    16251592  IMPLICIT NONE
    16261593  INTEGER,           INTENT(IN) :: i
    16271594  INTEGER, OPTIONAL, INTENT(IN) :: nDigits
    1628   CHARACTER(LEN=maxlen) :: out
    16291595!------------------------------------------------------------------------------------------------------------------------------
    16301596  WRITE(out,*)i
     
    16341600END FUNCTION int2str
    16351601!==============================================================================================================================
    1636 ELEMENTAL FUNCTION real2str(r,fmt) RESULT(out)
     1602ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION real2str(r,fmt) RESULT(out)
    16371603  IMPLICIT NONE
    16381604  REAL,                       INTENT(IN) :: r
    16391605  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
    1640   CHARACTER(LEN=maxlen) :: out
    16411606!------------------------------------------------------------------------------------------------------------------------------
    16421607  IF(     PRESENT(fmt)) WRITE(out,fmt)r
     
    16451610END FUNCTION real2str
    16461611!==============================================================================================================================
    1647 ELEMENTAL FUNCTION dble2str(d,fmt) RESULT(out)
     1612ELEMENTAL CHARACTER(LEN=maxlen) FUNCTION dble2str(d,fmt) RESULT(out)
    16481613  IMPLICIT NONE
    16491614  DOUBLE PRECISION,           INTENT(IN) :: d
    16501615  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: fmt
    1651   CHARACTER(LEN=maxlen) :: out
    16521616!------------------------------------------------------------------------------------------------------------------------------
    16531617  IF(     PRESENT(fmt)) WRITE(out,fmt)d
     
    16941658END FUNCTION addQuotes_m
    16951659!==============================================================================================================================
    1696 ELEMENTAL FUNCTION needQuotes(s) RESULT(out)
     1660ELEMENTAL LOGICAL FUNCTION needQuotes(s) RESULT(out)
    16971661  IMPLICIT NONE
    16981662  CHARACTER(LEN=*), INTENT(IN) :: s
    16991663  CHARACTER(LEN=1) :: b, e
    1700   LOGICAL :: out
    17011664!------------------------------------------------------------------------------------------------------------------------------
    17021665  out = .TRUE.; IF(TRIM(s) == '') RETURN
     
    17101673!=== DISPLAY "<message>: the following <items> are <reason>" FOLLOWED BY THE LIST OF <str> FOR WHICH <lerr>==T. ===============
    17111674!==============================================================================================================================
    1712  FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)
     1675LOGICAL FUNCTION checkList(str, lerr, message, items, reason, nmax) RESULT(out)
    17131676  IMPLICIT NONE
    17141677! Purpose: Messages in case a list contains wrong elements (indicated by lerr boolean vector).
     
    17181681  CHARACTER(LEN=*),   INTENT(IN)  :: message, items, reason
    17191682  INTEGER,  OPTIONAL, INTENT(IN)  :: nmax
    1720   LOGICAL :: out
    17211683!------------------------------------------------------------------------------------------------------------------------------
    17221684  CHARACTER(LEN=maxlen), ALLOCATABLE :: s(:)
Note: See TracChangeset for help on using the changeset viewer.