#!/usr/bin/php
<?php
libxml_use_internal_errors(true);

$proc = 0;
$XML = array();
$keys = null;

function display_xml_error($error, $xml)
{
    $return  = $xml[$error->line - 1] . "\n";
    $return .= str_repeat('-', $error->column) . "^\n";

    switch ($error->level) {
        case LIBXML_ERR_WARNING:
            $return .= "Warning $error->code: ";
            break;
         case LIBXML_ERR_ERROR:
            $return .= "Error $error->code: ";
            break;
        case LIBXML_ERR_FATAL:
            $return .= "Fatal Error $error->code: ";
            break;
    }

    $return .= trim($error->message) .
               "\n  Line: $error->line" .
               "\n  Column: $error->column";

    if ($error->file) {
        $return .= "\n  File: $error->file";
    }

    return "$return\n\n--------------------------------------------\n\n";
}

$XML = simplexml_load_file( $argv[1] );
if( !$XML ) {
    error_log("Parse Error in $argv[1]:\n");
    $errors = libxml_get_errors();
    error_log(" There was " . count($errors) . " errors\n");
    foreach ($errors as $error) {
        error_log( " - " . display_xml_error($error, $XML) . "\n");
    }
    libxml_clear_errors();
    exit(1);
}

$keys = $XML->DICTIONARY;

echo "#proc\tthid\tkey\teventid\tstart\tend\tduration\n";

$proc = 0;
foreach($XML->DISTRIBUTED_PROFILE->NODE as $node) {
    $thid = $th->IDENTIFIER;
    foreach($node->PROFILES->THREAD as $th) {
        $thid = 0;
        foreach( $th->KEY as $key ) {
            $nb = $key['ID'];
            $kn = "NOTFOUND";
            foreach($keys->KEY as $k) {
                if( $k['ID'] == "$nb" ) {
                    $kn = $k->NAME;
                    break;
                }
            }
            foreach( $key->EVENT as $e ) {
                $start = $e->START;
                $end = $e->END;
                $id = $e->ID;
                $duration = $end-$start;
                echo "$proc\t$thid\t$kn\t$id\t$start\t$end\t$duration\n";
            }
        }
        $thid++;
    }
    $proc++;
}

?>
