diff --git a/FL/Fl_Text_Buffer.H b/FL/Fl_Text_Buffer.H index 28ac349ed..ac0221b5c 100644 --- a/FL/Fl_Text_Buffer.H +++ b/FL/Fl_Text_Buffer.H @@ -283,15 +283,17 @@ public: /** Inserts null-terminated string \p text at position \p pos. \param pos insertion position as byte offset (must be UTF-8 character aligned) - \param text UTF-8 encoded and nul terminated text + \param text UTF-8 encoded text + \param insertedLength number of bytes to insert, or -1 to indicate \p text is null-terminated */ - void insert(int pos, const char* text); + void insert(int pos, const char* text, int insertedLength = -1); /** Appends the text string to the end of the buffer. - \param t UTF-8 encoded and nul terminated text + \param t UTF-8 encoded text + \param addedLength number of bytes to append, or -1 to indicate \p t is null-terminated */ - void append(const char* t) { insert(length(), t); } + void append(const char* t, int addedLength = -1) { insert(length(), t, addedLength); } void vprintf(const char *fmt, va_list ap); void printf(const char* fmt, ...); @@ -308,9 +310,10 @@ public: null-terminated string \p text in their place in the buffer. \param start byte offset to first character to be removed and new insert position \param end byte offset to character after last character to be removed - \param text UTF-8 encoded and nul terminated text + \param text UTF-8 encoded text + \param insertedLength number of bytes to insert, or -1 to indicate \p text is null-terminated */ - void replace(int start, int end, const char *text); + void replace(int start, int end, const char *text, int insertedLength = -1); /** Copies text from another Fl_Text_Buffer to this one. @@ -784,13 +787,14 @@ protected: /** Internal (non-redisplaying) version of insert(). - Returns the length of text inserted (this is just strlen(\p text), however + Returns the length of text inserted (this is just strlen(\p text) if + \p insertedLength == -1, however this calculation can be expensive and the length will be required by any caller who will continue on to call redisplay). \p pos must be contiguous with the existing text in the buffer (i.e. not past the end). \return the number of bytes inserted */ - int insert_(int pos, const char* text); + int insert_(int pos, const char* text, int insertedLength = -1); /** Internal (non-redisplaying) version of remove(). diff --git a/src/Fl_Simple_Terminal.cxx b/src/Fl_Simple_Terminal.cxx index b8f1f403d..1f6933326 100644 --- a/src/Fl_Simple_Terminal.cxx +++ b/src/Fl_Simple_Terminal.cxx @@ -910,7 +910,7 @@ void Fl_Simple_Terminal::append(const char *s, int len) { append_ansi(s, len); } else { // raw append - buf->append(s); + buf->append(s, len); lines_ += ::strcnt(s, '\n'); // count total line feeds in string added } enforce_history_lines(); diff --git a/src/Fl_Text_Buffer.cxx b/src/Fl_Text_Buffer.cxx index 1cfcd1b9b..b606af9de 100644 --- a/src/Fl_Text_Buffer.cxx +++ b/src/Fl_Text_Buffer.cxx @@ -380,7 +380,7 @@ char Fl_Text_Buffer::byte_at(int pos) const { Insert some text at the given index. Pos must be at a character boundary. */ -void Fl_Text_Buffer::insert(int pos, const char *text) +void Fl_Text_Buffer::insert(int pos, const char *text, int insertedLength) { IS_UTF8_ALIGNED2(this, (pos)) IS_UTF8_ALIGNED(text) @@ -399,7 +399,7 @@ void Fl_Text_Buffer::insert(int pos, const char *text) call_predelete_callbacks(pos, 0); /* insert and redisplay */ - int nInserted = insert_(pos, text); + int nInserted = insert_(pos, text, insertedLength); mCursorPosHint = pos + nInserted; IS_UTF8_ALIGNED2(this, (mCursorPosHint)) call_modify_callbacks(pos, 0, nInserted, 0, NULL); @@ -454,7 +454,7 @@ void Fl_Text_Buffer::printf(const char *fmt, ...) { Replace a range of text with new text. Start and end must be at a character boundary. */ -void Fl_Text_Buffer::replace(int start, int end, const char *text) +void Fl_Text_Buffer::replace(int start, int end, const char *text, int insertedLength) { // Range check... if (!text) @@ -471,7 +471,7 @@ void Fl_Text_Buffer::replace(int start, int end, const char *text) call_predelete_callbacks(start, end - start); const char *deletedText = text_range(start, end); remove_(start, end); - int nInserted = insert_(start, text); + int nInserted = insert_(start, text, insertedLength); mCursorPosHint = start + nInserted; call_modify_callbacks(start, end - start, nInserted, 0, deletedText); free((void *) deletedText); @@ -1355,12 +1355,12 @@ int Fl_Text_Buffer::search_backward(int startPos, const char *searchString, Insert a string into the buffer. Pos must be at a character boundary. Text must be a correct UTF-8 string. */ -int Fl_Text_Buffer::insert_(int pos, const char *text) +int Fl_Text_Buffer::insert_(int pos, const char *text, int insertedLength) { if (!text || !*text) return 0; - int insertedLength = (int) strlen(text); + if (insertedLength == -1) insertedLength = (int) strlen(text); /* Prepare the buffer to receive the new text. If the new text fits in the current buffer, just move the gap (if necessary) to where