#include <stdio.h>

#include <sys/time.h>
#if defined(SysV) || defined(__svr4__)
#include <limits.h>
#include <time.h>
#include <sys/times.h>
#else
#include <sys/resource.h>
#endif

#include "timing.h"

static double last_cpustamp = 0.0;
static double last_timestamp = 0.0;

static int    basetime;


void io_error(char *reason)
{
fprintf(stderr,"Fehler bei %s\n",reason);
exit(1);
}

void timestamp()
{
  last_timestamp = time_so_far();
  last_cpustamp = cpu_so_far();
}

double cpu_so_far()
{
#if defined(SysV) || defined(__svr4__)
  struct tms tms;

  if (times(&tms) == -1)
    io_error("times");
  return ((double) tms.tms_utime) / ((double) CLK_TCK) +
    ((double) tms.tms_stime) / ((double) CLK_TCK);

#else
  struct rusage rusage;

  getrusage(RUSAGE_SELF, &rusage);
  return
    ((double) rusage.ru_utime.tv_sec) +
      (((double) rusage.ru_utime.tv_usec) / 1000000.0) +
        ((double) rusage.ru_stime.tv_sec) +
          (((double) rusage.ru_stime.tv_usec) / 1000000.0);
#endif
}

double time_so_far()
{
#if defined(SysV) || defined(__svr4__)
  int        val;
  struct tms tms;

  if ((val = times(&tms)) == -1)
    io_error("times");

  return ((double) val) / ((double) CLK_TCK);

#else
  struct timeval tp;

  if (gettimeofday(&tp, (struct timezone *) NULL) == -1)
    io_error("gettimeofday");
  return ((double) (tp.tv_sec - basetime)) +
    (((double) tp.tv_usec) / 1000000.0);
#endif
}

void zeitausgabe(char *was, FILE *ts)
{
/* fprintf(ts,"Zeit fuer %s: %10.3f sec\n",was,cpu_so_far()-last_cpustamp); */
FILE *file;

if (ts==0) file=stderr; else file=ts;

fprintf(file,"%.2f s (%.1f%%)"
	,cpu_so_far()-last_cpustamp
	,(cpu_so_far()-last_cpustamp)/(time_so_far()-last_timestamp)*100.0
	);

if (was)
    fprintf(file,": `%s'\n",was);
else
    fprintf(file,"\n");
}

void zeitausgabe_stderr()
{
/* fprintf(ts,"Zeit fuer %s: %10.3f sec\n",was,cpu_so_far()-last_cpustamp); */

zeitausgabe(0,stderr);

}

void zeitausgabe_stdout()
{

zeitausgabe(0,stdout);

}

