+#define CLIMaxHistorySize 10
+
+
+// ----- Macros -----
+
+// AVR CLI Dictionary definitions (has to deal with the annoying PROGMEM
+// Only using PROGMEM with descriptions (all the string comparison tools need to be re-written otherwise)
+#if defined(_at90usb162_) || defined(_atmega32u4_) || defined(_at90usb646_) || defined(_at90usb1286_) // AVR
+#define CLIDict_Def(name,description) \
+ const PROGMEM char name##Name[] = description; \
+ const CLIDictItem name[]
+
+#define CLIDict_Item(name) \
+ { #name, name##CLIDict_DescEntry, (const void (*)(char*))cliFunc_##name }
+
+#define CLIDict_Entry(name,description) \
+ const PROGMEM char name##CLIDict_DescEntry[] = description;
+
+// ARM is easy :P
+#elif defined(_mk20dx128_) || defined(_mk20dx128vlf5_) || defined(_mk20dx256_) || defined(_mk20dx256vlh7_) // ARM
+#define CLIDict_Def(name,description) \
+ const char name##Name[] = description; \
+ const CLIDictItem name[]
+
+#define CLIDict_Item(name) \
+ { #name, name##CLIDict_DescEntry, (const void (*)(char*))cliFunc_##name }
+
+#define CLIDict_Entry(name,description) \
+ const char name##CLIDict_DescEntry[] = description;
+#endif
+
+#define RING_PREV(i) CLI_wrap(i - 1, 0, CLIMaxHistorySize - 1)
+#define RING_NEXT(i) CLI_wrap(i + 1, 0, CLIMaxHistorySize - 1)