88#include <emscripten.h>
99#endif
1010
11- static scas_log_importance_t v = 0 ;
12- static unsigned indent = 0 ;
13- static bool colored = true;
11+ void scas_log_default (const char * msg ) {
12+ fprintf (stderr , "%s" , msg );
13+ }
14+
15+ scas_log_importance_t scas_log_verbosity = 0 ;
16+ unsigned scas_log_indent = 0 ;
17+ bool scas_log_colorize = true;
18+ void (* scas_log_function )(const char * ) = scas_log_default ;
1419
1520const char * verbosity_colors [] = {
1621 "" , // L_SILENT
@@ -19,42 +24,34 @@ const char *verbosity_colors[] = {
1924 "\x1B[1;30m" , // L_DEBUG
2025};
2126
22- void scas_log_init (scas_log_importance_t verbosity ) {
23- v = verbosity ;
24- }
25-
26- void scas_log_set_colors (bool _colored ) {
27- colored = _colored ;
28- }
29-
30- void scas_log_indent () {
31- ++ indent ;
32- }
33-
34- void scas_log_deindent () {
35- if (indent > 0 ) {
36- -- indent ;
37- }
38- }
39-
4027void scas_log (scas_log_importance_t verbosity , char * format , ...) {
41- if (verbosity <= v && verbosity >= 0 ) {
42- size_t c = verbosity ;
43- if (c > sizeof (verbosity_colors ) / sizeof (char * )) {
44- c = sizeof (verbosity_colors ) / sizeof (char * ) - 1 ;
45- }
46- if (colored ) {
47- fprintf (stderr , "%s" , verbosity_colors [c ]);
48- }
49- if (verbosity == L_DEBUG || verbosity == L_INFO ) {
50- for (unsigned i = 0 ; i < indent ; ++ i ) {
51- fprintf (stderr , " " );
28+ if (scas_log_function ) {
29+ if (verbosity <= scas_log_verbosity && verbosity >= 0 ) {
30+ size_t c = verbosity ;
31+ if (c > sizeof (verbosity_colors ) / sizeof (char * )) {
32+ c = sizeof (verbosity_colors ) / sizeof (char * ) - 1 ;
33+ }
34+ if (scas_log_colorize ) {
35+ scas_log_function (verbosity_colors [c ]);
36+ }
37+ if (verbosity == L_DEBUG || verbosity == L_INFO ) {
38+ for (unsigned i = 0 ; i < scas_log_indent ; ++ i ) {
39+ scas_log_function (" " );
40+ }
41+ }
42+ va_list args ;
43+ va_start (args , format );
44+ int length = vsnprintf (NULL , 0 , format , args );
45+ va_end (args );
46+ if (length > 0 ) {
47+ va_start (args , format );
48+ char * buf = malloc (length + 1 );
49+ vsnprintf (buf , length , format , args );
50+ va_end (args );
51+ scas_log_function (buf );
52+ free (buf );
53+ scas_log_function (scas_log_colorize ? "\n\x1B[0m" : "\n" );
5254 }
5355 }
54- va_list args ;
55- va_start (args , format );
56- vfprintf (stderr , format , args );
57- va_end (args );
58- fprintf (stderr , "%s\n" , colored ? "\x1B[0m" : "" );
5956 }
6057}
0 commit comments