@@ -40,9 +40,6 @@ module dm_ascii
4040
4141 character (len=* ), parameter , public :: CR_LF = ASCII_CR // ASCII_LF ! ! Carriage return + line feed (`\r\n`).
4242
43- public :: dm_ascii_escape
44- public :: dm_ascii_unescape
45-
4643 public :: dm_ascii_is_alpha
4744 public :: dm_ascii_is_alpha_numeric
4845 public :: dm_ascii_is_blank
@@ -54,50 +51,10 @@ module dm_ascii
5451 public :: dm_ascii_is_octal_digit
5552 public :: dm_ascii_is_upper
5653 public :: dm_ascii_is_white_space
57- contains
58- pure function dm_ascii_escape (str ) result(res)
59- ! ! Escapes given character string by replacing ASCII control characters
60- ! ! by an escape string. For instance, character `ASCII_LF` (new line)
61- ! ! is turned into literal `\n`. Non-printable characters without common
62- ! ! literal are replaced with `\x` plus ASCII character code in
63- ! ! hexadecimal, from `\x00` to `\x1F`.
64- character (len=* ), intent (in ) :: str ! ! Input string.
65- character (len= :), allocatable :: res ! ! Output string.
66-
67- character (len= 4 ) :: a
68- integer :: i, stat
69-
70- res = ' '
71-
72- do i = 1 , len_trim (str)
73- select case (str(i:i))
74- case (ASCII_NUL:ASCII_ACK, ASCII_SO:ASCII_SUB, ASCII_FS:ASCII_US) ! 0:6, 14:26, 28:31
75- write (a, ' ("\x", z2.2)' , iostat= stat) iachar (str(i:i))
76- if (stat == 0 ) res = res // a
77- case (ASCII_BEL) ! 7
78- res = res // ' \a'
79- case (ASCII_BS) ! 8
80- res = res // ' \b'
81- case (ASCII_TAB) ! 9
82- res = res // ' \t'
83- case (ASCII_LF) ! 10
84- res = res // ' \n'
85- case (ASCII_VT) ! 11
86- res = res // ' \v'
87- case (ASCII_FF) ! 12
88- res = res // ' \f'
89- case (ASCII_CR) ! 13
90- res = res // ' \r'
91- case (ASCII_ESC) ! 27
92- res = res // ' \e'
93- case (achar (92 )) ! \
94- res = res // '\\'
95- case default
96- res = res // str(i:i)
97- end select
98- end do
99- end function dm_ascii_escape
10054
55+ public :: dm_ascii_escape
56+ public :: dm_ascii_unescape
57+ contains
10158 pure elemental logical function dm_ascii_is_alpha(a) result(is)
10259 ! ! Returns whether character is alpha letter.
10360 character , intent (in ) :: a ! ! Character to check.
@@ -190,11 +147,54 @@ pure elemental logical function dm_ascii_is_white_space(a) result(is)
190147 is = ((a == ' ' ) .or. (ia >= int (z' 09' ) .and. ia <= int (z' 0D' )))
191148 end function dm_ascii_is_white_space
192149
193- pure function dm_ascii_unescape (str ) result(res)
150+ pure function dm_ascii_escape (string ) result(res)
151+ ! ! Escapes given character string by replacing ASCII control characters
152+ ! ! by an escape string. For instance, character `ASCII_LF` (new line)
153+ ! ! is turned into literal `\n`. Non-printable characters without common
154+ ! ! literal are replaced with `\x` plus ASCII character code in
155+ ! ! hexadecimal, from `\x00` to `\x1F`.
156+ character (len=* ), intent (in ) :: string ! ! Input string.
157+ character (len= :), allocatable :: res ! ! Output string.
158+
159+ character (len= 4 ) :: a
160+ integer :: i, stat
161+
162+ res = ' '
163+
164+ do i = 1 , len_trim (string)
165+ select case (string (i:i))
166+ case (ASCII_NUL:ASCII_ACK, ASCII_SO:ASCII_SUB, ASCII_FS:ASCII_US) ! 0:6, 14:26, 28:31
167+ write (a, ' ("\x", z2.2)' , iostat= stat) iachar (string (i:i))
168+ if (stat == 0 ) res = res // a
169+ case (ASCII_BEL) ! 7
170+ res = res // ' \a'
171+ case (ASCII_BS) ! 8
172+ res = res // ' \b'
173+ case (ASCII_TAB) ! 9
174+ res = res // ' \t'
175+ case (ASCII_LF) ! 10
176+ res = res // ' \n'
177+ case (ASCII_VT) ! 11
178+ res = res // ' \v'
179+ case (ASCII_FF) ! 12
180+ res = res // ' \f'
181+ case (ASCII_CR) ! 13
182+ res = res // ' \r'
183+ case (ASCII_ESC) ! 27
184+ res = res // ' \e'
185+ case (achar (92 )) ! \
186+ res = res // '\\'
187+ case default
188+ res = res // string (i:i)
189+ end select
190+ end do
191+ end function dm_ascii_escape
192+
193+ pure function dm_ascii_unescape (string ) result(res)
194194 ! ! Returns unescaped string of given string with escaped ASCII
195195 ! ! characters.
196- character (len=* ), intent (in ) :: str ! ! Input string.
197- character (len= :), allocatable :: res ! ! Output string.
196+ character (len=* ), intent (in ) :: string ! ! Input string.
197+ character (len= :), allocatable :: res ! ! Output string.
198198
199199 integer :: i, k, n, stat
200200 logical :: esc, npc
@@ -204,14 +204,14 @@ pure function dm_ascii_unescape(str) result(res)
204204 npc = .false. ! Non-printable character flag.
205205
206206 i = 1
207- n = len_trim (str )
207+ n = len_trim (string )
208208
209209 do while (i <= n)
210210 if (esc) then
211211 ! Escaped character literals.
212212 esc = .false.
213213
214- select case (str (i:i))
214+ select case (string (i:i))
215215 case (' a' ); res = res // ASCII_BEL
216216 case (' b' ); res = res // ASCII_BS
217217 case (' t' ); res = res // ASCII_TAB
@@ -221,32 +221,32 @@ pure function dm_ascii_unescape(str) result(res)
221221 case (' r' ); res = res // ASCII_CR
222222 case (' e' ); res = res // ASCII_ESC
223223 case (' x' ); npc = .true.
224- case (achar (92 )); res = res // str (i:i)
224+ case (achar (92 )); res = res // string (i:i)
225225 end select
226226 else if (npc) then
227227 ! Escaped non-printable characters, from `\x00` to `\xFF`.
228228 npc = .false.
229229
230230 if (i + 1 <= n) then
231- read (str (i:i + 1 ), ' (z2)' , iostat= stat) k
231+ read (string (i:i + 1 ), ' (z2)' , iostat= stat) k
232232
233233 if (stat == 0 ) then
234234 res = res // achar (k)
235235 else
236- res = res // ' \x' // str (i:i + 1 )
236+ res = res // ' \x' // string (i:i + 1 )
237237 end if
238238
239239 i = i + 1
240240 else
241- res = res // ' \x' // str (i:i)
241+ res = res // ' \x' // string (i:i)
242242 end if
243243 else
244- if (str (i:i) == ' \' ) then
244+ if (string (i:i) == ' \' ) then
245245 ! Found escape character.
246246 esc = .true.
247247 else
248248 ! All other characters.
249- res = res // str (i:i)
249+ res = res // string (i:i)
250250 end if
251251 end if
252252
0 commit comments