diff --git a/util.c b/util.c index 2b44710..1eff0d4 100644 --- a/util.c +++ b/util.c @@ -16,9 +16,10 @@ /** * @file util.c - * @brief \todo + * @brief Implementation of common utility functions. * @author Markus Teich */ +#include #include #include #include @@ -27,30 +28,44 @@ #include "util.h" +static FILE *logstream = NULL; + + +/** + * setlog sets another output for logging. + * + * @param[in] stream The new logging target. + */ +void +setlog (FILE *stream) +{ + logstream = stream; +} + + /** * xvprintf prints a formatstring with prefix "libbrandt: ". If the format * string ends with a ':', the strerror() from errno.h output will be appended. * The output is always terminated with a newline. * - * @param fmt The format string - * @param ap The inputs to the format string + * @param[in] fmt The format string + * @param[in] ap The inputs to the format string */ -void +static void xvprintf (const char *fmt, va_list ap) { - /**\todo: provide other logging target than stderr */ - fputs ("libbrandt: ", stderr); + fputs ("libbrandt: ", logstream ? logstream : stderr); - vfprintf (stderr, fmt, ap); + vfprintf (logstream ? logstream : stderr, fmt, ap); if (fmt[0] && fmt[strlen (fmt) - 1] == ':') { - fputc (' ', stderr); - perror (NULL); + fputc (' ', logstream ? logstream : stderr); + fputs (strerror (errno), logstream ? logstream : stderr); } else { - fputc ('\n', stderr); + fputc ('\n', logstream ? logstream : stderr); } } @@ -59,8 +74,8 @@ xvprintf (const char *fmt, va_list ap) * eprintf prints an error message and then calls abort() to terminate the * process. * - * @param fmt The format string - * @param ... The inputs to the format string + * @param[in] fmt The format string + * @param[in] ... The inputs to the format string */ void eprintf (const char *fmt, ...) @@ -78,8 +93,8 @@ eprintf (const char *fmt, ...) /** * weprintf prints a warning message * - * @param fmt The format string - * @param ... The inputs to the format string + * @param[in] fmt The format string + * @param[in] ... The inputs to the format string */ void weprintf (const char *fmt, ...) diff --git a/util.h b/util.h index d21cc89..1e67197 100644 --- a/util.h +++ b/util.h @@ -16,37 +16,51 @@ /** * @file util.h - * @brief \todo + * @brief Interface for the common utility functions. * @author Markus Teich */ #ifndef _BRANDT_UTIL_H #define _BRANDT_UTIL_H -void eprintf(const char *fmt, ...); -void weprintf(const char *fmt, ...); +void setlog (FILE *stream); +void eprintf (const char *fmt, ...); +void weprintf (const char *fmt, ...); -# undef brandt_assert -# undef brandt_assert_perror -# undef brandt_assert_gpgerr +#undef brandt_assert +#undef brandt_assert_perror +#undef brandt_assert_gpgerr #ifdef NDEBUG -# define brandt_assert(expr) ((expr) ? (void)(0) : \ -eprintf("Assertion failed in file %s line %d function %s: %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, (#expr))) -# define brandt_assert_perror(errnum) (!(errnum) ? (void)(0) : \ -eprintf("Assertion failed in file %s line %d function %s:", __FILE__, __LINE__, __PRETTY_FUNCTION__)) -# define brandt_assert_gpgerr(errnum) (!(errnum) ? (void)(0) : \ -eprintf("Assertion failed in file %s line %d function %s: %s", __FILE__, __LINE__, __PRETTY_FUNCTION__, gcry_strerror((errnum)))) +#define brandt_assert(expr) ((expr) ? (void)(0) : \ +eprintf("Assertion failed in file %s line %d function %s: %s", \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + (#expr))) -# define DP(point) ((void)(gcry_log_debugpnt (#point, point, ec_ctx))) -# define DM(mpi) ((void)(gcry_log_debugmpi (#mpi, mpi, ec_ctx))) +#define brandt_assert_perror(errnum) (!(errnum) ? (void)(0) : \ +eprintf("Assertion failed in file %s line %d function %s:", \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__)) + +#define brandt_assert_gpgerr(errnum) (!(errnum) ? (void)(0) : \ +eprintf("Assertion failed in file %s line %d function %s: %s", \ + __FILE__, \ + __LINE__, \ + __PRETTY_FUNCTION__, \ + gcry_strerror((errnum)))) + +#define DP(point) ((void)(gcry_log_debugpnt (#point, point, ec_ctx))) +#define DM(mpi) ((void)(gcry_log_debugmpi (#mpi, mpi, ec_ctx))) #else -# define brandt_assert(expr) ((void)(expr)) -# define brandt_assert_perror(errnum) ((void)(errnum)) -# define brandt_assert_gpgerr(errnum) ((void)(errnum)) +#define brandt_assert(expr) ((void)(expr)) +#define brandt_assert_perror(errnum) ((void)(errnum)) +#define brandt_assert_gpgerr(errnum) ((void)(errnum)) #endif