CI: Build on Arch (bleeding-ege) and Ubuntu (stable) AVR-GCC toolchains.
[pub/USBasp.git] / LUFA / Common / Common.h
index c302eac..0eee969 100644 (file)
@@ -1,13 +1,13 @@
 /*
              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
@@ -86,7 +86,7 @@
        /* 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