1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-09 17:38:00 +00:00

Utility function to do terminal word wrapping.

I'm planning to use this to replace some of the manually wrapped lines
in console messages.
This commit is contained in:
Simon Tatham 2022-07-06 19:01:15 +01:00
parent d8f8c8972a
commit d155009ded
3 changed files with 39 additions and 0 deletions

2
misc.h
View File

@ -232,6 +232,8 @@ int string_length_for_printf(size_t);
/* Make a ptrlen out of a constant byte array. */ /* Make a ptrlen out of a constant byte array. */
#define PTRLEN_FROM_CONST_BYTES(a) make_ptrlen(a, sizeof(a)) #define PTRLEN_FROM_CONST_BYTES(a) make_ptrlen(a, sizeof(a))
void wordwrap(BinarySink *bs, ptrlen input, size_t maxwid);
/* Wipe sensitive data out of memory that's about to be freed. Simpler /* Wipe sensitive data out of memory that's about to be freed. Simpler
* than memset because we don't need the fill char parameter; also * than memset because we don't need the fill char parameter; also
* attempts (by fiddly use of volatile) to inhibit the compiler from * attempts (by fiddly use of volatile) to inhibit the compiler from

View File

@ -70,6 +70,7 @@ add_sources_from_current_dir(utils
version.c version.c
wcwidth.c wcwidth.c
wildcard.c wildcard.c
wordwrap.c
write_c_string_literal.c write_c_string_literal.c
x11authfile.c x11authfile.c
x11authnames.c x11authnames.c

36
utils/wordwrap.c Normal file
View File

@ -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;
}
}