2020-02-24 08:30:33 +00:00
|
|
|
/*
|
|
|
|
txtbuffer.h
|
|
|
|
|
|
|
|
Text buffer for edit or scrollback
|
|
|
|
|
|
|
|
Copyright (C) 2020 Bill Currie <bill@taniwha.org>
|
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License
|
|
|
|
as published by the Free Software Foundation; either version 2
|
|
|
|
of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
|
|
|
|
|
|
See the GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to:
|
|
|
|
|
|
|
|
Free Software Foundation, Inc.
|
|
|
|
59 Temple Place - Suite 330
|
|
|
|
Boston, MA 02111-1307, USA
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __QF_txtbuffer_h
|
|
|
|
#define __QF_txtbuffer_h
|
|
|
|
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
/** \defgroup txtbuffer Text buffers
|
|
|
|
\ingroup utils
|
|
|
|
*/
|
|
|
|
///@{
|
|
|
|
|
|
|
|
/// must be a power of 2
|
|
|
|
#define TXTBUFFER_GROW 0x4000
|
|
|
|
|
|
|
|
/** Text buffer implementing efficient editing.
|
|
|
|
*/
|
|
|
|
typedef struct txtbuffer_s {
|
|
|
|
struct txtbuffer_s *next;
|
|
|
|
char *text;
|
|
|
|
size_t textSize; ///< amount of text in the buffer
|
|
|
|
size_t bufferSize; ///< current capacity of the buffer
|
|
|
|
size_t gapOffset; ///< beginning of the gap
|
|
|
|
size_t gapSize; ///< size of gap. gapSize + textSize == bufferSize
|
|
|
|
} txtbuffer_t;
|
|
|
|
|
|
|
|
/** Create a new, empty buffer.
|
|
|
|
*/
|
|
|
|
txtbuffer_t *TextBuffer_Create (void);
|
|
|
|
|
|
|
|
/** Destroy a buffer, freeing all resources connected to it.
|
|
|
|
\param buffer The buffer to destroy.
|
|
|
|
*/
|
|
|
|
void TextBuffer_Destroy (txtbuffer_t *buffer);
|
|
|
|
|
2020-03-22 11:19:25 +00:00
|
|
|
/** Open a gap for writing at the specified offset.
|
|
|
|
|
|
|
|
Text after the offset is moved to be after the opened gap.
|
|
|
|
The buffer is resized as necessary.
|
|
|
|
|
|
|
|
\param buffer The buffer to be updated
|
|
|
|
\param offset The offset in the buffer at which to insert the text block
|
|
|
|
\param text_len The size of the gap to be opened
|
|
|
|
\return Pointr to beginning of gap if successful, 0 if failure
|
|
|
|
(offset not valid or out of memory)
|
|
|
|
*/
|
|
|
|
char *TextBuffer_OpenGap (txtbuffer_t *buffer, size_t offset,
|
|
|
|
size_t text_len);
|
|
|
|
|
2020-02-24 08:30:33 +00:00
|
|
|
/** Insert a block of text at the specified offset.
|
|
|
|
|
|
|
|
Text after the offset is moved to be after the inserted block of text.
|
|
|
|
The buffer is resized as necessary.
|
|
|
|
nul characters are not significant in that they do not mark the end of
|
|
|
|
the text to be inserted.
|
|
|
|
|
|
|
|
\param buffer The buffer to be updated
|
|
|
|
\param offset The offset in the buffer at which to insert the text block
|
|
|
|
\param text The text block to be inserted. May contain nul ('\0')
|
|
|
|
characters.
|
|
|
|
\param text_len The number of characters to insert.
|
|
|
|
\return 1 for success, 0 for failure (offset not valid or out
|
|
|
|
of memory)
|
|
|
|
*/
|
|
|
|
int TextBuffer_InsertAt (txtbuffer_t *buffer, size_t offset,
|
|
|
|
const char *text, size_t text_len);
|
|
|
|
|
|
|
|
/** Delete a block of text from the buffer.
|
|
|
|
|
|
|
|
The buffer is not resized. Rather, its capacity before resizing is require
|
|
|
|
is increased.
|
|
|
|
|
|
|
|
\param buffer The buffer to be updated
|
|
|
|
\param offset The offset of the beginning of the text block to be deleted
|
|
|
|
\param len The amount of characters to be deleted. Values larger than
|
|
|
|
the amount of text in the buffer beyond the beginning of
|
|
|
|
block are truncated to the amount of remaining text. Thus
|
|
|
|
using excessivly large values sets the offset to be the
|
|
|
|
end of the buffer.
|
|
|
|
\return 1 for success, 0 for failure (offset not valid)
|
|
|
|
*/
|
|
|
|
int TextBuffer_DeleteAt (txtbuffer_t *buffer, size_t offset, size_t len);
|
|
|
|
|
|
|
|
///@}
|
|
|
|
|
|
|
|
#endif//__QF_txtbuffer_h
|