1 |
module cleanstr_m |
2 |
|
3 |
implicit none |
4 |
|
5 |
contains |
6 |
|
7 |
SUBROUTINE cleanstr(str) |
8 |
!- We clean up the string by taking out the extra () and puting |
9 |
!- everything in lower case except for the X describing the variable |
10 |
use strlowercase_m, only: strlowercase |
11 |
use mathelp, only: seps |
12 |
|
13 |
CHARACTER(LEN=80) :: str |
14 |
|
15 |
INTEGER :: ind, leng, ic, it |
16 |
LOGICAL :: check = .FALSE. |
17 |
!--------------------------------------------------------------------- |
18 |
leng = LEN_TRIM(str) |
19 |
CALL strlowercase(str) |
20 |
|
21 |
ind = INDEX(str, 'x') |
22 |
IF (check) THEN |
23 |
WRITE (*, *) 'cleanstr 1.0 : ind = ', ind, & |
24 |
& ' str = ', str(1:leng), '---' |
25 |
ENDIF |
26 |
|
27 |
! If the character before the x is not a letter then we can assume |
28 |
! that it is the variable and promote it to a capital letter |
29 |
|
30 |
DO WHILE (ind > 0) |
31 |
ic = 0 |
32 |
IF (ind > 1) ic = IACHAR(str(ind-1:ind-1)) |
33 |
IF (ic < 97 .OR. ic > 122) THEN |
34 |
str(ind:ind) = 'X' |
35 |
ENDIF |
36 |
it = INDEX(str(ind+1:leng), 'x') |
37 |
IF (it > 0) THEN |
38 |
ind = ind+it |
39 |
ELSE |
40 |
ind = it |
41 |
ENDIF |
42 |
ENDDO |
43 |
|
44 |
IF (check) WRITE (*, *) 'cleanstr 2.0 : str = ', str(1:leng), '---' |
45 |
|
46 |
IF ( str(1:1) == '(' .AND. str(leng:leng) == ')' ) THEN |
47 |
str = str(2:leng-1) |
48 |
ENDIF |
49 |
|
50 |
IF (check) WRITE (*, *) 'cleanstr 3.0 : str = ', str(1:leng), '---' |
51 |
|
52 |
leng = LEN_TRIM(str) |
53 |
ind = INDEX(str, '((X))') |
54 |
IF (ind > 0) THEN |
55 |
str=str(1:ind-1)//'(X)'//str(ind+5:leng)//' ' |
56 |
ENDIF |
57 |
|
58 |
IF (check) WRITE (*, *) 'cleanstr 4.0 : str = ', str(1:leng), '---' |
59 |
|
60 |
leng = LEN_TRIM(str) |
61 |
ind = INDEX(str, '(X)') |
62 |
IF (ind > 0 .AND. ind+3 < leng) THEN |
63 |
IF ( (INDEX(seps, str(ind-1:ind-1)) > 0) & |
64 |
& .AND. (INDEX(seps, str(ind+3:ind+3)) > 0) ) THEN |
65 |
str=str(1:ind-1)//'X'//str(ind+3:leng)//' ' |
66 |
ENDIF |
67 |
ENDIF |
68 |
|
69 |
IF (check) WRITE (*, *) 'cleanstr 5.0 : str = ', str(1:leng), '---' |
70 |
|
71 |
leng = LEN_TRIM(str) |
72 |
ind = INDEX(str(1:leng), ' ') |
73 |
DO WHILE (ind > 0) |
74 |
str=str(1:ind-1)//str(ind+1:leng)//' ' |
75 |
leng = LEN_TRIM(str) |
76 |
ind = INDEX(str(1:leng), ' ') |
77 |
ENDDO |
78 |
|
79 |
IF (check) WRITE (*, *) 'cleanstr 6.0 : str = ', str(1:leng), '---' |
80 |
!---------------------- |
81 |
END SUBROUTINE cleanstr |
82 |
|
83 |
end module cleanstr_m |