aboutsummaryrefslogtreecommitdiffstats
path: root/RichString.c
diff options
context:
space:
mode:
Diffstat (limited to 'RichString.c')
-rw-r--r--RichString.c85
1 files changed, 67 insertions, 18 deletions
diff --git a/RichString.c b/RichString.c
index 0130580..558c743 100644
--- a/RichString.c
+++ b/RichString.c
@@ -46,6 +46,10 @@ static void RichString_setLen(RichString* this, int len) {
}
}
+void RichString_rewind(RichString* this, int count) {
+ RichString_setLen(this, this->chlen - count);
+}
+
#ifdef HAVE_LIBNCURSESW
static inline int RichString_writeFromWide(RichString* this, int attrs, const char* data_c, int from, int len) {
@@ -60,7 +64,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) {
@@ -80,9 +114,18 @@ inline void RichString_setAttrn(RichString* this, int attrs, int start, int char
}
}
-int RichString_findChar(RichString* this, char c, int start) {
- wchar_t wc = btowc(c);
- cchar_t* ch = this->chptr + start;
+void RichString_appendChr(RichString* this, int attrs, char c, int count) {
+ int from = this->chlen;
+ int newLen = from + count;
+ RichString_setLen(this, newLen);
+ for (int i = from; i < newLen; i++) {
+ this->chptr[i] = (CharType) { .attr = attrs, .chars = { c, 0 } };
+ }
+}
+
+int RichString_findChar(const RichString* this, char c, int start) {
+ const wchar_t wc = btowc(c);
+ const cchar_t* ch = this->chptr + start;
for (int i = start; i < this->chlen; i++) {
if (ch->chars[0] == wc)
return i;
@@ -104,6 +147,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);
}
@@ -115,8 +164,17 @@ void RichString_setAttrn(RichString* this, int attrs, int start, int charcount)
}
}
-int RichString_findChar(RichString* this, char c, int start) {
- chtype* ch = this->chptr + start;
+void RichString_appendChr(RichString* this, int attrs, char c, int count) {
+ int from = this->chlen;
+ int newLen = from + count;
+ RichString_setLen(this, newLen);
+ for (int i = from; i < newLen; i++) {
+ this->chptr[i] = c | attrs;
+ }
+}
+
+int RichString_findChar(const RichString* this, char c, int start) {
+ const chtype* ch = this->chptr + start;
for (int i = start; i < this->chlen; i++) {
if ((*ch & 0xff) == (chtype) c)
return i;
@@ -127,19 +185,10 @@ int RichString_findChar(RichString* this, char c, int start) {
#endif /* HAVE_LIBNCURSESW */
-void RichString_prune(RichString* this) {
- if (this->chlen > RICHSTRING_MAXLEN)
+void RichString_delete(RichString* this) {
+ if (this->chlen > RICHSTRING_MAXLEN) {
free(this->chptr);
- memset(this, 0, sizeof(RichString));
- this->chptr = this->chstr;
-}
-
-void RichString_appendChr(RichString* this, char c, int count) {
- int from = this->chlen;
- int newLen = from + count;
- RichString_setLen(this, newLen);
- for (int i = from; i < newLen; i++) {
- RichString_setChar(this, i, c);
+ this->chptr = this->chstr;
}
}

© 2014-2024 Faster IT GmbH | imprint | privacy policy