Parses a string while reading a JSON file.
string
is now returned unescaped.Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
class(json_core), | intent(inout) | :: | json | |||
integer(kind=IK), | intent(in) | :: | unit | file unit number (if parsing from a file) |
||
character(kind=CK,len=*), | intent(in) | :: | str | JSON string (if parsing from a string) |
||
character(kind=CK,len=:), | intent(out), | allocatable | :: | string | the string (unescaped if necessary) |
subroutine parse_string(json, unit, str, string)
implicit none
class(json_core),intent(inout) :: json
integer(IK),intent(in) :: unit !! file unit number (if
!! parsing from a file)
character(kind=CK,len=*),intent(in) :: str !! JSON string (if parsing
!! from a string)
character(kind=CK,len=:),allocatable,intent(out) :: string !! the string (unescaped
!! if necessary)
logical(LK) :: eof !! end of file flag
logical(LK) :: escape !! for escape string parsing
character(kind=CK,len=1) :: c !! character returned by [[pop_char]]
integer(IK) :: ip !! index to put next character,
!! to speed up by reducing the number
!! of character string reallocations.
character(kind=CK,len=:),allocatable :: error_message !! for string unescaping
!at least return a blank string if there is a problem:
string = blank_chunk
if (.not. json%exception_thrown) then
!initialize:
escape = .false.
ip = 1
do
!get the next character from the file:
call json%pop_char(unit, str=str, eof=eof, skip_ws=.false., popped=c)
if (eof) then
call json%throw_exception('Error in parse_string: Expecting end of string')
return
else if (c==quotation_mark .and. .not. escape) then !end of string
exit
else
!if the string is not big enough, then add another chunk:
if (ip>len(string)) string = string // blank_chunk
!append to string:
string(ip:ip) = c
ip = ip + 1
! check for escape character, so we don't
! exit prematurely if escaping a quotation
! character:
if (escape) then
escape = .false.
else
escape = (c==backslash)
end if
end if
end do
!trim the string if necessary:
if (ip<len(string)+1) then
if (ip==1) then
string = CK_''
else
string = string(1:ip-1)
end if
end if
! string is returned unescaped:
! (this will also validate any hex strings present)
call unescape_string(string,error_message)
if (allocated(error_message)) then
call json%throw_exception(error_message)
deallocate(error_message) !cleanup
end if
end if
end subroutine parse_string