# Usage:
#
# [human readable text format]
# cat gc.arguments.ErgoArgsPrinter.log | tclsh parse.tcl
#
# [comma-separated-values format]
# cat gc.arguments.ErgoArgsPrinter.log | tclsh parse.tcl -csv


proc get_time {time} {
    set msec 0
    if {[regexp {^.(.*)[.]0*(.*)Z.$} $time dummy a b]} {
        set sec [clock scan $a -format %Y-%m-%dT%H:%M:%S]
        set msec [expr $sec * 1000 + $b / 1000000]
    }

    return $msec
}


set fields {
    mx
    ms
    InitialHeapSize
    MinHeapSize
    MaxHeapSize
}

foreach f $fields {
    set val(0,$f) $f
}

set n 0
while {![eof stdin]} {
    set line [gets stdin]
    if {[regexp {^Command line:} $line]} {
        foreach f $fields {
            set val($n,$f) 0

            if {[regexp " \[-\]X${f}(\[^ \]+)" $line dummy v] ||
                [regexp " \[-\]XX:${f}=(\[^ \]+)" $line dummy v]} {
                if {[regexp {(^[0-9]+)[kK]$} $v dmmy k]} {
                    set v [expr $k * 1024]
                } elseif  {[regexp {(^[0-9]+)[mM]$} $v dmmy m]} {
                    set v [expr $m * 1024 * 1024]
                } elseif {![regexp {^[0-9]+$} $v]} {
                    puts "unparsable $v for $f in $line"
                    exit
                }

                set val($n,$f) $v
            }
        }
    } elseif {[regexp {(.*) Gathering output for process ([0-9]+)} $line dummy time pid]} {
        set started [get_time $time]
        set val($n,pid) $pid
    } elseif {[regexp {(.*) Waiting for completion finished for} $line dummy time]} {
        set val($n,Elapsed) [expr [get_time $time] - $started]
        incr n
    }
}

set cols [list pid]
set cols [concat $cols $fields]
set cols [concat $cols {Elapsed}]

foreach c $cols {
    set width($c) [string length $c]
}

for {set i 0} {$i < $n} {incr i} {
    foreach c $cols {
        set w [string length $val($i,$c)]
        if {$width($c) < $w} {
            set width($c) $w
        }
    }
}

proc fmt {c string} {
    global width argv
    set n $width($c)
    if {"$argv" == "-csv"} {
        puts -nonewline ${string},
    } else {
        puts -nonewline [format " %${n}s" $string]
    }
}

foreach c $cols {
    fmt $c $c
}
puts ""

for {set i 0} {$i < $n} {incr i} {
    foreach c $cols {
        fmt $c $val($i,$c)
    }
    puts ""
}
