#include /* for va_start(), va_end() */ #include /* for sprintf(), stderr, ... */ #include /* for exit() */ #include /* for clock_gettime() */ #include "funcs.h" /* for infomsg(), errormsg() */ /* * Macros */ /* * Global variables */ /* * Forward declarations */ void real_fmessage(const char *, FILE *, char *, va_list); /* * Functions */ double doubletime( ) { struct timespec now; static double start = 0.0; /* clock_gettime() has superceded gettimeofday() */ clock_gettime(CLOCK_REALTIME, &now); if (start == 0.0) start = now.tv_sec + now.tv_nsec/1000000000.0; return(now.tv_sec + now.tv_nsec/1000000000.0 - start); } void real_infomsg( const char *func, char *fmt, ...) { va_list argp; va_start(argp, fmt); real_fmessage(func, stdout, fmt, argp); va_end(argp); } void real_errormsg( const char *func, char *fmt, ...) { va_list argp; va_start(argp, fmt); real_fmessage(func, stdout, fmt, argp); va_end(argp); exit(EXIT_FAILURE); } void real_finfomsg( const char *func, FILE *fp, char *fmt, ...) { va_list argp; va_start(argp, fmt); real_fmessage(func, fp, fmt, argp); va_end(argp); } void real_ferrormsg( const char *func, FILE *fp, char *fmt, ...) { va_list argp; va_start(argp, fmt); real_fmessage(func, fp, fmt, argp); va_end(argp); exit(EXIT_FAILURE); } void real_fmessage( const char *func, FILE *fp, char *fmt, va_list argp) { fprintf(fp, "%.06lf: %s: ", doubletime(), func); vfprintf(fp, fmt, argp); fprintf(fp, "\n"); }