Patch title: Release 92 bulk changes
Abstract:
File: /util/encoding/utf8.pli
Key:
    Removed line
    Added line
   
module "/pliant/install/ring2.pli"
module "/pliant/language/type/text/str32.pli"


function utf8_encode clear -> encoded
  arg Str32 clear ; arg Str encoded 
  var Int length := 0
  for (var Int i) 0 clear:len-1
    var Int c := clear:i:number
    if c<2^7
      length += 1
    eif c<2^11
      length += 2
    eif c<2^16
      length += 3
    eif c<2^21
      length += 4
  encoded set (memory_allocate length addressof:encoded) length true
  var Address ptr := encoded characters
  for (var Int i) 0 clear:len-1
    var Int c := clear:i:number
    if c<2^7
      ptr map uInt8 := c ; ptr := ptr translate Byte 1
    eif c<2^11
      ptr map uInt8 := 0C0h+c\2^6 ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c .and. 3Fh) ; ptr := ptr translate Byte 1
    eif c<2^16
      ptr map uInt8 := 0E0h+c\2^12 ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c\2^6 .and. 3Fh) ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c .and. 3Fh) ; ptr := ptr translate Byte 1
    eif c<2^21
      ptr map uInt8 := 0F0h+c\2^18 ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c\2^12 .and. 3Fh) ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c\2^6 .and. 3Fh) ; ptr := ptr translate Byte 1
      ptr map uInt8 := 080h+(c .and. 3Fh) ; ptr := ptr translate Byte 1


function utf8_length8 c -> l
  arg Int c l
  if c<80h
    l := 1
  eif c<0C0h
    l := undefined
  eif c<0E0h
    l := 2
  eif c<0F0h
    l := 3
  eif c<0F8h
    l := 4
  else
    l := undefined

function utf8_length encoded -> length
  arg Str encoded ; arg Int length
  length := 0
  var Address src := encoded characters ; var Int remain := encoded len
  while remain>0
    var Int l := utf8_length8 (src map uInt8)
    if l=undefined
      l := 1
    eif l<=remain
      length += 1
    src := src translate uInt8 l ; remain -= l


function utf8_check encoded -> status
  arg Str encoded ; arg Status status
  var Address ptr := encoded characters ; var Int remain := encoded len
  while remain>0
    var Int l := utf8_length8 (ptr map uInt8)
    if l=undefined or l>remain
      return failure
    for (var Int i) 1 l-1
      if (((ptr translate uInt8 i) map uInt8) .and. 0C0h)<>80h
        return failure
    ptr := ptr translate uInt8 l ; remain -= l
  status := success


function utf8_decode encoded -> clear
  arg Str encoded ; arg Str32 clear
  var Int length := utf8_length encoded
  clear set (memory_allocate length*Char32:size addressof:clear) length true
  var Address src := encoded characters ; var Int remain := encoded len
  var Address dest := clear characters
  while remain>0
    var Int c := src map uInt8
    var Int l := utf8_length8 c
    if l=1
      dest map Int32 := c .and. 7Fh ; dest := dest translate Int32 1
    eif l=undefined
      l := 1
    eif l<=remain
      c := c .and. 07Fh\2^l
      for (var Int i) 1 l-1
        c := c*2^6+(((src translate uInt8 i) map uInt8) .and. 3Fh)
      dest map Int32 := c ; dest := dest translate Int32 1
    src := src translate uInt8 l ; remain -= l
  check dest=(clear:characters translate Char32 length)


export utf8_encode utf8_decode
export utf8_length utf8_check