Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
character(len=*), | intent(in) | :: | chara |
pure function is_valid_multiple_byte_character(chara) result(res) use, intrinsic :: iso_fortran_env, only: int32, int8 implicit none character(*), intent(in) :: chara logical :: res integer :: siz, i, expected_siz integer(int8) :: shift_3, shift_4, shift_5, shift_6, shift_7 integer(int8) :: byte res = .true. siz = len(chara) byte = ichar(chara(1:1), kind=int8) shift_3 = ishft(byte, -3) ! Right shift the byte by 3 bits shift_4 = ishft(byte, -4) ! Right shift the byte by 4 bits shift_5 = ishft(byte, -5) ! Right shift the byte by 5 bits shift_6 = ishft(byte, -6) ! Right shift the byte by 6 bits shift_7 = ishft(byte, -7) ! Right shift the byte by 7 bits ! 1st byte if (shift_3 == 30) then expected_siz = 4 else if (shift_4 == 14)then expected_siz = 3 else if (shift_5 == 6) then expected_siz = 2 else if (shift_7 == 0) then ! for 1-byte character expected_siz = 1 else res = .false. return end if if (expected_siz /= siz) then res = .false. return end if do i = 2, expected_siz byte = ichar(chara(i:i), kind=int8) shift_6 = ishft(byte, -6) ! Right shift the byte by 6 bits if (shift_6 /= 2) then res = .false. return end if end do end function is_valid_multiple_byte_character