Patch title: Release 94 bulk changes
Abstract:
File: /pliant/language/context/config.pli
Key:
    Removed line
    Added line
   
# Please do not use at the moment


module "/pliant/install/ring2.pli"
module "/pliant/language/data/string_cast.pli"
module "/pliant/language/stream.pli"
module "/pliant/admin/file.pli"

constant old_this_computer_support true


if old_this_computer_support

  module "/pliant/util/encoding/html.pli"

  function config_old_path path -> oldpath
    arg Str path oldpath
    oldpath := ""
    if path="host/name"
      oldpath := "pliant/identity/name"
    eif path="host/domain"
      oldpath := "pliant/identity/domain"


function config_read_it path data type -> status
  arg Str path ; arg_rw Universal data ; arg Type type ; arg Status status
  type destroy_instance addressof:data
  type build_instance addressof:data
  status := failure
  (var Stream s) open "security:/config.txt" in+safe
  while not s:atend
    if (s:readline parse any:(var Str p) _ any:(var Str v))
      if p=path
        status := from_string addressof:data type v ""
  if old_this_computer_support and status=failure
    var Str oldpath := config_old_path path
    if oldpath<>""
      (var Stream s) open "security:/this_computer.pdb" in+safe
      while not s:atend
        if (s:readline eparse any "<pdata path=[dq]" any:(var Str subpath) "[dq]" any ">" any:(var Str value) "</pdata>" any)
          if subpath="/env/"+oldpath
            status := from_string addressof:data type html_decode:value "db"

meta config_read e
  if e:size<>2 or not (e:0 cast Str)
    return
  e:1 compile ?
  var Pointer:Type t :> e:1:result:type real_data_type
  if not (e:1 cast t)
    return
  var Link:Argument a :> argument local Status
  e suckup e:0 ; e suckup e:1
  e add (instruction (the_function config_read_it Str Universal Type -> Status) e:0:result e:1:result (argument mapped_constant Type t) a)
  e set_result a access_read


function config_write_it path data type -> status
  arg Str path ; arg_rw Universal data ; arg Type type ; arg Status status
  (var Stream s) open "security:/config.txt" in+safe
  (var Stream d) open "security:/config.tmp" out+safe
  d safe_configure "journal"
  var CBool found := false
  while not s:atend
    if (s:readline parse any:(var Str p) _ any:(var Str v))
      if p=path
        v := to_string addressof:data type ""
        found := true
      d writeline p+" "+v
  if not found
    d writeline path+" "+(to_string addressof:data type "")
  s close
  if d:close=failure
    file_delete "security:/config.tmp"
    return failure
  file_delete "security:/config.txt"
  file_move "security:/config.tmp" "security:/config.txt"
  file_directory_flush "security:/"
  status := success

meta config_write e
  if e:size<>2 or not (e:0 cast Str)
    return
  e:1 compile ?
  var Pointer:Type t :> e:1:result:type real_data_type
  if not (e:1 cast t)
    return
  var Link:Argument a :> argument local Status
  e suckup e:0 ; e suckup e:1
  e add (instruction (the_function config_write_it Str Universal Type -> Status) e:0:result e:1:result (argument mapped_constant Type t) a)
  e set_result a access_read


function config_list path -> keys
  arg Str path ; arg (Index Str Void) keys
  keys := var (Index Str Void) no_keys
  (var Stream s) open "security:/config.txt" in+safe
  while not s:atend
    if (s:readline parse any:(var Str p) _ any:(var Str v))
      if p=path
        status := from_string addressof:data type v ""
  if old_this_computer_support and status=failure
    var Str oldpath := config_old_path path
    if oldpath<>""
      (var Stream s) open "security:/this_computer.pdb" in+safe
      while not s:atend
        if (s:readline eparse any "<pdata path=[dq]" any:(var Str subpath) "[dq]" any ">" any:(var Str value) "</pdata>" any)
          if subpath="/env/"+oldpath
            status := from_string addressof:data type html_decode:value "db"


export config_read config_write config_list