summaryrefslogtreecommitdiff
path: root/src/logger.cpp
blob: 848dfb14a55a96c1747bc592714991af0a28b46b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "bu/logger.h"
#include <stdarg.h>
#include <time.h>
#include <stdio.h>

Bu::Logger::Logger()
{
}

Bu::Logger::~Logger()
{
}

void Bu::Logger::log( int nLevel, const char *sFile, const char *sFunction, int nLine, const char *sFormat, ...)
{
	if( (nLevel&nLevelMask) == 0 )
		return;

	va_list ap;
	va_start( ap, sFormat );
	char *text;
	vasprintf( &text, sFormat, ap );
	va_end(ap);
	
	time_t t = time(NULL);
	
	char *line = NULL;
	struct tm *pTime;
	pTime = localtime( &t );
	asprintf(
		&line,
		sLogFormat.getStr(),
		pTime->tm_year+1900,
		pTime->tm_mon+1,
		pTime->tm_mday,
		pTime->tm_hour,
		pTime->tm_min,
		pTime->tm_sec,
		nLevel,
		sFile,
		nLine,
		text,
		sFunction
		);
	write( fileno(stdout), line, strlen(line) );
	free( text );
	free( line );
}

void Bu::Logger::setFormat( const Bu::FString &str )
{
	sLogFormat = "";

	static char fmts[][4]={
		{'y', 'd', '0', '1'},
		{'m', 'd', '0', '2'},
		{'d', 'd', '0', '3'},
		{'h', 'd', '0', '4'},
		{'M', 'd', '0', '5'},
		{'s', 'd', '0', '6'},
		{'L', 'd', '0', '7'},
		{'f', 's', '0', '8'},
		{'l', 'd', '0', '9'},
		{'t', 's', '1', '0'},
		{'F', 's', '1', '1'},
		{'\0', '\0', '\0', '\0'},
	};
	
	for( const char *s = str.getStr(); *s; s++ )
	{
		if( *s == '%' )
		{
			sLogFormat += '%';
			s++;
			for( int l = 0;; l++ )
			{
				if( fmts[l][0] == '\0' )
				{
					sLogFormat += *s;
					break;
				}
				else if( *s == fmts[l][0] )
				{
					sLogFormat += fmts[l][2];
					sLogFormat += fmts[l][3];
					sLogFormat += '$';
					sLogFormat += fmts[l][1];
					break;
				}
			}
		}
		else
		{
			sLogFormat += *s;
		}
	}
	sLogFormat += '\n';

	write( fileno(stdout), sLogFormat.getStr(), sLogFormat.getSize() );
}

void Bu::Logger::setMask( int n )
{
	nLevelMask = n;
}

void Bu::Logger::setLevel( int n )
{
	int j;
	for( j = 31; j > 0; j-- )
	{
		if( (n&(1<<j)) )
		{
			for(; j >= 0; j-- )
			{
				n |= (1<<j);
			}
			nLevelMask = n;
			return;
		}
	}
}