logging: Support for up to 15 arguments in log message

Extended support in the log_core and log_output to 15 arguments
which is the hard limitation of log message format.

Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
Krzysztof Chruscinski 2018-10-25 08:24:14 +02:00 committed by Anas Nashif
commit 62d011549a
2 changed files with 74 additions and 87 deletions

View file

@ -171,10 +171,28 @@ extern "C" {
/******************************************************************************/ /******************************************************************************/
/****************** Internal macros for log frontend **************************/ /****************** Internal macros for log frontend **************************/
/******************************************************************************/ /******************************************************************************/
/**@brief Second stage for _LOG_NARGS_POSTFIX */
#define _LOG_NARGS_POSTFIX_IMPL( \
_ignored, \
_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, \
_11, _12, _13, _14, N, ...) N
/**@brief Macro to get the postfix for further log message processing.
*
* Logs with more than 3 arguments are processed in a generic way.
*
* param[in] ... List of arguments
*
* @retval Postfix, number of arguments or _LONG when more than 3 arguments.
*/
#define _LOG_NARGS_POSTFIX(...) \
_LOG_NARGS_POSTFIX_IMPL(__VA_ARGS__, LONG, LONG, LONG, LONG, LONG, \
LONG, LONG, LONG, LONG, LONG, LONG, LONG, 3, 2, 1, 0, ~)
#define _LOG_INTERNAL_X(N, ...) UTIL_CAT(_LOG_INTERNAL_, N)(__VA_ARGS__) #define _LOG_INTERNAL_X(N, ...) UTIL_CAT(_LOG_INTERNAL_, N)(__VA_ARGS__)
#define __LOG_INTERNAL(_src_level, ...) \ #define __LOG_INTERNAL(_src_level, ...) \
_LOG_INTERNAL_X(NUM_VA_ARGS_LESS_1(__VA_ARGS__), \ _LOG_INTERNAL_X(_LOG_NARGS_POSTFIX(__VA_ARGS__), \
_src_level, __VA_ARGS__) _src_level, __VA_ARGS__)
#define _LOG_INTERNAL_0(_src_level, _str) \ #define _LOG_INTERNAL_0(_src_level, _str) \
@ -199,27 +217,6 @@ extern "C" {
log_n(_str, args, ARRAY_SIZE(args), _src_level); \ log_n(_str, args, ARRAY_SIZE(args), _src_level); \
} while (false) } while (false)
#define _LOG_INTERNAL_4(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_5(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_6(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_7(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_8(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_9(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_INTERNAL_10(_src_level, _str, ...) \
_LOG_INTERNAL_LONG(_src_level, _str, __VA_ARGS__)
#define _LOG_LEVEL_CHECK(_level, _check_level, _default_level) \ #define _LOG_LEVEL_CHECK(_level, _check_level, _default_level) \
(_level <= _LOG_RESOLVED_LEVEL(_check_level, _default_level)) (_level <= _LOG_RESOLVED_LEVEL(_check_level, _default_level))

View file

@ -43,7 +43,8 @@ static u32_t timestamp_div;
typedef int (*out_func_t)(int c, void *ctx); typedef int (*out_func_t)(int c, void *ctx);
extern int _prf(int (*func)(), void *dest, char *format, va_list vargs); extern int _prf(int (*func)(), void *dest, char *format, va_list vargs);
extern void _vprintk(out_func_t out, void *log_output, const char *fmt, va_list ap); extern void _vprintk(out_func_t out, void *log_output,
const char *fmt, va_list ap);
static int out_func(int c, void *ctx) static int out_func(int c, void *ctx)
{ {
@ -203,94 +204,83 @@ static void std_print(struct log_msg *msg,
const struct log_output *log_output) const struct log_output *log_output)
{ {
const char *str = log_msg_str_get(msg); const char *str = log_msg_str_get(msg);
u32_t nargs = log_msg_nargs_get(msg);
u32_t *args = alloca(sizeof(u32_t)*nargs);
int i;
for (i = 0; i < nargs; i++) {
args[i] = log_msg_arg_get(msg, i);
}
switch (log_msg_nargs_get(msg)) { switch (log_msg_nargs_get(msg)) {
case 0: case 0:
print_formatted(log_output, str); print_formatted(log_output, str);
break; break;
case 1: case 1:
print_formatted(log_output, str, log_msg_arg_get(msg, 0)); print_formatted(log_output, str, args[0]);
break; break;
case 2: case 2:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1]);
log_msg_arg_get(msg, 0),
log_msg_arg_get(msg, 1));
break; break;
case 3: case 3:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2]);
log_msg_arg_get(msg, 0),
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2));
break; break;
case 4: case 4:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3]);
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3));
break; break;
case 5: case 5:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4]);
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3),
log_msg_arg_get(msg, 4));
break; break;
case 6: case 6:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4], args[5]);
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3),
log_msg_arg_get(msg, 4),
log_msg_arg_get(msg, 5));
break; break;
case 7: case 7:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4], args[5], args[6]);
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3),
log_msg_arg_get(msg, 4),
log_msg_arg_get(msg, 5),
log_msg_arg_get(msg, 6));
break; break;
case 8: case 8:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4], args[5], args[6], args[7]);
log_msg_arg_get(msg, 1),
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3),
log_msg_arg_get(msg, 4),
log_msg_arg_get(msg, 5),
log_msg_arg_get(msg, 6),
log_msg_arg_get(msg, 7));
break; break;
case 9: case 9:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4], args[5], args[6], args[7],
log_msg_arg_get(msg, 1), args[8]);
log_msg_arg_get(msg, 2),
log_msg_arg_get(msg, 3),
log_msg_arg_get(msg, 4),
log_msg_arg_get(msg, 5),
log_msg_arg_get(msg, 6),
log_msg_arg_get(msg, 7),
log_msg_arg_get(msg, 8));
break; break;
case 10: case 10:
print_formatted(log_output, str, print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 0), args[3], args[4], args[5], args[6], args[7],
log_msg_arg_get(msg, 1), args[8], args[9]);
log_msg_arg_get(msg, 2), break;
log_msg_arg_get(msg, 3), case 11:
log_msg_arg_get(msg, 4), print_formatted(log_output, str, args[0], args[1], args[2],
log_msg_arg_get(msg, 5), args[3], args[4], args[5], args[6], args[7],
log_msg_arg_get(msg, 6), args[8], args[9], args[10]);
log_msg_arg_get(msg, 7), break;
log_msg_arg_get(msg, 8), case 12:
log_msg_arg_get(msg, 9)); print_formatted(log_output, str, args[0], args[1], args[2],
args[3], args[4], args[5], args[6], args[7],
args[8], args[9], args[10], args[11]);
break;
case 13:
print_formatted(log_output, str, args[0], args[1], args[2],
args[3], args[4], args[5], args[6], args[7],
args[8], args[9], args[10], args[11], args[12]);
break;
case 14:
print_formatted(log_output, str, args[0], args[1], args[2],
args[3], args[4], args[5], args[6], args[7],
args[8], args[9], args[10], args[11], args[12],
args[13]);
break;
case 15:
print_formatted(log_output, str, args[0], args[1], args[2],
args[3], args[4], args[5], args[6], args[7],
args[8], args[9], args[10], args[11], args[12],
args[13], args[14]);
break; break;
default: default:
/* Unsupported number of arguments. */ /* Unsupported number of arguments. */