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