#ifdef ARRAY_CHECK #define ARRAY(ARR, POS) ARR[(size_t)(POS) * sizeof(*ARR) < sizeof(ARR) ?(POS):array_out_of_bounds(__FUNCTION__,#ARR,(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)