1 // SPDX-License-Identifier: BSD-3-Clause
2 /*
3 * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
4 */
5
6 #include "trace.h"
7 #include <stdarg.h>
8 #include <stdio.h>
9
10 #if TRACE_LEVEL >= TRACE_LEVEL_ERROR
11 #ifndef TRACE_PREFIX
12 #error TRACE_PREFIX must be defined
13 #endif /* TRACE_PREFIX */
14
15 void (*trace_puts_interface)(const char *str) = &trace_puts;
16
ts_trace_printf(const char * func,int line,int level,const char * fmt,...)17 void ts_trace_printf(const char *func, int line, int level, const char *fmt, ...)
18 {
19 char buffer[256];
20 char level_char = 0;
21 int offset = 0;
22 va_list ap;
23 static const char levels[] = {'E', 'I', 'D'};
24
25 if (TRACE_LEVEL_ERROR <= level && TRACE_LEVEL_DEBUG >= level)
26 level_char = levels[level - TRACE_LEVEL_ERROR];
27 else
28 level_char = '?';
29
30 offset = snprintf(buffer, sizeof(buffer), "%c/" TRACE_PREFIX ": %s:%d ",
31 level_char, func, line);
32
33 if (offset < sizeof(buffer)) {
34 va_start(ap, fmt);
35 offset += vsnprintf(buffer + offset, sizeof(buffer) - offset, fmt, ap);
36 va_end(ap);
37 }
38
39 if (offset < sizeof(buffer) - 2) {
40 buffer[offset] = '\n';
41 buffer[offset + 1] = '\0';
42 } else {
43 buffer[sizeof(buffer) - 2] = '\n';
44 buffer[sizeof(buffer) - 1] = '\0';
45 }
46
47 (*trace_puts_interface)(buffer);
48 }
49 #endif
50