Line data Source code
1 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
2 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3 : !!!! !!!!
4 : !!!! ParaMonte: Parallel Monte Carlo and Machine Learning Library. !!!!
5 : !!!! !!!!
6 : !!!! Copyright (C) 2012-present, The Computational Data Science Lab !!!!
7 : !!!! !!!!
8 : !!!! This file is part of the ParaMonte library. !!!!
9 : !!!! !!!!
10 : !!!! LICENSE !!!!
11 : !!!! !!!!
12 : !!!! https://github.com/cdslaborg/paramonte/blob/main/LICENSE.md !!!!
13 : !!!! !!!!
14 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
15 : !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
16 :
17 : !> \brief
18 : !> This file contains the implementation details of the routines under the generic interfaces of [pm_strASCII](@ref pm_strASCII).
19 : !>
20 : !> \finmain
21 : !>
22 : !> \author
23 : !> \AmirShahmoradi, September 1, 2017, 11:35 PM, Institute for Computational Engineering and Sciences (ICES), The University of Texas at Austin
24 :
25 : !%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
26 :
27 : character(1,SKC), parameter :: SPACE_SKC = achar(32, SKC)
28 : #if getLocSpace_ENABLED
29 14 : do locSpace = 1_IK, len(str, kind = IK)
30 11 : if (str(locSpace:locSpace) /= SPACE_SKC) cycle
31 9 : return
32 : end do
33 : locSpace = 0_IK
34 : #elif getLocNonSpace_ENABLED
35 3296 : do locNonSpace = 1_IK, len(str, kind = IK)
36 3290 : if (str(locNonSpace:locNonSpace) == SPACE_SKC) cycle
37 26 : return
38 : end do
39 : locNonSpace = 0_IK
40 : #elif isCharDigit_ENABLED
41 : !integer(IK) :: j
42 : !charIsDigit = .false._LK
43 : !loopOverDigit: do j = 1_IK,10_IK
44 : ! if (chr == DIGIT_VEC_SK(j)) then
45 : ! charIsDigit = .true._LK
46 : ! exit loopOverDigit
47 : ! end if
48 : !end do loopOverDigit
49 3496 : charIsDigit = SKC_"0" <= chr .and. chr <= SKC_"9"
50 : #elif isStrDigitAll_ENABLED
51 : integer(IK) :: i
52 8 : if (len(str, kind = IK) > 0_IK) then
53 14 : loopOverStr: do i = 1_IK, len(str, kind = IK)
54 12 : if (isCharDigit(str(i:i))) cycle loopOverStr
55 : strIsDigitAll = .false._LK
56 9 : return
57 : end do loopOverStr
58 : strIsDigitAll = .true._LK
59 : else
60 : strIsDigitAll = .false._LK
61 : end if
62 : #elif isStrDigitAny_ENABLED
63 : integer(IK) :: i
64 8 : if (len(str, kind = IK) > 0_IK) then
65 10 : loopOverStr: do i = 1_IK, len(str, kind = IK)
66 10 : if (isCharDigit(str(i:i))) then
67 : strIsDigitAny = .true._LK
68 : return
69 : end if
70 : end do loopOverStr
71 : end if
72 : strIsDigitAny = .false._LK
73 : #elif isStrDigit_ENABLED
74 : integer(IK) :: i
75 : do concurrent(i = 1_IK : len(str, kind = IK))
76 13 : StrIsNumeric(i) = isCharDigit(str(i:i))
77 : end do
78 : #elif isStrInteger_ENABLED
79 : integer(IK) :: i, lenStr
80 : strIsInteger = .false._LK
81 3198 : lenStr = len(str, kind = IK)
82 3198 : if (lenStr == 0_IK) return
83 3196 : i = getLocNonSpace(str)
84 3196 : if (i == 0_IK) return
85 3195 : if (str(i:i) == SKC_"+" .or. str(i:i) == SKC_"-") i = i + 1_IK
86 3195 : if (i > lenStr) return
87 1462 : do
88 4655 : if (i > lenStr) then
89 : strIsInteger = .true._LK
90 : return
91 : end if
92 3212 : if (.not. isCharDigit(str(i:i))) exit
93 1462 : i = i + 1_IK
94 : end do
95 1750 : if (str(i:lenStr) == SPACE_SKC) strIsInteger = .true._LK
96 : #elif isStrComplex_ENABLED
97 : integer(IK) :: rebeg, refin
98 : integer(IK) :: imbeg, imfin
99 : integer(IK) :: i, lenStr
100 : strIsComplex = .false._LK
101 42 : lenStr = len(str, kind = IK)
102 42 : if (lenStr == 0_IK) return
103 : i = 0_IK
104 : do
105 53 : i = i + 1_IK
106 53 : if (i > lenStr) return
107 51 : if (str(i:i) == SPACE_SKC) cycle
108 38 : if (str(i:i) /= SKC_"(") return
109 : do
110 34 : i = i + 1_IK
111 34 : if (i > lenStr) return
112 34 : if (str(i:i) == SPACE_SKC) cycle
113 : rebeg = i
114 : do
115 64 : i = i + 1_IK
116 64 : if (i > lenStr) return
117 63 : if (str(i:i) == SPACE_SKC .or. str(i:i) == SKC_",") exit
118 23 : cycle
119 : end do
120 : refin = i - 1_IK
121 23 : if (str(i:i) == SPACE_SKC) then
122 : do
123 15 : i = i + 1_IK
124 15 : if (i > lenStr) return
125 15 : if (str(i:i) == SPACE_SKC) cycle
126 12 : if (str(i:i) == SKC_",") exit
127 : end do
128 : end if
129 : do
130 31 : i = i + 1_IK
131 31 : if (i > lenStr) return
132 29 : if (str(i:i) == SPACE_SKC) cycle
133 8 : exit
134 : end do
135 : imbeg = i
136 : do
137 45 : i = i + 1_IK
138 45 : if (i > lenStr) return
139 45 : if (str(i:i) == SPACE_SKC .or. str(i:i) == SKC_")") exit
140 : end do
141 : imfin = i - 1_IK
142 21 : if (str(i:i) == SKC_")") then
143 : do
144 38 : i = i + 1_IK
145 38 : if (i > lenStr) exit
146 24 : if (str(i:i) == SPACE_SKC) cycle
147 : return ! LCOV_EXCL_LINE
148 : end do
149 : else ! str(i:i) == SPACE_SKC
150 : do
151 14 : i = i + 1_IK
152 14 : if (i > lenStr) exit
153 10 : if (str(i:i) == SPACE_SKC) cycle
154 11 : if (str(i:i) /= SKC_")") return
155 : end do
156 : end if
157 18 : strIsComplex = isStrReal(str(rebeg:refin)) .and. isStrReal(str(imbeg:imfin))
158 23 : return
159 : end do
160 : end do
161 : #elif isStrReal_ENABLED
162 : integer(IK) :: i, lenStr
163 : logical(LK) :: digitized
164 : strIsReal = .false._LK
165 74 : lenStr = len(str, kind = IK)
166 74 : if (lenStr == 0_IK) return
167 72 : i = getLocNonSpace(str)
168 72 : if (i == 0_IK) return ! str is all whitespace.
169 : !write(*,*) i, str(i:i)
170 70 : if (str(i:i) == SKC_"+" .or. str(i:i) == SKC_"-") then
171 41 : if (i == lenStr) return
172 : else
173 29 : i = i - 1_IK
174 : end if
175 : ! Skip any digits after sign
176 : digitized = .false._LK
177 : do
178 122 : i = i + 1_IK
179 122 : if (i > lenStr) then ! this never happens in the first round of loop.
180 : strIsReal = .true._LK
181 : return
182 96 : elseif (isCharDigit(str(i:i))) then
183 : digitized = .true._LK
184 : cycle
185 : end if
186 : exit
187 : end do
188 : !write(*,*) i, """"//str(i:i)//""""
189 42 : if (str(i:i) == SKC_".") then
190 : do
191 48 : i = i + 1_IK
192 48 : if (i > lenStr) then
193 : strIsReal = digitized
194 : !write(*,*) i, """"//str//""""
195 12 : return
196 36 : elseif (isCharDigit(str(i:i))) then
197 : digitized = .true._LK
198 : cycle
199 : end if
200 18 : if (digitized) exit
201 18 : return
202 : end do
203 : end if
204 : !write(*,*) i, """"//str//""""
205 30 : if (str(i:i) == SKC_"e" .or. str(i:i) == SKC_"E" .or. str(i:i) == SKC_"d" .or. str(i:i) == SKC_"D") then
206 17 : i = i + 1_IK
207 17 : if (i > lenStr) return
208 17 : if (str(i:i) == SKC_"+" .or. str(i:i) == SKC_"-") then
209 8 : if (i == lenStr) return
210 8 : i = i + 1_IK
211 : end if
212 17 : if (.not. isCharDigit(str(i:i))) return
213 : do
214 23 : i = i + 1_IK
215 23 : if (i > lenStr) then ! This never happens on the first iteration.
216 : strIsReal = .true._LK
217 : return
218 12 : elseif (isCharDigit(str(i:i))) then
219 : cycle
220 : end if
221 : exit ! LCOV_EXCL_LINE
222 : end do
223 : end if
224 19 : if (str(i:lenStr) == SPACE_SKC) strIsReal = .true._LK ! all the rest must be whitespace.
225 : #elif isStrNumber_ENABLED
226 16 : strIsNumber = isStrInteger(str) .or. isStrReal(str) .or. isStrComplex(str)
227 : #elif isCharUpper_ENABLED
228 : !charIsUpper = any(ALPHA_UPPER_VEC_SK == chr)
229 94 : charIsUpper = SKC_"A" <= chr .and. chr <= SKC_"Z"
230 : #elif isCharLower_ENABLED
231 : !charIsLower = any(ALPHA_LOWER_VEC_SK == chr)
232 94 : charIsLower = SKC_"a" <= chr .and. chr <= SKC_"z"
233 : #elif isStrUpperAll_ENABLED
234 : integer(IK) :: i
235 21 : if (len(str, kind = IK) > 0_IK) then
236 51 : loopOverStr: do i = 1_IK, len(str, kind = IK)
237 40 : if (isCharUpper(str(i:i))) cycle
238 : strIsUpperAll = .false._LK
239 41 : return
240 : end do loopOverStr
241 : strIsUpperAll = .true._LK
242 : else
243 : strIsUpperAll = .false._LK
244 : end if
245 : #elif isStrLowerAll_ENABLED
246 : integer(IK) :: i
247 21 : if (len(str, kind = IK) > 0_IK) then
248 50 : loopOverStr: do i = 1_IK, len(str, kind = IK)
249 39 : if (isCharLower(str(i:i))) cycle
250 : strIsLowerAll = .false._LK
251 40 : return
252 : end do loopOverStr
253 : strIsLowerAll = .true._LK
254 : else
255 : strIsLowerAll = .false._LK
256 : end if
257 : #elif isStrUpperAny_ENABLED
258 : integer(IK) :: i
259 21 : if (len(str, kind = IK) > 0_IK) then
260 27 : loopOverStr: do i = 1_IK, len(str, kind = IK)
261 27 : if (isCharUpper(str(i:i))) then
262 : strIsUpperAny = .true._LK
263 : return
264 : end if
265 : end do loopOverStr
266 : end if
267 : strIsUpperAny = .false._LK
268 : #elif isStrLowerAny_ENABLED
269 : integer(IK) :: i
270 21 : if (len(str, kind = IK) > 0_IK) then
271 28 : loopOverStr: do i = 1_IK, len(str, kind = IK)
272 28 : if (isCharLower(str(i:i))) then
273 : strIsLowerAny = .true._LK
274 : return
275 : end if
276 : end do loopOverStr
277 : end if
278 : strIsLowerAny = .false._LK
279 : #elif isStrUpper_ENABLED
280 : integer(IK) :: i
281 : loopOverStr: do concurrent(i = 1_IK : len(str, kind = IK))
282 28 : StrIsUpper(i) = isCharUpper(str(i:i))
283 : end do loopOverStr
284 : #elif isStrLower_ENABLED
285 : integer(IK) :: i
286 : loopOverStr: do concurrent(i = 1_IK : len(str, kind = IK))
287 28 : StrIsLower(i) = isCharLower(str(i:i))
288 : end do loopOverStr
289 : #elif isCharAlphaNum_ENABLED
290 8 : charIsAlphaNum = (SKC_"0" <= chr .and. chr <= SKC_"9") .or. (SKC_"A" <= chr .and. chr <= SKC_"Z") .or. (SKC_"a" <= chr .and. chr <= SKC_"z")
291 : #elif isStrAlphaNumAll_ENABLED
292 : integer(IK) :: i
293 14 : if (len(str, kind = IK) > 0_IK) then
294 50 : do i = 1_IK, len(str, kind = IK)
295 : !if (any(ALPHANUM_VEC_SK == str(i:i))) cycle
296 42 : if ((SKC_"0" <= str(i:i) .and. str(i:i) <= SKC_"9") .or. (SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z")) cycle
297 : strIsAlphaNumAll = .false._LK
298 45 : return
299 : end do
300 : strIsAlphaNumAll = .true._LK
301 : else
302 : strIsAlphaNumAll = .false._LK
303 : end if
304 : #elif isStrAlphaNumAny_ENABLED
305 : integer(IK) :: i
306 14 : if (len(str, kind = IK) > 0_IK) then
307 23 : do i = 1_IK, len(str, kind = IK)
308 23 : if ((SKC_"0" <= str(i:i) .and. str(i:i) <= SKC_"9") .or. (SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z")) then
309 : strIsAlphaNumAny = .true._LK
310 : return
311 : end if
312 : end do
313 : end if
314 : strIsAlphaNumAny = .false._LK
315 : #elif isStrAlphaNum_ENABLED
316 : integer(IK) :: i
317 : do concurrent(i = 1_IK : len(str, kind = IK))
318 34 : StrIsAlphaNum(i) = logical((SKC_"0" <= str(i:i) .and. str(i:i) <= SKC_"9") .or. (SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z"), kind = LK)
319 : end do
320 : #elif isCharAlpha_ENABLED
321 120 : charIsAlpha = logical((SKC_"A" <= chr .and. chr <= SKC_"Z") .or. (SKC_"a" <= chr .and. chr <= SKC_"z"), LK)
322 : #elif isStrAlphaAll_ENABLED
323 : integer(IK) :: i
324 18 : if (len(str, kind = IK) > 0_IK) then
325 61 : do i = 1_IK, len(str, kind = IK)
326 : !if (any(ALPHANUM_VEC_SK == str(i:i))) cycle
327 53 : if ((SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z")) cycle
328 : strIsAlphaAll = .false._LK
329 52 : return
330 : end do
331 : strIsAlphaAll = .true._LK
332 : else
333 : strIsAlphaAll = .false._LK
334 : end if
335 : #elif isStrAlphaAny_ENABLED
336 : integer(IK) :: i
337 18 : if (len(str, kind = IK) > 0_IK) then
338 30 : do i = 1_IK, len(str, kind = IK)
339 30 : if ((SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z")) then
340 : strIsAlphaAny = .true._LK
341 : return
342 : end if
343 : end do
344 : end if
345 : strIsAlphaAny = .false._LK
346 : #elif isStrAlpha_ENABLED
347 : integer(IK) :: i
348 : do concurrent(i = 1_IK : len(str, kind = IK))
349 30 : StrIsAlpha(i) = logical((SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") .or. (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z"), kind = LK)
350 : end do
351 : #elif getStrUpper_ENABLED
352 : integer(IK) :: i
353 : do concurrent(i = 1_IK : len(str, kind = IK))
354 3477 : if (SKC_"a" > str(i:i) .or. str(i:i) > SKC_"z") then
355 1885 : strUpper(i:i) = str(i:i)
356 : else
357 1504 : strUpper(i:i) = char(ichar(str(i:i), kind = IK) + UPPER_MINUS_LOWER_IK, kind = SKC)
358 : end if
359 : end do
360 : #elif getCharUpper_ENABLED
361 7 : if (SKC_"a" > chr .or. chr > SKC_"z") then
362 5 : chrUpper = chr
363 : else
364 2 : chrUpper = char(ichar(chr, kind = IK) + UPPER_MINUS_LOWER_IK, kind = SKC)
365 : end if
366 : #elif setCharUpper_ENABLED
367 7 : if (SKC_"a" <= chr .and. chr <= SKC_"z") chr = char(ichar(chr, kind = IK) + UPPER_MINUS_LOWER_IK, kind = SKC)
368 : #elif getCharLower_ENABLED
369 187 : if (SKC_"A" > chr .or. chr > SKC_"Z") then
370 103 : chrLower = chr
371 : else
372 84 : chrLower = char(ichar(chr, kind = IK) - UPPER_MINUS_LOWER_IK, kind = SKC)
373 : end if
374 : #elif setCharLower_ENABLED
375 7 : if (SKC_"A" <= chr .and. chr <= SKC_"Z") chr = char(ichar(chr, kind = IK) - UPPER_MINUS_LOWER_IK, kind = SKC)
376 : #elif setStrUpper_ENABLED
377 : integer(IK) :: i
378 10 : do concurrent(i = 1_IK : len(str, kind = IK))
379 68 : if (SKC_"a" <= str(i:i) .and. str(i:i) <= SKC_"z") str(i:i) = char(ichar(str(i:i), kind = IK) + UPPER_MINUS_LOWER_IK, kind = SKC)
380 : end do
381 : #elif getStrLower_ENABLED
382 : integer(IK) :: i
383 : do concurrent(i = 1_IK : len(str, kind = IK))
384 144182 : if (SKC_"A" > str(i:i) .or. str(i:i) > SKC_"Z") then
385 124636 : strLower(i:i) = str(i:i)
386 : else
387 14386 : strLower(i:i) = char(ichar(str(i:i), kind = IK) - UPPER_MINUS_LOWER_IK, kind = SKC)
388 : end if
389 : end do
390 : #elif setStrLower_ENABLED
391 : integer(IK) :: i
392 66 : do concurrent(i = 1_IK : len(str, kind = IK))
393 3634 : if (SKC_"A" <= str(i:i) .and. str(i:i) <= SKC_"Z") str(i:i) = char(ichar(str(i:i), kind = IK) - UPPER_MINUS_LOWER_IK, kind = SKC)
394 : end do
395 : #elif getStrQuoted_ENABLED || setStrQuoted_ENABLED
396 991039 : integer(IK) :: i, counter, pos, lenSeg, lenStr, lenStrQuoted, Loc(0:len(str))
397 : lenStr = len(str, IK)
398 : counter = 0_IK
399 1198589 : do i = 1_IK, lenStr
400 1198589 : if (str(i:i) == SKC_"""") then
401 11927 : counter = counter + 1_IK
402 11927 : Loc(counter) = i
403 : end if
404 : end do
405 991039 : lenStrQuoted = lenStr + counter + 2_IK
406 991039 : allocate(character(lenStrQuoted, SKC) :: strQuoted)
407 991039 : strQuoted(1:1) = SKC_""""
408 991039 : Loc(0) = 0_IK
409 : pos = 1_IK
410 1002966 : do i = 1_IK, counter
411 11927 : lenSeg = Loc(i) - Loc(i-1_IK)
412 11927 : strQuoted(pos + 1_IK : pos + lenSeg) = str(Loc(i-1_IK) + 1_IK : Loc(i))
413 11927 : pos = pos + lenSeg + 1_IK
414 1002966 : strQuoted(pos : pos) = SKC_""""
415 : end do
416 991039 : strQuoted(pos + 1_IK : lenStrQuoted - 1_IK) = str(Loc(counter) + 1 : lenStr)
417 991039 : strQuoted(lenStrQuoted : lenStrQuoted) = SKC_""""
418 : #elif getAsciiFromEscaped_ENABLED || setAsciiFromEscaped_ENABLED
419 : integer(IK) :: i, j, lenStr, code
420 : #if getAsciiFromEscaped_ENABLED
421 : integer(IK) :: endloc
422 20 : lenStr = len(str, IK)
423 20 : allocate(character(lenStr,SKC) :: ascii)
424 : #elif setAsciiFromEscaped_ENABLED && Rep_ENABLED
425 1445 : lenStr = len(str, IK)
426 : #define ASCII str
427 : #elif setAsciiFromEscaped_ENABLED && New_ENABLED
428 5 : lenStr = len(str, IK)
429 15 : CHECK_ASSERTION(__LINE__, lenStr <= len(ascii,IK), SK_"@setAsciiFromEscaped(): The condition `len(str) <= len(ascii)` must hold. len(str), len(ascii) "//getStr([len(str,IK), len(ascii,IK)])) ! fpp
430 : #else
431 : #error "Unrecognized interface."
432 : #endif
433 1450 : endloc = 0_IK
434 : i = 1_IK
435 107495 : do
436 108965 : if (i < lenStr) then
437 : code = -1_IK
438 107495 : if (str(i:i) == SKC_"\") then
439 79 : j = i + 1_IK
440 79 : if (str(j:j) == SKC_"n") then
441 : code = 10_IK
442 : elseif (str(j:j) == SKC_"r") then
443 : code = 13_IK
444 : elseif (str(j:j) == SKC_"t") then
445 : code = 9_IK
446 : elseif (str(j:j) == SKC_"v") then
447 : code = 11_IK
448 : elseif (str(j:j) == SKC_"a") then
449 : code = 7_IK
450 : elseif (str(j:j) == SKC_"b") then
451 : code = 8_IK
452 : elseif (str(j:j) == SKC_"f") then
453 : code = 12_IK
454 : elseif (str(j:j) == SKC_"\") then
455 : code = 92_IK
456 : elseif (str(j:j) == SKC_"'") then
457 : code = 39_IK
458 : elseif (str(j:j) == SKC_'"') then
459 : code = 34_IK
460 : elseif (str(j:j) == SKC_"?") then
461 : code = 63_IK
462 39 : elseif (SKC_"0" <= str(j:j) .and. str(j:j) < SKC_"8") then ! is octal
463 : do
464 36 : if (j == lenStr) exit
465 36 : j = j + 1_IK
466 36 : if (SKC_"0" <= str(j:j) .and. str(j:j) < SKC_"8") cycle
467 : j = j - 1_IK
468 20 : exit
469 : end do
470 16 : code = getDecimal(str(i + 1_IK : j), 8_IK)
471 23 : elseif (str(j:j) == SKC_"x") then ! is hex
472 : do
473 20 : if (j == lenStr) exit
474 20 : j = j + 1_IK
475 20 : if (isCharDigit(str(j:j)) .or. (SKC_"A" <= str(j:j) .and. str(j:j) < SKC_"G")) cycle
476 : j = j - 1_IK
477 12 : exit
478 : end do
479 8 : if (j > i + 1_IK) code = getDecimal(str(i + 2_IK : j), 16_IK)
480 15 : elseif (str(j:j) == SKC_"u") then ! is UTF-8 four digit hex
481 : #define SET_ASCII_CODE(STR_OFFSET) \
482 : do; \
483 : if (j == lenStr) exit; \
484 : j = j + 1_IK; \
485 : if (isCharDigit(str(j:j)) .or. (SKC_"A" <= str(j:j) .and. str(j:j) < SKC_"G")) then; \
486 : if (j < i + STR_OFFSET) cycle; \
487 : exit; \
488 : end if; \
489 : j = j - 1_IK; \
490 : exit; \
491 : end do; \
492 : if (j == i + STR_OFFSET) code = getDecimal(str(i + 2_IK : j), 16_IK);
493 16 : SET_ASCII_CODE(5_IK) ! fpp
494 11 : elseif (str(j:j) == SKC_"U") then ! is UTF-8 four digit hex
495 40 : SET_ASCII_CODE(9_IK) ! fpp
496 : #undef SET_ASCII_CODE
497 : end if
498 : else
499 : j = i
500 : end if
501 107495 : endloc = endloc + 1_IK
502 107495 : if (code < 0_IK .or. code > 127_IK) then
503 107427 : ASCII(endloc : endloc + j - i) = str(i:j) ! fpp
504 17192 : endloc = endloc + j - i
505 : else
506 68 : ASCII(endloc : endloc) = achar(code, kind = SKC) ! fpp
507 : end if
508 107495 : i = j + 1_IK
509 : else
510 1470 : if (i == lenStr) then
511 1458 : endloc = endloc + 1_IK
512 1458 : ASCII(endloc : endloc) = str(i:i)
513 : end if
514 : #if getAsciiFromEscaped_ENABLED
515 20 : ASCII = ASCII(1:endloc) ! fpp
516 : #endif
517 4410 : CHECK_ASSERTION(__LINE__, endloc <= lenStr, SK_"The condition `endloc <= lenStr` must hold. endloc, lenStr = "//getStr([endloc, lenStr]))
518 1470 : return
519 : end if
520 : end do
521 : error stop "Internal library error occurred. The procedure should not reach this line." ! LCOV_EXCL_LINE
522 : #else
523 : #error "Unrecognized interface."
524 : #endif
525 : #undef ASCII
|