Patch title: Release 86 bulk changes
Abstract:
File: /pliant/language/debug/profiler.page
Key:
    Removed line
    Added line
module "/pliant/language/stream.pli"
module "/pliant/language/unsafe.pli"
module "/pliant/admin/file.pli"
module "profiler.pli"

requires "administrator"

title "Profiler report"

var Str temp := file_temporary
(var Stream s) open temp out+safe
profiler_report "" "" s
s open temp in+safe
table columns 3 border 0
  cell header [Function name]
  cell header [Position]
  cell header [Count]
  while not s:atend
    if (s:readline parse (var Str name) (var Str position) (var Int count))
      cell
        page note name
          if not (position parse any:(var Str filename) _ any)
            filename := ""
          title "Profiler details"
          para
            text "Function: "+name ; eol
            text "Position: "+position ; eol
          table columns 1
            cell
              var Str temp2 := file_temporary
              (var Stream s2) open temp2 out+safe
              profiler_report name position s2
              s2 open temp2 in+safe
              var (Dictionary Int Int) lines
              table columns 2 border 0
                cell header [Position]
                cell header [Count]
                while not s2:atend
                  if (s2:readline parse (var Str position) (var Int count))
                    cell
                      text position
                    cell
                      text string:count
                  if (position parse pattern:filename _ any (var Int y) (var Int x) any)
                    var Pointer:Int pl :> lines first y
                    if not exists:pl
                      lines insert y 0
                      pl :> lines first y
                    pl += count
              s2 close
              file_delete temp2
          if filename<>""
            s2 open filename in+safe
            table columns 5 border 0 enlarge 0
              while not s2:atend
                var Str l := s2 readline
                var Pointer:Int c :> lines first s2:line_number
                cell
                  small text:(string s2:line_number)
                cell fixed:[  ]
                cell
                  if exists:c
                    text string:c
                cell fixed:[  ]
                if exists:c
                  cell color lsh 80 25 120
                  cell color (color hsl 120 25 80)
                    fixed text:l
                else
                  cell
                    fixed text:l
      cell
        text position
      cell
        text string:count
s close
file_delete temp

button "Reset profiler datas"
  profiler_reset
  reload_page
para
  var Bool recurse := profiler_recurse
  select "Profiling mode: " recurse noeol
    option "single stage" "false"  
    option "recursive" "true"
  button "Change mode"
    profiler_recurse := recurse
    reload_page