#!/usr/bin/perl

#
# kitrace_to_db
# Copyright (C) 1995 by John Heidemann <johnh@ficus.cs.ucla.edu>
# $Id: kitrace_to_db,v 1.5 1997/07/14 03:44:25 johnh Exp $
#
# This program is distributed under terms of the GNU general
# public license, version 2.  See the file COPYING
# in $dblib for details.
#

sub usage {
    print STDERR <<END;
usage: $0 [registers] <kitrace_data_stream

Converts a kitrace data stream to JDB format.

Options:
    Optional arguments list registers
    which will be picked out of the output stream
    and formatted as their own columns.

Sample input:
_null_getpage+4  Nov  7 22:40:13.281070 (            ) pid 4893
_null_getpage+128 Nov  7 22:40:13.281756 (   00.000686) pid 4893
_null_getpage+4  Nov  7 22:40:13.282694 (   00.000938) pid 4893
_null_getpage+128 Nov  7 22:40:13.328709 (   00.046015) pid 4893
_null_getpage+4  Nov  7 22:40:13.330758 (   00.002049) pid 4893
_null_getpage+128 Nov  7 22:40:13.353830 (   00.023072) pid 4893
_null_getpage+4  Nov  7 22:40:13.355566 (   00.001736) pid 4893
_null_getpage+128 Nov  7 22:40:13.357169 (   00.001603) pid 4893
_null_getpage+4  Nov  7 22:40:13.358780 (   00.001611) pid 4893
_null_getpage+128 Nov  7 22:40:13.375844 (   00.017064) pid 4893
_null_getpage+4  Nov  7 22:40:13.377850 (   00.002006) pid 4893
_null_getpage+128 Nov  7 22:40:13.378358 (   00.000508) pid 4893

Sample command:
kitrace_to_db

Sample output:
#h event clock diff
_null_getpage+4  815812813.281070      0.0
_null_getpage+128  815812813.281756  00.000686
_null_getpage+4  815812813.282694  00.000938
_null_getpage+128  815812813.328709  00.046015
_null_getpage+4  815812813.330758  00.002049
_null_getpage+128  815812813.353830  00.023072
_null_getpage+4  815812813.355566  00.001736
_null_getpage+128  815812813.357169  00.001603
_null_getpage+4  815812813.358780  00.001611
_null_getpage+128  815812813.375844  00.017064
_null_getpage+4  815812813.377850  00.002006
_null_getpage+128  815812813.378358  00.000508
# | kitrace_to_db
END
    exit 1;
}

require 'timelocal.pl';

my(@orig_argv) = @ARGV;
my($prog) = &progname;
&usage if ($#ARGV > 0 && $ARGV[0] eq '-?');

# Extract the registers, if any.
$reg_input_code = '@rs=(); ';
$reg_output_code = '';
$reg_heads = '';
foreach $reg (@ARGV) {
    $reg =~ s/^%//;  # strip % from %o0
    $reg_heads = " $reg";
    $reg_input_code .= '($r) = /' . $reg . '=([\da-fA-F]+)/; push(@rs, hex($r));';
};

@MoY = ('Jan','Feb','Mar','Apr','May','Jun',
        'Jul','Aug','Sep','Oct','Nov','Dec');
$i = 0;
foreach (@MoY) {
    $MoY{$_} = $i++;
};

print "#h event clock diff$reg_heads\n";
while (<STDIN>) {
    if (/^Warning:\s+(\d+) traces were lost/) {
	print "lost_traces\t$1\t0\n";
	next;
    };
    ($event, $month, $day, $hour, $min, $sec, $frac, $diff) =
	 /(\S+)\s+(\w{3})\s+(\d+)\s+(\d{2}):(\d{2}):(\d{2})(\.\d{6})\s+\(\s*([^)]+)\)/;
     eval $reg_input_code;
     $diff = '    0.0' if ($diff !~ /\d/);
     $t = &timelocal($sec, $min, $hour, $day, $MoY{$month}, 95);
     print "$event  $t$frac  $diff";
     if ($reg_heads ne '') {
	print join(" ", '', @rs);
     };
     print "\n";
}

print "#  | $prog " . join(" ", @orig_argv) . "\n";
exit 0;
