<?php

$DEBUG=0;

if($DEBUG){
  $mysql_link=mysql_connect("127.0.0.1","llvm","ll2002vm") or die("Could not connect to server $!\n");
  mysql_select_db("nightlytestresults");
}

/*
 * This variable is used to determine file size cutoffs for displaying
 */
$byte_threshold=1000;

/*
 * These variables are used in determining
 * how to color table cells;
 */
$medium_number=0;
$medium_change=5;
$large_number=0;
$large_change=15;
$crazy_number=0;
$crazy_change=30;
$medium_increase="#FFD0D0";
$large_increase="#FF8080";
$crazy_increase="#FF2020";
$medium_decrease="#CCFFCC";
$large_decrease="#90FF90";
$crazy_decrease="#20FF20";

$category_match=array("GCCAS","Bytecode","LLC\<br\>compile",
          "LLC-BETA\<br\>compile","JIT\<br\>codegen","GCC",
          "CBE","LLC","LLC-BETA","JIT","GCC\/\<br\>CBE",
          "GCC\/\<br\>LLC","GCC\/\<br\>LLC-BETA");
$category_array=array("GCCAS","Bytecode","LLC compile","LLC\-BETA compile",
                 "JIT codegen","GCC","CBE","LLC",
                 "LLC\-BETA","JIT","GCC\/\s*CBE", "GCC\/\s*LLC",
                 "GCC\/\s*LLC\-BETA","LLC\/\s*LLC\-BETA");
$category_print_array=array("GCCAS","Bytecode","LLC compile","LLC-BETA compile",
                 "JIT codegen","GCC","CBE","LLC",
                 "LLC-BETA","JIT","GCC/ CBE", "GCC/ LLC",
                 "GCC/ LLC-BETA","LLC/ LLC-BETA");
                 
$category_print_array_description=array("GCCAS - Time to run LLVM optimizers on the<br>".
                    "program.",
                        
                    "Bytecode - The size of the bytecode for the<br>".
                    "program.",
                        
                    "LLC compile - The time taken to compile with LLC<br>".
                    "(the static backend).",
                    
                    "LLC-BETA compile - The time taken compile with LLC<br>".
                    "using experimental features.",
                        
                    "JIT codegen - The amount of time spent in the JIT<br>".
                    "itself, as opposed to executing the program.",
                    
                    "GCC - The time taken to execute the program when<br>".
                    "compiled with GCC -O2.",
                    
                    "CBE - The time taken to execute the program after<br>".
                    "compilation through the C backend, compiled with<br>".
                    "-O2.",
                        
                    "LLC - The length of time the program generated by<br>".
                    "the static backend LLC takes to execute.",
                    
                    "LLC-BETA - How long the program generated by the<br>".
                    "experimental static back end takes to execute.",
                        
                    "JIT codegen - The amount of time spent in the JIT<br>".
                    "itself, as opposed to executing the program.",
                        
                    "GCC/CBE - The speed-up of the CBE output vs the<br>".
                    "native GCC output: greater than 1 is a speedup,<br>".
                    "less than 1 is a slowdown.",
                    
                    "GCC/LLC - The speed-up of the LLC output vs the<br>".
                    "native GCC output: greater than 1 is a speedup,<br>".
                    "less than 1 is a slowdown.",
                    
                    "GCC/ LLC-BETA - The speed-up of the LLC output<br>".
                    "vs the native GCC output: greater than 1 is a<br>".
                    "speedup, less than 1 is a slowdown.",
                    
                    "LLC/ LLC-BETA - The speed-up of the LLC output<br>".
                    "vs the LLV-BETA output: greater than 1 is a <br>".
                    "speedup, less than 1 is a slowdown.");
                 
$category_print_array_ordered=array("CBE","LLC","JIT","GCCAS",
    "Bytecode","LLC compile","LLC-BETA compile",
                "JIT codegen", "LLC-BETA");
                
$category_print_array_ordered_description=array("CBE - The time taken to execute the program after<br>".
                        "compilation through the C backend, compiled with<br>".
                        "-O2.",
                        
                        "LLC - The length of time the program generated by<br>".
                        "the static backend LLC takes to execute.",
                        
                        "JIT - The amount of time spent running the program<br>".
                        "with the JIT; this includes the code generation<br>".
                        "phase and actually running the program.",
                        
                        "GCCAS - Time to run LLVM optimizers on the<br>".
                        "program.",
                        
                        "Bytecode - The size of the bytecode for the<br>".
                        "program.",
                        
                        "LLC compile - The time taken to compile with LLC<br>".
                        "(the static backend).",
                        
                        "LLC-BETA compile - The time taken compile with LLC<br>".
                        "using experimental features.",
                        
                        "JIT codegen - The amount of time spent in the JIT<br>".
                        "itself, as opposed to executing the program.",
                        
                        "LLC-BETA - How long the program generated by the<br>".
                        "experimental static back end takes to execute.");    


/*
 * Returns an array that contains the name of the program as the 
 * index and an array as the element of the array. The first element
 * in the second array will be either "multisource", "singlesource", or
 * "extenal." 
 *
 */
function GetDayResults($night_id, $array_of_measures ){
  $result=array();
  $query = "SELECT program, type, result FROM program WHERE night=$night_id ORDER BY program ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while($row = mysql_fetch_assoc($program_query)){
    $program = rtrim($row['program'], ": ");
    $result[$program] = array();
    array_push($result[$program], "{$row['type']}");
    $index=0;
    $data = $row['result'];
    $data = str_replace("<br>", " ", $data);
    foreach ($array_of_measures as $x){
      $value=array();
      $reg_exp="/$x:\s*([[0-9\.]+|\*|\-|n\/a|\?],)/";
      #print "{$program} => running preg_match($reg_exp, $data, $value)<br>\n";
      preg_match($reg_exp, $data, $value);
      if(isset($value[1])){
        array_push($result[$program], $value[1]);
      }
      else{
        array_push($result[$program], "-");  
      }
      $index++;
    }//end foreach
  }//end while
  mysql_free_result($program_query);
  return $result;
}//end function GetDayResults

/*
 * returns an array with the differences of each measurement
 * for each program, It will ignore differences of $min_diff
 *
 */
function CalculateChangeBetweenDays($yesterday_results, $today_results, $min_diff=2){
  $result=array();
  $medium_change=0;
  $large_change=0;
  $crazy_change=0;
  foreach ( array_keys($today_results) as $x){
    $result["$x"]=array();
    array_push($result["$x"], "{$today_results["$x"][0]}");
    for($y=1; $y<sizeof($today_results["$x"])-3; $y++){
      if(isset($yesterday_results["$x"][$y]) && $yesterday_results["$x"][$y]!=0){
        $delta=0;
        #$delta = round($today_results["$x"][$y] - $yesterday_results["$x"][$y],2);
        $delta = $today_results["$x"][$y] - $yesterday_results["$x"][$y];
        if(($delta > $min_diff || $delta < (-1*$min_diff)) &&
            $today_results["$x"][$y]!=0 &&
            $yesterday_results["$x"][$y]!=0){
          $result["$x"][$y-1]=(($today_results["$x"][$y] - $yesterday_results["$x"][$y])/$yesterday_results["$x"][$y])*100;
        }
        else{
          $result["$x"][$y-1]="n/a";
        }
      }
      else{
        $result["$x"][$y-1]="n/a";
      }
      if($result["$x"][$y-1]>=$GLOBALS['medium_change']){
        $GLOBALS['medium_number']++;        
      }
      if($result["$x"][$y-1]>=$GLOBALS['large_change']){
        $GLOBALS['large_number']++;
      }
      if($result["$x"][$y-1]>=$GLOBALS['crazy_change']){
        $GLOBALS['crazy_number']++;
      }
    }//end for        
  }//end foreach
  return $result;
}//end function


function CountSignifigantDifferences($percent_difference_arr, $measure_index, $delta){
  $result=0;
  foreach( array_keys($percent_difference_arr) as $x ){
    if($percent_difference_arr["$x"][$measure_index]>=$delta ||
       $percent_difference_arr["$x"][$measure_index]<=(-1*$delta)){
      $result++;
    }  
  }
  return $result;
}

function DetermineColor($number, $def_color="white"){  
  $result=$def_color;
  if($number>=$GLOBALS['crazy_change']){
    $result=$GLOBALS['crazy_increase'];
  }
  else if($number>=$GLOBALS['large_change']){
    $result=$GLOBALS['large_increase'];
  }
  else if($number>=$GLOBALS['medium_change']){
    $result=$GLOBALS['medium_increase'];
  }
  else if($number<=($GLOBALS['crazy_change']*-1)){
    $result=$GLOBALS['crazy_decrease'];
  }
  else if($number<=($GLOBALS['large_change']*-1)){
    $result=$GLOBALS['large_decrease'];
  }
  else if($number<=($GLOBALS['medium_change']*-1)){
    $result=$GLOBALS['medium_decrease'];
  }
  return $result;
  
}

/*
 * This will return an array which contains:
 * program name, measure, test type, % change, old value, new value 
 * The keys of the array will be the numbers 0 - size of array
 *
 */
function getSignifigantChanges($day, $prev_day, $diff, $measure){
  $result=array();
  foreach(array_keys($diff) as $program){
    for($x=0; $x<sizeof($diff["$program"]); $x++){
      if($diff["$program"][$x]>$GLOBALS['medium_change']){
        array_push($result, array($program, $measure[$x], $day["$program"][0], round($diff["$program"][$x],2), $prev_day["$program"][$x+1], $day["$program"][$x+1]));   
      }
    }//end for
  }//end foreach
  return $result;
}//end function

/*
 * This will return an array which contains:
 * program name, measure, test type, % change from yesterday,
 * old value, new value 
 * The keys of the array will be the numbers 0 - size of array
 *
 */
function getTwoDaySignifigantChanges($day, $prev_day, $diff, $measure){
  $result=array();
  foreach(array_keys($diff) as $program){
    for($x=0; $x<sizeof($diff["$program"]); $x++){
      if(strcmp($diff["$program"][$x],"-")!=0 && 
         ($diff["$program"][$x]>$GLOBALS['medium_change'] ||
          $diff["$program"][$x]<(-1 * $GLOBALS['medium_change']))){
        array_push($result, 
             array($program, 
               $measure[$x], 
             $day["$program"][0], 
             round($diff["$program"][$x],2), 
             "n/a", 
             $prev_day["$program"][$x+1], 
                         $day["$program"][$x+1]));   
      }
    }//end for
  }//end foreach
  return $result;
}//end function

/*
 * This will return an array which contains:
 * program name, measure, test type, % change from yesterday,
 * % change from two days ago , old value, new value 
 * The keys of the array will be the numbers 0 - size of array
 *
 */
function getThreeDaySignifigantChanges($day, $prev_day, $old_day, $diff, $twoday_diff, $measure){
  $result=array();
  foreach(array_keys($diff) as $program){
    for($x=0; $x<sizeof($diff["$program"]); $x++){
      if(strcmp($diff["$program"][$x],"-")!=0 && 
         ($diff["$program"][$x]>$GLOBALS['medium_change'] ||
          $diff["$program"][$x]<(-1 * $GLOBALS['medium_change']))){
        array_push($result, 
             array($program, 
               $measure[$x], 
             $day["$program"][0], 
             round($diff["$program"][$x],2), 
             round($twoday_diff["$program"][$x],2), 
             $prev_day["$program"][$x+1], 
                         $day["$program"][$x+1]));   
      }
    }//end for
  }//end foreach
  return $result;
}//end function

/*
 * Reorders the signifigant changes array by the $index'd element
 * in the 2nd array
 *
 */
function sortSignifigantChangeArray($changes, $index){
  $temp_arr=array();
  foreach (array_keys($changes) as $prog){
    array_push($temp_arr, $changes["$prog"][$index]);
  }
  array_multisort($temp_arr, SORT_DESC, SORT_REGULAR, $changes, SORT_DESC, SORT_REGULAR);
}


/*
 * This function takes in a mysql link, start date, end date, 
 * machine id, an array of programs, and a measurement
 * and will return and array with the dates as 
 * keys and the data for each key
 * being an array containing (date in seconds since epoch, program[0], program[1], ... , 
 * program[n]) for all the data between the two dates
 */
function buildResultsHistory($machine_id, $programs, $measure , $start="2000-01-01 01:01:01", $end="2020-01-01 01:01:01"){
  $preg_measure = str_replace("/","\/", $measure);
  $results_arr=array();
  $query = "SELECT id, added FROM night WHERE machine=$machine_id ". 
           "AND added >= \"$start\" AND added <= \"$end\" ORDER BY added DESC";
  $night_table_query = mysql_query($query ) or die(mysql_error());
  $night_arr=array();
  $night_query="(";
  while($row = mysql_fetch_assoc($night_table_query)){
          $night_arr["{$row['id']}"]=$row['added'];
    $results_arr["{$row['added']}"]=array();
    preg_match("/(\d\d\d\d)\-(\d\d)\-(\d\d)\s(\d\d)\:(\d\d)\:(\d\d)/", "{$row['added']}", $pjs);
                $seconds = mktime($pjs[4], $pjs[5], $pjs[6], $pjs[2], $pjs[3],$pjs[1]);
    array_push($results_arr["{$row['added']}"], $seconds);
    $night_query.=" night={$row['id']} or";
  }
  $night_query.=" night=0 )";
  mysql_free_result($night_table_query);

  $RELEVANT_DATA=0; //will be 0 if all data is null, else will be 1
  $prog_index=1;
  foreach ($programs as $prog){
    $prog=str_replace(" ", "+", $prog);
    $query="SELECT night, result FROM program WHERE program=\"$prog\" ".
           "AND $night_query ORDER BY night ASC";
    $night_table_query=mysql_query($query) or die(mysql_error());
    while($row=mysql_fetch_assoc($night_table_query)){
      $row['result'] = str_replace("<br>", " ", "{$row['result']}");
      $night_id=$row['night'];
      $data="-";
      $regexp = "/$preg_measure:\s*([0-9\.]+|\?)/";
      preg_match($regexp, "{$row['result']}", $ans);
      if(isset($ans[1])){
        $data=$ans[1];
        $RELEVANT_DATA++;
      }//end if isset
      $results_arr["{$night_arr["$night_id"]}"]["$prog_index"]=$data;
    }//end while
    mysql_free_result($night_table_query);
    $prog_index++;
  }//end foreach $programs

  if($RELEVANT_DATA>0){
    return $results_arr;
  }
  else{
    return array();
  }
}

/*
 * Return reasons why a llvm test failed as an array.
 */
function getFailReasonsAsList($test_result) {
  $result = array();
  $phases = split(", ", $test_result);
  
  for ($i = 0; $i < count($phases); $i++) {
    $phase = $phases[$i];
    if (strpos($phase, "*") !== false) {
      list($tool, $tool_result) = split(": ", $phase);
      array_push($result, $tool);
    }
  }
  
  return $result;
}

/*
 * Return reasons why a llvm test failed as a string.
 */
function FailReasonsAsString($reasons) {
  if (count($reasons) != 0) {
    $result = " [";
    for ($i = 0; $i < count($reasons); $i++) {
      if ($i != 0) {
        $result .= ", ";
      }
      $result .= $reasons[$i];
    }
    
    $result .= "] ";
  }
  
  return $result;
}

/*
 * Trim test path to exclude redundant info.
 */
function trimTestPath($program) {
  $parts = split("llvm/test/", $program);
  if ($parts != FALSE) {
    if (count($parts) >= 2) {
      $tail = $x[1];
      if (isset($tail)) {
        $program = "test/" . $tail;
      }
    }
  }
  return rtrim($program, ": ");;
}
 
 
/*
 * Get failing tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test 
 * in their own table as opposed in the night table.
 */
function getFailures($night_id) {
  $result="";
  if ($night_id >= 684) {
    $query = "SELECT program FROM tests WHERE night=$night_id AND result=\"FAIL\" ORDER BY program ASC";
    $program_query = mysql_query($query) or die (mysql_error());
    while($row = mysql_fetch_assoc($program_query)) {
      $program = trimTestPath($row['program']);
      $result .= $program . "\n";
    }
    mysql_free_result($program_query);

    $query = "SELECT program, result FROM program WHERE night=$night_id ORDER BY program ASC";
    $program_query = mysql_query($query) or die (mysql_error());
    while($row = mysql_fetch_assoc($program_query)) {
      $test_result = $row['result'];
      if (!isTestPass($test_result)) {
        $program = trimTestPath($row['program']);
        $reasons = FailReasonsAsString(getFailReasonsAsList($test_result));        
        $result .= $program . $reasons . "\n";
      }
    }
    mysql_free_result($program_query);
  }
  return $result;
}

/*
 * Get Unexpected failing tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test 
 * in their own table as opposed in the night table.
 */
function getUnexpectedFailures($night_id){
  $result="";
  if($night_id<684){
    $query = "SELECT unexpfail_tests FROM night WHERE id = $night_id";
    $program_query = mysql_query($query) or die (mysql_error());
    $row = mysql_fetch_assoc($program_query);
    $result= $row['unexpfail_tests'];
    mysql_free_result($program_query);
  }
  else{
    $query = "SELECT program FROM tests WHERE night=$night_id AND result=\"FAIL\"";
    $program_query = mysql_query($query) or die (mysql_error());
    while($row = mysql_fetch_assoc($program_query)){
      $program = trimTestPath($row['program']);
      $result .= $program . "\n";
    }
    mysql_free_result($program_query);
  }
  return $result;
}

/*
 * HTMLify test results
 *
 */
function htmlifyTestResults($result) {
  $result = preg_replace("/\n/", "<br>\n", $result);
  $result = preg_replace("/\[/", "<font color=\"grey\">[", $result);
  $result = preg_replace("/\]/", "]</font>", $result);
  return $result;
 }

/*
 * Get set of tests
 *
 * Returns a hash of tests for a given night.
 */
function getTestSet($id, $table){
  $test_hash = array();
  $query = "SELECT program, result FROM $table WHERE night=$id";
  $program_query = mysql_query($query) or die (mysql_error());
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    $test_hash[$program] = $row['result'];
  }
  mysql_free_result($program_query);
  return $test_hash;
}

/*
 * Get list of excluded tests
 *
 * Returns a list of tests for a given night that were excluded from the
 * hash.
 */
function getExcludedTests($id, $table, $test_hash){
  $result = "";
  $query = "SELECT program FROM $table WHERE night=$id ORDER BY program ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    if (!isset($test_hash[$program])) {
      $result .= $program . "\n";
    }
  }
  mysql_free_result($program_query);
  return $result;
}

/*
 * Get New Tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test 
 * in their own table as opposed in the night table.
 */
function getNewTests($cur_id, $prev_id){
  if (strlen($prev_id) === 0 || strlen($cur_id) === 0) {
    return "";
  }
  
  $result="";
  if($cur_id<684){
    $query = "SELECT new_tests FROM night WHERE id = $cur_id";
    $program_query = mysql_query($query) or die (mysql_error());
    $row = mysql_fetch_assoc($program_query);
    $result = $row['new_tests'];
    mysql_free_result($program_query);
  } else {
    $test_hash = getTestSet($prev_id, "tests");
    $result .= getExcludedTests($cur_id, "tests", $test_hash);
    
    $test_hash = getTestSet($prev_id, "program");
    $result .= getExcludedTests($cur_id, "program", $test_hash);
  }
  return $result;
}

/*
 * Get Removed Tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test 
 * in their own table as opposed in the night table.
 */
function getRemovedTests($cur_id, $prev_id){
  if (strlen($prev_id) === 0 || strlen($cur_id) === 0) {
    return "";
  }
  
  $result="";
  if($cur_id<684){
    $query = "SELECT removed_tests FROM night WHERE id = $cur_id";
    $program_query = mysql_query($query) or die (mysql_error());
    $row = mysql_fetch_assoc($program_query);
    $result = $row['removed_tests'];
    mysql_free_result($program_query);
  } else {
    $test_hash = getTestSet($cur_id, "tests");
    $result .= getExcludedTests($prev_id, "tests", $test_hash);
    
    $test_hash = getTestSet($cur_id, "program");
    $result .= getExcludedTests($prev_id, "program", $test_hash);
  }
  return $result;
}

/*
 * Does the test pass
 *
 * Return true if the test result indicates a pass.  For "tests" the possible
 * conditions are "PASS", "FAIL" and "XFAIL" (expected to fail.)
 */
function isTestPass($test_result) {
  return !(strcmp($test_result, "FAIL") == 0 || strpos($test_result, "*") !== false);
}

/*
 * Get set of tests that fail
 *
 * Returns a hash of tests that fail for a given night.
 */
function getTestFailSet($id) {
  $test_hash = array();
  
  $query = "SELECT program, result, measure FROM tests WHERE night=$id AND result=\"FAIL\" ORDER BY program ASC, measure ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    $measure = strtoupper($row['measure']);
    $key = "$program [$measure]";
    $test_hash[$key] = true;
  }
  mysql_free_result($program_query);
  
  $query = "SELECT program, result FROM program WHERE night=$id ORDER BY program ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    $test_result = $row['result'];
    $reasons = getFailReasonsAsList($test_result);
    
    if (count($reasons) != 0) {
      $test_hash[$program] = $reasons;
    }
  }
  mysql_free_result($program_query);
  
  return $test_hash;
}

/*
 * Get list of newly passing tests
 *
 * Returns a list of tests for a given night that were included in the
 * hash and now pass.
 */
function getPassingTests($id, $test_hash) {
  $passing = "";
  $query = "SELECT program, result, measure FROM tests WHERE night=$id AND result<>\"FAIL\" ORDER BY program ASC, measure ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while ($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    $measure = strtoupper($row['measure']);
    $key = "$program [$measure]";
    if (isset($test_hash[$key])) {
      $passing .= "$key\n";
    }
  }
  mysql_free_result($program_query);

  $query = "SELECT program, result FROM program WHERE night=$id ORDER BY program ASC";
  $program_query = mysql_query($query) or die (mysql_error());
  while($row = mysql_fetch_assoc($program_query)) {
    $program = trimTestPath($row['program']);
    $test_result = $row['result'];
    $new_reasons = getFailReasonsAsList($test_result);
    $old_reasons = isset($test_hash[$program]) ? $test_hash[$program] : array();
    $diff_reasons = array_diff($old_reasons, $new_reasons);

    if (count($diff_reasons) > 0) {
      $passing .= $program . FailReasonsAsString($diff_reasons) . "\n";   
    }
  }
  mysql_free_result($program_query);

  return $passing;
}

/*
 * Get Fixed Tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test 
 * in their own table as opposed in the night table.
 */
function getFixedTests($cur_id, $prev_id){
  if (strlen($prev_id) === 0 || strlen($cur_id) === 0) {
    return "";
  }
  
  $result="";
  if($cur_id<684){
    $query = "SELECT newly_passing_tests FROM night WHERE id = $cur_id";
    $program_query = mysql_query($query) or die (mysql_error());
    $row = mysql_fetch_assoc($program_query);
    $result = $row['newly_passing_tests'];
    mysql_free_result($program_query);
  } else {
    $test_hash = getTestFailSet($prev_id);
    $result .= getPassingTests($cur_id, $test_hash);
  }
  return $result;
}

/*
 * Get Broken Tests
 *
 * This is somewhat of a hack because from night 684 forward we now store the test
 * in their own table as opposed in the night table.
 */
function getBrokenTests($cur_id, $prev_id){
  if (strlen($prev_id) === 0 || strlen($cur_id) === 0) {
    return "";
  }

  $result="";
  if($cur_id<684){
    $query = "SELECT newly_failing_tests FROM night WHERE id = $cur_id";
    $program_query = mysql_query($query) or die (mysql_error());
    $row = mysql_fetch_assoc($program_query);
    $result = $row['newly_failing_tests'];
    mysql_free_result($program_query);
  } else {
    $test_hash = getTestFailSet($cur_id);
    $result .= getPassingTests($prev_id, $test_hash);
  }
  return $result;
}

/*
 * Get previous working night
 *
 * Returns the night id for the machine of the night passed in
 * where build status = OK
 */
function getPreviousWorkingNight($night_id ){
  $query = "SELECT machine FROM night WHERE id=$night_id";
  $program_query = mysql_query($query) or die (mysql_error());
  $row = mysql_fetch_assoc($program_query);
  $this_machine_id=$row['machine'];
  mysql_free_result($program_query);
  
  $query = "SELECT id FROM night WHERE machine=$this_machine_id ".
           "and id<$night_id and buildstatus=\"OK\" order by added desc";
  $program_query = mysql_query($query) or die (mysql_error());
  $row = mysql_fetch_assoc($program_query);
  $prev_id=$row['id'];
  mysql_free_result($program_query);

  return $prev_id;
}

/*
 * Email report.
 *
 */
function getEmailReport($cur_id, $prev_id) {
  $passing = getFixedTests($cur_id, $prev_id);
  $failing = getBrokenTests($cur_id, $prev_id);
  $added = getNewTests($cur_id, $prev_id);
  $removed = getRemovedTests($cur_id, $prev_id);
  
  $email = "";
  if (strcmp($passing, "") == 0) {
    $passing = "None";
  } 
  $email .= "\nNew Test Passes:\n$passing\n";
  if (strcmp($failing, "") == 0) {
    $failing = "None";
  } 
  $email .= "\nNew Test Failures:\n$failing\n";
  if (strcmp($added, "") == 0) {
    $added = "None";
  } 
  $email .= "\nAdded Tests:\n$added\n";
  if (strcmp($removed, "") == 0) {
    $removed = "None";
  } 
  $email .= "\nRemoved Tests:\n$removed\n";
  
  return $email;
}


/*$programs=array("Benchmarks/CoyoteBench/huffbench","Benchmarks/CoyoteBench/lpbench");
$history = buildResultsHistory(18, $programs,"GCCAS" );
foreach (array_keys($history) as $date){
  print "$date => ";
  foreach($history["$date"] as $data){
    print "$data, ";
  }
  print "<br>\n";
}*/

if($DEBUG){
  $today_results = GetDayResults(565, $category_array );
  $yesterday_results = GetDayResults(564, $category_array );
  $oldday_results = GetDayResults(563, $category_array );
  $percent_difference = CalculateChangeBetweenDays($yesterday_results, $today_results, .2);
  $twoday_difference = CalculateChangeBetweenDays($oldday_results, $today_results, .01);
  $count = CountSignifigantDifferences($percent_difference, 1, 25);
  $big_changes = getThreeDaySignifigantChanges($today_results, $yesterday_results, $oldday_results, $percent_difference, $twoday_difference, $category_print_array);
}

/*foreach ( array_keys($big_changes) as $x){
  print "$x => ";
  foreach ($big_changes["$x"] as $y){
    print "$y, ";
  }
  print "<br>\n";
}*/

/*foreach ( array_keys($percent_difference) as $x){
  print "$x => ";
  foreach ($percent_difference["$x"] as $y){
    print "$y, ";
  }
  print "<br>\n";
}*/




if($DEBUG){
  print "<script type=\"text/javascript\" src=\"sorttable.js\"></script>\n";
  print "<table class=\"sortable\" id=\"multisource_tests\" border='1' cellspacing='0' cellpadding='0'>\n";
  print "\t<tr bgcolor=#FFCC99>\n";
  print "\t\t<th>index</th>\n";
  print "\t\t<th>Program</th>\n";
  print "\t\t<th>Measurement</th>\n";
  print "\t\t<th>type</th>\n";
  print "\t\t<th>% Change from yesterday</th>\n";
  print "\t\t<th>% Change from two days ago</th>\n";
  print "\t\t<th>Previous day's test value</th>\n";
  print "\t\t<th>Current day's test value</th>\n";
  print "\t</tr>\n";
  print "\t<tr> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> </tr>\n";
  foreach ( array_keys($big_changes) as $x){
    print "\t<tr>";
    print "<td>$x</td>";
    foreach ($big_changes["$x"] as $y){
      print "<td>$y</td>";
    }
    print "</tr>\n";
  }
  print "</table>";
}


?>
