static void _win_print_wrapped(WINDOW *win, const char * const message) { int linei = 0; int wordi = 0; char *word = malloc(strlen(message) + 1); char *time_pref = prefs_get_string(PREF_TIME); int indent = 0; if (g_strcmp0(time_pref, "minutes") == 0) { indent = 8; } else if (g_strcmp0(time_pref, "seconds") == 0) { indent = 11; } free(time_pref); while (message[linei] != '\0') { if (message[linei] == ' ') { waddch(win, ' '); linei++; } else if (message[linei] == '\n') { waddch(win, '\n'); _win_indent(win, indent); linei++; } else { wordi = 0; while (message[linei] != ' ' && message[linei] != '\n' && message[linei] != '\0') { word[wordi++] = message[linei++]; } word[wordi] = '\0'; int curx = getcurx(win); int maxx = getmaxx(win); // word larger than line if (strlen(word) > (maxx - indent)) { int i; for (i = 0; i < wordi; i++) { curx = getcurx(win); if (curx < indent) { _win_indent(win, indent); } waddch(win, word[i]); } } else { if (curx + strlen(word) > maxx) { waddch(win, '\n'); _win_indent(win, indent); } if (curx < indent) { _win_indent(win, indent); } wprintw(win, "%s", word); } } } free(word); }
static void _win_print_wrapped(WINDOW *win, const char *const message, size_t indent, int pad_indent) { int starty = getcury(win); int wordi = 0; char *word = malloc(strlen(message) + 1); gchar *curr_ch = g_utf8_offset_to_pointer(message, 0); while (*curr_ch != '\0') { // handle space if (*curr_ch == ' ') { waddch(win, ' '); curr_ch = g_utf8_next_char(curr_ch); // handle newline } else if (*curr_ch == '\n') { waddch(win, '\n'); _win_indent(win, indent + pad_indent); curr_ch = g_utf8_next_char(curr_ch); // handle word } else { wordi = 0; int wordlen = 0; while (*curr_ch != ' ' && *curr_ch != '\n' && *curr_ch != '\0') { size_t ch_len = mbrlen(curr_ch, MB_CUR_MAX, NULL); if ((ch_len == (size_t)-2) || (ch_len == (size_t)-1)) { curr_ch++; continue; } int offset = 0; while (offset < ch_len) { word[wordi++] = curr_ch[offset++]; } curr_ch = g_utf8_next_char(curr_ch); } word[wordi] = '\0'; wordlen = utf8_display_len(word); int curx = getcurx(win); int cury = getcury(win); int maxx = getmaxx(win); // wrap required if (curx + wordlen > maxx) { int linelen = maxx - (indent + pad_indent); // word larger than line 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); 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); } waddstr(win, word); } // no wrap required } else { 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); } waddstr(win, word); } } // consume first space of next line int curx = getcurx(win); int cury = getcury(win); gboolean firstline = (cury == starty); if (!firstline && curx == 0 && *curr_ch == ' ') { curr_ch = g_utf8_next_char(curr_ch); } } free(word); }