make use of a callback table instead of undefined functions for integration
diff --git a/libtelnet.h b/libtelnet.h
index 729bd50..821839f 100644
--- a/libtelnet.h
+++ b/libtelnet.h
@@ -12,6 +12,10 @@
 #if !defined(LIBTELNET_INCLUDE)
 #define LIBTELNET_INCLUDE 1
 
+/* forward declarations */
+struct libtelnet_t;
+struct libtelnet_cb_t;
+
 /* telnet special values */
 #define LIBTELNET_IAC 255
 #define LIBTELNET_DONT 254
@@ -108,10 +112,40 @@
 	LIBTELNET_ERROR_UNKNOWN /* some crazy unexplainable unknown error */
 };
 
+/* libtelnet callback declarations */
+struct libtelnet_cb_t {
+	/* received (processed) data */
+	void (*data)(struct libtelnet_t *telnet,
+			unsigned char *buffer, unsigned int size, void *user_data);
+	/* processed data to buffer for sending */
+	void (*send)(struct libtelnet_t *telnet,
+			unsigned char *buffer, unsigned int size, void *user_data);
+	/* unknown command notification */
+	void (*command)(struct libtelnet_t *telnet,
+			unsigned char cmd, void *user_data);
+	/* negotiation notification */
+	void (*negotiate)(struct libtelnet_t *telnet,
+			unsigned char cmd, unsigned char opt, void *user_data);
+	/* unknown subnegotiation notification */
+	void (*subnegotiation)(struct libtelnet_t *telnet,
+			unsigned char opt, unsigned char *data, unsigned int size,
+			void *user_data);
+	/* error handler */
+	void (*error)(struct libtelnet_t *telnet,
+			enum libtelnet_error_t error, void *user_data);
+
+	#ifdef HAVE_ZLIB
+	void (*compress)(struct libtelnet_t *telnet,
+			char enabled, void *user_data);
+	#endif
+};
+
 /* state tracker */
 struct libtelnet_t {
-	/* zlib (mccp2) compression */
+	/* callback table */
+	struct libtelnet_cb_t *cb;
 #ifdef HAVE_ZLIB
+	/* zlib (mccp2) compression */
 	z_stream *zlib;
 #endif
 	/* sub-request buffer */
@@ -126,30 +160,9 @@
 	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);
-extern void libtelnet_send_cb(struct libtelnet_t *telnet,
-		unsigned char *buffer, unsigned int size, void *user_data);
-extern void libtelnet_command_cb(struct libtelnet_t *telnet,
-		unsigned char cmd, void *user_data);
-extern void libtelnet_negotiate_cb(struct libtelnet_t *telnet,
-		unsigned char cmd, unsigned char opt, void *user_data);
-extern void libtelnet_subnegotiation_cb(struct libtelnet_t *telnet,
-		unsigned char opt, 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);
-
 /* initialize a telnet state tracker */
 extern void libtelnet_init(struct libtelnet_t *telnet,
-		enum libtelnet_mode_t mode);
+		struct libtelnet_cb_t *cb, enum libtelnet_mode_t mode);
 
 /* free up any memory allocated by a state tracker */
 extern void libtelnet_free(struct libtelnet_t *telnet);