Debug module only outputs full lines instead of parts
diff --git a/library/debug.c b/library/debug.c
index 8e24a84..40a4399 100644
--- a/library/debug.c
+++ b/library/debug.c
@@ -127,6 +127,7 @@
     str[maxlen] = '\0';
     ssl->f_dbg( ssl->p_dbg, level, str );
 
+    idx = 0;
     for( i = 0; i < len; i++ )
     {
         if( i >= 4096 )
@@ -135,25 +136,29 @@
         if( i % 16 == 0 )
         {
             if( i > 0 )
-                ssl->f_dbg( ssl->p_dbg, level, "\n" );
+            {
+                snprintf( str + idx, maxlen - idx, "\n" );
+                ssl->f_dbg( ssl->p_dbg, level, str );
+                idx = 0;
+            }
 
             if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL )
                 idx = snprintf( str, maxlen, "%s(%04d): ", file, line );
 
-            snprintf( str + idx, maxlen - idx, "%04x: ", (unsigned int) i );
+            idx += snprintf( str + idx, maxlen - idx, "%04x: ",
+                             (unsigned int) i );
 
-            str[maxlen] = '\0';
-            ssl->f_dbg( ssl->p_dbg, level, str );
         }
 
-        snprintf( str, maxlen, " %02x", (unsigned int) buf[i] );
-
-        str[maxlen] = '\0';
-        ssl->f_dbg( ssl->p_dbg, level, str );
+        idx += snprintf( str + idx, maxlen - idx, " %02x",
+                         (unsigned int) buf[i] );
     }
 
     if( len > 0 )
-        ssl->f_dbg( ssl->p_dbg, level, "\n" );
+    {
+        snprintf( str + idx, maxlen - idx, "\n" );
+        ssl->f_dbg( ssl->p_dbg, level, str );
+    }
 }
 
 #if defined(POLARSSL_ECP_C)
@@ -203,6 +208,7 @@
     str[maxlen] = '\0';
     ssl->f_dbg( ssl->p_dbg, level, str );
 
+    idx = 0;
     for( i = n + 1, j = 0; i > 0; i-- )
     {
         if( zeros && X->p[i - 1] == 0 )
@@ -218,21 +224,18 @@
             if( j % 16 == 0 )
             {
                 if( j > 0 )
-                    ssl->f_dbg( ssl->p_dbg, level, "\n" );
+                {
+                    snprintf( str + idx, maxlen - idx, "\n" );
+                    ssl->f_dbg( ssl->p_dbg, level, str );
+                    idx = 0;
+                }
 
                 if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL )
-                {
-                    snprintf( str, maxlen, "%s(%04d): ", file, line );
-                    str[maxlen] = '\0';
-                    ssl->f_dbg( ssl->p_dbg, level, str );
-                }
+                    idx = snprintf( str, maxlen, "%s(%04d): ", file, line );
             }
 
-            snprintf( str, maxlen, " %02x", (unsigned int)
-                      ( X->p[i - 1] >> (k << 3) ) & 0xFF );
-
-            str[maxlen] = '\0';
-            ssl->f_dbg( ssl->p_dbg, level, str );
+            idx += snprintf( str + idx, maxlen - idx, " %02x", (unsigned int)
+                             ( X->p[i - 1] >> (k << 3) ) & 0xFF );
 
             j++;
         }
@@ -243,15 +246,14 @@
     {
         if( debug_log_mode == POLARSSL_DEBUG_LOG_FULL )
         {
-            snprintf( str, maxlen, "%s(%04d): ", file, line );
+            idx = snprintf( str, maxlen, "%s(%04d): ", file, line );
 
-            str[maxlen] = '\0';
-            ssl->f_dbg( ssl->p_dbg, level, str );
         }
-        ssl->f_dbg( ssl->p_dbg, level, " 00" );
+        idx += snprintf( str + idx, maxlen - idx, " 00" );
     }
 
-    ssl->f_dbg( ssl->p_dbg, level, "\n" );
+    snprintf( str + idx, maxlen - idx, "\n" );
+    ssl->f_dbg( ssl->p_dbg, level, str );
 }
 #endif /* POLARSSL_BIGNUM_C */