aboutsummaryrefslogtreecommitdiffstats
path: root/RichString.c
diff options
context:
space:
mode:
authorDaniel Lange <DLange@git.local>2016-04-11 13:00:27 +0200
committerDaniel Lange <DLange@git.local>2016-04-11 13:00:27 +0200
commit283707c5e5bc436b78ea23bf5500cb6b16a01148 (patch)
treeb977131bbbb4c3bd8ade370aab2e4fc913440c04 /RichString.c
parentbea9b4798717b6f4e31085506dfc179eeb8dc17c (diff)
downloaddebian_htop-283707c5e5bc436b78ea23bf5500cb6b16a01148.tar.gz
debian_htop-283707c5e5bc436b78ea23bf5500cb6b16a01148.tar.bz2
debian_htop-283707c5e5bc436b78ea23bf5500cb6b16a01148.zip
Imported Upstream version 0.9upstream/0.9
Diffstat (limited to 'RichString.c')
-rw-r--r--RichString.c135
1 files changed, 79 insertions, 56 deletions
diff --git a/RichString.c b/RichString.c
index 753c8cf..6d87cd8 100644
--- a/RichString.c
+++ b/RichString.c
@@ -22,26 +22,31 @@
/*{
-#define RichString_init(this) (this)->len = 0
-#define RichString_initVal(this) (this).len = 0
+#define RichString_size(this) ((this)->chlen)
+#define RichString_sizeVal(this) ((this).chlen)
+
+#define RichString_begin(this) RichString (this); (this).chlen = 0; (this).chptr = (this).chstr;
+#define RichString_beginAllocated(this) (this).chlen = 0; (this).chptr = (this).chstr;
+#define RichString_end(this) RichString_prune(&(this));
#ifdef HAVE_LIBNCURSESW
-#define RichString_printVal(this, y, x) mvadd_wchstr(y, x, this.chstr)
-#define RichString_printoffnVal(this, y, x, off, n) mvadd_wchnstr(y, x, this.chstr + off, n)
-#define RichString_getCharVal(this, i) (this.chstr[i].chars[0] & 255)
+#define RichString_printVal(this, y, x) mvadd_wchstr(y, x, (this).chptr)
+#define RichString_printoffnVal(this, y, x, off, n) mvadd_wchnstr(y, x, (this).chptr + off, n)
+#define RichString_getCharVal(this, i) ((this).chptr[i].chars[0] & 255)
+#define RichString_setChar(this, at, ch) do{ (this)->chptr[(at)].chars[0] = ch; } while(0)
+#define CharType cchar_t
#else
-#define RichString_printVal(this, y, x) mvaddchstr(y, x, this.chstr)
-#define RichString_printoffnVal(this, y, x, off, n) mvaddchnstr(y, x, this.chstr + off, n)
-#define RichString_getCharVal(this, i) (this.chstr[i])
+#define RichString_printVal(this, y, x) mvaddchstr(y, x, (this).chptr)
+#define RichString_printoffnVal(this, y, x, off, n) mvaddchnstr(y, x, (this).chptr + off, n)
+#define RichString_getCharVal(this, i) ((this).chptr[i])
+#define RichString_setChar(this, at, ch) do{ (this)->chptr[(at)] = ch; } while(0)
+#define CharType chtype
#endif
typedef struct RichString_ {
- int len;
-#ifdef HAVE_LIBNCURSESW
- cchar_t chstr[RICHSTRING_MAXLEN+1];
-#else
- chtype chstr[RICHSTRING_MAXLEN+1];
-#endif
+ int chlen;
+ CharType chstr[RICHSTRING_MAXLEN+1];
+ CharType* chptr;
} RichString;
}*/
@@ -50,35 +55,57 @@ typedef struct RichString_ {
#define MIN(a,b) ((a)<(b)?(a):(b))
#endif
+#define charBytes(n) (sizeof(CharType) * (n))
+
+static inline void RichString_setLen(RichString* this, int len) {
+ if (this->chlen <= RICHSTRING_MAXLEN) {
+ if (len > RICHSTRING_MAXLEN) {
+ this->chptr = malloc(charBytes(len+1));
+ memcpy(this->chptr, this->chstr, charBytes(this->chlen+1));
+ }
+ } else {
+ if (len <= RICHSTRING_MAXLEN) {
+ memcpy(this->chstr, this->chptr, charBytes(this->chlen));
+ free(this->chptr);
+ this->chptr = this->chstr;
+ } else {
+ this->chptr = realloc(this->chptr, charBytes(len+1));
+ }
+ }
+ RichString_setChar(this, len, 0);
+ this->chlen = len;
+}
+
#ifdef HAVE_LIBNCURSESW
-inline void RichString_appendn(RichString* this, int attrs, char* data_c, int len) {
- wchar_t data[RICHSTRING_MAXLEN];
- len = mbstowcs(data, data_c, RICHSTRING_MAXLEN);
+inline void RichString_appendn(RichString* this, int attrs, const char* data_c, int len) {
+ wchar_t data[len+1];
+ len = mbstowcs(data, data_c, len);
if (len<0)
return;
- int last = MIN(RICHSTRING_MAXLEN - 1, len + this->len);
- for (int i = this->len, j = 0; i < last; i++, j++) {
- memset(&this->chstr[i], 0, sizeof(this->chstr[i]));
- this->chstr[i].chars[0] = data[j];
- this->chstr[i].attr = attrs;
+ int oldLen = this->chlen;
+ int newLen = len + oldLen;
+ RichString_setLen(this, newLen);
+ for (int i = oldLen, j = 0; i < newLen; i++, j++) {
+ memset(&this->chptr[i], 0, sizeof(this->chptr[i]));
+ this->chptr[i].chars[0] = data[j];
+ this->chptr[i].attr = attrs;
}
- this->chstr[last].chars[0] = 0;
- this->len = last;
+ this->chptr[newLen].chars[0] = 0;
}
-inline void RichString_setAttrn(RichString *this, int attrs, int start, int finish) {
- cchar_t* ch = this->chstr + start;
+inline void RichString_setAttrn(RichString* this, int attrs, int start, int finish) {
+ cchar_t* ch = this->chptr + start;
for (int i = start; i <= finish; i++) {
ch->attr = attrs;
ch++;
}
}
-int RichString_findChar(RichString *this, char c, int start) {
+int RichString_findChar(RichString* this, char c, int start) {
wchar_t wc = btowc(c);
- cchar_t* ch = this->chstr + start;
- for (int i = start; i < this->len; i++) {
+ cchar_t* ch = this->chptr + start;
+ for (int i = start; i < this->chlen; i++) {
if (ch->chars[0] == wc)
return i;
ch++;
@@ -88,27 +115,27 @@ int RichString_findChar(RichString *this, char c, int start) {
#else
-inline void RichString_appendn(RichString* this, int attrs, char* data_c, int len) {
- int last = MIN(RICHSTRING_MAXLEN - 1, len + this->len);
- for (int i = this->len, j = 0; i < last; i++, j++)
- this->chstr[i] = (isprint(data_c[j]) ? data_c[j] : '?') | attrs;
-
- this->chstr[last] = 0;
- this->len = last;
+inline void RichString_appendn(RichString* this, int attrs, const char* data_c, int len) {
+ int oldLen = this->chlen;
+ int newLen = len + oldLen;
+ RichString_setLen(this, newLen);
+ for (int i = oldLen, j = 0; i < newLen; i++, j++)
+ this->chptr[i] = (isprint(data_c[j]) ? data_c[j] : '?') | attrs;
+ this->chptr[newLen] = 0;
}
-void RichString_setAttrn(RichString *this, int attrs, int start, int finish) {
- chtype* ch = this->chstr + start;
+void RichString_setAttrn(RichString* this, int attrs, int start, int finish) {
+ chtype* ch = this->chptr + start;
for (int i = start; i <= finish; i++) {
*ch = (*ch & 0xff) | attrs;
ch++;
}
}
-int RichString_findChar(RichString *this, char c, int start) {
- chtype* ch = this->chstr + start;
- for (int i = start; i < this->len; i++) {
- if ((*ch & 0xff) == c)
+int RichString_findChar(RichString* this, char c, int start) {
+ chtype* ch = this->chptr + start;
+ for (int i = start; i < this->chlen; i++) {
+ if ((*ch & 0xff) == (chtype) c)
return i;
ch++;
}
@@ -118,25 +145,21 @@ int RichString_findChar(RichString *this, char c, int start) {
#endif
void RichString_prune(RichString* this) {
- this->len = 0;
+ if (this->chlen > RICHSTRING_MAXLEN)
+ free(this->chptr);
+ this->chptr = this->chstr;
+ this->chlen = 0;
}
-void RichString_setAttr(RichString *this, int attrs) {
- RichString_setAttrn(this, attrs, 0, this->len - 1);
+void RichString_setAttr(RichString* this, int attrs) {
+ RichString_setAttrn(this, attrs, 0, this->chlen - 1);
}
-inline void RichString_append(RichString* this, int attrs, char* data) {
+inline void RichString_append(RichString* this, int attrs, const char* data) {
RichString_appendn(this, attrs, data, strlen(data));
}
-void RichString_write(RichString* this, int attrs, char* data) {
- RichString_init(this);
- RichString_append(this, attrs, data);
-}
-
-RichString RichString_quickString(int attrs, char* data) {
- RichString str;
- RichString_initVal(str);
- RichString_write(&str, attrs, data);
- return str;
+void RichString_write(RichString* this, int attrs, const char* data) {
+ RichString_setLen(this, 0);
+ RichString_appendn(this, attrs, data, strlen(data));
}

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