/*
 *	wiiuse
 *
 *	Written By:
 *		Michael Laforest	< para >
 *		Email: < thepara (--AT--) g m a i l [--DOT--] com >
 *
 *	Copyright 2006-2007
 *
 *	This file is part of wiiuse.
 *
 *	This program is free software; you can redistribute it and/or modify
 *	it under the terms of the GNU General Public License as published by
 *	the Free Software Foundation; either version 3 of the License, or
 *	(at your option) any later version.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 *	You should have received a copy of the GNU General Public License
 *	along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 *	$Header$
 *
 */

/**
 *	@file
 *	@brief General definitions.
 */

#ifndef DEFINITIONS_H_INCLUDED
#define DEFINITIONS_H_INCLUDED

/* this is wiiuse - used to distinguish from third party programs using wiiuse.h */
#include "definitions_os.h"
#include <stdio.h>
/** @addtogroup internal_general */
/** @{ */

#define WIIMOTE_PI 3.14159265f

/* #define WITH_WIIUSE_DEBUG */

extern FILE *logtarget[];

#define OUTF_ERROR logtarget[0]
#define OUTF_WARNING logtarget[1]
#define OUTF_INFO logtarget[2]
#define OUTF_DEBUG logtarget[3]

/* Error output macros */
#define WIIUSE_ERROR(fmt, ...)                                       \
    do                                                               \
    {                                                                \
        if (OUTF_ERROR)                                              \
            fprintf(OUTF_ERROR, "[ERROR] " fmt "\n", ##__VA_ARGS__); \
    } while (0)

/* Warning output macros */
#define WIIUSE_WARNING(fmt, ...)                                         \
    do                                                                   \
    {                                                                    \
        if (OUTF_WARNING)                                                \
            fprintf(OUTF_WARNING, "[WARNING] " fmt "\n", ##__VA_ARGS__); \
    } while (0)

/* Information output macros */
#define WIIUSE_INFO(fmt, ...)                                      \
    do                                                             \
    {                                                              \
        if (OUTF_INFO)                                             \
            fprintf(OUTF_INFO, "[INFO] " fmt "\n", ##__VA_ARGS__); \
    } while (0)

#ifdef WITH_WIIUSE_DEBUG
#ifdef WIIUSE_WIN32
#define WIIUSE_DEBUG(fmt, ...)                                                                      \
    do                                                                                              \
    {                                                                                               \
        if (OUTF_DEBUG)                                                                             \
        {                                                                                           \
            char *___filename = __FILE__;                                                           \
            int ___i      = strlen(___filename) - 1;                                                \
            for (; ___i && (___filename[___i] != '\\'); --___i)                                     \
                ;                                                                                   \
            fprintf(OUTF_DEBUG, "[DEBUG] %s:%i: " fmt "\n", ___filename + ___i + 1, __LINE__, ##__VA_ARGS__); \
        }                                                                                           \
    } while (0)
#else
#define WIIUSE_DEBUG(fmt, ...)                                                                  \
    do                                                                                          \
    {                                                                                           \
        if (OUTF_DEBUG)                                                                         \
            fprintf(OUTF_DEBUG, "[DEBUG] " __FILE__ ":%i: " fmt "\n", __LINE__, ##__VA_ARGS__); \
    } while (0)
#endif
#else
#define WIIUSE_DEBUG(fmt, ...)
#endif

/* Convert between radians and degrees */
#define RAD_TO_DEGREE(r) ((r * 180.0f) / WIIMOTE_PI)
#define DEGREE_TO_RAD(d) (d * (WIIMOTE_PI / 180.0f))

#define absf(x) ((x >= 0) ? (x) : (x * -1.0f))
#define diff_f(x, y) ((x >= y) ? (absf(x - y)) : (absf(y - x)))

/** @} */

#endif /* DEFINITIONS_H_INCLUDED */
