From 6abf1328f4afe934d514180bbcb3b06c2d128cd7 Mon Sep 17 00:00:00 2001 From: Rob Landley Date: Sun, 22 May 2016 19:44:10 -0500 Subject: Don't truncate number fields for anything but right edge of screen, instead let them overflow and try to reclaim extra space from later short fields. --- toys/posix/ps.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'toys/posix') diff --git a/toys/posix/ps.c b/toys/posix/ps.c index de816a8e..a62918ce 100644 --- a/toys/posix/ps.c +++ b/toys/posix/ps.c @@ -545,7 +545,7 @@ static char *string_field(struct carveup *tb, struct strawberry *field) static void show_ps(struct carveup *tb) { struct strawberry *field; - int pad, len, width = TT.width; + int pad, len, width = TT.width, abslen, adjlen, olen, extra = 0; // Loop through fields to display for (field = TT.fields; field; field = field->next) { @@ -556,10 +556,27 @@ static void show_ps(struct carveup *tb) putchar(' '); width--; } + + // Don't truncate number fields, but try to reclaim extra offset from later + // fields that can naturally be shorter + abslen = abs(field->len); + adjlen = field->len; + if (field->which<=PS_BIT || extra) olen = strlen(out); + if (field->which<=PS_BIT && olen>abslen) { + extra += olen-abslen; + abslen = olen; + adjlen = (adjlen<0) ? -olen : olen; + } else if (extra && olenextra) olen = extra; + abslen -= olen; + adjlen -= (adjlen<0) ? -olen : olen; + extra -= olen; + } len = width; pad = 0; if (field->next || field->len>0) - len = abs(pad = widthlen) ? width : field->len); + len = abs(pad = width