/*
LUFA Library
- Copyright (C) Dean Camera, 2012.
+ Copyright (C) Dean Camera, 2018.
dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org
*/
/*
- Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2018 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted
/* Architecture specific utility includes: */
#if defined(__DOXYGEN__)
/** Type define for an unsigned integer the same width as the selected architecture's machine register.
- * This is distinct from the non-specific standard int data type, whose width is machine dependent but
+ * This is distinct from the non-specific standard int data type, whose width is machine dependant but
* which may not reflect the actual machine register width on some targets (e.g. AVR8).
*/
typedef MACHINE_REG_t uint_reg_t;
#define pgm_read_byte(x) *x
#define memcmp_P(...) memcmp(__VA_ARGS__)
#define memcpy_P(...) memcpy(__VA_ARGS__)
+ #define strlen_P(...) strlen(__VA_ARGS__)
// =================================================
typedef uint32_t uint_reg_t;
/* Public Interface - May be used in end-application: */
/* Macros: */
- /** Macro for encasing other multi-statement macros. This should be used along with an opening brace
- * before the start of any multi-statement macro, so that the macros contents as a whole are treated
- * as a discrete block and not as a list of separate statements which may cause problems when used as
- * a block (such as inline \c if statements).
- */
- #define MACROS do
-
- /** Macro for encasing other multi-statement macros. This should be used along with a preceding closing
- * brace at the end of any multi-statement macro, so that the macros contents as a whole are treated
- * as a discrete block and not as a list of separate statements which may cause problems when used as
- * a block (such as inline \c if statements).
- */
- #define MACROE while (0)
+ #if !defined(__DOXYGEN__)
+ // Obsolete, retained for compatibility with user code
+ #define MACROS do
+ #define MACROE while (0)
+ #endif
/** Convenience macro to determine the larger of two values.
*
* \attention This macro should only be used with operands that do not have side effects from being evaluated
* multiple times.
*
- * \param[in] x First value to compare
- * \param[in] y First value to compare
+ * \param[in] x First value to compare.
+ * \param[in] y First value to compare.
*
* \return The smaller of the two input parameters
*/
#define STRINGIFY_EXPANDED(x) STRINGIFY(x)
#endif
+ #if !defined(CONCAT) || defined(__DOXYGEN__)
+ /** Concatenates the given input into a single token, via the C Preprocessor.
+ *
+ * \param[in] x First item to concatenate.
+ * \param[in] y Second item to concatenate.
+ *
+ * \return Concatenated version of the input.
+ */
+ #define CONCAT(x, y) x ## y
+
+ /** CConcatenates the given input into a single token after macro expansion, via the C Preprocessor.
+ *
+ * \param[in] x First item to concatenate.
+ * \param[in] y Second item to concatenate.
+ *
+ * \return Concatenated version of the expanded input.
+ */
+ #define CONCAT_EXPANDED(x, y) CONCAT(x, y)
+ #endif
+
#if !defined(ISR) || defined(__DOXYGEN__)
/** Macro for the definition of interrupt service routines, so that the compiler can insert the required
* prologue and epilogue code to properly manage the interrupt routine without affecting the main thread's