217 lines
6.4 KiB
C
Executable File
217 lines
6.4 KiB
C
Executable File
/*
|
||
|
||
Module: lmic_env.h
|
||
|
||
Function:
|
||
Sets up macros etc. to make things a little easier for portabilty
|
||
|
||
Copyright notice and license info:
|
||
See LICENSE file accompanying this project.
|
||
|
||
Author:
|
||
Terry Moore, MCCI Corporation November 2018
|
||
|
||
Description:
|
||
This file is an adaptation of MCCI's standard IOCTL framework.
|
||
We duplicate a bit of functionality that we might get from other
|
||
libraries, so that the LMIC library can continue to stand alone.
|
||
|
||
*/
|
||
|
||
#ifndef _lmic_env_h_ /* prevent multiple includes */
|
||
#define _lmic_env_h_
|
||
|
||
/*
|
||
|
||
Macro: LMIC_C_ASSERT()
|
||
|
||
Function:
|
||
Declaration-like macro that will cause a compile error if arg is FALSE.
|
||
|
||
Definition:
|
||
LMIC_C_ASSERT(
|
||
BOOL fErrorIfFalse
|
||
);
|
||
|
||
Description:
|
||
This macro, if used where an external reference declarataion is
|
||
permitted, will either compile cleanly, or will cause a compilation
|
||
error. The results of using this macro where a declaration is not
|
||
permitted are unspecified.
|
||
|
||
This is different from #if !(fErrorIfFalse) / #error in that the
|
||
expression is evaluated by the compiler rather than by the pre-
|
||
processor. Therefore things like sizeof() can be used.
|
||
|
||
Returns:
|
||
No explicit result -- either compiles cleanly or causes a compile
|
||
error.
|
||
|
||
*/
|
||
|
||
#ifndef LMIC_C_ASSERT
|
||
# define LMIC_C_ASSERT(e) \
|
||
void LMIC_C_ASSERT__(int LMIC_C_ASSERT_x[(e) ? 1: -1])
|
||
#endif
|
||
|
||
/****************************************************************************\
|
||
|
|
||
| Define the begin/end declaration tags for C++ co-existance
|
||
|
|
||
\****************************************************************************/
|
||
|
||
#ifdef __cplusplus
|
||
# define LMIC_BEGIN_DECLS extern "C" {
|
||
# define LMIC_END_DECLS }
|
||
#else
|
||
# define LMIC_BEGIN_DECLS /* nothing */
|
||
# define LMIC_END_DECLS /* nothing */
|
||
#endif
|
||
|
||
//----------------------------------------------------------------------------
|
||
// Annotations to avoid various "unused" warnings. These must appear as a
|
||
// statement in the function body; the macro annotates the variable to quiet
|
||
// compiler warnings. The way this is done is compiler-specific, and so these
|
||
// definitions are fall-backs, which might be overridden.
|
||
//
|
||
// Although these are all similar, we don't want extra macro expansions,
|
||
// so we define each one explicitly rather than relying on a common macro.
|
||
//----------------------------------------------------------------------------
|
||
|
||
// signal that a parameter is intentionally unused.
|
||
#ifndef LMIC_UNREFERENCED_PARAMETER
|
||
# define LMIC_UNREFERENCED_PARAMETER(v) do { (void) (v); } while (0)
|
||
#endif
|
||
|
||
// an API parameter is a parameter that is required by an API definition, but
|
||
// happens to be unreferenced in this implementation. This is a stronger
|
||
// assertion than LMIC_UNREFERENCED_PARAMETER(): this parameter is here
|
||
// becuase of an API contract, but we have no use for it in this function.
|
||
#ifndef LMIC_API_PARAMETER
|
||
# define LMIC_API_PARAMETER(v) do { (void) (v); } while (0)
|
||
#endif
|
||
|
||
// an intentionally-unreferenced variable.
|
||
#ifndef LMIC_UNREFERENCED_VARIABLE
|
||
# define LMIC_UNREFERENCED_VARIABLE(v) do { (void) (v); } while (0)
|
||
#endif
|
||
|
||
// we have three (!) debug levels (LMIC_DEBUG_LEVEL > 0, LMIC_DEBUG_LEVEL > 1,
|
||
// and LMIC_X_DEBUG_LEVEL > 0. In each case we might have parameters or
|
||
// or varables that are only refereneced at the target debug level.
|
||
|
||
// Parameter referenced only if debugging at level > 0.
|
||
#ifndef LMIC_DEBUG1_PARAMETER
|
||
# if LMIC_DEBUG_LEVEL > 0
|
||
# define LMIC_DEBUG1_PARAMETER(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_DEBUG1_PARAMETER(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// variable referenced only if debugging at level > 0
|
||
#ifndef LMIC_DEBUG1_VARIABLE
|
||
# if LMIC_DEBUG_LEVEL > 0
|
||
# define LMIC_DEBUG1_VARIABLE(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_DEBUG1_VARIABLE(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// parameter referenced only if debugging at level > 1
|
||
#ifndef LMIC_DEBUG2_PARAMETER
|
||
# if LMIC_DEBUG_LEVEL > 1
|
||
# define LMIC_DEBUG2_PARAMETER(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_DEBUG2_PARAMETER(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// variable referenced only if debugging at level > 1
|
||
#ifndef LMIC_DEBUG2_VARIABLE
|
||
# if LMIC_DEBUG_LEVEL > 1
|
||
# define LMIC_DEBUG2_VARIABLE(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_DEBUG2_VARIABLE(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// parameter referenced only if LMIC_X_DEBUG_LEVEL > 0
|
||
#ifndef LMIC_X_DEBUG_PARAMETER
|
||
# if LMIC_X_DEBUG_LEVEL > 0
|
||
# define LMIC_X_DEBUG_PARAMETER(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_X_DEBUG_PARAMETER(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// variable referenced only if LMIC_X_DEBUG_LEVEL > 0
|
||
#ifndef LMIC_X_DEBUG_VARIABLE
|
||
# if LMIC_X_DEBUG_LEVEL > 0
|
||
# define LMIC_X_DEBUG_VARIABLE(v) do { ; } while (0)
|
||
# else
|
||
# define LMIC_X_DEBUG_VARIABLE(v) do { (void) (v); } while (0)
|
||
# endif
|
||
#endif
|
||
|
||
// parameter referenced only if EV() macro is enabled (which it never is)
|
||
// TODO(tmm@mcci.com) take out the EV() framework as it reuqires C++, and
|
||
// this code is really C-99 to its bones.
|
||
#ifndef LMIC_EV_PARAMETER
|
||
# define LMIC_EV_PARAMETER(v) do { (void) (v); } while (0)
|
||
#endif
|
||
|
||
// variable referenced only if EV() macro is defined.
|
||
#ifndef LMIC_EV_VARIABLE
|
||
# define LMIC_EV_VARIABLE(v) do { (void) (v); } while (0)
|
||
#endif
|
||
|
||
/*
|
||
|
||
Macro: LMIC_ABI_STD
|
||
|
||
Index: Macro: LMIC_ABI_VARARGS
|
||
|
||
Function:
|
||
Annotation macros to force a particular binary calling sequence.
|
||
|
||
Definition:
|
||
#define LMIC_ABI_STD compiler-specific
|
||
#define LMIC_ABI_VARARGS compiler-specific
|
||
|
||
Description:
|
||
These macros are used when declaring a function type, and indicate
|
||
that a particular calling sequence is to be used. They are normally
|
||
used between the type portion of the function declaration and the
|
||
name of the function. For example:
|
||
|
||
typedef void LMIC_ABI_STD myCallBack_t(void);
|
||
|
||
It's important to use this in libraries on platforms with multiple
|
||
calling sequences, because different components can be compiled with
|
||
different defaults.
|
||
|
||
Returns:
|
||
Not applicable.
|
||
|
||
*/
|
||
|
||
/* ABI marker for normal (fixed parameter count) functions -- used for function types */
|
||
#ifndef LMIC_ABI_STD
|
||
# ifdef _MSC_VER
|
||
# define LMIC_ABI_STD __stdcall
|
||
# else
|
||
# define LMIC_ABI_STD /* nothing */
|
||
# endif
|
||
#endif
|
||
|
||
/* ABI marker for VARARG functions -- used for function types */
|
||
#ifndef LMIC_ABI_VARARGS
|
||
# ifdef _MSC_VER
|
||
# define LMIC_ABI_VARARGS __cdecl
|
||
# else
|
||
# define LMIC_ABI_VARARGS /* nothing */
|
||
# endif
|
||
#endif
|
||
|
||
#endif /* _lmic_env_h_ */ |