src/lib/verbose.c 1.7
1.7 2010/04/01 17:31:10 markd
fixed GCC portability issues
Index: src/lib/verbose.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/lib/verbose.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 1000000 -r1.6 -r1.7
--- src/lib/verbose.c 30 Oct 2008 09:27:23 -0000 1.6
+++ src/lib/verbose.c 1 Apr 2010 17:31:10 -0000 1.7
@@ -1,121 +1,129 @@
/* verbose.c - write out status messages according to the
* current verbosity level. These messages go to stderr. */
#include "common.h"
#include "portable.h"
#include "verbose.h"
static char const rcsid[] = "$Id$";
static int logVerbosity = 1; /* The level of log verbosity. 0 is silent. */
static FILE *logFile; /* File to log to. */
static boolean checkedDotsEnabled = FALSE; /* have we check for dot output
* being enabled? */
static boolean dotsEnabled = FALSE; /* is dot output enabled? */
void verboseVa(int verbosity, char *format, va_list args)
/* Log with at given verbosity vprintf formatted args. */
{
if (verbosity <= logVerbosity)
{
if (logFile == NULL)
logFile = stderr;
vfprintf(logFile, format, args);
fflush(logFile);
}
}
void verbose(int verbosity, char *format, ...)
/* Write printf formatted message to log (which by
* default is stderr) if global verbose variable
* is set to verbosity or higher. */
{
va_list args;
va_start(args, format);
verboseVa(verbosity, format, args);
va_end(args);
}
-void verboseTime(int verbosity, char *label, ...)
-/* Print label and how long it's been since last call. Call with
- * a NULL label to initialize. */
+static long lastTime = -1; // previous call time.
+
+void verboseTimeInit(void)
+/* Initialize or reinitialize the previous time for use by verboseTime. */
{
-static long lastTime = 0;
+lastTime = clock1000();
+}
+
+void verboseTime(int verbosity, char *label, ...)
+/* Print label and how long it's been since last call. Start time can be
+ * initialized with verboseTimeInit, otherwise the elapsed time will be
+ * zero. */
+{
+assert(label != NULL); // original version allowed this, but breaks some GCCs
+if (lastTime < 0)
+ verboseTimeInit();
long time = clock1000();
va_list args;
va_start(args, label);
-if (label != NULL)
- {
- verboseVa(verbosity, label, args);
- verbose(verbosity, ": %ld millis\n", time - lastTime);
- }
+verboseVa(verbosity, label, args);
+verbose(verbosity, ": %ld millis\n", time - lastTime);
lastTime = time;
va_end(args);
}
boolean verboseDotsEnabled()
/* check if outputting of happy dots are enabled. They will be enabled if the
* verbosity is > 0, stderr is a tty and we don't appear to be running an
* emacs shell. */
{
if (!checkedDotsEnabled)
{
if (logFile == NULL)
logFile = stderr;
dotsEnabled = (logVerbosity > 0) && isatty(fileno(logFile));
if (dotsEnabled)
{
/* check for an possible emacs shell */
char *emacs = getenv("emacs");
char *term = getenv("TERM");
if ((emacs != NULL) && (emacs[0] == 't'))
dotsEnabled = FALSE;
else if ((term != NULL) && sameString(term, "dumb"))
dotsEnabled = FALSE;
}
checkedDotsEnabled = TRUE;
}
return dotsEnabled;
}
void verboseDot()
/* Write I'm alive dot (at verbosity level 1) */
{
if (verboseDotsEnabled())
verbose(1, ".");
}
void verboseSetLevel(int verbosity)
/* Set verbosity level in log. 0 for no logging,
* higher number for increasing verbosity. */
{
logVerbosity = verbosity;
checkedDotsEnabled = FALSE; /* force rechecking of dots enabled */
}
int verboseLevel(void)
/* Get verbosity level. */
{
return logVerbosity;
}
void verboseSetLogFile(char *name)
/* Set logFile for verbose messages overrides stderr. */
{
if (sameString(name, "stdout"))
logFile = stdout;
else if (sameString(name, "stderr"))
logFile = stderr;
else
logFile = mustOpen(name, "w");
}
FILE *verboseLogFile()
/* Get the verbose log file. */
{
if (logFile == NULL)
logFile = stderr;
return logFile;
}