changeset 408:6b50bf4317c0

Improve printf implementation somewhat. The logic is not very pretty and not yet perfect, will need to rethink things at some point.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 09 Mar 2016 12:05:16 +0200
parents d1a06a38a958
children 9b1b21954952
files th_string.c
diffstat 1 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/th_string.c	Wed Mar 09 11:58:44 2016 +0200
+++ b/th_string.c	Wed Mar 09 12:05:16 2016 +0200
@@ -199,7 +199,7 @@
     const BOOL f_unsig, char *(f_alt)(const char *buf, const int vret, const int flags))
 {
     char buf[64];
-    int f_len = 0, ret = 0, vret, nwidth;
+    int f_len = 0, ret = 0, vret, nwidth, nprec;
     char f_sign, *f_altstr;
     BOOL f_neg = FALSE;
 
@@ -229,7 +229,6 @@
         {
             strcpy(buf, ")lin(");
             f_len = 5;
-            f_flags &= ~TH_PF_ZERO;
         }
         else
         if (f_prec != 0)
@@ -248,18 +247,33 @@
         (f_neg ? '-' : ((f_flags & TH_PF_SPACE) ? ' ' : 0)));
 
     // Calculate necessary padding, etc
-    if (f_sign)
-        f_width--;
+    int nlen =  (f_sign ? 1 : 0) + (f_altstr ? strlen(f_altstr) : 0);
+    int qlen = (f_prec > f_len ? f_prec : f_len) + nlen;
 
-    if ((f_flags & TH_PF_ZERO) && f_prec < 0 && (f_flags & TH_PF_LEFT) == 0)
-        f_prec = f_width;
+    if (f_flags & TH_PF_LEFT)
+        f_flags &= ~TH_PF_ZERO;
 
-    f_prec = (f_prec > f_len) ? f_prec - f_len : 0;
-    nwidth = f_width - f_len - f_prec - (f_altstr ? strlen(f_altstr) : 0);
 #ifdef TH_PRINTF_DEBUG
     printf("W2: vret=%3d, f_flags=[%s], f_width=%3d, f_prec=%3d, f_sign='%c', nwidth=%d\n",
         vret, get_flags(f_flags), f_width, f_prec, f_unsig, f_neg, f_sign, nwidth);
 #endif
+    if (f_flags & TH_PF_POINTER && vret == 0)
+    {
+        qlen = f_len + nlen;
+        nwidth = f_width > qlen ? f_width - qlen : 0;
+        nprec = 0;
+    }
+    else
+    if ((f_flags & TH_PF_ZERO) && f_prec < 0 && f_width > 0)
+    {
+        nprec = f_width - qlen;
+        nwidth = 0;
+    }
+    else
+    {
+        nprec = (f_prec >= 0) ? f_prec - f_len : 0;
+        nwidth = (f_width >= 0) ? f_width - qlen : 0;
+    }
 
     // Prefix padding
     if ((ret = th_printf_pad_pre(ctx, vputch, nwidth, f_flags)) == EOF)
@@ -274,7 +288,7 @@
         return ret;
 
     // Zero padding
-    if (f_prec > 0 && (ret = th_vprintf_put_repch(ctx, vputch, f_prec, '0')) == EOF)
+    if (nprec > 0 && (ret = th_vprintf_put_repch(ctx, vputch, nprec, '0')) == EOF)
         return ret;
 
     // Output the value