summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2020-08-13 09:01:32 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2020-08-18 07:08:51 +0200
commitcbc1ba341d5a1d5ece514fb4f506f80bd1a6b061 (patch)
tree7196f94ccbf9d4f0e85c35f406f09cabcecfeebf
parentlibtest: Add T_puts() (diff)
downloadrtems-cbc1ba341d5a1d5ece514fb4f506f80bd1a6b061.tar.bz2
libtest: Use line buffer in T_check()
Update #3199.
-rw-r--r--cpukit/libtest/t-test.c117
1 files changed, 86 insertions, 31 deletions
diff --git a/cpukit/libtest/t-test.c b/cpukit/libtest/t-test.c
index c93636a2b7..ec9ff6eed2 100644
--- a/cpukit/libtest/t-test.c
+++ b/cpukit/libtest/t-test.c
@@ -614,14 +614,36 @@ T_file(const T_check_context *t)
return file + 1;
}
+static const char T_planned_step_fmt[] = "planned step (%u)";
+
+static void
+T_check_putc(int c, void *arg)
+{
+ T_putchar_string_context *sctx;
+ size_t n;
+
+ sctx = arg;
+ n = sctx->n;
+
+ if (n > 0) {
+ char *s;
+
+ s = sctx->s;
+ *s = (char)c;
+ sctx->s = s + 1;
+ sctx->n = n - 1;
+ }
+}
+
void
T_check(const T_check_context *t, bool ok, ...)
{
T_context *ctx;
va_list ap;
- char scope[T_SCOPE_SIZE];
- size_t len;
+ char line[T_LINE_SIZE];
unsigned int step;
+ int line_number;
+ const char *fmt;
ctx = &T_instance;
@@ -631,52 +653,85 @@ T_check(const T_check_context *t, bool ok, ...)
step = UINT_MAX;
}
- len = T_scope(ctx, scope, sizeof(scope) - 1);
- scope[len] = '\0';
+ va_start(ap, ok);
+ line[0] = '\0';
+ line_number = -1;
+ fmt = NULL;
if ((t->flags & T_CHECK_STEP_FLAG) != 0 &&
step != T_CHECK_STEP_FROM_FLAGS(t->flags)) {
T_add_failure(ctx);
- T_printf("F:%u:%i:%s:%s:%i:planned step (%u)\n", step,
- T_cpu(), scope, T_file(t),
- t->line, T_CHECK_STEP_FROM_FLAGS(t->flags));
+ line[0] = 'F';
+ line_number = t->line;
+ fmt = T_planned_step_fmt;
} else if (!ok) {
T_add_failure(ctx);
if (ctx->verbosity >= T_NORMAL) {
- if ((t->flags & T_CHECK_QUIET) == 0) {
- T_printf("F:%u:%i:%s:%s:%i",
- step, T_cpu(), scope, T_file(t), t->line);
- } else if (t->line >= 0) {
- T_printf("F:*:%i:%s:%s:%i", T_cpu(), scope,
- T_file(t), t->line);
- } else {
- T_printf("F:*:%i:%s:%s:*", T_cpu(), scope,
- T_file(t));
- }
+ line[0] = 'F';
+ line_number = t->line;
if ((t->flags & T_CHECK_FMT) != 0) {
- const char *fmt;
-
- T_printf(":");
-
- va_start(ap, ok);
fmt = va_arg(ap, const char *);
- T_vprintf(fmt, ap);
- va_end(ap);
}
+ }
+ } else if ((t->flags & T_CHECK_QUIET) == 0 &&
+ ctx->verbosity >= T_VERBOSE) {
+ line[0] = 'P';
+ line_number = t->line;
+ }
+
+ if (line[0] != '\0') {
+ T_putchar_string_context sctx;
+ size_t chunk;
- T_printf("\n");
+ sctx.n = sizeof(line) - 1;
+ sctx.s = &line[1];
+ T_check_putc(':', &sctx);
+
+ if (step != UINT_MAX) {
+ _IO_Printf(T_check_putc, &sctx, "%u", step);
+ } else {
+ T_check_putc('*', &sctx);
}
- if ((t->flags & T_CHECK_STOP) != 0) {
- T_do_stop(ctx);
+ _IO_Printf(T_check_putc, &sctx, ":%i:", T_cpu());
+ chunk = T_scope(ctx, sctx.s, sctx.n);
+ sctx.s += chunk;
+ sctx.n -= chunk;
+ T_check_putc(':', &sctx);
+ chunk = T_str_copy(sctx.s, T_file(t), sctx.n);
+ sctx.s += chunk;
+ sctx.n -= chunk;
+ T_check_putc(':', &sctx);
+
+ if (line_number >= 0) {
+ _IO_Printf(T_check_putc, &sctx, "%i", line_number);
+ } else {
+ T_check_putc('*', &sctx);
}
- } else if ((t->flags & T_CHECK_QUIET) == 0 &&
- ctx->verbosity >= T_VERBOSE) {
- T_printf("P:%u:%i:%s:%s:%i\n", step, T_cpu(), scope, T_file(t),
- t->line);
+
+ if (fmt != NULL) {
+ if (fmt == T_planned_step_fmt) {
+ T_check_putc(':', &sctx);
+ _IO_Printf(T_check_putc, &sctx, fmt,
+ T_CHECK_STEP_FROM_FLAGS(t->flags));
+ } else {
+ T_check_putc(':', &sctx);
+ _IO_Vprintf(T_check_putc, &sctx, fmt, ap);
+ }
+ }
+
+ T_check_putc('\n', &sctx);
+ line[sizeof(line) - 1] = '\n';
+ T_puts(&line[0], sizeof(line) - sctx.n);
}
+
+ if (!ok && (t->flags & T_CHECK_STOP) != 0) {
+ T_do_stop(ctx);
+ }
+
+ va_end(ap);
}
static void