aboutsummaryrefslogtreecommitdiff
path: root/src/relooper/ministring.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/relooper/ministring.h')
-rw-r--r--src/relooper/ministring.h35
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;
+ }
+};
+