Mercurial > hg > th-libs
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