From d3c9975943df58e293359b87905d19ff1fd52061 Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Mon, 11 Apr 2016 13:00:15 +0200 Subject: Imported Upstream version 0.5 --- RichString.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 RichString.c (limited to 'RichString.c') diff --git a/RichString.c b/RichString.c new file mode 100644 index 0000000..63db850 --- /dev/null +++ b/RichString.c @@ -0,0 +1,80 @@ + +#include "RichString.h" + +#include +#include +#include +#include + +#include "debug.h" +#include + +#define RICHSTRING_MAXLEN 300 + +/*{ + +typedef struct RichString_ { + int len; + chtype chstr[RICHSTRING_MAXLEN+1]; +} RichString; + +}*/ + +/* private property */ +WINDOW* workArea = NULL; + +RichString RichString_new() { + RichString this; + this.len = 0; + return this; +} + +void RichString_delete(RichString this) { +} + +void RichString_prune(RichString* this) { + this->len = 0; +} + +void RichString_write(RichString* this, int attrs, char* data) { + this->len = 0; + RichString_append(this, attrs, data); +} + +inline void RichString_append(RichString* this, int attrs, char* data) { + RichString_appendn(this, attrs, data, strlen(data)); +} + +inline void RichString_appendn(RichString* this, int attrs, char* data, int len) { + if (!workArea) { + workArea = newpad(1, RICHSTRING_MAXLEN); + } + assert(workArea); + wattrset(workArea, attrs); + int maxToWrite = (RICHSTRING_MAXLEN - 1) - this->len; + int wrote = MIN(maxToWrite, len); + mvwaddnstr(workArea, 0, 0, data, maxToWrite); + int oldstrlen = this->len; + this->len += wrote; + mvwinchnstr(workArea, 0, 0, this->chstr + oldstrlen, wrote); + wattroff(workArea, attrs); +} + +void RichString_setAttr(RichString *this, int attrs) { + for (int i = 0; i < this->len; i++) { + char c = this->chstr[i]; + this->chstr[i] = c | attrs; + } +} + +void RichString_applyAttr(RichString *this, int attrs) { + for (int i = 0; i < this->len - 1; i++) { + this->chstr[i] |= attrs; + } +} + +RichString RichString_quickString(int attrs, char* data) { + RichString str = RichString_new(); + RichString_write(&str, attrs, data); + return str; +} -- cgit v1.2.3