# HG changeset patch # User Matti Hamalainen # Date 1457517916 -7200 # Node ID 6b50bf4317c043405cbe4bb0bf2454d33fd28f25 # Parent d1a06a38a9582a90f3a3e0e7dcd8d819b707b3d9 Improve printf implementation somewhat. The logic is not very pretty and not yet perfect, will need to rethink things at some point. diff -r d1a06a38a958 -r 6b50bf4317c0 th_string.c --- 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