diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-06 14:07:16 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-06 14:07:16 -0500 |
commit | 3e2e3d468eed1d5ebbb4c6309d2eaebd081912c5 (patch) | |
tree | eae54eb9e1615fe58b567e81a4db88be2f7a70ce /libbcachefs/util.c | |
parent | b797b087a9c47f95a70b4ed38c080af006280e16 (diff) |
Update bcachefs sources to e318fabeb4 bcachefs: Fix pr_tab_rjust()
Diffstat (limited to 'libbcachefs/util.c')
-rw-r--r-- | libbcachefs/util.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/libbcachefs/util.c b/libbcachefs/util.c index 766d08ae..37fc2041 100644 --- a/libbcachefs/util.c +++ b/libbcachefs/util.c @@ -101,8 +101,14 @@ STRTO_H(strtou64, u64) static int bch2_printbuf_realloc(struct printbuf *out, unsigned extra) { - unsigned new_size = roundup_pow_of_two(out->size + extra); - char *buf = krealloc(out->buf, new_size, !out->atomic ? GFP_KERNEL : GFP_ATOMIC); + unsigned new_size; + char *buf; + + if (out->pos + extra + 1 < out->size) + return 0; + + new_size = roundup_pow_of_two(out->size + extra); + buf = krealloc(out->buf, new_size, !out->atomic ? GFP_KERNEL : GFP_ATOMIC); if (!buf) { out->allocation_failure = true; @@ -131,6 +137,33 @@ void bch2_pr_buf(struct printbuf *out, const char *fmt, ...) out->pos += len; } +void bch2_pr_tab_rjust(struct printbuf *buf) +{ + BUG_ON(buf->tabstop > ARRAY_SIZE(buf->tabstops)); + + if (printbuf_linelen(buf) < buf->tabstops[buf->tabstop]) { + unsigned move = buf->pos - buf->last_field; + unsigned shift = buf->tabstops[buf->tabstop] - + printbuf_linelen(buf); + + bch2_printbuf_realloc(buf, shift); + + if (buf->last_field + shift + 1 < buf->size) { + move = min(move, buf->size - 1 - buf->last_field - shift); + + memmove(buf->buf + buf->last_field + shift, + buf->buf + buf->last_field, + move); + memset(buf->buf + buf->last_field, ' ', shift); + buf->pos += shift; + buf->buf[buf->pos] = 0; + } + } + + buf->last_field = buf->pos; + buf->tabstop++; +} + void bch2_hprint(struct printbuf *buf, s64 v) { int u, t = 0; |