aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/rin/diagnostic.h16
-rw-r--r--src/diagnostic/diagnostic.c36
-rw-r--r--src/diagnostic/diagnostic_private.h2
-rw-r--r--test/diagnostic.c72
4 files changed, 72 insertions, 54 deletions
diff --git a/include/rin/diagnostic.h b/include/rin/diagnostic.h
index cd33da7..7941c8a 100644
--- a/include/rin/diagnostic.h
+++ b/include/rin/diagnostic.h
@@ -35,14 +35,14 @@ void rin_diag_init(void);
int rin_diag_format(const enum rin_diag_outstream, const char * const format);
int rin_diag_set_outstream(const enum rin_diag_outstream channel, FILE * const stream);
-void __rin_err(const char * const func_name, const char *format, ...) FORMAT_STRING(2, 3);
-void __rin_warn(const char * const func_name, const char *format, ...) FORMAT_STRING(2, 3);
-void __rin_fixme(const char * const func_name, const char *format, ...) FORMAT_STRING(2, 3);
-void __rin_info(const char * const func_name, const char *format, ...) FORMAT_STRING(2, 3);
+void __rin_err(const char * const func_name, int line_num, const char * const file_name, const char *format, ...) FORMAT_STRING(4, 5);
+void __rin_warn(const char * const func_name, int line_num, const char * const file_name, const char *format, ...) FORMAT_STRING(4, 5);
+void __rin_fixme(const char * const func_name, int line_num, const char * const file_name, const char *format, ...) FORMAT_STRING(4, 5);
+void __rin_info(const char * const func_name, int line_num, const char * const file_name, const char *format, ...) FORMAT_STRING(4, 5);
-#define rin_err(a,...) do {__rin_err(__func__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
-#define rin_warn(a,...) do {__rin_warn(__func__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
-#define rin_fixme(a,...) do {__rin_fixme(__func__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
-#define rin_info(a,...) do {__rin_info(__func__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
+#define rin_err(a,...) do {__rin_err(__func__, __LINE__, __FILE__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
+#define rin_warn(a,...) do {__rin_warn(__func__, __LINE__, __FILE__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
+#define rin_fixme(a,...) do {__rin_fixme(__func__, __LINE__, __FILE__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
+#define rin_info(a,...) do {__rin_info(__func__, __LINE__, __FILE__, a __VA_OPT__(,) __VA_ARGS__); } while (0)
#endif /* LIBRIN_DIAGNOSTIC_INCLUDED */
diff --git a/src/diagnostic/diagnostic.c b/src/diagnostic/diagnostic.c
index 1a70d07..2ce8f50 100644
--- a/src/diagnostic/diagnostic.c
+++ b/src/diagnostic/diagnostic.c
@@ -27,8 +27,8 @@
#include "rin/time.h"
#include "rin/definitions.h"
-static const char default_format[] = "C:F:mn";
-static const char valid_format[] = "CFtTn:m";
+static const char default_format[] = "C:f:F:l:mn";
+static const char valid_format[] = "CFtTn:mfl";
static struct iostate {
struct timespec start;
@@ -141,47 +141,47 @@ int rin_diag_set_outstream(const enum rin_diag_outstream channel, FILE * const s
return 0;
}
-void __rin_err(const char* const func_name, const char *format, ...)
+void __rin_err(const char * const func_name, int line_num, const char * const file_name, const char *format, ...)
{
va_list args;
va_start(args, format);
- __rin_msg(state.err ? state.err : stderr, "error", func_name,
- state.err_format ? state.err_format : default_format,
+ __rin_msg(state.err ? state.err : stderr, "error", func_name, line_num,
+ file_name, state.err_format ? state.err_format : default_format,
format, args);
}
-void __rin_warn(const char* const func_name, const char *format, ...)
+void __rin_warn(const char * const func_name, int line_num, const char * const file_name, const char *format, ...)
{
va_list args;
va_start(args, format);
- __rin_msg(state.warn ? state.warn : stderr, "warning", func_name,
- state.warn_format ? state.warn_format : default_format,
+ __rin_msg(state.warn ? state.warn : stderr, "warning", func_name, line_num,
+ file_name, state.warn_format ? state.warn_format : default_format,
format, args);
}
-void __rin_fixme(const char* const func_name, const char *format, ...)
+void __rin_fixme(const char * const func_name, int line_num, const char * const file_name, const char *format, ...)
{
va_list args;
va_start(args, format);
- __rin_msg(state.fixme ? state.fixme : stderr, "fixme", func_name,
- state.fixme_format ? state.fixme_format : default_format,
+ __rin_msg(state.fixme ? state.fixme : stderr, "fixme", func_name, line_num,
+ file_name, state.fixme_format ? state.fixme_format : default_format,
format, args);
}
-void __rin_info(const char* const func_name, const char *format, ...)
+void __rin_info(const char * const func_name, int line_num, const char * const file_name, const char *format, ...)
{
va_list args;
va_start(args, format);
- __rin_msg(state.info ? state.info : stdout, "info", func_name,
- state.info_format ? state.info_format : default_format,
+ __rin_msg(state.info ? state.info : stdout, "info", func_name, line_num,
+ file_name, state.info_format ? state.info_format : default_format,
format, args);
}
-static void __rin_msg(FILE * const stream, const char *prefix, const char* const func_name, const char *rin_format, const char *format, va_list args)
+static void __rin_msg(FILE * const stream, const char *prefix, const char *func_name, int line_num, const char * const file_name, const char *rin_format, const char *format, va_list args)
{
struct timespec t;
size_t i;
@@ -222,6 +222,12 @@ static void __rin_msg(FILE * const stream, const char *prefix, const char* const
case 'm':
vfprintf(stream, format, args);
break;
+ case 'f':
+ fprintf(stream, "%s", file_name);
+ break;
+ case 'l':
+ fprintf(stream, "%i", line_num);
+ break;
}
}
}
diff --git a/src/diagnostic/diagnostic_private.h b/src/diagnostic/diagnostic_private.h
index 04778b5..9fb43ab 100644
--- a/src/diagnostic/diagnostic_private.h
+++ b/src/diagnostic/diagnostic_private.h
@@ -28,7 +28,7 @@
#define RIN_NEED_GETTID
#include "rin/compat.h"
-static void __rin_msg(FILE *stream, const char *prefix, const char *func_name, const char *rin_format, const char *format, va_list args);
+static void __rin_msg(FILE * const stream, const char *prefix, const char *func_name, int line_num, const char * const file_name, const char *rin_format, const char *format, va_list args);
static void rin_diag_cleanup(void);
#endif /* LIBRIN_DIAGNOSTIC_PRIVATE_INCLUDED */
diff --git a/test/diagnostic.c b/test/diagnostic.c
index 866f9f2..0a5a9b1 100644
--- a/test/diagnostic.c
+++ b/test/diagnostic.c
@@ -28,13 +28,23 @@
#include "rin/diagnostic.h"
#include "rin/compat.h"
+struct static_args {
+ const char * const func_name;
+ int line_num;
+ const char * const file_name;
+ enum rin_diag_outstream chan;
+};
+
static int err_test(void);
static int warn_test(void);
static int fixme_test(void);
static int info_test(void);
static int format_test(void);
static char *visible_newlines(const char * const in);
-static int test_default_channels(const char * const in, const char * const expected, size_t i, const char *func_name, enum rin_diag_outstream chan);
+static int test_default_channels(const char * const in, const char * const expected, size_t i, struct static_args args);
+
+static const int default_line_num = 911;
+static const char default_file_name[] = "good_time.c";
int diagnostic_test(char *testname)
{
@@ -60,11 +70,12 @@ static int err_test(void)
size_t i;
int ret;
+ static const struct static_args args = {__func__, default_line_num, default_file_name, rin_diag_err};
static const char *in[] = {"", "test", "test number is %zu", "%zu tests ran"};
- static const char *expected[] = {"error:err_test:\n", "error:err_test:test\n", "error:err_test:test number is 3\n", "error:err_test:4 tests ran\n"};
+ static const char *expected[] = {"error:good_time.c:err_test:911:\n", "error:good_time.c:err_test:911:test\n", "error:good_time.c:err_test:911:test number is 3\n", "error:good_time.c:err_test:911:4 tests ran\n"};
for (i = 0; i < arrlen(in); ++i) {
- ret = test_default_channels(in[i], expected[i], i, __func__, rin_diag_err);
+ ret = test_default_channels(in[i], expected[i], i, args);
}
return ret;
@@ -75,11 +86,12 @@ static int warn_test(void)
size_t i;
int ret;
+ static const struct static_args args = {__func__, default_line_num, default_file_name, rin_diag_warn};
static const char *in[] = {"", "test", "test number is %zu", "%zu tests ran"};
- static const char *expected[] = {"warning:warn_test:\n", "warning:warn_test:test\n", "warning:warn_test:test number is 3\n", "warning:warn_test:4 tests ran\n"};
+ static const char *expected[] = {"warning:good_time.c:warn_test:911:\n", "warning:good_time.c:warn_test:911:test\n", "warning:good_time.c:warn_test:911:test number is 3\n", "warning:good_time.c:warn_test:911:4 tests ran\n"};
for (i = 0; i < arrlen(in); ++i) {
- ret = test_default_channels(in[i], expected[i], i, __func__, rin_diag_warn);
+ ret = test_default_channels(in[i], expected[i], i, args);
}
return ret;
@@ -90,11 +102,12 @@ static int fixme_test(void)
size_t i;
int ret;
+ static const struct static_args args = {__func__, default_line_num, default_file_name, rin_diag_fixme};
static const char *in[] = {"", "test", "test number is %zu", "%zu tests ran"};
- static const char *expected[] = {"fixme:fixme_test:\n", "fixme:fixme_test:test\n", "fixme:fixme_test:test number is 3\n", "fixme:fixme_test:4 tests ran\n"};
+ static const char *expected[] = {"fixme:good_time.c:fixme_test:911:\n", "fixme:good_time.c:fixme_test:911:test\n", "fixme:good_time.c:fixme_test:911:test number is 3\n", "fixme:good_time.c:fixme_test:911:4 tests ran\n"};
for (i = 0; i < arrlen(in); ++i) {
- ret = test_default_channels(in[i], expected[i], i, __func__, rin_diag_fixme);
+ ret = test_default_channels(in[i], expected[i], i, args);
}
return ret;
@@ -105,11 +118,12 @@ static int info_test(void)
size_t i;
int ret;
+ static const struct static_args args = {__func__, default_line_num, default_file_name, rin_diag_info};
static const char *in[] = {"", "test", "test number is %zu", "%zu tests ran"};
- static const char *expected[] = {"info:info_test:\n", "info:info_test:test\n", "info:info_test:test number is 3\n", "info:info_test:4 tests ran\n"};
+ static const char *expected[] = {"info:good_time.c:info_test:911:\n", "info:good_time.c:info_test:911:test\n", "info:good_time.c:info_test:911:test number is 3\n", "info:good_time.c:info_test:911:4 tests ran\n"};
for (i = 0; i < arrlen(in); ++i) {
- ret = test_default_channels(in[i], expected[i], i, __func__, rin_diag_info);
+ ret = test_default_channels(in[i], expected[i], i, args);
}
return ret;
@@ -119,30 +133,28 @@ static int format_test(void)
{
char expbuf[64];
size_t i;
+ enum rin_diag_outstream j;
int ret;
static const char *format[] = {NULL, "", "C:F:t:mn", "CCCC"};
- static const char *expected_err[] = {"error:format_test:\n", "", "error:format_test:%08lx:message is 3\n", "errorerrorerrorerror"};
- static const char *expected_warn[] = {"warning:format_test:\n", "", "warning:format_test:%08lx:message is 3\n", "warningwarningwarningwarning"};
- static const char *expected_fixme[] = {"fixme:format_test:\n", "", "fixme:format_test:%08lx:message is 3\n", "fixmefixmefixmefixme"};
- static const char *expected_info[] = {"info:format_test:\n", "", "info:format_test:%08lx:message is 3\n", "infoinfoinfoinfo"};
+ static const char *expected[][4] = {
+ {"error:good_time.c:format_test:911:\n", "", "error:format_test:%08lx:message is 3\n", "errorerrorerrorerror"},
+ {"warning:good_time.c:format_test:911:\n", "", "warning:format_test:%08lx:message is 3\n", "warningwarningwarningwarning"},
+ {"fixme:good_time.c:format_test:911:\n", "", "fixme:format_test:%08lx:message is 3\n", "fixmefixmefixmefixme"},
+ {"info:good_time.c:format_test:911:\n", "", "info:format_test:%08lx:message is 3\n", "infoinfoinfoinfo"} };
static const char *msg[] = {"", "", "message is %zu", ""};
+ struct static_args args = {__func__, default_line_num, default_file_name, 0};
+
/* `ninja test` seems to be intercepting stdout, so we cannot test the default outstream */
- for (i = 0; i < arrlen(format); ++i) {
- rin_diag_format(rin_diag_err, format[i]);
- rin_diag_format(rin_diag_warn, format[i]);
- rin_diag_format(rin_diag_fixme, format[i]);
- rin_diag_format(rin_diag_info, format[i]);
- snprintf(expbuf, sizeof(expbuf), expected_err[i], (long int) gettid());
- ret = test_default_channels(msg[i], expbuf, i, __func__, rin_diag_err);
- snprintf(expbuf, sizeof(expbuf), expected_warn[i], (long int) gettid());
- ret = test_default_channels(msg[i], expbuf, i, __func__, rin_diag_warn);
- snprintf(expbuf, sizeof(expbuf), expected_fixme[i], (long int) gettid());
- ret = test_default_channels(msg[i], expbuf, i, __func__, rin_diag_fixme);
- snprintf(expbuf, sizeof(expbuf), expected_info[i], (long int) gettid());
- ret = test_default_channels(msg[i], expbuf, i, __func__, rin_diag_info);
+ for (j = rin_diag_err; j <= rin_diag_info; ++j) {
+ args.chan = j;
+ for (i = 0; i < arrlen(format); ++i) {
+ rin_diag_format(j, format[i]);
+ snprintf(expbuf, sizeof(expbuf), expected[j][i], (long int) gettid());
+ ret = test_default_channels(msg[i], expbuf, i, args);
+ }
}
return ret;
@@ -177,11 +189,11 @@ static char *visible_newlines(const char * const in)
return ret;
}
-static int test_default_channels(const char * const in, const char * const expected, size_t i, const char *func_name, enum rin_diag_outstream chan)
+static int test_default_channels(const char * const in, const char * const expected, size_t i, struct static_args args)
{
char buf[64] = {0};
int ret = 0;
- void (*func[])(const char *, const char *, ...) = {__rin_err, __rin_warn, __rin_fixme, __rin_info};
+ void (*func[])(const char * const, int, const char * const, const char *format, ...) = {__rin_err, __rin_warn, __rin_fixme, __rin_info};
FILE *capstream;
if (!(capstream = tmpfile())) {
@@ -189,8 +201,8 @@ static int test_default_channels(const char * const in, const char * const expec
goto fail;
}
- rin_diag_set_outstream(chan, capstream);
- func[chan](func_name, in, i + 1);
+ rin_diag_set_outstream(args.chan, capstream);
+ func[args.chan](args.func_name, args.line_num, args.file_name, in, i + 1);
rewind(capstream);
if (!(fgets(buf, sizeof(buf), capstream)) && strlen(expected)) {