Skip to content

Commit 88d8ba6

Browse files
committed
Deploying to stdlib-fpm from @ 9c4abca 🚀
1 parent 9f8c23c commit 88d8ba6

File tree

2 files changed

+101
-53
lines changed

2 files changed

+101
-53
lines changed

src/stdlib_strings_to_string.f90

Lines changed: 56 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pure module function to_string_r_sp(value, format) result(string)
1111
real(sp), intent(in) :: value
1212
character(len=*), intent(in), optional :: format
1313
character(len=:), allocatable :: string
14-
14+
1515
character(len=buffer_len) :: buffer
1616
integer :: stat
1717

@@ -28,7 +28,7 @@ pure module function to_string_r_dp(value, format) result(string)
2828
real(dp), intent(in) :: value
2929
character(len=*), intent(in), optional :: format
3030
character(len=:), allocatable :: string
31-
31+
3232
character(len=buffer_len) :: buffer
3333
integer :: stat
3434

@@ -64,30 +64,31 @@ end function to_string_c_dp
6464

6565
!> Represent an integer of kind int8 as character sequence.
6666
pure module function to_string_1_i_int8(value) result(string)
67-
integer(int8), intent(in) :: value
67+
integer, parameter :: ik = int8
68+
integer(ik), intent(in) :: value
6869
character(len=:), allocatable :: string
6970
integer, parameter :: buffer_len = range(value)+2
7071
character(len=buffer_len) :: buffer
7172
integer :: pos
72-
integer(int8) :: n
73-
character(len=1), parameter :: numbers(0:9) = &
74-
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
73+
integer(ik) :: n
74+
character(len=1), parameter :: numbers(-9:0) = &
75+
["9", "8", "7", "6", "5", "4", "3", "2", "1", "0"]
7576

76-
if (value == 0_int8) then
77+
if (value == 0_ik) then
7778
string = numbers(0)
7879
return
7980
end if
8081

81-
n = abs(value)
82+
n = sign(value, -1_ik)
8283
buffer = ""
83-
8484
pos = buffer_len + 1
85-
do while (n > 0_int8)
85+
do while (n < 0_ik)
8686
pos = pos - 1
87-
buffer(pos:pos) = numbers(mod(n, 10_int8))
88-
n = n/10_int8
87+
buffer(pos:pos) = numbers(mod(n, 10_ik))
88+
n = n/10_ik
8989
end do
90-
if (value < 0_int8) then
90+
91+
if (value < 0_ik) then
9192
pos = pos - 1
9293
buffer(pos:pos) = '-'
9394
end if
@@ -99,7 +100,7 @@ pure module function to_string_2_i_int8(value, format) result(string)
99100
integer(int8), intent(in) :: value
100101
character(len=*), intent(in) :: format
101102
character(len=:), allocatable :: string
102-
103+
103104
character(len=buffer_len) :: buffer
104105
integer :: stat
105106

@@ -113,30 +114,31 @@ pure module function to_string_2_i_int8(value, format) result(string)
113114
end function to_string_2_i_int8
114115
!> Represent an integer of kind int16 as character sequence.
115116
pure module function to_string_1_i_int16(value) result(string)
116-
integer(int16), intent(in) :: value
117+
integer, parameter :: ik = int16
118+
integer(ik), intent(in) :: value
117119
character(len=:), allocatable :: string
118120
integer, parameter :: buffer_len = range(value)+2
119121
character(len=buffer_len) :: buffer
120122
integer :: pos
121-
integer(int16) :: n
122-
character(len=1), parameter :: numbers(0:9) = &
123-
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
123+
integer(ik) :: n
124+
character(len=1), parameter :: numbers(-9:0) = &
125+
["9", "8", "7", "6", "5", "4", "3", "2", "1", "0"]
124126

125-
if (value == 0_int16) then
127+
if (value == 0_ik) then
126128
string = numbers(0)
127129
return
128130
end if
129131

130-
n = abs(value)
132+
n = sign(value, -1_ik)
131133
buffer = ""
132-
133134
pos = buffer_len + 1
134-
do while (n > 0_int16)
135+
do while (n < 0_ik)
135136
pos = pos - 1
136-
buffer(pos:pos) = numbers(mod(n, 10_int16))
137-
n = n/10_int16
137+
buffer(pos:pos) = numbers(mod(n, 10_ik))
138+
n = n/10_ik
138139
end do
139-
if (value < 0_int16) then
140+
141+
if (value < 0_ik) then
140142
pos = pos - 1
141143
buffer(pos:pos) = '-'
142144
end if
@@ -148,7 +150,7 @@ pure module function to_string_2_i_int16(value, format) result(string)
148150
integer(int16), intent(in) :: value
149151
character(len=*), intent(in) :: format
150152
character(len=:), allocatable :: string
151-
153+
152154
character(len=buffer_len) :: buffer
153155
integer :: stat
154156

@@ -162,30 +164,31 @@ pure module function to_string_2_i_int16(value, format) result(string)
162164
end function to_string_2_i_int16
163165
!> Represent an integer of kind int32 as character sequence.
164166
pure module function to_string_1_i_int32(value) result(string)
165-
integer(int32), intent(in) :: value
167+
integer, parameter :: ik = int32
168+
integer(ik), intent(in) :: value
166169
character(len=:), allocatable :: string
167170
integer, parameter :: buffer_len = range(value)+2
168171
character(len=buffer_len) :: buffer
169172
integer :: pos
170-
integer(int32) :: n
171-
character(len=1), parameter :: numbers(0:9) = &
172-
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
173+
integer(ik) :: n
174+
character(len=1), parameter :: numbers(-9:0) = &
175+
["9", "8", "7", "6", "5", "4", "3", "2", "1", "0"]
173176

174-
if (value == 0_int32) then
177+
if (value == 0_ik) then
175178
string = numbers(0)
176179
return
177180
end if
178181

179-
n = abs(value)
182+
n = sign(value, -1_ik)
180183
buffer = ""
181-
182184
pos = buffer_len + 1
183-
do while (n > 0_int32)
185+
do while (n < 0_ik)
184186
pos = pos - 1
185-
buffer(pos:pos) = numbers(mod(n, 10_int32))
186-
n = n/10_int32
187+
buffer(pos:pos) = numbers(mod(n, 10_ik))
188+
n = n/10_ik
187189
end do
188-
if (value < 0_int32) then
190+
191+
if (value < 0_ik) then
189192
pos = pos - 1
190193
buffer(pos:pos) = '-'
191194
end if
@@ -197,7 +200,7 @@ pure module function to_string_2_i_int32(value, format) result(string)
197200
integer(int32), intent(in) :: value
198201
character(len=*), intent(in) :: format
199202
character(len=:), allocatable :: string
200-
203+
201204
character(len=buffer_len) :: buffer
202205
integer :: stat
203206

@@ -211,30 +214,31 @@ pure module function to_string_2_i_int32(value, format) result(string)
211214
end function to_string_2_i_int32
212215
!> Represent an integer of kind int64 as character sequence.
213216
pure module function to_string_1_i_int64(value) result(string)
214-
integer(int64), intent(in) :: value
217+
integer, parameter :: ik = int64
218+
integer(ik), intent(in) :: value
215219
character(len=:), allocatable :: string
216220
integer, parameter :: buffer_len = range(value)+2
217221
character(len=buffer_len) :: buffer
218222
integer :: pos
219-
integer(int64) :: n
220-
character(len=1), parameter :: numbers(0:9) = &
221-
["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
223+
integer(ik) :: n
224+
character(len=1), parameter :: numbers(-9:0) = &
225+
["9", "8", "7", "6", "5", "4", "3", "2", "1", "0"]
222226

223-
if (value == 0_int64) then
227+
if (value == 0_ik) then
224228
string = numbers(0)
225229
return
226230
end if
227231

228-
n = abs(value)
232+
n = sign(value, -1_ik)
229233
buffer = ""
230-
231234
pos = buffer_len + 1
232-
do while (n > 0_int64)
235+
do while (n < 0_ik)
233236
pos = pos - 1
234-
buffer(pos:pos) = numbers(mod(n, 10_int64))
235-
n = n/10_int64
237+
buffer(pos:pos) = numbers(mod(n, 10_ik))
238+
n = n/10_ik
236239
end do
237-
if (value < 0_int64) then
240+
241+
if (value < 0_ik) then
238242
pos = pos - 1
239243
buffer(pos:pos) = '-'
240244
end if
@@ -246,7 +250,7 @@ pure module function to_string_2_i_int64(value, format) result(string)
246250
integer(int64), intent(in) :: value
247251
character(len=*), intent(in) :: format
248252
character(len=:), allocatable :: string
249-
253+
250254
character(len=buffer_len) :: buffer
251255
integer :: stat
252256

@@ -272,7 +276,7 @@ pure module function to_string_2_l_lk(value, format) result(string)
272276
logical(lk), intent(in) :: value
273277
character(len=*), intent(in) :: format
274278
character(len=:), allocatable :: string
275-
279+
276280
character(len=buffer_len) :: buffer
277281
integer :: stat
278282

@@ -297,7 +301,7 @@ pure module function to_string_2_l_c_bool(value, format) result(string)
297301
logical(c_bool), intent(in) :: value
298302
character(len=*), intent(in) :: format
299303
character(len=:), allocatable :: string
300-
304+
301305
character(len=buffer_len) :: buffer
302306
integer :: stat
303307

test/test_string_to_string.f90

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ subroutine collect_string_to_string(testsuite)
1818
new_unittest("to_string-complex", test_to_string_complex), &
1919
new_unittest("to_string-integer", test_to_string_integer), &
2020
new_unittest("to_string-logical", test_to_string_logical), &
21-
new_unittest("to_string-real", test_to_string_real) &
21+
new_unittest("to_string-real", test_to_string_real), &
22+
new_unittest("to_string-limit-i1", test_string_i1), &
23+
new_unittest("to_string-limit-i2", test_string_i2), &
24+
new_unittest("to_string-limit-i4", test_string_i4), &
25+
new_unittest("to_string-limit-i8", test_string_i8) &
2226
]
2327
end subroutine collect_string_to_string
2428

@@ -146,6 +150,46 @@ subroutine test_to_string_logical(error)
146150
end subroutine test_to_string_logical
147151

148152

153+
subroutine test_string_i1(error)
154+
use stdlib_kinds, only : i1 => int8
155+
156+
!> Error handling
157+
type(error_type), allocatable, intent(out) :: error
158+
159+
call check(error, to_string(-huge(1_i1) - 1_i1), "-128")
160+
end subroutine test_string_i1
161+
162+
163+
subroutine test_string_i2(error)
164+
use stdlib_kinds, only : i2 => int16
165+
166+
!> Error handling
167+
type(error_type), allocatable, intent(out) :: error
168+
169+
call check(error, to_string(-huge(1_i2) - 1_i2), "-32768")
170+
end subroutine test_string_i2
171+
172+
173+
subroutine test_string_i4(error)
174+
use stdlib_kinds, only : i4 => int32
175+
176+
!> Error handling
177+
type(error_type), allocatable, intent(out) :: error
178+
179+
call check(error, to_string(-huge(1_i4) - 1_i4), "-2147483648")
180+
end subroutine test_string_i4
181+
182+
183+
subroutine test_string_i8(error)
184+
use stdlib_kinds, only : i8 => int64
185+
186+
!> Error handling
187+
type(error_type), allocatable, intent(out) :: error
188+
189+
call check(error, to_string(-huge(1_i8) - 1_i8), "-9223372036854775808")
190+
end subroutine test_string_i8
191+
192+
149193
end module test_string_to_string
150194

151195

0 commit comments

Comments
 (0)