36 lines
1.6 KiB
C
36 lines
1.6 KiB
C
#ifdef ARRAY_CHECK
|
|
#define ARRAY(ARR, POS) ARR[(size_t)(POS) * sizeof(*ARR) < sizeof(ARR) ?(POS):array_out_of_bounds(__FUNCTION__,__LINE__,(POS))]
|
|
#else
|
|
#define ARRAY(ARR, POS) ARR[POS]
|
|
#endif
|
|
|
|
typedef unsigned long ulong;
|
|
#define flash_str const __FlashStringHelper *
|
|
|
|
#define time_ge(A,B) ((long)((A)-(B)) >= 0)
|
|
|
|
// FCPY, FCAT: set or append string from flash
|
|
//#define FCPY(NAME, TEXT) {static const char str[] PROGMEM = TEXT; strlcpy_P((NAME), str, sizeof(NAME)); }
|
|
//#define FCAT(NAME, TEXT) {static const char str[] PROGMEM = TEXT; strlcat_P((NAME), str, sizeof(NAME)); }
|
|
|
|
// convert to compressed code containing up to 40 different chars (NUL 0-9 a-z . - _)
|
|
#define CHAR_TO_C40(c) ((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 12 : \
|
|
(c) >= 'A' && (c) <= 'Z' ? (c) - 'A' + 12 : \
|
|
(c) >= '0' && (c) <= '9' ? (c) - '0' + 1 : \
|
|
(c) == 0 ? 0 : \
|
|
(c) == '.' ? 37 : \
|
|
(c) == '-' ? 38 : 39)
|
|
|
|
// compress short strings (up to 6 chars)
|
|
// up to 3 letters fit into a word
|
|
// up to 6 letters fit into a unsigned long
|
|
#define COMP_C40_4(name) (name[4]?CHAR_TO_C40(name[4])+40L*CHAR_TO_C40(name[5]):0)
|
|
#define COMP_C40_3(name) (name[3]?CHAR_TO_C40(name[3])+40L*COMP_C40_4(name):0)
|
|
#define COMP_C40_2(name) (name[2]?CHAR_TO_C40(name[2])+40L*COMP_C40_3(name):0)
|
|
#define COMP_C40_1(name) (name[1]?CHAR_TO_C40(name[1])+40*COMP_C40_2(name):0)
|
|
#define C(name) (name[0]?CHAR_TO_C40(name[0])+40*COMP_C40_1(name):0)
|
|
|
|
typedef enum {ee_read, ee_write} EeMode;
|
|
|
|
#define EESTORE(NAME, MODE) eeStore((void *)&NAME, sizeof NAME, MODE)
|