summaryrefslogtreecommitdiff
path: root/include/swbuf.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/swbuf.h')
-rw-r--r--include/swbuf.h223
1 files changed, 223 insertions, 0 deletions
diff --git a/include/swbuf.h b/include/swbuf.h
new file mode 100644
index 0000000..b36724f
--- /dev/null
+++ b/include/swbuf.h
@@ -0,0 +1,223 @@
+/******************************************************************************
+* swbuf.h - code for SWBuf used as a transport and utility for data buffers
+*
+* $Id: swbuf.h,v 1.27 2003/12/21 10:57:35 scribe Exp $
+*
+* Copyright 2003 CrossWire Bible Society (http://www.crosswire.org)
+* CrossWire Bible Society
+* P. O. Box 2528
+* Tempe, AZ 85280-2528
+*
+* 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 version 2.
+*
+* 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.
+*
+*/
+
+#ifndef SWBUF_H
+#define SWBUF_H
+
+#include <defs.h>
+#include <stdlib.h>
+#include <string.h>
+
+SWORD_NAMESPACE_START
+
+
+#define JUNKBUFSIZE 8191
+
+/**
+* This class is used as a transport and utility for data buffers.
+*/
+class SWDLLEXPORT SWBuf {
+ char *buf;
+ char *end;
+ char *endAlloc;
+ char fillByte;
+ unsigned long allocSize;
+ static char *nullStr;
+ static char junkBuf[JUNKBUFSIZE];
+
+ inline void assureMore(unsigned long pastEnd) {
+ if (endAlloc-end < pastEnd) {
+ long newsize = (end-buf)+pastEnd;
+ allocSize = newsize + 16;
+ long size = (end - buf);
+ buf = (char *)((buf) ? realloc(buf, allocSize) : malloc(allocSize));
+ end = (buf + size);
+ *end = 0;
+ endAlloc = buf + allocSize-1;
+ }
+ }
+ inline void assureSize(unsigned long newsize) {
+ if (newsize > allocSize) {
+ allocSize = newsize + 16;
+ long size = (end - buf);
+ buf = (char *)((buf) ? realloc(buf, allocSize) : malloc(allocSize));
+ end = (buf + size);
+ *end = 0;
+ endAlloc = buf + allocSize-1;
+ }
+ }
+
+ void init(unsigned long initSize);
+
+public:
+ /**
+ * SWBuf Constructor - Creates an empty SWBuf object or an SWBuf initialized
+ * to a value from a const char *
+ *
+ */
+ SWBuf(const char *initVal = 0, unsigned long initSize = 0);
+// SWBuf(unsigned long initSize);
+
+ /**
+ * SWBuf Constructor - Creates an SWBuf initialized
+ * to a value from a char
+ *
+ */
+ SWBuf(char initVal, unsigned long initSize = 0);
+
+ /**
+ * SWBuf Constructor - Creates an SWBuf initialized
+ * to a value from another SWBuf
+ *
+ */
+ SWBuf(const SWBuf &other, unsigned long initSize = 0);
+
+ inline void setFillByte(char ch) { fillByte = ch; }
+ inline char getFillByte() { return fillByte; }
+
+ /**
+ * SWBuf Destructor - Cleans up instance of SWBuf
+ */
+ virtual ~SWBuf();
+
+ /**
+ * @return a pointer to the buffer content (null-terminated string)
+ */
+ inline const char *c_str() const{ return buf; }
+
+ /**
+ * @param pos The position of the requested character.
+ * @return The character at the specified position
+ */
+ inline char &charAt(unsigned long pos) { return ((pos <= (unsigned long)(end - buf)) ? buf[pos] : nullStr[0]); }
+// inline char &charAt(unsigned int pos) { return ((buf+pos)<=end) ? buf[pos] : nullStr[0]; }
+
+ /**
+ * size() and length() return only the number of characters of the string.
+ * Add one for the following null and one for each char to be appended!
+ */
+ inline unsigned long size() const { return length(); }
+
+ /**
+ * size() and length() return only the number of characters of the string.
+ * Add one for the following null and one for each char to be appended!
+ */
+ inline unsigned long length() const { return end - buf; }
+
+ /**
+ * SWBuf::set - sets this buf to a new value.
+ * If the allocated memory is bigger than the new string, it will NOT be resized.
+ * @param newVal the value to set this buffer to.
+ */
+ void set(const char *newVal);
+
+ /**
+ * SWBuf::set - sets this buf to a new value
+ * If the allocated memory is bigger than the new string, it will NOT be resized.
+ * @param newVal the value to set this buffer to.
+ */
+ void set(const SWBuf &newVal);
+
+ /**
+ * SWBuf::setSize - Size this buffer to a specific length.
+ * @param len The new size of the buffer. One byte for the null will be added.
+ */
+ void setSize(unsigned long len);
+ inline void resize(unsigned long len) { setSize(len); }
+
+ /**
+ * SWBuf::append - appends a value to the current value of this SWBuf.
+ * If the allocated memory is not enough, it will be resized accordingly.
+ * @param str Append this.
+ * @param max Append only max chars.
+ */
+ void append(const char *str, long max = -1);
+
+ /**
+ * SWBuf::append - appends a value to the current value of this SWBuf
+ * If the allocated memory is not enough, it will be resized accordingly.
+ * @param str Append this.
+ * @param max Append only max chars.
+ */
+ inline void append(const SWBuf &str, long max = -1) { append(str.c_str(), max); }
+
+ /**
+ * SWBuf::append - appends a value to the current value of this SWBuf
+ * If the allocated memory is not enough, it will be resized accordingly.
+ * @param ch Append this.
+ */
+ inline void append(char ch) {
+ assureMore(1);
+ *end++ = ch;
+ *end = 0;
+ }
+
+ /**
+ * SWBuf::appendFormatted - appends formatted strings to the current value of this SWBuf
+ * WARNING: This function can only write at most
+ * JUNKBUFSIZE to the string per call.
+ * @param format The format string. Same syntax as printf, for example.
+ * @param ... Add all arguments here.
+ */
+ void appendFormatted(const char *format, ...);
+
+ inline char *getRawData() { return buf; } // be careful! Probably setSize needs to be called in conjunction before and maybe after
+
+ inline operator const char *() const { return c_str(); }
+ inline char &operator[](unsigned long pos) { return charAt(pos); }
+ inline char &operator[](long pos) { return charAt((unsigned long)pos); }
+ inline char &operator[](unsigned int pos) { return charAt((unsigned long)pos); }
+ inline char &operator[](int pos) { return charAt((unsigned long)pos); }
+ inline SWBuf &operator =(const char *newVal) { set(newVal); return *this; }
+ inline SWBuf &operator =(const SWBuf &other) { set(other); return *this; }
+ inline SWBuf &operator +=(const char *str) { append(str); return *this; }
+ inline SWBuf &operator +=(char ch) { append(ch); return *this; }
+ inline SWBuf &operator -=(unsigned long len) { setSize(length()-len); return *this; }
+ inline SWBuf &operator --(int) { operator -=(1); return *this; }
+
+ inline SWBuf &operator <<(int n) { n = (n<length())?n:(length()-1); memmove(buf, buf+n, length()-n); (*this)-=n; return *this; }
+ inline SWBuf operator +(const SWBuf &other) const {
+ SWBuf retVal = buf;
+ retVal += other;
+ return retVal;
+ }
+ inline SWBuf operator +(char ch) const { return (*this) + SWBuf(ch); }
+
+ inline int compare(const SWBuf &other) const { return strcmp(c_str(), other.c_str()); }
+ inline bool operator ==(const SWBuf &other) const { return !compare(other); }
+ inline bool operator !=(const SWBuf &other) const { return compare(other); }
+ inline bool operator > (const SWBuf &other) const { return compare(other) > 0; }
+ inline bool operator < (const SWBuf &other) const { return compare(other) < 0; }
+ inline bool operator <=(const SWBuf &other) const { return compare(other) <= 0; }
+ inline bool operator >=(const SWBuf &other) const { return compare(other) >= 0; }
+
+ inline bool operator ==(const char *other) const { return !compare(other); }
+ inline bool operator !=(const char *other) const { return compare(other); }
+ inline bool operator > (const char *other) const { return compare(other) > 0; }
+ inline bool operator < (const char *other) const { return compare(other) < 0; }
+ inline bool operator <=(const char *other) const { return compare(other) <= 0; }
+ inline bool operator >=(const char *other) const { return compare(other) >= 0; }
+};
+
+
+
+SWORD_NAMESPACE_END
+#endif