summaryrefslogtreecommitdiff
path: root/lib/Buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Buffer.cc')
-rw-r--r--lib/Buffer.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/Buffer.cc b/lib/Buffer.cc
new file mode 100644
index 0000000..164c961
--- /dev/null
+++ b/lib/Buffer.cc
@@ -0,0 +1,55 @@
+#include <string.h>
+#include "Buffer.h"
+#include "General.h"
+#include "config.h"
+
+Buffer::Buffer() : Handle(-1), buffer(NULL), realsiz(0), bufsiz(0), ptr(0) { }
+
+Buffer::~Buffer() {
+ free(buffer);
+}
+
+ssize_t Buffer::write(const void *buf, size_t count) {
+ if (count + realsiz > bufsiz) {
+ int numblocks = (count + realsiz) / realloc_threshold;
+ int remains = (count + realsiz) % realloc_threshold;
+ buffer = (char *) realloc(buffer, bufsiz = ((numblocks + (remains ? 1 : 0)) * realloc_threshold));
+ }
+ memcpy(buffer + realsiz, buf, count);
+ realsiz += count;
+
+ return count;
+}
+
+ssize_t Buffer::read(void *buf, size_t count) {
+ count = MIN(count, realsiz - ptr);
+
+ if (!count) {
+ return 0;
+ }
+
+ memcpy(buf, buffer + ptr, count);
+ ptr += count;
+
+ if (ptr >= realloc_threshold) {
+ int numblocks = (ptr / realloc_threshold) - (bufsiz / realloc_threshold);
+ memmove(buffer, buffer + numblocks * realloc_threshold, numblocks * realloc_threshold);
+ buffer = (char *) realloc(buffer, bufsiz = (numblocks * realloc_threshold));
+ ptr -= numblocks * realloc_threshold;
+ realsiz -= numblocks * realloc_threshold;
+ }
+
+ return count;
+}
+
+bool Buffer::CanRead() {
+ return true;
+}
+
+bool Buffer::CanWrite() {
+ return true;
+}
+
+String Buffer::GetName() {
+ return "Buffer";
+}