diff options
Diffstat (limited to 'Utilities/cmpdcurses/pdcurses/debug.c')
-rw-r--r-- | Utilities/cmpdcurses/pdcurses/debug.c | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/Utilities/cmpdcurses/pdcurses/debug.c b/Utilities/cmpdcurses/pdcurses/debug.c new file mode 100644 index 0000000..6444886 --- /dev/null +++ b/Utilities/cmpdcurses/pdcurses/debug.c @@ -0,0 +1,106 @@ +/* PDCurses */ + +#include <curspriv.h> + +/*man-start************************************************************** + +debug +----- + +### Synopsis + + void traceon(void); + void traceoff(void); + void PDC_debug(const char *, ...); + +### Description + + traceon() and traceoff() toggle the recording of debugging + information to the file "trace". Although not standard, similar + functions are in some other curses implementations. + + PDC_debug() is the function that writes to the file, based on whether + traceon() has been called. It's used from the PDC_LOG() macro. + + The environment variable PDC_TRACE_FLUSH controls whether the trace + file contents are fflushed after each write. The default is not. Set + it to enable this (may affect performance). + +### Portability + X/Open ncurses NetBSD + traceon - - - + traceoff - - - + PDC_debug - - - + +**man-end****************************************************************/ + +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <time.h> + +static bool want_fflush = FALSE; + +void PDC_debug(const char *fmt, ...) +{ + va_list args; + char hms[9]; + time_t now; + + if (!SP || !SP->dbfp) + return; + + time(&now); + strftime(hms, 9, "%H:%M:%S", localtime(&now)); + fprintf(SP->dbfp, "At: %8.8ld - %s ", (long) clock(), hms); + + va_start(args, fmt); + vfprintf(SP->dbfp, fmt, args); + va_end(args); + + /* If you are crashing and losing debugging information, enable this + by setting the environment variable PDC_TRACE_FLUSH. This may + impact performance. */ + + if (want_fflush) + fflush(SP->dbfp); + + /* If with PDC_TRACE_FLUSH enabled you are still losing logging in + crashes, you may need to add a platform-dependent mechanism to + flush the OS buffers as well (such as fsync() on POSIX) -- but + expect terrible performance. */ +} + +void traceon(void) +{ + if (!SP) + return; + + if (SP->dbfp) + fclose(SP->dbfp); + + /* open debug log file append */ + SP->dbfp = fopen("trace", "a"); + if (!SP->dbfp) + { + fprintf(stderr, "PDC_debug(): Unable to open debug log file\n"); + return; + } + + if (getenv("PDC_TRACE_FLUSH")) + want_fflush = TRUE; + + PDC_LOG(("traceon() - called\n")); +} + +void traceoff(void) +{ + if (!SP || !SP->dbfp) + return; + + PDC_LOG(("traceoff() - called\n")); + + fclose(SP->dbfp); + SP->dbfp = NULL; + want_fflush = FALSE; +} |