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