|
@@ -178,16 +178,18 @@
|
|
|
#define _DO_N(W,C,N,V...) __DO_N(W,C,N,V)
|
|
|
#define DO(W,C,V...) (_DO_N(W,C,NUM_ARGS(V),V))
|
|
|
|
|
|
-// Macros to support option testing
|
|
|
+// Concatenate symbol names, without or with pre-expansion
|
|
|
#define _CAT(a,V...) a##V
|
|
|
#define CAT(a,V...) _CAT(a,V)
|
|
|
|
|
|
+// Recognize "true" values: blank, 1, 0x1, true
|
|
|
#define _ISENA_ ~,1
|
|
|
#define _ISENA_1 ~,1
|
|
|
#define _ISENA_0x1 ~,1
|
|
|
#define _ISENA_true ~,1
|
|
|
#define _ISENA(V...) IS_PROBE(V)
|
|
|
|
|
|
+// Macros to evaluate simple option switches
|
|
|
#define _ENA_1(O) _ISENA(CAT(_IS,CAT(ENA_, O)))
|
|
|
#define _DIS_1(O) NOT(_ENA_1(O))
|
|
|
#define ENABLED(V...) DO(ENA,&&,V)
|
|
@@ -198,6 +200,7 @@
|
|
|
#define COUNT_ENABLED(V...) DO(ENA,+,V)
|
|
|
#define MANY(V...) (COUNT_ENABLED(V) > 1)
|
|
|
|
|
|
+// Ternary pre-compiler macros conceal non-emitted content from the compiler
|
|
|
#define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B'
|
|
|
#define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0'
|
|
|
#define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1'
|
|
@@ -205,7 +208,9 @@
|
|
|
#define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1'
|
|
|
#define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1'
|
|
|
#define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B.
|
|
|
+#define IF_DISABLED(O,A) TERN(O,,A)
|
|
|
|
|
|
+// Macros to conditionally emit array items and function arguments
|
|
|
#define _OPTITEM(A...) A,
|
|
|
#define OPTITEM(O,A...) TERN_(O,DEFER4(_OPTITEM)(A))
|
|
|
#define _OPTARG(A...) , A
|
|
@@ -220,8 +225,6 @@
|
|
|
#define SUM_TERN(O,B,A) ((B) PLUS_TERN0(O,A)) // ((B) (OPTION ? '+ (A)' : '<nul>'))
|
|
|
#define DIFF_TERN(O,B,A) ((B) MINUS_TERN0(O,A)) // ((B) (OPTION ? '- (A)' : '<nul>'))
|
|
|
|
|
|
-#define IF_DISABLED(O,A) TERN(O,,A)
|
|
|
-
|
|
|
// Macros to support pins/buttons exist testing
|
|
|
#define PIN_EXISTS(PN) (defined(PN##_PIN) && PN##_PIN >= 0)
|
|
|
#define _PINEX_1 PIN_EXISTS
|
|
@@ -233,6 +236,7 @@
|
|
|
#define BUTTONS_EXIST(V...) DO(BTNEX,&&,V)
|
|
|
#define ANY_BUTTON(V...) DO(BTNEX,||,V)
|
|
|
|
|
|
+// Value helper macros
|
|
|
#define WITHIN(N,L,H) ((N) >= (L) && (N) <= (H))
|
|
|
#define ISEOL(C) ((C) == '\n' || (C) == '\r')
|
|
|
#define NUMERIC(a) WITHIN(a, '0', '9')
|
|
@@ -240,6 +244,8 @@
|
|
|
#define HEXCHR(a) (NUMERIC(a) ? (a) - '0' : WITHIN(a, 'a', 'f') ? ((a) - 'a' + 10) : WITHIN(a, 'A', 'F') ? ((a) - 'A' + 10) : -1)
|
|
|
#define NUMERIC_SIGNED(a) (NUMERIC(a) || (a) == '-' || (a) == '+')
|
|
|
#define DECIMAL_SIGNED(a) (DECIMAL(a) || (a) == '-' || (a) == '+')
|
|
|
+
|
|
|
+// Array shorthand
|
|
|
#define COUNT(a) (sizeof(a)/sizeof(*a))
|
|
|
#define ZERO(a) memset((void*)a,0,sizeof(a))
|
|
|
#define COPY(a,b) do{ \
|
|
@@ -247,6 +253,7 @@
|
|
|
memcpy(&a[0],&b[0],_MIN(sizeof(a),sizeof(b))); \
|
|
|
}while(0)
|
|
|
|
|
|
+// Expansion of some code
|
|
|
#define CODE_16( A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A; B; C; D; E; F; G; H; I; J; K; L; M; N; O; P
|
|
|
#define CODE_15( A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A; B; C; D; E; F; G; H; I; J; K; L; M; N; O
|
|
|
#define CODE_14( A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A; B; C; D; E; F; G; H; I; J; K; L; M; N
|
|
@@ -267,6 +274,7 @@
|
|
|
#define _CODE_N(N,V...) CODE_##N(V)
|
|
|
#define CODE_N(N,V...) _CODE_N(N,V)
|
|
|
|
|
|
+// Expansion of some non-delimited content
|
|
|
#define GANG_16(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,...) A B C D E F G H I J K L M N O P
|
|
|
#define GANG_15(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,...) A B C D E F G H I J K L M N O
|
|
|
#define GANG_14(A,B,C,D,E,F,G,H,I,J,K,L,M,N,...) A B C D E F G H I J K L M N
|
|
@@ -288,7 +296,7 @@
|
|
|
#define GANG_N(N,V...) _GANG_N(N,V)
|
|
|
#define GANG_N_1(N,K) _GANG_N(N,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K)
|
|
|
|
|
|
-// Macros for initializing arrays
|
|
|
+// Expansion of some list items
|
|
|
#define LIST_26(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
|
|
|
#define LIST_25(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y
|
|
|
#define LIST_24(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X
|