separate non-fatal errors into warnings, error events are always fatal
diff --git a/libtelnet.c b/libtelnet.c
index ea0e661..e4f14c1 100644
--- a/libtelnet.c
+++ b/libtelnet.c
@@ -22,19 +22,6 @@
 
 #include "libtelnet.h"
 
-/* error handler helpers */
-#ifdef ERROR
-#  undef ERROR
-#endif
-#define ERROR(telnet, code, msg) \
-		_error(telnet, __FILE__, __LINE__, code, "%s", msg)
-#define ERROR_NOMEM(telnet, msg) \
-		_error(telnet, __FILE__, __LINE__, LIBTELNET_ENOMEM, \
-		"%s: %s", msg, strerror(errno))
-#define ERROR_ZLIB(telnet, rs, msg) \
-		_error(telnet, __FILE__, __LINE__, LIBTELNET_EUNKNOWN, \
-		"%s: %s", msg, zError(rs))
-
 /* buffer sizes */
 static const unsigned int _buffer_sizes[] = {
 	0,
@@ -61,35 +48,37 @@
 }
 
 /* error generation function */
-static void _error(struct libtelnet_t *telnet, const char *file, unsigned line,
-		enum libtelnet_error_t err, const char *fmt, ...) {
+static void _error(struct libtelnet_t *telnet, unsigned line, const char* func,
+		enum libtelnet_error_t err, int fatal, const char *fmt, ...) {
 	char buffer[512];
 	va_list va;
 
 	/* format error intro */
-	snprintf(buffer, sizeof(buffer), "%s:%u: ",
-			file, line);
+	snprintf(buffer, sizeof(buffer), "%s:%u in %s: ",
+			__FILE__, line, func);
 
 	va_start(va, fmt);
 	vsnprintf(buffer + strlen(buffer), sizeof(buffer) - strlen(buffer),
 			fmt, va);
 	va_end(va);
 
-	_event(telnet, LIBTELNET_EV_ERROR, err, 0, 0, 0);
+	_event(telnet, fatal ? LIBTELNET_EV_ERROR : LIBTELNET_EV_WARNING, err,
+			0, 0, 0);
 }
 
 /* initialize the zlib box for a telnet box; if deflate is non-zero, it
  * initializes zlib for delating (compression), otherwise for inflating
  * (decompression)
  */
-z_stream *_init_zlib(struct libtelnet_t *telnet, int deflate) {
+z_stream *_init_zlib(struct libtelnet_t *telnet, int deflate, int err_fatal) {
 	z_stream *zlib;
 	int rs;
 
 	/* allocate zstream box */
 	if ((zlib = (z_stream *)calloc(1, sizeof(z_stream)))
 			== 0) {
-		ERROR_NOMEM(telnet, "malloc() failed");
+		_error(telnet, __LINE__, __func__, LIBTELNET_ENOMEM, err_fatal,
+				"malloc() failed: %s", strerror(errno));
 		return 0;
 	}
 
@@ -97,13 +86,15 @@
 	if (deflate) {
 		if ((rs = deflateInit(zlib, Z_DEFAULT_COMPRESSION)) != Z_OK) {
 			free(zlib);
-			ERROR_ZLIB(telnet, rs, "deflateInit() failed");
+			_error(telnet, __LINE__, __func__, LIBTELNET_ECOMPRESS, err_fatal,
+					"deflateInit() failed: %s", zError(rs));
 			return 0;
 		}
 	} else {
 		if ((rs = inflateInit(zlib)) != Z_OK) {
 			free(zlib);
-			ERROR_ZLIB(telnet, rs, "inflateInit() failed");
+			_error(telnet, __LINE__, __func__, LIBTELNET_ECOMPRESS, err_fatal,
+					"inflateInit() failed: %s", zError(rs));
 			return 0;
 		}
 	}
@@ -159,7 +150,7 @@
 
 		/* overflow -- can't grow any more */
 		if (i >= _buffer_sizes_count - 1) {
-			_error(telnet, __FILE__, __LINE__, LIBTELNET_EOVERFLOW,
+			_error(telnet, __LINE__, __func__, LIBTELNET_EOVERFLOW, 0,
 					"subnegotiation buffer size limit reached");
 			libtelnet_free(telnet);
 			return LIBTELNET_EOVERFLOW;
@@ -169,7 +160,8 @@
 		new_buffer = (unsigned char *)realloc(telnet->buffer,
 				_buffer_sizes[i + 1]);
 		if (new_buffer == 0) {
-			ERROR_NOMEM(telnet, "realloc() failed");
+			_error(telnet, __LINE__, __func__, LIBTELNET_ENOMEM, 0,
+					"realloc() failed");
 			libtelnet_free(telnet);
 			return LIBTELNET_ENOMEM;
 		}
@@ -300,7 +292,7 @@
 						(telnet->mode == LIBTELNET_MODE_CLIENT ||
 						 telnet->mode == LIBTELNET_MODE_PROXY)) {
 
-					if ((telnet->z_inflate = _init_zlib(telnet, 0))
+					if ((telnet->z_inflate = _init_zlib(telnet, 0, 1))
 							== 0)
 						break;
 
@@ -332,7 +324,7 @@
 				break;
 			/* something else -- protocol error */
 			default:
-				_error(telnet, __FILE__, __LINE__, LIBTELNET_EPROTOCOL,
+				_error(telnet, __LINE__, __func__, LIBTELNET_EPROTOCOL, 0,
 						"unexpected byte after IAC inside SB: %d",
 						byte);
 				start = i + 1;
@@ -375,7 +367,8 @@
 				_process(telnet, inflate_buffer, sizeof(inflate_buffer) -
 						telnet->z_inflate->avail_out);
 			else
-				ERROR_ZLIB(telnet, rs, "inflate() failed");
+				_error(telnet, __LINE__, __func__, LIBTELNET_ECOMPRESS, 1,
+						"inflate() failed: %s", zError(rs));
 
 			/* prepare output buffer for next run */
 			telnet->z_inflate->next_out = inflate_buffer;
@@ -416,7 +409,8 @@
 		while (telnet->z_deflate->avail_in > 0 || telnet->z_deflate->avail_out == 0) {
 			/* compress */
 			if ((rs = deflate(telnet->z_deflate, Z_SYNC_FLUSH)) != Z_OK) {
-				ERROR_ZLIB(telnet, rs, "deflate() failed");
+				_error(telnet, __LINE__, __func__, LIBTELNET_ECOMPRESS, 1,
+						"deflate() failed: %s", zError(rs));
 				deflateEnd(telnet->z_deflate);
 				free(telnet->z_deflate);
 				telnet->z_deflate = 0;
@@ -488,7 +482,7 @@
 			telnet->z_deflate == 0 &&
 			opt == LIBTELNET_TELOPT_COMPRESS2) {
 
-		if ((telnet->z_deflate = _init_zlib(telnet, 1)) == 0)
+		if ((telnet->z_deflate = _init_zlib(telnet, 1, 1)) == 0)
 			return;
 
 		/* notify app that compression was enabled */
@@ -502,15 +496,21 @@
 	z_stream *zlib;
 
 	/* don't do this if we've already got a compression stream */
-	if (telnet->z_deflate != 0)
+	if (telnet->z_deflate != 0) {
+		_error(telnet, __LINE__, __func__, LIBTELNET_EBADVAL, 0,
+				"compression already enabled");
 		return;
+	}
 	
 	/* only supported by servers */
-	if (telnet->mode != LIBTELNET_MODE_SERVER)
+	if (telnet->mode != LIBTELNET_MODE_SERVER) {
+		_error(telnet, __LINE__, __func__, LIBTELNET_EBADVAL, 0,
+				"only supported in SERVER mode");
 		return;
+	}
 
 	/* attempt to create output stream first, bail if we can't */
-	if ((zlib = _init_zlib(telnet, 1)) == 0)
+	if ((zlib = _init_zlib(telnet, 1, 0)) == 0)
 		return;
 
 	/* send compression marker */