Line data Source code
1 : // System Includes 2 : #include <time.h> 3 : 4 : // Internal Includes 5 : #include "kirke/log.h" 6 : 7 : static Log__Level KIRKE__LOG__LEVEL = Log__Level__Warning; 8 : 9 16 : void log__set_log_level( Log__Level level ){ 10 16 : if( level >= Log__Level__Verbose && level < Log__Level__COUNT ){ 11 15 : KIRKE__LOG__LEVEL = level; 12 : } 13 16 : } 14 : 15 7 : Log__Level log__get_log_level(){ 16 7 : return KIRKE__LOG__LEVEL; 17 : } 18 : 19 97 : char* log__level__to_string( Log__Level log_level ){ 20 97 : switch( log_level ){ 21 14 : case Log__Level__Verbose: 22 14 : return "Verbose"; 23 15 : case Log__Level__Debug: 24 15 : return "Debug"; 25 17 : case Log__Level__Info: 26 17 : return "Info"; 27 19 : case Log__Level__Warning: 28 19 : return "Warning"; 29 21 : case Log__Level__Error: 30 21 : return "Error"; 31 11 : default: 32 11 : return "INVALID"; 33 : } 34 : } 35 : 36 : static const char *log_level_colors[] = { 37 : "\x1b[36m", "\x1b[32m", "\x1b[33m", "\x1b[31m", "\x1b[35m" 38 : }; 39 : 40 60 : void log__log( Log__Level level, const char* file, int line, const char* format, ... ){ 41 60 : if( level < KIRKE__LOG__LEVEL || level >= Log__Level__COUNT ){ 42 29 : return; 43 : } 44 : 45 31 : time_t now = time( NULL ); 46 31 : struct tm *local_time = localtime( &now ); 47 : 48 : char time_buffer[ 16 ]; 49 31 : time_buffer[ strftime( time_buffer, sizeof( time_buffer ), "%H:%M:%S", local_time ) ] = '\0'; 50 : 51 31 : fprintf( 52 : stderr, 53 : "[%s%7s]:\t\x1b[0m%s\t%s%-5s\x1b[0m %s:%d:\x1b[0m\t", 54 : log_level_colors[ level ], 55 : log__level__to_string( level ), 56 : time_buffer, 57 : log_level_colors[ level ], 58 : log_level_colors[ level ], 59 : file, 60 : line 61 : ); 62 : 63 : va_list args; 64 31 : va_start( args, format ); 65 31 : vfprintf( stderr, format, args ); 66 31 : va_end( args ); 67 : 68 31 : fprintf( stderr, "\n" ); 69 : }