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