GCC Code Coverage Report


Directory: ./
File: misc/ioipsl_stringop.f90
Date: 2022-01-11 19:19:34
Exec Total Coverage
Lines: 0 65 0.0%
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
244