mirror of
https://git.jabber.space/devs/cproof.git
synced 2026-07-28 19:46:21 +00:00
Handle larger than line words in wrapping
This commit is contained in:
@@ -1085,6 +1085,7 @@ _win_print_wrapped(WINDOW *win, const char * const message, size_t indent, int p
|
|||||||
// handle word
|
// handle word
|
||||||
} else {
|
} else {
|
||||||
wordi = 0;
|
wordi = 0;
|
||||||
|
int wordlen = 0;
|
||||||
while (*curr_ch != ' ' && *curr_ch != '\n' && *curr_ch != '\0') {
|
while (*curr_ch != ' ' && *curr_ch != '\n' && *curr_ch != '\0') {
|
||||||
size_t ch_len = mbrlen(curr_ch, 4, NULL);
|
size_t ch_len = mbrlen(curr_ch, 4, NULL);
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
@@ -1094,21 +1095,44 @@ _win_print_wrapped(WINDOW *win, const char * const message, size_t indent, int p
|
|||||||
curr_ch = g_utf8_next_char(curr_ch);
|
curr_ch = g_utf8_next_char(curr_ch);
|
||||||
}
|
}
|
||||||
word[wordi] = '\0';
|
word[wordi] = '\0';
|
||||||
|
wordlen = utf8_display_len(word);
|
||||||
|
|
||||||
int curx = getcurx(win);
|
int curx = getcurx(win);
|
||||||
int cury = getcury(win);
|
int cury = getcury(win);
|
||||||
int maxx = getmaxx(win);
|
int maxx = getmaxx(win);
|
||||||
gboolean firstline = (cury == starty);
|
|
||||||
|
|
||||||
// word larger than line
|
// wrap required
|
||||||
if ((firstline && (utf8_display_len(word) > (maxx - indent))) ||
|
if (curx + wordlen > maxx) {
|
||||||
(!firstline && (utf8_display_len(word) > (maxx - (indent + pad_indent))))) {
|
int linelen = maxx - (indent + pad_indent);
|
||||||
|
|
||||||
gchar *word_ch = g_utf8_offset_to_pointer(word, 0);
|
// word larger than line
|
||||||
while(*word_ch != '\0') {
|
if (wordlen > linelen) {
|
||||||
|
gchar *word_ch = g_utf8_offset_to_pointer(word, 0);
|
||||||
|
while(*word_ch != '\0') {
|
||||||
|
curx = getcurx(win);
|
||||||
|
cury = getcury(win);
|
||||||
|
gboolean firstline = cury == starty;
|
||||||
|
|
||||||
|
if (firstline && curx < indent) {
|
||||||
|
_win_indent(win, indent);
|
||||||
|
}
|
||||||
|
if (!firstline && curx < (indent + pad_indent)) {
|
||||||
|
_win_indent(win, indent + pad_indent);
|
||||||
|
}
|
||||||
|
|
||||||
|
gchar copy[wordi+1];
|
||||||
|
g_utf8_strncpy(copy, word_ch, 1);
|
||||||
|
waddstr(win, copy);
|
||||||
|
|
||||||
|
word_ch = g_utf8_next_char(word_ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// newline and print word
|
||||||
|
} else {
|
||||||
|
waddch(win, '\n');
|
||||||
curx = getcurx(win);
|
curx = getcurx(win);
|
||||||
cury = getcury(win);
|
cury = getcury(win);
|
||||||
firstline = cury == starty;
|
gboolean firstline = cury == starty;
|
||||||
|
|
||||||
if (firstline && curx < indent) {
|
if (firstline && curx < indent) {
|
||||||
_win_indent(win, indent);
|
_win_indent(win, indent);
|
||||||
@@ -1116,30 +1140,22 @@ _win_print_wrapped(WINDOW *win, const char * const message, size_t indent, int p
|
|||||||
if (!firstline && curx < (indent + pad_indent)) {
|
if (!firstline && curx < (indent + pad_indent)) {
|
||||||
_win_indent(win, indent + pad_indent);
|
_win_indent(win, indent + pad_indent);
|
||||||
}
|
}
|
||||||
|
waddstr(win, word);
|
||||||
gchar copy[wordi++];
|
|
||||||
g_utf8_strncpy(copy, word_ch, 1);
|
|
||||||
|
|
||||||
if (curx + utf8_display_len(copy) > maxx) {
|
|
||||||
waddch(win, '\n');
|
|
||||||
_win_indent(win, indent + pad_indent);
|
|
||||||
}
|
|
||||||
waddstr(win, copy);
|
|
||||||
|
|
||||||
word_ch = g_utf8_next_char(word_ch);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// no wrap required
|
||||||
} else {
|
} else {
|
||||||
if (curx + utf8_display_len(word) > maxx) {
|
curx = getcurx(win);
|
||||||
waddch(win, '\n');
|
cury = getcury(win);
|
||||||
_win_indent(win, indent + pad_indent);
|
gboolean firstline = cury == starty;
|
||||||
}
|
|
||||||
if (firstline && curx < indent) {
|
if (firstline && curx < indent) {
|
||||||
_win_indent(win, indent);
|
_win_indent(win, indent);
|
||||||
}
|
}
|
||||||
if (!firstline && curx < (indent + pad_indent)) {
|
if (!firstline && curx < (indent + pad_indent)) {
|
||||||
_win_indent(win, indent + pad_indent);
|
_win_indent(win, indent + pad_indent);
|
||||||
}
|
}
|
||||||
wprintw(win, "%s", word);
|
waddstr(win, word);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user