completed MCCP2 support
diff --git a/libtelnet.h b/libtelnet.h
index 1ad8e3d..575d7ba 100644
--- a/libtelnet.h
+++ b/libtelnet.h
@@ -28,6 +28,12 @@
 #define LIBTELNET_OPTION_COMPRESS2 86
 #define LIBTELNET_OPTION_ZMP 93
 
+/* libtelnet modes */
+enum libtelnet_mode_t {
+	LIBTELNET_MODE_SERVER = 0,
+	LIBTELNET_MODE_CLIENT
+};
+
 /* telnet states */
 enum libtelnet_state_t {
 	LIBTELNET_STATE_DATA = 0,
@@ -37,7 +43,7 @@
 	LIBTELNET_STATE_WILL,
 	LIBTELNET_STATE_WONT,
 	LIBTELNET_STATE_SB,
-	LIBTELNET_STATE_SB_IAC,
+	LIBTELNET_STATE_SB_IAC
 };
 
 /* error codes */
@@ -46,7 +52,7 @@
 	LIBTELNET_ERROR_NOMEM, /* memory allocation failure */
 	LIBTELNET_ERROR_OVERFLOW, /* data exceeds buffer size */
 	LIBTELNET_ERROR_PROTOCOL, /* invalid sequence of special bytes */
-	LIBTELNET_ERROR_UNKNOWN, /* some crazy unexplainable unknown error */
+	LIBTELNET_ERROR_UNKNOWN /* some crazy unexplainable unknown error */
 };
 
 /* state tracker */
@@ -63,50 +69,57 @@
 	unsigned int length;
 	/* current state */
 	enum libtelnet_state_t state;
+	/* processing mode */
+	enum libtelnet_mode_t mode;
 };
 
 /* libtelnet callback declarations
  * APPLICATION MUST IMPLEMENT THESE FUNCTIONS!!
  */
 extern void libtelnet_data_cb(struct libtelnet_t *telnet,
-	unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size, void *user_data);
 extern void libtelnet_send_cb(struct libtelnet_t *telnet,
-	unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size, void *user_data);
 extern void libtelnet_command_cb(struct libtelnet_t *telnet,
-	unsigned char cmd, void *user_data);
+		unsigned char cmd, void *user_data);
 extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
-	unsigned char cmd, unsigned char opt, void *user_data);
+		unsigned char cmd, unsigned char opt, void *user_data);
 extern void libtelnet_subrequest_cb(struct libtelnet_t *telnet,
-	unsigned char type, unsigned char *data, unsigned int size,
-	void *user_data);
+		unsigned char type, unsigned char *data, unsigned int size,
+		void *user_data);
+#ifdef HAVE_ZLIB
+extern void libtelnet_compress_cb(struct libtelnet_t *telnet,
+		char enabled, void *user_data);
+#endif
 extern void libtelnet_error_cb(struct libtelnet_t *telnet,
-	enum libtelnet_error_t error, void *user_data);
+		enum libtelnet_error_t error, void *user_data);
 
 /* initialize a telnet state tracker */
-extern void libtelnet_init(struct libtelnet_t *telnet);
+extern void libtelnet_init(struct libtelnet_t *telnet,
+		enum libtelnet_mode_t mode);
 
 /* free up any memory allocated by a state tracker */
 extern void libtelnet_free(struct libtelnet_t *telnet);
 
 /* push a byte buffer into the state tracker */
 extern void libtelnet_push(struct libtelnet_t *telnet,
-	unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size, void *user_data);
 
 /* send an iac command */
 extern void libtelnet_send_command(struct libtelnet_t *telnet,
-	unsigned char cmd, void *user_data);
+		unsigned char cmd, void *user_data);
 
 /* send negotiation */
 extern void libtelnet_send_negotiate(struct libtelnet_t *telnet,
-	unsigned char cmd, unsigned char opt, void *user_data);
+		unsigned char cmd, unsigned char opt, void *user_data);
 
 /* send non-command data (escapes IAC bytes) */
 extern void libtelnet_send_data(struct libtelnet_t *telnet,
-	unsigned char *buffer, unsigned int size, void *user_data);
+		unsigned char *buffer, unsigned int size, void *user_data);
 
 /* send sub-request */
 extern void libtelnet_send_subrequest(struct libtelnet_t *telnet,
-	unsigned char type, unsigned char *buffer, unsigned int size,
-	void *user_data);
+		unsigned char type, unsigned char *buffer, unsigned int size,
+		void *user_data);
 
 #endif /* !defined(LIBTELNET_INCLUDE) */