diff options
author | Christian Göttsche <cgzones@googlemail.com> | 2021-01-14 09:59:11 +0100 |
---|---|---|
committer | cgzones <cgzones@googlemail.com> | 2021-01-15 20:41:10 +0100 |
commit | 08ac22ddb9e848123934dad215c58cb03e7ad094 (patch) | |
tree | 3ae6898ec504a95982fef0f5bef41a596e8a5e41 /RichString.c | |
parent | ceee96dcba7d4932d1ec4d9a745a572c47c43c1d (diff) |
RichString: refactor writing limited amount of columns
Closes: #468
Diffstat (limited to 'RichString.c')
-rw-r--r-- | RichString.c | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/RichString.c b/RichString.c index 86344eac..5a2c2e14 100644 --- a/RichString.c +++ b/RichString.c @@ -60,7 +60,37 @@ static inline int RichString_writeFromWide(RichString* this, int attrs, const ch this->chptr[i] = (CharType) { .attr = attrs & 0xffffff, .chars = { (iswprint(data[j]) ? data[j] : '?') } }; } - return wcswidth(data, len); + return len; +} + +int RichString_appendnWideColumns(RichString* this, int attrs, const char* data_c, int len, int* columns) { + wchar_t data[len + 1]; + len = mbstowcs(data, data_c, len); + if (len <= 0) + return 0; + + int from = this->chlen; + int newLen = from + len; + RichString_setLen(this, newLen); + int columnsWritten = 0; + int pos = from; + for (int j = 0; j < len; j++) { + wchar_t c = iswprint(data[j]) ? data[j] : '?'; + int cwidth = wcwidth(c); + if (cwidth > *columns) + break; + + *columns -= cwidth; + columnsWritten += cwidth; + + this->chptr[pos] = (CharType) { .attr = attrs & 0xffffff, .chars = { c, '\0' } }; + pos++; + } + + RichString_setLen(this, pos); + *columns = columnsWritten; + + return pos - from; } static inline int RichString_writeFromAscii(RichString* this, int attrs, const char* data, int from, int len) { @@ -113,6 +143,12 @@ static inline int RichString_writeFromWide(RichString* this, int attrs, const ch return len; } +int RichString_appendnWideColumns(RichString* this, int attrs, const char* data_c, int len, int* columns) { + int written = RichString_writeFromWide(this, attrs, data_c, this->chlen, MINIMUM(len, *columns)); + *columns = written; + return written; +} + static inline int RichString_writeFromAscii(RichString* this, int attrs, const char* data_c, int from, int len) { return RichString_writeFromWide(this, attrs, data_c, from, len); } |