diff options
Diffstat (limited to 'src/relooper/ministring.h')
-rw-r--r-- | src/relooper/ministring.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/src/relooper/ministring.h b/src/relooper/ministring.h new file mode 100644 index 00000000..d0f042c8 --- /dev/null +++ b/src/relooper/ministring.h @@ -0,0 +1,35 @@ + +// Tiny implementation of strings. Avoids linking in all of std::string + +#include <stdlib.h> +#include <string.h> + +class ministring { + int used; + char *buffer; + int bufferSize; +public: + ministring() : used(0), buffer(NULL), bufferSize(0) {} + ~ministring() { if (buffer) free(buffer); } + + char *c_str() { return buffer; } + int size() { return used; } + + void clear() { + used = 0; // keep the buffer alive as an optimization, just resize + } + + ministring& operator+=(const char *s) { + int len = strlen(s); + if (used + len + 2 > bufferSize) { + // try to avoid frequent reallocations + bufferSize = 2*(bufferSize + len); + bufferSize += 1024 - bufferSize % 1024; + buffer = (char*)(buffer ? realloc(buffer, bufferSize) : malloc(bufferSize)); + } + strcpy(buffer + used, s); + used += len; + return *this; + } +}; + |