#include "coveragebrowserapi.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef TRUE
#define TRUE (0==0)
#endif
#ifndef FALSE
#define FALSE (0!=0)
#endif

static void my_exit(int v)
{
  coveragebrowser_stop();
  exit(v);
}

void startCoverageBrowser()
{
  char *coveragemeter=NULL;
  char coveragebrowser[1024];

  coveragemeter=getenv("COVERAGEMETER");
  if (!coveragemeter)
  {
    fprintf(stderr,"Variable COVERAGEMETER not set\n");
    exit (-1);
  }
  strcpy(coveragebrowser,coveragemeter);
#if _WINDOWS
  strcat(coveragebrowser,"\\coveragebrowser.exe");
#else
  strcat(coveragebrowser,"/coveragebrowser");
#endif
  if (!coveragebrowser_start(coveragebrowser))
  {
    fprintf(stderr,"CoverageBrowser cannot be executed:%s\n",coveragebrowser_getLastErrorMessage());
    exit (-1);
  }
}

void openCSMEsFile(const char*file)
{
  if (!coveragebrowser_openCSMesFile(file))
  {
    fprintf(stderr,"Cannot open file '%s':%s\n",file,coveragebrowser_getLastErrorMessage());
    my_exit (-1);
  }
  coveragebrowser_setCoverageLevel(1);
  coveragebrowser_selectCodeCoverageBranchOnly(FALSE);
  coveragebrowser_selectTestCountMode(FALSE);
}

void displayStatistic()
{
  char **executions=NULL;
  int nb_tested,nb_untested;
  executions=coveragebrowser_getExecutionList();
  if (! executions)
  {
    fprintf(stderr,"Error reading execution list:%s\n",coveragebrowser_getLastErrorMessage());
    my_exit (-1);
  }
  if (!coveragebrowser_executionStatistics(executions,&nb_tested,&nb_untested))
  {
    fprintf(stderr,"Cannot compute statistics:%s\n",coveragebrowser_getLastErrorMessage());
    my_exit (-1);
  }

  if (nb_tested+nb_untested==0)
    printf("The code is not instrumented\n");
  else
  {
    float stat;
    stat = (float)(nb_tested)/(float)(nb_tested+nb_untested) *  100.0 ;
    printf("Code Coverage Statistic: %8.2f%%\n",stat);
  }
  coveragebrowser_free_CStringTable(&executions);
}

int main(int argc, char *argv[])
{
  char *csmes;
  if (argc!=2)
  {
    fprintf(stderr,"Invalid number of arguments.\n"
        "%s <CSMes file>\n"
        "%s displays the global code coverage statistic.\n"
        , argv[0], argv[0]) ;

    my_exit(-1);
  }
  csmes=argv[1];

  startCoverageBrowser();
  openCSMEsFile(csmes);
  displayStatistic();
  coveragebrowser_stop();

  return 0;
}
