Patch title: Release 90 bulk changes
Abstract:
File: /graphic/browser/xml/io.pli
Key:
    Removed line
    Added line
module "/pliant/language/unsafe.pli"
module "/pliant/language/stream.pli"
module "tree.pli"
module "parser.pli"

#------------------------------------------------------------------------
# file input/output


type XmlTemp
  field Pointer:XmlTree tree
  field (Pointer Pointer:XmlTree) last

type XmlTreeParser
  field Address node <- null
  field Pointer:Address last
  field CBool lowercase <- false

XmlParser maybe XmlTreeParser

method parser new_text text ptr
  oarg_rw XmlTreeParser parser ; arg Str text ; arg_w Arrow ptr
  var Pointer:XmlTree t :> new_xml_node
  t text := text
  var Link:XmlTemp o :> new XmlTemp
  o tree :> t
  o last :>> t first
  ptr := addressof o

method parser is_raw_tag tag -> c
  oarg_rw XmlParser parser ; arg Str tag ; arg CBool c
  c := tag="script"

method parser new_tag tag ptr
  oarg_rw XmlTreeParser parser ; arg Str tag ; arg_w Arrow ptr
  var Pointer:XmlTree t :> new_xml_node
  t tag := tag
  if parser:lowercase
    t tag := lower tag
  else
    t tag := tag
  var Link:XmlTemp o :> new XmlTemp
  o tree :> t
  o last :>> t first
  ptr := addressof o

method parser set_tag_attribute tag attribute value
  oarg_rw XmlTreeParser parser ; arg Address tag ; arg Str attribute value
  var Link:XmlTemp o :> tag map XmlTemp
  o:tree attribute attribute := value
  if parser:lowercase
    o:tree attribute lower:attribute := value
  else
    o:tree attribute attribute := value

method parser bind tag parent
  oarg_rw XmlTreeParser parser ; arg Address tag parent
  var Link:XmlTemp n :> tag map XmlTemp
  var Link:XmlTemp p :> parent map XmlTemp
  p last :> n tree
  p last :>> n:tree next
  n:tree next :> null map XmlTree

method tree load stream options
  arg_rw XmlTree tree ; arg_rw Stream stream ; arg Str options
  tree := var XmlTree empty_tree
  tree := var XmlTree empty_tree ; tree tag := "root"
  var Link:XmlTemp o :> new XmlTemp
  o tree :> tree
  o last :>> tree first
  var Link:XmlTreeParser parser :> new XmlTreeParser
  parser lowercase := options option "lowercase"
  parser parse stream addressof:o  

method tree load filename options -> status
  arg_rw XmlTree tree ; arg Str filename options ; arg Status status
  (var Stream s) open filename options in+safe
  tree load s options
  status := shunt s=success success failure


method n save s xml
  arg XmlTree n ; arg_rw Stream s ; arg CBool xml
  if n:tag<>""
    s writechars "<"+n:tag
    n first_attr (var Str attr) (var Str value)
    while attr<>""
      s writechars " "+attr+"=[dq]"+value+"[dq]"
      n next_attr (var Str attr) (var Str value)
    if xml and not (exists n:first)
      s writechars " /"
    s writechars ">"
    if (exists n:first) and n:first:text<>"" and not (exists n:first:next)
      s writeline n:first:text+"</"+n:tag+">"
    else
      s writeline ""
      var Pointer:XmlTree c :> n first
      while exists:c
        c save s xml
        c :> c next
      if (exists n:first)
        s writeline "</"+n:tag+">"
  eif n:text<>""
    s writeline n:text
  else
    var Pointer:XmlTree c :> n first
    while exists:c
      c save s xml
      c :> c next

method tree save stream options
  arg XmlTree tree ; arg_rw Stream stream ; arg Str options
  tree save stream (options option "xml")
  
method tree save filename options -> status
  arg XmlTree tree ; arg Str filename options ; arg Status status
  (var Stream s) open filename options out+safe
  tree save s options
  status := shunt s=success success failure


export '. load' '. save'