#!/usr/bin/perl
#
# Scrub the variable fields from the perf trace2 output to
# make testing easier.

use strict;
use warnings;

my $qpath = '\'[^\']*\'|[^ ]*';

my $col_depth=0;
my $col_thread=1;
my $col_event=2;
my $col_repo=3;
my $col_t_abs=4;
my $col_t_rel=5;
my $col_category=6;
my $col_rest=7;

# This code assumes that the trace2 data was written with bare
# turned on (which omits the "<clock> <file>:<line> | <parents>"
# prefix.

while (<>) {
    my @tokens = split /\|/;

    foreach my $col (@tokens) { $col =~ s/^\s+|\s+$//g; }

    if ($tokens[$col_event] =~ m/^start/) {
	# The 'start' message lists the contents of argv in $col_rest.
	# On some platforms (Windows), argv[0] is *sometimes* a canonical
	# absolute path to the EXE rather than the value passed in the
	# shell script.  Replace it with a placeholder to simplify our
	# HEREDOC in the test script.
	my $argv0;
	my $argvRest;
	$tokens[$col_rest] =~ s/^($qpath)\W*(.*)/_EXE_ $2/;
    }
    elsif ($tokens[$col_event] =~ m/cmd_path/) {
	# Likewise, the 'cmd_path' message breaks out argv[0].
	#
	# This line is only emitted when RUNTIME_PREFIX is defined,
	# so just omit it for testing purposes.
	# $tokens[$col_rest] = "_EXE_";
	goto SKIP_LINE;
    }
    elsif ($tokens[$col_event] =~ m/cmd_ancestry/) {
	# 'cmd_ancestry' is platform-specific and not implemented everywhere,
	# so skip it.
	goto SKIP_LINE;
    }
    elsif ($tokens[$col_event] =~ m/child_exit/) {
	$tokens[$col_rest] =~ s/ pid:\d* / pid:_PID_ /;
    }
    elsif ($tokens[$col_event] =~ m/data/) {
	if ($tokens[$col_category] =~ m/process/) {
	    # 'data' and 'data_json' events containing 'process'
	    # category data are assumed to be platform-specific
	    # and highly variable.  Just omit them.
	    goto SKIP_LINE;
	}
	if ($tokens[$col_category] =~ m/fsync/) {
	    # fsync events aren't interesting for the test
	    goto SKIP_LINE;
	}
    }
    elsif ($tokens[$col_event] =~ m/timer/) {
	# This also captures "th_timer" events
	$tokens[$col_rest] =~ s/ total:\d+\.\d*/ total:_T_TOTAL_/;
	$tokens[$col_rest] =~ s/ min:\d+\.\d*/ min:_T_MIN_/;
	$tokens[$col_rest] =~ s/ max:\d+\.\d*/ max:_T_MAX_/;
    }

    # t_abs and t_rel are either blank or a float.  Replace the float
    # with a constant for matching the HEREDOC in the test script.
    if ($tokens[$col_t_abs] =~ m/\d/) {
	$tokens[$col_t_abs] = "_T_ABS_";
    }
    if ($tokens[$col_t_rel] =~ m/\d/) {
	$tokens[$col_t_rel] = "_T_REL_";
    }

    my $out;

    $out = join('|', @tokens);
    print "$out\n";

  SKIP_LINE:
}


