src/log.c
author Tero Marttila <terom@fixme.fi>
Wed, 01 Apr 2009 00:38:16 +0300
changeset 104 fc196bb4bcc2
parent 73 2780a73c71f3
child 118 05b8d5150313
permissions -rw-r--r--
implement lua_log and lua_log_level

#include "log.h"

#include <stdio.h>
#include <stdarg.h>

/**
 * The global log level
 */
static enum log_level _log_level = LOG_LEVEL_DEFAULT;

/**
 * List of log level names
 */
const char *log_level_names[] = {
    "DEBUG",
    "INFO",
    "WARN",
    "ERROR",
    "FATAL",
    NULL
};

#define _LOG_LEVEL_NAME(ll) case LOG_ ## ll: return #ll;
const char *log_level_name (enum log_level level)
{
    switch (level) {
        _LOG_LEVEL_NAME(DEBUG)
        _LOG_LEVEL_NAME(INFO)
        _LOG_LEVEL_NAME(WARN)
        _LOG_LEVEL_NAME(ERROR)
        _LOG_LEVEL_NAME(FATAL)
        default: return "???";
    }
}

/**
 * Output the "[TYPE] FUNC: " header
 */
void _log_header (enum log_level level, const char *func)
{
    printf("[%5s] %20s : ", log_level_name(level), func);
}

void log_msg (enum log_level level, const char *func, const char *format, ...)
{
    va_list vargs;

    // filter out?
    if (level < _log_level)
        return;
    
    _log_header(level, func);
    
    // formatted output
    va_start(vargs, format);
    vprintf(format, vargs);
    va_end(vargs);

    // newline
    printf("\n");
}

void set_log_level (enum log_level level)
{
    // meep meep
    _log_level = level;
}

void _log_err (enum log_level level, err_t err, const char *func, const char *format, ...)
{
    va_list vargs;

    // filter out?
    if (level < _log_level)
        return;
 
    // header
    _log_header(level, func);
    
    // formatted output
    va_start(vargs, format);
    vprintf(format, vargs);
    va_end(vargs);

    // err_code and newline
    printf(": %s\n", error_name(err));
}

void _log_err_info (enum log_level level, struct error_info *err, const char *func, const char *format, ...)
{
    va_list vargs;

    // filter out?
    if (level < _log_level)
        return;
 
    // header
    _log_header(level, func);
    
    // formatted output
    va_start(vargs, format);
    vprintf(format, vargs);
    va_end(vargs);

    // err_code and newline
    printf(": %s\n", error_msg(err));
}