mesa: merge gallium-0.2 into gallium-master-merge
[mesa.git] / src / egl / main / egllog.c
1 /**
2 * Logging facility for debug/info messages.
3 * _EGL_FATAL messages are printed to stderr
4 * The EGL_LOG_LEVEL var controls the output of other warning/info/debug msgs.
5 */
6
7
8 #include <stdarg.h>
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <string.h>
12 #include "egllog.h"
13
14 #define MAXSTRING 1000
15 #define FALLBACK_LOG_LEVEL _EGL_WARNING
16 #define FALLBACK_LOG_LEVEL_STR "warning"
17
18 static EGLint ReportingLevel = -1;
19
20
21 static void
22 log_level_initialize(void)
23 {
24 #if defined(_EGL_PLATFORM_X)
25 char *log_env = getenv("EGL_LOG_LEVEL");
26 #else
27 char *log_env = NULL;
28 #endif
29
30 if (log_env == NULL) {
31 ReportingLevel = FALLBACK_LOG_LEVEL;
32 }
33 else if (strcasecmp(log_env, "fatal") == 0) {
34 ReportingLevel = _EGL_FATAL;
35 }
36 else if (strcasecmp(log_env, "warning") == 0) {
37 ReportingLevel = _EGL_WARNING;
38 }
39 else if (strcasecmp(log_env, "info") == 0) {
40 ReportingLevel = _EGL_INFO;
41 }
42 else if (strcasecmp(log_env, "debug") == 0) {
43 ReportingLevel = _EGL_DEBUG;
44 }
45 else {
46 fprintf(stderr, "Unrecognized EGL_LOG_LEVEL environment variable value. "
47 "Expected one of \"fatal\", \"warning\", \"info\", \"debug\". "
48 "Got \"%s\". Falling back to \"%s\".\n",
49 log_env, FALLBACK_LOG_LEVEL_STR);
50 ReportingLevel = FALLBACK_LOG_LEVEL;
51 }
52 }
53
54
55 /**
56 * Log a message to stderr.
57 * \param level one of _EGL_FATAL, _EGL_WARNING, _EGL_INFO, _EGL_DEBUG.
58 */
59 void
60 _eglLog(EGLint level, const char *fmtStr, ...)
61 {
62 va_list args;
63 char msg[MAXSTRING];
64 const char *levelStr;
65 static int log_level_initialized = 0;
66
67 if (!log_level_initialized) {
68 log_level_initialize();
69 log_level_initialized = 1;
70 }
71
72 if (level <= ReportingLevel) {
73 switch (level) {
74 case _EGL_FATAL:
75 levelStr = "Fatal";
76 break;
77 case _EGL_WARNING:
78 levelStr = "Warning";
79 break;
80 case _EGL_INFO:
81 levelStr = "Info";
82 break;
83 case _EGL_DEBUG:
84 levelStr = "Debug";
85 break;
86 default:
87 levelStr = "";
88 }
89
90 va_start(args, fmtStr);
91 vsnprintf(msg, MAXSTRING, fmtStr, args);
92 va_end(args);
93
94 fprintf(stderr, "libEGL %s: %s\n", levelStr, msg);
95
96 if (level == _EGL_FATAL) {
97 exit(1); /* or abort()? */
98 }
99 }
100 }