Patch title: Release 94 bulk changes
Abstract:
File: /pliant/util/encoding/html.pli
Key:
    Removed line
    Added line
   
module "/pliant/language/unsafe.pli"
module "/pliant/language/type/text/str32.pli"


function html_encode buffer length csize cr -> html
  arg Address buffer ; arg Int length csize ; arg CBool cr ;
  constant extra ("&#"+(string 2^31-1)+";" len)-1
  var Address encode := shunt cr addressof:encode2 addressof
  var Int reserved := 2*length+extra
  var Address buf := memory_allocate reserved addressof:html
  var Address dest := buf
  var Address src := buffer
module "/pliant/language/unsafe.pli"
module "/pliant/language/type/text/str32.pli"


function html_encode buffer length csize cr -> html
  arg Address buffer ; arg Int length csize ; arg CBool cr ;
  constant extra ("&#"+(string 2^31-1)+";" len)-1
  var Address encode := shunt cr addressof:encode2 addressof
  var Int reserved := 2*length+extra
  var Address buf := memory_allocate reserved addressof:html
  var Address dest := buf
  var Address src := buffer
  for (var Int i) 0 length-1
  var Int i := 0
  while i<length
    var Int c
    if csize=1
    var Int c
    if csize=1
      c := src map uInt8 ; src := src translate uInt8 1
      if default_charset_is_utf8
        module "/pliant/util/encoding/utf8.pli"
        c := src map uInt8
        var Int l
        if c<0C0h
          l := 1
        eif c<0E0h
          l := 2
        eif c<0F0h
          l := 3
        eif c<0F8h
          l := 4
        else
          l := 1
        if i+l>length
          l := 1
        if l<>1
          c := c .and. 07Fh\2^l
          for (var Int j) 1 l-1
            c := c*2^6+((src map uInt8 j) .and. 3Fh)
        src := src translate uInt8 l ; i += l
      else
        c := src map uInt8 ; src := src translate uInt8 1 ; i+= 1
    else
    else
      c := src map Int32 ; src := src translate Int32 1
      c := src map Int32 ; src := src translate Int32 1 ; i+= 1
    var Int mode
    if c<256
      mode := (encode translate uInt8 c) map uInt8
    else
      mode := 1
    if mode=0
      dest map uInt8 := c ; dest := dest translate Char 1
    else
      var Int required := ((cast dest Int).-.(cast buf Int))
      if required>reserved
        var Int offset := (cast dest Int).-.(cast buf Int)
        reserved := 2*reserved+extra
        buf := memory_resize buf reserved addressof:html
        dest := buf translate Byte offset
      if mode=1
        dest map uInt8 := "&":number ; dest := dest translat
        dest map uInt8 := "#":number ; dest := dest translat
        if c<1000
          if c>=100
            dest map uInt8 := c\100+"0":number ; dest := des
          if c>=10
            dest map uInt8 := c\10%10+"0":number ; dest := d
          dest map uInt8 := c%10+"0":number ; dest := dest t
        else
          var Str s := string c
          memory_copy s:characters dest s:len ; dest := dest
        dest map uInt8 := ";":number ; dest := dest translat
      else
        memory_copy "<br>":characters dest "<br>":len
        dest := dest translate Char "<br>":len
    check (cast dest Int).-.(cast buf Int)<=reserved
  reserved := (cast dest Int).-.(cast buf Int)
  buf := memory_resize buf reserved addressof:html
  html set buf reserved true


function html_decode html -> ascii
  arg Str html ascii
  var Address buf := memory_allocate html:len addressof:asci
  var Address dest := buf
  var Address src := html:characters
  var Address stop := html:characters translate Char html:le
  while true
    var Address tag1 := memory_search src (cast stop Int).-.
    if tag1=null
      tag1 := stop
    var Int step := (cast tag1 Int).-.(cast src Int)
    memory_copy src dest step ; dest := dest translate Byte 
    if tag1=stop
      ascii set buf (cast dest Int).-.(cast buf Int) true
      return
    var Address tag2 := memory_search tag1 (cast stop Int).-
    if tag2=null
      ascii := ""
      memory_free buf
      return
    if ((tag1 translate uInt8 1) map uInt8)="#":number
      part decode_number
    var Int mode
    if c<256
      mode := (encode translate uInt8 c) map uInt8
    else
      mode := 1
    if mode=0
      dest map uInt8 := c ; dest := dest translate Char 1
    else
      var Int required := ((cast dest Int).-.(cast buf Int))
      if required>reserved
        var Int offset := (cast dest Int).-.(cast buf Int)
        reserved := 2*reserved+extra
        buf := memory_resize buf reserved addressof:html
        dest := buf translate Byte offset
      if mode=1
        dest map uInt8 := "&":number ; dest := dest translat
        dest map uInt8 := "#":number ; dest := dest translat
        if c<1000
          if c>=100
            dest map uInt8 := c\100+"0":number ; dest := des
          if c>=10
            dest map uInt8 := c\10%10+"0":number ; dest := d
          dest map uInt8 := c%10+"0":number ; dest := dest t
        else
          var Str s := string c
          memory_copy s:characters dest s:len ; dest := dest
        dest map uInt8 := ";":number ; dest := dest translat
      else
        memory_copy "<br>":characters dest "<br>":len
        dest := dest translate Char "<br>":len
    check (cast dest Int).-.(cast buf Int)<=reserved
  reserved := (cast dest Int).-.(cast buf Int)
  buf := memory_resize buf reserved addressof:html
  html set buf reserved true


function html_decode html -> ascii
  arg Str html ascii
  var Address buf := memory_allocate html:len addressof:asci
  var Address dest := buf
  var Address src := html:characters
  var Address stop := html:characters translate Char html:le
  while true
    var Address tag1 := memory_search src (cast stop Int).-.
    if tag1=null
      tag1 := stop
    var Int step := (cast tag1 Int).-.(cast src Int)
    memory_copy src dest step ; dest := dest translate Byte 
    if tag1=stop
      ascii set buf (cast dest Int).-.(cast buf Int) true
      return
    var Address tag2 := memory_search tag1 (cast stop Int).-
    if tag2=null
      ascii := ""
      memory_free buf
      return
    if ((tag1 translate uInt8 1) map uInt8)="#":number
      part decode_number
        var Int n := 0
        var Int c := 0
        for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-
          var Int d := (tag1 translate uInt8 i) map uInt8
          if d>="0":number and d<="9":number
        for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-
          var Int d := (tag1 translate uInt8 i) map uInt8
          if d>="0":number and d<="9":number
            n := n*10+d-"0":number
            if n>=256
              n := undefined_character number
            c := c*10+d-"0":number
            if c>=(shunt default_charset_is_utf8 2^21 256)
              c := undefined_character number
              leave decode_number
          else
              leave decode_number
          else
            n := undefined_character number
            c := undefined_character number
            leave decode_number
    else
            leave decode_number
    else
      n := html_decode_character (tag1 translate uInt8 1) (c
    dest map uInt8 := n ; dest := dest translate uInt8 1
      c := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1
    if default_charset_is_utf8
      var Int l
      if c<2^7
        dest map uInt8 := c ; dest := dest translate Byte 1
      eif c<2^11
        dest map uInt8 := 0C0h+c\2^6 ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c .and. 3Fh) ; dest := dest translate Byte 1
      eif c<2^16
        dest map uInt8 := 0E0h+c\2^12 ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c\2^6 .and. 3Fh) ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c .and. 3Fh) ; dest := dest translate Byte 1
      eif c<2^21
        dest map uInt8 := 0F0h+c\2^18 ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c\2^12 .and. 3Fh) ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c\2^6 .and. 3Fh) ; dest := dest translate Byte 1
        dest map uInt8 := 080h+(c .and. 3Fh) ; dest := dest translate Byte 1
    else
      dest map uInt8 := c ; dest := dest translate uInt8 1
    src := tag2 translate Char 1

    src := tag2 translate Char 1

function html_decode32 html -> unicode
  arg Str html ; arg Str32 unicode
  var Address buf := memory_allocate html:len*Int32:size add
  var Address dest := buf
  var Address src := html:characters
  var Address stop := html:characters translate Char html:le
  while true
    var Address tag1 := memory_search src (cast stop Int).-.
    if tag1=null
      tag1 := stop
    var Int step := (cast tag1 Int).-.(cast src Int)
    while step>0
      dest map Int32 := src map uInt8
      src := src translate uInt8 1 ; dest := dest translate 
    if tag1=stop
      unicode set buf ((cast dest Int).-.(cast buf Int))\Int
      return
    var Address tag2 := memory_search tag1 (cast stop Int).-
    if tag2=null
      unicode := ""
      memory_free buf
      return
    if ((tag1 translate uInt8 1) map uInt8)="#":number
      part decode_number
        var Int n := 0
        for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-
          var Int d := (tag1 translate uInt8 i) map uInt8
          if d>="0":number and d<="9":number
            var Int n := n*10+d-"0":number
            if n>=2^21
              n := undefined_character number
export html_encode html_decode html_characters


if not default_charset_is_utf8

  function html_decode32 html -> unicode
    arg Str html ; arg Str32 unicode
    var Address buf := memory_allocate html:len*Int32:size addressof:unicode
    var Address dest := buf
    var Address src := html:characters
    var Address stop := html:characters translate Char html:len
    while true
      var Address tag1 := memory_search src (cast stop Int).-.(cast src Int) "&":characters 1
      if tag1=null
        tag1 := stop
      var Int step := (cast tag1 Int).-.(cast src Int)
      while step>0
        dest map Int32 := src map uInt8
        src := src translate uInt8 1 ; dest := dest translate Int32 1 ; step -= 1
      if tag1=stop
        unicode set buf ((cast dest Int).-.(cast buf Int))\Int32:size true
        return
      var Address tag2 := memory_search tag1 (cast stop Int).-.(cast tag1 Int) ";":characters 1
      if tag2=null
        unicode := ""
        memory_free buf
        return
      if ((tag1 translate uInt8 1) map uInt8)="#":number
        part decode_number
          var Int c := 0
          for (var Int i) 2 (cast tag2 Int).-.(cast tag1 Int)-1
            var Int d := (tag1 translate uInt8 i) map uInt8
            if d>="0":number and d<="9":number
              var Int c := c*10+d-"0":number
              if c>=2^21
                c := undefined_character number
                leave decode_number
            else
              c := undefined_character number
              leave decode_number
              leave decode_number
          else
            n := undefined_character number
            leave decode_number
    else
      n := html_decode_character (tag1 translate uInt8 1) (c
    dest map Int32 := n ; dest := dest translate Int32 1
    src := tag2 translate Char 1
      else
        c := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1
      dest map Int32 := c ; dest := dest translate Int32 1
      src := tag2 translate Char 1


export html_encode html_decode html_decode32 html_characters
  export html_decode32