/* Heart of the matter */ static void rs_log_va(int flags, char const *caller_fn_name, char const *fmt, va_list va) { int level = flags & RS_LOG_PRIMASK; struct rs_logger_list *l; rs_lazy_default(); if (level > rs_trace_level) return; for (l = logger_list; l; l = l->next) if (level <= l->max_level) l->fn(flags, caller_fn_name, fmt, va, l->private_ptr, l->private_int); }
/* Heart of the matter */ static void rs_log_va(int flags, char const *caller_fn_name, char const *fmt, va_list va) { int level = flags & RS_LOG_PRIMASK; struct rs_logger_list *l; rs_lazy_default(); if (level <= rs_trace_level) for (l = logger_list; l; l = l->next) if (level <= l->max_level) { /* We need to use va_copy() here, because functions like vsprintf * may destructively modify their va_list argument, but we need * to ensure that it's still valid next time around the loop. */ va_list copied_va; VA_COPY(copied_va, va); l->fn(flags, caller_fn_name, fmt, copied_va, l->private_ptr, l->private_int); VA_COPY_END(copied_va); } }