diff options
Diffstat (limited to 'utils/wordwrap.c')
-rw-r--r-- | utils/wordwrap.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/utils/wordwrap.c b/utils/wordwrap.c new file mode 100644 index 00000000..330b6a03 --- /dev/null +++ b/utils/wordwrap.c @@ -0,0 +1,36 @@ +/* + * Function to wrap text to a fixed number of columns. + * + * Currently, assumes the text is in a single-byte character set, + * because it's only used to display host key prompt messages. + * Extending to Unicode and using wcwidth() could be an extension. + */ + +#include "misc.h" + +void wordwrap(BinarySink *bs, ptrlen input, size_t maxwid) +{ + size_t col = 0; + while (true) { + ptrlen word = ptrlen_get_word(&input, " "); + if (!word.len) + break; + + /* At the start of a line, any word is legal, even if it's + * overlong, because we have to display it _somehow_ and + * wrapping to the next line won't make it any better. */ + if (col > 0) { + size_t newcol = col + 1 + word.len; + if (newcol <= maxwid) { + put_byte(bs, ' '); + col++; + } else { + put_byte(bs, '\n'); + col = 0; + } + } + + put_datapl(bs, word); + col += word.len; + } +} |