+static int modes_with_strarg, modes_with_intarg;
+
+//Types: http://www.irc.org/tech_docs/draft-brocklesby-irc-isupport-03.txt
+#define CHANNEL_MODE_TYPE_A 0x01 /* ... special (addresses or users) ... */
+#define CHANNEL_MODE_TYPE_B 0x02 /* These modes always take a parameter. */
+#define CHANNEL_MODE_TYPE_C 0x03 /* These modes take a parameter only when set. */
+#define CHANNEL_MODE_TYPE_D 0x04 /* These modes never take a parameter. */
+#define CHANNEL_MODE_TYPE 0x07 /* bit mask to get the type */
+
+#define CHANNEL_MODE_VALUE_STRING 0x10
+#define CHANNEL_MODE_VALUE_INTEGER 0x20
+#define CHANNEL_MODE_VALUE 0x30 /* bit mask to get the value */
+
+#define CHANNEL_MODE_VALUE_INDEX_SHIFT 8
+#define CHANNEL_MODE_VALUE_INDEX_MASK (0xff << CHANNEL_MODE_VALUE_INDEX_SHIFT) /* this "bitrange" is reserved for storing the array indexes of the mode values */
+
+static unsigned char valid_modes[] = { /* Thats our mode list :P */
+ 1, 'b', CHANNEL_MODE_TYPE_A,
+ 2, 'o', CHANNEL_MODE_TYPE_A,
+ 3, 'v', CHANNEL_MODE_TYPE_A,
+ 4, 'k', CHANNEL_MODE_TYPE_B | CHANNEL_MODE_VALUE_STRING,
+ 5, 'a', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+ 6, 'l', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_INTEGER,
+ 7, 'f', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+ 8, 'F', CHANNEL_MODE_TYPE_C | CHANNEL_MODE_VALUE_STRING,
+ 9, 'c', CHANNEL_MODE_TYPE_D,
+ 10, 'C', CHANNEL_MODE_TYPE_D,
+ 11, 'i', CHANNEL_MODE_TYPE_D,
+ 12, 'm', CHANNEL_MODE_TYPE_D,
+ 13, 'M', CHANNEL_MODE_TYPE_D,
+ 14, 'n', CHANNEL_MODE_TYPE_D,
+ 15, 'N', CHANNEL_MODE_TYPE_D,
+ 16, 'p', CHANNEL_MODE_TYPE_D,
+ 17, 'r', CHANNEL_MODE_TYPE_D,
+ 18, 's', CHANNEL_MODE_TYPE_D,
+ 19, 't', CHANNEL_MODE_TYPE_D,
+ 20, 'u', CHANNEL_MODE_TYPE_D,
+ 21, 'D', CHANNEL_MODE_TYPE_D,
+ 22, 'd', CHANNEL_MODE_TYPE_D,
+ 23, 'R', CHANNEL_MODE_TYPE_D,
+ 24, 'z', CHANNEL_MODE_TYPE_D,
+// ^ maximum is 32!!!
+ 0x00, 0x00, 0x00
+};