2 ! { dg-additional-options "-fbounds-check" }
5 INTEGER, PARAMETER :: default_string_length
=80, dp
=KIND(0.0D0
)
7 LOGICAL, PRIVATE
, PARAMETER :: debug_this_module
=.TRUE
.
8 CHARACTER(len
=*), PARAMETER, PRIVATE
:: moduleN
= 'cp_units'
9 INTEGER, SAVE, PRIVATE
:: last_unit_id
=0, last_unit_set_id
=0
11 INTEGER, PARAMETER, PUBLIC
:: cp_unit_max_kinds
=8, cp_unit_basic_desc_length
=15,&
12 cp_unit_desc_length
=cp_unit_max_kinds
*cp_unit_basic_desc_length
, cp_ukind_max
=9
16 FUNCTION cp_to_string(i
) RESULT(res
)
17 INTEGER, INTENT(in
) :: i
18 CHARACTER(len
=6) :: res
21 REAL(KIND
=dp
) :: tmp_r
23 IF (i
>999999 .OR
. i
<-99999) THEN
25 WRITE (res
,fmt
='(es6.1)',iostat
=iostat
) tmp_r
27 WRITE (res
,fmt
='(i6)',iostat
=iostat
) i
32 END FUNCTION cp_to_string
34 SUBROUTINE cp_unit_create(string
)
35 CHARACTER(len
=*), INTENT(in
) :: string
37 CHARACTER(len
=*), PARAMETER :: routineN
= 'cp_unit_create', &
38 routineP
= moduleN
//':'//routineN
40 CHARACTER(default_string_length
) :: desc
41 CHARACTER(LEN
=40) :: formatstr
42 INTEGER :: i_high
, i_low
, i_unit
, &
43 len_string
, next_power
44 INTEGER, DIMENSION(cp_unit_max_kinds
) :: kind_id
, power
, unit_id
53 len_string
=LEN(string
)
56 DO WHILE(i_low
<len_string
)
57 IF (string(i_low
:i_low
)/=' ') EXIT
61 DO WHILE(i_high
<=len_string
)
62 IF ( string(i_high
:i_high
)==' '.OR
.string(i_high
:i_high
)=='^'.OR
.&
63 string(i_high
:i_high
)=='*'.OR
.string(i_high
:i_high
)=='/') EXIT
66 DO WHILE(.NOT
.failure
)
67 IF (i_high
<=i_low
.OR
.i_low
>len_string
) EXIT
69 IF (i_unit
>cp_unit_max_kinds
) THEN
72 power(i_unit
)=next_power
75 DO WHILE(i_low
<=len_string
)
76 IF (string(i_low
:i_low
)/=' ') EXIT
80 DO WHILE(i_high
<=len_string
)
81 IF ( string(i_high
:i_high
)==' '.OR
.string(i_high
:i_high
)=='^'.OR
.&
82 string(i_high
:i_high
)=='*'.OR
.string(i_high
:i_high
)=='/') EXIT
85 IF (i_high
<i_low
.OR
.i_low
>len_string
) EXIT
87 IF (i_high
<=len_string
) THEN
88 IF (string(i_low
:i_high
)=='^') THEN
90 DO WHILE(i_low
<=len_string
)
91 IF (string(i_low
:i_low
)/=' ') EXIT
95 DO WHILE(i_high
<=len_string
)
96 SELECT
CASE(string(i_high
:i_high
))
97 CASE('+','-','0','1','2','3','4','5','6','7','8','9')
103 IF (i_high
<=i_low
.OR
.i_low
>len_string
) THEN
104 write(6,*) "BUG : XXX"//string
//"XXX integer expected"
111 END SUBROUTINE cp_unit_create
116 CALL cp_unit_create("fs^-1")