27 #pragma GCC diagnostic ignored "-Wvarargs"
31 std::mutex s_output_synchronization;
32 size_t _the_printer_1(
void*, dd4hep::PrintLevel lvl,
const char* src,
const char* text);
33 size_t _the_printer_2(
void* par, dd4hep::PrintLevel lvl,
const char* src,
const char* fmt, va_list& args);
35 std::string print_fmt =
"%-16s %5s %s";
36 dd4hep::PrintLevel print_lvl = dd4hep::INFO;
38 dd4hep::output_function1_t print_func_1 = 0;
39 dd4hep::output_function2_t print_func_2 = _the_printer_2;
41 const char* print_level(dd4hep::PrintLevel lvl) {
43 case dd4hep::NOLOG:
return "NOLOG";
44 case dd4hep::VERBOSE:
return "VERB ";
45 case dd4hep::DEBUG:
return "DEBUG";
46 case dd4hep::INFO:
return "INFO ";
47 case dd4hep::WARNING:
return "WARN ";
48 case dd4hep::ERROR:
return "ERROR";
49 case dd4hep::FATAL:
return "FATAL";
50 case dd4hep::ALWAYS:
return " ";
52 if ( lvl> dd4hep::ALWAYS )
53 return print_level(dd4hep::ALWAYS);
54 return print_level(dd4hep::NOLOG);
58 size_t _the_printer_1(
void*, dd4hep::PrintLevel lvl,
const char* src,
const char* text) {
59 std::lock_guard<std::mutex> lock(s_output_synchronization);
62 std::cout << std::flush;
63 std::cerr << std::flush;
64 size_t len = ::fprintf(stdout, print_fmt.c_str(), src, print_level(lvl), text);
69 size_t _the_printer_2(
void* par, dd4hep::PrintLevel lvl,
const char* src,
const char* fmt, va_list& args) {
70 if ( !print_func_1 ) {
72 std::lock_guard<std::mutex> lock(s_output_synchronization);
75 std::cout << std::flush;
76 std::cerr << std::flush;
77 ::snprintf(text,
sizeof(text),print_fmt.c_str(),src,print_level(lvl),fmt);
78 size_t len = ::vfprintf(stdout, text, args);
83 ::vsnprintf(str,
sizeof(str), fmt, args);
84 return print_func_1(par, lvl, src, str);
87 std::string __format(
const char* fmt, va_list& args) {
89 ::vsnprintf(str,
sizeof(str), fmt, args);
90 return std::string(str);
97 std::size_t
printf(
const char* fmt, ...) {
98 std::lock_guard<std::mutex> lock(s_output_synchronization);
101 std::size_t len = ::vfprintf(stdout, fmt, args);
106 std::lock_guard<std::mutex> lock(s_output_synchronization);
109 std::size_t len = ::vfprintf(stderr, fmt, args);
116 dd4hep::PrintLevel dd4hep::decodePrintLevel(
const std::string& val) {
117 switch(::toupper(val[0])) {
120 return dd4hep::VERBOSE;
123 return dd4hep::DEBUG;
129 return dd4hep::WARNING;
132 return dd4hep::ERROR;
135 return dd4hep::FATAL;
138 return dd4hep::FATAL;
140 std::cout <<
"Unknown print level supplied:'" << val <<
"'. Argument ignored." << std::endl;
141 throw std::runtime_error(
"Invalid printLevel:"+val);
151 std::string dd4hep::arguments(
int argc,
char** argv) {
152 std::stringstream str;
153 for(
int i=0; i<argc;) {
155 if ( ++i < argc ) str <<
" ";
168 int dd4hep::printout(PrintLevel severity,
const char* src, std::stringstream& str) {
170 if (severity >= print_lvl) {
171 ret = printout(severity, src, str.str().c_str());
185 int dd4hep::printout(PrintLevel severity,
const std::string& src, std::stringstream& str) {
187 if (severity >= print_lvl) {
188 ret = printout(severity, src, str.str().c_str());
200 int dd4hep::printout(PrintLevel severity,
const char* src,
const char* fmt, ...) {
201 if (severity >= print_lvl) {
204 printout(severity, src, fmt, args);
216 int dd4hep::printout(PrintLevel severity,
const std::string& src,
const char* fmt, ...) {
217 if (severity >= print_lvl) {
220 printout(severity, src.c_str(), fmt, args);
232 int dd4hep::printout(PrintLevel severity,
const char* src,
const std::string& fmt, ...) {
233 if (severity >= print_lvl) {
235 va_start(args, &fmt);
236 printout(severity, src, fmt.c_str(), args);
248 int dd4hep::printout(PrintLevel severity,
const std::string& src,
const std::string& fmt, ...) {
249 if (severity >= print_lvl) {
251 va_start(args, &fmt);
252 printout(severity, src.c_str(), fmt.c_str(), args);
264 int dd4hep::printout(PrintLevel severity,
const char* src,
const char* fmt, va_list& args) {
265 if (severity >= print_lvl) {
266 print_func_2(print_arg, PrintLevel(severity&(~FORCE_LEVEL)), src, fmt, args);
277 int dd4hep::printout(PrintLevel severity,
const std::string& src,
const char* fmt, va_list& args) {
278 return printout(severity, src.c_str(), fmt, args);
287 int dd4hep::printout(PrintLevel severity,
const char* src,
const std::string& fmt, va_list& args) {
288 return printout(severity, src, fmt.c_str(), args);
297 int dd4hep::printout(PrintLevel severity,
const std::string& src,
const std::string& fmt, va_list& args) {
298 return printout(severity, src.c_str(), fmt.c_str(), args);
306 int dd4hep::except(
const std::string& src,
const std::string& fmt, ...) {
308 va_start(args, &fmt);
309 return except(src.c_str(),fmt.c_str(), args);
317 int dd4hep::except(
const char* src,
const char* fmt, ...) {
320 return except(src, fmt, args);
329 int dd4hep::except(
const std::string& src,
const std::string& fmt, va_list& args) {
330 std::string msg = __format(fmt.c_str(), args);
332 printout(ERROR, src.c_str(),
"%s", msg.c_str());
334 throw std::runtime_error((src+
": "+msg).c_str());
343 int dd4hep::except(
const char* src,
const char* fmt, va_list& args) {
344 std::string msg = __format(fmt, args);
346 printout(ERROR, src,
"%s", msg.c_str());
348 throw std::runtime_error((std::string(src)+
": "+msg).c_str());
356 std::string dd4hep::format(
const std::string& src,
const std::string& fmt, ...) {
358 va_start(args, &fmt);
359 std::string str = format(src, fmt, args);
369 std::string dd4hep::format(
const char* src,
const char* fmt, ...) {
372 std::string str = format(src, fmt, args);
383 std::string dd4hep::format(
const std::string& src,
const std::string& fmt, va_list& args) {
384 return format(src.c_str(), fmt.c_str(), args);
393 std::string dd4hep::format(
const char* src,
const char* fmt, va_list& args) {
396 if ( src && *src ) ::snprintf(str,
sizeof(str),
"%s: ", src);
397 size_t len2 = ::vsnprintf(str + len1,
sizeof(str) - len1, fmt, args);
398 if ( len2 >
sizeof(str) - len1 ) {
399 len2 =
sizeof(str) - len1 - 1;
400 str[
sizeof(str)-1] = 0;
402 return std::string(str);
406 dd4hep::PrintLevel dd4hep::setPrintLevel(PrintLevel new_level) {
407 PrintLevel old = print_lvl;
408 print_lvl = new_level;
413 dd4hep::PrintLevel dd4hep::printLevel() {
418 dd4hep::PrintLevel dd4hep::printLevel(
const char* value) {
419 if ( !value ) except(
"Printout",
"Invalid printlevel requested [EINVAL: Null-pointer argument]");
421 if ( strcmp(value,
"NOLOG") == 0 )
return dd4hep::NOLOG;
422 if ( strcmp(value,
"VERBOSE") == 0 )
return dd4hep::VERBOSE;
423 if ( strcmp(value,
"DEBUG") == 0 )
return dd4hep::DEBUG;
424 if ( strcmp(value,
"INFO") == 0 )
return dd4hep::INFO;
425 if ( strcmp(value,
"WARNING") == 0 )
return dd4hep::WARNING;
426 if ( strcmp(value,
"ERROR") == 0 )
return dd4hep::ERROR;
427 if ( strcmp(value,
"FATAL") == 0 )
return dd4hep::FATAL;
428 if ( strcmp(value,
"ALWAYS") == 0 )
return dd4hep::ALWAYS;
430 if ( strcmp(value,
"0") == 0 )
return dd4hep::NOLOG;
431 if ( strcmp(value,
"1") == 0 )
return dd4hep::VERBOSE;
432 if ( strcmp(value,
"2") == 0 )
return dd4hep::DEBUG;
433 if ( strcmp(value,
"3") == 0 )
return dd4hep::INFO;
434 if ( strcmp(value,
"4") == 0 )
return dd4hep::WARNING;
435 if ( strcmp(value,
"5") == 0 )
return dd4hep::ERROR;
436 if ( strcmp(value,
"6") == 0 )
return dd4hep::FATAL;
437 if ( strcmp(value,
"7") == 0 )
return dd4hep::ALWAYS;
438 except(
"Printout",
"Unknown printlevel requested:%s",value);
439 return dd4hep::ALWAYS;
443 dd4hep::PrintLevel dd4hep::printLevel(
const std::string& value) {
444 return printLevel(value.c_str());
448 bool dd4hep::isActivePrintLevel(
int severity) {
449 return severity >= print_lvl;
453 std::string dd4hep::setPrintFormat(
const std::string& new_format) {
454 std::string old = print_fmt;
455 print_fmt = new_format;
460 void dd4hep::setPrinter(
void* arg, output_function1_t fcn) {
462 print_func_1 = fcn ? fcn : _the_printer_1;
466 void dd4hep::setPrinter2(
void* arg, output_function2_t fcn) {
468 print_func_2 = fcn ? fcn : _the_printer_2;