GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: misc/ioipsl_stringop.F90 Lines: 0 65 0.0 %
Date: 2023-06-30 12:56:34 Branches: 0 82 0.0 %

Line Branch Exec Source
1
!
2
! $Id$
3
!
4
! Module/Routines extracted from IOIPSL v2_1_8
5
!
6
MODULE ioipsl_stringop
7
!-
8
!$Id: stringop.f90 386 2008-09-04 08:38:48Z bellier $
9
!-
10
! This software is governed by the CeCILL license
11
! See IOIPSL/IOIPSL_License_CeCILL.txt
12
!---------------------------------------------------------------------
13
!-
14
  INTEGER,DIMENSION(30) :: &
15
 & prime=(/1,2,3,5,7,11,13,17,19,23,29,31,37,41,43, &
16
 & 47,53,59,61,67,71,73,79,83,89,97,101,103,107,109/)
17
!-
18
!---------------------------------------------------------------------
19
CONTAINS
20
!=
21
SUBROUTINE cmpblank (str)
22
!---------------------------------------------------------------------
23
!- Compact blanks
24
!---------------------------------------------------------------------
25
  CHARACTER(LEN=*),INTENT(inout) :: str
26
!-
27
  INTEGER :: lcc,ipb
28
!---------------------------------------------------------------------
29
  lcc = LEN_TRIM(str)
30
  ipb = 1
31
  DO
32
    IF (ipb >= lcc)   EXIT
33
    IF (str(ipb:ipb+1) == '  ') THEN
34
      str(ipb+1:) = str(ipb+2:lcc)
35
      lcc = lcc-1
36
    ELSE
37
      ipb = ipb+1
38
    ENDIF
39
  ENDDO
40
!----------------------
41
END SUBROUTINE cmpblank
42
!===
43
INTEGER FUNCTION cntpos (c_c,l_c,c_r,l_r)
44
!---------------------------------------------------------------------
45
!- Finds number of occurences of c_r in c_c
46
!---------------------------------------------------------------------
47
  IMPLICIT NONE
48
!-
49
  CHARACTER(LEN=*),INTENT(in) :: c_c
50
  INTEGER,INTENT(IN) :: l_c
51
  CHARACTER(LEN=*),INTENT(in) :: c_r
52
  INTEGER,INTENT(IN) :: l_r
53
!-
54
  INTEGER :: ipos,indx
55
!---------------------------------------------------------------------
56
  cntpos = 0
57
  ipos   = 1
58
  DO
59
    indx = INDEX(c_c(ipos:l_c),c_r(1:l_r))
60
    IF (indx > 0) THEN
61
      cntpos = cntpos+1
62
      ipos   = ipos+indx+l_r-1
63
    ELSE
64
      EXIT
65
    ENDIF
66
  ENDDO
67
!------------------
68
END FUNCTION cntpos
69
!===
70
INTEGER FUNCTION findpos (c_c,l_c,c_r,l_r)
71
!---------------------------------------------------------------------
72
!- Finds position of c_r in c_c
73
!---------------------------------------------------------------------
74
  IMPLICIT NONE
75
!-
76
  CHARACTER(LEN=*),INTENT(in) :: c_c
77
  INTEGER,INTENT(IN) :: l_c
78
  CHARACTER(LEN=*),INTENT(in) :: c_r
79
  INTEGER,INTENT(IN) :: l_r
80
!---------------------------------------------------------------------
81
  findpos = INDEX(c_c(1:l_c),c_r(1:l_r))
82
  IF (findpos == 0)  findpos=-1
83
!-------------------
84
END FUNCTION findpos
85
!===
86
SUBROUTINE find_str (str_tab,str,pos)
87
!---------------------------------------------------------------------
88
!- This subroutine looks for a string in a table
89
!---------------------------------------------------------------------
90
!- INPUT
91
!-   str_tab  : Table  of strings
92
!-   str      : Target we are looking for
93
!- OUTPUT
94
!-   pos      : -1 if str not found, else value in the table
95
!---------------------------------------------------------------------
96
  IMPLICIT NONE
97
!-
98
  CHARACTER(LEN=*),DIMENSION(:),INTENT(in) :: str_tab
99
  CHARACTER(LEN=*),INTENT(in) :: str
100
  INTEGER,INTENT(out) :: pos
101
!-
102
  INTEGER :: nb_str,i
103
!---------------------------------------------------------------------
104
  pos = -1
105
  nb_str=SIZE(str_tab)
106
  IF ( nb_str > 0 ) THEN
107
    DO i=1,nb_str
108
      IF ( TRIM(str_tab(i)) == TRIM(str) ) THEN
109
        pos = i
110
        EXIT
111
      ENDIF
112
    ENDDO
113
  ENDIF
114
!----------------------
115
END SUBROUTINE find_str
116
!===
117
SUBROUTINE nocomma (str)
118
!---------------------------------------------------------------------
119
!- Replace commas with blanks
120
!---------------------------------------------------------------------
121
  IMPLICIT NONE
122
!-
123
  CHARACTER(LEN=*) :: str
124
!-
125
  INTEGER :: i
126
!---------------------------------------------------------------------
127
  DO i=1,LEN_TRIM(str)
128
    IF (str(i:i) == ',')   str(i:i) = ' '
129
  ENDDO
130
!---------------------
131
END SUBROUTINE nocomma
132
!===
133
SUBROUTINE strlowercase (str)
134
!---------------------------------------------------------------------
135
!- Converts a string into lowercase
136
!---------------------------------------------------------------------
137
  IMPLICIT NONE
138
!-
139
  CHARACTER(LEN=*) :: str
140
!-
141
  INTEGER :: i,ic
142
!---------------------------------------------------------------------
143
  DO i=1,LEN_TRIM(str)
144
    ic = IACHAR(str(i:i))
145
    IF ( (ic >= 65).AND.(ic <= 90) )  str(i:i) = ACHAR(ic+32)
146
  ENDDO
147
!--------------------------
148
END SUBROUTINE strlowercase
149
!===
150
SUBROUTINE struppercase (str)
151
!---------------------------------------------------------------------
152
!- Converts a string into uppercase
153
!---------------------------------------------------------------------
154
  IMPLICIT NONE
155
!-
156
  CHARACTER(LEN=*) :: str
157
!-
158
  INTEGER :: i,ic
159
!---------------------------------------------------------------------
160
  DO i=1,LEN_TRIM(str)
161
    ic = IACHAR(str(i:i))
162
    IF ( (ic >= 97).AND.(ic <= 122) )  str(i:i) = ACHAR(ic-32)
163
  ENDDO
164
!--------------------------
165
END SUBROUTINE struppercase
166
!===
167
SUBROUTINE gensig (str,sig)
168
!---------------------------------------------------------------------
169
!- Generate a signature from the first 30 characters of the string
170
!- This signature is not unique and thus when one looks for the
171
!- one needs to also verify the string.
172
!---------------------------------------------------------------------
173
  IMPLICIT NONE
174
!-
175
  CHARACTER(LEN=*) :: str
176
  INTEGER          :: sig
177
!-
178
  INTEGER :: i
179
!---------------------------------------------------------------------
180
  sig = 0
181
  DO i=1,MIN(LEN_TRIM(str),30)
182
    sig = sig + prime(i)*IACHAR(str(i:i))
183
  ENDDO
184
!--------------------
185
END SUBROUTINE gensig
186
!===
187
SUBROUTINE find_sig (nb_sig,str_tab,str,sig_tab,sig,pos)
188
!---------------------------------------------------------------------
189
!- Find the string signature in a list of signatures
190
!---------------------------------------------------------------------
191
!- INPUT
192
!-   nb_sig      : length of table of signatures
193
!-   str_tab     : Table of strings
194
!-   str         : Target string we are looking for
195
!-   sig_tab     : Table of signatures
196
!-   sig         : Target signature we are looking for
197
!- OUTPUT
198
!-   pos         : -1 if str not found, else value in the table
199
!---------------------------------------------------------------------
200
  IMPLICIT NONE
201
!-
202
  INTEGER :: nb_sig
203
  CHARACTER(LEN=*),DIMENSION(nb_sig) :: str_tab
204
  CHARACTER(LEN=*) :: str
205
  INTEGER,DIMENSION(nb_sig) :: sig_tab
206
  INTEGER :: sig
207
!-
208
  INTEGER :: pos
209
  INTEGER,DIMENSION(nb_sig) :: loczeros
210
!-
211
  INTEGER :: il,len
212
  INTEGER,DIMENSION(1) :: minpos
213
!---------------------------------------------------------------------
214
  pos = -1
215
  il = LEN_TRIM(str)
216
!-
217
  IF ( nb_sig > 0 ) THEN
218
    loczeros = ABS(sig_tab(1:nb_sig)-sig)
219
    IF ( COUNT(loczeros < 1) == 1 ) THEN
220
      minpos = MINLOC(loczeros)
221
      len = LEN_TRIM(str_tab(minpos(1)))
222
      IF (     (INDEX(str_tab(minpos(1)),str(1:il)) > 0) &
223
          .AND.(len == il) ) THEN
224
        pos = minpos(1)
225
      ENDIF
226
    ELSE IF ( COUNT(loczeros < 1) > 1 ) THEN
227
      DO WHILE (COUNT(loczeros < 1) >= 1 .AND. pos < 0 )
228
        minpos = MINLOC(loczeros)
229
        len = LEN_TRIM(str_tab(minpos(1)))
230
        IF (     (INDEX(str_tab(minpos(1)),str(1:il)) > 0) &
231
            .AND.(len == il) ) THEN
232
          pos = minpos(1)
233
        ELSE
234
          loczeros(minpos(1)) = 99999
235
        ENDIF
236
      ENDDO
237
    ENDIF
238
  ENDIF
239
!-----------------------
240
 END SUBROUTINE find_sig
241
!===
242
!------------------
243
END MODULE ioipsl_stringop