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"

constant undefined_character "?"


gvar (Array uInt8 256) encode1
gvar (Array uInt8 256) encode2

function init
  for (var Int u) 0 255
    encode1 u := shunt (u>="a":0:number and u<="z":0:number or u>="A":0:number and u<="Z":0:number or u>="0":0:number and u<="9":0:number or u=" ":0:number or u="_":0:number or u=".":0:number) 0 1
    encode2 u := shunt u="[lf]":number 2 encode1:u
init

function html_encode buffer length csize cr -> html
  arg Address buffer ; arg Int length csize ; arg CBool cr ; arg Str html
  constant extra ("&#"+(string 2^31-1)+";" len)-1
  var Address encode := shunt cr addressof:encode2 addressof:encode1
  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
      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
      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))+extra+(length-i)
      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 translate Char 1
        dest map uInt8 := "#":number ; dest := dest translate Char 1
        if c<1000
          if c>=100
            dest map uInt8 := c\100+"0":number ; dest := dest translate Char 1
          if c>=10
            dest map uInt8 := c\10%10+"0":number ; dest := dest translate Char 1
          dest map uInt8 := c%10+"0":number ; dest := dest translate Char 1
        else
          var Str s := string c
          memory_copy s:characters dest s:len ; dest := dest translate Byte s:len
        dest map uInt8 := ";":number ; dest := dest translate Char 1
      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_encode ascii cr -> html
  arg Str ascii ; arg CBool cr ; arg Str html
  html := html_encode ascii:characters ascii:len 1 cr

function html_encode ascii -> html
  arg Str ascii html
  html := html_encode ascii:characters ascii:len 1 false

function html_encode s -> html
  arg Str32 s ; arg Str html
  html := html_encode s:characters s:len 4 false


gvar (Dictionary Str Int) html_characters

function character name uv
  arg Str name ; arg Int uv
  html_characters insert name uv

character "Aacgr" 902
character "aacgr" 940
character "Aacute" 193
character "aacute" 225
character "Abreve" 258
character "abreve" 259
character "Acirc" 194
character "acirc" 226
character "acute" 180
character "Acy" 1040
character "acy" 1072
character "AElig" 198
character "aelig" 230
character "Agr" 913
character "agr" 945
character "Agrave" 192
character "agrave" 224
character "alefsym" 8501
character "aleph" 8501
character "Alpha" 913
character "alpha" 945
character "Amacr" 256
character "amacr" 257
character "amalg" 8720
character "amp" 38
character "and" 8743
character "ang" 8736
character "ang90" 8735
character "angmsd" 8737
character "angsph" 8738
character "angst" 8491
character "Aogon" 260
character "aogon" 261
character "ap" 8776
character "ape" 8778
character "apos" 700
character "Aring" 197
character "aring" 229
character "ast" 42
character "asymp" 8776
character "Atilde" 195
character "atilde" 227
character "Auml" 196
character "auml" 228
character "b.alpha" 945
character "barwed" 8892
character "Barwed" 8966
character "b.beta" 946
character "b.chi" 967
character "bcong" 8780
character "Bcy" 1041
character "bcy" 1073
character "b.Delta" 916
character "b.delta" 948
character "bdquo" 8222
character "becaus" 8757
character "bepsi" 8717
character "b.epsi" 949
character "b.epsis" 949
character "b.epsiv" 949
character "bernou" 8492
character "Beta" 914
character "beta" 946
character "b.eta" 951
character "beth" 8502
character "b.Gamma" 915
character "b.gamma" 947
character "b.gammad" 988
character "Bgr" 914
character "bgr" 946
character "b.iota" 953
character "b.kappa" 954
character "b.kappav" 1008
character "b.Lambda" 923
character "b.lambda" 955
character "blank" 9251
character "blk12" 9618
character "blk14" 9617
character "blk34" 9619
character "block" 9608
character "b.mu" 956
character "b.nu" 957
character "b.Omega" 937
character "b.omega" 974
character "bottom" 8869
character "bowtie" 8904
character "boxdl" 9488
character "boxdL" 9557
character "boxDl" 9558
character "boxDL" 9559
character "boxdr" 9484
character "boxdR" 9554
character "boxDr" 9555
character "boxDR" 9556
character "boxh" 9472
character "boxH" 9552
character "boxhd" 9516
character "boxHd" 9572
character "boxhD" 9573
character "boxHD" 9574
character "boxhu" 9524
character "boxHu" 9575
character "boxhU" 9576
character "boxHU" 9577
character "boxul" 9496
character "boxuL" 9563
character "boxUl" 9564
character "boxUL" 9565
character "boxur" 9492
character "boxuR" 9560
character "boxUr" 9561
character "boxUR" 9562
character "boxv" 9474
character "boxV" 9553
character "boxvh" 9532
character "boxvH" 9578
character "boxVh" 9579
character "boxVH" 9580
character "boxvl" 9508
character "boxvL" 9569
character "boxVl" 9570
character "boxVL" 9571
character "boxvr" 9500
character "boxvR" 9566
character "boxVr" 9567
character "boxVR" 9568
character "b.Phi" 934
character "b.phis" 966
character "b.phiv" 981
character "b.Pi" 928
character "b.pi" 960
character "b.piv" 982
character "bprime" 8245
character "b.Psi" 936
character "b.psi" 968
character "breve" 728
character "b.rho" 961
character "b.rhov" 1009
character "brvbar" 166
character "b.Sigma" 931
character "b.sigma" 963
character "b.sigmav" 962
character "bsim" 8765
character "bsime" 8909
character "bsol" 92
character "b.tau" 964
character "b.Theta" 920
character "b.thetas" 952
character "b.thetav" 977
character "bull" 8226
character "bump" 8782
character "bumpe" 8783
character "b.Upsi" 933
character "b.upsi" 965
character "b.Xi" 926
character "b.xi" 958
character "b.zeta" 950
character "Cacute" 262
character "cacute" 263
character "Cap" 8914
character "cap" 8745
character "caret" 8257
character "caron" 711
character "Ccaron" 268
character "ccaron" 269
character "Ccedil" 199
character "ccedil" 231
character "Ccirc" 264
character "ccirc" 265
character "Cdot" 266
character "cdot" 267
character "cedil" 184
character "cent" 162
character "CHcy" 1063
character "chcy" 1095
character "check" 10003
character "Chi" 935
character "chi" 967
character "cir" 9675
character "circ" 710
character "cire" 8791
character "clubs" 9827
character "colon" 58
character "colone" 8788
character "comma" 44
character "commat" 64
character "comp" 8705
character "compfn" 8728
character "cong" 8773
character "conint" 8750
character "coprod" 8720
character "copy" 169
character "copysr" 8471
character "crarr" 8629
character "cross" 10007
character "cuepr" 8926
character "cuesc" 8927
character "cularr" 8630
character "Cup" 8915
character "cup" 8746
character "cupre" 8828
character "curarr" 8631
character "curren" 164
character "cuvee" 8910
character "cuwed" 8911
character "dagger" 8224
character "Dagger" 8225
character "daleth" 8504
character "dArr" 8659
character "darr" 8595
character "darr2" 8650
character "dash" 8208
character "dashv" 8867
character "dblac" 733
character "Dcaron" 270
character "dcaron" 271
character "Dcy" 1044
character "dcy" 1076
character "deg" 176
character "Delta" 916
character "delta" 948
character "Dgr" 916
character "dgr" 948
character "dharl" 8643
character "dharr" 8642
character "diam" 8900
character "diams" 9830
character "die" 168
character "divide" 247
character "divonx" 8903
character "DJcy" 1026
character "djcy" 1106
character "dlarr" 8601
character "dlcorn" 8990
character "dlcrop" 8973
character "dollar" 36
character "dot" 729
character "Dot" 168
character "DotDot" 8412
character "drarr" 8600
character "drcorn" 8991
character "drcrop" 8972
character "DScy" 1029
character "dscy" 1109
character "Dstrok" 272
character "dstrok" 273
character "dtri" 9663
character "dtrif" 9662
character "DZcy" 1039
character "dzcy" 1119
character "Eacgr" 904
character "eacgr" 941
character "Eacute" 201
character "eacute" 233
character "Ecaron" 282
character "ecaron" 283
character "ecir" 8790
character "Ecirc" 202
character "ecirc" 234
character "ecolon" 8789
character "Ecy" 1069
character "ecy" 1101
character "eDot" 8785
character "Edot" 278
character "edot" 279
character "EEacgr" 905
character "eeacgr" 942
character "EEgr" 919
character "eegr" 951
character "efDot" 8786
character "Egr" 917
character "egr" 949
character "Egrave" 200
character "egrave" 232
character "egs" 8925
character "ell" 8467
character "els" 8924
character "Emacr" 274
character "emacr" 275
character "empty" 8709
character "emsp" 8195
character "emsp13" 8196
character "emsp14" 8197
character "ENG" 330
character "eng" 331
character "ensp" 8194
character "Eogon" 280
character "eogon" 281
character "epsi" 949
character "Epsilon" 917
character "epsilon" 949
character "epsis" 8714
character "equals" 61
character "equiv" 8801
character "erDot" 8787
character "esdot" 8784
character "Eta" 919
character "eta" 951
character "ETH" 208
character "eth" 240
character "Euml" 203
character "euml" 235
character "excl" 33
character "exist" 8707
character "Fcy" 1060
character "fcy" 1092
character "female" 9792
character "ffilig" 64259
character "fflig" 64256
character "ffllig" 64260
character "filig" 64257
character "flat" 9837
character "fllig" 64258
character "fnof" 402
character "forall" 8704
character "fork" 8916
character "frac12" 189
character "frac13" 8531
character "frac14" 188
character "frac15" 8533
character "frac16" 8537
character "frac18" 8539
character "frac23" 8532
character "frac25" 8534
character "frac34" 190
character "frac35" 8535
character "frac38" 8540
character "frac45" 8536
character "frac56" 8538
character "frac58" 8541
character "frac78" 8542
character "frasl" 8260
character "frown" 8994
character "gacute" 501
character "Gamma" 915
character "gamma" 947
character "gammad" 988
character "Gbreve" 286
character "gbreve" 287
character "Gcedil" 290
character "gcedil" 291
character "Gcirc" 284
character "gcirc" 285
character "Gcy" 1043
character "gcy" 1075
character "Gdot" 288
character "gdot" 289
character "gE" 8807
character "ge" 8805
character "gel" 8923
character "ges" 8805
character "Gg" 8921
character "Ggr" 915
character "ggr" 947
character "gimel" 8503
character "GJcy" 1027
character "gjcy" 1107
character "gl" 8823
character "gne" 8809
character "gnE" 8809
character "gnsim" 8935
character "grave" 96
character "gsdot" 8919
character "gsim" 8819
character "Gt" 8811
character "gt" 62
character "gvnE" 8809
character "hairsp" 8202
character "half" 189
character "hamilt" 8459
character "HARDcy" 1066
character "hardcy" 1098
character "harr" 8596
character "hArr" 8660
character "harrw" 8621
character "Hcirc" 292
character "hcirc" 293
character "hearts" 9829
character "hellip" 8230
character "horbar" 8213
character "Hstrok" 294
character "hstrok" 295
character "hybull" 8259
character "hyphen" 45
character "Iacgr" 906
character "iacgr" 943
character "Iacute" 205
character "iacute" 237
character "Icirc" 206
character "icirc" 238
character "Icy" 1048
character "icy" 1080
character "idiagr" 912
character "Idigr" 938
character "idigr" 970
character "Idot" 304
character "IEcy" 1045
character "iecy" 1077
character "iexcl" 161
character "iff" 8660
character "Igr" 921
character "igr" 953
character "Igrave" 204
character "igrave" 236
character "IJlig" 306
character "ijlig" 307
character "Imacr" 298
character "imacr" 299
character "image" 8465
character "incare" 8453
character "infin" 8734
character "inodot" 305
character "inodot" 305
character "int" 8747
character "intcal" 8890
character "IOcy" 1025
character "iocy" 1105
character "Iogon" 302
character "iogon" 303
character "Iota" 921
character "iota" 953
character "iquest" 191
character "isin" 8712
character "Itilde" 296
character "itilde" 297
character "Iukcy" 1030
character "iukcy" 1110
character "Iuml" 207
character "iuml" 239
character "Jcirc" 308
character "jcirc" 309
character "Jcy" 1049
character "jcy" 1081
character "Jsercy" 1032
character "jsercy" 1112
character "Jukcy" 1028
character "jukcy" 1108
character "Kappa" 922
character "kappa" 954
character "kappav" 1008
character "Kcedil" 310
character "kcedil" 311
character "Kcy" 1050
character "kcy" 1082
character "Kgr" 922
character "kgr" 954
character "kgreen" 312
character "KHcy" 1061
character "khcy" 1093
character "KHgr" 935
character "khgr" 967
character "KJcy" 1036
character "kjcy" 1116
character "lAarr" 8666
character "Lacute" 313
character "lacute" 314
character "lagran" 8466
character "Lambda" 923
character "lambda" 955
character "lang" 9001
character "laquo" 171
character "Larr" 8606
character "larr" 8592
character "lArr" 8656
character "larr2" 8647
character "larrhk" 8617
character "larrlp" 8619
character "larrtl" 8610
character "Lcaron" 317
character "lcaron" 318
character "Lcedil" 315
character "lcedil" 316
character "lceil" 8968
character "lcub" 123
character "Lcy" 1051
character "lcy" 1083
character "ldot" 8918
character "ldquo" 8220
character "ldquor" 8222
character "lE" 8806
character "le" 8804
character "leg" 8922
character "les" 8804
character "lfloor" 8970
character "lg" 8822
character "Lgr" 923
character "lgr" 955
character "lhard" 8637
character "lharu" 8636
character "lhblk" 9604
character "LJcy" 1033
character "ljcy" 1113
character "Ll" 8920
character "Lmidot" 319
character "lmidot" 320
character "lnE" 8808
character "lne" 8808
character "lnsim" 8934
character "lowast" 8727
character "lowbar" 95
character "loz" 9674
character "loz" 10023
character "lozf" 10022
character "lpar" 40
character "lrarr2" 8646
character "lrhar2" 8651
character "lrm" 8206
character "lsaquo" 8249
character "lsh" 8624
character "lsim" 8818
character "lsqb" 91
character "lsquo" 8216
character "lsquor" 8218
character "Lstrok" 321
character "lstrok" 322
character "Lt" 8810
character "lt" 60
character "lthree" 8907
character "ltimes" 8905
character "ltri" 9667
character "ltrie" 8884
character "ltrif" 9666
character "lvnE" 8808
character "macr" 175
character "male" 9794
character "malt" 10016
character "map" 8614
character "marker" 9646
character "Mcy" 1052
character "mcy" 1084
character "mdash" 8212
character "Mgr" 924
character "mgr" 956
character "micro" 181
character "mid" 8739
character "middot" 183
character "minus" 8722
character "minusb" 8863
character "mldr" 8230
character "mnplus" 8723
character "models" 8871
character "Mu" 924
character "mu" 956
character "mumap" 8888
character "nabla" 8711
character "Nacute" 323
character "nacute" 324
character "nap" 8777
character "napos" 329
character "natur" 9838
character "nbsp" 160
character "Ncaron" 327
character "ncaron" 328
character "Ncedil" 325
character "ncedil" 326
character "ncong" 8775
character "Ncy" 1053
character "ncy" 1085
character "ndash" 8211
character "ne" 8800
character "nearr" 8599
character "nequiv" 8802
character "nexist" 8708
character "nge" 8817
character "nges" 8817
character "Ngr" 925
character "ngr" 957
character "ngt" 8815
character "nharr" 8622
character "nhArr" 8654
character "ni" 8715
character "NJcy" 1034
character "njcy" 1114
character "nlarr" 8602
character "nlArr" 8653
character "nldr" 8229
character "nle" 8816
character "nles" 8816
character "nlt" 8814
character "nltri" 8938
character "nltrie" 8940
character "nmid" 8740
character "not" 172
character "notin" 8713
character "npar" 8742
character "npr" 8832
character "npre" 8928
character "nrarr" 8603
character "nrArr" 8655
character "nrtri" 8939
character "nrtrie" 8941
character "nsc" 8833
character "nsce" 8929
character "nsim" 8769
character "nsime" 8772
character "nspar" 8742
character "nsub" 8836
character "nsubE" 8840
character "nsube" 8840
character "nsup" 8837
character "nsupE" 8841
character "nsupe" 8841
character "Ntilde" 209
character "ntilde" 241
character "Nu" 925
character "nu" 957
character "num" 35
character "numero" 8470
character "numsp" 8199
character "nvdash" 8876
character "nvDash" 8877
character "nVdash" 8878
character "nVDash" 8879
character "nwarr" 8598
character "Oacgr" 908
character "oacgr" 972
character "Oacute" 211
character "oacute" 243
character "oast" 8859
character "ocir" 8858
character "Ocirc" 212
character "ocirc" 244
character "Ocy" 1054
character "ocy" 1086
character "odash" 8861
character "Odblac" 336
character "odblac" 337
character "odot" 8857
character "OElig" 338
character "oelig" 339
character "ogon" 731
character "Ogr" 927
character "ogr" 959
character "Ograve" 210
character "ograve" 242
character "OHacgr" 911
character "ohacgr" 974
character "OHgr" 937
character "ohgr" 969
character "ohm" 8486
character "olarr" 8634
character "oline" 8254
character "Omacr" 332
character "omacr" 333
character "Omega" 937
character "omega" 969
character "Omicron" 927
character "omicron" 959
character "ominus" 8854
character "oplus" 8853
character "or" 8744
character "orarr" 8635
character "order" 8500
character "ordf" 170
character "ordm" 186
character "oS" 9416
character "Oslash" 216
character "oslash" 248
character "osol" 8856
character "Otilde" 213
character "otilde" 245
character "otimes" 8855
character "Ouml" 214
character "ouml" 246
character "par" 8741
character "para" 182
character "part" 8706
character "Pcy" 1055
character "pcy" 1087
character "percnt" 37
character "period" 46
character "permil" 8240
character "perp" 8869
character "Pgr" 928
character "pgr" 960
character "PHgr" 934
character "phgr" 966
character "phi" 966
character "Phi" 934
character "phis" 966
character "phiv" 981
character "phmmat" 8499
character "phone" 9742
character "Pi" 928
character "pi" 960
character "piv" 982
character "planck" 8463
character "plus" 43
character "plusb" 8862
character "plusdo" 8724
character "plusmn" 177
character "pound" 163
character "pr" 8826
character "pre" 8828
character "prime" 8242
character "Prime" 8243
character "prnsim" 8936
character "prod" 8719
character "prop" 8733
character "prsim" 8830
character "PSgr" 936
character "psgr" 968
character "Psi" 936
character "psi" 968
character "puncsp" 8200
character "quest" 63
character "quot" 34
character "rAarr" 8667
character "Racute" 340
character "racute" 341
character "radic" 8730
character "rang" 9002
character "raquo" 187
character "Rarr" 8608
character "rarr" 8594
character "rArr" 8658
character "rarr2" 8649
character "rarrhk" 8618
character "rarrlp" 8620
character "rarrtl" 8611
character "rarrw" 8605
character "Rcaron" 344
character "rcaron" 345
character "Rcedil" 342
character "rcedil" 343
character "rceil" 8969
character "rcub" 125
character "Rcy" 1056
character "rcy" 1088
character "rdquo" 8221
character "rdquor" 8220
character "real" 8476
character "rect" 9645
character "reg" 174
character "rfloor" 8971
character "Rgr" 929
character "rgr" 961
character "rhard" 8641
character "rharu" 8640
character "Rho" 929
character "rho" 961
character "rhov" 1009
character "ring" 730
character "rlarr2" 8644
character "rlhar2" 8652
character "rlm" 8207
character "rpar" 41
character "rsaquo" 8250
character "rsh" 8625
character "rsqb" 93
character "rsquo" 8217
character "rsquor" 8216
character "rthree" 8908
character "rtimes" 8906
character "rtri" 9657
character "rtrie" 8885
character "rtrif" 9656
character "rx" 8478
character "Sacute" 346
character "sacute" 347
character "samalg" 8720
character "sbquo" 8218
character "sbsol" 92
character "sc" 8827
character "Scaron" 352
character "scaron" 353
character "sccue" 8829
character "sce" 8829
character "Scedil" 350
character "scedil" 351
character "Scirc" 348
character "scirc" 349
character "scnsim" 8937
character "scsim" 8831
character "Scy" 1057
character "scy" 1089
character "sdot" 8901
character "sdotb" 8865
character "sect" 167
character "semi" 59
character "setmn" 8726
character "sext" 10038
character "sfgr" 962
character "sfrown" 8994
character "Sgr" 931
character "sgr" 963
character "sharp" 9839
character "SHCHcy" 1065
character "shchcy" 1097
character "SHcy" 1064
character "shcy" 1096
character "shy" 173
character "Sigma" 931
character "sigma" 963
character "sigmaf" 962
character "sigmav" 962
character "sim" 8764
character "sime" 8771
character "smile" 8995
character "SOFTcy" 1068
character "softcy" 1100
character "sol" 47
character "spades" 9824
character "spar" 8741
character "sqcap" 8851
character "sqcup" 8852
character "sqsub" 8847
character "sqsube" 8849
character "sqsup" 8848
character "sqsupe" 8850
character "squ" 9633
character "square" 9633
character "squf" 9642
character "ssetmn" 8726
character "ssmile" 8995
character "sstarf" 8902
character "star" 9734
character "starf" 9733
character "Sub" 8912
character "sub" 8834
character "subE" 8838
character "sube" 8838
character "subnE" 8842
character "subne" 8842
character "sum" 8721
character "sung" 9834
character "Sup" 8913
character "sup" 8835
character "sup1" 185
character "sup2" 178
character "sup3" 179
character "supE" 8839
character "supe" 8839
character "supnE" 8843
character "supne" 8843
character "szlig" 223
character "target" 8982
character "Tau" 932
character "tau" 964
character "Tcaron" 356
character "tcaron" 357
character "Tcedil" 354
character "tcedil" 355
character "Tcy" 1058
character "tcy" 1090
character "tdot" 8411
character "telrec" 8981
character "Tgr" 932
character "tgr" 964
character "there4" 8756
character "theta" 952
character "Theta" 920
character "thetas" 952
character "thetasym" 977
character "thetav" 977
character "THgr" 920
character "thgr" 952
character "thinsp" 8201
character "thkap" 8776
character "thksim" 8764
character "THORN" 222
character "thorn" 254
character "tilde" 732
character "times" 215
character "timesb" 8864
character "top" 8868
character "tprime" 8244
character "trade" 8482
character "trie" 8796
character "TScy" 1062
character "tscy" 1094
character "TSHcy" 1035
character "tshcy" 1115
character "Tstrok" 358
character "tstrok" 359
character "twixt" 8812
character "Uacgr" 910
character "uacgr" 973
character "Uacute" 218
character "uacute" 250
character "uArr" 8657
character "uarr" 8593
character "uarr2" 8648
character "Ubrcy" 1038
character "ubrcy" 1118
character "Ubreve" 364
character "ubreve" 365
character "Ucirc" 219
character "ucirc" 251
character "Ucy" 1059
character "ucy" 1091
character "Udblac" 368
character "udblac" 369
character "udiagr" 944
character "Udigr" 939
character "udigr" 971
character "Ugr" 933
character "ugr" 965
character "Ugrave" 217
character "ugrave" 249
character "uharl" 8639
character "uharr" 8638
character "uhblk" 9600
character "ulcorn" 8988
character "ulcrop" 8975
character "Umacr" 362
character "umacr" 363
character "uml" 168
character "Uogon" 370
character "uogon" 371
character "uplus" 8846
character "Upsi" 933
character "upsi" 965
character "upsih" 978
character "Upsilon" 933
character "upsilon" 965
character "urcorn" 8989
character "urcrop" 8974
character "Uring" 366
character "uring" 367
character "Utilde" 360
character "utilde" 361
character "utri" 9653
character "utrif" 9652
character "Uuml" 220
character "uuml" 252
character "varr" 8597
character "vArr" 8661
character "Vcy" 1042
character "vcy" 1074
character "vdash" 8866
character "vDash" 8872
character "Vdash" 8873
character "veebar" 8891
character "vellip" 8942
character "verbar" 124
character "Verbar" 8214
character "vltri" 8882
character "vprime" 8242
character "vprop" 8733
character "vrtri" 8883
character "vsubnE" 8842
character "vsubne" 8842
character "vsupne" 8843
character "vsupnE" 8843
character "Vvdash" 8874
character "Wcirc" 372
character "wcirc" 373
character "wedgeq" 8793
character "weierp" 8472
character "wreath" 8768
character "xcirc" 9675
character "xdtri" 9661
character "Xgr" 926
character "xgr" 958
character "xhArr" 8596
character "xharr" 8596
character "Xi" 926
character "xi" 958
character "xlArr" 8656
character "xrArr" 8658
character "xutri" 9651
character "Yacute" 221
character "yacute" 253
character "YAcy" 1071
character "yacy" 1103
character "Ycirc" 374
character "ycirc" 375
character "Ycy" 1067
character "ycy" 1099
character "yen" 165
character "YIcy" 1031
character "yicy" 1111
character "YUcy" 1070
character "yucy" 1102
character "yuml" 255
character "Yuml" 376
character "Zacute" 377
character "zacute" 378
character "Zcaron" 381
character "zcaron" 382
character "Zcy" 1047
character "zcy" 1079
character "Zdot" 379
character "zdot" 380
character "Zeta" 918
character "zeta" 950
character "Zgr" 918
character "zgr" 950
character "ZHcy" 1046
character "zhcy" 1078
character "zwj" 8205
character "zwnj" 8204

character "euro" 8364

if false

  module "/pliant/language/stream.pli"

  function unhexa s -> i
    arg Str s ; arg Int i
    i := 0
    for (var Int j) 0 s:len-1
      var Int c := s:j number
      if c>="0":0:number and c<="9":0:number
        i := i*16+(c-"0":0:number)
      eif c>="A":0:number and c<="F":0:number
        i := i*16+(c-"A":0:number+10)
      eif c>="a":0:number and c<="f":0:number
        i := i*16+(c-"a":0:number+10)
      else
        return undefined
  
  function parse_characters_list
    (var Stream s) open "file:/backup/doc/unicode/SGML.TXT" in
    while not s:atend
      if (s:readline parse any:(var Str name) _ any _ any:(var Str h) _ any)
        if (h 0 2)="0x" and unhexa:(h 2 h:len)=defined
          console "character " string:name " " unhexa:(h 2 h:len) eol

  parse_characters_list


function html_decode_character adr size -> n
  arg Address adr ; arg Int size ; arg Int n
  (var Str code) set adr size false
  var Pointer:Int num :> html_characters first code
  if exists:num
    n := num
  else
    n := undefined_character number

function html_decode html -> ascii
  arg Str html ascii
  var Address buf := memory_allocate html:len addressof:ascii
  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)
    memory_copy src dest step ; dest := dest translate Byte step
    if tag1=stop
      ascii set buf (cast dest Int).-.(cast buf Int) true
      return
    var Address tag2 := memory_search tag1 (cast stop Int).-.(cast tag1 Int) ";":characters 1
    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)-1
          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
            n := undefined_character number
            c := undefined_character number
            leave decode_number
    else
      n := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1
    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

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 n := 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 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
          else
            n := undefined_character number
            leave decode_number
    else
      n := html_decode_character (tag1 translate uInt8 1) (cast tag2 Int).-.(cast tag1 Int)-1
    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